Added MouseEvent.isConsumed() awareness for competing listeners

This commit is contained in:
Vhati 2017-12-10 22:36:30 -05:00
parent 881b98a6c3
commit 5d95ec072d
2 changed files with 14 additions and 2 deletions

View file

@ -14,6 +14,9 @@ import javax.swing.text.JTextComponent;
/** /**
* A Cut/Copy/Paste/SelectAll context menu for JTextComponents. * A Cut/Copy/Paste/SelectAll context menu for JTextComponents.
*
* Add this listener after any others. Any pressed/released listeners that want
* to preempt this menu should call e.consume().
*/ */
public class ClipboardMenuMouseListener extends MouseAdapter { public class ClipboardMenuMouseListener extends MouseAdapter {
@ -63,11 +66,13 @@ public class ClipboardMenuMouseListener extends MouseAdapter {
@Override @Override
public void mousePressed( MouseEvent e ) { public void mousePressed( MouseEvent e ) {
if ( e.isConsumed() ) return;
if ( e.isPopupTrigger() ) showMenu( e ); if ( e.isPopupTrigger() ) showMenu( e );
} }
@Override @Override
public void mouseReleased( MouseEvent e ) { public void mouseReleased( MouseEvent e ) {
if ( e.isConsumed() ) return;
if ( e.isPopupTrigger() ) showMenu( e ); if ( e.isPopupTrigger() ) showMenu( e );
} }
@ -79,10 +84,10 @@ public class ClipboardMenuMouseListener extends MouseAdapter {
boolean enabled = textComponent.isEnabled(); boolean enabled = textComponent.isEnabled();
boolean editable = textComponent.isEditable(); boolean editable = textComponent.isEditable();
boolean nonempty = !(textComponent.getText() == null || textComponent.getText().equals("")); boolean nonempty = !(textComponent.getText() == null || textComponent.getText().equals( "" ));
boolean marked = textComponent.getSelectedText() != null; boolean marked = textComponent.getSelectedText() != null;
boolean pasteAvailable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).isDataFlavorSupported(DataFlavor.stringFlavor); boolean pasteAvailable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents( null ).isDataFlavorSupported( DataFlavor.stringFlavor );
cutAction.setEnabled( enabled && editable && marked ); cutAction.setEnabled( enabled && editable && marked );
copyAction.setEnabled( enabled && marked ); copyAction.setEnabled( enabled && marked );
@ -93,5 +98,7 @@ public class ClipboardMenuMouseListener extends MouseAdapter {
if ( nx > 500 ) nx = nx - popup.getSize().width; if ( nx > 500 ) nx = nx - popup.getSize().width;
popup.show( e.getComponent(), nx, e.getY() - popup.getSize().height ); popup.show( e.getComponent(), nx, e.getY() - popup.getSize().height );
e.consume();
} }
} }

View file

@ -8,6 +8,7 @@ import java.awt.event.MouseEvent;
import java.net.URI; import java.net.URI;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JTextPane; import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter; import javax.swing.event.MouseInputAdapter;
import javax.swing.text.AttributeSet; import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException; import javax.swing.text.BadLocationException;
@ -69,6 +70,9 @@ public class ModInfoArea extends JScrollPane {
@Override @Override
public void mouseClicked( MouseEvent e ) { public void mouseClicked( MouseEvent e ) {
if ( e.isConsumed() ) return;
if ( !SwingUtilities.isLeftMouseButton( e ) ) return;
AttributeSet tmpAttr = doc.getCharacterElement( textPane.viewToModel( e.getPoint() ) ).getAttributes(); AttributeSet tmpAttr = doc.getCharacterElement( textPane.viewToModel( e.getPoint() ) ).getAttributes();
Object targetObj = tmpAttr.getAttribute( ATTR_HYPERLINK_TARGET ); Object targetObj = tmpAttr.getAttribute( ATTR_HYPERLINK_TARGET );
if ( targetObj != null ) { if ( targetObj != null ) {
@ -81,6 +85,7 @@ public class ModInfoArea extends JScrollPane {
log.error( "Error browsing clicked url: "+ targetObj.toString(), f ); log.error( "Error browsing clicked url: "+ targetObj.toString(), f );
} }
} }
e.consume();
} }
} }