From b5697d9df96db90f7e2c9a80b3de501c19282cf0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20D=C3=B6bber?= <doebber@in.tum.de>
Date: Tue, 30 Aug 2011 09:42:53 +0000
Subject: [PATCH] reworking decomposition mechanism refs 133

---
 .../ui/action/CutModelElementsAction.java     |   6 +-
 .../ConnectorConnectionCompositorBase.java    |  26 ++
 ...archicElementConnectionCompositorBase.java |  18 +-
 .../editor/gef/GraphicalViewerEditorBase.java |  32 +-
 .../ui/editpart/policy/RemoveEditPolicy.java  |   6 +-
 .../HierarchicElementCompositorBase.java      | 332 ++++++++++++++----
 .../decompose/IConnectionCompositorBase.java  |  54 ---
 .../kernel/ui/internal/ActionService.java     |  18 +-
 .../internal/ConnectionCompositorService.java |  13 +-
 .../internal/ElementCompositorService.java    |   7 +-
 .../service/IConnectionCompositorService.java |   4 +-
 .../service/IElementCompositorService.java    |   7 +-
 12 files changed, 364 insertions(+), 159 deletions(-)
 delete mode 100644 org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/IConnectionCompositorBase.java

diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java
index f173f01f1..b0d7bd443 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java
@@ -60,8 +60,7 @@ public class CutModelElementsAction extends ModelElementsActionBase {
 				try {
 					CopyPasteUtils.copyToClipboard(selection);
 					for (EObject o : selection) {
-						IElementCompositorService.INSTANCE.decompose(
-								o.eContainer(), o, null);
+						IElementCompositorService.INSTANCE.decompose(o);
 					}
 				} catch (IOException e) {
 					LoggingUtils.error(ToolingBaseUIActivator.getDefault(),
@@ -78,8 +77,7 @@ public class CutModelElementsAction extends ModelElementsActionBase {
 			@Override
 			public boolean canExecute() {
 				for (EObject o : selection) {
-					if (!IElementCompositorService.INSTANCE.canDecompose(
-							o)) {
+					if (!IElementCompositorService.INSTANCE.canDecompose(o)) {
 						return false;
 					}
 				}
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 51b71216b..cee567af9 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
@@ -23,13 +23,16 @@ import org.fortiss.tooling.base.model.base.ConnectorBase;
 import org.fortiss.tooling.base.model.base.EntryConnectorBase;
 import org.fortiss.tooling.base.model.base.ExitConnectorBase;
 import org.fortiss.tooling.base.model.base.HierarchicElementBase;
+import org.fortiss.tooling.base.model.element.IConnection;
 import org.fortiss.tooling.base.model.element.IConnector;
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
+import org.fortiss.tooling.base.model.element.IModelElementSpecification;
 import org.fortiss.tooling.base.ui.dnd.DragContext;
 import org.fortiss.tooling.base.ui.editpart.FreeConnectorEditPartBase;
 import org.fortiss.tooling.kernel.extension.IConnectionCompositor;
 import org.fortiss.tooling.kernel.extension.data.IConnectionCompositionContext;
 import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
 import org.fortiss.tooling.kernel.service.IPersistencyService;
 
 /**
@@ -258,4 +261,27 @@ public abstract class ConnectorConnectionCompositorBase<HE extends IHierarchicEl
 		throw new UnsupportedOperationException(
 				"Connection parent is determined by connect.");
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean canDisconnect(S source, T target, EObject connection,
+			IConnectionCompositionContext context) {
+		if (!canDisconnectSpecific(source, target, connection, context)) {
+			return false;
+		}
+		if (connection instanceof IConnection) {
+			IConnection conn = (IConnection) connection;
+			for (IModelElementSpecification spec : conn.getSpecificationsList()) {
+				if (!IElementCompositorService.INSTANCE.canDecompose(spec)) {
+					return false;
+				}
+			}
+		}
+
+		return true;
+	}
+
+	/** Base implementation returns true by default */
+	public abstract boolean canDisconnectSpecific(S source, T target,
+			EObject connection, IConnectionCompositionContext context);
 }
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 3122556dd..f621aac57 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
@@ -22,6 +22,7 @@ import org.eclipse.gef.RootEditPart;
 import org.fortiss.tooling.base.model.element.IConnection;
 import org.fortiss.tooling.base.model.element.IConnector;
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
+import org.fortiss.tooling.base.model.element.IModelElementSpecification;
 import org.fortiss.tooling.base.ui.dnd.DragContext;
 import org.fortiss.tooling.base.ui.dnd.DropContext;
 import org.fortiss.tooling.base.ui.editpart.DiagramEditPartBase;
@@ -137,9 +138,20 @@ public abstract class HierarchicElementConnectionCompositorBase<HE extends IHier
 		return true;
 	}
 
-	/** Base implementation returns true by default */
-	public boolean canDisconnectSpecific(S source, T target,
-			EObject connection, IConnectionCompositionContext context) {
+	/** {@inheritDoc} */
+	@Override
+	public boolean canDisconnect(S source, T target, EObject connection,
+			IConnectionCompositionContext context) {
+		if (connection instanceof IConnection) {
+			IConnection conn = (IConnection) connection;
+			for (IModelElementSpecification spec : conn.getSpecificationsList()) {
+				if (!IElementCompositorService.INSTANCE.canDecompose(spec)) {
+					return false;
+				}
+			}
+		}
+
 		return true;
 	}
+
 }
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java
index fd6658b3f..09d080b73 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java
@@ -51,6 +51,7 @@ import org.eclipse.gef.ui.actions.ZoomOutAction;
 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.jface.viewers.IPostSelectionProvider;
@@ -58,6 +59,7 @@ import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
@@ -73,7 +75,10 @@ import org.fortiss.tooling.base.ui.dnd.DropTargetListener;
 import org.fortiss.tooling.base.ui.editpart.ExtendedLayerRootEditPart;
 import org.fortiss.tooling.base.ui.editpart.figure.EVisualStyle;
 import org.fortiss.tooling.base.ui.layout.constants.DefaultLayoutConstants;
+import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
+import org.fortiss.tooling.kernel.ui.service.IContextMenuService;
 import org.fortiss.tooling.kernel.ui.service.IEditPartFactoryService;
+import org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils;
 
 /**
  * GEF editor base implementation for graphical viewer editors.
@@ -86,7 +91,7 @@ import org.fortiss.tooling.kernel.ui.service.IEditPartFactoryService;
  * @ConQAT.Rating YELLOW Hash: 63FF468A2D042586A22495828A0798EF
  */
 public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T>
-		implements IPostSelectionProvider {
+		implements IPostSelectionProvider, ContextMenuContextProvider {
 
 	/** Stores the viewer. */
 	protected EditPartViewer viewer = new ScrollingGraphicalViewer();
@@ -125,6 +130,24 @@ public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T>
 
 	}
 
+	/** {@inheritDoc} */
+	@Override
+	public EObject getSelectedModelElement() {
+		return EObjectSelectionUtils.getFirstElement(getSite()
+				.getSelectionProvider().getSelection());
+	}
+
+	/** Creates the context menu. */
+	private void createContextMenu() {
+		MenuManager menuManager = IContextMenuService.INSTANCE
+				.createDefaultContextMenu(this);
+
+		Menu contextMenu = menuManager.createContextMenu(viewer.getControl());
+		viewer.getControl().setMenu(contextMenu);
+
+		getSite().registerContextMenu(menuManager, viewer);
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public void createPartControl(Composite parent) {
@@ -135,11 +158,8 @@ public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T>
 
 		viewer.setEditPartFactory(createEditPartFactory());
 		viewer.setContents(getViewerContentObject());
-		// TODO (FH): add context menu support
-		// MenuManager contextMenu = getContextMenuManager();
-		// if (contextMenu != null) {
-		// viewer.setContextMenu(contextMenu);
-		// }
+
+		createContextMenu();
 
 		getSite().setSelectionProvider(this);
 		ToolingBaseUIActivator.getDefault().getPreferenceStore()
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java
index 86bdfba96..c21f0d460 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java
@@ -71,15 +71,13 @@ public final class RemoveEditPolicy extends ComponentEditPolicy {
 		/** {@inheritDoc} */
 		@Override
 		public void execute() {
-			IElementCompositorService.INSTANCE.decompose(toRemove.eContainer(),
-					toRemove, null);
+			IElementCompositorService.INSTANCE.decompose(toRemove);
 		}
 
 		/** {@inheritDoc} */
 		@Override
 		public boolean canExecute() {
-			return IElementCompositorService.INSTANCE.canDecompose(
-					toRemove);
+			return IElementCompositorService.INSTANCE.canDecompose(toRemove);
 		}
 	}
 }
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 1b727b54b..126d3efd5 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
@@ -17,19 +17,25 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.decompose;
 
-import java.util.HashSet;
+import java.util.ArrayList;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.fortiss.tooling.base.model.element.IConnection;
 import org.fortiss.tooling.base.model.element.IConnector;
+import org.fortiss.tooling.base.model.element.IHiddenSpecification;
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.element.IHierarchicElementContainer;
 import org.fortiss.tooling.base.model.element.IModelElement;
 import org.fortiss.tooling.base.model.element.IModelElementSpecification;
 import org.fortiss.tooling.kernel.extension.IElementCompositor;
 import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
 
 /**
+ * Base implementation of a compositor for {@link IHierarchicElementContainer}s
+ * focusing on the remove mechanism.
  * 
  * @author doebber
  * @author $Author: hoelzl $
@@ -39,117 +45,311 @@ import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
 public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElementContainer>
 		implements IElementCompositor<HE> {
 
-	/** {@inheritDoc} */
+	/**
+	 * Decomposition ability check that takes care of the whole model subtree.
+	 * Subclasses implement {@link #canDecompose*****()} instead.
+	 */
 	@Override
-	public boolean canDecompose(EObject contained) {
-		return iterateCanDecompose(contained, new CanDecomposeIterator());
+	public final boolean canDecompose(EObject contained) {
+		// TODO remove
+		System.out.println(contained);
+		return iterateDecompose(contained, true);
+	}
+
+	/**
+	 * Decomposition ability check that takes care of the whole model subtree.
+	 * Subclasses implement {@link #decompose*****()} instead.
+	 */
+	@Override
+	public final boolean decompose(EObject contained) {
+		return iterateDecompose(contained, false);
+	}
+
+	/**
+	 * Returns whether the compositor is able to decompose the given model
+	 * element
+	 */
+	protected abstract boolean canDecomposeSpecific(EObject contained);
+
+	/**
+	 * Base implementation for element removal using EcoreUtil.delete
+	 * (non-recursively). Subclasses may override.
+	 */
+	protected boolean decomposeSpecific(EObject contained) {
+		System.out.println("specific: " + contained + " ### " + this);
+		EcoreUtil.delete(contained);
+		return true;
 	}
 
 	/** recursive traversion of all model elements in subtree */
-	private boolean iterateCanDecompose(EObject contained,
-			CanDecomposeIterator cdi) {
+	private boolean iterateDecompose(EObject contained, boolean can) {
 
 		if (!canDecomposeSpecific(contained)) {
 			return false;
 		}
 
-		if (contained instanceof IConnection) {
-			IConnection c = (IConnection) contained;
-			return IConnectionCompositorService.INSTANCE.canDecomposeSpecific(
-					c.getSource(), c.getTarget(), c, null);
-		}
-
-		if (contained instanceof IModelElement) {
-			IModelElement me = (IModelElement) contained;
-			for (IModelElementSpecification spec : me.getSpecificationsList()) {
-				if (cdi.contains(spec)) {
-					continue;
+		if (can) {
+			if (contained instanceof IModelElement) {
+				if (!iterateCanDecomposeSpecifications((IModelElement) contained)) {
+					return false;
 				}
-				if (!iterateCanDecompose(spec, cdi)) {
+				// TODO CD: handle references
+			}
+			if (contained instanceof IHierarchicElementContainer) {
+				if (!iterateCanDecomposeSubelements((IHierarchicElementContainer) contained)) {
 					return false;
 				}
-				cdi.add(spec);
 			}
-			// TODO CD: handle references
-		}
-		if (contained instanceof IHierarchicElement) {
-			IHierarchicElement he = (IHierarchicElement) contained;
-			for (IHierarchicElement subelement : he.getContainedElementsList()) {
-				if (cdi.contains(subelement)) {
-					continue;
+			if (contained instanceof IHierarchicElement) {
+				IHierarchicElement he = (IHierarchicElement) contained;
+
+				if (!iterateCanDecomposeConnections(he.getConnectionsList())) {
+					return false;
 				}
-				if (!iterateCanDecompose(subelement, cdi)) {
+
+				if (!iterateCanDecomposeConnectors((IHierarchicElement) contained)) {
 					return false;
 				}
-				cdi.add(subelement);
+
 			}
-			for (IConnection conn : he.getConnectionsList()) {
-				if (cdi.contains(conn)) {
-					continue;
+			if (contained instanceof IConnector) {
+				IConnector connector = (IConnector) contained;
+				if (!iterateCanDecomposeConnections(connector.getIncomingList())) {
+					return false;
 				}
-				if (!iterateCanDecompose(conn, cdi)) {
+				if (!iterateCanDecomposeConnections(connector.getOutgoingList())) {
 					return false;
 				}
-				cdi.add(conn);
 			}
-			for (IConnector c : he.getConnectorsList()) {
-				if (cdi.contains(c)) {
-					continue;
+		} else {
+			if (contained instanceof IModelElement) {
+				if (!iterateDecomposeSpecifications((IModelElement) contained)) {
+					return false;
 				}
-				if (!iterateCanDecompose(c, cdi)) {
+				// TODO CD: handle references
+			}
+			if (contained instanceof IHierarchicElementContainer) {
+				if (!iterateDecomposeSubelements((IHierarchicElementContainer) contained)) {
 					return false;
 				}
-				cdi.add(c);
 			}
-		}
-		if (contained instanceof IConnector) {
-			IConnector connector = (IConnector) contained;
-			for (IConnection conn : connector.getIncomingList()) {
-				if (cdi.contains(conn)) {
-					continue;
+			if (contained instanceof IHierarchicElement) {
+				IHierarchicElement he = (IHierarchicElement) contained;
+
+				if (!iterateDecomposeConnections(he.getConnectionsList())) {
+					return false;
 				}
-				if (!iterateCanDecompose(conn, cdi)) {
+
+				if (!iterateDecomposeConnectors((IHierarchicElement) contained)) {
 					return false;
 				}
-				cdi.add(conn);
+
 			}
-			for (IConnection conn : connector.getOutgoingList()) {
-				if (cdi.contains(conn)) {
-					continue;
+			if (contained instanceof IConnector) {
+				IConnector connector = (IConnector) contained;
+				if (!iterateDecomposeConnections(connector.getIncomingList())) {
+					return false;
 				}
-				if (!iterateCanDecompose(conn, cdi)) {
+				if (!iterateDecomposeConnections(connector.getOutgoingList())) {
 					return false;
 				}
-				cdi.add(conn);
+			}
+			return decomposeSpecific(contained);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Iterates over specifications of given {@link IModelElement} and checks
+	 * for decomposition ability
+	 */
+	private boolean iterateCanDecomposeSpecifications(IModelElement me) {
+		for (IModelElementSpecification spec : me.getSpecificationsList()) {
+			if (!canDecomposeSpecification(spec)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Iterates over sub elements of given {@link IHierarchicElementContainer}
+	 * and checks for decomposition ability.
+	 */
+	private boolean iterateCanDecomposeSubelements(
+			IHierarchicElementContainer contained) {
+		for (IHierarchicElement subelement : contained
+				.getContainedElementsList()) {
+			if (!canDecomposeSubElement(subelement)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Iterates over list of connections and checks for disconnection ability or
+	 * decomposition ability of sub elements respectively.
+	 */
+	private boolean iterateCanDecomposeConnections(
+			EList<IConnection> connectionsList) {
+		for (IConnection conn : connectionsList) {
+			if (!canDecomposeConnection(conn)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Iterates over connectors of given {@link IHierarchicElement} and checks
+	 * for decomposition ability.
+	 */
+	private boolean iterateCanDecomposeConnectors(IHierarchicElement contained) {
+		for (IConnector c : contained.getConnectorsList()) {
+			if (!canDecomposeConnector(c)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Iterates over specifications of given {@link IModelElement} and checks
+	 * for decomposition ability
+	 */
+	private boolean iterateDecomposeSpecifications(IModelElement me) {
+		ArrayList<IModelElementSpecification> list = new ArrayList<IModelElementSpecification>(
+				me.getSpecificationsList());
+		for (IModelElementSpecification spec : list) {
+			if (!decomposeSpecification(spec)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Iterates over sub elements of given {@link IHierarchicElementContainer}
+	 * and checks for decomposition ability.
+	 */
+	private boolean iterateDecomposeSubelements(
+			IHierarchicElementContainer contained) {
+		ArrayList<IHierarchicElement> list = new ArrayList<IHierarchicElement>(
+				contained.getContainedElementsList());
+		for (IHierarchicElement subelement : list) {
+			if (!decomposeSubelement(subelement)) {
+				return false;
 			}
 		}
+		return true;
+	}
 
+	/**
+	 * Iterates over list of connections and checks for disconnection ability or
+	 * decomposition ability of sub elements respectively.
+	 */
+	private boolean iterateDecomposeConnections(
+			EList<IConnection> connectionsList) {
+		ArrayList<IConnection> list = new ArrayList<IConnection>(
+				connectionsList);
+		for (IConnection conn : list) {
+			if (!decomposeConnection(conn)) {
+				return false;
+			}
+		}
 		return true;
 	}
 
+	/**
+	 * Iterates over connectors of given {@link IHierarchicElement} and checks
+	 * for decomposition ability.
+	 */
+	private boolean iterateDecomposeConnectors(IHierarchicElement contained) {
+		ArrayList<IConnector> list = new ArrayList<IConnector>(
+				contained.getConnectorsList());
+		for (IConnector c : list) {
+			if (!decomposeConnector(c)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/** Base implementation returns true by default. Subclasses may override. */
+	protected boolean canDecomposeSpecification(
+			IModelElementSpecification element) {
+		if (element instanceof IHiddenSpecification) {
+			return true;
+		}
+		return IElementCompositorService.INSTANCE.canDecompose(element);
+	}
+
 	/** Base implementation returns true by default. Subclasses may override. */
-	public boolean canDecomposeSpecific(
-			@SuppressWarnings("unused") EObject contained) {
+	protected boolean canDecomposeReference(EObject element) {
+		// TODO implement reference removal
 		return true;
 	}
 
-	/** Helper class to iterate over model elements in subtree to remove */
-	private class CanDecomposeIterator {
+	/** Base implementation returns true by default. Subclasses may override. */
+	protected boolean canDecomposeSubElement(IHierarchicElement element) {
+		return IElementCompositorService.INSTANCE.canDecompose(element);
+	}
+
+	/** Base implementation returns true by default. Subclasses may override. */
+	protected boolean canDecomposeConnector(IConnector element) {
+		return IElementCompositorService.INSTANCE.canDecompose(element);
+	}
+
+	/**
+	 * Base implementation returns compositors' decision by default. Subclasses
+	 * may override.
+	 */
+	protected boolean canDecomposeConnection(IConnection conn) {
+		return IConnectionCompositorService.INSTANCE.canDisconnect(
+				conn.getSource(), conn.getTarget(), conn, null);
+	}
+
+	protected boolean decomposeSpecification(IModelElementSpecification element) {
+		System.out.println("specification: " + element + " ### " + this);
+		EcoreUtil.delete(element);
+		return true;
+	}
 
-		/** holds the model elements already visited */
-		private HashSet<EObject> set = new HashSet<EObject>();
+	protected boolean decomposeReferences(EObject element) {
+		// TODO implement reference removal
+		return true;
+	}
 
-		/** add model element to traversed elements */
-		public void add(EObject element) {
-			set.add(element);
+	protected boolean decomposeSubelement(IHierarchicElement element) {
+		System.out.println("subelement: " + element + " ### " + this);
+		if (IElementCompositorService.INSTANCE.canDecompose(element)) {
+			return IElementCompositorService.INSTANCE.decompose(element);
 		}
+		EcoreUtil.delete(element);
+		return true;
+	}
 
-		/**
-		 * returns whether this model element has been inquired for
-		 * decomposition ability before
-		 */
-		public boolean contains(EObject element) {
-			return set.contains(element);
+	protected boolean decomposeConnector(IConnector element) {
+		ArrayList<IConnection> list = new ArrayList<IConnection>(
+				element.getIncomingList());
+		list.addAll(element.getOutgoingList());
+		for (IConnection conn : list) {
+			System.out.println("disconnect: " + element + " ### " + this);
+			if (!IConnectionCompositorService.INSTANCE.disconnect(
+					conn.getSource(), conn.getTarget(), conn, null)) {
+				return false;
+			}
 		}
+		EcoreUtil.delete(element);
+		return true;
 	}
+
+	protected boolean decomposeConnection(IConnection conn) {
+		System.out.println("connection: " + conn + " ### " + this);
+		return IConnectionCompositorService.INSTANCE.disconnect(
+				conn.getSource(), conn.getTarget(), conn, null);
+	}
+
 }
diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/IConnectionCompositorBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/IConnectionCompositorBase.java
deleted file mode 100644
index e341a4770..000000000
--- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/IConnectionCompositorBase.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*--------------------------------------------------------------------------+
-$Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
-|                                                                          |
-| Copyright 2011 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.decompose;
-
-import org.eclipse.emf.ecore.EObject;
-import org.fortiss.tooling.base.model.element.IConnection;
-import org.fortiss.tooling.base.model.element.IHierarchicElement;
-import org.fortiss.tooling.base.model.element.IModelElementSpecification;
-import org.fortiss.tooling.kernel.extension.IConnectionCompositor;
-import org.fortiss.tooling.kernel.extension.data.IConnectionCompositionContext;
-import org.fortiss.tooling.kernel.service.IElementCompositorService;
-
-/**
- * 
- * @author doebber
- * @author $Author: hoelzl $
- * @version $Rev: 18709 $
- * @ConQAT.Rating RED Hash:
- */
-public abstract class IConnectionCompositorBase<HE extends IHierarchicElement, S extends IHierarchicElement, T extends IHierarchicElement>
-		implements IConnectionCompositor<HE, S, T> {
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canDisconnect(S source, T target, EObject connection,
-			IConnectionCompositionContext context) {
-		if (connection instanceof IConnection) {
-			IConnection conn = (IConnection) connection;
-			for (IModelElementSpecification spec : conn.getSpecificationsList()) {
-				if (!IElementCompositorService.INSTANCE.canDecompose(spec)) {
-					return false;
-				}
-			}
-		}
-
-		return true;
-	}
-
-}
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 a3361ec84..547ab9157 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
@@ -89,9 +89,8 @@ public class ActionService implements IActionService,
 					new Runnable() {
 						@Override
 						public void run() {
-							IElementCompositorService.INSTANCE.decompose(
-									selectedObject.eContainer(),
-									selectedObject, null);
+							IElementCompositorService.INSTANCE
+									.decompose(selectedObject);
 						}
 					});
 		}
@@ -113,9 +112,12 @@ public class ActionService implements IActionService,
 	/** {@inheritDoc} */
 	@Override
 	public void addGlobalDefaultActionSectionToMenu(IMenuManager menuManager) {
-		menuManager.appendToGroup(GLOBAL_DEFAULT_MENU_SECTION_ID, globalDeleteAction);
-		menuManager.appendToGroup(GLOBAL_DEFAULT_MENU_SECTION_ID, globalUndoAction);
-		menuManager.appendToGroup(GLOBAL_DEFAULT_MENU_SECTION_ID, globalRedoAction);
+		menuManager.appendToGroup(GLOBAL_DEFAULT_MENU_SECTION_ID,
+				globalDeleteAction);
+		menuManager.appendToGroup(GLOBAL_DEFAULT_MENU_SECTION_ID,
+				globalUndoAction);
+		menuManager.appendToGroup(GLOBAL_DEFAULT_MENU_SECTION_ID,
+				globalRedoAction);
 	}
 
 	/** {@inheritDoc} */
@@ -155,8 +157,8 @@ public class ActionService implements IActionService,
 		globalRedoAction.setEnabled(ICommandStackService.INSTANCE
 				.canRedo(target));
 
-		boolean canDelete = IElementCompositorService.INSTANCE.canDecompose(
-				target);
+		boolean canDelete = IElementCompositorService.INSTANCE
+				.canDecompose(target);
 		canDelete = canDelete
 				&& !IPersistencyService.INSTANCE.isTopLevelElement(target);
 		globalDeleteAction.setTarget(target);
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 4224f2df6..bb50b5eff 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
@@ -69,18 +69,23 @@ public class ConnectionCompositorService
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canDecomposeSpecific(EObject source, EObject destination,
+	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;
+				context) != null
+				&& findWorkingConnector(source, destination, connection, false,
+						context).canDisconnect(source, destination, connection,
+						context);
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean decompose(EObject source, EObject destination,
+	public boolean disconnect(EObject source, EObject destination,
 			EObject connection, IConnectionCompositionContext context) {
 		return findWorkingConnector(source, destination, connection, true,
-				context).connect(source, destination, connection, context);
+				context).disconnect(source, destination, connection, context);
 	}
 
 	/**
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java
index 24ed4529d..38e934b80 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java
@@ -91,10 +91,9 @@ public final class ElementCompositorService extends
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean decompose(EObject container, EObject contained,
-			IElementCompositionContext context) {
-		return findWorkingCompositor(container, contained, context, true)
-				.decompose(contained);
+	public boolean decompose(EObject contained) {
+		return findWorkingCompositor(contained.eContainer(), contained, null,
+				true).decompose(contained);
 	}
 
 	/**
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 19172451c..d7779ee4f 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
@@ -75,13 +75,13 @@ public interface IConnectionCompositorService {
 	 * Determines if there is a compositor that allows the decomposition of the
 	 * connection between the source and target model element.
 	 */
-	boolean canDecomposeSpecific(EObject source, EObject destination,
+	boolean canDisconnect(EObject source, EObject destination,
 			EObject connection, IConnectionCompositionContext context);
 
 	/**
 	 * Decomposes the connection. Since this operation may be canceled by the
 	 * user, it returns a boolean value.
 	 */
-	boolean decompose(EObject source, EObject destination, EObject connection,
+	boolean disconnect(EObject source, EObject destination, EObject connection,
 			IConnectionCompositionContext context);
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java
index 728c9ed23..f4d16f952 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java
@@ -73,9 +73,8 @@ public interface IElementCompositorService {
 	boolean canDecompose(EObject contained);
 
 	/**
-	 * Decomposes the container and the element. Since this operation may be
-	 * canceled by the user, it returns a boolean value.
+	 * Decomposes the contained element from the container. Since this operation
+	 * may be canceled by the user, it returns a boolean value.
 	 */
-	boolean decompose(EObject container, EObject contained,
-			IElementCompositionContext context);
+	boolean decompose(EObject contained);
 }
-- 
GitLab