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
This commit is contained in:
Jakub Valtar
2016-05-13 12:51:36 +02:00
parent 7006ed1a6f
commit 8142320cda

View File

@@ -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<MouseEvent> mouseEventHotkeyTest = Platform.isMacOS() ?
InputEvent::isMetaDown : InputEvent::isControlDown;
Predicate<KeyEvent> 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());