Support DND for preferences
diff --git a/plugins/org.eclipse.oomph.setup.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.edit/META-INF/MANIFEST.MF
index 45d5505..4760fe2 100644
--- a/plugins/org.eclipse.oomph.setup.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.edit/META-INF/MANIFEST.MF
@@ -12,6 +12,7 @@
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.oomph.setup;bundle-version="[1.9.0,2.0.0)";visibility:=reexport,
  org.eclipse.emf.edit;bundle-version="[2.10.0,3.0.0)";visibility:=reexport,
- org.eclipse.oomph.base.edit;bundle-version="[1.9.0,2.0.0)";visibility:=reexport
+ org.eclipse.oomph.base.edit;bundle-version="[1.9.0,2.0.0)";visibility:=reexport,
+ org.eclipse.oomph.preferences;bundle-version="[1.9.0,2.0.0)";resolution:=optional
 Bundle-ActivationPolicy: lazy
 Automatic-Module-Name: org.eclipse.oomph.setup.edit
diff --git a/plugins/org.eclipse.oomph.setup.edit/src/org/eclipse/oomph/setup/provider/SetupTaskContainerItemProvider.java b/plugins/org.eclipse.oomph.setup.edit/src/org/eclipse/oomph/setup/provider/SetupTaskContainerItemProvider.java
index d8163ad..2243623 100644
--- a/plugins/org.eclipse.oomph.setup.edit/src/org/eclipse/oomph/setup/provider/SetupTaskContainerItemProvider.java
+++ b/plugins/org.eclipse.oomph.setup.edit/src/org/eclipse/oomph/setup/provider/SetupTaskContainerItemProvider.java
@@ -11,7 +11,11 @@
 package org.eclipse.oomph.setup.provider;
 
 import org.eclipse.oomph.base.provider.ModelElementItemProvider;
+import org.eclipse.oomph.preferences.PreferenceItem;
+import org.eclipse.oomph.preferences.PreferenceNode;
+import org.eclipse.oomph.preferences.Property;
 import org.eclipse.oomph.setup.InstallationTask;
+import org.eclipse.oomph.setup.PreferenceTask;
 import org.eclipse.oomph.setup.ProductCatalog;
 import org.eclipse.oomph.setup.ProjectCatalog;
 import org.eclipse.oomph.setup.SetupFactory;
@@ -19,13 +23,17 @@
 import org.eclipse.oomph.setup.SetupTaskContainer;
 import org.eclipse.oomph.setup.WorkspaceTask;
 
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.UnexecutableCommand;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.command.CommandParameter;
+import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
@@ -226,4 +234,58 @@
     return false;
   }
 
+  @Override
+  protected Command factorAddCommand(EditingDomain domain, CommandParameter commandParameter)
+  {
+    Collection<?> collection = commandParameter.getCollection();
+    if (collection == null || collection.isEmpty())
+    {
+      return UnexecutableCommand.INSTANCE;
+    }
+
+    List<Object> filteredCollection = new ArrayList<Object>();
+    for (Object object : collection)
+    {
+      if (object instanceof PreferenceItem)
+      {
+        PreferenceItem item = (PreferenceItem)object;
+        if (item.eContainer() == null)
+        {
+          return UnexecutableCommand.INSTANCE;
+        }
+
+        addPreferenceItem(filteredCollection, item);
+      }
+      else
+      {
+        filteredCollection.add(object);
+      }
+    }
+
+    return super.factorAddCommand(domain, new CommandParameter(commandParameter.getOwner(), commandParameter.getFeature(), commandParameter.getValue(),
+        filteredCollection, commandParameter.getIndex()));
+  }
+
+  private void addPreferenceItem(List<Object> filteredCollection, PreferenceItem item)
+  {
+    if (item instanceof PreferenceNode)
+    {
+      PreferenceNode node = (PreferenceNode)item;
+      for (PreferenceNode child : node.getChildren())
+      {
+        addPreferenceItem(filteredCollection, child);
+      }
+
+      // filteredCollection.add(SetupFactory.eINSTANCE.createCompoundTask(node.getName()));
+    }
+    else if (item instanceof Property)
+    {
+      Property property = (Property)item;
+
+      PreferenceTask task = SetupFactory.eINSTANCE.createPreferenceTask();
+      task.setKey("/" + property.getAbsolutePath().authority() + property.getAbsolutePath().path());
+      task.setValue(property.getValue());
+      filteredCollection.add(task);
+    }
+  }
 }