Bug 576377 - Provide shortcuts/commands for incremental
multiselection/multiple carets in text editors

Caret-offset now is determined by IMultiTextSelection's regions and thus
uses only document-offsets instead of widget offsets, which makes it
handle editors e.g. with code folding like the JavaEditor correctly.

Change-Id: I6987559dab1cc3e40651e893c22dc3796dcc377a
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/192039
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Mickael Istria <mistria@redhat.com>
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextMultiCaretSelectionCommandsTest.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextMultiCaretSelectionCommandsTest.java
index 3165209..1f700b1 100644
--- a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextMultiCaretSelectionCommandsTest.java
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/TextMultiCaretSelectionCommandsTest.java
@@ -381,12 +381,12 @@
 	@Test
 	public void testStopMultiSelection_withMultiSelectionAndCaretAtBeginning_revokesSelectionAndKeepsFirstCaretOffset()
 			throws Exception {
-		setSelection(new IRegion[] { new Region(0, 0), new Region(0, 7), new Region(L1_LEN, 7) });
-		assertEquals(0, widget.getCaretOffset());
+		setSelection(new IRegion[] { new Region(0, 7), new Region(L1_LEN, 7) });
+		assertEquals(7, widget.getCaretOffset());
 
 		executeCommand(STOP_MULTI_SELECTION);
-		assertEquals(0, widget.getCaretOffset());
-		assertArrayEquals(new IRegion[] { new Region(0, 0) }, getSelection());
+		assertEquals(7, widget.getCaretOffset());
+		assertArrayEquals(new IRegion[] { new Region(7, 0) }, getSelection());
 	}
 
 	@Test
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/AbstractMultiSelectionHandler.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/AbstractMultiSelectionHandler.java
index f16c20b..e8f7a40 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/AbstractMultiSelectionHandler.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/AbstractMultiSelectionHandler.java
@@ -221,11 +221,15 @@
 	}
 
 	protected int getCaretOffset() {
-		return getWidget().getCaretOffset();
+		IRegion[] regions = getSelectedRegions();
+		if (regions == null) {
+			return -1;
+		}
+		return regions[0].getOffset() + regions[0].getLength();
 	}
 
-	protected void setCaretOffset(int offset) {
-		getWidget().setCaretOffset(offset);
+	protected void setCaretOffset(int caretOffset) {
+		selectRegion(offsetAsCaretRegion(caretOffset));
 	}
 
 	protected IRegion findNextMatch(IRegion region) throws ExecutionException {
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/StopMultiSelectionHandler.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/StopMultiSelectionHandler.java
index 3672da1..46a75dc 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/StopMultiSelectionHandler.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/multiselection/StopMultiSelectionHandler.java
@@ -32,7 +32,6 @@
 	private void stopMultiSelection() throws ExecutionException {
 		int caretOffset = getCaretOffset();
 		selectRegion(offsetAsCaretRegion(caretOffset));
-		setCaretOffset(caretOffset);
 		setAnchorRegion(null);
 	}
 }