From a72e49598a1c8debad9de9fa2d408d5ca12e5fed Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Tue, 12 Jun 2018 14:25:12 +0200
Subject: [PATCH] Auto layouter: Use model element handler to determine root
 objects

* No longer use erroneous heuristics that depends on the assumption that
  for some model viewst there is a hidden root element (e.g., CA)
* Instead, use the model element handler service to determine object
  to be edited (same as object to be layouted).

Issue-Ref: 3433
Issue-Url: https://af3-developer.fortiss.org/issues/3433
Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../tooling/base/ui/layout/auto/.ratings      |  2 +-
 .../base/ui/layout/auto/AutoLayoutMenu.java   | 20 +++++++++----------
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings
index 1d5166219..0657786d2 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings
@@ -1,4 +1,4 @@
-AutoLayoutMenu.java ef3b897cc2fd99cf9ce201f03cffea036555e3ac GREEN
+AutoLayoutMenu.java bca7986c209678ed937548a37db494430877d80e YELLOW
 DiagramTapeMeasure.java 72454e6fe5225dab11d3d691baad93aab7a171c0 YELLOW
 IAutoLayouter.java de1b11d9e202c7e23352ad85684dbf8a3fd17c7d GREEN
 IAutoLayouterTapeMeasure.java df186e0ba505e0ecda211b1df76cf12f3245b47e YELLOW
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java
index ef3b897cc..bca7986c2 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java
@@ -21,7 +21,6 @@ import static org.fortiss.tooling.base.utils.AngleUtils.getAngle;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickInstanceOf;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
@@ -34,9 +33,10 @@ import org.fortiss.tooling.base.model.element.IConnector;
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
 import org.fortiss.tooling.base.ui.ToolingBaseUIActivator;
-import org.fortiss.tooling.kernel.model.IProjectRootElement;
 import org.fortiss.tooling.kernel.ui.extension.IContextMenuContributor;
+import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler;
 import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
+import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
 
 /**
  * Context menu entry to automatic layout {@link IHierarchicElement}-based models.
@@ -96,16 +96,16 @@ public class AutoLayoutMenu implements IContextMenuContributor {
 	public List<IContributionItem> getContributedItems(EObject selection,
 			ContextMenuContextProvider contextProvider) {
 
-		if(!(selection instanceof IHierarchicElement)) {
-			return Collections.emptyList();
+		IModelElementHandler<EObject> handler =
+				IModelElementHandlerService.getInstance().getModelElementHandler(selection);
+		if(handler == null) {
+			return emptyList();
 		}
-
-		IHierarchicElement element = (IHierarchicElement)selection;
-		// Skip single top-level model element (e.g., AF3 component architecture)
-		if(element instanceof IProjectRootElement && element.getContainedElements().size() == 1) {
-			// There is exactly one child element
-			element = element.getContainedElements().get(0);
+		EObject editedObject = handler.handleOpenModelElementRequest(selection);
+		if(!(editedObject instanceof IHierarchicElement)) {
+			return emptyList();
 		}
+		IHierarchicElement element = (IHierarchicElement)editedObject;
 
 		// Check if model is empty
 		if(pickInstanceOf(ILayoutedModelElement.class, element.getContainedElements()).isEmpty()) {
-- 
GitLab