[509975] Selection should be considered for "next" or "previous" change

To avoid affecting the behavior of jumping to the next unresolved diff,
which is performed at the end of running the MergeAction, this change
adapts Navigatable.getNextUnresolvedDiff(TreeItem) to start looking for
the next unresolved diff from the beginning if there is no next
unresolved diff AFTER the currently selected diff.

Bug: 509975
Change-Id: Ic011cbf8f6b5e187740a0e3949cded947a2390ad
Signed-off-by: Philip Langer <planger@eclipsesource.com>
Also-by: Conor O'Mahony <conor.s.omahony@gmail.com>
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/Navigatable.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/Navigatable.java
index c44ee3b..1a6aeba 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/Navigatable.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/Navigatable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2015, 2017 Obeo and others.
+ * Copyright (c) 2013, 2017 Obeo and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,10 +9,13 @@
  *     Obeo - initial API and implementation
  *     Michael Borkowski - bug 462237, refactoring
  *     Simon Delisle - bug 511172
+ *     Philip Langer - bug 509975
  *******************************************************************************/
 package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer;
 
+import static org.eclipse.emf.compare.DifferenceState.UNRESOLVED;
 import static org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewerContentProvider.CallbackType.IN_UI_ASYNC;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.hasState;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
@@ -22,9 +25,7 @@
 
 import org.eclipse.compare.INavigatable;
 import org.eclipse.emf.compare.Diff;
-import org.eclipse.emf.compare.DifferenceState;
 import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewerContentProvider.CallbackType;
-import org.eclipse.emf.compare.utils.EMFComparePredicates;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.OpenEvent;
@@ -141,7 +142,7 @@
 	 * @see org.eclipse.compare.INavigatable#hasChange(int)
 	 */
 	public boolean hasChange(int changeFlag) {
-		TreeItem[] selection = viewer.getTree().getItems();
+		TreeItem[] selection = viewer.getTree().getSelection();
 		TreeItem firstSelectedItem = selection.length > 0 ? selection[0] : null;
 		switch (changeFlag) {
 			case NEXT_CHANGE:
@@ -188,7 +189,14 @@
 	 * @return the previous TreeNode that contains an unresolvable diff.
 	 */
 	private Object getNextUnresolvedDiff(TreeItem start) {
-		return getNextData(start, EMFComparePredicates.hasState(DifferenceState.UNRESOLVED));
+		Object nextUnresolvedDiff = getNextData(start, hasState(UNRESOLVED));
+		if (nextUnresolvedDiff == null) {
+			// we don't have an unresolved diff AFTER the the current one (TreeItem start)
+			// thus, we look for the next unresolved diff starting from the beginning
+			nextUnresolvedDiff = getNextData(getFirstItemInTree(), hasState(UNRESOLVED));
+		}
+
+		return nextUnresolvedDiff;
 	}
 
 	/**