Merge branch 'develop' into helios
diff --git a/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
index d8fcd7c..ca25bff 100644
--- a/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
@@ -1,74 +1,74 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor Core
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.core;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.core.Activator
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.emf.transaction,
- org.eclipse.emf.edit.ui,
- org.eclipse.emf.validation.ocl,
- org.eclipse.osgi,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.xsd,
- org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
- org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
- org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
- org.eclipse.jst.j2ee,
- org.eclipse.ui.ide,
- org.eclipse.core.commands,
- org.eclipse.jdt,
- org.eclipse.jdt.core,
- org.eclipse.jdt.launching,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.jface.databinding,
- org.eclipse.core.databinding,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.core,
- org.eclipse.bpmn2.modeler.core.adapters,
- org.eclipse.bpmn2.modeler.core.di,
- org.eclipse.bpmn2.modeler.core.features,
- org.eclipse.bpmn2.modeler.core.features.activity,
- org.eclipse.bpmn2.modeler.core.features.activity.task,
- org.eclipse.bpmn2.modeler.core.features.artifact,
- org.eclipse.bpmn2.modeler.core.features.bendpoint,
- org.eclipse.bpmn2.modeler.core.features.choreography,
- org.eclipse.bpmn2.modeler.core.features.conversation,
- org.eclipse.bpmn2.modeler.core.features.data,
- org.eclipse.bpmn2.modeler.core.features.event,
- org.eclipse.bpmn2.modeler.core.features.event.definitions,
- org.eclipse.bpmn2.modeler.core.features.flow,
- org.eclipse.bpmn2.modeler.core.features.gateway,
- org.eclipse.bpmn2.modeler.core.features.lane,
- org.eclipse.bpmn2.modeler.core.features.participant,
- org.eclipse.bpmn2.modeler.core.merrimac.clad,
- org.eclipse.bpmn2.modeler.core.merrimac.dialogs,
- org.eclipse.bpmn2.modeler.core.merrimac.providers,
- org.eclipse.bpmn2.modeler.core.model,
- org.eclipse.bpmn2.modeler.core.preferences,
- org.eclipse.bpmn2.modeler.core.runtime,
- org.eclipse.bpmn2.modeler.core.utils,
- org.eclipse.bpmn2.modeler.core.validation
-Import-Package: org.eclipse.bpel.wsil.model.inspection,
- org.eclipse.graphiti.ui.features,
- org.eclipse.jface.preference,
- org.eclipse.jface.util,
- org.eclipse.jface.viewers,
- org.eclipse.swt.graphics,
- org.eclipse.ui,
- org.eclipse.ui.plugin,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.wst.validation
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BPMN2 Editor Core
+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.core;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.eclipse.bpmn2.modeler.core.Activator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.emf.transaction,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.emf.validation.ocl,
+ org.eclipse.osgi,
+ org.eclipse.graphiti;bundle-version="0.8.2",
+ org.eclipse.graphiti.ui;bundle-version="0.8.2",
+ org.eclipse.gef,
+ org.eclipse.bpmn2.edit,
+ org.eclipse.bpmn2.editor,
+ org.eclipse.xsd,
+ org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
+ org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
+ javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
+ org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
+ org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
+ org.eclipse.jst.j2ee,
+ org.eclipse.ui.ide,
+ org.eclipse.core.commands,
+ org.eclipse.jdt,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.launching,
+ org.eclipse.ui.views.properties.tabbed,
+ org.eclipse.jface.databinding,
+ org.eclipse.core.databinding,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.bpmn2.modeler.core,
+ org.eclipse.bpmn2.modeler.core.adapters,
+ org.eclipse.bpmn2.modeler.core.di,
+ org.eclipse.bpmn2.modeler.core.features,
+ org.eclipse.bpmn2.modeler.core.features.activity,
+ org.eclipse.bpmn2.modeler.core.features.activity.task,
+ org.eclipse.bpmn2.modeler.core.features.artifact,
+ org.eclipse.bpmn2.modeler.core.features.bendpoint,
+ org.eclipse.bpmn2.modeler.core.features.choreography,
+ org.eclipse.bpmn2.modeler.core.features.conversation,
+ org.eclipse.bpmn2.modeler.core.features.data,
+ org.eclipse.bpmn2.modeler.core.features.event,
+ org.eclipse.bpmn2.modeler.core.features.event.definitions,
+ org.eclipse.bpmn2.modeler.core.features.flow,
+ org.eclipse.bpmn2.modeler.core.features.gateway,
+ org.eclipse.bpmn2.modeler.core.features.lane,
+ org.eclipse.bpmn2.modeler.core.features.participant,
+ org.eclipse.bpmn2.modeler.core.merrimac.clad,
+ org.eclipse.bpmn2.modeler.core.merrimac.dialogs,
+ org.eclipse.bpmn2.modeler.core.merrimac.providers,
+ org.eclipse.bpmn2.modeler.core.model,
+ org.eclipse.bpmn2.modeler.core.preferences,
+ org.eclipse.bpmn2.modeler.core.runtime,
+ org.eclipse.bpmn2.modeler.core.utils,
+ org.eclipse.bpmn2.modeler.core.validation
+Import-Package: org.eclipse.bpel.wsil.model.inspection,
+ org.eclipse.graphiti.ui.features,
+ org.eclipse.jface.preference,
+ org.eclipse.jface.util,
+ org.eclipse.jface.viewers,
+ org.eclipse.swt.graphics,
+ org.eclipse.ui,
+ org.eclipse.ui.plugin,
+ org.eclipse.ui.views.properties.tabbed,
+ org.eclipse.wst.validation
diff --git a/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java b/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
index 88f336b..7853f2f 100644
--- a/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
+++ b/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
@@ -6,12 +6,12 @@
*/
package org.eclipse.bpmn2.modeler.runtime.example.SampleModel.util;
+import java.util.List;
+
import org.eclipse.bpmn2.modeler.runtime.example.SampleModel.*;
+import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.util.Switch;
/**
* <!-- begin-user-doc -->
@@ -26,7 +26,7 @@
* @see org.eclipse.bpmn2.modeler.runtime.example.SampleModel.SampleModelPackage
* @generated
*/
-public class SampleModelSwitch<T> extends Switch<T> {
+public class SampleModelSwitch<T> {
/**
* The cached model package
* <!-- begin-user-doc -->
@@ -48,16 +48,14 @@
}
/**
- * Checks whether this is a switch for the given package.
+ * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
- * @parameter ePackage the package in question.
- * @return whether this is a switch for the given package.
+ * @return the first non-null result returned by a <code>caseXXX</code> call.
* @generated
*/
- @Override
- protected boolean isSwitchFor(EPackage ePackage) {
- return ePackage == modelPackage;
+ public T doSwitch(EObject theEObject) {
+ return doSwitch(theEObject.eClass(), theEObject);
}
/**
@@ -67,7 +65,26 @@
* @return the first non-null result returned by a <code>caseXXX</code> call.
* @generated
*/
- @Override
+ protected T doSwitch(EClass theEClass, EObject theEObject) {
+ if (theEClass.eContainer() == modelPackage) {
+ return doSwitch(theEClass.getClassifierID(), theEObject);
+ }
+ else {
+ List<EClass> eSuperTypes = theEClass.getESuperTypes();
+ return
+ eSuperTypes.isEmpty() ?
+ defaultCase(theEObject) :
+ doSwitch(eSuperTypes.get(0), theEObject);
+ }
+ }
+
+ /**
+ * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the first non-null result returned by a <code>caseXXX</code> call.
+ * @generated
+ */
protected T doSwitch(int classifierID, EObject theEObject) {
switch (classifierID) {
case SampleModelPackage.DOCUMENT_ROOT: {
@@ -122,7 +139,6 @@
* @see #doSwitch(org.eclipse.emf.ecore.EObject)
* @generated
*/
- @Override
public T defaultCase(EObject object) {
return null;
}
diff --git a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
index 1b81d2d..b476dca 100644
--- a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
@@ -1,37 +1,37 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor Runtime extensions for JBoss jBPM5
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.Activator
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.bpmn2.modeler.core,
- org.eclipse.emf.transaction;bundle-version="1.4.0",
- org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.100",
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.jface.databinding,
- org.eclipse.emf.databinding,
- org.eclipse.emf.edit.ui,
- org.apache.xerces,
- org.eclipse.bpmn2.modeler.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.features,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.impl,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.adapters,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid
-Import-Package: org.eclipse.bpmn2.modeler.ui,
- org.eclipse.bpmn2.modeler.ui.editor,
- org.eclipse.bpmn2.modeler.ui.features.activity.task,
- org.eclipse.bpmn2.modeler.ui.property,
- org.eclipse.bpmn2.modeler.ui.property.providers
-
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BPMN2 Editor Runtime extensions for JBoss jBPM5
+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.Activator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.ui.ide,
+ org.eclipse.graphiti;bundle-version="0.8.2",
+ org.eclipse.graphiti.ui;bundle-version="0.8.2",
+ org.eclipse.bpmn2.modeler.core,
+ org.eclipse.emf.transaction;bundle-version="1.4.0",
+ org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.100",
+ org.eclipse.gef,
+ org.eclipse.bpmn2.edit,
+ org.eclipse.bpmn2.editor,
+ org.eclipse.jface.databinding,
+ org.eclipse.emf.databinding,
+ org.eclipse.emf.edit.ui,
+ org.apache.xerces,
+ org.eclipse.bpmn2.modeler.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.features,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.impl,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.adapters,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid
+Import-Package: org.eclipse.bpmn2.modeler.ui,
+ org.eclipse.bpmn2.modeler.ui.editor,
+ org.eclipse.bpmn2.modeler.ui.features.activity.task,
+ org.eclipse.bpmn2.modeler.ui.property,
+ org.eclipse.bpmn2.modeler.ui.property.providers
+
diff --git a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
index 3669055..bad36ac 100644
--- a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
@@ -1,73 +1,73 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor UI
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.ui;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.ui.Activator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.osgi,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.bpmn2.modeler.core,
- org.eclipse.emf.transaction;bundle-version="1.4.0",
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.jface.databinding,
- org.eclipse.emf.databinding,
- org.eclipse.emf.edit.ui,
- org.eclipse.bpel.wsil.model,
- org.apache.xerces,
- org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
- org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
- org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
- org.eclipse.jface.text,
- org.eclipse.jdt,
- org.eclipse.jdt.core,
- org.eclipse.emf.workspace
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.ui,
- org.eclipse.bpmn2.modeler.ui.adapters,
- org.eclipse.bpmn2.modeler.ui.adapters.properties,
- org.eclipse.bpmn2.modeler.ui.diagram,
- org.eclipse.bpmn2.modeler.ui.editor,
- org.eclipse.bpmn2.modeler.ui.features.activity.subprocess,
- org.eclipse.bpmn2.modeler.ui.features.activity.task,
- org.eclipse.bpmn2.modeler.ui.features.artifact,
- org.eclipse.bpmn2.modeler.ui.features.choreography,
- org.eclipse.bpmn2.modeler.ui.features.conversation,
- org.eclipse.bpmn2.modeler.ui.features.data,
- org.eclipse.bpmn2.modeler.ui.features.event,
- org.eclipse.bpmn2.modeler.ui.features.event.definitions,
- org.eclipse.bpmn2.modeler.ui.features.flow,
- org.eclipse.bpmn2.modeler.ui.features.gateway,
- org.eclipse.bpmn2.modeler.ui.features.lane,
- org.eclipse.bpmn2.modeler.ui.features.participant,
- org.eclipse.bpmn2.modeler.ui.preferences,
- org.eclipse.bpmn2.modeler.ui.property,
- org.eclipse.bpmn2.modeler.ui.property.artifact,
- org.eclipse.bpmn2.modeler.ui.property.connectors,
- org.eclipse.bpmn2.modeler.ui.property.data,
- org.eclipse.bpmn2.modeler.ui.property.diagrams,
- org.eclipse.bpmn2.modeler.ui.property.dialogs,
- org.eclipse.bpmn2.modeler.ui.property.editors,
- org.eclipse.bpmn2.modeler.ui.property.events,
- org.eclipse.bpmn2.modeler.ui.property.gateways,
- org.eclipse.bpmn2.modeler.ui.property.providers,
- org.eclipse.bpmn2.modeler.ui.property.tasks,
- org.eclipse.bpmn2.modeler.ui.util,
- org.eclipse.bpmn2.modeler.ui.views,
- org.eclipse.bpmn2.modeler.ui.wizards
-Import-Package: org.eclipse.emf.workspace,
- org.eclipse.emf.workspace.util,
- org.eclipse.wst.validation
-
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BPMN2 Editor UI
+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.ui;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.eclipse.bpmn2.modeler.ui.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui.ide,
+ org.eclipse.osgi,
+ org.eclipse.graphiti;bundle-version="0.8.2",
+ org.eclipse.graphiti.ui;bundle-version="0.8.2",
+ org.eclipse.bpmn2.modeler.core,
+ org.eclipse.emf.transaction;bundle-version="1.4.0",
+ org.eclipse.ui.views.properties.tabbed,
+ org.eclipse.gef,
+ org.eclipse.bpmn2.edit,
+ org.eclipse.bpmn2.editor,
+ org.eclipse.jface.databinding,
+ org.eclipse.emf.databinding,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.bpel.wsil.model,
+ org.apache.xerces,
+ org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
+ org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
+ javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
+ org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
+ org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
+ org.eclipse.jface.text,
+ org.eclipse.jdt,
+ org.eclipse.jdt.core,
+ org.eclipse.emf.workspace
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.bpmn2.modeler.ui,
+ org.eclipse.bpmn2.modeler.ui.adapters,
+ org.eclipse.bpmn2.modeler.ui.adapters.properties,
+ org.eclipse.bpmn2.modeler.ui.diagram,
+ org.eclipse.bpmn2.modeler.ui.editor,
+ org.eclipse.bpmn2.modeler.ui.features.activity.subprocess,
+ org.eclipse.bpmn2.modeler.ui.features.activity.task,
+ org.eclipse.bpmn2.modeler.ui.features.artifact,
+ org.eclipse.bpmn2.modeler.ui.features.choreography,
+ org.eclipse.bpmn2.modeler.ui.features.conversation,
+ org.eclipse.bpmn2.modeler.ui.features.data,
+ org.eclipse.bpmn2.modeler.ui.features.event,
+ org.eclipse.bpmn2.modeler.ui.features.event.definitions,
+ org.eclipse.bpmn2.modeler.ui.features.flow,
+ org.eclipse.bpmn2.modeler.ui.features.gateway,
+ org.eclipse.bpmn2.modeler.ui.features.lane,
+ org.eclipse.bpmn2.modeler.ui.features.participant,
+ org.eclipse.bpmn2.modeler.ui.preferences,
+ org.eclipse.bpmn2.modeler.ui.property,
+ org.eclipse.bpmn2.modeler.ui.property.artifact,
+ org.eclipse.bpmn2.modeler.ui.property.connectors,
+ org.eclipse.bpmn2.modeler.ui.property.data,
+ org.eclipse.bpmn2.modeler.ui.property.diagrams,
+ org.eclipse.bpmn2.modeler.ui.property.dialogs,
+ org.eclipse.bpmn2.modeler.ui.property.editors,
+ org.eclipse.bpmn2.modeler.ui.property.events,
+ org.eclipse.bpmn2.modeler.ui.property.gateways,
+ org.eclipse.bpmn2.modeler.ui.property.providers,
+ org.eclipse.bpmn2.modeler.ui.property.tasks,
+ org.eclipse.bpmn2.modeler.ui.util,
+ org.eclipse.bpmn2.modeler.ui.views,
+ org.eclipse.bpmn2.modeler.ui.wizards
+Import-Package: org.eclipse.emf.workspace,
+ org.eclipse.emf.workspace.util,
+ org.eclipse.wst.validation
+
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
index c6b3adb..e05922d 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
@@ -161,6 +161,14 @@
// The shared instance
private static Activator plugin;
+ // handles changes to the bpmn file
+ private BPMN2ResourceChangeListener resourceChangeListener;
+ private ISaveParticipant saveParticipant;
+
+ static {
+ TargetRuntime.getAllRuntimes();
+ }
+
// Adapter Factory registration
static {
AdapterRegistry.INSTANCE.registerAdapterFactory(
@@ -193,6 +201,8 @@
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
+
+ initializeResourceChangeListener();
}
/*
@@ -203,6 +213,11 @@
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
+
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ if (workspace != null) {
+ workspace.removeResourceChangeListener(this.resourceChangeListener);
+ }
}
/**
@@ -314,4 +329,66 @@
public ImageDescriptor getImageDescriptor(String id) {
return getImageRegistry().getDescriptor(id);
}
+
+ /**
+ * Installs the IResourceChangeListener for this Plugin. Also
+ * checks if there were any changes to bpmn files while the plug-in
+ * was not active.
+ */
+ private void initializeResourceChangeListener() throws CoreException {
+ this.resourceChangeListener = new BPMN2ResourceChangeListener();
+ // Add the save participant in a separate thread
+ // to make sure that it doesn't block the UI thread and potentially cause
+ // deadlocks with the code that caused our plugin to be started.
+ Thread initSaveParticipantThread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ workspace.addResourceChangeListener(Activator.this.resourceChangeListener, IResourceChangeEvent.POST_BUILD);
+ ISavedState savedState = workspace.addSaveParticipant("BPMN2 Modeler", getSaveParticipant());
+ if (savedState != null) {
+ savedState.processResourceChangeEvents(Activator.this.resourceChangeListener);
+ }
+ } catch (CoreException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ initSaveParticipantThread.setName("BPMN2 Modeler plugin init"); //$NON-NLS-1$
+ initSaveParticipantThread.start();
+ }
+
+ /**
+ * We are only interested in the resource delta while the plugin was
+ * not active and don't really care about the plug-in save lifecycle.
+ */
+ private ISaveParticipant getSaveParticipant() {
+ if (this.saveParticipant == null) {
+ this.saveParticipant = new ISaveParticipant() {
+ @Override
+ public void doneSaving(ISaveContext context) {
+ }
+ @Override
+ public void prepareToSave(ISaveContext context) throws CoreException {
+ }
+ @Override
+ public void rollback(ISaveContext context) {
+ }
+ @Override
+ public void saving(ISaveContext context) throws CoreException {
+ context.needDelta();
+ }
+ };
+ }
+ return this.saveParticipant;
+ }
+
+ /**
+ * Returns the resource change listener.
+ */
+ public BPMN2ResourceChangeListener getResourceChangeListener() {
+ return this.resourceChangeListener;
+ }
+
}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java
new file mode 100644
index 0000000..1cca90a
--- /dev/null
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ * All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+package org.eclipse.bpmn2.modeler.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Bob Brodt
+ *
+ */
+public class BPMN2ResourceChangeListener implements IResourceChangeListener {
+
+ class ResourceDeltaVisitor implements IResourceDeltaVisitor {
+
+ public boolean visit(final IResourceDelta delta) throws CoreException {
+ IResource target = delta.getResource();
+// switch (delta.getKind()) {
+// case IResourceDelta.ADDED:
+// System.out.println(target.getFullPath()+" ADDED");
+// break;
+// case IResourceDelta.CHANGED:
+// System.out.println(target.getFullPath()+" CHANGED");
+// break;
+// case IResourceDelta.REMOVED:
+// System.out.println(target.getFullPath()+" REMOVED");
+// break;
+// case IResourceDelta.ADDED_PHANTOM:
+// System.out.println(target.getFullPath()+" ADDED_PHANTOM");
+// break;
+// }
+ if (target.getType() == IResource.FILE) {
+ handleFile(delta);
+ }
+ return true;
+ }
+
+ private void handleFile(final IResourceDelta delta)
+ throws CoreException {
+ IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor)
+ throws CoreException {
+ IFile target = (IFile) delta.getResource();
+ int flags = delta.getFlags();
+
+ switch (delta.getKind()) {
+ case IResourceDelta.ADDED:
+ if ((flags & IResourceDelta.MOVED_FROM) != 0) {
+ if (target.exists())
+ fileMoved(delta.getMovedFromPath(), target.getFullPath());
+ }
+ break;
+ case IResourceDelta.REMOVED:
+ if ((flags & IResourceDelta.MOVED_TO) != 0) {
+ if (target.exists())
+ fileMoved(target.getFullPath(), delta.getMovedToPath());
+ } else {
+ fileDeleted(target.getFullPath(), monitor);
+ }
+ break;
+ }
+ }
+ };
+ ResourcesPlugin.getWorkspace().run(runnable, null);
+ }
+ }
+
+ protected IResourceDeltaVisitor visitor;
+ protected List<IFileChangeListener> listeners;
+
+ public BPMN2ResourceChangeListener() {
+ listeners = new ArrayList<IFileChangeListener>();
+ }
+
+ /**
+ * Objects like the BPELEditor can add listeners so they can be
+ * notified and react when BPEL files change.
+ */
+ public void addListener(IFileChangeListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removed the listener.
+ */
+ public void removeListener(IFileChangeListener listener) {
+ listeners.remove(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+ */
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ try {
+ event.getDelta().accept(getResourceDeltaVisitor());
+ } catch (CoreException e) {
+ Activator.logError(e);
+ }
+ }
+
+ protected IResourceDeltaVisitor getResourceDeltaVisitor() {
+ if (visitor == null) {
+ visitor = new ResourceDeltaVisitor();
+ }
+ return visitor;
+ }
+
+ protected void fileMoved(IPath oldFilePath, IPath newFilePath) throws CoreException {
+ // notify listeners
+ // make a copy of listener list to avoid concurrent list modification
+ List<IFileChangeListener> l = new ArrayList<IFileChangeListener>();
+ l.addAll(listeners);
+ for (IFileChangeListener listener : l) {
+ listener.moved(oldFilePath, newFilePath);
+ }
+ }
+
+ protected void fileDeleted(IPath filePath, IProgressMonitor monitor) throws CoreException {
+ // notify listeners
+ // make a copy of listener list to avoid concurrent list modification
+ List<IFileChangeListener> l = new ArrayList<IFileChangeListener>();
+ l.addAll(listeners);
+ for (IFileChangeListener listener : l) {
+ listener.deleted(filePath);
+ }
+ }
+}
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..f204ef8 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
@@ -1,1048 +1,1058 @@
-/*******************************************************************************
- * Copyright (c) 2011 Red Hat, Inc.
- * All rights reserved.
- * This program is made available under the terms of the
- * Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Red Hat, Inc. - initial API and implementation
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.Assignment;
-import org.eclipse.bpmn2.BaseElement;
-import org.eclipse.bpmn2.BoundaryEvent;
-import org.eclipse.bpmn2.CallActivity;
-import org.eclipse.bpmn2.CallChoreography;
-import org.eclipse.bpmn2.CatchEvent;
-import org.eclipse.bpmn2.Category;
-import org.eclipse.bpmn2.CompensateEventDefinition;
-import org.eclipse.bpmn2.ConditionalEventDefinition;
-import org.eclipse.bpmn2.DataInput;
-import org.eclipse.bpmn2.DataObject;
-import org.eclipse.bpmn2.DataObjectReference;
-import org.eclipse.bpmn2.DataOutput;
-import org.eclipse.bpmn2.DataStore;
-import org.eclipse.bpmn2.DataStoreReference;
-import org.eclipse.bpmn2.EndEvent;
-import org.eclipse.bpmn2.ErrorEventDefinition;
-import org.eclipse.bpmn2.EscalationEventDefinition;
-import org.eclipse.bpmn2.Event;
-import org.eclipse.bpmn2.Expression;
-import org.eclipse.bpmn2.FormalExpression;
-import org.eclipse.bpmn2.Gateway;
-import org.eclipse.bpmn2.GlobalBusinessRuleTask;
-import org.eclipse.bpmn2.GlobalManualTask;
-import org.eclipse.bpmn2.GlobalScriptTask;
-import org.eclipse.bpmn2.GlobalTask;
-import org.eclipse.bpmn2.GlobalUserTask;
-import org.eclipse.bpmn2.HumanPerformer;
-import org.eclipse.bpmn2.Import;
-import org.eclipse.bpmn2.InputOutputSpecification;
-import org.eclipse.bpmn2.Interface;
-import org.eclipse.bpmn2.ItemDefinition;
-import org.eclipse.bpmn2.LinkEventDefinition;
-import org.eclipse.bpmn2.ManualTask;
-import org.eclipse.bpmn2.Message;
-import org.eclipse.bpmn2.MessageEventDefinition;
-import org.eclipse.bpmn2.MessageFlow;
-import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
-import org.eclipse.bpmn2.Performer;
-import org.eclipse.bpmn2.PotentialOwner;
-import org.eclipse.bpmn2.Process;
-import org.eclipse.bpmn2.Property;
-import org.eclipse.bpmn2.ResourceAssignmentExpression;
-import org.eclipse.bpmn2.ResourceParameterBinding;
-import org.eclipse.bpmn2.ResourceRole;
-import org.eclipse.bpmn2.ScriptTask;
-import org.eclipse.bpmn2.SequenceFlow;
-import org.eclipse.bpmn2.SignalEventDefinition;
-import org.eclipse.bpmn2.StandardLoopCharacteristics;
-import org.eclipse.bpmn2.StartEvent;
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.Task;
-import org.eclipse.bpmn2.TextAnnotation;
-import org.eclipse.bpmn2.ThrowEvent;
-import org.eclipse.bpmn2.TimerEventDefinition;
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.Bpmn2TabbedPropertySheetPage;
-import org.eclipse.bpmn2.modeler.core.ModelHandler;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.ProxyURIConverterImplExtension;
-import org.eclipse.bpmn2.modeler.core.di.DIImport;
-import org.eclipse.bpmn2.modeler.core.di.DIUtils;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDialogComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceImpl;
-import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
-import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.core.utils.DiagramEditorAdapter;
-import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.bpmn2.modeler.ui.property.artifact.CategoryDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.artifact.TextAnnotationDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.connectors.MessageFlowDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.connectors.SequenceFlowDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ConditionalEventDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataAssignmentDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectPropertySection.DataObjectDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectReferencePropertySection.DataObjectReferenceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataStorePropertySection.DataStoreDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataStoreReferencePropertySection.DataStoreReferenceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ExpressionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.InterfaceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ItemAwareElementDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.MessageDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.MessageListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceAssignmentExpressionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceParameterBindingDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceRoleDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertyComposite.ImportDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ProcessDiagramPropertyComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.PropertyListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ResourceRoleListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.BoundaryEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CatchEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventPropertySection.EventDefinitionDialogComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.EndEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.StartEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.ThrowEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.TimerEventDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.gateways.GatewayDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityInputDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityOutputDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.DataAssociationDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.IoParametersDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ManualTaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.MultiInstanceLoopCharacteristicsDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ScriptTaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.StandardLoopCharacteristicsDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.views.outline.BPMN2EditorOutlinePage;
-import org.eclipse.bpmn2.modeler.ui.wizards.BPMN2DiagramCreator;
-import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
-import org.eclipse.bpmn2.modeler.ui.wizards.FileService;
-import org.eclipse.bpmn2.util.Bpmn2ResourceImpl;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.emf.transaction.TransactionalEditingDomain.Lifecycle;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.gef.ui.parts.SelectionSynchronizer;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.graphiti.services.Graphiti;
-import org.eclipse.graphiti.services.IPeService;
-import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
-import org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFPaletteRoot;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- *
- */
-@SuppressWarnings("restriction")
-public class BPMN2Editor extends DiagramEditor implements IPropertyChangeListener, IGotoMarker {
-
- static {
- TargetRuntime.getAllRuntimes();
- PropertiesCompositeFactory.register(EObject.class, DefaultDetailComposite.class);
- PropertiesCompositeFactory.register(EObject.class, DefaultListComposite.class);
- PropertiesCompositeFactory.register(EObject.class, DefaultDialogComposite.class);
- PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);
- PropertiesCompositeFactory.register(Message.class, MessageListComposite.class);
- PropertiesCompositeFactory.register(MessageFlow.class, MessageFlowDetailComposite.class);
- PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);
- PropertiesCompositeFactory.register(CallActivity.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(GlobalTask.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(GlobalBusinessRuleTask.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(GlobalManualTask.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(GlobalScriptTask.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(GlobalUserTask.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(Import.class, ImportDetailComposite.class);
- PropertiesCompositeFactory.register(Category.class, CategoryDetailComposite.class);
- PropertiesCompositeFactory.register(TextAnnotation.class, TextAnnotationDetailComposite.class);
- PropertiesCompositeFactory.register(SequenceFlow.class, SequenceFlowDetailComposite.class);
- PropertiesCompositeFactory.register(DataObject.class, DataObjectDetailComposite.class);
- PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectDetailComposite.class);
- PropertiesCompositeFactory.register(Assignment.class, DataAssignmentDetailComposite.class);
- PropertiesCompositeFactory.register(Expression.class, ExpressionDetailComposite.class);
- PropertiesCompositeFactory.register(FormalExpression.class, ExpressionDetailComposite.class);
- PropertiesCompositeFactory.register(ResourceAssignmentExpression.class, ResourceAssignmentExpressionDetailComposite.class);
- PropertiesCompositeFactory.register(ResourceParameterBinding.class, ResourceParameterBindingDetailComposite.class);
- PropertiesCompositeFactory.register(PotentialOwner.class, ResourceRoleDetailComposite.class);
- PropertiesCompositeFactory.register(HumanPerformer.class, ResourceRoleDetailComposite.class);
- PropertiesCompositeFactory.register(Performer.class, ResourceRoleDetailComposite.class);
- PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectReferenceDetailComposite.class);
- PropertiesCompositeFactory.register(DataStore.class, DataStoreDetailComposite.class);
- PropertiesCompositeFactory.register(DataStoreReference.class, DataStoreReferenceDetailComposite.class);
- PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);
- PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionDetailComposite.class);
- PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionListComposite.class);
- PropertiesCompositeFactory.register(Property.class, PropertyListComposite.class);
- PropertiesCompositeFactory.register(ResourceRole.class, ResourceRoleListComposite.class);
- PropertiesCompositeFactory.register(Event.class, CommonEventDetailComposite.class);
- PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
- PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
- PropertiesCompositeFactory.register(CatchEvent.class, CatchEventDetailComposite.class);
- PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
- PropertiesCompositeFactory.register(BoundaryEvent.class, BoundaryEventDetailComposite.class);
- PropertiesCompositeFactory.register(TimerEventDefinition.class, TimerEventDefinitionDetailComposite.class);
- PropertiesCompositeFactory.register(ConditionalEventDefinition.class, ConditionalEventDefinitionDetailComposite.class);
- PropertiesCompositeFactory.register(CompensateEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(ConditionalEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(ErrorEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(EscalationEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(LinkEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(MessageEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(SignalEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(TimerEventDefinition.class, EventDefinitionDialogComposite.class);
- PropertiesCompositeFactory.register(Process.class, ProcessDiagramPropertyComposite.class);
- PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
- PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
- PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
- PropertiesCompositeFactory.register(StandardLoopCharacteristics.class, StandardLoopCharacteristicsDetailComposite.class);
- PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, MultiInstanceLoopCharacteristicsDetailComposite.class);
- PropertiesCompositeFactory.register(Gateway.class, GatewayDetailComposite.class);
- PropertiesCompositeFactory.register(Activity.class, ActivityInputDetailComposite.class);
- PropertiesCompositeFactory.register(InputOutputSpecification.class, ActivityInputDetailComposite.class);
- PropertiesCompositeFactory.register(Activity.class, ActivityOutputDetailComposite.class);
- PropertiesCompositeFactory.register(CallChoreography.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(InputOutputSpecification.class, IoParametersDetailComposite.class);
- PropertiesCompositeFactory.register(DataInput.class, DataAssociationDetailComposite.class);
- PropertiesCompositeFactory.register(DataOutput.class, DataAssociationDetailComposite.class);
- PropertiesCompositeFactory.register(ManualTask.class, ManualTaskDetailComposite.class);
- PropertiesCompositeFactory.register(ScriptTask.class, ScriptTaskDetailComposite.class);
- PropertiesCompositeFactory.register(SubProcess.class, ActivityDetailComposite.class);
- PropertiesCompositeFactory.register(Task.class, TaskDetailComposite.class);
- }
-
- public static final String EDITOR_ID = "org.eclipse.bpmn2.modeler.ui.bpmn2editor";
- public static final String CONTRIBUTOR_ID = "org.eclipse.bpmn2.modeler.ui.PropertyContributor";
-
- private ModelHandler modelHandler;
- private URI modelUri;
- private URI diagramUri;
- private boolean editable = true;
-
- protected BPMNDiagram bpmnDiagram;
- protected Bpmn2ResourceImpl bpmnResource;
-
- private IWorkbenchListener workbenchListener;
- private IPartListener2 selectionListener;
- private IResourceChangeListener markerChangeListener;
- private boolean workbenchShutdown = false;
- private static BPMN2Editor activeEditor;
- private static ITabDescriptorProvider tabDescriptorProvider;
-
- private BPMN2EditingDomainListener editingDomainListener;
-
- private Bpmn2Preferences preferences;
- private TargetRuntime targetRuntime;
-// private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();
-
- protected DiagramEditorAdapter editorAdapter;
- protected BPMN2MultiPageEditor multipageEditor;
-
- public BPMN2Editor(BPMN2MultiPageEditor mpe) {
- multipageEditor = mpe;
- }
-
- public static BPMN2Editor getActiveEditor() {
- return activeEditor;
- }
-
- private void setActiveEditor(BPMN2Editor editor) {
- activeEditor = editor;
- if (activeEditor!=null) {
- Bpmn2Preferences.setActiveProject(activeEditor.getProject());
- TargetRuntime.setCurrentRuntime( activeEditor.getTargetRuntime() );
- }
- }
-
- public BPMN2MultiPageEditor getMultipageEditor() {
- return multipageEditor;
- }
-
- protected DiagramEditorAdapter getEditorAdapter() {
- return editorAdapter;
- }
-
- @Override
- public void init(IEditorSite site, IEditorInput input) throws PartInitException {
- try {
- Bpmn2DiagramType diagramType = Bpmn2DiagramType.NONE;
- String targetNamespace = null;
- bpmnDiagram = null;
-
- if (input instanceof IStorageEditorInput) {
- input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
- }
- else if (input instanceof DiagramEditorInput) {
- if (input instanceof Bpmn2DiagramEditorInput) {
- diagramType = ((Bpmn2DiagramEditorInput)input).getInitialDiagramType();
- targetNamespace = ((Bpmn2DiagramEditorInput)input).getTargetNamespace();
- bpmnDiagram = ((Bpmn2DiagramEditorInput)input).getBpmnDiagram();
- }
- if (bpmnDiagram==null) {
- // This was incorrectly constructed input, we ditch the old one and make a new and clean one instead
- // This code path comes in from the New File Wizard
- input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
- }
- else {
- BPMNDiagram d = bpmnDiagram;
- bpmnDiagram = null;
- setBpmnDiagram(d);
- return;
- }
- }
- else {
- throw new PartInitException("Invalid Editor Input: "
- +input.getClass().getSimpleName()+" "
- +input.getName());
- }
- } catch (Exception e) {
- Activator.showErrorWithLogging(e);
- throw new PartInitException(e.getMessage());
- }
-
- // add a listener so we get notified if the workbench is shutting down.
- // in this case we don't want to delete the temp file!
- addWorkbenchListener();
- getTargetRuntime(input);
- setActiveEditor(this);
-
- super.init(site, input);
-
- addSelectionListener();
- addMarkerChangeListener();
- }
-
- public void setEditable(boolean editable) {
- this.editable = editable;
- }
-
- public boolean isEditable() {
- return editable;
- }
-
- @Override
- public boolean isDirty() {
- if (!editable)
- return false;
- return super.isDirty();
- }
-
- @Override
- protected DefaultUpdateBehavior createUpdateBehavior() {
- return new BPMN2EditorUpdateBehavior(this);
- }
-
- @Override
- protected DefaultPersistencyBehavior createPersistencyBehavior() {
- return new BPMN2PersistencyBehavior(this);
- }
-
- public Bpmn2Preferences getPreferences() {
- if (preferences==null) {
- loadPreferences(getProject());
- }
- return preferences;
- }
-
- private void loadPreferences(IProject project) {
- preferences = Bpmn2Preferences.getInstance(project);
- preferences.load();
- preferences.getGlobalPreferences().addPropertyChangeListener(this);
- }
-
- /**
- * ID for tabbed property sheets.
- *
- * @return the contributor id
- */
- @Override
- public String getContributorId() {
- return CONTRIBUTOR_ID;
- }
-
- public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {
- tabDescriptorProvider = tdp;
- return getTargetRuntime();
- }
-
- public TargetRuntime getTargetRuntime() {
- if (targetRuntime==null) {
- targetRuntime = getTargetRuntime(getEditorInput());
- }
- return targetRuntime;
- }
-
- protected TargetRuntime getTargetRuntime(IEditorInput input) {
- if (targetRuntime==null) {
- // If the project has not been configured for a specific runtime through the "BPMN2"
- // project properties page (i.e. the target is "None") then allow the runtime extension
- // plug-ins an opportunity to identify the given process file contents as their own.
- // If none of the plug-ins respond with "yes, this file is targeted for my runtime",
- // then use the "None" as the extension. This will configure the BPMN2 Modeler with
- // generic property sheets and other default behavior.
- targetRuntime = getPreferences().getRuntime();
- if (targetRuntime == TargetRuntime.getDefaultRuntime()) {
- for (TargetRuntime rt : TargetRuntime.getAllRuntimes()) {
- if (rt.getRuntimeExtension().isContentForRuntime(input)) {
- targetRuntime = rt;
- break;
- }
- }
- }
- if (targetRuntime==null)
- targetRuntime = TargetRuntime.getDefaultRuntime();
- }
- return targetRuntime;
- }
-
- /**
- * Beware, creates a new input and changes this editor!
- */
- private Bpmn2DiagramEditorInput createNewDiagramEditorInput(IEditorSite site, IEditorInput input, Bpmn2DiagramType diagramType, String targetNamespace)
- throws CoreException {
-
- modelUri = FileService.getInputUri(input);
- input = BPMN2DiagramCreator.createDiagram(modelUri, diagramType,targetNamespace,this);
- diagramUri = ((Bpmn2DiagramEditorInput)input).getUri();
-
- return (Bpmn2DiagramEditorInput)input;
- }
-
- private void saveModelFile() {
- modelHandler.save();
- ((BasicCommandStack) getEditingDomain().getCommandStack()).saveIsDone();
- updateDirtyState();
- }
-
- @Override
- protected void setInput(IEditorInput input) {
- super.setInput(input);
-
- // Hook a transaction exception handler so we can get diagnostics about EMF validation errors.
- getEditingDomainListener();
-
- BasicCommandStack basicCommandStack = (BasicCommandStack) getEditingDomain().getCommandStack();
-
- if (input instanceof DiagramEditorInput) {
- ResourceSet resourceSet = getEditingDomain().getResourceSet();
- getTargetRuntime().setResourceSet(resourceSet);
-
- bpmnResource = (Bpmn2ResourceImpl) resourceSet.createResource(modelUri,
- Bpmn2ModelerResourceImpl.BPMN2_CONTENT_TYPE_ID);
-
- resourceSet.setURIConverter(new ProxyURIConverterImplExtension());
- resourceSet.eAdapters().add(editorAdapter = new DiagramEditorAdapter(this));
-
- modelHandler = ModelHandlerLocator.createModelHandler(modelUri, bpmnResource);
- ModelHandlerLocator.put(diagramUri, modelHandler);
-
- getTargetRuntime(input);
- setActiveEditor(this);
-
- // allow the runtime extension to construct custom tasks and whatever else it needs
- // custom tasks should be added to the current target runtime's custom tasks list
- // where they will be picked up by the toolpalette refresh.
- getTargetRuntime().getRuntimeExtension().initialize(this);
-
- try {
- if (getModelFile()==null || getModelFile().exists()) {
- bpmnResource.load(null);
- } else {
- saveModelFile();
- }
- } catch (IOException e) {
- Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
- ErrorUtils.showErrorWithLogging(status);
- }
- basicCommandStack.execute(new RecordingCommand(getEditingDomain()) {
-
- @Override
- protected void doExecute() {
- importDiagram();
- }
- });
- }
- basicCommandStack.saveIsDone();
- basicCommandStack.flush();
- loadMarkers();
- }
-
- private void importDiagram() {
- // make sure this guy is active, otherwise it's not selectable
- Diagram diagram = getDiagramTypeProvider().getDiagram();
- IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider();
- diagram.setActive(true);
- Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput) getEditorInput();
- Bpmn2DiagramType diagramType = input.getInitialDiagramType();
- String targetNamespace = input.getTargetNamespace();
-
- if (diagramType != Bpmn2DiagramType.NONE) {
- bpmnDiagram = modelHandler.createDiagramType(diagramType, targetNamespace);
- featureProvider.link(diagram, bpmnDiagram);
- saveModelFile();
- }
-
- DIImport di = new DIImport(this);
- di.setModelHandler(modelHandler);
-
- di.generateFromDI();
- }
-
- protected void updatePalette() {
- GFPaletteRoot pr = (GFPaletteRoot)getPaletteRoot();
- if (pr!=null)
- pr.updatePaletteEntries();
- }
-
- @Override
- protected PictogramElement[] getPictogramElementsForSelection() {
- // filter out invisible elements when setting selection
- PictogramElement[] pictogramElements = super.getPictogramElementsForSelection();
- if (pictogramElements==null)
- return null;
- ArrayList<PictogramElement> visibleList = new ArrayList<PictogramElement>();
- for (PictogramElement pe : pictogramElements) {
- if (pe.isVisible())
- visibleList.add(pe);
- }
- return visibleList.toArray(new PictogramElement[visibleList.size()]);
- }
-
- private void addWorkbenchListener() {
- if (workbenchListener==null) {
- workbenchListener = new IWorkbenchListener() {
- @Override
- public boolean preShutdown(IWorkbench workbench, boolean forced) {
- workbenchShutdown = true;
- return true;
- }
-
- @Override
- public void postShutdown(IWorkbench workbench) {
- }
-
- };
- PlatformUI.getWorkbench().addWorkbenchListener(workbenchListener);
- }
- }
-
- @Override
- public void gotoMarker(IMarker marker) {
- final EObject target = getTargetObject(marker);
- if (target == null) {
- return;
- }
- final PictogramElement pe = getDiagramTypeProvider().getFeatureProvider().getPictogramElementForBusinessObject(
- target);
- if (pe == null) {
- return;
- }
- selectPictogramElements(new PictogramElement[] {pe });
- }
-
- private void loadMarkers() {
- if (getModelFile()!=null) {
- // read in the markers
- BPMN2ValidationStatusLoader vsl = new BPMN2ValidationStatusLoader(this);
-
- try {
- vsl.load(Arrays.asList(getModelFile().findMarkers(
- BPMN2ProjectValidator.BPMN2_MARKER_ID, true, IResource.DEPTH_ZERO)));
- } catch (CoreException e) {
- Activator.logStatus(e.getStatus());
- }
- }
- }
-
- private EObject getTargetObject(IMarker marker) {
- final String uriString = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
- final URI uri = uriString == null ? null : URI.createURI(uriString);
- if (uri == null) {
- return null;
- }
- return getEditingDomain().getResourceSet().getEObject(uri, false);
- }
-
- private void removeWorkbenchListener()
- {
- if (workbenchListener!=null) {
- PlatformUI.getWorkbench().removeWorkbenchListener(workbenchListener);
- workbenchListener = null;
- }
- }
-
- private void addSelectionListener() {
- if (selectionListener == null) {
- IWorkbenchPage page = getSite().getPage();
- selectionListener = new IPartListener2() {
- public void partActivated(IWorkbenchPartReference partRef) {
- }
-
- @Override
- public void partBroughtToTop(IWorkbenchPartReference partRef) {
- IWorkbenchPart part = partRef.getPart(false);
- if (part instanceof BPMN2MultiPageEditor) {
- BPMN2MultiPageEditor mpe = (BPMN2MultiPageEditor)part;
- setActiveEditor(mpe.getDesignEditor());
- }
- }
-
- @Override
- public void partClosed(IWorkbenchPartReference partRef) {
- }
-
- @Override
- public void partDeactivated(IWorkbenchPartReference partRef) {
- }
-
- @Override
- public void partOpened(IWorkbenchPartReference partRef) {
- }
-
- @Override
- public void partHidden(IWorkbenchPartReference partRef) {
- }
-
- @Override
- public void partVisible(IWorkbenchPartReference partRef) {
- }
-
- @Override
- public void partInputChanged(IWorkbenchPartReference partRef) {
- }
- };
- page.addPartListener(selectionListener);
- }
- }
-
- private void removeSelectionListener()
- {
- if (selectionListener!=null) {
- getSite().getPage().removePartListener(selectionListener);
- selectionListener = null;
- }
- }
-
- private void addMarkerChangeListener() {
- if (getModelFile()!=null) {
- if (markerChangeListener==null) {
- markerChangeListener = new BPMN2MarkerChangeListener(this);
- getModelFile().getWorkspace().addResourceChangeListener(markerChangeListener, IResourceChangeEvent.POST_BUILD);
- }
- }
- }
-
- private void removeMarkerChangeListener() {
- if (markerChangeListener!=null) {
- getModelFile().getWorkspace().removeResourceChangeListener(markerChangeListener);
- markerChangeListener = null;
- }
- }
-
- public void refreshTitle() {
- String name = getEditorInput().getName();
- setPartName(URI.decode(name));
- }
-
- public BPMN2EditingDomainListener getEditingDomainListener() {
- if (editingDomainListener==null) {
- TransactionalEditingDomainImpl editingDomain = (TransactionalEditingDomainImpl)getEditingDomain();
- if (editingDomain==null) {
- return null;
- }
- editingDomainListener = new BPMN2EditingDomainListener(this);
-
- Lifecycle domainLifeCycle = (Lifecycle) editingDomain.getAdapter(Lifecycle.class);
- domainLifeCycle.addTransactionalEditingDomainListener(editingDomainListener);
- }
- return editingDomainListener;
- }
-
- public BasicDiagnostic getDiagnostics() {
- return getEditingDomainListener().getDiagnostics();
- }
-
- @Override
- public Object getAdapter(Class required) {
- if (required==ITabDescriptorProvider.class) {
- if (tabDescriptorProvider==null) {
- IWorkbenchPage page = getEditorSite().getPage();
- String viewID = "org.eclipse.ui.views.PropertySheet";
- try {
- page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
- page.showView(viewID, null, IWorkbenchPage.VIEW_ACTIVATE);
- }
- catch (Exception e) {}
- }
- return tabDescriptorProvider;
- }
- if (required==TargetRuntime.class)
- return getTargetRuntime();
- if (required==Bpmn2Preferences.class)
- return getPreferences();
- if (required == IPropertySheetPage.class) {
- return new Bpmn2TabbedPropertySheetPage(this);
- }
- if (required == SelectionSynchronizer.class) {
- return getSelectionSynchronizer();
- }
- if (required == IContentOutlinePage.class) {
- if (getDiagramTypeProvider() != null) {
- BPMN2EditorOutlinePage outlinePage = new BPMN2EditorOutlinePage(this);
- return outlinePage;
- }
- }
-
- return super.getAdapter(required);
- }
-
- @Override
- public void dispose() {
- // clear ID mapping tables if no more instances of editor are active
- int instances = 0;
- IWorkbenchPage[] pages = getEditorSite().getWorkbenchWindow().getPages();
- for (IWorkbenchPage p : pages) {
- IEditorReference[] refs = p.getEditorReferences();
- instances += refs.length;
- }
- File diagramFile = new File(diagramUri.toFileString());
- if (diagramFile.exists()) {
- try {
- diagramFile.delete();
- }
- catch (Exception e) {
- }
- }
- ModelUtil.clearIDs(modelHandler.getResource(), instances==0);
- getPreferences().getGlobalPreferences().removePropertyChangeListener(this);
-
- getResourceSet().eAdapters().remove(getEditorAdapter());
- removeSelectionListener();
- if (instances==0)
- setActiveEditor(null);
-
- super.dispose();
- ModelHandlerLocator.remove(modelUri);
- // get rid of temp files and folders, but NOT if the workbench is being shut down.
- // when the workbench is restarted, we need to have those temp files around!
- if (!workbenchShutdown) {
- if (FileService.isTempFile(modelUri)) {
- FileService.deleteTempFile(modelUri);
- }
- }
-
- removeWorkbenchListener();
- removeMarkerChangeListener();
- getPreferences().dispose();
- }
-
- public IPath getModelPath() {
- if (getModelFile()!=null)
- return getModelFile().getFullPath();
- return null;
- }
-
- public IProject getProject() {
- if (getModelFile()!=null)
- return getModelFile().getProject();
- return null;
- }
-
- public IFile getModelFile() {
- if (modelUri!=null) {
- String uriString = modelUri.trimFragment().toPlatformString(true);
- if (uriString!=null) {
- IPath fullPath = new Path(uriString);
- return ResourcesPlugin.getWorkspace().getRoot().getFile(fullPath);
- }
- }
- return null;
- }
-
- public ModelHandler getModelHandler() {
- return modelHandler;
- }
-
- public void createPartControl(Composite parent) {
- if (getGraphicalViewer()==null) {
- super.createPartControl(parent);
- }
- }
-
- public BPMNDiagram getBpmnDiagram() {
- if (bpmnDiagram==null)
- bpmnDiagram = getModelHandler().getDefinitions().getDiagrams().get(0);
-
-// if (bpmnDiagram!=null) {
-// GraphicalViewer viewer = getGraphicalViewer();
-// mapDiagramToViewer.put(bpmnDiagram, viewer);
-// }
- return bpmnDiagram;
- }
-
- public void setBpmnDiagram(final BPMNDiagram bpmnDiagram) {
- // create a new Graphiti Diagram if needed
- Diagram diagram = DIUtils.getOrCreateDiagram(this, bpmnDiagram);
-
- // Tell the DTP about the new Diagram
- getDiagramTypeProvider().resourceReloaded(diagram);
- getRefreshBehavior().initRefresh();
- setPictogramElementsForSelection(null);
- // set Diagram as contents for the graphical viewer and refresh
- getGraphicalViewer().setContents(diagram);
-
- refreshContent();
-
- // remember this for later
- this.bpmnDiagram = bpmnDiagram;
- }
-
- @Override
- public void doSave(IProgressMonitor monitor) {
- super.doSave(monitor);
-
- Resource resource = getResourceSet().getResource(modelUri, false);
- BPMN2ProjectValidator.validateOnSave(resource, monitor);
- }
-
- @Override
- public boolean isSaveAsAllowed() {
- return getModelFile()!=null;
- }
-
- @Override
- public void doSaveAs() {
- IFile oldFile = getModelFile();
- SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
- saveAsDialog.setOriginalFile(oldFile);
- saveAsDialog.create();
- if (saveAsDialog.open() == SaveAsDialog.CANCEL) {
- return;
- }
- IPath newFilePath = saveAsDialog.getResult();
- if (newFilePath == null){
- return;
- }
-
- IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
- IWorkbenchPage page = getSite().getPage();
-
- try {
- // Save the current(old) file
- doSave(null);
- // if new file exists, close its editor (if open) and delete the existing file
- if (newFile.exists()) {
- IEditorPart editorPart = ResourceUtil.findEditor(page, newFile);
- if (editorPart!=null)
- page.closeEditor(editorPart, false);
- newFile.delete(true, null);
- }
- // make a copy
- oldFile.copy(newFilePath, true, null);
- } catch (CoreException e) {
- showErrorDialogWithLogging(e);
- return;
- }
-
- // open new editor
- try {
- page.openEditor(new FileEditorInput(newFile), BPMN2Editor.EDITOR_ID);
- } catch (PartInitException e1) {
- showErrorDialogWithLogging(e1);
- return;
- }
-
- // and close the old editor
- IEditorPart editorPart = ResourceUtil.findEditor(page, oldFile);
- if (editorPart!=null)
- page.closeEditor(editorPart, false);
-
- try {
- newFile.refreshLocal(IResource.DEPTH_ZERO,null);
- } catch (CoreException e) {
- showErrorDialogWithLogging(e);
- return;
- }
- }
-
- public void closeEditor() {
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);
- if (!closed){
- // If close editor fails, try again with explicit editorpart
- // of the old file
- IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());
- IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);
- closed = getSite().getPage().closeEditor(editorPart, false);
- }
- }
- });
- }
-
- // Show error dialog and log the error
- private void showErrorDialogWithLogging(Exception e) {
- Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
- ErrorUtils.showErrorWithLogging(status);
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // WorkspaceSynchronizer handlers called from delegate
- ////////////////////////////////////////////////////////////////////////////////
-
- public boolean handleResourceChanged(Resource resource) {
- return true;
- }
-
- public boolean handleResourceDeleted(Resource resource) {
- closeEditor();
- return true;
- }
-
- public boolean handleResourceMoved(Resource resource, URI newURI) {
- URI oldURI = resource.getURI();
- resource.setURI(newURI);
-
- if (modelUri.equals(oldURI)) {
- ModelHandlerLocator.remove(modelUri);
- modelUri = newURI;
- if (preferences!=null) {
- preferences.getGlobalPreferences().removePropertyChangeListener(this);
- preferences.dispose();
- preferences = null;
- }
- targetRuntime = null;
- modelHandler = ModelHandlerLocator.createModelHandler(modelUri, (Bpmn2ResourceImpl)resource);
- ModelHandlerLocator.put(diagramUri, modelHandler);
- }
- else if (diagramUri.equals(oldURI)) {
- ModelHandlerLocator.remove(diagramUri);
- diagramUri = newURI;
- ModelHandlerLocator.put(diagramUri, modelHandler);
- }
-
- return true;
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // Other handlers
- ////////////////////////////////////////////////////////////////////////////////
-
- @Override
- public void selectionChanged(IWorkbenchPart part, ISelection selection) {
- // Graphiti understands multipage editors
- super.selectionChanged(part,selection); // Graphiti's DiagramEditorInternal
- // but apparently GEF doesn't
- updateActions(getSelectionActions()); // usually done in GEF's GraphicalEditor
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
- */
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- if (event.getProperty().endsWith(Bpmn2Preferences.PREF_SHAPE_STYLE)) {
- getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
- @Override
- protected void doExecute() {
- IPeService peService = Graphiti.getPeService();
- TreeIterator<EObject> iter = getDiagramTypeProvider().getDiagram().eAllContents();
- while (iter.hasNext()) {
- EObject o = iter.next();
- if (o instanceof PictogramElement) {
- PictogramElement pe = (PictogramElement)o;
- BaseElement be = BusinessObjectUtil.getFirstElementOfType(pe, BaseElement.class);
- if (be!=null) {
- TreeIterator<EObject> childIter = pe.eAllContents();
- while (childIter.hasNext()) {
- o = childIter.next();
- if (o instanceof GraphicsAlgorithm) {
- GraphicsAlgorithm ga = (GraphicsAlgorithm)o;
- if (peService.getPropertyValue(ga, Bpmn2Preferences.PREF_SHAPE_STYLE)!=null) {
- StyleUtil.applyStyle(ga, be);
- }
- }
-
- }
- }
- }
- }
- }
- });
- }
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ * All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.editor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.Assignment;
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.BoundaryEvent;
+import org.eclipse.bpmn2.CallActivity;
+import org.eclipse.bpmn2.CallChoreography;
+import org.eclipse.bpmn2.CatchEvent;
+import org.eclipse.bpmn2.Category;
+import org.eclipse.bpmn2.CompensateEventDefinition;
+import org.eclipse.bpmn2.ConditionalEventDefinition;
+import org.eclipse.bpmn2.DataInput;
+import org.eclipse.bpmn2.DataObject;
+import org.eclipse.bpmn2.DataObjectReference;
+import org.eclipse.bpmn2.DataOutput;
+import org.eclipse.bpmn2.DataStore;
+import org.eclipse.bpmn2.DataStoreReference;
+import org.eclipse.bpmn2.EndEvent;
+import org.eclipse.bpmn2.ErrorEventDefinition;
+import org.eclipse.bpmn2.EscalationEventDefinition;
+import org.eclipse.bpmn2.Event;
+import org.eclipse.bpmn2.Expression;
+import org.eclipse.bpmn2.FormalExpression;
+import org.eclipse.bpmn2.Gateway;
+import org.eclipse.bpmn2.GlobalBusinessRuleTask;
+import org.eclipse.bpmn2.GlobalManualTask;
+import org.eclipse.bpmn2.GlobalScriptTask;
+import org.eclipse.bpmn2.GlobalTask;
+import org.eclipse.bpmn2.GlobalUserTask;
+import org.eclipse.bpmn2.HumanPerformer;
+import org.eclipse.bpmn2.Import;
+import org.eclipse.bpmn2.InputOutputSpecification;
+import org.eclipse.bpmn2.Interface;
+import org.eclipse.bpmn2.ItemDefinition;
+import org.eclipse.bpmn2.LinkEventDefinition;
+import org.eclipse.bpmn2.ManualTask;
+import org.eclipse.bpmn2.Message;
+import org.eclipse.bpmn2.MessageEventDefinition;
+import org.eclipse.bpmn2.MessageFlow;
+import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
+import org.eclipse.bpmn2.Performer;
+import org.eclipse.bpmn2.PotentialOwner;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.Property;
+import org.eclipse.bpmn2.ResourceAssignmentExpression;
+import org.eclipse.bpmn2.ResourceParameterBinding;
+import org.eclipse.bpmn2.ResourceRole;
+import org.eclipse.bpmn2.ScriptTask;
+import org.eclipse.bpmn2.SequenceFlow;
+import org.eclipse.bpmn2.SignalEventDefinition;
+import org.eclipse.bpmn2.StandardLoopCharacteristics;
+import org.eclipse.bpmn2.StartEvent;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.Task;
+import org.eclipse.bpmn2.TextAnnotation;
+import org.eclipse.bpmn2.ThrowEvent;
+import org.eclipse.bpmn2.TimerEventDefinition;
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.Bpmn2TabbedPropertySheetPage;
+import org.eclipse.bpmn2.modeler.core.ModelHandler;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.ProxyURIConverterImplExtension;
+import org.eclipse.bpmn2.modeler.core.di.DIImport;
+import org.eclipse.bpmn2.modeler.core.di.DIUtils;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDialogComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceImpl;
+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
+import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.DiagramEditorAdapter;
+import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
+import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
+import org.eclipse.bpmn2.modeler.ui.Activator;
+import org.eclipse.bpmn2.modeler.ui.IFileChangeListener;
+import org.eclipse.bpmn2.modeler.ui.property.artifact.CategoryDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.artifact.TextAnnotationDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.connectors.MessageFlowDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.connectors.SequenceFlowDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ConditionalEventDefinitionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataAssignmentDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectPropertySection.DataObjectDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectReferencePropertySection.DataObjectReferenceDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataStorePropertySection.DataStoreDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataStoreReferencePropertySection.DataStoreReferenceDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ExpressionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.InterfaceDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ItemAwareElementDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.MessageDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.MessageListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceAssignmentExpressionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceParameterBindingDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceRoleDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertyComposite.ImportDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ProcessDiagramPropertyComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.PropertyListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ResourceRoleListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.BoundaryEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.CatchEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventPropertySection.EventDefinitionDialogComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.EndEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.StartEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.ThrowEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.TimerEventDefinitionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.gateways.GatewayDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityInputDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityOutputDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.DataAssociationDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.IoParametersDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ManualTaskDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.MultiInstanceLoopCharacteristicsDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ScriptTaskDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.StandardLoopCharacteristicsDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.views.outline.BPMN2EditorOutlinePage;
+import org.eclipse.bpmn2.modeler.ui.wizards.BPMN2DiagramCreator;
+import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
+import org.eclipse.bpmn2.modeler.ui.wizards.FileService;
+import org.eclipse.bpmn2.util.Bpmn2ResourceImpl;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain.Lifecycle;
+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
+import org.eclipse.gef.ui.parts.SelectionSynchronizer;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IPeService;
+import org.eclipse.graphiti.ui.editor.DiagramEditor;
+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
+import org.eclipse.graphiti.ui.internal.editor.GFPaletteRoot;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.ide.ResourceUtil;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
+
+/**
+ *
+ */
+@SuppressWarnings("restriction")
+public class BPMN2Editor extends DiagramEditor implements IPropertyChangeListener, IGotoMarker {
+
+ static {
+ TargetRuntime.getAllRuntimes();
+ PropertiesCompositeFactory.register(EObject.class, DefaultDetailComposite.class);
+ PropertiesCompositeFactory.register(EObject.class, DefaultListComposite.class);
+ PropertiesCompositeFactory.register(EObject.class, DefaultDialogComposite.class);
+ PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);
+ PropertiesCompositeFactory.register(Message.class, MessageListComposite.class);
+ PropertiesCompositeFactory.register(MessageFlow.class, MessageFlowDetailComposite.class);
+ PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);
+ PropertiesCompositeFactory.register(CallActivity.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(GlobalTask.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(GlobalBusinessRuleTask.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(GlobalManualTask.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(GlobalScriptTask.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(GlobalUserTask.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(Import.class, ImportDetailComposite.class);
+ PropertiesCompositeFactory.register(Category.class, CategoryDetailComposite.class);
+ PropertiesCompositeFactory.register(TextAnnotation.class, TextAnnotationDetailComposite.class);
+ PropertiesCompositeFactory.register(SequenceFlow.class, SequenceFlowDetailComposite.class);
+ PropertiesCompositeFactory.register(DataObject.class, DataObjectDetailComposite.class);
+ PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectDetailComposite.class);
+ PropertiesCompositeFactory.register(Assignment.class, DataAssignmentDetailComposite.class);
+ PropertiesCompositeFactory.register(Expression.class, ExpressionDetailComposite.class);
+ PropertiesCompositeFactory.register(FormalExpression.class, ExpressionDetailComposite.class);
+ PropertiesCompositeFactory.register(ResourceAssignmentExpression.class, ResourceAssignmentExpressionDetailComposite.class);
+ PropertiesCompositeFactory.register(ResourceParameterBinding.class, ResourceParameterBindingDetailComposite.class);
+ PropertiesCompositeFactory.register(PotentialOwner.class, ResourceRoleDetailComposite.class);
+ PropertiesCompositeFactory.register(HumanPerformer.class, ResourceRoleDetailComposite.class);
+ PropertiesCompositeFactory.register(Performer.class, ResourceRoleDetailComposite.class);
+ PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectReferenceDetailComposite.class);
+ PropertiesCompositeFactory.register(DataStore.class, DataStoreDetailComposite.class);
+ PropertiesCompositeFactory.register(DataStoreReference.class, DataStoreReferenceDetailComposite.class);
+ PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);
+ PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionDetailComposite.class);
+ PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionListComposite.class);
+ PropertiesCompositeFactory.register(Property.class, PropertyListComposite.class);
+ PropertiesCompositeFactory.register(ResourceRole.class, ResourceRoleListComposite.class);
+ PropertiesCompositeFactory.register(Event.class, CommonEventDetailComposite.class);
+ PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
+ PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
+ PropertiesCompositeFactory.register(CatchEvent.class, CatchEventDetailComposite.class);
+ PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
+ PropertiesCompositeFactory.register(BoundaryEvent.class, BoundaryEventDetailComposite.class);
+ PropertiesCompositeFactory.register(TimerEventDefinition.class, TimerEventDefinitionDetailComposite.class);
+ PropertiesCompositeFactory.register(ConditionalEventDefinition.class, ConditionalEventDefinitionDetailComposite.class);
+ PropertiesCompositeFactory.register(CompensateEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(ConditionalEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(ErrorEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(EscalationEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(LinkEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(MessageEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(SignalEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(TimerEventDefinition.class, EventDefinitionDialogComposite.class);
+ PropertiesCompositeFactory.register(Process.class, ProcessDiagramPropertyComposite.class);
+ PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
+ PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
+ PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
+ PropertiesCompositeFactory.register(StandardLoopCharacteristics.class, StandardLoopCharacteristicsDetailComposite.class);
+ PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, MultiInstanceLoopCharacteristicsDetailComposite.class);
+ PropertiesCompositeFactory.register(Gateway.class, GatewayDetailComposite.class);
+ PropertiesCompositeFactory.register(Activity.class, ActivityInputDetailComposite.class);
+ PropertiesCompositeFactory.register(InputOutputSpecification.class, ActivityInputDetailComposite.class);
+ PropertiesCompositeFactory.register(Activity.class, ActivityOutputDetailComposite.class);
+ PropertiesCompositeFactory.register(CallChoreography.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(InputOutputSpecification.class, IoParametersDetailComposite.class);
+ PropertiesCompositeFactory.register(DataInput.class, DataAssociationDetailComposite.class);
+ PropertiesCompositeFactory.register(DataOutput.class, DataAssociationDetailComposite.class);
+ PropertiesCompositeFactory.register(ManualTask.class, ManualTaskDetailComposite.class);
+ PropertiesCompositeFactory.register(ScriptTask.class, ScriptTaskDetailComposite.class);
+ PropertiesCompositeFactory.register(SubProcess.class, ActivityDetailComposite.class);
+ PropertiesCompositeFactory.register(Task.class, TaskDetailComposite.class);
+ }
+
+ public static final String EDITOR_ID = "org.eclipse.bpmn2.modeler.ui.bpmn2editor";
+ public static final String CONTRIBUTOR_ID = "org.eclipse.bpmn2.modeler.ui.PropertyContributor";
+
+ private ModelHandler modelHandler;
+ private URI modelUri;
+ private URI diagramUri;
+ private boolean editable = true;
+
+ protected BPMNDiagram bpmnDiagram;
+ protected Bpmn2ResourceImpl bpmnResource;
+
+ private IFileChangeListener fileChangeListener;
+ private IWorkbenchListener workbenchListener;
+ private IPartListener2 selectionListener;
+ private IResourceChangeListener markerChangeListener;
+ private boolean workbenchShutdown = false;
+ private static BPMN2Editor activeEditor;
+ private static ITabDescriptorProvider tabDescriptorProvider;
+
+ private BPMN2EditingDomainListener editingDomainListener;
+
+ private Bpmn2Preferences preferences;
+ private TargetRuntime targetRuntime;
+// private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();
+
+ protected DiagramEditorAdapter editorAdapter;
+ protected BPMN2MultiPageEditor multipageEditor;
+
+ public BPMN2Editor(BPMN2MultiPageEditor mpe) {
+ multipageEditor = mpe;
+ }
+
+ public static BPMN2Editor getActiveEditor() {
+ return activeEditor;
+ }
+
+ private void setActiveEditor(BPMN2Editor editor) {
+ activeEditor = editor;
+ if (activeEditor!=null) {
+ Bpmn2Preferences.setActiveProject(activeEditor.getProject());
+ TargetRuntime.setCurrentRuntime( activeEditor.getTargetRuntime() );
+ }
+ }
+
+ public BPMN2MultiPageEditor getMultipageEditor() {
+ return multipageEditor;
+ }
+
+ protected DiagramEditorAdapter getEditorAdapter() {
+ return editorAdapter;
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ try {
+ Bpmn2DiagramType diagramType = Bpmn2DiagramType.NONE;
+ String targetNamespace = null;
+ bpmnDiagram = null;
+
+ if (input instanceof IStorageEditorInput) {
+ input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
+ }
+ else if (input instanceof DiagramEditorInput) {
+ if (input instanceof Bpmn2DiagramEditorInput) {
+ diagramType = ((Bpmn2DiagramEditorInput)input).getInitialDiagramType();
+ targetNamespace = ((Bpmn2DiagramEditorInput)input).getTargetNamespace();
+ bpmnDiagram = ((Bpmn2DiagramEditorInput)input).getBpmnDiagram();
+ }
+ if (bpmnDiagram==null) {
+ // This was incorrectly constructed input, we ditch the old one and make a new and clean one instead
+ // This code path comes in from the New File Wizard
+ input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
+ }
+ else {
+ BPMNDiagram d = bpmnDiagram;
+ bpmnDiagram = null;
+ setBpmnDiagram(d);
+ return;
+ }
+ }
+ else {
+ throw new PartInitException("Invalid Editor Input: "
+ +input.getClass().getSimpleName()+" "
+ +input.getName());
+ }
+ } catch (Exception e) {
+ Activator.showErrorWithLogging(e);
+ throw new PartInitException(e.getMessage());
+ }
+
+ // add a listener so we get notified if the workbench is shutting down.
+ // in this case we don't want to delete the temp file!
+ addWorkbenchListener();
+ getTargetRuntime(input);
+ setActiveEditor(this);
+
+ super.init(site, input);
+
+ addSelectionListener();
+ addFileChangeListener();
+ addMarkerChangeListener();
+ }
+
+ public void setEditable(boolean editable) {
+ this.editable = editable;
+ }
+
+ public boolean isEditable() {
+ return editable;
+ }
+
+ @Override
+ public boolean isDirty() {
+ if (!editable)
+ return false;
+ return super.isDirty();
+ }
+
+ public Bpmn2Preferences getPreferences() {
+ if (preferences==null) {
+ loadPreferences(getProject());
+ }
+ return preferences;
+ }
+
+ private void loadPreferences(IProject project) {
+ preferences = Bpmn2Preferences.getInstance(project);
+ preferences.load();
+ preferences.getGlobalPreferences().addPropertyChangeListener(this);
+ }
+
+ /**
+ * ID for tabbed property sheets.
+ *
+ * @return the contributor id
+ */
+ @Override
+ public String getContributorId() {
+ return CONTRIBUTOR_ID;
+ }
+
+ public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {
+ tabDescriptorProvider = tdp;
+ return getTargetRuntime();
+ }
+
+ public TargetRuntime getTargetRuntime() {
+ if (targetRuntime==null) {
+ targetRuntime = getTargetRuntime(getEditorInput());
+ }
+ return targetRuntime;
+ }
+
+ protected TargetRuntime getTargetRuntime(IEditorInput input) {
+ if (targetRuntime==null) {
+ // If the project has not been configured for a specific runtime through the "BPMN2"
+ // project properties page (i.e. the target is "None") then allow the runtime extension
+ // plug-ins an opportunity to identify the given process file contents as their own.
+ // If none of the plug-ins respond with "yes, this file is targeted for my runtime",
+ // then use the "None" as the extension. This will configure the BPMN2 Modeler with
+ // generic property sheets and other default behavior.
+ targetRuntime = getPreferences().getRuntime();
+ if (targetRuntime == TargetRuntime.getDefaultRuntime()) {
+ for (TargetRuntime rt : TargetRuntime.getAllRuntimes()) {
+ if (rt.getRuntimeExtension().isContentForRuntime(input)) {
+ targetRuntime = rt;
+ break;
+ }
+ }
+ }
+ if (targetRuntime==null)
+ targetRuntime = TargetRuntime.getDefaultRuntime();
+ }
+ return targetRuntime;
+ }
+
+ /**
+ * Beware, creates a new input and changes this editor!
+ */
+ private Bpmn2DiagramEditorInput createNewDiagramEditorInput(IEditorSite site, IEditorInput input, Bpmn2DiagramType diagramType, String targetNamespace)
+ throws CoreException {
+
+ modelUri = FileService.getInputUri(input);
+ input = BPMN2DiagramCreator.createDiagram(modelUri, diagramType,targetNamespace,this);
+ diagramUri = ((Bpmn2DiagramEditorInput)input).getUri();
+
+ return (Bpmn2DiagramEditorInput)input;
+ }
+
+ private void saveModelFile() {
+ modelHandler.save();
+ ((BasicCommandStack) getEditingDomain().getCommandStack()).saveIsDone();
+ firePropertyChange(IEditorPart.PROP_DIRTY);
+ }
+
+ @Override
+ protected void setInput(IEditorInput input) {
+ super.setInput(input);
+
+ // Hook a transaction exception handler so we can get diagnostics about EMF validation errors.
+ getEditingDomainListener();
+
+ BasicCommandStack basicCommandStack = (BasicCommandStack) getEditingDomain().getCommandStack();
+
+ if (input instanceof DiagramEditorInput) {
+ ResourceSet resourceSet = getEditingDomain().getResourceSet();
+ getTargetRuntime().setResourceSet(resourceSet);
+
+ bpmnResource = (Bpmn2ResourceImpl) resourceSet.createResource(modelUri,
+ Bpmn2ModelerResourceImpl.BPMN2_CONTENT_TYPE_ID);
+
+ resourceSet.setURIConverter(new ProxyURIConverterImplExtension());
+ resourceSet.eAdapters().add(editorAdapter = new DiagramEditorAdapter(this));
+
+ modelHandler = ModelHandlerLocator.createModelHandler(modelUri, bpmnResource);
+ ModelHandlerLocator.put(diagramUri, modelHandler);
+
+ getTargetRuntime(input);
+ setActiveEditor(this);
+
+ // allow the runtime extension to construct custom tasks and whatever else it needs
+ // custom tasks should be added to the current target runtime's custom tasks list
+ // where they will be picked up by the toolpalette refresh.
+ getTargetRuntime().getRuntimeExtension().initialize(this);
+
+ try {
+ if (getModelFile()==null || getModelFile().exists()) {
+ bpmnResource.load(null);
+ } else {
+ saveModelFile();
+ }
+ } catch (IOException e) {
+ Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
+ ErrorUtils.showErrorWithLogging(status);
+ }
+ basicCommandStack.execute(new RecordingCommand(getEditingDomain()) {
+
+ @Override
+ protected void doExecute() {
+ importDiagram();
+ }
+ });
+ }
+ basicCommandStack.saveIsDone();
+ basicCommandStack.flush();
+ loadMarkers();
+ }
+
+ private void importDiagram() {
+ // make sure this guy is active, otherwise it's not selectable
+ Diagram diagram = getDiagramTypeProvider().getDiagram();
+ IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider();
+ diagram.setActive(true);
+ Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput) getEditorInput();
+ Bpmn2DiagramType diagramType = input.getInitialDiagramType();
+ String targetNamespace = input.getTargetNamespace();
+
+ if (diagramType != Bpmn2DiagramType.NONE) {
+ bpmnDiagram = modelHandler.createDiagramType(diagramType, targetNamespace);
+ featureProvider.link(diagram, bpmnDiagram);
+ saveModelFile();
+ }
+
+ DIImport di = new DIImport(this);
+ di.setModelHandler(modelHandler);
+
+ di.generateFromDI();
+ }
+
+ protected void updatePalette() {
+ GFPaletteRoot pr = (GFPaletteRoot)getPaletteRoot();
+ if (pr!=null)
+ pr.updatePaletteEntries();
+ }
+
+ @Override
+ protected PictogramElement[] getPictogramElementsForSelection() {
+ // filter out invisible elements when setting selection
+ PictogramElement[] pictogramElements = super.getPictogramElementsForSelection();
+ if (pictogramElements==null)
+ return null;
+ ArrayList<PictogramElement> visibleList = new ArrayList<PictogramElement>();
+ for (PictogramElement pe : pictogramElements) {
+ if (pe.isVisible())
+ visibleList.add(pe);
+ }
+ return visibleList.toArray(new PictogramElement[visibleList.size()]);
+ }
+
+ private void addWorkbenchListener() {
+ if (workbenchListener==null) {
+ workbenchListener = new IWorkbenchListener() {
+ @Override
+ public boolean preShutdown(IWorkbench workbench, boolean forced) {
+ workbenchShutdown = true;
+ return true;
+ }
+
+ @Override
+ public void postShutdown(IWorkbench workbench) {
+ }
+
+ };
+ PlatformUI.getWorkbench().addWorkbenchListener(workbenchListener);
+ }
+ }
+
+ @Override
+ public void gotoMarker(IMarker marker) {
+ final EObject target = getTargetObject(marker);
+ if (target == null) {
+ return;
+ }
+ final PictogramElement pe = getDiagramTypeProvider().getFeatureProvider().getPictogramElementForBusinessObject(
+ target);
+ if (pe == null) {
+ return;
+ }
+ selectPictogramElements(new PictogramElement[] {pe });
+ }
+
+ private void loadMarkers() {
+ if (getModelFile()!=null) {
+ // read in the markers
+ BPMN2ValidationStatusLoader vsl = new BPMN2ValidationStatusLoader(this);
+
+ try {
+ vsl.load(Arrays.asList(getModelFile().findMarkers(
+ BPMN2ProjectValidator.BPMN2_MARKER_ID, true, IResource.DEPTH_ZERO)));
+ } catch (CoreException e) {
+ Activator.logStatus(e.getStatus());
+ }
+ }
+ }
+
+ private EObject getTargetObject(IMarker marker) {
+ final String uriString = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
+ final URI uri = uriString == null ? null : URI.createURI(uriString);
+ if (uri == null) {
+ return null;
+ }
+ return getEditingDomain().getResourceSet().getEObject(uri, false);
+ }
+
+ private void removeWorkbenchListener()
+ {
+ if (workbenchListener!=null) {
+ PlatformUI.getWorkbench().removeWorkbenchListener(workbenchListener);
+ workbenchListener = null;
+ }
+ }
+
+ private void addSelectionListener() {
+ if (selectionListener == null) {
+ IWorkbenchPage page = getSite().getPage();
+ selectionListener = new IPartListener2() {
+ public void partActivated(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (part instanceof BPMN2MultiPageEditor) {
+ BPMN2MultiPageEditor mpe = (BPMN2MultiPageEditor)part;
+ setActiveEditor(mpe.getDesignEditor());
+ }
+ }
+
+ @Override
+ public void partClosed(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partDeactivated(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partOpened(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partHidden(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partVisible(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partInputChanged(IWorkbenchPartReference partRef) {
+ }
+ };
+ page.addPartListener(selectionListener);
+ }
+ }
+
+ private void removeSelectionListener()
+ {
+ if (selectionListener!=null) {
+ getSite().getPage().removePartListener(selectionListener);
+ selectionListener = null;
+ }
+ }
+
+ private void addMarkerChangeListener() {
+ if (getModelFile()!=null) {
+ if (markerChangeListener==null) {
+ markerChangeListener = new BPMN2MarkerChangeListener(this);
+ getModelFile().getWorkspace().addResourceChangeListener(markerChangeListener, IResourceChangeEvent.POST_BUILD);
+ }
+ }
+ }
+
+ private void removeMarkerChangeListener() {
+ if (markerChangeListener!=null) {
+ getModelFile().getWorkspace().removeResourceChangeListener(markerChangeListener);
+ markerChangeListener = null;
+ }
+ }
+
+ public void refreshTitle() {
+ String name = getEditorInput().getName();
+ setPartName(URI.decode(name));
+ }
+
+ private void addFileChangeListener() {
+ if (fileChangeListener==null) {
+ fileChangeListener = new IFileChangeListener() {
+ public void deleted(IPath filePath) {
+ // close the editor if either the dummy diagramfile (in the .bpmn2 folder)
+ // or the model file is deleted
+ if (filePath.equals(getModelPath())) {
+ // Close the editor.
+ closeEditor();
+ }
+ }
+ public void moved(IPath oldFilePath, IPath newFilePath) {
+ // handle file move/rename after the fact (i.e. newFile now exists, old file does not)
+ if (oldFilePath.equals(getModelPath())) {
+ reopenEditor(newFilePath);
+ }
+ }
+ };
+ Activator.getDefault().getResourceChangeListener().addListener(fileChangeListener);
+ }
+ }
+
+ private void removeFileChangeListener() {
+ if (fileChangeListener!=null) {
+ Activator.getDefault().getResourceChangeListener().removeListener(fileChangeListener);
+ fileChangeListener = null;
+ }
+ }
+
+ public BPMN2EditingDomainListener getEditingDomainListener() {
+ if (editingDomainListener==null) {
+ TransactionalEditingDomainImpl editingDomain = (TransactionalEditingDomainImpl)getEditingDomain();
+ if (editingDomain==null) {
+ return null;
+ }
+ editingDomainListener = new BPMN2EditingDomainListener(this);
+
+ Lifecycle domainLifeCycle = (Lifecycle) editingDomain.getAdapter(Lifecycle.class);
+ domainLifeCycle.addTransactionalEditingDomainListener(editingDomainListener);
+ }
+ return editingDomainListener;
+ }
+
+ public BasicDiagnostic getDiagnostics() {
+ return getEditingDomainListener().getDiagnostics();
+ }
+
+ @Override
+ public Object getAdapter(Class required) {
+ if (required==ITabDescriptorProvider.class) {
+ if (tabDescriptorProvider==null) {
+ IWorkbenchPage page = getEditorSite().getPage();
+ String viewID = "org.eclipse.ui.views.PropertySheet";
+ try {
+ page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
+ page.showView(viewID, null, IWorkbenchPage.VIEW_ACTIVATE);
+ }
+ catch (Exception e) {}
+ }
+ return tabDescriptorProvider;
+ }
+ if (required==TargetRuntime.class)
+ return getTargetRuntime();
+ if (required==Bpmn2Preferences.class)
+ return getPreferences();
+ if (required == IPropertySheetPage.class) {
+ return new Bpmn2TabbedPropertySheetPage(this);
+ }
+ if (required == SelectionSynchronizer.class) {
+ return getSelectionSynchronizer();
+ }
+ if (required == IContentOutlinePage.class) {
+ if (getDiagramTypeProvider() != null) {
+ BPMN2EditorOutlinePage outlinePage = new BPMN2EditorOutlinePage(this);
+ return outlinePage;
+ }
+ }
+
+ return super.getAdapter(required);
+ }
+
+ @Override
+ public void dispose() {
+ // clear ID mapping tables if no more instances of editor are active
+ int instances = 0;
+ IWorkbenchPage[] pages = getEditorSite().getWorkbenchWindow().getPages();
+ for (IWorkbenchPage p : pages) {
+ IEditorReference[] refs = p.getEditorReferences();
+ instances += refs.length;
+ }
+ File diagramFile = new File(diagramUri.toFileString());
+ if (diagramFile.exists()) {
+ try {
+ diagramFile.delete();
+ }
+ catch (Exception e) {
+ }
+ }
+ ModelUtil.clearIDs(modelHandler.getResource(), instances==0);
+ getPreferences().getGlobalPreferences().removePropertyChangeListener(this);
+
+ getResourceSet().eAdapters().remove(getEditorAdapter());
+ removeSelectionListener();
+ removeFileChangeListener();
+ if (instances==0)
+ setActiveEditor(null);
+
+ super.dispose();
+ ModelHandlerLocator.remove(modelUri);
+ // get rid of temp files and folders, but NOT if the workbench is being shut down.
+ // when the workbench is restarted, we need to have those temp files around!
+ if (!workbenchShutdown) {
+ if (FileService.isTempFile(modelUri)) {
+ FileService.deleteTempFile(modelUri);
+ }
+ }
+
+ removeWorkbenchListener();
+ removeMarkerChangeListener();
+ getPreferences().dispose();
+ }
+
+ public IPath getModelPath() {
+ if (getModelFile()!=null)
+ return getModelFile().getFullPath();
+ return null;
+ }
+
+ public IProject getProject() {
+ if (getModelFile()!=null)
+ return getModelFile().getProject();
+ return null;
+ }
+
+ public IFile getModelFile() {
+ if (modelUri!=null) {
+ String uriString = modelUri.trimFragment().toPlatformString(true);
+ if (uriString!=null) {
+ IPath fullPath = new Path(uriString);
+ return ResourcesPlugin.getWorkspace().getRoot().getFile(fullPath);
+ }
+ }
+ return null;
+ }
+
+ public ModelHandler getModelHandler() {
+ return modelHandler;
+ }
+
+ public void createPartControl(Composite parent) {
+ if (getGraphicalViewer()==null) {
+ super.createPartControl(parent);
+ }
+ }
+
+ public BPMNDiagram getBpmnDiagram() {
+ if (bpmnDiagram==null)
+ bpmnDiagram = getModelHandler().getDefinitions().getDiagrams().get(0);
+
+// if (bpmnDiagram!=null) {
+// GraphicalViewer viewer = getGraphicalViewer();
+// mapDiagramToViewer.put(bpmnDiagram, viewer);
+// }
+ return bpmnDiagram;
+ }
+
+ public void setBpmnDiagram(final BPMNDiagram bpmnDiagram) {
+ // create a new Graphiti Diagram if needed
+ Diagram diagram = DIUtils.getOrCreateDiagram(this, bpmnDiagram);
+
+ // Tell the DTP about the new Diagram
+ getDiagramTypeProvider().resourceReloaded(diagram);
+// getRefreshBehavior().initRefresh();
+ setPictogramElementsForSelection(null);
+ // set Diagram as contents for the graphical viewer and refresh
+ getGraphicalViewer().setContents(diagram);
+
+ refreshContent();
+
+ // remember this for later
+ this.bpmnDiagram = bpmnDiagram;
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ super.doSave(monitor);
+
+ Resource resource = getResourceSet().getResource(modelUri, false);
+ BPMN2ProjectValidator.validateOnSave(resource, monitor);
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return getModelFile()!=null;
+ }
+
+ @Override
+ public void doSaveAs() {
+ IFile oldFile = getModelFile();
+ SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
+ saveAsDialog.setOriginalFile(oldFile);
+ saveAsDialog.create();
+ if (saveAsDialog.open() == SaveAsDialog.CANCEL) {
+ return;
+ }
+ IPath newFilePath = saveAsDialog.getResult();
+ if (newFilePath == null){
+ return;
+ }
+
+ IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
+ IWorkbenchPage page = getSite().getPage();
+
+ try {
+ // Save the current(old) file
+ doSave(null);
+ // if new file exists, close its editor (if open) and delete the existing file
+ if (newFile.exists()) {
+ IEditorPart editorPart = ResourceUtil.findEditor(page, newFile);
+ if (editorPart!=null)
+ page.closeEditor(editorPart, false);
+ newFile.delete(true, null);
+ }
+ // make a copy
+ oldFile.copy(newFilePath, true, null);
+ } catch (CoreException e) {
+ showErrorDialogWithLogging(e);
+ return;
+ }
+
+ // open new editor
+ try {
+ page.openEditor(new FileEditorInput(newFile), BPMN2Editor.EDITOR_ID);
+ } catch (PartInitException e1) {
+ showErrorDialogWithLogging(e1);
+ return;
+ }
+
+ // and close the old editor
+ IEditorPart editorPart = ResourceUtil.findEditor(page, oldFile);
+ if (editorPart!=null)
+ page.closeEditor(editorPart, false);
+
+ try {
+ newFile.refreshLocal(IResource.DEPTH_ZERO,null);
+ } catch (CoreException e) {
+ showErrorDialogWithLogging(e);
+ return;
+ }
+ }
+
+ public void closeEditor() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);
+ if (!closed){
+ // If close editor fails, try again with explicit editorpart
+ // of the old file
+ IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());
+ IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);
+ closed = getSite().getPage().closeEditor(editorPart, false);
+ }
+ }
+ });
+ }
+
+ protected void reopenEditor(final IPath newFilePath) {
+ Display display = getSite().getShell().getDisplay();
+ display.syncExec(new Runnable() {
+ public void run() {
+ boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);
+ if (!closed){
+ // If close editor fails, try again with explicit editorpart
+ // of the old file
+ IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());
+ IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);
+ closed = getSite().getPage().closeEditor(editorPart, false);
+ }
+ if (closed) {
+ IFile renamedFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
+ try {
+ getSite().getPage().openEditor(new FileEditorInput(renamedFile), EDITOR_ID);
+ } catch (PartInitException e) {
+ Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
+ ErrorUtils.showErrorWithLogging(status);
+ }
+ }
+ }
+ });
+ }
+
+ // Show error dialog and log the error
+ private void showErrorDialogWithLogging(Exception e) {
+ Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
+ ErrorUtils.showErrorWithLogging(status);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Other handlers
+ ////////////////////////////////////////////////////////////////////////////////
+
+ @Override
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ // Graphiti understands multipage editors
+ super.selectionChanged(part,selection); // Graphiti's DiagramEditorInternal
+ // but apparently GEF doesn't
+ updateActions(getSelectionActions()); // usually done in GEF's GraphicalEditor
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+ */
+ @Override
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().endsWith(Bpmn2Preferences.PREF_SHAPE_STYLE)) {
+ getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+ IPeService peService = Graphiti.getPeService();
+ TreeIterator<EObject> iter = getDiagramTypeProvider().getDiagram().eAllContents();
+ while (iter.hasNext()) {
+ EObject o = iter.next();
+ if (o instanceof PictogramElement) {
+ PictogramElement pe = (PictogramElement)o;
+ BaseElement be = BusinessObjectUtil.getFirstElementOfType(pe, BaseElement.class);
+ if (be!=null) {
+ TreeIterator<EObject> childIter = pe.eAllContents();
+ while (childIter.hasNext()) {
+ o = childIter.next();
+ if (o instanceof GraphicsAlgorithm) {
+ GraphicsAlgorithm ga = (GraphicsAlgorithm)o;
+ if (peService.getPropertyValue(ga, Bpmn2Preferences.PREF_SHAPE_STYLE)!=null) {
+ StyleUtil.applyStyle(ga, be);
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java
deleted file mode 100644
index fa0bb47..0000000
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Red Hat, Inc.
- * All rights reserved.
- * This program is made available under the terms of the
- * Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Red Hat, Inc. - initial API and implementation
- *
- * @author Bob Brodt
- ******************************************************************************/
-
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
-import org.eclipse.bpmn2.modeler.core.validation.ValidationStatusAdapterFactory;
-import org.eclipse.core.commands.operations.DefaultOperationHistory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.emf.workspace.IWorkspaceCommandStack;
-import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
-import org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-import org.eclipse.graphiti.ui.editor.IDiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-
-/**
- * This overrides the DefaultUpdateBehavior provider class from Graphiti. This
- * is necessary because we want to provide our own ResourceSet implementation
- * instead of being forced to deal with the default ResourceSetImpl. See
- * createResourceSetAndEditingDomain() for details.
- *
- * @author Bob Brodt
- *
- */
-public class BPMN2EditorUpdateBehavior extends DefaultUpdateBehavior {
-
- private TransactionalEditingDomain editingDomain;
- private WorkspaceSynchronizer workspaceSynchronizer;
-
- /**
- * @param diagramEditor
- */
- public BPMN2EditorUpdateBehavior(DiagramEditor diagramEditor) {
- super(diagramEditor);
- }
-
- public TransactionalEditingDomain getEditingDomain() {
- if (editingDomain == null)
- createEditingDomain();
- return editingDomain;
- }
-
- @Override
- public void createEditingDomain() {
- if (editingDomain == null) {
- editingDomain = createResourceSetAndEditingDomain();
- initializeEditingDomain(editingDomain);
- }
- }
-
- public TransactionalEditingDomain createResourceSetAndEditingDomain() {
- // Argh!! This is the ONLY line of code that actually differs
- // (significantly) from
- // the Graphiti EMF Service. Here we want to substitute our own
- // Bpmn2ModelerResourceSetImpl instead of using a ResourceSetImpl.
- final ResourceSet resourceSet = new Bpmn2ModelerResourceSetImpl();
- final IWorkspaceCommandStack workspaceCommandStack = new GFWorkspaceCommandStackImpl(
- new DefaultOperationHistory());
-
- final TransactionalEditingDomainImpl editingDomain = new TransactionalEditingDomainImpl(
- new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
- workspaceCommandStack, resourceSet);
- WorkspaceEditingDomainFactory.INSTANCE.mapResourceSet(editingDomain);
- return editingDomain;
- }
-
- protected void initializeEditingDomain(TransactionalEditingDomain domain) {
- // we want first crack at these notifications!
- workspaceSynchronizer = new WorkspaceSynchronizer(getEditingDomain(),
- new BPMN2EditorWorkspaceSynchronizerDelegate(diagramEditor));
- super.initializeEditingDomain(domain);
- }
-
- public void dispose() {
- super.dispose();
- workspaceSynchronizer.dispose();
- }
-
- public class BPMN2EditorWorkspaceSynchronizerDelegate implements WorkspaceSynchronizer.Delegate {
-
- private BPMN2Editor bpmnEditor;
-
- /**
- * The DiagramEditorBehavior reacts on a setResourceChanged(true) if he gets
- * activated.
- */
- public BPMN2EditorWorkspaceSynchronizerDelegate(DiagramEditor diagramEditor) {
- this.bpmnEditor = (BPMN2Editor)diagramEditor;
- }
-
- public void dispose() {
- bpmnEditor = null;
- }
-
- public boolean handleResourceChanged(Resource resource) {
- return bpmnEditor.handleResourceChanged(resource);
- }
-
- public boolean handleResourceDeleted(Resource resource) {
- return bpmnEditor.handleResourceDeleted(resource);
- }
-
- public boolean handleResourceMoved(Resource resource, URI newURI) {
- return bpmnEditor.handleResourceMoved(resource, newURI);
- }
-
- }}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
index 205970d..28159ea 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
@@ -1,409 +1,409 @@
-/*******************************************************************************
- * Copyright (c) 2011 Red Hat, Inc.
- * All rights reserved.
- * This program is made available under the terms of the
- * Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Red Hat, Inc. - initial API and implementation
- *
- * @author Bob Brodt
- ******************************************************************************/
-
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.di.DIUtils;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
-import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabFolder2Listener;
-import org.eclipse.swt.custom.CTabFolderEvent;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class implements a multi-page version of the BPMN2 Modeler (BPMN2Editor class).
- * To revert back to the original, single-page version simply change the editor extension
- * point in plugin.xml (see comments there).
- *
- * This is still in the experimental phase and currently only supports a single diagram
- * per .bpmn file. An optional second page, which displays the XML source, can be created
- * from the context menu. The source view is not yet synchronized to the design view and
- * can only show the XML as of the last "Save" i.e. the current state of the file on disk,
- * not the in-memory model. Design/Source view synchronization will be implemented in a
- * future version, but direct editing of the XML will not be supported - it will remain
- * "view only".
- *
- * Future versions will support multiple diagrams per .bpmn file with the ability to add
- * and remove pages containing different diagram types. It should be possible for the user
- * to create a single file that contains a mix of Process, Collaboration and Choreography
- * diagrams. Whether or not these types of files are actually deployable and/or executable
- * is another story ;)
- */
-public class BPMN2MultiPageEditor extends MultiPageEditorPart implements IGotoMarker {
-
- DesignEditor designEditor;
- SourceViewer sourceViewer;
- private CTabFolder tabFolder;
- private int defaultTabHeight;
- private List<BPMNDiagram> bpmnDiagrams = new ArrayList<BPMNDiagram>();
-
- public BPMN2MultiPageEditor() {
- super();
- }
-
- @Override
- protected IEditorSite createSite(IEditorPart editor) {
- if (editor instanceof DesignEditor)
- return new DesignEditorSite(this, editor);
- return new MultiPageEditorSite(this, editor);
- }
-
- @Override
- public String getTitle() {
- if (designEditor!=null)
- return designEditor.getTitle();
- return super.getTitle();
- }
-
- @Override
- public String getPartName() {
- if (designEditor!=null)
- return designEditor.getPartName();
- return super.getPartName();
- }
-
- /**
- * Method declared on IEditorPart.
- *
- * @param marker Marker to look for
- */
- @Override
- public void gotoMarker(IMarker marker) {
- if (getActivePage() < 0) {
- setActivePage(0);
- }
- IDE.gotoMarker(getEditor(getActivePage()), marker);
- }
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
- */
- @Override
- protected void createPages() {
- tabFolder = (CTabFolder)getContainer();
- tabFolder.addCTabFolder2Listener( new CTabFolder2Listener() {
-
- @Override
- public void close(CTabFolderEvent event) {
- if (event.item.getData() == sourceViewer)
- removeSourceViewer();
- }
-
- @Override
- public void minimize(CTabFolderEvent event) {
- }
-
- @Override
- public void maximize(CTabFolderEvent event) {
- }
-
- @Override
- public void restore(CTabFolderEvent event) {
- }
-
- @Override
- public void showList(CTabFolderEvent event) {
- }
-
- });
- tabFolder.addSelectionListener( new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- int pageIndex = tabFolder.getSelectionIndex();
- if (pageIndex>=0 && pageIndex<bpmnDiagrams.size() && designEditor!=null) {
- BPMNDiagram bpmnDiagram = bpmnDiagrams.get(pageIndex);
- designEditor.selectBpmnDiagram(bpmnDiagram);
- }
- }
- });
-
- // defer editor layout until all pages have been created
- tabFolder.setLayoutDeferred(true);
-
- createDesignEditor();
-
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- setActivePage(0);
- designEditor.selectBpmnDiagram(bpmnDiagrams.get(0));
- tabFolder.setLayoutDeferred(false);
- tabFolder.setTabPosition(SWT.TOP);
- updateTabs();
- }
- });
- }
-
- protected void createDesignEditor() {
- if (designEditor==null) {
- designEditor = new DesignEditor(this, this);
-
- try {
- int pageIndex = tabFolder.getItemCount();
- if (sourceViewer!=null)
- --pageIndex;
- addPage(pageIndex, designEditor, BPMN2MultiPageEditor.this.getEditorInput());
- defaultTabHeight = tabFolder.getTabHeight();
- setPageText(pageIndex,ModelUtil.getDiagramTypeName( designEditor.getBpmnDiagram() ));
-
- defaultTabHeight = tabFolder.getTabHeight();
-
- updateTabs();
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- public DesignEditor getDesignEditor() {
- return designEditor;
- }
-
- protected void addDesignPage(final BPMNDiagram bpmnDiagram) {
- createDesignEditor();
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- try {
-
- int pageIndex = tabFolder.getItemCount();
- if (sourceViewer!=null)
- --pageIndex;
- Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput)designEditor.getEditorInput();
- input.setBpmnDiagram(bpmnDiagram);
- addPage(pageIndex, designEditor, input);
- CTabItem oldItem = tabFolder.getItem(pageIndex-1);
- CTabItem newItem = tabFolder.getItem(pageIndex);
- newItem.setControl( oldItem.getControl() );
- setPageText(pageIndex,bpmnDiagram.getName());
-
- setActivePage(pageIndex);
- updateTabs();
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
-
- public void showDesignPage(final BPMNDiagram bpmnDiagram) {
- final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
- if (pageIndex>=0) {
- if (getDesignEditor().getBpmnDiagram()!=bpmnDiagram) {
- setActivePage(pageIndex);
- }
- }
- else {
- designEditor.showDesignPage(bpmnDiagram);
- }
- }
-
- protected void removeDesignPage(final BPMNDiagram bpmnDiagram) {
- final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
- if (pageIndex>0) {
- // go back to "Design" page - the only page that can't be removed
- Display.getCurrent().asyncExec( new Runnable() {
- @Override
- public void run() {
- setActivePage(0);
-
- IEditorPart editor = getEditor(pageIndex);
- if (editor instanceof DesignEditor) {
- ((DesignEditor)editor).deleteBpmnDiagram(bpmnDiagram);
- }
-
- // need to manage this ourselves so that the CTabFolder doesn't
- // dispose our editor site (a child of the CTabItem.control)
- tabFolder.getItem(pageIndex).setControl(null);
-
- removePage(pageIndex);
-
- tabFolder.getSelection().getControl().setVisible(true);
- }
- });
- }
- }
-
- public int getDesignPageCount() {
- int count = getPageCount();
- if (sourceViewer!=null)
- --count;
- return count;
- }
-
- protected void createSourceViewer() {
- if (sourceViewer==null) {
- sourceViewer = new SourceViewer(this);
-
- try {
- int pageIndex = tabFolder.getItemCount();
- FileEditorInput input = new FileEditorInput(designEditor.getModelFile());
- addPage(pageIndex, sourceViewer, input);
- tabFolder.getItem(pageIndex).setShowClose(true);
-
- setPageText(pageIndex,"Source");
- setActivePage(pageIndex);
-
- updateTabs();
- }
- catch (Exception e) {
- e.printStackTrace();
- if (sourceViewer!=null)
- sourceViewer.dispose();
- }
- }
- }
-
- public SourceViewer getSourceViewer() {
- return sourceViewer;
- }
-
- public void removeSourceViewer() {
- // there will only be one source page and it will always be the last page in the tab folder
- if (sourceViewer!=null) {
- int pageIndex = tabFolder.getItemCount() - 1;
- if (pageIndex>0) {
- removePage(pageIndex);
- sourceViewer = null;
- }
- }
- }
-
- public void addPage(int pageIndex, IEditorPart editor, IEditorInput input)
- throws PartInitException {
- super.addPage(pageIndex,editor,input);
- if (editor instanceof DesignEditor) {
- bpmnDiagrams.add(pageIndex,((DesignEditor)editor).getBpmnDiagram());
- }
- }
-
- @Override
- public void removePage(int pageIndex) {
- Object page = tabFolder.getItem(pageIndex).getData();
- super.removePage(pageIndex);
- updateTabs();
- if (page instanceof DesignEditor) {
- bpmnDiagrams.remove(pageIndex);
- }
- }
-
- @Override
- protected void pageChange(int newPageIndex) {
- super.pageChange(newPageIndex);
-
- IEditorPart editor = getEditor(newPageIndex);
- if (editor instanceof DesignEditor) {
- BPMNDiagram bpmnDiagram = bpmnDiagrams.get(newPageIndex);
- ((DesignEditor)editor).pageChange(bpmnDiagram);
-// Diagram diagram = DIUtils.findDiagram(designEditor, bpmnDiagram);
-// if (diagram != null)
-// designEditor.selectPictogramElements(new PictogramElement[] {(PictogramElement)diagram});
- }
- }
-
- public int getPageCount() {
- return tabFolder.getItemCount();
- }
-
- public CTabItem getTabItem(int pageIndex) {
- return tabFolder.getItem(pageIndex);
- }
-
- public BPMNDiagram getBpmnDiagram(int i) {
- if (i>=0 && i<bpmnDiagrams.size()) {
- return bpmnDiagrams.get(i);
- }
- return null;
- }
-
- private void updateTabs() {
- if (!tabFolder.getLayoutDeferred()) {
- if (tabFolder.getItemCount()==1) {
- tabFolder.setTabHeight(0);
- }
- else
- tabFolder.setTabHeight(defaultTabHeight);
- }
- tabFolder.layout();
- }
-
- public CTabFolder getTabFolder() {
- return tabFolder;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void doSave(IProgressMonitor monitor) {
- designEditor.doSave(monitor);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#doSaveAs()
- */
- @Override
- public void doSaveAs() {
- IEditorPart activeEditor = getActiveEditor();
- activeEditor.doSaveAs();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
- */
- @Override
- public boolean isSaveAsAllowed() {
-
- /*
- * Depending upon the active page in multipage editor, call the saveAsAllowed.
- * It helps to see whether a particular editor allows 'save as' feature
- */
- IEditorPart activeEditor = getActiveEditor();
- return activeEditor.isSaveAsAllowed();
- }
-
- @Override
- public void dispose() {
- designEditor.dispose();
- if (sourceViewer!=null)
- sourceViewer.dispose();
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ * All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+package org.eclipse.bpmn2.modeler.ui.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.di.DIUtils;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabFolder2Listener;
+import org.eclipse.swt.custom.CTabFolderEvent;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.eclipse.ui.part.MultiPageSelectionProvider;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * This class implements a multi-page version of the BPMN2 Modeler (BPMN2Editor class).
+ * To revert back to the original, single-page version simply change the editor extension
+ * point in plugin.xml (see comments there).
+ *
+ * This is still in the experimental phase and currently only supports a single diagram
+ * per .bpmn file. An optional second page, which displays the XML source, can be created
+ * from the context menu. The source view is not yet synchronized to the design view and
+ * can only show the XML as of the last "Save" i.e. the current state of the file on disk,
+ * not the in-memory model. Design/Source view synchronization will be implemented in a
+ * future version, but direct editing of the XML will not be supported - it will remain
+ * "view only".
+ *
+ * Future versions will support multiple diagrams per .bpmn file with the ability to add
+ * and remove pages containing different diagram types. It should be possible for the user
+ * to create a single file that contains a mix of Process, Collaboration and Choreography
+ * diagrams. Whether or not these types of files are actually deployable and/or executable
+ * is another story ;)
+ */
+public class BPMN2MultiPageEditor extends MultiPageEditorPart implements IGotoMarker {
+
+ DesignEditor designEditor;
+ SourceViewer sourceViewer;
+ private CTabFolder tabFolder;
+ private int defaultTabHeight;
+ private List<BPMNDiagram> bpmnDiagrams = new ArrayList<BPMNDiagram>();
+
+ public BPMN2MultiPageEditor() {
+ super();
+ }
+
+ @Override
+ protected IEditorSite createSite(IEditorPart editor) {
+ if (editor instanceof DesignEditor)
+ return new DesignEditorSite(this, editor);
+ return new MultiPageEditorSite(this, editor);
+ }
+
+ @Override
+ public String getTitle() {
+ if (designEditor!=null)
+ return designEditor.getTitle();
+ return super.getTitle();
+ }
+
+ @Override
+ public String getPartName() {
+ if (designEditor!=null)
+ return designEditor.getPartName();
+ return super.getPartName();
+ }
+
+ /**
+ * Method declared on IEditorPart.
+ *
+ * @param marker Marker to look for
+ */
+ @Override
+ public void gotoMarker(IMarker marker) {
+ if (getActivePage() < 0) {
+ setActivePage(0);
+ }
+ IDE.gotoMarker(getEditor(getActivePage()), marker);
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
+ */
+ @Override
+ protected void createPages() {
+ tabFolder = (CTabFolder)getContainer();
+ tabFolder.addCTabFolder2Listener( new CTabFolder2Listener() {
+
+ @Override
+ public void close(CTabFolderEvent event) {
+ if (event.item.getData() == sourceViewer)
+ removeSourceViewer();
+ }
+
+ @Override
+ public void minimize(CTabFolderEvent event) {
+ }
+
+ @Override
+ public void maximize(CTabFolderEvent event) {
+ }
+
+ @Override
+ public void restore(CTabFolderEvent event) {
+ }
+
+ @Override
+ public void showList(CTabFolderEvent event) {
+ }
+
+ });
+ tabFolder.addSelectionListener( new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ int pageIndex = tabFolder.getSelectionIndex();
+ if (pageIndex>=0 && pageIndex<bpmnDiagrams.size() && designEditor!=null) {
+ BPMNDiagram bpmnDiagram = bpmnDiagrams.get(pageIndex);
+ designEditor.selectBpmnDiagram(bpmnDiagram);
+ }
+ }
+ });
+
+ // defer editor layout until all pages have been created
+ tabFolder.setLayoutDeferred(true);
+
+ createDesignEditor();
+
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ setActivePage(0);
+ designEditor.selectBpmnDiagram(bpmnDiagrams.get(0));
+ tabFolder.setLayoutDeferred(false);
+ tabFolder.setTabPosition(SWT.TOP);
+ updateTabs();
+ }
+ });
+ }
+
+ protected void createDesignEditor() {
+ if (designEditor==null) {
+ designEditor = new DesignEditor(this, this);
+
+ try {
+ int pageIndex = tabFolder.getItemCount();
+ if (sourceViewer!=null)
+ --pageIndex;
+ addPage(pageIndex, designEditor, BPMN2MultiPageEditor.this.getEditorInput());
+ defaultTabHeight = tabFolder.getTabHeight();
+ setPageText(pageIndex,ModelUtil.getDiagramTypeName( designEditor.getBpmnDiagram() ));
+
+ defaultTabHeight = tabFolder.getTabHeight();
+
+ updateTabs();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public DesignEditor getDesignEditor() {
+ return designEditor;
+ }
+
+ protected void addDesignPage(final BPMNDiagram bpmnDiagram) {
+ createDesignEditor();
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+
+ int pageIndex = tabFolder.getItemCount();
+ if (sourceViewer!=null)
+ --pageIndex;
+ Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput)designEditor.getEditorInput();
+ input.setBpmnDiagram(bpmnDiagram);
+ addPage(pageIndex, designEditor, input);
+ CTabItem oldItem = tabFolder.getItem(pageIndex-1);
+ CTabItem newItem = tabFolder.getItem(pageIndex);
+ newItem.setControl( oldItem.getControl() );
+ setPageText(pageIndex,bpmnDiagram.getName());
+
+ setActivePage(pageIndex);
+ updateTabs();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ public void showDesignPage(final BPMNDiagram bpmnDiagram) {
+ final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
+ if (pageIndex>=0) {
+ if (getDesignEditor().getBpmnDiagram()!=bpmnDiagram) {
+ setActivePage(pageIndex);
+ }
+ }
+ else {
+ designEditor.showDesignPage(bpmnDiagram);
+ }
+ }
+
+ protected void removeDesignPage(final BPMNDiagram bpmnDiagram) {
+ final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
+ if (pageIndex>0) {
+ // go back to "Design" page - the only page that can't be removed
+ Display.getCurrent().asyncExec( new Runnable() {
+ @Override
+ public void run() {
+ setActivePage(0);
+
+ IEditorPart editor = getEditor(pageIndex);
+ if (editor instanceof DesignEditor) {
+ ((DesignEditor)editor).deleteBpmnDiagram(bpmnDiagram);
+ }
+
+ // need to manage this ourselves so that the CTabFolder doesn't
+ // dispose our editor site (a child of the CTabItem.control)
+ tabFolder.getItem(pageIndex).setControl(null);
+
+ removePage(pageIndex);
+
+ tabFolder.getSelection().getControl().setVisible(true);
+ }
+ });
+ }
+ }
+
+ public int getDesignPageCount() {
+ int count = getPageCount();
+ if (sourceViewer!=null)
+ --count;
+ return count;
+ }
+
+ protected void createSourceViewer() {
+ if (sourceViewer==null) {
+ sourceViewer = new SourceViewer(this);
+
+ try {
+ int pageIndex = tabFolder.getItemCount();
+ FileEditorInput input = new FileEditorInput(designEditor.getModelFile());
+ addPage(pageIndex, sourceViewer, input);
+ tabFolder.getItem(pageIndex).setShowClose(true);
+
+ setPageText(pageIndex,"Source");
+ setActivePage(pageIndex);
+
+ updateTabs();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ if (sourceViewer!=null)
+ sourceViewer.dispose();
+ }
+ }
+ }
+
+ public SourceViewer getSourceViewer() {
+ return sourceViewer;
+ }
+
+ public void removeSourceViewer() {
+ // there will only be one source page and it will always be the last page in the tab folder
+ if (sourceViewer!=null) {
+ int pageIndex = tabFolder.getItemCount() - 1;
+ if (pageIndex>0) {
+ removePage(pageIndex);
+ sourceViewer = null;
+ }
+ }
+ }
+
+ public void addPage(int pageIndex, IEditorPart editor, IEditorInput input)
+ throws PartInitException {
+ super.addPage(pageIndex,editor,input);
+ if (editor instanceof DesignEditor) {
+ bpmnDiagrams.add(pageIndex,((DesignEditor)editor).getBpmnDiagram());
+ }
+ }
+
+ @Override
+ public void removePage(int pageIndex) {
+ Object page = tabFolder.getItem(pageIndex).getData();
+ super.removePage(pageIndex);
+ updateTabs();
+ if (page instanceof DesignEditor) {
+ bpmnDiagrams.remove(pageIndex);
+ }
+ }
+
+ @Override
+ protected void pageChange(int newPageIndex) {
+ super.pageChange(newPageIndex);
+
+ IEditorPart editor = getEditor(newPageIndex);
+ if (editor instanceof DesignEditor) {
+ BPMNDiagram bpmnDiagram = bpmnDiagrams.get(newPageIndex);
+ ((DesignEditor)editor).pageChange(bpmnDiagram);
+// Diagram diagram = DIUtils.findDiagram(designEditor, bpmnDiagram);
+// if (diagram != null)
+// designEditor.selectPictogramElements(new PictogramElement[] {(PictogramElement)diagram});
+ }
+ }
+
+ public int getPageCount() {
+ return tabFolder.getItemCount();
+ }
+
+ public CTabItem getTabItem(int pageIndex) {
+ return tabFolder.getItem(pageIndex);
+ }
+
+ public BPMNDiagram getBpmnDiagram(int i) {
+ if (i>=0 && i<bpmnDiagrams.size()) {
+ return bpmnDiagrams.get(i);
+ }
+ return null;
+ }
+
+ private void updateTabs() {
+ if (!tabFolder.getLayoutDeferred()) {
+ if (tabFolder.getItemCount()==1) {
+ tabFolder.setTabHeight(0);
+ }
+ else
+ tabFolder.setTabHeight(defaultTabHeight);
+ }
+ tabFolder.layout();
+ }
+
+ public CTabFolder getTabFolder() {
+ return tabFolder;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ designEditor.doSave(monitor);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#doSaveAs()
+ */
+ @Override
+ public void doSaveAs() {
+ IEditorPart activeEditor = getActiveEditor();
+ activeEditor.doSaveAs();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
+ */
+ @Override
+ public boolean isSaveAsAllowed() {
+
+ /*
+ * Depending upon the active page in multipage editor, call the saveAsAllowed.
+ * It helps to see whether a particular editor allows 'save as' feature
+ */
+ IEditorPart activeEditor = getActiveEditor();
+ return activeEditor.isSaveAsAllowed();
+ }
+
+ @Override
+ public void dispose() {
+ designEditor.dispose();
+ if (sourceViewer!=null)
+ sourceViewer.dispose();
+ }
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java
deleted file mode 100644
index 5aa95e9..0000000
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import java.util.Arrays;
-
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-
-public class BPMN2PersistencyBehavior extends DefaultPersistencyBehavior {
-
- BPMN2Editor editor;
-
- public BPMN2PersistencyBehavior(DiagramEditor diagramEditor) {
- super(diagramEditor);
- editor = (BPMN2Editor)diagramEditor;
- }
- @Override
- public Diagram loadDiagram(URI modelUri) {
- Diagram diagram = super.loadDiagram(modelUri);
-
- return diagram;
- }
-
-}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
index c4df3e5..fde041b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
@@ -420,7 +420,7 @@
@Override
protected ContextMenuProvider createContextMenuProvider() {
- return new DiagramEditorContextMenuProvider(getGraphicalViewer(), getActionRegistry(), getDiagramTypeProvider()) {
+ return new DiagramEditorContextMenuProvider(getGraphicalViewer(), getActionRegistry(), getConfigurationProvider()) {
@Override
public void buildContextMenu(IMenuManager manager) {
super.buildContextMenu(manager);
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
index d47155b..229630b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
@@ -1,104 +1,110 @@
-/*******************************************************************************
- * Copyright (c) 2011 Red Hat, Inc.
- * All rights reserved.
- * This program is made available under the terms of the
- * Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Red Hat, Inc. - initial API and implementation
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.wizards;
-
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-public final class Bpmn2DiagramEditorInput extends DiagramEditorInput {
-
- private final TransactionalEditingDomain domain;
- private Bpmn2DiagramType initialDiagramType = Bpmn2DiagramType.NONE;
- private String targetNamespace;
- private BPMNDiagram bpmnDiagram;
- private URI modelUri;
-
- Bpmn2DiagramEditorInput(URI modelUri, URI diagramUri, TransactionalEditingDomain domain, String providerId) {
- super(diagramUri, providerId);
- this.domain = domain;
- this.modelUri = modelUri;
- }
-
- public Bpmn2DiagramType getInitialDiagramType() {
- return initialDiagramType;
- }
-
- public void setInitialDiagramType(Bpmn2DiagramType initialDiagramType) {
- this.initialDiagramType = initialDiagramType;
- }
-
- public String getTargetNamespace() {
- return targetNamespace;
- }
-
- public void setTargetNamespace(String targetNamespace) {
- this.targetNamespace = targetNamespace;
- }
-
- public URI getModelUri() {
- return modelUri;
- }
-
- public String getToolTipText() {
- return modelUri.toPlatformString(true);
- }
-
- public String getName() {
- return URI.decode(modelUri.trimFileExtension().lastSegment());
- }
-
- public void updateUri(URI diagramFileUri) {
- if (diagramFileUri.isPlatformResource()) {
- modelUri = diagramFileUri;
- }
- else
- super.updateUri(diagramFileUri);
- }
-
- @Override
- public boolean equals(Object obj) {
- boolean superEquals = super.equals(obj);
- if (superEquals) {
- return true;
- }
-
- // Eclipse makes FileEditorInputs for files to be opened. Here we check if the file is actually the same
- // as the DiagramEditorInput uses. This is for preventing opening new editors for the same file.
- if (obj instanceof FileEditorInput) {
-
- String path = ((FileEditorInput) obj).getFile().getFullPath().toString();
- URI platformUri = URI.createPlatformResourceURI(path, true);
-
- for (Resource resource : domain.getResourceSet().getResources()) {
- if (resource.getURI().equals(platformUri)) {
- return true;
- }
- }
-
- }
- return false;
- }
-
- public BPMNDiagram getBpmnDiagram() {
- return bpmnDiagram;
- }
-
- public void setBpmnDiagram(BPMNDiagram bpmnDiagram) {
- this.bpmnDiagram = bpmnDiagram;
- }
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ * All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.wizards;
+
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+
+public final class Bpmn2DiagramEditorInput extends DiagramEditorInput {
+
+ private final TransactionalEditingDomain domain;
+ private Bpmn2DiagramType initialDiagramType = Bpmn2DiagramType.NONE;
+ private String targetNamespace;
+ private BPMNDiagram bpmnDiagram;
+ private URI modelUri;
+ private URI diagramUri;
+
+ Bpmn2DiagramEditorInput(URI modelUri, URI diagramUri, TransactionalEditingDomain domain, String providerId) {
+ super(diagramUri.appendFragment("/0"), domain, providerId);
+ this.domain = domain;
+ this.modelUri = modelUri;
+ this.diagramUri = diagramUri;
+ }
+
+ public Bpmn2DiagramType getInitialDiagramType() {
+ return initialDiagramType;
+ }
+
+ public void setInitialDiagramType(Bpmn2DiagramType initialDiagramType) {
+ this.initialDiagramType = initialDiagramType;
+ }
+
+ public String getTargetNamespace() {
+ return targetNamespace;
+ }
+
+ public void setTargetNamespace(String targetNamespace) {
+ this.targetNamespace = targetNamespace;
+ }
+
+ public URI getModelUri() {
+ return modelUri;
+ }
+
+ public URI getUri() {
+ return diagramUri;
+ }
+
+ public String getToolTipText() {
+ return modelUri.toPlatformString(true);
+ }
+
+ public String getName() {
+ return URI.decode(modelUri.trimFileExtension().lastSegment());
+ }
+
+ public void updateUri(URI diagramFileUri) {
+ if (diagramFileUri.isPlatformResource()) {
+ modelUri = diagramFileUri;
+ }
+// else
+// super.updateUri(diagramFileUri);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ boolean superEquals = super.equals(obj);
+ if (superEquals) {
+ return true;
+ }
+
+ // Eclipse makes FileEditorInputs for files to be opened. Here we check if the file is actually the same
+ // as the DiagramEditorInput uses. This is for preventing opening new editors for the same file.
+ if (obj instanceof FileEditorInput) {
+
+ String path = ((FileEditorInput) obj).getFile().getFullPath().toString();
+ URI platformUri = URI.createPlatformResourceURI(path, true);
+
+ for (Resource resource : domain.getResourceSet().getResources()) {
+ if (resource.getURI().equals(platformUri)) {
+ return true;
+ }
+ }
+
+ }
+ return false;
+ }
+
+ public BPMNDiagram getBpmnDiagram() {
+ return bpmnDiagram;
+ }
+
+ public void setBpmnDiagram(BPMNDiagram bpmnDiagram) {
+ this.bpmnDiagram = bpmnDiagram;
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
index 1fb2a39..7596213 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
@@ -1,374 +1,378 @@
-/*******************************************************************************
- * Copyright (c) 2011 Red Hat, Inc.
- * All rights reserved.
- * This program is made available under the terms of the
- * Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Red Hat, Inc. - initial API and implementation
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.wizards;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
-import org.eclipse.core.commands.operations.DefaultOperationHistory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.emf.workspace.IWorkspaceCommandStack;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-public class FileService {
-
- public static TransactionalEditingDomain createEmfFileForDiagram(URI diagramResourceUri, final Diagram diagram, BPMN2Editor diagramEditor) {
-
- ResourceSet resourceSet = null;
- TransactionalEditingDomain editingDomain = null;
- if (diagramEditor==null) {
- // Create a resource set and EditingDomain
- resourceSet = new Bpmn2ModelerResourceSetImpl();
- editingDomain = TransactionUtil.getEditingDomain(resourceSet);
- if (editingDomain == null) {
- // Not yet existing, create one
- editingDomain = TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(resourceSet);
- }
- }
- else {
- editingDomain = diagramEditor.getEditingDomain();
- resourceSet = diagramEditor.getResourceSet();
- }
-
- // Create a resource for this file.
- final Resource resource = resourceSet.createResource(diagramResourceUri);
- CommandStack commandStack = editingDomain.getCommandStack();
- commandStack.execute(new RecordingCommand(editingDomain) {
-
- @Override
- protected void doExecute() {
- resource.setTrackingModification(true);
- resource.getContents().add(diagram);
-
- }
- });
-
- save(editingDomain, Collections.<Resource, Map<?, ?>> emptyMap());
- return editingDomain;
- }
-
- private static void save(TransactionalEditingDomain editingDomain, Map<Resource, Map<?, ?>> options) {
- saveInWorkspaceRunnable(editingDomain, options);
- }
-
- private static void saveInWorkspaceRunnable(final TransactionalEditingDomain editingDomain,
- final Map<Resource, Map<?, ?>> options) {
-
- final Map<URI, Throwable> failedSaves = new HashMap<URI, Throwable>();
- final IWorkspaceRunnable wsRunnable = new IWorkspaceRunnable() {
- @Override
- public void run(final IProgressMonitor monitor) throws CoreException {
-
- final Runnable runnable = new Runnable() {
-
- @Override
- public void run() {
- Transaction parentTx;
- if (editingDomain != null
- && (parentTx = ((TransactionalEditingDomainImpl) editingDomain).getActiveTransaction()) != null) {
- do {
- if (!parentTx.isReadOnly()) {
- throw new IllegalStateException(
- "FileService.save() called from within a command (likely produces a deadlock)"); //$NON-NLS-1$
- }
- } while ((parentTx = ((TransactionalEditingDomainImpl) editingDomain)
- .getActiveTransaction().getParent()) != null);
- }
-
- final EList<Resource> resources = editingDomain.getResourceSet().getResources();
- // Copy list to an array to prevent
- // ConcurrentModificationExceptions
- // during the saving of the dirty resources
- Resource[] resourcesArray = new Resource[resources.size()];
- resourcesArray = resources.toArray(resourcesArray);
- final Set<Resource> savedResources = new HashSet<Resource>();
- for (int i = 0; i < resourcesArray.length; i++) {
- // In case resource modification tracking is
- // switched on, we can check if a resource
- // has been modified, so that we only need to same
- // really changed resources; otherwise
- // we need to save all resources in the set
- final Resource resource = resourcesArray[i];
- if (resource.isModified()) {
- try {
- resource.save(options.get(resource));
- savedResources.add(resource);
- } catch (final Throwable t) {
- failedSaves.put(resource.getURI(), t);
- }
- }
- }
- }
- };
-
- try {
- editingDomain.runExclusive(runnable);
- } catch (final InterruptedException e) {
- throw new RuntimeException(e);
- }
- editingDomain.getCommandStack().flush();
- }
- };
- try {
- ResourcesPlugin.getWorkspace().run(wsRunnable, null);
- if (!failedSaves.isEmpty()) {
- throw new WrappedException(createMessage(failedSaves), new RuntimeException());
- }
- } catch (final CoreException e) {
- final Throwable cause = e.getStatus().getException();
- if (cause instanceof RuntimeException) {
- throw (RuntimeException) cause;
- }
- throw new RuntimeException(e);
- }
- }
-
- private static String createMessage(Map<URI, Throwable> failedSaves) {
- final StringBuilder buf = new StringBuilder("The following resources could not be saved:");
- for (final Entry<URI, Throwable> entry : failedSaves.entrySet()) {
- buf.append("\nURI: ").append(entry.getKey().toString()).append(", cause: \n")
- .append(getExceptionAsString(entry.getValue()));
- }
- return buf.toString();
- }
-
- private static String getExceptionAsString(Throwable t) {
- final StringWriter stringWriter = new StringWriter();
- final PrintWriter printWriter = new PrintWriter(stringWriter);
- t.printStackTrace(printWriter);
- final String result = stringWriter.toString();
- try {
- stringWriter.close();
- } catch (final IOException e) {
- // $JL-EXC$ ignore
- }
- printWriter.close();
- return result;
- }
-
- public static InputStream getInputContents(IEditorInput input) {
- try {
- if (input instanceof Bpmn2DiagramEditorInput) {
- URI uri = getInputUri(input);
- String fileName = null;
- if (uri.isFile())
- fileName = uri.toFileString();
- else if (uri.isPlatformResource())
- fileName = uri.toPlatformString(false);
-
- File file = new File(fileName);
- if (file.exists()) {
- InputStream is = new FileInputStream(file);
- return is;
- }
- } else if (input instanceof FileEditorInput) {
- return ((FileEditorInput) input).getFile().getContents();
- } else if (input instanceof IStorageEditorInput) {
- return ((IStorageEditorInput) input).getStorage().getContents();
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- return null;
- }
-
- public static URI getInputUri(IEditorInput input) {
- if (input instanceof Bpmn2DiagramEditorInput) {
- URI uri = ((Bpmn2DiagramEditorInput) input).getModelUri();
- return uri.trimFragment();
- } else if (input instanceof FileEditorInput) {
- IPath path = ((FileEditorInput) input).getFile().getFullPath();
- return URI.createPlatformResourceURI(path.toString(), true);
- } else if (input instanceof IStorageEditorInput) {
- IStorageEditorInput sei = (IStorageEditorInput) input;
-
- try {
- IPath path = sei.getStorage().getFullPath();
- if (path!=null)
- return URI.createPlatformResourceURI(path.toString(), true);
-
- // the input is not a local file. Create a temp file and copy its contents
- String name = sei.getStorage().getName();
- InputStream istream = sei.getStorage().getContents();
- File file = createTempFile(name, istream);
- return URI.createFileURI(file.getPath());
- }
- catch (Exception e) {
- }
- }
- return null;
- }
-
- public static String createTempName(String name) {
- String tempDir = System.getProperty("java.io.tmpdir");
- if (!tempDir.endsWith(File.separator))
- tempDir += File.separator;
- String tempName = tempDir + name + "." + EcoreUtil.generateUUID();
- return tempName;
- }
-
- public static File createTempFile(String name) {
- return createTempFile(name,null);
- }
-
- public static File createTempFile(String name, InputStream istream) {
- File tempFile = null;
- try {
- tempFile = File.createTempFile(name, ".bpmn");
- if (istream!=null) {
- OutputStream ostream = new FileOutputStream(tempFile);
-
- int read = 0;
- byte[] bytes = new byte[1024];
-
- while ((read = istream.read(bytes)) != -1) {
- ostream.write(bytes, 0, read);
- }
-
- istream.close();
-
- ostream.flush();
- ostream.close();
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return tempFile;
- }
-
- public static boolean isTempFile(URI uri) {
- String tempDir = System.getProperty("java.io.tmpdir");
- String uriDir = uri.trimFragment().trimSegments(1).devicePath();
- return tempDir!=null && tempDir.compareToIgnoreCase(uriDir)==0;
- }
-
- public static void deleteTempFile(URI uri) {
- File file = new File(uri.toFileString());
- if (file.exists())
- file.delete();
- }
-
-// public static IFile getFileFromInput(IEditorSite site, IEditorInput input) {
-// if (input instanceof DiagramEditorInput) {
-// URI uri = ((DiagramEditorInput) input).getUri();
-// String uriString = uri.trimFragment().toPlatformString(true);
-// return BPMN2DiagramCreator.getModelFile(new Path(uriString));
-// } else if (input instanceof FileEditorInput) {
-// return ((FileEditorInput) input).getFile();
-// } else if (input instanceof IStorageEditorInput) {
-// IStorageEditorInput sei = (IStorageEditorInput) input;
-//
-// try {
-// String name = sei.getStorage().getName();
-// InputStream istream = sei.getStorage().getContents();
-//
-// // Object sel = site.getPage().getSelection();
-// File tempFile = File.createTempFile(name, ".bpmn");
-// OutputStream ostream = new FileOutputStream(tempFile);
-//
-// int read = 0;
-// byte[] bytes = new byte[1024];
-//
-// while ((read = istream.read(bytes)) != -1) {
-// ostream.write(bytes, 0, read);
-// }
-//
-// istream.close();
-// ostream.flush();
-// ostream.close();
-//
-// IProject project = createTempProject();
-// IPath location = new Path(tempFile.getAbsolutePath());
-// IFile workspaceFile = project.getFile(location.lastSegment());
-// workspaceFile.createLink(location, IResource.NONE, null);
-// return workspaceFile;
-// // return new FileEditorInput(workspaceFile);
-// } catch (Exception e) {
-// // TODO Auto-generated catch block
-// e.printStackTrace();
-// }
-// }
-//
-// return null;
-// }
-//
-// public static IProject getTempProject() {
-// IWorkspace ws = ResourcesPlugin.getWorkspace();
-// IProject project = ws.getRoot().getProject(".bpmn2.modeler.temp");
-// return project;
-// }
-//
-// public static IProject createTempProject() {
-// try {
-// IProject project = getTempProject();
-// if (!project.exists())
-// project.create(null);
-// if (!project.isOpen())
-// project.open(null);
-// return project;
-// }
-// catch (Exception e) {
-// Activator.logError(e);
-// }
-// return null;
-// }
-}
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ * All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.wizards;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
+import org.eclipse.bpmn2.modeler.ui.Activator;
+import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
+import org.eclipse.core.commands.operations.DefaultOperationHistory;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.Transaction;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.ui.editor.DiagramEditorFactory;
+import org.eclipse.emf.workspace.IWorkspaceCommandStack;
+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
+import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+
+public class FileService {
+
+ public static class MyDiagramEditorFactory extends DiagramEditorFactory {
+ public static TransactionalEditingDomain createResourceSetAndEditingDomain() {
+ final ResourceSet resourceSet = new Bpmn2ModelerResourceSetImpl();
+ final IWorkspaceCommandStack workspaceCommandStack = new GFWorkspaceCommandStackImpl(new DefaultOperationHistory());
+
+ final TransactionalEditingDomainImpl editingDomain = new TransactionalEditingDomainImpl(new ComposedAdapterFactory(
+ ComposedAdapterFactory.Descriptor.Registry.INSTANCE), workspaceCommandStack, resourceSet);
+ WorkspaceEditingDomainFactory.INSTANCE.mapResourceSet(editingDomain);
+ return editingDomain;
+ }
+ }
+
+ public static TransactionalEditingDomain createEmfFileForDiagram(URI diagramResourceUri, final Diagram diagram, BPMN2Editor diagramEditor) {
+
+ ResourceSet resourceSet = null;
+ TransactionalEditingDomain editingDomain = null;
+
+ // Create a resource set and EditingDomain
+ editingDomain = MyDiagramEditorFactory.createResourceSetAndEditingDomain();
+ resourceSet = editingDomain.getResourceSet();
+
+ // Create a resource for this file.
+ final Resource resource = resourceSet.createResource(diagramResourceUri);
+ CommandStack commandStack = editingDomain.getCommandStack();
+ commandStack.execute(new RecordingCommand(editingDomain) {
+
+ @Override
+ protected void doExecute() {
+ resource.setTrackingModification(true);
+ resource.getContents().add(diagram);
+
+ }
+ });
+
+ save(editingDomain, Collections.<Resource, Map<?, ?>> emptyMap());
+ return editingDomain;
+ }
+
+ private static void save(TransactionalEditingDomain editingDomain, Map<Resource, Map<?, ?>> options) {
+ saveInWorkspaceRunnable(editingDomain, options);
+ }
+
+ private static void saveInWorkspaceRunnable(final TransactionalEditingDomain editingDomain,
+ final Map<Resource, Map<?, ?>> options) {
+
+ final Map<URI, Throwable> failedSaves = new HashMap<URI, Throwable>();
+ final IWorkspaceRunnable wsRunnable = new IWorkspaceRunnable() {
+ @Override
+ public void run(final IProgressMonitor monitor) throws CoreException {
+
+ final Runnable runnable = new Runnable() {
+
+ @Override
+ public void run() {
+ Transaction parentTx;
+ if (editingDomain != null
+ && (parentTx = ((TransactionalEditingDomainImpl) editingDomain).getActiveTransaction()) != null) {
+ do {
+ if (!parentTx.isReadOnly()) {
+ throw new IllegalStateException(
+ "FileService.save() called from within a command (likely produces a deadlock)"); //$NON-NLS-1$
+ }
+ } while ((parentTx = ((TransactionalEditingDomainImpl) editingDomain)
+ .getActiveTransaction().getParent()) != null);
+ }
+
+ final EList<Resource> resources = editingDomain.getResourceSet().getResources();
+ // Copy list to an array to prevent
+ // ConcurrentModificationExceptions
+ // during the saving of the dirty resources
+ Resource[] resourcesArray = new Resource[resources.size()];
+ resourcesArray = resources.toArray(resourcesArray);
+ final Set<Resource> savedResources = new HashSet<Resource>();
+ for (int i = 0; i < resourcesArray.length; i++) {
+ // In case resource modification tracking is
+ // switched on, we can check if a resource
+ // has been modified, so that we only need to same
+ // really changed resources; otherwise
+ // we need to save all resources in the set
+ final Resource resource = resourcesArray[i];
+ if (resource.isModified()) {
+ try {
+ resource.save(options.get(resource));
+ savedResources.add(resource);
+ } catch (final Throwable t) {
+ failedSaves.put(resource.getURI(), t);
+ }
+ }
+ }
+ }
+ };
+
+ try {
+ editingDomain.runExclusive(runnable);
+ } catch (final InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ editingDomain.getCommandStack().flush();
+ }
+ };
+ try {
+ ResourcesPlugin.getWorkspace().run(wsRunnable, null);
+ if (!failedSaves.isEmpty()) {
+ throw new WrappedException(createMessage(failedSaves), new RuntimeException());
+ }
+ } catch (final CoreException e) {
+ final Throwable cause = e.getStatus().getException();
+ if (cause instanceof RuntimeException) {
+ throw (RuntimeException) cause;
+ }
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static String createMessage(Map<URI, Throwable> failedSaves) {
+ final StringBuilder buf = new StringBuilder("The following resources could not be saved:");
+ for (final Entry<URI, Throwable> entry : failedSaves.entrySet()) {
+ buf.append("\nURI: ").append(entry.getKey().toString()).append(", cause: \n")
+ .append(getExceptionAsString(entry.getValue()));
+ }
+ return buf.toString();
+ }
+
+ private static String getExceptionAsString(Throwable t) {
+ final StringWriter stringWriter = new StringWriter();
+ final PrintWriter printWriter = new PrintWriter(stringWriter);
+ t.printStackTrace(printWriter);
+ final String result = stringWriter.toString();
+ try {
+ stringWriter.close();
+ } catch (final IOException e) {
+ // $JL-EXC$ ignore
+ }
+ printWriter.close();
+ return result;
+ }
+
+ public static InputStream getInputContents(IEditorInput input) {
+ try {
+ if (input instanceof Bpmn2DiagramEditorInput) {
+ URI uri = getInputUri(input);
+ String fileName = null;
+ if (uri.isFile())
+ fileName = uri.toFileString();
+ else if (uri.isPlatformResource())
+ fileName = uri.toPlatformString(false);
+
+ File file = new File(fileName);
+ if (file.exists()) {
+ InputStream is = new FileInputStream(file);
+ return is;
+ }
+ } else if (input instanceof FileEditorInput) {
+ return ((FileEditorInput) input).getFile().getContents();
+ } else if (input instanceof IStorageEditorInput) {
+ return ((IStorageEditorInput) input).getStorage().getContents();
+ }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ public static URI getInputUri(IEditorInput input) {
+ if (input instanceof Bpmn2DiagramEditorInput) {
+ URI uri = ((Bpmn2DiagramEditorInput) input).getModelUri();
+ return uri.trimFragment();
+ } else if (input instanceof FileEditorInput) {
+ IPath path = ((FileEditorInput) input).getFile().getFullPath();
+ return URI.createPlatformResourceURI(path.toString(), true);
+ } else if (input instanceof IStorageEditorInput) {
+ IStorageEditorInput sei = (IStorageEditorInput) input;
+
+ try {
+ IPath path = sei.getStorage().getFullPath();
+ if (path!=null)
+ return URI.createPlatformResourceURI(path.toString(), true);
+
+ // the input is not a local file. Create a temp file and copy its contents
+ String name = sei.getStorage().getName();
+ InputStream istream = sei.getStorage().getContents();
+ File file = createTempFile(name, istream);
+ return URI.createFileURI(file.getPath());
+ }
+ catch (Exception e) {
+ }
+ }
+ return null;
+ }
+
+ public static String createTempName(String name) {
+ String tempDir = System.getProperty("java.io.tmpdir");
+ if (!tempDir.endsWith(File.separator))
+ tempDir += File.separator;
+ String tempName = tempDir + name + "." + EcoreUtil.generateUUID();
+ return tempName;
+ }
+
+ public static File createTempFile(String name) {
+ return createTempFile(name,null);
+ }
+
+ public static File createTempFile(String name, InputStream istream) {
+ File tempFile = null;
+ try {
+ tempFile = File.createTempFile(name, ".bpmn");
+ if (istream!=null) {
+ OutputStream ostream = new FileOutputStream(tempFile);
+
+ int read = 0;
+ byte[] bytes = new byte[1024];
+
+ while ((read = istream.read(bytes)) != -1) {
+ ostream.write(bytes, 0, read);
+ }
+
+ istream.close();
+
+ ostream.flush();
+ ostream.close();
+ }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return tempFile;
+ }
+
+ public static boolean isTempFile(URI uri) {
+ String tempDir = System.getProperty("java.io.tmpdir");
+ String uriDir = uri.trimFragment().trimSegments(1).devicePath();
+ return tempDir!=null && tempDir.compareToIgnoreCase(uriDir)==0;
+ }
+
+ public static void deleteTempFile(URI uri) {
+ File file = new File(uri.toFileString());
+ if (file.exists())
+ file.delete();
+ }
+
+// public static IFile getFileFromInput(IEditorSite site, IEditorInput input) {
+// if (input instanceof DiagramEditorInput) {
+// URI uri = ((DiagramEditorInput) input).getUri();
+// String uriString = uri.trimFragment().toPlatformString(true);
+// return BPMN2DiagramCreator.getModelFile(new Path(uriString));
+// } else if (input instanceof FileEditorInput) {
+// return ((FileEditorInput) input).getFile();
+// } else if (input instanceof IStorageEditorInput) {
+// IStorageEditorInput sei = (IStorageEditorInput) input;
+//
+// try {
+// String name = sei.getStorage().getName();
+// InputStream istream = sei.getStorage().getContents();
+//
+// // Object sel = site.getPage().getSelection();
+// File tempFile = File.createTempFile(name, ".bpmn");
+// OutputStream ostream = new FileOutputStream(tempFile);
+//
+// int read = 0;
+// byte[] bytes = new byte[1024];
+//
+// while ((read = istream.read(bytes)) != -1) {
+// ostream.write(bytes, 0, read);
+// }
+//
+// istream.close();
+// ostream.flush();
+// ostream.close();
+//
+// IProject project = createTempProject();
+// IPath location = new Path(tempFile.getAbsolutePath());
+// IFile workspaceFile = project.getFile(location.lastSegment());
+// workspaceFile.createLink(location, IResource.NONE, null);
+// return workspaceFile;
+// // return new FileEditorInput(workspaceFile);
+// } catch (Exception e) {
+// // TODO Auto-generated catch block
+// e.printStackTrace();
+// }
+// }
+//
+// return null;
+// }
+//
+// public static IProject getTempProject() {
+// IWorkspace ws = ResourcesPlugin.getWorkspace();
+// IProject project = ws.getRoot().getProject(".bpmn2.modeler.temp");
+// return project;
+// }
+//
+// public static IProject createTempProject() {
+// try {
+// IProject project = getTempProject();
+// if (!project.exists())
+// project.create(null);
+// if (!project.isOpen())
+// project.open(null);
+// return project;
+// }
+// catch (Exception e) {
+// Activator.logError(e);
+// }
+// return null;
+// }
+}
diff --git a/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties b/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
index 1a94f7d..c9784fe 100644
--- a/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
+++ b/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
@@ -1,4 +1,4 @@
-# associate site(s) - use comma to separate list - to add to the resulting repo
-# TODO: change bpmn2 metamodel download location as soon as an official update site is available
-# https://hudson.eclipse.org/hudson/job/bpmn2-nightly/ws/org.eclipse.bpmn2.site/target/site/ should point to an download.eclipse.org update site
-associate.sites=http://download.eclipse.org/graphiti/updates/0.9.0/,https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/,http://download.eclipse.org/bpmn2-modeler/site/,http://download.eclipse.org/bpel/site/,http://download.eclipse.org/releases/indigo,http://download.eclipse.org/eclipse/updates/3.7
+# associate site(s) - use comma to separate list - to add to the resulting repo
+# TODO: change bpmn2 metamodel download location as soon as an official update site is available
+# https://hudson.eclipse.org/hudson/job/bpmn2-nightly/ws/org.eclipse.bpmn2.site/target/site/ should point to an download.eclipse.org update site
+associate.sites=http://download.eclipse.org/graphiti/updates/0.8.2/,https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/,http://download.eclipse.org/bpmn2-modeler/site/,http://download.eclipse.org/bpel/site/,http://download.eclipse.org/releases/helios,http://download.eclipse.org/eclipse/updates/3.6
diff --git a/pom.xml b/pom.xml
index d2872bf..8d412fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,247 +1,247 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <prerequisites>
- <maven>3.0</maven>
- </prerequisites>
-
- <groupId>org.eclipse.bpmn2.modeler</groupId>
- <artifactId>org.eclipse.bpmn2.modeler.parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>pom</packaging>
-
- <name>BPMN2 Modeler Parent</name>
- <description>Parent POM for the Eclipse BPMN2 Modeler Project</description>
-
- <licenses>
- <license>
- <name>Eclipse Public License v1.0</name>
- <comments>
- All rights reserved.
-
- This program and the accompanying materials are made
- available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.htm
- </comments>
- </license>
- </licenses>
-
- <properties>
- <tycho-version>0.13.0</tycho-version>
- </properties>
-
- <profiles>
- <profile>
- <id>platform-helios</id>
- <activation>
- <property>
- <name>platform-version-name</name>
- <value>helios</value>
- </property>
- </activation>
- <properties>
- <eclipse-site>http://download.eclipse.org/releases/helios</eclipse-site>
- <platform-version>[3.6,3.7)</platform-version>
- </properties>
- </profile>
- <profile>
- <id>platform-indigo</id>
- <activation>
- <property>
- <name>platform-version-name</name>
- <value>indigo</value>
- </property>
- </activation>
- <properties>
- <eclipse-site>http://download.eclipse.org/releases/indigo</eclipse-site>
- <platform-version>[3.7,3.8)</platform-version>
- </properties>
- </profile>
- </profiles>
-
- <modules>
- <module>org.eclipse.bpmn2.modeler.core</module>
- <module>org.eclipse.bpmn2.modeler.ui</module>
- <module>org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5</module>
- <module>org.eclipse.bpmn2.modeler.feature</module>
- <module>org.eclipse.bpmn2.modeler.updatesite.feature</module>
- </modules>
-
- <repositories>
- <repository>
- <id>eclipse-platform</id>
- <layout>p2</layout>
- <url>${eclipse-site}</url>
- </repository>
-
- <repository>
- <id>eclipse-bpmn2</id>
- <!-- TODO: change this when BPMN2 metamodel finds a permanent home -->
- <url>https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/</url>
- <layout>p2</layout>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- <releases>
- <enabled>true</enabled>
- </releases>
- </repository>
-
- <repository>
- <id>eclipse-bpel</id>
- <url>http://download.eclipse.org/bpel/update-site</url>
- <layout>p2</layout>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- <releases>
- <enabled>true</enabled>
- </releases>
- </repository>
-
- <repository>
- <id>eclipse-graphiti</id>
- <url>http://download.eclipse.org/graphiti/updates/0.9.0</url>
- <layout>p2</layout>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- <releases>
- <enabled>true</enabled>
- </releases>
- </repository>
-
- <repository>
- <id>eclipse-emf</id>
- <url>http://download.eclipse.org/modeling/emf/updates/releases/</url>
- <layout>p2</layout>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- <releases>
- <enabled>true</enabled>
- </releases>
- </repository>
-
- <repository>
- <id>eclipse-gef</id>
- <url>http://download.eclipse.org/tools/gef/updates/releases/</url>
- <layout>p2</layout>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- <releases>
- <enabled>true</enabled>
- </releases>
- </repository>
-
- </repositories>
-
- <pluginRepositories>
- <pluginRepository>
- <!-- need maven-findbugs-2.3.2-SNAPSHOT, see http://jira.codehaus.org/browse/MFINDBUGS-122
- remove this when this version is released -->
- <id>codehaus.snapshots</id>
- <url>http://snapshots.repository.codehaus.org/</url>
- </pluginRepository>
- </pluginRepositories>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.eclipse.tycho</groupId>
- <artifactId>tycho-maven-plugin</artifactId>
- <version>${tycho-version}</version>
- <extensions>true</extensions>
- </plugin>
- <plugin>
- <groupId>org.eclipse.tycho</groupId>
- <artifactId>target-platform-configuration</artifactId>
- <version>${tycho-version}</version>
- <configuration>
- <resolver>p2</resolver>
- </configuration>
- </plugin>
- </plugins>
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.eclipse.tycho</groupId>
- <artifactId>maven-osgi-compiler-plugin</artifactId>
- <version>${tycho-version}</version>
- <configuration>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- <plugin>
- <!-- TODO remove workaround when https://issues.sonatype.org/browse/TYCHO-473
- is fixed -->
- <groupId>org.eclipse.tycho</groupId>
- <artifactId>maven-osgi-source-plugin</artifactId>
- <version>${tycho-version}</version>
- <executions>
- <execution>
- <id>attach-source</id>
- <phase>process-classes</phase>
- <goals>
- <goal>plugin-source</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.4.1</version>
- <configuration>
- <encoding>ISO-8859-1</encoding>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <version>1.3</version>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <version>2.3.2-SNAPSHOT</version>
- <configuration>
- <findbugsXmlOutput>true</findbugsXmlOutput>
- <failOnError>false</failOnError>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>check</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-pmd-plugin</artifactId>
- <version>2.5</version>
- <configuration>
- <sourceEncoding>utf-8</sourceEncoding>
- <minimumTokens>100</minimumTokens>
- <targetJdk>1.5</targetJdk>
- <format>xml</format>
- <failOnViolation>false</failOnViolation>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>cpd-check</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
-
-
-</project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <prerequisites>
+ <maven>3.0</maven>
+ </prerequisites>
+
+ <groupId>org.eclipse.bpmn2.modeler</groupId>
+ <artifactId>org.eclipse.bpmn2.modeler.parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+ <name>BPMN2 Modeler Parent</name>
+ <description>Parent POM for the Eclipse BPMN2 Modeler Project</description>
+
+ <licenses>
+ <license>
+ <name>Eclipse Public License v1.0</name>
+ <comments>
+ All rights reserved.
+
+ This program and the accompanying materials are made
+ available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.htm
+ </comments>
+ </license>
+ </licenses>
+
+ <properties>
+ <tycho-version>0.13.0</tycho-version>
+ </properties>
+
+ <profiles>
+ <profile>
+ <id>platform-helios</id>
+ <activation>
+ <property>
+ <name>platform-version-name</name>
+ <value>helios</value>
+ </property>
+ </activation>
+ <properties>
+ <eclipse-site>http://download.eclipse.org/releases/helios</eclipse-site>
+ <platform-version>[3.6,3.7)</platform-version>
+ </properties>
+ </profile>
+ <profile>
+ <id>platform-indigo</id>
+ <activation>
+ <property>
+ <name>platform-version-name</name>
+ <value>indigo</value>
+ </property>
+ </activation>
+ <properties>
+ <eclipse-site>http://download.eclipse.org/releases/indigo</eclipse-site>
+ <platform-version>[3.7,3.8)</platform-version>
+ </properties>
+ </profile>
+ </profiles>
+
+ <modules>
+ <module>org.eclipse.bpmn2.modeler.core</module>
+ <module>org.eclipse.bpmn2.modeler.ui</module>
+ <module>org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5</module>
+ <module>org.eclipse.bpmn2.modeler.feature</module>
+ <module>org.eclipse.bpmn2.modeler.updatesite.feature</module>
+ </modules>
+
+ <repositories>
+ <repository>
+ <id>eclipse-platform</id>
+ <layout>p2</layout>
+ <url>${eclipse-site}</url>
+ </repository>
+
+ <repository>
+ <id>eclipse-bpmn2</id>
+ <!-- TODO: change this when BPMN2 metamodel finds a permanent home -->
+ <url>https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/</url>
+ <layout>p2</layout>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ </repository>
+
+ <repository>
+ <id>eclipse-bpel</id>
+ <url>http://download.eclipse.org/bpel/update-site</url>
+ <layout>p2</layout>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ </repository>
+
+ <repository>
+ <id>eclipse-graphiti</id>
+ <url>http://download.eclipse.org/graphiti/updates/0.8.2</url>
+ <layout>p2</layout>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ </repository>
+
+ <repository>
+ <id>eclipse-emf</id>
+ <url>http://download.eclipse.org/modeling/emf/updates/releases/</url>
+ <layout>p2</layout>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ </repository>
+
+ <repository>
+ <id>eclipse-gef</id>
+ <url>http://download.eclipse.org/tools/gef/updates/releases/</url>
+ <layout>p2</layout>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ </repository>
+
+ </repositories>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <!-- need maven-findbugs-2.3.2-SNAPSHOT, see http://jira.codehaus.org/browse/MFINDBUGS-122
+ remove this when this version is released -->
+ <id>codehaus.snapshots</id>
+ <url>http://snapshots.repository.codehaus.org/</url>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-maven-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <extensions>true</extensions>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>target-platform-configuration</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <resolver>p2</resolver>
+ </configuration>
+ </plugin>
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>maven-osgi-compiler-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <encoding>UTF-8</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <!-- TODO remove workaround when https://issues.sonatype.org/browse/TYCHO-473
+ is fixed -->
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>maven-osgi-source-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <executions>
+ <execution>
+ <id>attach-source</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>plugin-source</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.4.1</version>
+ <configuration>
+ <encoding>ISO-8859-1</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.3</version>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <version>2.3.2-SNAPSHOT</version>
+ <configuration>
+ <findbugsXmlOutput>true</findbugsXmlOutput>
+ <failOnError>false</failOnError>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>check</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-pmd-plugin</artifactId>
+ <version>2.5</version>
+ <configuration>
+ <sourceEncoding>utf-8</sourceEncoding>
+ <minimumTokens>100</minimumTokens>
+ <targetJdk>1.5</targetJdk>
+ <format>xml</format>
+ <failOnViolation>false</failOnViolation>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>cpd-check</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+
+</project>