Copy all commands didn't work with UML

... and cascading elements. If the only visible difference
in the compare editor is an UML "refining" difference, then
trying to "copy all non-conflicting" will result in a
working merge but an unsaveable model (editor wasn't set as
"dirty") and an empty content pane.

This should probably be investigated more : why are we
relying on the "setSelection" post-merge to set the editor
dirty? This may fail in more cases than this one.

Change-Id: Ic5b8d73d8fb2bbdfbf0c59efdede0b76accfdc37
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
index d3c4ffb..e945059 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
@@ -14,7 +14,6 @@
 import static com.google.common.base.Predicates.instanceOf;
 import static com.google.common.base.Predicates.not;
 import static com.google.common.collect.Iterables.any;
-import static com.google.common.collect.Iterables.getFirst;
 import static com.google.common.collect.Iterables.size;
 import static org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewerContentProvider.CallbackType.IN_UI_ASYNC;
 import static org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewerContentProvider.CallbackType.IN_UI_SYNC;
@@ -727,33 +726,40 @@
 			if (!affectedObjects.isEmpty()) {
 				// MUST NOT call a setSelection with a list, o.e.compare does not handle it (cf
 				// org.eclipse.compare.CompareEditorInput#getElement(ISelection))
-				Object first = getFirst(affectedObjects, null);
-				if (first instanceof EObject) {
-					IDifferenceGroupProvider groupProvider = getCompareConfiguration()
-							.getStructureMergeViewerGrouper().getProvider();
-					Iterable<TreeNode> treeNodes = groupProvider.getTreeNodes((EObject)first);
-					TreeNode treeNode = getFirst(treeNodes, null);
-					if (treeNode != null) {
-						final Object adaptedAffectedObject = fAdapterFactory.adapt(treeNode,
-								ICompareInput.class);
-						// execute synchronously the set selection to be sure the MergeAction#run() will
-						// select next diff after.
-						SWTUtil.safeSyncExec(new Runnable() {
-							public void run() {
-								refresh();
-								StructuredSelection selection = new StructuredSelection(adaptedAffectedObject);
-								// allows to call CompareToolBar#selectionChanged(SelectionChangedEvent)
-								getViewer().setSelection(selection);
-							}
-						});
-						// update content viewers with the new selection
-						SWTUtil.safeAsyncExec(new Runnable() {
-							public void run() {
-								navigatable.openSelectedChange();
-							}
-						});
+				final Iterator<EObject> affectedIterator = Iterables.filter(affectedObjects, EObject.class)
+						.iterator();
+				IDifferenceGroupProvider groupProvider = getCompareConfiguration()
+						.getStructureMergeViewerGrouper().getProvider();
+				TreeNode unfilteredNode = null;
+				while (affectedIterator.hasNext() && unfilteredNode == null) {
+					EObject affected = affectedIterator.next();
+					Iterable<TreeNode> treeNodes = groupProvider.getTreeNodes(affected);
+					for (TreeNode node : treeNodes) {
+						if (!JFaceUtil.isFiltered(getViewer(), node, node.getParent())) {
+							unfilteredNode = node;
+						}
 					}
 				}
+				if (unfilteredNode != null) {
+					final Object adaptedAffectedObject = fAdapterFactory.adapt(unfilteredNode,
+							ICompareInput.class);
+					// execute synchronously the set selection to be sure the MergeAction#run() will
+					// select next diff after.
+					SWTUtil.safeSyncExec(new Runnable() {
+						public void run() {
+							refresh();
+							StructuredSelection selection = new StructuredSelection(adaptedAffectedObject);
+							// allows to call CompareToolBar#selectionChanged(SelectionChangedEvent)
+							getViewer().setSelection(selection);
+						}
+					});
+					// update content viewers with the new selection
+					SWTUtil.safeAsyncExec(new Runnable() {
+						public void run() {
+							navigatable.openSelectedChange();
+						}
+					});
+				}
 			}
 		} else {
 			// FIXME, should recompute the difference, something happened outside of this compare editor
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java
index c03df7c..b9f6e62 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java
@@ -130,9 +130,9 @@
 		if (element instanceof GroupItemProviderAdapter) {
 			Collection<?> children = ((GroupItemProviderAdapter)element).getChildren(element);
 			result = any(Iterables.filter(children, EObject.class), viewerPredicate);
-		} else if (element instanceof PendingUpdateAdapter){
+		} else if (element instanceof PendingUpdateAdapter) {
 			result = true;
-		}else if (element instanceof Adapter) {
+		} else if (element instanceof Adapter) {
 			Notifier notifier = ((Adapter)element).getTarget();
 			if (notifier instanceof EObject) {
 				EObject eObject = (EObject)notifier;