Skip to content

Commit 46f68f7

Browse files
committed
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
1 parent f15316d commit 46f68f7

File tree

1 file changed

+60
-23
lines changed

1 file changed

+60
-23
lines changed

java/src/processing/mode/java/pdex/PDEX.java

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import java.awt.Rectangle;
2525
import java.awt.event.ComponentAdapter;
2626
import java.awt.event.ComponentEvent;
27+
import java.awt.event.InputEvent;
2728
import java.awt.event.KeyAdapter;
2829
import java.awt.event.KeyEvent;
2930
import java.awt.event.MouseAdapter;
3031
import java.awt.event.MouseEvent;
32+
import java.awt.event.MouseWheelEvent;
3133
import java.util.ArrayDeque;
3234
import java.util.ArrayList;
3335
import java.util.Arrays;
@@ -41,6 +43,7 @@
4143
import java.util.concurrent.ScheduledFuture;
4244
import java.util.concurrent.TimeUnit;
4345
import java.util.function.Consumer;
46+
import java.util.function.Predicate;
4447
import java.util.regex.Pattern;
4548
import java.util.stream.Collectors;
4649

@@ -179,61 +182,95 @@ public void documentChanged(Document newDoc) {
179182

180183
private class InspectMode {
181184

182-
boolean isMouseDown;
183-
boolean isCtrlDown;
184-
boolean isMetaDown;
185185
boolean inspectModeEnabled;
186186

187+
boolean isMouse1Down;
188+
boolean isMouse2Down;
189+
boolean isHotkeyDown;
190+
191+
Predicate<MouseEvent> mouseEventHotkeyTest = Platform.isMacOS() ?
192+
InputEvent::isMetaDown : InputEvent::isControlDown;
193+
Predicate<KeyEvent> keyEventHotkeyTest = Platform.isMacOS() ?
194+
e -> e.getKeyCode() == KeyEvent.VK_META :
195+
e -> e.getKeyCode() == KeyEvent.VK_CONTROL;
196+
187197
JavaEditor editor;
188198
PreprocessingService pps;
189199

190200
InspectMode(JavaEditor editor, PreprocessingService pps) {
191201
this.editor = editor;
192202
this.pps = pps;
193203

194-
// Add ctrl+click listener
204+
// Add listeners
205+
195206
editor.getJavaTextArea().getPainter().addMouseListener(new MouseAdapter() {
196207
@Override
197208
public void mousePressed(MouseEvent e) {
198-
isMouseDown = true;
209+
isMouse1Down = isMouse1Down || (e.getButton() == MouseEvent.BUTTON1);
210+
isMouse2Down = isMouse2Down || (e.getButton() == MouseEvent.BUTTON2);
199211
}
200212

201213
@Override
202-
public void mouseReleased(MouseEvent evt) {
203-
isMouseDown = false;
204-
if (inspectModeEnabled && evt.getButton() == MouseEvent.BUTTON1) {
205-
handleInspect(evt);
206-
} else if (!inspectModeEnabled && evt.getButton() == MouseEvent.BUTTON2) {
207-
handleInspect(evt);
214+
public void mouseReleased(MouseEvent e) {
215+
boolean releasingMouse1 = e.getButton() == MouseEvent.BUTTON1;
216+
boolean releasingMouse2 = e.getButton() == MouseEvent.BUTTON2;
217+
if (inspectModeEnabled && isMouse1Down && releasingMouse1) {
218+
handleInspect(e);
219+
} else if (!inspectModeEnabled && isMouse2Down && releasingMouse2) {
220+
handleInspect(e);
208221
}
209-
checkInspectMode();
222+
isMouse1Down = isMouse1Down && !releasingMouse1;
223+
isMouse2Down = isMouse2Down && !releasingMouse2;
224+
}
225+
});
226+
227+
editor.getJavaTextArea().getPainter().addMouseMotionListener(new MouseAdapter() {
228+
@Override
229+
public void mouseDragged(MouseEvent e) {
230+
if (editor.isSelectionActive()) {
231+
// Mouse was dragged too much, disable
232+
inspectModeEnabled = false;
233+
// Cancel possible mouse 2 press
234+
isMouse2Down = false;
235+
}
236+
}
237+
238+
@Override
239+
public void mouseMoved(MouseEvent e) {
240+
isMouse1Down = false;
241+
isMouse2Down = false;
242+
isHotkeyDown = mouseEventHotkeyTest.test(e);
243+
inspectModeEnabled = isHotkeyDown;
244+
}
245+
});
246+
247+
editor.getJavaTextArea().addMouseWheelListener(new MouseAdapter() {
248+
@Override
249+
public void mouseWheelMoved(MouseWheelEvent e) {
250+
// Editor was scrolled while mouse 1 was pressed, disable
251+
if (isMouse1Down) inspectModeEnabled = false;
210252
}
211253
});
212254

213255
editor.getJavaTextArea().addKeyListener(new KeyAdapter() {
214256
@Override
215257
public void keyPressed(KeyEvent e) {
216-
isMetaDown = isMetaDown || e.getKeyCode() == KeyEvent.VK_META;
217-
isCtrlDown = isCtrlDown || e.getKeyCode() == KeyEvent.VK_CONTROL;
218-
if (!inspectModeEnabled) checkInspectMode();
258+
isHotkeyDown = isHotkeyDown || keyEventHotkeyTest.test(e);
259+
// Enable if hotkey was just pressed and mouse 1 is not down
260+
inspectModeEnabled = inspectModeEnabled || (!isMouse1Down && isHotkeyDown);
219261
}
220262

221263
@Override
222264
public void keyReleased(KeyEvent e) {
223-
isMetaDown = isMetaDown && e.getKeyCode() != KeyEvent.VK_META;
224-
isCtrlDown = isCtrlDown && e.getKeyCode() != KeyEvent.VK_CONTROL;
225-
if (inspectModeEnabled) checkInspectMode();
265+
isHotkeyDown = isHotkeyDown && !keyEventHotkeyTest.test(e);
266+
// Disable if hotkey was just released
267+
inspectModeEnabled = inspectModeEnabled && isHotkeyDown;
226268
}
227269
});
228270

229271
}
230272

231273

232-
void checkInspectMode() {
233-
inspectModeEnabled = !isMouseDown && (isCtrlDown && !Platform.isMacOS()) || isMetaDown;
234-
}
235-
236-
237274
// Thread: EDT
238275
void handleInspect(MouseEvent evt) {
239276
int off = editor.getJavaTextArea().xyToOffset(evt.getX(), evt.getY());

0 commit comments

Comments
 (0)