From b358a9065f3f93f4d108e9bfe6fb67c9a2270190 Mon Sep 17 00:00:00 2001
From: Johannes Eder <eder@fortiss.org>
Date: Wed, 1 Apr 2020 11:51:53 +0200
Subject: [PATCH] auto-layout context menu for fx-based diagram editors

Issue-Ref: 3974
Issue-Url: https://af3-developer.fortiss.org/issues/3974

Signed-off-by: Johannes Eder <eder@fortiss.org>
---
 .../base/ui/editor/fx/controller/.ratings     |  4 ++--
 .../editor/fx/controller/ContextMenuUtil.java | 21 +++++++++++++++++--
 .../controller/EObjectDiagramController.java  |  5 +++++
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
index 500a8a6e3..24344685d 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
@@ -1,7 +1,7 @@
-ContextMenuUtil.java 405387151d45b09dffb3b6ba44f980313c8edcaf GREEN
+ContextMenuUtil.java 6d270ba4c239c35ee487192427d02797e73ee109 YELLOW
 CurvedLinkLayoutedContentAnchorangeController.java e22faedbe98c3dab660b5d2df8ebd004e116c5ba GREEN
 CurvedLinkLayoutedDiagramAnchorangeController.java f2e5e2a7cc9b6a070871e200e57371286bb15222 GREEN
-EObjectDiagramController.java 019e37a9016e895a720374f31667972744080e3b GREEN
+EObjectDiagramController.java 18cbb2f092409adeb728233dae6e084faf357d6d YELLOW
 EObjectEllipticResizableContentControllerBase.java 958d3856daf5337cd75d0a6f163a27dcc8717160 GREEN
 EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN
 EObjectRectangularResizableContentControllerBase.java 7cbc3e89b7b74106d56b8b4f845087e96e13d109 GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ContextMenuUtil.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ContextMenuUtil.java
index 405387151..6d270ba4c 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ContextMenuUtil.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ContextMenuUtil.java
@@ -21,10 +21,13 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
-import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewer;
-import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewerFeatures;
 import org.fortiss.tooling.base.dnd.ElementDropContext;
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.layout.Point;
+import org.fortiss.tooling.base.ui.layout.auto.IAutoLayouter;
+import org.fortiss.tooling.base.ui.layout.auto.KielerAutoLayouter;
+import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewer;
+import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewerFeatures;
 import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
 import org.fortiss.tooling.kernel.extension.data.Prototype;
 import org.fortiss.tooling.kernel.service.ICommandStackService;
@@ -67,6 +70,20 @@ public final class ContextMenuUtil {
 		return result;
 	}
 
+	/** Creates an auto-layout menu entry for {@link IHierarchicElement}s. */
+	public static MenuItem createAutoLayoutMenu(IHierarchicElement target) {
+		final String MENU_NAME = "Automatic layout";
+		MenuItem mi = new MenuItem(MENU_NAME);
+		ICommandStackService css = ICommandStackService.getInstance();
+		mi.setOnAction(evt -> {
+			css.runAsCommand(target, () -> {
+				IAutoLayouter layouter = new KielerAutoLayouter();
+				layouter.performAutoLayout(target);
+			});
+		});
+		return mi;
+	}
+
 	/** Creates the element composition context. */
 	public static IElementCompositionContext createElementCompositionContext(EObject target,
 			double x, double y, boolean isRoot, double zoom) {
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java
index 019e37a90..18cbb2f09 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java
@@ -15,6 +15,7 @@ package org.fortiss.tooling.base.ui.editor.fx.controller;
 
 import static java.lang.Math.max;
 import static java.util.Objects.requireNonNull;
+import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createAutoLayoutMenu;
 import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createDisplayMenu;
 import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createElementCompositionContext;
 import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu;
@@ -24,6 +25,7 @@ import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.compose;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramCoordinate;
 import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewerFeatures;
 import org.fortiss.tooling.common.ui.javafx.lwfxef.controller.base.DefaultDiagramController;
@@ -85,6 +87,9 @@ public class EObjectDiagramController<T extends EObject> extends DefaultDiagramC
 				getViewer().getFeatures().getCurrentZoomFactor());
 		List<MenuItem> result = createPrototypeMenu(modelParent, edc);
 		result.add(createDisplayMenu(getViewer()));
+		if(modelParent instanceof IHierarchicElement) {
+			result.add(createAutoLayoutMenu((IHierarchicElement)modelParent));
+		}
 		return result;
 	}
 
-- 
GitLab