From f9faca4f7fbbedd387d4d89046092bcf3dddcb53 Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Mon, 12 Dec 2011 15:12:58 +0000
Subject: [PATCH] fixed data dictionary editor DND and partial rework of kernel
 DND. refs 346

---
 .../trunk/META-INF/MANIFEST.MF                |   3 +-
 .../base/ui/command/ConnectionCommand.java    |   2 +-
 .../ConnectorConnectionCompositorBase.java    |   2 +-
 ...archicElementConnectionCompositorBase.java |   4 +-
 ...nnectionCompositionDropTargetListener.java |   2 +-
 .../dnd/{ => gef}/ConnectionDragContext.java  |   2 +-
 .../dnd/{ => gef}/ConnectionDropContext.java  |   2 +-
 .../ElementCompositionDropTargetListener.java |   2 +-
 .../ui/dnd/{ => gef}/ElementDropContext.java  |   2 +-
 .../ViewerElementCompositionDropAdapter.java  | 113 ++++++++++++++++++
 .../base/ui/editor/DiagramEditorBase.java     |   2 +-
 .../base/ui/editor/TreeViewerEditorBase.java  |  86 +------------
 .../ConnectionGraphicalNodeEditPolicy.java    |   2 +-
 .../RelayCreateCommandEditPolicyBase.java     |   4 +-
 .../base/ui/utils/RectangleLayoutUtils.java   |   2 +-
 .../ElementCompositionDropTargetAdapter.java  |   7 +-
 .../kernel/ui/util/DragAndDropUtils.java      |  16 +++
 17 files changed, 152 insertions(+), 101 deletions(-)
 rename org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/{ => gef}/ConnectionCompositionDropTargetListener.java (98%)
 rename org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/{ => gef}/ConnectionDragContext.java (98%)
 rename org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/{ => gef}/ConnectionDropContext.java (98%)
 rename org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/{ => gef}/ElementCompositionDropTargetListener.java (98%)
 rename org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/{ => gef}/ElementDropContext.java (98%)
 create mode 100644 org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/jface/ViewerElementCompositionDropAdapter.java

diff --git a/org.fortiss.tooling.base.ui/trunk/META-INF/MANIFEST.MF b/org.fortiss.tooling.base.ui/trunk/META-INF/MANIFEST.MF
index 1b301674c..6b838be09 100644
--- a/org.fortiss.tooling.base.ui/trunk/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.base.ui/trunk/META-INF/MANIFEST.MF
@@ -15,7 +15,8 @@ Export-Package: org.fortiss.tooling.base.ui,
  org.fortiss.tooling.base.ui.compose,
  org.fortiss.tooling.base.ui.contentprovider,
  org.fortiss.tooling.base.ui.databinding,
- org.fortiss.tooling.base.ui.dnd,
+ org.fortiss.tooling.base.ui.dnd.gef,
+ org.fortiss.tooling.base.ui.dnd.jface,
  org.fortiss.tooling.base.ui.editor,
  org.fortiss.tooling.base.ui.editpart,
  org.fortiss.tooling.base.ui.editpart.anchor,
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/command/ConnectionCommand.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/command/ConnectionCommand.java
index 097523ba5..6e4b30a5f 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/command/ConnectionCommand.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/command/ConnectionCommand.java
@@ -21,7 +21,7 @@ import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.commands.Command;
-import org.fortiss.tooling.base.ui.dnd.ConnectionDragContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ConnectionDragContext;
 import org.fortiss.tooling.base.ui.editpart.policy.ConnectionGraphicalNodeEditPolicy;
 import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
 
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 6f9f291bf..6baf83d31 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
@@ -27,7 +27,7 @@ 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.ConnectionDragContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ConnectionDragContext;
 import org.fortiss.tooling.base.ui.editpart.FreeConnectorEditPartBase;
 import org.fortiss.tooling.kernel.extension.IConnectionCompositor;
 import org.fortiss.tooling.kernel.extension.data.IConnectionCompositionContext;
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 8640db7fc..3e899772c 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
@@ -23,8 +23,8 @@ 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.ConnectionDragContext;
-import org.fortiss.tooling.base.ui.dnd.ElementDropContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ConnectionDragContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ElementDropContext;
 import org.fortiss.tooling.base.ui.editpart.DiagramEditPartBase;
 import org.fortiss.tooling.kernel.extension.IConnectionCompositor;
 import org.fortiss.tooling.kernel.extension.data.IConnectionCompositionContext;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionCompositionDropTargetListener.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionCompositionDropTargetListener.java
similarity index 98%
rename from org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionCompositionDropTargetListener.java
rename to org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionCompositionDropTargetListener.java
index 5f3ebcc20..58ac7b506 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionCompositionDropTargetListener.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionCompositionDropTargetListener.java
@@ -15,7 +15,7 @@ $Id$
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.dnd;
+package org.fortiss.tooling.base.ui.dnd.gef;
 
 import org.eclipse.gef.EditPartViewer;
 import org.eclipse.gef.Request;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionDragContext.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionDragContext.java
similarity index 98%
rename from org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionDragContext.java
rename to org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionDragContext.java
index e1406cd7a..bf2594268 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionDragContext.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionDragContext.java
@@ -15,7 +15,7 @@ $Id$
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.dnd;
+package org.fortiss.tooling.base.ui.dnd.gef;
 
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.gef.EditPart;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionDropContext.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionDropContext.java
similarity index 98%
rename from org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionDropContext.java
rename to org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionDropContext.java
index cbb2c1477..ac58c5052 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ConnectionDropContext.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ConnectionDropContext.java
@@ -15,7 +15,7 @@ $Id$
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.dnd;
+package org.fortiss.tooling.base.ui.dnd.gef;
 
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.gef.EditPart;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ElementCompositionDropTargetListener.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ElementCompositionDropTargetListener.java
similarity index 98%
rename from org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ElementCompositionDropTargetListener.java
rename to org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ElementCompositionDropTargetListener.java
index e91c75ed4..32fc03fea 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ElementCompositionDropTargetListener.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ElementCompositionDropTargetListener.java
@@ -15,7 +15,7 @@ $Id$
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.dnd;
+package org.fortiss.tooling.base.ui.dnd.gef;
 
 import org.eclipse.gef.EditPartViewer;
 import org.eclipse.gef.Request;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ElementDropContext.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ElementDropContext.java
similarity index 98%
rename from org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ElementDropContext.java
rename to org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ElementDropContext.java
index 54159005c..d657631f5 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/ElementDropContext.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/gef/ElementDropContext.java
@@ -15,7 +15,7 @@ $Id$
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.dnd;
+package org.fortiss.tooling.base.ui.dnd.gef;
 
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.gef.EditPart;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/jface/ViewerElementCompositionDropAdapter.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/jface/ViewerElementCompositionDropAdapter.java
new file mode 100644
index 000000000..baa3e9b8e
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/dnd/jface/ViewerElementCompositionDropAdapter.java
@@ -0,0 +1,113 @@
+/*--------------------------------------------------------------------------+
+$Id$
+|                                                                          |
+| 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.ui.dnd.jface;
+
+import static org.fortiss.tooling.kernel.ui.util.DragAndDropUtils.extractDroppedEObject;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
+import org.fortiss.tooling.kernel.ui.dnd.CompositionServiceLocalTransfer;
+import org.fortiss.tooling.kernel.ui.dnd.ElementCompositionDropTargetAdapter;
+import org.fortiss.tooling.kernel.ui.util.DragAndDropUtils;
+import org.fortiss.tooling.kernel.utils.ModelUtils;
+
+/**
+ * {@link ElementCompositionDropTargetAdapter} implementation for a JFace
+ * {@link TreeViewer}.
+ * 
+ * @author hoelzl
+ * @author $Author$
+ * @version $Rev$
+ * @ConQAT.Rating RED Hash:
+ */
+public class ViewerElementCompositionDropAdapter extends ViewerDropAdapter {
+
+	/** Remember the last target. */
+	Object lastTarget = null;
+
+	/** Constructor. */
+	public ViewerElementCompositionDropAdapter(Viewer viewer) {
+		super(viewer);
+		setExpandEnabled(true);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean validateDrop(Object target, int operation,
+			TransferData transferType) {
+		if (target == null) {
+			target = getViewer().getInput();
+		}
+		lastTarget = target;
+
+		if (lastTarget instanceof EObject) {
+			EObject dropped = extractDroppedEObject(CompositionServiceLocalTransfer
+					.getInstance().getObject());
+
+			return IElementCompositorService.INSTANCE.canCompose(
+					(EObject) lastTarget, dropped, null);
+		}
+		return false;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean performDrop(Object data) {
+		if (lastTarget instanceof EObject) {
+			final EObject target = (EObject) lastTarget;
+			final EObject dropped = DragAndDropUtils
+					.extractDroppedEObject(data);
+			if (IElementCompositorService.INSTANCE.canCompose(target, dropped,
+					null)) {
+				ModelUtils.runAsCommand(target, new Runnable() {
+					@Override
+					public void run() {
+						IElementCompositorService.INSTANCE.compose(target,
+								dropped, null);
+					}
+				});
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/** Returns the supported DND operations as defined in {@link DND}. */
+	public int getSupportedDNDOperations() {
+		return DND.DROP_COPY;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void dragEnter(DropTargetEvent event) {
+		event.detail = DND.DROP_COPY;
+		super.dragEnter(event);
+	}
+
+	/** Returns the preferred transfer for the DND operation. */
+	public Transfer[] getPreferredTransfers() {
+		return DragAndDropUtils.getCompositionServiceTransfers();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/DiagramEditorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/DiagramEditorBase.java
index 6e5dc8eba..a578af775 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/DiagramEditorBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/DiagramEditorBase.java
@@ -76,7 +76,7 @@ import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PartInitException;
 import org.fortiss.tooling.base.layout.DefaultLayoutConstants;
 import org.fortiss.tooling.base.ui.ToolingBaseUIActivator;
-import org.fortiss.tooling.base.ui.dnd.ElementCompositionDropTargetListener;
+import org.fortiss.tooling.base.ui.dnd.gef.ElementCompositionDropTargetListener;
 import org.fortiss.tooling.base.ui.editpart.ConnectorEditPartBase;
 import org.fortiss.tooling.base.ui.editpart.ExtendedLayerRootEditPart;
 import org.fortiss.tooling.base.ui.editpart.figure.EVisualStyle;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/TreeViewerEditorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/TreeViewerEditorBase.java
index 0ef53ab5b..cb0e34d3e 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/TreeViewerEditorBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/TreeViewerEditorBase.java
@@ -27,19 +27,11 @@ import org.eclipse.emf.ecore.util.EContentAdapter;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Menu;
-import org.fortiss.tooling.kernel.service.IElementCompositorService;
+import org.fortiss.tooling.base.ui.dnd.jface.ViewerElementCompositionDropAdapter;
 import org.fortiss.tooling.kernel.ui.extension.base.EditorBase;
-import org.fortiss.tooling.kernel.ui.util.DragAndDropUtils;
 import org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils;
 
 /**
@@ -76,11 +68,10 @@ public abstract class TreeViewerEditorBase<T extends EObject> extends
 
 		setupTreeViewer(treeViewer);
 
-		// FIXME (FH): use new kernel DND mechanism
-		treeViewer.addDropSupport(
-				DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK,
-				new Transfer[] { LocalSelectionTransfer.getTransfer() },
-				new TreeDropAdapter(treeViewer));
+		ViewerElementCompositionDropAdapter dndAdapter = new ViewerElementCompositionDropAdapter(
+				treeViewer);
+		treeViewer.addDropSupport(dndAdapter.getSupportedDNDOperations(),
+				dndAdapter.getPreferredTransfers(), dndAdapter);
 
 		treeViewer.setInput(editedObject);
 		getEditorSite().setSelectionProvider(treeViewer);
@@ -135,71 +126,4 @@ public abstract class TreeViewerEditorBase<T extends EObject> extends
 	public void setFocus() {
 		treeViewer.getTree().setFocus();
 	}
-
-	/** The drop adapter for the tree. */
-	private class TreeDropAdapter extends ViewerDropAdapter {
-
-		/** Remember the last target. */
-		Object lastTarget = null;
-
-		/** Constructor. */
-		private TreeDropAdapter(Viewer viewer) {
-			super(viewer);
-			setExpandEnabled(true);
-		}
-
-		/**
-		 * {@inheritDoc}
-		 * <p>
-		 * Hook this method to set a "valid" details field.
-		 */
-		@Override
-		public void dragEnter(DropTargetEvent event) {
-			event.detail = DND.DROP_COPY;
-			// event.data = LocalSelectionTransfer.getTransfer().getSelection();
-			super.dragEnter(event);
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean validateDrop(Object target, int operation,
-				TransferData transferType) {
-			if (target == null) {
-				target = treeViewer.getInput();
-			}
-			lastTarget = target;
-
-			if (lastTarget instanceof EObject) {
-
-				EObject dropped = DragAndDropUtils
-						.extractDroppedEObject(LocalSelectionTransfer
-								.getTransfer().getSelection());
-
-				return IElementCompositorService.INSTANCE.canCompose(
-						(EObject) lastTarget, dropped, null);
-			}
-			return false;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean performDrop(Object data) {
-			if (lastTarget instanceof EObject) {
-				final EObject dropped = DragAndDropUtils
-						.extractDroppedEObject(data);
-				if (IElementCompositorService.INSTANCE.canCompose(
-						(EObject) lastTarget, dropped, null)) {
-					TreeViewerEditorBase.this.executeCommand(new Runnable() {
-						@Override
-						public void run() {
-							IElementCompositorService.INSTANCE.compose(
-									(EObject) lastTarget, dropped, null);
-						}
-					});
-					return true;
-				}
-			}
-			return false;
-		}
-	}
 }
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/ConnectionGraphicalNodeEditPolicy.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/ConnectionGraphicalNodeEditPolicy.java
index 82bf15034..72b36b90c 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/ConnectionGraphicalNodeEditPolicy.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/ConnectionGraphicalNodeEditPolicy.java
@@ -25,7 +25,7 @@ import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
 import org.eclipse.gef.requests.CreateConnectionRequest;
 import org.eclipse.gef.requests.ReconnectRequest;
 import org.fortiss.tooling.base.ui.command.ConnectionCommand;
-import org.fortiss.tooling.base.ui.dnd.ConnectionDragContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ConnectionDragContext;
 
 /**
  * This is the edit policy to be installed on edit parts that allow creation of
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RelayCreateCommandEditPolicyBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RelayCreateCommandEditPolicyBase.java
index 4ac294512..d7b3102e8 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RelayCreateCommandEditPolicyBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RelayCreateCommandEditPolicyBase.java
@@ -25,8 +25,8 @@ import org.eclipse.gef.Request;
 import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.editpolicies.LayoutEditPolicy;
 import org.eclipse.gef.requests.CreateRequest;
-import org.fortiss.tooling.base.ui.dnd.ConnectionDropContext;
-import org.fortiss.tooling.base.ui.dnd.ElementDropContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ConnectionDropContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ElementDropContext;
 import org.fortiss.tooling.base.ui.editpart.request.CreateConnectionCompositionRequest;
 import org.fortiss.tooling.base.ui.editpart.request.CreateElementCompositionRequest;
 import org.fortiss.tooling.kernel.extension.data.IConnectionCompositionContext;
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java
index 20df2784e..219da0805 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java
@@ -26,7 +26,7 @@ import org.fortiss.tooling.base.layout.DefaultLayoutConstants;
 import org.fortiss.tooling.base.model.layout.EOrientation;
 import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
 import org.fortiss.tooling.base.model.layout.OffsetOrientation;
-import org.fortiss.tooling.base.ui.dnd.ElementDropContext;
+import org.fortiss.tooling.base.ui.dnd.gef.ElementDropContext;
 import org.fortiss.tooling.base.utils.LayoutModelElementFactory;
 
 /**
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/dnd/ElementCompositionDropTargetAdapter.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/dnd/ElementCompositionDropTargetAdapter.java
index dad97433e..49bf542d9 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/dnd/ElementCompositionDropTargetAdapter.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/dnd/ElementCompositionDropTargetAdapter.java
@@ -37,8 +37,6 @@ import org.fortiss.tooling.kernel.service.IElementCompositorService;
 public abstract class ElementCompositionDropTargetAdapter extends
 		DropTargetAdapter {
 
-	// TODO @review CD: Again: This class sure is useful yet has never been
-	// implemented. Has it ever been tested?
 	/** {@inheritDoc} */
 	@Override
 	public void drop(DropTargetEvent event) {
@@ -57,13 +55,12 @@ public abstract class ElementCompositionDropTargetAdapter extends
 			event.detail = DND.DROP_NONE;
 			return;
 		}
-		// TODO @review CD: abort when canCompose succeeds?
 		if (IElementCompositorService.INSTANCE.canCompose(target,
 				dragSource.getDesignatedElement(), null)) {
-			event.detail = DND.DROP_NONE;
+			event.detail = DND.DROP_COPY;
 			return;
 		}
-		event.detail = DND.DROP_COPY;
+		event.detail = DND.DROP_NONE;
 	}
 
 	/** Returns the current target element. */
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/DragAndDropUtils.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/DragAndDropUtils.java
index d092835a6..6f57012c8 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/DragAndDropUtils.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/DragAndDropUtils.java
@@ -19,7 +19,9 @@ package org.fortiss.tooling.kernel.ui.util;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.dnd.Transfer;
 import org.fortiss.tooling.kernel.extension.data.Prototype;
+import org.fortiss.tooling.kernel.ui.dnd.CompositionServiceLocalTransfer;
 import org.fortiss.tooling.kernel.ui.dnd.ElementCompositionSource;
 
 /**
@@ -52,4 +54,18 @@ public final class DragAndDropUtils {
 		}
 		return null;
 	}
+
+	/** Returns the transfered element composition source. */
+	public static ElementCompositionSource getElementCompositionSourceFromTransfer() {
+		return (ElementCompositionSource) CompositionServiceLocalTransfer
+				.getInstance().getObject();
+	}
+
+	/**
+	 * Returns the preferred transfer for the DND operation via composition
+	 * service.
+	 */
+	public static Transfer[] getCompositionServiceTransfers() {
+		return new Transfer[] { CompositionServiceLocalTransfer.getInstance() };
+	}
 }
-- 
GitLab