|
24 | 24 | import java.awt.Rectangle; |
25 | 25 | import java.awt.event.ComponentAdapter; |
26 | 26 | import java.awt.event.ComponentEvent; |
| 27 | +import java.awt.event.InputEvent; |
27 | 28 | import java.awt.event.KeyAdapter; |
28 | 29 | import java.awt.event.KeyEvent; |
29 | 30 | import java.awt.event.MouseAdapter; |
30 | 31 | import java.awt.event.MouseEvent; |
| 32 | +import java.awt.event.MouseWheelEvent; |
31 | 33 | import java.util.ArrayDeque; |
32 | 34 | import java.util.ArrayList; |
33 | 35 | import java.util.Arrays; |
|
41 | 43 | import java.util.concurrent.ScheduledFuture; |
42 | 44 | import java.util.concurrent.TimeUnit; |
43 | 45 | import java.util.function.Consumer; |
| 46 | +import java.util.function.Predicate; |
44 | 47 | import java.util.regex.Pattern; |
45 | 48 | import java.util.stream.Collectors; |
46 | 49 |
|
@@ -179,61 +182,95 @@ public void documentChanged(Document newDoc) { |
179 | 182 |
|
180 | 183 | private class InspectMode { |
181 | 184 |
|
182 | | - boolean isMouseDown; |
183 | | - boolean isCtrlDown; |
184 | | - boolean isMetaDown; |
185 | 185 | boolean inspectModeEnabled; |
186 | 186 |
|
| 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 | + |
187 | 197 | JavaEditor editor; |
188 | 198 | PreprocessingService pps; |
189 | 199 |
|
190 | 200 | InspectMode(JavaEditor editor, PreprocessingService pps) { |
191 | 201 | this.editor = editor; |
192 | 202 | this.pps = pps; |
193 | 203 |
|
194 | | - // Add ctrl+click listener |
| 204 | + // Add listeners |
| 205 | + |
195 | 206 | editor.getJavaTextArea().getPainter().addMouseListener(new MouseAdapter() { |
196 | 207 | @Override |
197 | 208 | public void mousePressed(MouseEvent e) { |
198 | | - isMouseDown = true; |
| 209 | + isMouse1Down = isMouse1Down || (e.getButton() == MouseEvent.BUTTON1); |
| 210 | + isMouse2Down = isMouse2Down || (e.getButton() == MouseEvent.BUTTON2); |
199 | 211 | } |
200 | 212 |
|
201 | 213 | @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); |
208 | 221 | } |
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; |
210 | 252 | } |
211 | 253 | }); |
212 | 254 |
|
213 | 255 | editor.getJavaTextArea().addKeyListener(new KeyAdapter() { |
214 | 256 | @Override |
215 | 257 | 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); |
219 | 261 | } |
220 | 262 |
|
221 | 263 | @Override |
222 | 264 | 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; |
226 | 268 | } |
227 | 269 | }); |
228 | 270 |
|
229 | 271 | } |
230 | 272 |
|
231 | 273 |
|
232 | | - void checkInspectMode() { |
233 | | - inspectModeEnabled = !isMouseDown && (isCtrlDown && !Platform.isMacOS()) || isMetaDown; |
234 | | - } |
235 | | - |
236 | | - |
237 | 274 | // Thread: EDT |
238 | 275 | void handleInspect(MouseEvent evt) { |
239 | 276 | int off = editor.getJavaTextArea().xyToOffset(evt.getX(), evt.getY()); |
|
0 commit comments