From 8142320cda4a688db2b18ff7714e29209b3cf90c Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Fri, 13 May 2016 12:51:36 +0200 Subject: [PATCH] Polish inspect mode interaction - interaction fixes for button2 click and ctrl/cmd+button1 click - makes it much less likely to be invoked it by accident --- java/src/processing/mode/java/pdex/PDEX.java | 83 ++++++++++++++------ 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/java/src/processing/mode/java/pdex/PDEX.java b/java/src/processing/mode/java/pdex/PDEX.java index 44cd0bce3..139092357 100644 --- a/java/src/processing/mode/java/pdex/PDEX.java +++ b/java/src/processing/mode/java/pdex/PDEX.java @@ -24,10 +24,12 @@ import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; +import java.awt.event.InputEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; @@ -41,6 +43,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -179,11 +182,18 @@ public class PDEX { private class InspectMode { - boolean isMouseDown; - boolean isCtrlDown; - boolean isMetaDown; boolean inspectModeEnabled; + boolean isMouse1Down; + boolean isMouse2Down; + boolean isHotkeyDown; + + Predicate mouseEventHotkeyTest = Platform.isMacOS() ? + InputEvent::isMetaDown : InputEvent::isControlDown; + Predicate keyEventHotkeyTest = Platform.isMacOS() ? + e -> e.getKeyCode() == KeyEvent.VK_META : + e -> e.getKeyCode() == KeyEvent.VK_CONTROL; + JavaEditor editor; PreprocessingService pps; @@ -191,49 +201,76 @@ public class PDEX { this.editor = editor; this.pps = pps; - // Add ctrl+click listener + // Add listeners + editor.getJavaTextArea().getPainter().addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { - isMouseDown = true; + isMouse1Down = isMouse1Down || (e.getButton() == MouseEvent.BUTTON1); + isMouse2Down = isMouse2Down || (e.getButton() == MouseEvent.BUTTON2); } @Override - public void mouseReleased(MouseEvent evt) { - isMouseDown = false; - if (inspectModeEnabled && evt.getButton() == MouseEvent.BUTTON1) { - handleInspect(evt); - } else if (!inspectModeEnabled && evt.getButton() == MouseEvent.BUTTON2) { - handleInspect(evt); + public void mouseReleased(MouseEvent e) { + boolean releasingMouse1 = e.getButton() == MouseEvent.BUTTON1; + boolean releasingMouse2 = e.getButton() == MouseEvent.BUTTON2; + if (inspectModeEnabled && isMouse1Down && releasingMouse1) { + handleInspect(e); + } else if (!inspectModeEnabled && isMouse2Down && releasingMouse2) { + handleInspect(e); } - checkInspectMode(); + isMouse1Down = isMouse1Down && !releasingMouse1; + isMouse2Down = isMouse2Down && !releasingMouse2; + } + }); + + editor.getJavaTextArea().getPainter().addMouseMotionListener(new MouseAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + if (editor.isSelectionActive()) { + // Mouse was dragged too much, disable + inspectModeEnabled = false; + // Cancel possible mouse 2 press + isMouse2Down = false; + } + } + + @Override + public void mouseMoved(MouseEvent e) { + isMouse1Down = false; + isMouse2Down = false; + isHotkeyDown = mouseEventHotkeyTest.test(e); + inspectModeEnabled = isHotkeyDown; + } + }); + + editor.getJavaTextArea().addMouseWheelListener(new MouseAdapter() { + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + // Editor was scrolled while mouse 1 was pressed, disable + if (isMouse1Down) inspectModeEnabled = false; } }); editor.getJavaTextArea().addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { - isMetaDown = isMetaDown || e.getKeyCode() == KeyEvent.VK_META; - isCtrlDown = isCtrlDown || e.getKeyCode() == KeyEvent.VK_CONTROL; - if (!inspectModeEnabled) checkInspectMode(); + isHotkeyDown = isHotkeyDown || keyEventHotkeyTest.test(e); + // Enable if hotkey was just pressed and mouse 1 is not down + inspectModeEnabled = inspectModeEnabled || (!isMouse1Down && isHotkeyDown); } @Override public void keyReleased(KeyEvent e) { - isMetaDown = isMetaDown && e.getKeyCode() != KeyEvent.VK_META; - isCtrlDown = isCtrlDown && e.getKeyCode() != KeyEvent.VK_CONTROL; - if (inspectModeEnabled) checkInspectMode(); + isHotkeyDown = isHotkeyDown && !keyEventHotkeyTest.test(e); + // Disable if hotkey was just released + inspectModeEnabled = inspectModeEnabled && isHotkeyDown; } }); } - void checkInspectMode() { - inspectModeEnabled = !isMouseDown && (isCtrlDown && !Platform.isMacOS()) || isMetaDown; - } - - // Thread: EDT void handleInspect(MouseEvent evt) { int off = editor.getJavaTextArea().xyToOffset(evt.getX(), evt.getY());