From 285746e7784a00909fbed8ba4bd00eb7b5438755 Mon Sep 17 00:00:00 2001
From: Andreas Bayha <bayha@fortiss.org>
Date: Tue, 31 Jan 2023 15:48:45 +0100
Subject: [PATCH] Diagram Editors: Added reconnect to ConnectionCompositorBase

ConnectionCompositorBase implements a default reconnect functionality.

Issue-ref: 4279
Issue-ref: 390
Issue-URL: af3#4279
Issue-URL: af3#390

Signed-off-by: Andreas Bayha <bayha@fortiss.org>
---
 .../org/fortiss/tooling/base/compose/.ratings |  2 +-
 .../compose/ConnectionCompositorBase.java     | 23 +++++++++++++++----
 2 files changed, 20 insertions(+), 5 deletions(-)

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 ff2e522a0..6b3b5a6ac 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,4 @@
-ConnectionCompositorBase.java 692689b535d7136acab2ab67a015f70809e64b6b GREEN
+ConnectionCompositorBase.java 7b62fa0b5c6ac59ee4b3a76e9fd2ed2d2c0b2243 YELLOW
 ConnectorCompositorBase.java 0264edd4034da7187d1dbdf35a674c7067adf3cd GREEN
 ConnectorConnectionCompositorBase.java eed310a4710492b7ce3bc302c3db4e5c40f4d817 GREEN
 ConnectorHierarchicElementConnectionCompositorBase.java 7a8e4acf235d5eb006c859056cce89fbb0aac05d GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectionCompositorBase.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectionCompositorBase.java
index 692689b53..7b62fa0b5 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectionCompositorBase.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConnectionCompositorBase.java
@@ -70,17 +70,32 @@ public abstract class ConnectionCompositorBase<HE extends IHierarchicElement, S
 	@Override
 	public boolean reconnect(EObject connection, S source, T target,
 			IConnectionCompositionContext context) {
-		// TODO (FH): https://af3.fortiss.org/issues/390
-		// implement reconnect
+		// This base implementation can only reconnect target connections. See canReconnect(...).
+		if(connection instanceof IConnection && target instanceof IConnector) {
+			((IConnection)connection).setTarget((IConnector)target);
+
+			return true;
+		}
+
 		return false;
 	}
 
 	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
 	@Override
 	public boolean canReconnect(EObject connection, S source, T target,
 			IConnectionCompositionContext context) {
-		// TODO (FH): https://af3.fortiss.org/issues/390
-		// implement reconnect
+		EObject parent = connection.eContainer();
+		// This base implementation does only reconnect the connection target, since for a
+		// reconnection of the connection-source, the usual canConnect(...) implementations will not
+		// be applicable. (This is due to the fact, that the target port will be connected already
+		// when reconnecting the source.)
+		// Overwrite canReconnect() and reconnect() to implement a different behavior.
+		if(parent instanceof IHierarchicElement && connection instanceof IConnection &&
+				((IConnection)connection).getSource() == source) {
+			return canConnect(source, target, (HE)parent, context);
+		}
+
 		return false;
 	}
 
-- 
GitLab