IDEA-111169 Selecting lines using drag over line numbers area forgets last line of selection, if Shift is pressed before release

This commit is contained in:
Dmitry Batrak
2016-07-05 12:53:34 +03:00
parent 463627434d
commit ad9792254e
3 changed files with 47 additions and 30 deletions
@@ -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;
@@ -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("<selection>abc\ndef\nghi</selection>");
}
}
@@ -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(),