Fixed NPE during delete of nested Lanes in Pools.
Fixed NPE from double-click actcion when Property View is closed.
Added a "Show Property View" context menu action.
Added missing [+] decorator to SubChoreography.
Added missing Participants in Outline View for Choreographies.
diff --git a/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java b/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java
index 7db2963..822d37a 100644
--- a/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java
+++ b/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java
@@ -652,48 +652,51 @@
boolean canDelete = false;
Definitions definitions = (Definitions)rootElement.eContainer();
- BPMNDiagram bpmnDiagram = DIUtils.findBPMNDiagram(rootElement);
- RootElement newRootElement = null;
- if (bpmnDiagram==null) {
- List<EObject> allObjects = new ArrayList<EObject>();
- Map<EObject, Collection<EStructuralFeature.Setting>> usages;
- TreeIterator<EObject> iter = rootElement.eContainer().eAllContents();
- while (iter.hasNext())
- allObjects.add(iter.next());
-
- usages = UsageCrossReferencer.findAll(allObjects, rootElement);
- canDelete = usages.isEmpty();
- }
- else {
- // find a replacement for the BPMNDiagram target element
- for (RootElement r : definitions.getRootElements()) {
- if (r!=rootElement && (r instanceof FlowElementsContainer || r instanceof Collaboration)) {
- if (rootElement instanceof Collaboration) {
- Collaboration collaboration = (Collaboration) rootElement;
- if (collaboration.getParticipants().isEmpty()) {
- newRootElement = r;
- canDelete = true;
- break;
+ // check if this thing has already been deleted (eContainer == null)
+ if (definitions!=null) {
+ BPMNDiagram bpmnDiagram = DIUtils.findBPMNDiagram(rootElement);
+ RootElement newRootElement = null;
+ if (bpmnDiagram==null) {
+ List<EObject> allObjects = new ArrayList<EObject>();
+ Map<EObject, Collection<EStructuralFeature.Setting>> usages;
+ TreeIterator<EObject> iter = definitions.eAllContents();
+ while (iter.hasNext())
+ allObjects.add(iter.next());
+
+ usages = UsageCrossReferencer.findAll(allObjects, rootElement);
+ canDelete = usages.isEmpty();
+ }
+ else {
+ // find a replacement for the BPMNDiagram target element
+ for (RootElement r : definitions.getRootElements()) {
+ if (r!=rootElement && (r instanceof FlowElementsContainer || r instanceof Collaboration)) {
+ if (rootElement instanceof Collaboration) {
+ Collaboration collaboration = (Collaboration) rootElement;
+ if (collaboration.getParticipants().isEmpty()) {
+ newRootElement = r;
+ canDelete = true;
+ break;
+ }
+
}
-
- }
- else if (rootElement instanceof FlowElementsContainer) {
- FlowElementsContainer container = (FlowElementsContainer) rootElement;
- if (container.getFlowElements().isEmpty()) {
- newRootElement = r;
- canDelete = true;
- break;
+ else if (rootElement instanceof FlowElementsContainer) {
+ FlowElementsContainer container = (FlowElementsContainer) rootElement;
+ if (container.getFlowElements().isEmpty()) {
+ newRootElement = r;
+ canDelete = true;
+ break;
+ }
}
+ break;
}
- break;
}
}
- }
-
- if (canDelete) {
- EcoreUtil.delete(rootElement);
- if (bpmnDiagram!=null && newRootElement!=null)
- bpmnDiagram.getPlane().setBpmnElement(newRootElement);
+
+ if (canDelete) {
+ EcoreUtil.delete(rootElement);
+ if (bpmnDiagram!=null && newRootElement!=null)
+ bpmnDiagram.getPlane().setBpmnElement(newRootElement);
+ }
}
return canDelete;
}
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
index 55f6350..e92c657 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
@@ -604,11 +604,6 @@
public String getContributorId() {
return CONTRIBUTOR_ID;
}
-
- public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {
- tabDescriptorProvider = tdp;
- return getTargetRuntime();
- }
public TargetRuntime getTargetRuntime() {
if (targetRuntime==null) {
@@ -843,13 +838,14 @@
}
if (required==ITabDescriptorProvider.class) {
if (tabDescriptorProvider==null) {
- IWorkbenchPage page = getEditorSite().getPage();
- String viewID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
- try {
- page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
- page.showView(viewID, null, IWorkbenchPage.VIEW_ACTIVATE);
- }
- catch (Exception e) {}
+ tabDescriptorProvider = new PropertyTabDescriptorProvider();
+// IWorkbenchPage page = getEditorSite().getPage();
+// String viewID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
+// try {
+// page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
+// page.showView(viewID, null, IWorkbenchPage.VIEW_ACTIVATE);
+// }
+// catch (Exception e) {}
}
return tabDescriptorProvider;
}
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java
index 087fc28..6de025a 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java
@@ -78,6 +78,10 @@
action.setEnabled(action.isEnabled());
manager.add(action);
}
+
+ action = getDiagramContainer().getActionRegistry().getAction("show.property.view"); //$NON-NLS-1$
+ action.setText(action.getText());
+ manager.add(action);
}
};
}
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
index 854d184..b89c4ff 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
@@ -63,6 +63,7 @@
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.contentoutline.ContentOutline;
@@ -430,6 +431,37 @@
}
};
registry.registerAction(action);
+
+ action = new WorkbenchPartAction(multipageEditor.getDesignEditor()) {
+
+ @Override
+ protected void init() {
+ super.init();
+ setId("show.property.view"); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getText() {
+ return Messages.DesignEditor_Show_Property_View_Action;
+ }
+
+ @Override
+ protected boolean calculateEnabled() {
+ return true;
+ }
+
+ public void run() {
+ IWorkbenchPage page = getEditorSite().getPage();
+ String viewID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
+ try {
+ page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
+ page.showView(viewID, null, IWorkbenchPage.VIEW_ACTIVATE);
+ }
+ catch (Exception e) {}
+ }
+ };
+ registry.registerAction(action);
+
}
public class AddRemoveDiagramListener implements ResourceSetListener {
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java
index 4ea544f..eb05ba4 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java
@@ -23,6 +23,7 @@
public static String DesignEditor_Diagram_Tab;
public static String DesignEditor_Hide_Source_View_Action;
public static String DesignEditor_Show_Source_View_Action;
+ public static String DesignEditor_Show_Property_View_Action;
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties
index e4d0eab..987fe67 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties
@@ -17,3 +17,4 @@
DesignEditor_Diagram_Tab=Diagram
DesignEditor_Hide_Source_View_Action=Hide Source View
DesignEditor_Show_Source_View_Action=Show Source View
+DesignEditor_Show_Property_View_Action=Show Property View
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java
index bd8500c..0b2ce4e 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java
@@ -13,13 +13,18 @@
package org.eclipse.bpmn2.modeler.ui.features.choreography;
import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.ChoreographyActivity;
import org.eclipse.bpmn2.Participant;
import org.eclipse.bpmn2.SubChoreography;
+import org.eclipse.bpmn2.modeler.core.features.GraphitiConstants;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.utils.ShapeDecoratorUtil;
import org.eclipse.bpmn2.modeler.ui.ImageProvider;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.graphiti.features.IAddFeature;
import org.eclipse.graphiti.features.ICreateFeature;
import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
public class SubChoreographyFeatureContainer extends AbstractChoreographyFeatureContainer {
@@ -39,6 +44,21 @@
return new AddSubChoreographyFeature(fp);
}
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+ multiUpdate.addFeature(new UpdateChoreographyMarkerFeature(fp) {
+ @Override
+ protected void doUpdate(ChoreographyActivity element, ContainerShape markerContainer) {
+ super.doUpdate(element, markerContainer);
+ // SubChoreography always has an EXPAND marker
+ ShapeDecoratorUtil.showActivityMarker(markerContainer, GraphitiConstants.ACTIVITY_MARKER_EXPAND);
+ }
+ });
+
+ return multiUpdate;
+ }
+
public static class CreateSubChoreographyFeature extends AbstractCreateChoreographyActivityFeature<SubChoreography> {
public CreateSubChoreographyFeature(IFeatureProvider fp) {
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java
index d4767ca..cb88e17 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java
@@ -16,7 +16,6 @@
import org.eclipse.bpmn2.Conversation;
import org.eclipse.bpmn2.SubConversation;
import org.eclipse.bpmn2.modeler.core.features.BaseElementFeatureContainer;
-import org.eclipse.bpmn2.modeler.core.features.DefaultLayoutBPMNConnectionFeature;
import org.eclipse.bpmn2.modeler.core.features.DefaultMoveBPMNShapeFeature;
import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
import org.eclipse.bpmn2.modeler.core.features.label.UpdateLabelFeature;
@@ -30,10 +29,8 @@
import org.eclipse.graphiti.features.IMoveShapeFeature;
import org.eclipse.graphiti.features.IResizeShapeFeature;
import org.eclipse.graphiti.features.IUpdateFeature;
-import org.eclipse.graphiti.features.context.IAddContext;
import org.eclipse.graphiti.features.context.IResizeShapeContext;
import org.eclipse.graphiti.features.impl.DefaultResizeShapeFeature;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
public class ConversationFeatureContainer extends BaseElementFeatureContainer {
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java
index d747c82..57764c5 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java
@@ -46,6 +46,10 @@
ContainerShape laneContainerShape = (ContainerShape) context.getPictogramElement();
ContainerShape parentContainerShape = laneContainerShape.getContainer();
Lane lane = (Lane)getBusinessObjectForPictogramElement(laneContainerShape);
+ if (lane==null) {
+ // this can happen if the lane was already deleted by its parent Lane or Pool
+ return;
+ }
LaneSet laneSet = (LaneSet)lane.eContainer();
if (parentContainerShape != null) {
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java
index 08128d3..3615397 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java
@@ -16,11 +16,11 @@
import java.util.Hashtable;
import java.util.List;
+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
import org.eclipse.bpmn2.modeler.core.runtime.Bpmn2SectionDescriptor;
import org.eclipse.bpmn2.modeler.core.runtime.PropertyTabDescriptor;
import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -35,7 +35,7 @@
// cached in this map. It is the BPMN2 Editor's responsibility to remove these items from the map
// when it is disposed().
// @see PropertyTabDescriptorProvider#disposeTabDescriptors(Resource)
- Hashtable <EObject, TabDescriptorList> tabDescriptorListMap = new Hashtable <EObject, TabDescriptorList>();
+ static Hashtable <EObject, TabDescriptorList> tabDescriptorListMap = new Hashtable <EObject, TabDescriptorList>();
public PropertyTabDescriptorProvider() {
super();
@@ -45,26 +45,22 @@
@Override
public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part, ISelection selection) {
- // is the Tab Descriptor List already in our cache?
- TabDescriptorList tabDescriptorList = null;
EObject businessObject = BusinessObjectUtil.getBusinessObjectForSelection(selection);
- if (businessObject!=null) {
- tabDescriptorList = tabDescriptorListMap.get(businessObject);
- if (tabDescriptorList!=null) {
- // Yes! return it.
- return tabDescriptorList.toArray();
- }
+ if (businessObject==null || businessObject.eResource()==null) {
+ return new ITabDescriptor[] {};
+ }
+
+ // is the Tab Descriptor List already in our cache?
+ TabDescriptorList tabDescriptorList = tabDescriptorListMap.get(businessObject);
+ if (tabDescriptorList!=null) {
+ // Yes! return it.
+ return tabDescriptorList.toArray();
}
// No, we need build the list: get the Target Runtime <propertyTab> contributions
// and merge with the Default Runtime Tab Descriptors
- TargetRuntime rt = TargetRuntime.getDefaultRuntime();
- Object bpmn2Editor = part.getAdapter(BPMN2Editor.class);
- if (bpmn2Editor instanceof BPMN2Editor) {
- rt = ((BPMN2Editor)bpmn2Editor).getTargetRuntime(this);
- }
-
List<PropertyTabDescriptor> desc = null;
+ TargetRuntime rt = Bpmn2Preferences.getInstance(businessObject.eResource()).getRuntime();
if (rt!=TargetRuntime.getDefaultRuntime()) {
desc = TargetRuntime.getDefaultRuntime().buildPropertyTabDescriptors();
desc.addAll(rt.buildPropertyTabDescriptors());
@@ -185,5 +181,14 @@
tabDescriptorListMap.remove(object);
}
}
+ // clean up any dangling EObjects (ones that are not contained in a Resource)
+ List<EObject> removed = new ArrayList<EObject>();
+ for (EObject o : tabDescriptorListMap.keySet()) {
+ if (o.eResource()==null) {
+ removed.add(o);
+ }
+ }
+ for (EObject o : removed)
+ tabDescriptorListMap.remove(o);
}
}
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java
index 2d4ebae..6f078bb 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java
@@ -18,6 +18,7 @@
import org.eclipse.bpmn2.CallActivity;
import org.eclipse.bpmn2.CallableElement;
import org.eclipse.bpmn2.CatchEvent;
+import org.eclipse.bpmn2.Choreography;
import org.eclipse.bpmn2.ChoreographyActivity;
import org.eclipse.bpmn2.Definitions;
import org.eclipse.bpmn2.FlowElement;
@@ -25,6 +26,7 @@
import org.eclipse.bpmn2.FlowNode;
import org.eclipse.bpmn2.Lane;
import org.eclipse.bpmn2.LaneSet;
+import org.eclipse.bpmn2.Participant;
import org.eclipse.bpmn2.Process;
import org.eclipse.bpmn2.SequenceFlow;
import org.eclipse.bpmn2.SubChoreography;
@@ -168,6 +170,23 @@
if (container instanceof SubChoreography) {
retList.addAll(((SubChoreography)container).getArtifacts());
}
+ if (container instanceof Choreography) {
+ // Add Pools as children if the Pool has a Process associated with it,
+ // or if the Participant is NOT referenced by a Choreography Activity.
+ for (Participant p : ((Choreography)container).getParticipants()) {
+ if (p.getProcessRef()!=null)
+ retList.add(p);
+ else {
+ for (FlowElement fe : flowElements) {
+ if (fe instanceof ChoreographyActivity) {
+ if (!((ChoreographyActivity)fe).getParticipantRefs().contains(p)) {
+ retList.add(p);
+ }
+ }
+ }
+ }
+ }
+ }
return retList;
}