From 64162796a6cc8b8d7953e7c9656409fec915987f Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Tue, 30 Aug 2011 11:20:42 +0000
Subject: [PATCH] refactored disconnect refs 133

---
 .../ConnectorConnectionCompositorBase.java    |  8 +--
 ...archicElementConnectionCompositorBase.java |  4 +-
 .../HierarchicElementCompositorBase.java      |  9 +--
 .../kernel/ui/internal/ActionService.java     | 44 ++++++++++++---
 .../extension/IConnectionCompositor.java      | 19 +------
 .../internal/ConnectionCompositorService.java | 56 +++++++++++--------
 .../service/IConnectionCompositorService.java |  8 +--
 7 files changed, 80 insertions(+), 68 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java
index cee567af9..8455be2ac 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/ConnectorConnectionCompositorBase.java
@@ -264,9 +264,8 @@ public abstract class ConnectorConnectionCompositorBase<HE extends IHierarchicEl
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canDisconnect(S source, T target, EObject connection,
-			IConnectionCompositionContext context) {
-		if (!canDisconnectSpecific(source, target, connection, context)) {
+	public boolean canDisconnect(EObject connection) {
+		if (!canDisconnectSpecific(connection)) {
 			return false;
 		}
 		if (connection instanceof IConnection) {
@@ -282,6 +281,5 @@ public abstract class ConnectorConnectionCompositorBase<HE extends IHierarchicEl
 	}
 
 	/** Base implementation returns true by default */
-	public abstract boolean canDisconnectSpecific(S source, T target,
-			EObject connection, IConnectionCompositionContext context);
+	public abstract boolean canDisconnectSpecific(EObject connection);
 }
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java
index f621aac57..bfdbac807 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java
@@ -140,8 +140,7 @@ public abstract class HierarchicElementConnectionCompositorBase<HE extends IHier
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canDisconnect(S source, T target, EObject connection,
-			IConnectionCompositionContext context) {
+	public boolean canDisconnect(EObject connection) {
 		if (connection instanceof IConnection) {
 			IConnection conn = (IConnection) connection;
 			for (IModelElementSpecification spec : conn.getSpecificationsList()) {
@@ -150,7 +149,6 @@ public abstract class HierarchicElementConnectionCompositorBase<HE extends IHier
 				}
 			}
 		}
-
 		return true;
 	}
 
diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
index 126d3efd5..78b691d1a 100644
--- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
+++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
@@ -307,8 +307,7 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem
 	 * may override.
 	 */
 	protected boolean canDecomposeConnection(IConnection conn) {
-		return IConnectionCompositorService.INSTANCE.canDisconnect(
-				conn.getSource(), conn.getTarget(), conn, null);
+		return IConnectionCompositorService.INSTANCE.canDisconnect(conn);
 	}
 
 	protected boolean decomposeSpecification(IModelElementSpecification element) {
@@ -337,8 +336,7 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem
 		list.addAll(element.getOutgoingList());
 		for (IConnection conn : list) {
 			System.out.println("disconnect: " + element + " ### " + this);
-			if (!IConnectionCompositorService.INSTANCE.disconnect(
-					conn.getSource(), conn.getTarget(), conn, null)) {
+			if (!IConnectionCompositorService.INSTANCE.disconnect(conn)) {
 				return false;
 			}
 		}
@@ -348,8 +346,7 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem
 
 	protected boolean decomposeConnection(IConnection conn) {
 		System.out.println("connection: " + conn + " ### " + this);
-		return IConnectionCompositorService.INSTANCE.disconnect(
-				conn.getSource(), conn.getTarget(), conn, null);
+		return IConnectionCompositorService.INSTANCE.disconnect(conn);
 	}
 
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
index 547ab9157..db30d082a 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
@@ -22,12 +22,14 @@ import java.util.EventObject;
 import org.eclipse.emf.common.command.CommandStackListener;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.ISharedImages;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.actions.ActionFactory;
 import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
 import org.fortiss.tooling.kernel.service.ICommandStackService;
+import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
 import org.fortiss.tooling.kernel.service.IElementCompositorService;
 import org.fortiss.tooling.kernel.service.IPersistencyService;
 import org.fortiss.tooling.kernel.service.listener.IPersistencyServiceListener;
@@ -76,9 +78,26 @@ public class ActionService implements IActionService,
 	};
 
 	/** The global delete action. */
-	public final EObjectActionBase globalDeleteAction = new EObjectActionBase(
-			"Delete", PlatformUI.getWorkbench().getSharedImages()
-					.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)) {
+	public final DeleteAction globalDeleteAction = new DeleteAction("Delete",
+			PlatformUI.getWorkbench().getSharedImages()
+					.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
+
+	private static class DeleteAction extends EObjectActionBase {
+
+		private boolean useElementCompositor;
+
+		/**
+		 * @param text
+		 * @param image
+		 */
+		public DeleteAction(String text, ImageDescriptor image) {
+			super(text, image);
+		}
+
+		public void setUseElementCompositor(boolean useElementCompositor) {
+			this.useElementCompositor = useElementCompositor;
+		}
+
 		@Override
 		public void run() {
 			final EObject selectedObject = getTarget();
@@ -94,7 +113,7 @@ public class ActionService implements IActionService,
 						}
 					});
 		}
-	};
+	}
 
 	/** Constructor. */
 	public ActionService() {
@@ -157,12 +176,19 @@ public class ActionService implements IActionService,
 		globalRedoAction.setEnabled(ICommandStackService.INSTANCE
 				.canRedo(target));
 
-		boolean canDelete = IElementCompositorService.INSTANCE
-				.canDecompose(target);
-		canDelete = canDelete
-				&& !IPersistencyService.INSTANCE.isTopLevelElement(target);
 		globalDeleteAction.setTarget(target);
-		globalDeleteAction.setEnabled(canDelete);
+		boolean enabled = false;
+		if (!IPersistencyService.INSTANCE.isTopLevelElement(target)) {
+			if (IElementCompositorService.INSTANCE.canDecompose(target)) {
+				enabled = true;
+				globalDeleteAction.setUseElementCompositor(true);
+			} else if (IConnectionCompositorService.INSTANCE
+					.canDisconnect(target)) {
+				enabled = true;
+				globalDeleteAction.setUseElementCompositor(false);
+			}
+		}
+		globalDeleteAction.setEnabled(enabled);
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java
index 583d19516..54703a2dd 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IConnectionCompositor.java
@@ -93,24 +93,11 @@ public interface IConnectionCompositor<P extends EObject, S extends EObject, T e
 	 * Returns whether a connection between the source and the target can be
 	 * removed.
 	 */
-	boolean canDisconnect(S source, T target, EObject connection,
-			IConnectionCompositionContext context);
+	boolean canDisconnect(EObject connection);
 
 	/**
 	 * Actually disconnects the given source and destination. This will only be
-	 * called if
-	 * {@link #canDisconnect(EObject, EObject, EObject, IConnectionCompositionContext)}
-	 * returned true.
-	 * 
-	 * @param source
-	 *            the source of the connection.
-	 * @param target
-	 *            the target of the connection.
-	 * @param connection
-	 *            the existing connection object.
-	 * @param context
-	 *            context information for the connection. May be null.
+	 * called if {@link #canDisconnect(EObject)} returned true.
 	 */
-	boolean disconnect(S source, T target, EObject connection,
-			IConnectionCompositionContext context);
+	boolean disconnect(EObject connection);
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java
index bb50b5eff..b4112eef8 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java
@@ -18,6 +18,7 @@ $Id$
 package org.fortiss.tooling.kernel.internal;
 
 import java.util.List;
+import java.util.Map;
 
 import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.kernel.extension.IConnectionCompositor;
@@ -52,8 +53,7 @@ public class ConnectionCompositorService
 	@Override
 	public boolean canConnect(EObject source, EObject destination,
 			EObject connection, IConnectionCompositionContext context) {
-		return findWorkingConnector(source, destination, connection, true,
-				context) != null;
+		return findWorkingConnector(source, destination, connection, context) != null;
 	}
 
 	/** {@inheritDoc} */
@@ -61,7 +61,7 @@ public class ConnectionCompositorService
 	public boolean connect(EObject source, EObject destination,
 			EObject connection, IConnectionCompositionContext context) {
 		IConnectionCompositor<EObject, EObject, EObject> connector = findWorkingConnector(
-				source, destination, connection, true, context);
+				source, destination, connection, context);
 		IPersistencyService.INSTANCE.getTopLevelElementFor(source).prepareIDs(
 				connection);
 		return connector.connect(source, destination, connection, context);
@@ -69,23 +69,16 @@ public class ConnectionCompositorService
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canDisconnect(EObject source, EObject destination,
-			EObject connection, IConnectionCompositionContext context) {
-		// TODO remove
-		System.out.println(connection);
-		return findWorkingConnector(source, destination, connection, false,
-				context) != null
-				&& findWorkingConnector(source, destination, connection, false,
-						context).canDisconnect(source, destination, connection,
-						context);
+	public boolean canDisconnect(EObject connection) {
+		IConnectionCompositor<EObject, EObject, EObject> dc = findWorkingDisconnector(connection);
+		return dc != null && dc.canDisconnect(connection);
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean disconnect(EObject source, EObject destination,
-			EObject connection, IConnectionCompositionContext context) {
-		return findWorkingConnector(source, destination, connection, true,
-				context).disconnect(source, destination, connection, context);
+	public boolean disconnect(EObject connection) {
+		IConnectionCompositor<EObject, EObject, EObject> dc = findWorkingDisconnector(connection);
+		return dc != null && dc.disconnect(connection);
 	}
 
 	/**
@@ -94,22 +87,37 @@ public class ConnectionCompositorService
 	 */
 	private IConnectionCompositor<EObject, EObject, EObject> findWorkingConnector(
 			EObject source, EObject target, EObject connection,
-			boolean connect, IConnectionCompositionContext context) {
+			IConnectionCompositionContext context) {
 		List<IConnectionCompositor<EObject, EObject, EObject>> list = getRegisteredHandlers(
 				source.getClass(), target.getClass());
 		if (list == null) {
 			return null;
 		}
 		for (IConnectionCompositor<EObject, EObject, EObject> connector : list) {
-			if (connect
-					&& connector
-							.canConnect(source, target, connection, context)) {
+			if (connector.canConnect(source, target, connection, context)) {
 				return connector;
 			}
-			if (!connect
-					&& connector.canDisconnect(source, target, connection,
-							context)) {
-				return connector;
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the first {@link IConnectionCompositor} which can disconnect the
+	 * given elements (or <code>null</code> if no such connector exists).
+	 */
+	private IConnectionCompositor<EObject, EObject, EObject> findWorkingDisconnector(
+			EObject connection) {
+		for (Class<?> c : handlersBySource.keySet()) {
+			Map<Class<?>, List<IConnectionCompositor<EObject, EObject, EObject>>> tmap = handlersBySource
+					.get(c);
+			for (Class<?> c2 : tmap.keySet()) {
+				List<IConnectionCompositor<EObject, EObject, EObject>> list = tmap
+						.get(c2);
+				for (IConnectionCompositor<EObject, EObject, EObject> comp : list) {
+					if (comp.canDisconnect(connection)) {
+						return comp;
+					}
+				}
 			}
 		}
 		return null;
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java
index d7779ee4f..5bf129546 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java
@@ -73,15 +73,13 @@ public interface IConnectionCompositorService {
 
 	/**
 	 * Determines if there is a compositor that allows the decomposition of the
-	 * connection between the source and target model element.
+	 * given connection.
 	 */
-	boolean canDisconnect(EObject source, EObject destination,
-			EObject connection, IConnectionCompositionContext context);
+	boolean canDisconnect(EObject connection);
 
 	/**
 	 * Decomposes the connection. Since this operation may be canceled by the
 	 * user, it returns a boolean value.
 	 */
-	boolean disconnect(EObject source, EObject destination, EObject connection,
-			IConnectionCompositionContext context);
+	boolean disconnect(EObject connection);
 }
-- 
GitLab