Bug 72773: store and navigate multiple edit history locations
update key mapping

Change-Id: Icbe3e8a2c37b71028afc401b297b9c6d244e5129
diff --git a/org.eclipse.ui.workbench.texteditor/plugin.xml b/org.eclipse.ui.workbench.texteditor/plugin.xml
index 093dffa..6f1263c 100644
--- a/org.eclipse.ui.workbench.texteditor/plugin.xml
+++ b/org.eclipse.ui.workbench.texteditor/plugin.xml
@@ -597,12 +597,17 @@
 	        commandId="org.eclipse.ui.edit.text.gotoLastEditPosition"
 	        contextId="org.eclipse.ui.contexts.window"
 			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-	        sequence="CTRL+Q"/>	<!-- Command+Q is quit on carbon, so don't overwrite it -->
+	        sequence="CTRL+Q"/>
+	  <key
+	        commandId="org.eclipse.ui.edit.text.gotoLastEditPosition"
+	        contextId="org.eclipse.ui.contexts.window"
+			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+	        sequence="M3+CTRL+ARROW_LEFT"/>
 	  <key
 	        commandId="org.eclipse.ui.edit.text.gotoNextEditPosition"
 	        contextId="org.eclipse.ui.contexts.window"
 			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-	        sequence="M3+CTRL+Q"/>
+	        sequence="M3+CTRL+ARROW_RIGHT"/>
 	  <key
 	        commandId="org.eclipse.ui.edit.text.smartEnter"
 	        contextId="org.eclipse.ui.textEditorScope"
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java
index a96686c..422a2a6 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java
@@ -25,8 +25,8 @@
  *         location in linear mode, if history size is N, then calling
  *         goBackward N times brings you to the beginning, after which
  *         additional calls to goBackward will have no effect until either
- *         goForward is called or a new entry is added Both linear and ring mode
- *         overwrite history as needed when buffer is full
+ *         goForward is called or a new entry is added. Both linear and ring
+ *         mode overwrite history as needed when buffer is full
  * @param <T> the type of the object instances being tracked in history
  *
  * @since 3.15
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/TextEditorPlugin.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/TextEditorPlugin.java
index b999bef..b2ff94f 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/TextEditorPlugin.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/TextEditorPlugin.java
@@ -54,14 +54,15 @@
 	private static TextEditorPlugin fgPlugin;
 
 	/**
-	 * tracks whether cursor has moved since fEditPositionHistory was used to
-	 * return to prior location. If cursor has moved, then goto last edit
-	 * location simply returns to last edit location. But if cursor has not
-	 * moved, that means the command was invoked twice in a row without
-	 * intervening other actions; in that case we start traversing backward thru
-	 * history to prior edit locations
+	 * tracks whether cursor has moved since fEditPositionHistory was used to return
+	 * to prior or next location. If cursor has moved, then goto last edit location
+	 * simply returns to last edit location. But if cursor has not moved, that means
+	 * the command was invoked twice in a row without intervening other actions; in
+	 * that case we are in a traversal state of BACKWARD (or FORWARD), so we start
+	 * traversing backward (or forward) through history to prior (or next) edit
+	 * locations.
 	 */
-	boolean movedSinceLastEditRecall = true;
+	TraversalDirection fEditHistoryTraversalDirection = TraversalDirection.NONE;
 
 	// an ordered history of prior edit positions
 	private HistoryTracker<EditPosition> fEditPositionHistory = new HistoryTracker<>(
@@ -123,12 +124,12 @@
 	 */
 	public static final String REFERENCE_PROVIDER_EXTENSION_POINT= "quickDiffReferenceProvider"; //$NON-NLS-1$
 
-	public boolean isMovedSinceLastEditRecall() {
-		return movedSinceLastEditRecall;
+	public TraversalDirection getEditHistoryTraversalDirection() {
+		return fEditHistoryTraversalDirection;
 	}
 
-	public void setMovedSinceLastEditRecall(boolean movedSinceLastEditRecall) {
-		this.movedSinceLastEditRecall = movedSinceLastEditRecall;
+	public void setEditHistoryTraversalDirection(TraversalDirection direction) {
+		this.fEditHistoryTraversalDirection = direction;
 	}
 
 	public HistoryTracker<EditPosition> getEditPositionHistory() {
@@ -280,4 +281,7 @@
 		return fCodeMiningProviderRegistry;
 	}
 
+	public static enum TraversalDirection {
+		NONE, BACKWARD, FORWARD;
+	}
 }
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 9835d97..840af78 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
@@ -6619,7 +6619,8 @@
 	 * @since 3.15
 	 */
 	private void handleCursorPositionChangedWrapper() {
-		TextEditorPlugin.getDefault().setMovedSinceLastEditRecall(true);
+		TextEditorPlugin.getDefault()
+				.setEditHistoryTraversalDirection(TextEditorPlugin.TraversalDirection.NONE);
 		handleCursorPositionChanged();
 	}
 
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoLastEditPositionAction.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoLastEditPositionAction.java
index effdbea..7fe3cc2 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoLastEditPositionAction.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoLastEditPositionAction.java
@@ -69,7 +69,8 @@
 
 	@Override
 	public void run() {
-		if (!TextEditorPlugin.getDefault().isMovedSinceLastEditRecall()) {
+		if (TextEditorPlugin.TraversalDirection.BACKWARD == TextEditorPlugin.getDefault()
+				.getEditHistoryTraversalDirection()) {
 			TextEditorPlugin.getDefault().backtrackEditPosition();
 		}
 		EditPosition editPosition = TextEditorPlugin.getDefault().getLastEditPosition();
@@ -126,7 +127,8 @@
 				provider.setSelection(new TextSelection(pos.offset, pos.length));
 			}
 		} finally {
-			TextEditorPlugin.getDefault().setMovedSinceLastEditRecall(false);
+			TextEditorPlugin.getDefault()
+					.setEditHistoryTraversalDirection(TextEditorPlugin.TraversalDirection.BACKWARD);
 		}
 	}
 
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoNextEditPositionAction.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoNextEditPositionAction.java
index 587a064..23ff43f 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoNextEditPositionAction.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/GotoNextEditPositionAction.java
@@ -72,7 +72,8 @@
 
 	@Override
 	public void run() {
-		if (!TextEditorPlugin.getDefault().isMovedSinceLastEditRecall()) {
+		if (TextEditorPlugin.TraversalDirection.FORWARD == TextEditorPlugin.getDefault()
+				.getEditHistoryTraversalDirection()) {
 			TextEditorPlugin.getDefault().advanceEditPosition();
 		}
 		EditPosition editPosition = TextEditorPlugin.getDefault().getNextEditPosition();
@@ -124,7 +125,8 @@
 				provider.setSelection(new TextSelection(pos.offset, pos.length));
 			}
 		} finally {
-			TextEditorPlugin.getDefault().setMovedSinceLastEditRecall(false);
+			TextEditorPlugin.getDefault()
+					.setEditHistoryTraversalDirection(TextEditorPlugin.TraversalDirection.FORWARD);
 		}
 	}