Merge "Bug 396893 - Configurable drop target listener registration" into 352120_Diagrams_in_Views
diff --git a/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/editor/DiagramBehavior.java b/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/editor/DiagramBehavior.java
index 0e6ac2b..5afe83b 100644
--- a/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/editor/DiagramBehavior.java
+++ b/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/editor/DiagramBehavior.java
@@ -463,11 +463,47 @@
 			}
 		});
 
-		graphicalViewer.addDropTargetListener((TransferDropTargetListener) new ObjectsTransferDropTargetListener(
-				graphicalViewer));
+		List<TransferDropTargetListener> objectDropTargetListeners = createBusinessObjectDropTargetListeners();
+		for (TransferDropTargetListener dropTargetListener : objectDropTargetListeners) {
+			graphicalViewer.addDropTargetListener(dropTargetListener);
+		}
 
-		graphicalViewer.addDropTargetListener(new GFTemplateTransferDropTargetListener(graphicalViewer, this));
+		TransferDropTargetListener paletteDropTargetListener = createPaletteDropTargetListener();
+		if (paletteDropTargetListener != null) {
+			graphicalViewer.addDropTargetListener(paletteDropTargetListener);
+		}
+	}
 
+	/**
+	 * Creates the drop target listener that is used for adding new objects from
+	 * the palette via drag and drop. Clients may change the default behavior by
+	 * providing their own drop target listener or disable drag and drop from
+	 * the palette by returning null.
+	 * 
+	 * @return An instance of the {@link TransferDropTargetListener} that
+	 *         handles dropping new objects from the palette or
+	 *         <code>null</code> to disable dropping from the palette.
+	 * @since 0.10
+	 */
+	protected TransferDropTargetListener createPaletteDropTargetListener() {
+		return new GFTemplateTransferDropTargetListener(diagramContainer.getGraphicalViewer(), this);
+	}
+
+	/**
+	 * Creates a list of drop target listeners that enable dropping domain
+	 * objects into the diagram, e.g. from the project explorer. By adding
+	 * additional listeners other sources may be enabled, simply returning an
+	 * empty list will disable drag and drop into the editor.
+	 * 
+	 * @return a {@link List} containing all the
+	 *         {@link TransferDropTargetListener} that shall be registered in
+	 *         the editor.
+	 * @since 0.10
+	 */
+	protected List<TransferDropTargetListener> createBusinessObjectDropTargetListeners() {
+		ArrayList<TransferDropTargetListener> result = new ArrayList<TransferDropTargetListener>(1);
+		result.add(new ObjectsTransferDropTargetListener(diagramContainer.getGraphicalViewer()));
+		return result;
 	}
 
 	String getEditorInitializationError() {