Merge branch 'develop' into local
diff --git a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
index 374812a..974b7d5 100644
--- a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
@@ -67,7 +67,8 @@
  org.eclipse.bpmn2.modeler.ui.util,
  org.eclipse.bpmn2.modeler.ui.views,
  org.eclipse.bpmn2.modeler.ui.wizards
-Import-Package: org.eclipse.emf.workspace,
+Import-Package: org.eclipse.core.expressions,
+ org.eclipse.emf.workspace,
  org.eclipse.emf.workspace.util,
  org.eclipse.wst.validation
 
diff --git a/org.eclipse.bpmn2.modeler.ui/notes.txt b/org.eclipse.bpmn2.modeler.ui/notes.txt
new file mode 100644
index 0000000..524acff
--- /dev/null
+++ b/org.eclipse.bpmn2.modeler.ui/notes.txt
@@ -0,0 +1 @@
+Test file
diff --git a/org.eclipse.bpmn2.modeler.ui/plugin.xml b/org.eclipse.bpmn2.modeler.ui/plugin.xml
index 4639c2a..5f1781e 100644
--- a/org.eclipse.bpmn2.modeler.ui/plugin.xml
+++ b/org.eclipse.bpmn2.modeler.ui/plugin.xml
@@ -613,5 +613,83 @@
 		<style object="UserTask" foreground="546778" background="D4E7F8" textColor="546778" font="arial,10,-,-"/>
 
 	</extension>
+	
+	<!-- menu commands -->
+  <extension
+        point="org.eclipse.ui.commands">
+        <category
+              id="org.eclipse.bpmn2.modeler.command.category"
+              name="BPMN2 Modeler Category">
+        </category>
+     <command
+           id="org.eclipse.bpmn2.modeler.command.createProcess"
+           categoryId="org.eclipse.bpmn2.modeler.command.category"
+           name="Create Process"/>
+     <command
+           id="org.eclipse.bpmn2.modeler.command.createChoreography"
+           categoryId="org.eclipse.bpmn2.modeler.command.category"
+           name="Create Choreography">
+     </command>
+     <command
+           id="org.eclipse.bpmn2.modeler.command.createCollaboration"
+           categoryId="org.eclipse.bpmn2.modeler.command.category"
+           name="Create Collaboration">
+     </command>
+  </extension>
 
+	<!-- menu handlers -->
+	<extension
+	        point="org.eclipse.ui.handlers">
+	     <handler
+	        class="org.eclipse.bpmn2.modeler.ui.commands.CreateDiagramCommand"
+	        commandId="org.eclipse.bpmn2.modeler.command.createProcess">
+	     </handler>
+	     <handler
+	        class="org.eclipse.bpmn2.modeler.ui.commands.CreateDiagramCommand"
+	        commandId="org.eclipse.bpmn2.modeler.command.createChoreography">
+	     </handler>
+	     <handler
+	        class="org.eclipse.bpmn2.modeler.ui.commands.CreateDiagramCommand"
+	        commandId="org.eclipse.bpmn2.modeler.command.createCollaboration">
+	     </handler>
+	</extension> 
+	
+	<!-- menu -->
+	<extension 
+	  id="org.eclipse.bpmn2.modeler.diagram.menu.extension"
+	  point="org.eclipse.ui.menus">
+	 <menuContribution
+	    locationURI= "menu:org.eclipse.ui.main.menu?after=File">
+	    <menu
+	       id="org.eclipse.bpmn2.modeler.diagram.menu"
+	       label="Diagram">
+        <visibleWhen>
+           <with
+                 variable="activeEditorId">
+              <equals
+                    value="org.eclipse.bpmn2.modeler.ui.bpmn2editor">
+              </equals>
+           </with>
+        </visibleWhen>
+	    </menu>
+	 </menuContribution>
+	<menuContribution
+	    locationURI= "menu:org.eclipse.bpmn2.modeler.diagram.menu?after=additions">
+	    <command
+	       commandId="org.eclipse.bpmn2.modeler.command.createProcess"
+	       id= "createProcess"
+	       label= "Create Process Diagram">
+	    </command>
+	    <command
+	       commandId="org.eclipse.bpmn2.modeler.command.createChoreography"
+	       id= "createChoreography"
+	       label= "Create Choreography Diagram">
+	    </command>
+	    <command
+	       commandId="org.eclipse.bpmn2.modeler.command.createCollaboration"
+	       id= "createCollaboration"
+	       label= "Create Collaboration Diagram">
+	    </command>
+	</menuContribution>
+</extension>
 </plugin>
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/commands/CreateDiagramCommand.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/commands/CreateDiagramCommand.java
new file mode 100644
index 0000000..93099b8
--- /dev/null
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/commands/CreateDiagramCommand.java
@@ -0,0 +1,140 @@
+package org.eclipse.bpmn2.modeler.ui.commands;
+
+import java.util.List;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.Definitions;
+import org.eclipse.bpmn2.RootElement;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.Collaboration;
+import org.eclipse.bpmn2.Choreography;
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.di.BPMNPlane;
+import org.eclipse.bpmn2.di.BpmnDiFactory;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.expressions.EvaluationContext;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gef.EditPart;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+
+public class CreateDiagramCommand extends AbstractHandler {
+
+	public final static String ID_CREATE_PROCESS = "org.eclipse.bpmn2.modeler.command.createProcess";
+	public final static String ID_CREATE_CHOREOGRAPHY = "org.eclipse.bpmn2.modeler.command.createChoreography";
+	public final static String ID_CREATE_COLLABORATION = "org.eclipse.bpmn2.modeler.command.createCollaboration";
+
+	@Override
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		EvaluationContext ctx = (EvaluationContext)event.getApplicationContext();
+		Object var = ctx.getDefaultVariable();
+		Object model = null;
+		BPMN2Editor editor = BPMN2Editor.getActiveEditor();
+		if (var instanceof List) {
+			for (Object e : (List)var) {
+				if ( e instanceof EditPart) {
+					model = ((EditPart)e).getModel();
+				}
+			}
+		}
+		
+		InputDialog dlg = null;
+		final String id = event.getCommand().getId();
+		if (ID_CREATE_PROCESS.equals(id)) {
+			dlg = new NewDiagramNameDialog(editor, "Process");
+		}
+		else if (ID_CREATE_CHOREOGRAPHY.equals(id)) {
+			dlg = new NewDiagramNameDialog(editor, "Choreography");
+		}
+		else if (ID_CREATE_COLLABORATION.equals(id)) {
+			dlg = new NewDiagramNameDialog(editor, "Collaboration");
+		}
+		if (dlg!=null) {
+			if (dlg.open()==Window.OK) {
+				TransactionalEditingDomain domain = editor.getEditingDomain();
+				final Definitions definitions = ModelUtil.getDefinitions(editor.getBpmnDiagram());
+				final String name = dlg.getValue();
+				domain.getCommandStack().execute(new RecordingCommand(domain) {
+					@Override
+					protected void doExecute() {
+						Class clazz = null;
+						if (ID_CREATE_PROCESS.equals(id)) {
+							clazz = Process.class;
+						}
+						else if (ID_CREATE_CHOREOGRAPHY.equals(id)) {
+							clazz = Choreography.class;
+						}
+						else if (ID_CREATE_COLLABORATION.equals(id)) {
+							clazz = Collaboration.class;
+						}
+						RootElement bpmnElement = Bpmn2ModelerFactory.create(clazz);
+						EStructuralFeature f = bpmnElement.eClass().getEStructuralFeature("name");
+						bpmnElement.eSet(f, name);
+						definitions.getRootElements().add(bpmnElement);
+
+						BPMNPlane plane = BpmnDiFactory.eINSTANCE.createBPMNPlane();
+						plane.setBpmnElement(bpmnElement);
+						
+						BPMNDiagram diagram = BpmnDiFactory.eINSTANCE.createBPMNDiagram();
+						diagram.setPlane(plane);
+						diagram.setName(name);
+						definitions.getDiagrams().add(diagram);
+						
+						ModelUtil.setID(bpmnElement);
+						ModelUtil.setID(plane);
+						ModelUtil.setID(diagram);
+					}
+					
+				});
+			}
+		}
+		return null;
+	}
+
+	private static class NewDiagramNameDialog extends InputDialog {
+		
+		public NewDiagramNameDialog(final BPMN2Editor editor, final String type) {
+			super(editor.getSite().getShell(), "New "+type+" Diagram",
+				"Enter "+type+" name", "",
+				new IInputValidator() {
+					@Override
+					public String isValid(String newText) {
+						if (newText==null || newText.isEmpty())
+							return "Name must not be empty";
+						for (RootElement re : getDefinitions(editor).getRootElements()) {
+							String name = null;
+							if (re instanceof Process) {
+								name = ((Process)re).getName();
+							}
+							else if (re instanceof Collaboration) {
+								name = ((Collaboration)re).getName();
+							}
+							else if (re instanceof Choreography) {
+								name = ((Choreography)re).getName();
+							}
+							if (newText.equals(name))
+								return "The "+type+" '"+name+"' already exists.";
+						}
+						
+						return null;
+					}
+						
+				}
+			);
+		}
+		
+		public static Definitions getDefinitions(BPMN2Editor editor) {
+			return ModelUtil.getDefinitions(editor.getBpmnDiagram());
+		}
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
index 74e3f96..6c4430f 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
@@ -858,6 +858,9 @@
 		// create a new Graphiti Diagram if needed
 		Diagram diagram = DIUtils.getOrCreateDiagram(this, bpmnDiagram);
 		
+		// clear current selection to avoid confusing the GraphicalViewer
+		selectPictogramElements(new PictogramElement[] {});
+
 		// Tell the DTP about the new Diagram
 		getDiagramTypeProvider().resourceReloaded(diagram);
 		getRefreshBehavior().initRefresh();