[Bug 578782] Shift + Home / End changes selection direction for
"reverse" selections

Change-Id: Ie4f6a40a859580aefea2d5b36e36c1790e4b0ecb
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/190925
Tested-by: Mickael Istria <mistria@redhat.com>
Reviewed-by: Mickael Istria <mistria@redhat.com>
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java
index 2ae93a4..0f59a09 100644
--- a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextNavigationTest.java
@@ -52,15 +52,17 @@
  */
 public class TextNavigationTest {
 
-	private static File file;
-	private static AbstractTextEditor editor;
-	private static StyledText widget;
+	private File file;
+	private AbstractTextEditor editor;
+	private StyledText widget;
+	private IDocument fDocument;
 
 	@Before
-	public void setUpBeforeClass() throws IOException, PartInitException, CoreException {
+	public void setUp() throws IOException, PartInitException, CoreException {
 		file = File.createTempFile(TextNavigationTest.class.getName(), ".txt");
 		Files.write(file.toPath(), "  abc".getBytes());
 		editor = (AbstractTextEditor)IDE.openEditorOnFileStore(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), EFS.getStore(file.toURI()));
+		fDocument = editor.getDocumentProvider().getDocument(editor.getEditorInput());
 		widget = (StyledText) editor.getAdapter(Control.class);
 	}
 
@@ -75,9 +77,8 @@
 		IPreferenceStore preferenceStore = EditorsPlugin.getDefault().getPreferenceStore();
 		boolean previousPrefValue = preferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_NAVIGATION_SMART_HOME_END);
 		preferenceStore.setValue(AbstractTextEditor.PREFERENCE_NAVIGATION_SMART_HOME_END, false);
-		IDocument doc = editor.getDocumentProvider().getDocument(editor.getEditorInput());
-		doc.set("line1\nline2");
-		editor.selectAndReveal(doc.getLength(), 0);
+		fDocument.set("line1\nline2");
+		editor.selectAndReveal(fDocument.getLength(), 0);
 		editor.getAction(ITextEditorActionDefinitionIds.LINE_START).run();
 		try {
 			assertEquals(6, ((ITextSelection) editor.getSelectionProvider().getSelection()).getOffset());
@@ -116,6 +117,17 @@
 	}
 
 	@Test
+	public void testShiftEndMultipleLines() {
+		fDocument.set("LINE 1\nLINE 2\n");
+		editor.selectAndReveal(12, -7);
+		editor.getAction(ITextEditorActionDefinitionIds.SELECT_LINE_END).run();
+		ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+		assertEquals(6, selection.getOffset());
+		assertEquals(6, selection.getLength());
+		assertEquals(6, widget.getCaretOffset());
+	}
+
+	@Test
 	public void testShiftEndHomeHome() {
 		editor.getSelectionProvider().setSelection(new TextSelection(0, 0));
 		assertEquals(0, widget.getCaretOffset());
@@ -142,8 +154,7 @@
 	@Test
 	public void testEndHomeRevealCaret() {
 		editor.getSelectionProvider().setSelection(new TextSelection(0, 0));
-		IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
-		document.set(IntStream.range(0, 2000).mapToObj(i -> "a").collect(Collectors.joining()));
+		fDocument.set(IntStream.range(0, 2000).mapToObj(i -> "a").collect(Collectors.joining()));
 		PlatformUI.getWorkbench().getIntroManager().closeIntro(PlatformUI.getWorkbench().getIntroManager().getIntro());
 		assertTrue(DisplayHelper.waitForCondition(widget.getDisplay(), 2000, () -> widget.isVisible()));
 		int firstCharX = widget.getTextBounds(0, 0).x;
@@ -151,8 +162,8 @@
 		assertEquals(0, widget.getClientArea().x);
 		editor.getAction(ITextEditorActionDefinitionIds.LINE_END).run();
 		ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
-		assertEquals(document.getLength(), selection.getOffset());
-		int lastCharX = widget.getTextBounds(document.getLength() - 1, document.getLength() - 1).x;
+		assertEquals(fDocument.getLength(), selection.getOffset());
+		int lastCharX = widget.getTextBounds(fDocument.getLength() - 1, fDocument.getLength() - 1).x;
 		assertTrue(lastCharX >= 0 && lastCharX <= widget.getClientArea().width);
 		editor.getAction(ITextEditorActionDefinitionIds.LINE_START).run();
 		firstCharX = widget.getTextBounds(0, 0).x;
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
index 67ef523..0cf8f2e 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
@@ -1234,8 +1234,8 @@
 					int i = getLineEndPosition(document, line, lineLength, caretOffsetInDocument);
 					newCaretOffset = (caretOffset - lineOffset == i) ? lineEndOffset : lineOffset + i;
 				} else if (caretOffset < lineEndOffset) {
-						// to end of line
-						newCaretOffset = lineEndOffset;
+					// to end of line
+					newCaretOffset = lineEndOffset;
 				}
 
 				if (newCaretOffset == -1) {
@@ -1248,7 +1248,7 @@
 
 			}
 			st.setSelectionRanges(newSelection.stream().flatMapToInt(
-					p -> IntStream.of(Math.min(p.y, p.x), Math.abs(p.y - p.x)))
+					p -> IntStream.of(p.x, p.y - p.x))
 					.toArray());
 			if (newSelection.size() == 1) {
 				st.showSelection();