From 0d8b643e7f2c483018a5fbaf5d2f1a9cf40743c5 Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Tue, 30 Jul 2019 16:47:28 +0200
Subject: [PATCH] Add ConnectorCompositorBase, a compositor base class for
 IConnectors

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

Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../org/fortiss/tooling/base/compose/.ratings |  1 +
 .../base/compose/ConnectorCompositorBase.java | 80 +++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectorCompositorBase.java

diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/.ratings
index f3bf45080..f8b1f3118 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/.ratings
@@ -1,4 +1,5 @@
 ConnectionCompositorBase.java 692689b535d7136acab2ab67a015f70809e64b6b GREEN
+ConnectorCompositorBase.java 0264edd4034da7187d1dbdf35a674c7067adf3cd YELLOW
 ConnectorConnectionCompositorBase.java eed310a4710492b7ce3bc302c3db4e5c40f4d817 GREEN
 ConnectorHierarchicElementConnectionCompositorBase.java 7a8e4acf235d5eb006c859056cce89fbb0aac05d GREEN
 ConstraintInstanceContainerCompositor.java 9cb23f13c6cddba18ac7f9dcfd1afd9e7bce4d77 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectorCompositorBase.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectorCompositorBase.java
new file mode 100644
index 000000000..0264edd40
--- /dev/null
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectorCompositorBase.java
@@ -0,0 +1,80 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2017 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.compose;
+
+import static org.fortiss.tooling.base.utils.RectangleLayoutUtils.layoutConnectorInRectangle;
+
+import org.eclipse.emf.ecore.EObject;
+import org.fortiss.tooling.base.dnd.ElementDropContext;
+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.model.layout.Point;
+import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
+import org.fortiss.tooling.kernel.extension.data.Prototype;
+
+/**
+ * Compositor base class for {@link IConnector}s.
+ * 
+ * @author zverlov
+ * @author barner
+ */
+public abstract class ConnectorCompositorBase<T extends IHierarchicElement & ILayoutedModelElement>
+		extends HierarchicElementCompositorBase<T> {
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean canCompose(T container, EObject contained, IElementCompositionContext context) {
+		return isCorrectElementClass(contained);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean canComposePrototype(Prototype prototype) {
+		return isCorrectElementClass(prototype.getPrototype());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean compose(T container, EObject contained, IElementCompositionContext context) {
+		super.compose(container, contained, context);
+
+		if(isCorrectElementClass(contained)) {
+			IConnector connector = (IConnector)contained;
+			if(context instanceof ElementDropContext) {
+				final ElementDropContext ctx = (ElementDropContext)context;
+				Point ctxPosition = ctx.getPosition();
+				if(((ElementDropContext)context).isRootFigureCanvas()) {
+					ctxPosition.translate(ctx.getViewLocationZoomed());
+				}
+				layoutConnectorInRectangle((ILayoutedModelElement)connector, container,
+						ctxPosition);
+			}
+			container.getConnectors().add(connector);
+			return true;
+		}
+		return false;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean canDecompose(EObject contained) {
+		return isCorrectElementClass(contained);
+	}
+
+	/** Returns whether the given element is of an acceptable class. */
+	protected abstract boolean isCorrectElementClass(EObject element);
+}
-- 
GitLab