https://issues.jboss.org/browse/RHBPMS-4283

Context menu 'Morph Activity' is not consistent with other options
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/AbstractMorphNodeFeature.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/AbstractMorphNodeFeature.java
index 63b43a3..22d495b 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/AbstractMorphNodeFeature.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/AbstractMorphNodeFeature.java
@@ -27,6 +27,7 @@
 import org.eclipse.bpmn2.modeler.core.features.CustomShapeFeatureContainer.CreateCustomShapeFeature;
 import org.eclipse.bpmn2.modeler.core.features.GraphitiConstants;
 import org.eclipse.bpmn2.modeler.core.features.IBpmn2CreateFeature;
+import org.eclipse.bpmn2.modeler.core.features.SubMenuCustomFeature;
 import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
 import org.eclipse.bpmn2.modeler.core.preferences.ModelEnablements;
 import org.eclipse.bpmn2.modeler.core.preferences.ShapeStyle;
@@ -67,6 +68,8 @@
 import org.eclipse.graphiti.palette.impl.ObjectCreationToolEntry;
 import org.eclipse.graphiti.services.Graphiti;
 import org.eclipse.graphiti.services.ILayoutService;
+import org.eclipse.graphiti.tb.ContextMenuEntry;
+import org.eclipse.graphiti.tb.IContextMenuEntry;
 import org.eclipse.graphiti.tb.IToolBehaviorProvider;
 import org.eclipse.graphiti.ui.editor.DiagramEditor;
 import org.eclipse.graphiti.ui.internal.util.ui.PopupMenu;
@@ -129,7 +132,60 @@
 
 	@Override
 	public boolean canExecute(ICustomContext context) {
-		return getTools(context).size()>0;
+		List<IToolEntry> tools = getTools(context);
+		if (tools.size()==0)
+			return false;
+		String key = GraphitiConstants.CONTEXT_MENU_ENTRY + this.getName();
+		IContextMenuEntry contextMenuEntry = (IContextMenuEntry) context.getProperty(key);
+		if (contextMenuEntry!=null) {
+			if (contextMenuEntry.getChildren().length == 0) {
+				Bpmn2ToolBehaviorProvider toolProvider = getToolProvider();
+				LinkedHashMap<IPaletteCompartmentEntry, ContextMenuEntry> categories = new LinkedHashMap<IPaletteCompartmentEntry, ContextMenuEntry>();
+				ContextMenuEntry cme = null;
+	
+				for (IToolEntry tool : tools) {
+					IPaletteCompartmentEntry ce = toolProvider.getCategory(tool);
+					if (ce!=null) {
+						if (categories.containsKey(ce)) {
+							cme = categories.get(ce);
+						}
+						else {
+							cme = new ContextMenuEntry(this, context);
+							cme.setText(ce.getLabel());
+							categories.put(ce, cme);
+						}
+					}
+				}
+				if (categories.size()>1) {
+					List<ContextMenuEntry> entries = new ArrayList<ContextMenuEntry>();
+					for (IToolEntry tool : tools) {
+						IPaletteCompartmentEntry ce = toolProvider.getCategory(tool);
+						if (ce!=null) {
+							ICreateFeature feature = ((ObjectCreationToolEntry)tool).getCreateFeature();
+							SubMenuCustomFeature submenuFeature = new SubMenuCustomFeature(this, feature);
+							cme = categories.get(ce);
+							ContextMenuEntry e = new ContextMenuEntry(submenuFeature, context);
+							e.setText(tool.getLabel());
+							cme.add(e);
+							if (!entries.contains(cme)) {
+								contextMenuEntry.add(cme);
+								entries.add(cme);
+							}
+						}
+					}
+				}
+				else {
+					for (IToolEntry tool : tools) {
+						ICreateFeature feature = ((ObjectCreationToolEntry)tool).getCreateFeature();
+						SubMenuCustomFeature submenuFeature = new SubMenuCustomFeature(this, feature);
+						cme = new ContextMenuEntry(submenuFeature, context);
+						cme.setText(tool.getLabel());
+						contextMenuEntry.add(cme);
+					}
+				}
+			}
+		}
+		return true;
 	}
 
 	@Override