From ad9792254e8e402af05fd7da63e2861a3e86e512 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 5 Jul 2016 12:51:27 +0300 Subject: [PATCH] IDEA-111169 Selecting lines using drag over line numbers area forgets last line of selection, if Shift is pressed before release --- .../openapi/editor/impl/EditorImpl.java | 11 +--- .../openapi/editor/impl/EditorImplTest.java | 7 +++ .../fixtures/EditorMouseFixture.java | 59 ++++++++++++------- 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 71610987968b..f579d8c7faaf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -5726,8 +5726,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } private class MyMouseAdapter extends MouseAdapter { - private boolean mySelectionTweaked; - @Override public void mousePressed(@NotNull MouseEvent e) { requestFocus(); @@ -5769,7 +5767,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi clearDraggedRange(); - mySelectionTweaked = false; myMousePressedEvent = e; EditorMouseEvent event = new EditorMouseEvent(EditorImpl.this, e, getMouseEventArea(e)); @@ -5827,9 +5824,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myMultiSelectionInProgress = false; myDragOnGutterSelectionStartLine = -1; - if (!mySelectionTweaked) { - tweakSelectionIfNecessary(e); - } if (e.isConsumed()) { return; } @@ -5929,10 +5923,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (eventArea == EditorMouseEventArea.LINE_MARKERS_AREA || eventArea == EditorMouseEventArea.ANNOTATIONS_AREA || eventArea == EditorMouseEventArea.LINE_NUMBERS_AREA) { - if (tweakSelectionIfNecessary(e)) { - mySelectionTweaked = true; - } - else { + if (!tweakSelectionIfNecessary(e)) { myGutterComponent.mousePressed(e); } if (e.isConsumed()) return false; diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java index fdb4f286dc68..dba5e6acec81 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java @@ -405,4 +405,11 @@ public class EditorImplTest extends AbstractEditorTest { assertEquals(7, highlighters[0].getStartOffset()); assertEquals(8, highlighters[0].getEndOffset()); } + + public void testShiftPressedBeforeDragOverLineNumbersIsFinished() throws Exception { + initText("abc\ndef\nghi"); + EditorTestUtil.setEditorVisibleSize(myEditor, 1000, 1000); // enable drag testing + mouse().pressAtLineNumbers(0).dragToLineNumbers(2).shift().release(); + checkResultByText("abc\ndef\nghi"); + } } diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/EditorMouseFixture.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/EditorMouseFixture.java index 3689d7953dcc..9f7967c626d0 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/EditorMouseFixture.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/EditorMouseFixture.java @@ -33,6 +33,7 @@ public class EditorMouseFixture { private int myModifiers; private int myButton = MouseEvent.BUTTON1; private int myLastId; + private Component myLastComponent; public EditorMouseFixture(EditorImpl editor) { myEditor = editor; @@ -46,9 +47,18 @@ public class EditorMouseFixture { return pressAt(1, getPoint(visualLine, visualColumn)); } + public EditorMouseFixture pressAtLineNumbers(int visualLine) { + assert myEditor.getSettings().isLineNumbersShown(); + return pressAt(myEditor.getGutterComponentEx(), 1, new Point(0, myEditor.visibleLineToY(visualLine))); + } + private EditorMouseFixture pressAt(int clickCount, Point p) { JComponent component = myEditor.getContentComponent(); - component.dispatchEvent(new MouseEvent(component, + return pressAt(component, clickCount, p); + } + + private EditorMouseFixture pressAt(Component component, int clickCount, Point p) { + component.dispatchEvent(new MouseEvent(myLastComponent = component, myLastId = MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), getModifiers(), @@ -66,27 +76,27 @@ public class EditorMouseFixture { private EditorMouseFixture release(int clickCount) { int oldLastId = myLastId; - JComponent component = myEditor.getContentComponent(); - component.dispatchEvent(new MouseEvent(component, - myLastId = MouseEvent.MOUSE_RELEASED, - System.currentTimeMillis(), - getModifiers(), - myX, - myY, - clickCount, - false, - myButton)); + myLastComponent.dispatchEvent(new MouseEvent(myLastComponent, + myLastId = MouseEvent.MOUSE_RELEASED, + System.currentTimeMillis(), + getModifiers(), + myX, + myY, + clickCount, + false, + myButton)); if (oldLastId == MouseEvent.MOUSE_PRESSED) { - component.dispatchEvent(new MouseEvent(component, - myLastId = MouseEvent.MOUSE_CLICKED, - System.currentTimeMillis(), - getModifiers(), - myX, - myY, - clickCount, - false, - myButton)); + myLastComponent.dispatchEvent(new MouseEvent(myLastComponent, + myLastId = MouseEvent.MOUSE_CLICKED, + System.currentTimeMillis(), + getModifiers(), + myX, + myY, + clickCount, + false, + myButton)); } + myLastComponent = null; return this; } @@ -107,10 +117,19 @@ public class EditorMouseFixture { return dragToXY(p.x, p.y); } + public EditorMouseFixture dragToLineNumbers(int visualLine) { + assert myEditor.getSettings().isLineNumbersShown(); + return dragToXY(myEditor.getGutterComponentEx(), 0, myEditor.visibleLineToY(visualLine)); + } + public EditorMouseFixture dragToXY(int x, int y) { Assert.assertFalse("Cannot test mouse dragging: editor visible size is not set. Use EditorTestUtil.setEditorVisibleSize(width, height)", myEditor.getScrollingModel().getVisibleArea().isEmpty()); JComponent component = myEditor.getContentComponent(); + return dragToXY(component, x, y); + } + + private EditorMouseFixture dragToXY(JComponent component, int x, int y) { component.dispatchEvent(new MouseEvent(component, myLastId = MouseEvent.MOUSE_DRAGGED, System.currentTimeMillis(),