From a43d21eab5af09aee73dbbb75c86d0cf77d5c295 Mon Sep 17 00:00:00 2001
From: Nicolas PERANSIN
Date: Thu, 29 Feb 2024 09:05:39 +0100
Subject: [PATCH 1/9] Provide target platform for development.
---
BPMN-Designer.properties | 33 +++++++
.../org.obeonetwork.dsl.bpmn2.parent/.project | 6 ++
.../tpd/build.target | 60 +++++++++++++
.../tpd/build.tpd | 21 +++++
.../tpd/dev.tpd | 43 +++++++++
.../tpd/pom.xml | 28 ++++++
.../tpd/runtime.tpd | 90 +++++++++++++++++++
.../tpd/sdk.target | 70 +++++++++++++++
.../tpd/sdk.tpd | 24 +++++
.../tpd/test.tpd | 47 ++++++++++
10 files changed, 422 insertions(+)
create mode 100644 BPMN-Designer.properties
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.target
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.tpd
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/dev.tpd
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/pom.xml
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/runtime.tpd
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.target
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.tpd
create mode 100644 releng/org.obeonetwork.dsl.bpmn2.parent/tpd/test.tpd
diff --git a/BPMN-Designer.properties b/BPMN-Designer.properties
new file mode 100644
index 00000000..5c57d08e
--- /dev/null
+++ b/BPMN-Designer.properties
@@ -0,0 +1,33 @@
+#template = tycho;Eclipse2021-06;emf;emfTools
+template = emfTools
+
+
+# From Tycho
+project.java = 11
+project.copyright = Copyright (c) ${project.year} ${project.provider}. All rights reserved.
+
+# From EclipseXX
+eclipe.version = 2021-06
+
+# From emf
+project.ecoreuri = http://www.omg.org/spec/BPMN/20100524/MODEL-XMI
+validation.category = ${project.name}/validation
+
+
+project.name = BPMN2
+project.label = BPMN 2
+
+project.prefix = Bpmn
+project.extension = bpmn2
+
+project.fullname = org.obeonetwork.dsl.bpmn2
+project.fullpath = org/obeonetwork/dsl/bpmn2
+
+project.provider = OBEO
+project.license = Eclipse EPL 2.0
+
+# Name for configuration files. Example (Java Formatter, checkstyle, ...)
+project.profile = ObeoDev
+
+project.url = https://github.com/ObeoNetwork/BPMN-Designer
+
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/.project b/releng/org.obeonetwork.dsl.bpmn2.parent/.project
index 658287ce..8b1b853b 100644
--- a/releng/org.obeonetwork.dsl.bpmn2.parent/.project
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/.project
@@ -5,6 +5,11 @@
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
org.maven.ide.eclipse.maven2Builder
@@ -13,5 +18,6 @@
org.maven.ide.eclipse.maven2Nature
+ org.eclipse.xtext.ui.shared.xtextNature
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.target b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.target
new file mode 100644
index 00000000..4c63fe7c
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.target
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.tpd b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.tpd
new file mode 100644
index 00000000..dc7a27a0
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/build.tpd
@@ -0,0 +1,21 @@
+/*******************************************************************************
+
+ Copyright (c) 2024 OBEO. All rights reserved.
+
+ Contributors:
+ Obeo - initial API and implementation.
+
+ *******************************************************************************/
+target "BPMN-Designer - Build"
+
+// all classpath to compile and run tests
+
+with requirements
+
+environment JavaSE-11
+
+// Do not modify, do not include sources (useless)
+
+include "runtime.tpd"
+
+include "test.tpd"
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/dev.tpd b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/dev.tpd
new file mode 100644
index 00000000..e5b26470
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/dev.tpd
@@ -0,0 +1,43 @@
+/*******************************************************************************
+
+ Copyright (c) 2024 OBEO. All rights reserved.
+
+ Contributors:
+ Obeo - initial API and implementation.
+
+ *******************************************************************************/
+target "BPMN-Designer - Dev"
+
+//
+// Components used only in development env.
+//
+
+with requirements
+
+environment JavaSE-11
+
+
+location eclipse "https://download.eclipse.org/releases/2021-09/" {
+ org.eclipse.xtext.redist.feature.group
+}
+
+
+location sirius "https://download.eclipse.org/sirius/updates/releases/6.6.0/2020-09/" {
+
+ // Includes Odesign edit, Sirius interpreter view and Odesign reload
+ org.eclipse.sirius.specifier.ide.ui.feature.group
+ org.eclipse.sirius.specifier.ide.ui.aql.feature.group
+ org.eclipse.sirius.specifier.ide.ui.acceleo.feature.group
+ org.eclipse.sirius.specifier.properties.feature.feature.group
+
+ // Include 'Export diagram as ELK'
+ org.eclipse.sirius.diagram.elk.sdk.feature.feature.group
+}
+
+
+location modit "https://mypsycho.github.io/ModIt/releases/v1.2" {
+ org.mypsycho.emf.modit_feature.feature.group
+ org.mypsycho.emf.modit.sirius_feature.feature.group
+}
+
+
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/pom.xml b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/pom.xml
new file mode 100644
index 00000000..2f8d8438
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ 4.0.0
+
+ BPMN2
+ tpd
+ 1.0.0-SNAPSHOT
+ pom
+
+ Target Platform Id
+
+
+
+
+
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/runtime.tpd b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/runtime.tpd
new file mode 100644
index 00000000..c866459d
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/runtime.tpd
@@ -0,0 +1,90 @@
+/*******************************************************************************
+
+ Copyright (c) 2024 OBEO. All rights reserved.
+
+ Contributors:
+ Obeo - initial API and implementation.
+
+ *******************************************************************************/
+target "BPMN-Designer - Runtime"
+
+//
+// This target platform list dependencies to build project components.
+//
+
+with requirements
+// do not include source for this target
+// it should be used only by compiler
+
+// This target platform declare dependencies of components to be release
+
+
+location eclipse "https://download.eclipse.org/releases/2021-09/" {
+ org.eclipse.platform.feature.group
+ // includes rcp, e4.rcp, p2, osgi
+ // org.eclipse.equinox.sdk.feature.group
+
+ org.eclipse.epp.mpc.feature.group // Market Place
+
+ // JGit & EGit 5.4.0
+ org.eclipse.egit.feature.group // include jgit
+
+ org.eclipse.emf.feature.group
+ // Includes common, ecore.*,
+ // This includes codegen which drags jdt !
+
+ org.eclipse.emf.transaction.sdk.feature.group
+ // include validation.sdf, emf.workspace
+
+ org.eclipse.eef.sdk.feature.feature.group // no other feature for EEF-2
+ org.eclipse.eef.ext.widgets.reference.feature.feature.group
+
+ // BPMN is CDO based.
+ org.eclipse.emf.cdo // no feature. For CDO, less is best.
+
+}
+
+location Orbit-2020-09 "https://download.eclipse.org/tools/orbit/downloads/drops/R20190602212107/repository" {
+ // Because of low version, order matters for tycho (Don't know why).
+ com.google.guava [15.0.0,16.0.0) // Required by obeo bpmn
+ // BPMN uses sirius.legacy
+}
+
+
+
+location GMF-Notation-1.13.0 "https://download.eclipse.org/modeling/gmp/gmf-notation/updates/releases/R202004160913" {
+ org.eclipse.gmf.runtime.notation.sdk.feature.group
+}
+
+location GMF-Runtime-1.13.0 "https://download.eclipse.org/modeling/gmp/gmf-runtime/updates/releases/R202004160913" {
+ org.eclipse.gmf.runtime.sdk.feature.group
+ org.eclipse.gmf.runtime.thirdparty.feature.group
+}
+
+
+location sirius "https://download.eclipse.org/sirius/updates/releases/6.6.0/2020-09/" {
+ org.eclipse.acceleo.ui.interpreter.feature.group
+ org.eclipse.sirius.diagram.elk.feature.feature.group
+ org.eclipse.sirius.diagram.elk.sdk.feature.feature.group
+ org.eclipse.sirius.doc.feature.feature.group
+ org.eclipse.sirius.interpreter.feature.feature.group
+ org.eclipse.sirius.properties.feature.feature.group
+
+ org.eclipse.sirius.runtime.acceleo.feature.group
+ org.eclipse.sirius.runtime.aql.feature.group
+ org.eclipse.sirius.runtime.ide.eef.feature.group
+ org.eclipse.sirius.runtime.ide.ui.acceleo.feature.group
+ org.eclipse.sirius.runtime.ide.ui.feature.group
+ org.eclipse.sirius.runtime.ide.xtext.feature.group
+ org.eclipse.sirius.runtime.feature.group
+}
+
+
+location eclipse_license "https://download.eclipse.org/cbi/updates/license" {
+ org.eclipse.license.feature.group
+}
+
+
+location sirius_legacy "https://download.eclipse.org/sirius/updates/legacy/" {
+ org.eclipse.sirius.query.legacy.feature.feature.group
+}
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.target b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.target
new file mode 100644
index 00000000..1f0555c7
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.target
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.tpd b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.tpd
new file mode 100644
index 00000000..a735072e
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/sdk.tpd
@@ -0,0 +1,24 @@
+/*******************************************************************************
+
+ Copyright (c) 2024 OBEO. All rights reserved.
+
+ Contributors:
+ Obeo - initial API and implementation.
+
+ *******************************************************************************/
+target "BPMN-Designer - SDK"
+
+//
+// Target platform for development
+//
+
+// It includes source of dependencies and plugins to launch a client runtime
+
+with requirements, source
+// Source is transitive to all included elements.
+
+environment JavaSE-11
+
+include "build.tpd"
+
+include "dev.tpd"
diff --git a/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/test.tpd b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/test.tpd
new file mode 100644
index 00000000..0ff58669
--- /dev/null
+++ b/releng/org.obeonetwork.dsl.bpmn2.parent/tpd/test.tpd
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2021 TNO/ESI
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available aBPMN-Designerhttps://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * TNO/ESI - initial API and implementation
+ * Obeo - refactoring
+ *******************************************************************************/
+target "BPMN-Designer - Test"
+
+//
+// Dependencies for tests executions
+//
+
+with requirements
+// do not include source for this target
+// it should be used only by compiler
+
+// This target platform declare dependencies only used by automatic tests
+
+location eclipse "https://download.eclipse.org/releases/2021-09/" {
+
+ // Required for tooling in xtend
+ // Included org.eclipse.xtext.sdk.feature.group
+ // org.eclipse.xtext.xbase.feature.group
+ // org.eclipse.xtext.redist.feature.group
+
+ // org.eclipse.platform.feature.group (in runtime)
+ // +-> org.eclipse.ui.ide.application (default of sure-fire)
+
+ org.junit
+
+ org.eclipse.pde.feature.group
+ // +-> org.eclipse.pde.junit
+
+}
+
+location sirius "https://download.eclipse.org/sirius/updates/releases/6.6.0/2020-09/" {
+ org.eclipse.sirius.tests.support.feature.group
+ org.eclipse.sirius.tests.feature.group
+}
+
+
From 2172d6c3c7a631aeea47c62a6f4df0600db6b0ba Mon Sep 17 00:00:00 2001
From: Nicolas PERANSIN
Date: Thu, 29 Feb 2024 09:25:39 +0100
Subject: [PATCH 2/9] Add tool to analyse VSM.
---
.../obeonetwork/bpmn2/design/Activator.java | 33 +-
.../.classpath | 12 +
.../.project | 34 ++
.../org.eclipse.core.resources.prefs | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 391 ++++++++++++++++++
.../.settings/org.eclipse.jdt.ui.prefs | 81 ++++
.../.settings/org.eclipse.pde.prefs | 35 ++
.../org.eclipse.xtend.core.Xtend.prefs | 52 +++
.../META-INF/MANIFEST.MF | 21 +
.../build.properties | 6 +
.../launch/BpmnDesignReverse.launch | 44 ++
.../pom.xml | 19 +
.../dsl/bpmn2/design/tool/DesignReverse.xtend | 55 +++
.../bpmn2/design/tool/DesignToolBase.xtend | 25 ++
.../design/tool/DesignVerification.xtend | 36 ++
15 files changed, 821 insertions(+), 25 deletions(-)
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/.classpath
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/.project
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.core.resources.prefs
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.core.prefs
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.ui.prefs
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.pde.prefs
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.xtend.core.Xtend.prefs
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/META-INF/MANIFEST.MF
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/build.properties
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignReverse.launch
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/pom.xml
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignReverse.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignToolBase.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignVerification.xtend
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java
index d9d6a9ca..6797d053 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2011-2019 Obeo.
+ * Copyright (c) 2011-2024 Obeo.
* 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
@@ -11,13 +11,11 @@
*/
package org.obeonetwork.bpmn2.design;
-import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
-import org.eclipse.sirius.viewpoint.description.Viewpoint;
-
-import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.Status;
+import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
+import org.eclipse.sirius.viewpoint.description.Viewpoint;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
@@ -27,41 +25,26 @@
public class Activator extends AbstractUIPlugin {
// The plug-in ID
public static final String PLUGIN_ID = "org.obeonetwork.dsl.bpmn2.design";
-
+ public static final String DESIGN_PATH = PLUGIN_ID + "/description/BPMN2.odesign";
// The shared instance
private static Activator plugin;
- private static Set viewpoints;
+ private Set viewpoints;
- /**
- * The constructor
- */
- public Activator() {
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
- */
+ @Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
- viewpoints = new HashSet();
- viewpoints.addAll(ViewpointRegistry.getInstance().registerFromPlugin(
- PLUGIN_ID + "/description/BPMN2.odesign"));
+ viewpoints = ViewpointRegistry.getInstance().registerFromPlugin(DESIGN_PATH);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
- */
+ @Override
public void stop(BundleContext context) throws Exception {
plugin = null;
if (viewpoints != null) {
for (final Viewpoint viewpoint : viewpoints) {
ViewpointRegistry.getInstance().disposeFromPlugin(viewpoint);
}
- viewpoints.clear();
viewpoints = null;
}
super.stop(context);
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.classpath b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.classpath
new file mode 100644
index 00000000..6f4b9576
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.classpath
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.project b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.project
new file mode 100644
index 00000000..c15ba751
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.project
@@ -0,0 +1,34 @@
+
+
+ org.obeonetwork.dsl.bpmn2.design.tool
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.xtext.ui.shared.xtextNature
+ org.eclipse.pde.PluginNature
+
+
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.core.resources.prefs b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000..99f26c02
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.core.prefs b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..c5538665
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,391 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=20
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=80
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=20
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=20
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=20
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=53
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=49
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=80
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=20
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=20
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=84
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=32
+org.eclipse.jdt.core.formatter.alignment_for_record_components=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=20
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=20
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=20
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=20
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=80
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=80
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=80
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=32
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=80
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=2
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=true
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=90
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=false
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_if_empty
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=100
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.text_block_indentation=2
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.ui.prefs b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000..cf0a3eb8
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,81 @@
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_IRT-SystemX
+formatter_settings_version=19
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * Returns the ${bare_field_name}.\r\n *\r\n * @return the ${bare_field_name}\r\n *//**\r\n * Sets the ${bare_field_name}.\r\n *\r\n * @param ${param} the value to set\r\n *//**\r\n * Default constructor.\r\n * <p>\r\n * Details on arguments.\r\n * </p>\r\n *\r\n * ${tags}\r\n *//*******************************************************************************\r\n * Copyright (c) ${year} IRT-SystemX. All rights reserved.\r\n *\r\n * Contributors\:\r\n * Obeo - initial API and implementation\r\n *******************************************************************************//**\r\n * ${type_name} of ${project_name}.\r\n * <p>\r\n * \r\n * </p>\r\n *\r\n * @author ${user}\r\n * ${tags}\r\n *//** The ${field}. *//**\r\n * Does some actions.\r\n * <p>\r\n * Details of behavior.\r\n * </p>\r\n *\r\n * ${tags}\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n *//**\r\n * Wraps ${enclosing_method}.\r\n * <p>\r\n * Supplementary behavior.\r\n * </p>\r\n *\r\n * ${tags}\r\n * ${see_to_target}\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n\r\n\r\n// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();\r\n// ${todo} Auto-generated method stub\r\n${body_statement}\r\n${body_statement}\r\n// ${todo} Auto-generated constructor stub\r\nreturn ${field};${field} \= ${param};
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=true
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.lazy_logical_operator=true
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.merge_conditional_blocks=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.number_suffix=false
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.push_down_negation=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=true
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_array_creation=true
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=false
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=false
+sp_cleanup.remove_unused_private_types=false
+sp_cleanup.simplify_lambda_expression_and_method_ref=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_autoboxing=true
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_directly_map_method=true
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_unboxing=true
+sp_cleanup.use_var=false
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.pde.prefs b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000..8b287ce1
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.exec-env-too-low=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=2
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=0
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.xtend.core.Xtend.prefs b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 00000000..b6a302e9
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,52 @@
+BuilderConfiguration.is_project_specific=true
+autobuilding=true
+blank.line.around.expressions=0
+blank.lines.after.imports=1
+blank.lines.after.last.member=1
+blank.lines.after.packagedecl=1
+blank.lines.before.first.member=1
+blank.lines.between.classes=1
+blank.lines.between.enum.literals=0
+blank.lines.between.fields=0
+blank.lines.between.fields.and.methods=1
+blank.lines.between.imports=0
+blank.lines.between.methods=1
+braces.in.new.line=false
+eclipse.preferences.version=1
+generateGeneratedAnnotation=false
+generateSuppressWarnings=true
+generatedAnnotationComment=
+includeDateInGenerated=false
+indentation=\t
+indentation.length=-1
+keep.one.line.methods=true
+line.separator=\r\n
+line.width.max=100
+newline.after.class.annotations=false
+newline.after.constructor.annotations=true
+newline.after.field.annotations=true
+newline.after.method.annotations=true
+newline.after.parameter.annotations=false
+org.eclipse.xtend.core.Xtend.useProjectSettings=true
+org.eclipse.xtend.formatter.version=1
+org.eclipse.xtend.ide.default.eclipse_profile=%inject:project.profile%
+outlet.DEFAULT_OUTPUT.cleanDirectory=false
+outlet.DEFAULT_OUTPUT.cleanupDerived=true
+outlet.DEFAULT_OUTPUT.createDirectory=true
+outlet.DEFAULT_OUTPUT.derived=true
+outlet.DEFAULT_OUTPUT.directory=target/xtend-gen
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.keepLocalHistory=false
+outlet.DEFAULT_OUTPUT.override=true
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=
+outlet.DEFAULT_OUTPUT.sourceFolder.src.ignore=
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.ignore=
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=
+preserve.blank.lines=1
+preserve.new.lines=true
+tab.width=4
+targetJavaVersion=JAVA5
+useJavaCompilerCompliance=true
+whitespace.between.keyword.and.parenthesis=true
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/META-INF/MANIFEST.MF b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/META-INF/MANIFEST.MF
new file mode 100644
index 00000000..e4eb4554
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.obeonetwork.dsl.bpmn2.design.tool;singleton:=true
+Automatic-Module-Name: org.obeonetwork.dsl.bpmn2.design.tool
+Bundle-Version: 1.0.0.qualifier
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Fragment-Host: org.obeonetwork.dsl.bpmn2.design
+Require-Bundle:
+ org.mypsycho.emf.modit,
+ org.mypsycho.emf.modit.sirius,
+ org.eclipse.xtext.xbase,
+ org.eclipse.xtend.lib.macro,
+ org.eclipse.xtend.lib,
+ org.junit,
+ org.apache.commons.lang,
+ org.eclipse.core.runtime,
+ org.eclipse.sirius.properties.ext.widgets.reference,
+ org.eclipse.sirius.properties
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/build.properties b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/build.properties
new file mode 100644
index 00000000..5c319c17
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/build.properties
@@ -0,0 +1,6 @@
+source.. = src/,\
+ target/xtend-gen/
+output.. = target/jdt-classes
+
+bin.includes = META-INF/,\
+ .
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignReverse.launch b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignReverse.launch
new file mode 100644
index 00000000..5e473414
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignReverse.launch
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/pom.xml b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/pom.xml
new file mode 100644
index 00000000..d327262c
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ 4.0.0
+
+
+ org.obeonetwork.dsl.bpmn2
+ 1.0.0-SNAPSHOT
+
+ org.obeonetwork.dsl.bpmn2.design.tool
+ pom
+ BPMN2 Design Tools
+
+
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignReverse.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignReverse.xtend
new file mode 100644
index 00000000..7779a538
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignReverse.xtend
@@ -0,0 +1,55 @@
+package org.obeonetwork.dsl.bpmn2.design.tool
+
+import java.nio.file.Path
+import java.nio.file.Paths
+import java.util.Map
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.resource.ResourceSet
+import org.eclipse.sirius.viewpoint.description.Group
+import org.junit.Test
+import org.mypsycho.modit.emf.sirius.tool.SiriusReverseIt
+import org.obeonetwork.bpmn2.design.Activator
+import org.obeonetwork.dsl.bpmn2.Bpmn2Package
+
+/**
+ * Tool to reverse Sirius design model from '*.design' plugin.
+ *
+ * Reverse is required when model is modified directly to compare difference with
+ * generated model.
+ *
+ *
+ * @author nperansin
+ *
+ */
+class DesignReverse extends DesignToolBase {
+
+ static val EDITED_PKGS = #[
+ Bpmn2Package.eINSTANCE
+ ]
+
+ @Test
+ def void reverseModel() {
+ SiriusReverseIt.loadSiriusGroup(Activator.DESIGN_PATH)
+ .createSiriusReverseIt(
+ Paths.get(REVERSE_PATH),
+ "org.obeonetwork.dsl.bpmn2.design.description.BpmnDesign"
+ ).perform
+ }
+
+ static def createSiriusReverseIt(Group content, Path dir, String classname) {
+ new SiriusReverseIt(
+ content,
+ dir,
+ classname,
+ EDITED_PKGS
+ ) {
+
+ override addExplicitExtras(ResourceSet rs, Map extras) {
+ // Add convenient name here from other depeding VSM
+ // extras += SiriusDependencies.getDependencyExtras(, rs, vsmGroup>)
+ }
+ }
+ }
+
+
+}
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignToolBase.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignToolBase.xtend
new file mode 100644
index 00000000..b7a0ddff
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignToolBase.xtend
@@ -0,0 +1,25 @@
+package org.obeonetwork.dsl.bpmn2.design.tool
+
+import org.obeonetwork.bpmn2.design.Activator
+import java.nio.file.Paths
+
+/**
+ * Common elements for tool of dynamic Design model of '*.sirius' plugin.
+ *
+ * @author Obeo
+ */
+class DesignToolBase {
+
+ // Specific
+ protected static val PLUGINS_PATH = "../../plugins"
+
+ protected static val REVERSE_PATH = "target/rvs"
+
+ // Derived
+ protected static val ODESIGN_FILE = Paths.get(PLUGINS_PATH)
+ // /!\ File path matches java bundle path.
+ .resolve(Activator.DESIGN_PATH)
+ .toAbsolutePath
+
+
+}
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignVerification.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignVerification.xtend
new file mode 100644
index 00000000..5e57d0e9
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignVerification.xtend
@@ -0,0 +1,36 @@
+package org.obeonetwork.dsl.bpmn2.design.tool
+
+import org.obeonetwork.bpmn2.design.Activator
+import java.util.Collections
+import org.eclipse.emf.common.util.URI
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
+import org.eclipse.sirius.viewpoint.description.Group
+import org.junit.Test
+import org.mypsycho.modit.emf.sirius.tool.ODesignVerifications
+
+/**
+ * Tool to generate Sirius design model in 'sirius' plugin.
+ *
+ * Tool also reverse the created model to allows round-trip when design file is modified
+ * directly.
+ *
+ *
+ * @author nperansin
+ */
+class DesignVerification extends DesignToolBase {
+
+ // val resBundle = Platform.getResourceBundle(Activator.^default.bundle)
+
+
+ @Test
+ def void verifyDesign() throws Exception {
+
+ val res = new ResourceSetImpl()
+ .createResource(URI.createPlatformPluginURI(Activator.DESIGN_PATH, true))
+ res.load(Collections.emptyMap)
+ val content = res.contents.head as Group
+
+ ODesignVerifications.printValidation(content.name, content)
+ }
+
+}
From be888c623b77ed6763354a2a9a92531f985a8686 Mon Sep 17 00:00:00 2001
From: Nicolas PERANSIN
Date: Thu, 29 Feb 2024 13:41:47 +0100
Subject: [PATCH 3/9] Clean ODesign using retro-analysis.
- Apply localization on Task name in conversion.
- Fix Event label.
- Unify names for pages and page groups.
---
.../description/BPMN2.odesign | 254 ++-
.../plugin.properties | 9 +-
.../plugin_fr.properties | 9 +-
.../launch/BpmnDesignGeneration.launch | 44 +
.../bpmn2/design/description/BpmnDesign.xtend | 78 +
.../design/description/BpmnDiagram.xtend | 1083 +++++++++++
.../description/CollaborationDiagram.xtend | 1551 +++++++++++++++
.../GlobalTaskDefinitionsEditionTable.xtend | 69 +
.../ProcessDefinitionsEditionTable.xtend | 67 +
.../design/description/ProcessDiagram.xtend | 1447 ++++++++++++++
.../description/SubProcessDiagram.xtend | 1715 +++++++++++++++++
.../bpmn2/design/tool/DesignGeneration.xtend | 60 +
12 files changed, 6250 insertions(+), 136 deletions(-)
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignGeneration.launch
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/CollaborationDiagram.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/GlobalTaskDefinitionsEditionTable.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDefinitionsEditionTable.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDiagram.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/SubProcessDiagram.xtend
create mode 100644 toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignGeneration.xtend
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign b/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
index 980ebc12..1f778e27 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
@@ -1,8 +1,8 @@
-
+
-
-
+
+
@@ -132,7 +132,7 @@
-
+
@@ -349,7 +349,7 @@
-
+
@@ -357,7 +357,7 @@
-
+
@@ -365,7 +365,7 @@
-
+
@@ -373,7 +373,7 @@
-
+
@@ -381,7 +381,7 @@
-
+
@@ -389,7 +389,7 @@
-
+
@@ -397,7 +397,7 @@
-
+
@@ -405,7 +405,7 @@
-
+
@@ -596,28 +596,28 @@
-
+
-
+
-
+
-
+
@@ -1034,15 +1034,15 @@
-
-
+
+
-
+
@@ -1073,15 +1073,15 @@
-
-
+
+
-
+
@@ -1096,7 +1096,7 @@
-
+
@@ -1121,7 +1121,7 @@
-
+
@@ -1131,8 +1131,8 @@
-
-
+
+
@@ -1169,8 +1169,8 @@
-
-
+
+
@@ -1345,7 +1345,7 @@
-
+
@@ -1388,7 +1388,7 @@
-
+
@@ -1611,9 +1611,7 @@
-
-
@@ -1625,7 +1623,7 @@
-
+
@@ -1683,8 +1681,8 @@
-
-
+
+
@@ -1806,7 +1804,7 @@
-
+
@@ -1978,7 +1976,7 @@
-
+
@@ -1986,7 +1984,7 @@
-
+
@@ -1994,7 +1992,7 @@
-
+
@@ -2002,7 +2000,7 @@
-
+
@@ -2010,7 +2008,7 @@
-
+
@@ -2018,7 +2016,7 @@
-
+
@@ -2026,7 +2024,7 @@
-
+
@@ -2034,7 +2032,7 @@
-
+
@@ -2102,7 +2100,7 @@
-
+
@@ -2137,7 +2135,7 @@
-
+
@@ -2155,7 +2153,7 @@
-
+
@@ -2165,8 +2163,8 @@
-
-
+
+
@@ -2203,8 +2201,8 @@
-
-
+
+
@@ -2236,7 +2234,7 @@
-
+
@@ -2251,7 +2249,7 @@
-
+
@@ -2459,9 +2457,7 @@
-
-
@@ -2689,35 +2685,35 @@
-
+
-
+
-
+
-
+
-
+
@@ -3108,7 +3104,7 @@
-
+
@@ -3126,16 +3122,16 @@
-
-
-
+
+
+
-
+
@@ -3165,16 +3161,16 @@
-
-
-
+
+
+
-
+
@@ -3189,7 +3185,7 @@
-
+
@@ -3214,7 +3210,7 @@
-
+
@@ -3224,8 +3220,8 @@
-
-
+
+
@@ -3262,8 +3258,8 @@
-
-
+
+
@@ -3438,7 +3434,7 @@
-
+
@@ -3483,7 +3479,7 @@
-
+
@@ -3515,7 +3511,7 @@
-
+
@@ -3586,18 +3582,19 @@
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -3606,9 +3603,9 @@
-
-
-
+
+
+
@@ -3618,12 +3615,13 @@
-
+
+
-
-
-
+
+
+
@@ -3631,9 +3629,9 @@
-
-
-
+
+
+
@@ -3641,9 +3639,9 @@
-
-
-
+
+
+
@@ -3651,9 +3649,9 @@
-
-
-
+
+
+
@@ -3662,8 +3660,8 @@
-
-
+
+
@@ -3906,7 +3904,7 @@
-
+
@@ -3914,7 +3912,7 @@
-
+
@@ -3922,7 +3920,7 @@
-
+
@@ -3930,7 +3928,7 @@
-
+
@@ -3938,7 +3936,7 @@
-
+
@@ -3946,7 +3944,7 @@
-
+
@@ -3954,7 +3952,7 @@
-
+
@@ -3962,7 +3960,7 @@
-
+
@@ -4129,28 +4127,28 @@
-
+
-
+
-
+
-
+
@@ -4567,15 +4565,15 @@
-
-
+
+
-
+
@@ -4606,15 +4604,15 @@
-
-
+
+
-
+
@@ -4629,7 +4627,7 @@
-
+
@@ -4654,7 +4652,7 @@
-
+
@@ -4664,8 +4662,8 @@
-
-
+
+
@@ -4702,8 +4700,8 @@
-
-
+
+
@@ -4878,7 +4876,7 @@
-
+
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/plugin.properties b/plugins/org.obeonetwork.dsl.bpmn2.design/plugin.properties
index 8a853229..a7a578f7 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/plugin.properties
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/plugin.properties
@@ -21,12 +21,13 @@ Other=Other
ToggleCollapse=Toggle collapse
LanesAutosize=Lanes autosize
ConvertTaskTo=Convert Task to...
+ConvertGatewayTo=Convert Gateway to...
Paste=Paste
-Start=Start
-End=End
-IntermediateCatch=Intermediate Catch
-IntermediateThrow=Intermediate Throw
+StartEvent=Start
+EndEvent=End
+IntermediateCatchEvent=Intermediate Catch
+IntermediateThrowEvent=Intermediate Throw
Boundary=Boundary
Message=Message
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/plugin_fr.properties b/plugins/org.obeonetwork.dsl.bpmn2.design/plugin_fr.properties
index 2a577c68..556c4040 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/plugin_fr.properties
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/plugin_fr.properties
@@ -21,12 +21,13 @@ Other=Autres
ToggleCollapse=Plier/Déplier
LanesAutosize=Redimensionnement automatique des lanes
ConvertTaskTo=Convertir la tâche en...
+ConvertGatewayTo=Convertir la porte logique en...
Paste=Coller
-Start=Début
-End=Fin
-IntermediateCatch=Réception intermédiaire
-IntermediateThrow=Envoi intermédiaire
+StartEvent=Début
+EndEvent=Fin
+IntermediateCatchEvent=Réception intermédiaire
+IntermediateThrowEvent=Envoi intermédiaire
Boundary=Borne
Message=Message
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignGeneration.launch b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignGeneration.launch
new file mode 100644
index 00000000..2ab3c7b0
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/launch/BpmnDesignGeneration.launch
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend
new file mode 100644
index 00000000..49241084
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend
@@ -0,0 +1,78 @@
+package org.obeonetwork.dsl.bpmn2.design.description
+
+import org.eclipse.sirius.common.tools.api.interpreter.StandardServices
+import org.eclipse.sirius.properties.DialogButton
+import org.eclipse.sirius.viewpoint.description.Group
+import org.eclipse.sirius.viewpoint.description.UserColorsPalette
+import org.eclipse.sirius.viewpoint.description.Viewpoint
+import org.eclipse.sirius.viewpoint.description.tool.InitialOperation
+import org.mypsycho.modit.emf.sirius.api.SiriusVpGroup
+import org.obeonetwork.bpmn2.design.ElementsPositionService
+import org.obeonetwork.bpmn2.design.ExpandCollapseService
+import org.obeonetwork.bpmn2.design.NamingService
+import org.obeonetwork.bpmn2.design.ProcessService
+import org.obeonetwork.bpmn2.design.ServiceHelper
+import org.obeonetwork.bpmn2.design.TaskService
+import org.obeonetwork.dsl.bpmn2.Bpmn2Package
+
+class BpmnDesign extends SiriusVpGroup {
+
+ new () {
+ businessPackages += #[
+ Bpmn2Package.eINSTANCE
+ ]
+ }
+
+ override initContent(Group it) {
+ name = "BPMN20"
+ version = "12.0.0.2017041100"
+ ownedViewpoints += Viewpoint.create [
+ name = "Process"
+ label = "BPMN 2.0 - Process"
+ modelFileExtension = "bpmn"
+ owned(ProcessDiagram)
+ owned(CollaborationDiagram)
+ owned(ProcessDefinitionsEditionTable)
+ owned(GlobalTaskDefinitionsEditionTable)
+ owned(SubProcessDiagram)
+ use(ElementsPositionService)
+ use(ExpandCollapseService)
+ use(TaskService)
+ // use(FlowNodeService)
+ use(StandardServices)
+ use(ProcessService)
+ use(NamingService)
+ use(ServiceHelper)
+ ]
+ .onAssembled[
+ // Hack for comparison
+ eAllContents
+ .filter(DialogButton)
+ .filter[ initialOperation === null]
+ .forEach[
+ initialOperation = InitialOperation.create
+ ]
+ ]
+ userColorsPalettes += UserColorsPalette.create [
+ name = "Colors"
+ entries += "LaneBackgroundRight".color(255, 255, 255)
+ entries += "LightYellow".color(255, 249, 225)
+ entries += "Yellow".color(255, 243, 171)
+ entries += "DarkYellow".color(245, 233, 73)
+ entries += "SequenceFlowColor".color(125, 125, 125)
+ entries += "MessageFlowColor".color(125, 125, 125)
+ entries += "AssociationLinkColor".color(176, 176, 176)
+ entries += "TaskBorder".color(255, 243, 171)
+ entries += "TaskBackgroundLeft".color(255, 243, 171)
+ entries += "TaskBackgroundRight".color(255, 243, 171)
+ entries += "TextBackground".color(64, 41, 0)
+ entries += "GlobalTaskBackground".color(238, 250, 255)
+ entries += "ParticipantBackgroundRight".color(255, 255, 255)
+ entries += "ParticipantBackgroundLeft".color(172, 226, 253)
+ entries += "ParticipantBorder".color(133, 200, 250)
+ ]
+ }
+
+ def context() { this }
+
+}
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
new file mode 100644
index 00000000..03c63178
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
@@ -0,0 +1,1083 @@
+/*******************************************************************************
+ * Copyright (c) 2024 IRT-SystemX. All rights reserved.
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.obeonetwork.dsl.bpmn2.design.description
+
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.sirius.diagram.ResizeKind
+import org.eclipse.sirius.diagram.description.Layer
+import org.eclipse.sirius.diagram.description.NodeMapping
+import org.eclipse.sirius.diagram.description.style.WorkspaceImageDescription
+import org.eclipse.sirius.diagram.description.tool.DirectEditLabel
+import org.eclipse.sirius.diagram.description.tool.NodeCreationDescription
+import org.eclipse.sirius.diagram.description.tool.NodeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.ToolGroup
+import org.eclipse.sirius.diagram.description.tool.ToolSection
+import org.eclipse.sirius.properties.AbstractTextDescription
+import org.eclipse.sirius.properties.DialogButton
+import org.eclipse.sirius.properties.DialogModelOperation
+import org.eclipse.sirius.properties.GroupDescription
+import org.eclipse.sirius.properties.PageDescription
+import org.eclipse.sirius.properties.TextAreaDescription
+import org.eclipse.sirius.properties.TextDescription
+import org.eclipse.sirius.viewpoint.description.SystemColor
+import org.eclipse.sirius.viewpoint.description.UserFixedColor
+import org.eclipse.sirius.viewpoint.description.tool.ContainerViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementSelectVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.InitialOperation
+import org.eclipse.sirius.viewpoint.description.tool.ModelOperation
+import org.eclipse.sirius.viewpoint.description.tool.OperationAction
+import org.eclipse.sirius.viewpoint.description.tool.PopupMenu
+import org.eclipse.sirius.viewpoint.description.tool.SelectContainerVariable
+import org.eclipse.sirius.viewpoint.description.tool.SelectionWizardDescription
+import org.eclipse.sirius.viewpoint.description.tool.ToolDescription
+import org.eclipse.sirius.viewpoint.description.tool.Unset
+import org.mypsycho.modit.emf.sirius.api.SiriusDiagram
+import org.obeonetwork.dsl.bpmn2.BaseElement
+import org.obeonetwork.dsl.bpmn2.Event
+import org.obeonetwork.dsl.bpmn2.FlowNode
+
+import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.*
+import org.eclipse.sirius.viewpoint.description.tool.CreateInstance
+
+/**
+ * BpmnDiagram of org.obeonetwork.dsl.bpmn2.design.tool.
+ *
+ *
+ *
+ *
+ * @author nperansin
+ */
+abstract class BpmnDiagram extends SiriusDiagram {
+
+ new(BpmnDesign parent, String dName, String dLabel, Class extends EObject> domain) {
+ super(parent, dName, dLabel, domain)
+ }
+
+ protected def setOperation(AbstractTextDescription it, ModelOperation value) {
+ initialOperation = value.toTool
+ }
+
+ def customImage(String iconPart, String... nodes) {
+ "workspacePath".attCustomization(
+ "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/" + iconPart + ".svg",
+ nodes.map[
+ WorkspaceImageDescription.localRef(Ns.node, it) [
+ (it as NodeMapping).style as WorkspaceImageDescription
+ ]
+ ]
+ )
+ }
+
+
+ def customizeBpmnNodeStyles(Layer it) {
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CancelEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/cancel",
+ "StartEvent"
+ ),
+ customImage("end-event/cancel",
+ "EndEvent"
+ ),
+ customImage("catch-event/cancel",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/cancel",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/cancel",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/cancel",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CompensateEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/compensation",
+ "StartEvent"
+ ),
+ customImage("end-event/compensation",
+ "EndEvent"
+ ),
+ customImage("catch-event/compensation",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/compensation",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/compensation",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/compensation",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ConditionalEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/conditional",
+ "StartEvent"
+ ),
+ customImage("end-event/conditional",
+ "EndEvent"
+ ),
+ customImage("catch-event/conditional",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/conditional",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/conditional",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/conditional",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ErrorEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/error",
+ "StartEvent"
+ ),
+ customImage("end-event/error",
+ "EndEvent"
+ ),
+ customImage("catch-event/error",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/error",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/error",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/error",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::EscalationEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/escalation",
+ "StartEvent"
+ ),
+ customImage("end-event/escalation",
+ "EndEvent"
+ ),
+ customImage("catch-event/escalation",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/escalation",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/escalation",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/escalation",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::LinkEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/link",
+ "StartEvent"
+ ),
+ customImage("end-event/link",
+ "EndEvent"
+ ),
+ customImage("catch-event/link",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/link",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/link",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/link",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::MessageEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/message",
+ "StartEvent"
+ ),
+ customImage("end-event/message",
+ "EndEvent"
+ ),
+ customImage("catch-event/message",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/message",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/message",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/message",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::SignalEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/signal",
+ "StartEvent"
+ ),
+ customImage("end-event/signal",
+ "EndEvent"
+ ),
+ customImage("catch-event/signal",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/signal",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/signal",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/signal",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TerminateEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/terminate",
+ "StartEvent"
+ ),
+ customImage("end-event/terminate",
+ "EndEvent"
+ ),
+ customImage("catch-event/terminate",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/terminate",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/terminate",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/terminate",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TimerEventDefinition)'''.trimAql.thenStyle(
+ customImage("start-event/timer",
+ "StartEvent"
+ ),
+ customImage("end-event/timer",
+ "EndEvent"
+ ),
+ customImage("catch-event/timer",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/timer",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/timer",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/timer",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CancelEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/cancel",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/cancel",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CompensateEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/compensation",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/compensation",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ConditionalEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/conditional",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/conditional",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ErrorEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/error",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/error",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::EscalationEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/escalation",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/escalation",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::LinkEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/link",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/link",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::MessageEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/message",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/message",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::SignalEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/signal",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/signal",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TerminateEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/terminate",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/terminate",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TimerEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/timer",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/timer",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and not self.parallelMultiple'''.trimAql.thenStyle(
+ customImage("start-event/multiple",
+ "StartEvent"
+ ),
+ customImage("end-event/multiple",
+ "EndEvent"
+ ),
+ customImage("catch-event/multiple",
+ "IntermediateCatchEvent"
+ ),
+ customImage("throw-event/multiple",
+ "IntermediateThrowEvent"
+ ),
+ customImage("boundary-events/multiple",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/multiple",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.parallelMultiple'''.trimAql.thenStyle(
+ customImage("start-event/mi.parallel",
+ "StartEvent"
+ ),
+ customImage("catch-event/multiple.parallel",
+ "IntermediateCatchEvent"
+ ),
+ customImage("boundary-events/multiple.parallel",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-boundary-events/multiple.parallel",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and not self.parallelMultiple and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/multiple",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/multiple",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.parallelMultiple and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/multiple.parallel",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/multiple.parallel",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==0 and not self.cancelActivity'''.trimAql.thenStyle(
+ customImage("non-interrupting-boundary-events/none",
+ "TaskBorderOnCallActivity_Process",
+ "TaskBorderOnCallActivity_Task",
+ "TaskBorder"
+ ),
+ customImage("sub-process-non-interrupting-boundary-events/none",
+ "TaskBorderOnSubProcess"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.oclIsTypeOf(bpmn2::EndEvent)'''.trimAql.thenStyle(
+ customImage("end-event/multiple",
+ "EndEvent"
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.oclIsTypeOf(bpmn2::IntermediateThrowEvent)'''.trimAql.thenStyle(
+ customImage("throw-event/multiple",
+ "IntermediateThrowEvent"
+ )
+ )
+ styleCustomisations += '''self.instantiate and self.eventGatewayType=bpmn2::EventBasedGatewayType::Parallel'''.trimAql.thenStyle(
+ customImage("gateway/parallel-start-event-based-gateway",
+ "EventBasedGateway"
+ )
+ )
+ styleCustomisations += '''self.instantiate and self.eventGatewayType=bpmn2::EventBasedGatewayType::Exclusive'''.trimAql.thenStyle(
+ customImage("gateway/start-event-based-gateway",
+ "EventBasedGateway"
+ )
+ )
+ // Empty customisation ??
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CancelEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/cancel.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CompensateEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/compensation.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ConditionalEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/conditional.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ErrorEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/error.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::EscalationEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/escalation.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::LinkEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/link.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::MessageEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/message.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::SignalEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/signal.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TerminateEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/terminate.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TimerEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/timer.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and not self.parallelMultiple and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/multiple.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.parallelMultiple and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/mi.parallel.svg")
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==0 and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/start.svg")
+ )
+ }
+
+ def createObjectNode(Class extends BaseElement> nodeType, String candidates, String svgIcon) {
+ NodeMapping.createAs(Ns.node, nodeType.simpleName) [
+ domainClass = "bpmn2." + nodeType.simpleName // OLD notation
+ semanticCandidatesExpression = candidates
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ resizeKind = ResizeKind.NSEW_LITERAL
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/" + svgIcon + ".svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ }
+
+ def createFlowNode(Class extends FlowNode> nodeType, String svgIcon) {
+ nodeType.createObjectNode(
+ '''self.getFlowNodeElements('«nodeType.simpleName»')'''.trimAql, svgIcon
+ ).andThen[
+ style.andThen[
+ resizeKind = ResizeKind.NONE_LITERAL
+ ]
+ ]
+ }
+
+ def createEventNode(Class extends Event> nodeType, String svgIcon) {
+ nodeType.createFlowNode(svgIcon).andThen[
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ ]
+ }
+
+
+ def createGatewayNode(Class extends FlowNode> nodeType, String nodeLabel, String svgIcon) {
+ nodeType.createFlowNode("gateway/" + svgIcon).andThen[
+ label = nodeLabel
+ style.andThen[
+ sizeComputationExpression = "4"
+ ]
+ ]
+ }
+
+ def createInitDialog(String type) {
+ DialogModelOperation.create [
+ titleExpression = "service:getPropertiesTitle()"
+ buttons += DialogButton.create [
+ labelExpression = "service:getCancelLabel()"
+ closeDialogOnClick = true
+ rollbackChangesOnClose = true
+ // no operation
+ ]
+ buttons += DialogButton.create [
+ labelExpression = "OK"
+ ^default = true
+ closeDialogOnClick = true
+ // no operation
+ ]
+ val editGroup = GroupDescription.create(type + "Group") [
+ labelExpression = "service:getAttributesLabel()"
+ domainClass = "bpmn2::" + type
+ semanticCandidateExpression = "var:self"
+ controls += TextDescription.create(type + "Name") [
+ labelExpression = "service:getNameLabel()"
+ helpExpression = "service:getHelpNameLabel()"
+ operation = "var:self".toContext(
+ "name".setter("var:newValue")
+ )
+ ]
+ controls += TextAreaDescription.create(type + "Description") [
+ labelExpression = "service:getDescriptionLabel()"
+ helpExpression = "service:getHelpDescriptionLabel()"
+ initialOperation = InitialOperation.create [
+ firstModelOperations = "var:self".toContext(
+ "description".setter("var:newValue")
+ )
+ ]
+ ]
+ ]
+
+ page = PageDescription.create(type + "Page") [
+ domainClass = "bpmn2::" + type
+ semanticCandidateExpression = "var:self"
+ groups += editGroup
+ ]
+ groups += editGroup
+ ]
+ }
+
+ def createFlowElementCreation(String type, String toolName) {
+ ToolDescription.createAs(Ns.operation, toolName) [
+ label = "%" + type
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/" + type + ".png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('«type»')'''.trimAql.toOperation
+ ]
+
+ }
+
+
+ def createActivitiesTools() {
+ ToolSection.create("Activities") [
+ label = "%Activities"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Task.png"
+ ownedTools += ToolDescription.createAs(Ns.operation, "Task") [
+ label = "%Task"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Task.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('Task')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Business Rule Task") [
+ label = "%BusinessRuleTask"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/BusinessRuleTask.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('BusinessRuleTask')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Manual Task") [
+ label = "%ManualTask"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ManualTask.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('ManualTask')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Receive Task") [
+ label = "%ReceiveTask"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ReceiveTask.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('ReceiveTask')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Script Task") [
+ label = "%ScriptTask"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ScriptTask.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('ScriptTask')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Send Task") [
+ label = "%SendTask"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SendTask.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('SendTask')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Service Task") [
+ label = "%ServiceTask"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ServiceTask.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('ServiceTask')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "User Task") [
+ label = "%UserTask"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/UserTask.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.createFlowElement('UserTask')'''.trimAql.toContext(
+ createInitDialog("Task")
+ )
+ ]
+ ownedTools += ToolGroup.create("SubProcessGroup") [
+ label = "%SubProcess"
+ tools += ToolDescription.createAs(Ns.operation, "Sub Process") [
+ label = "%SubProcess"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SubProcess.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.eContainerOrSelf(bpmn2::FlowElementsContainer)'''.trimAql.toContext(
+ "flowElements".creator("bpmn2.SubProcess").chain(
+ "name".setter("New Sub Process"),
+ '''element.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ "lanes".setter('''element'''.trimAql)
+ ),
+ createInitDialog("Process")
+ )
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "Ad Hoc Sub Process") [
+ label = "%AdHocSubProcess"
+ precondition = '''element.isApplicableType() and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/AdHocSubProcess.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.eContainerOrSelf(bpmn2::FlowElementsContainer)'''.trimAql.toContext(
+ "flowElements".creator("bpmn2.AdHocSubProcess").chain(
+ "name".setter("New Ad-Hoc Sub Process"),
+ '''element.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ "lanes".setter('''element'''.trimAql)
+ ),
+ createInitDialog("Process")
+ )
+ )
+ ]
+ ]
+ ownedTools += ToolGroup.create("CallActivity") [
+ label = "%CallActivity"
+ tools += SelectionWizardDescription.createAs(Ns.operation, "Call Activity") [
+ label = "%CallActivity"
+ precondition = '''(container.oclIsKindOf(bpmn2::Lane) or container.oclIsKindOf(bpmn2::SubProcess)) and containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ candidatesExpression = ''' if self.eContainer(bpmn2::Definitions) <> null then self.eContainer(bpmn2::Definitions).eAllContents(bpmn2::CallableElement) else self.eResource().eAllContents(bpmn2::CallableElement) endif'''.trimAql
+ rootExpression = ''' if self.eContainer(bpmn2::Definitions) <> null then self.eContainer(bpmn2::Definitions) else self.eResource() endif'''.trimAql
+ childrenExpression = '''self.eAllContents(bpmn2::CallableElement)'''.trimAql
+ message = "Select a Callable Element"
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/CallActivity.png"
+ element = ElementSelectVariable.create("element")
+ containerView = ContainerViewVariable.create("containerView")
+ container = SelectContainerVariable.create("container")
+ operation = '''container.eContainerOrSelf(bpmn2::FlowElementsContainer)'''.trimAql.toContext(
+ "flowElements".creator("bpmn2.CallActivity").chain(
+ "calledElementRef".setter('''element'''.trimAql),
+ '''container.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ "lanes".setter('''container'''.trimAql)
+ )
+ )
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "CallActivityNewProcess") [
+ label = "%CallActivityNewProcess"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Process.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element.eContainerOrSelf(bpmn2::FlowElementsContainer)'''.trimAql.toContext(
+ "flowElements".creator("bpmn2.CallActivity").andThen[ variableName = "callActivity" ].chain(
+ '''element.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ "lanes".setter('''element'''.trimAql)
+ )
+ ),
+ ''' if callActivity.eContainer(bpmn2::Definitions) <> null then callActivity.eContainer(bpmn2::Definitions) else callActivity.eContainerOrSelf(basemm::Folder) endif'''.trimAql.toContext(
+ '''self.oclIsKindOf(basemm::Folder)'''.trimAql.ifThenDo(
+ "elements".creator("bpmn2::Process").andThen[ variableName = "newProcess" ].chain(
+ createInitDialog("Process"),
+ '''callActivity'''.trimAql.toContext(
+ "calledElementRef".setter('''newProcess'''.trimAql).chain(
+ '''newProcess'''.trimAql.toContext(
+ "laneSets".creator("bpmn2::LaneSet").chain(
+ "lanes".creator("Lane")
+ )
+ )
+ )
+ )
+ )
+ ),
+ '''self.oclIsKindOf(bpmn2::Definitions)'''.trimAql.ifThenDo(
+ "rootElements".creator("bpmn2::Process").andThen[ variableName = "newProcess" ].chain(
+ createInitDialog("Process"),
+ '''callActivity'''.trimAql.toContext(
+ "calledElementRef".setter('''newProcess'''.trimAql).chain(
+ '''newProcess'''.trimAql.toContext(
+ "laneSets".creator("bpmn2::LaneSet").chain(
+ "lanes".creator("Lane")
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ ]
+ ]
+ ownedTools += ToolGroup.create("") [
+ tools += ToolDescription.createAs(Ns.operation, "LoopMarker") [
+ label = "%LoopMarker"
+ precondition = '''container.oclIsKindOf(bpmn2::Activity)'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/activity/list/looptype.standard.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "loopCharacteristics"
+ elementExpression = '''self.loopCharacteristics'''.trimAql
+ ],
+ "loopCharacteristics".creator("bpmn2.StandardLoopCharacteristics")
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "ToggleCompensationMarker") [
+ label = "%ToggleCompensationMarker"
+ precondition = '''container.oclIsKindOf(bpmn2::Activity)'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/activity/list/event.compensation.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "isForCompensation".setter('''not self.isForCompensation'''.trimAql)
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "ParallelMutliInstanceMarker") [
+ label = "%ParallelMutliInstanceMarker"
+ precondition = '''container.oclIsKindOf(bpmn2::Activity)'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/activity/list/mi.parallel.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "loopCharacteristics"
+ elementExpression = '''self.loopCharacteristics'''.trimAql
+ ],
+ "loopCharacteristics".creator("bpmn2.MultiInstanceLoopCharacteristics").chain(
+ "isSequential".setter('''false'''.trimAql)
+ )
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "SequentialMutliInstanceMarker") [
+ label = "%SequentialMutliInstanceMarker"
+ precondition = '''container.oclIsKindOf(bpmn2::Activity)'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/activity/list/mi.sequential.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "loopCharacteristics"
+ elementExpression = '''self.loopCharacteristics'''.trimAql
+ ],
+ "loopCharacteristics".creator("bpmn2.MultiInstanceLoopCharacteristics").chain(
+ "isSequential".setter('''true'''.trimAql)
+ )
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "RemoveMutliInstanceMarker") [
+ label = "%RemoveMutliInstanceMarker"
+ precondition = '''container.oclIsKindOf(bpmn2::Activity)'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/remove.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "loopCharacteristics"
+ elementExpression = '''self.loopCharacteristics'''.trimAql
+ ]
+ )
+ ]
+ ]
+ ]
+ }
+
+
+ def createGatewaysTools() {
+ ToolSection.create("Gateways") [
+ label = "%Gateways"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ParallelGateway.png"
+ ownedTools += "ParallelGateway".createFlowElementCreation("Parallel Gateway")
+ ownedTools += "ExclusiveGateway".createFlowElementCreation("Exclusive Gateway")
+ ownedTools += "InclusiveGateway".createFlowElementCreation("Inclusive Gateway")
+ ownedTools += "ComplexGateway".createFlowElementCreation("Complex Gateway")
+ ownedTools += "EventBasedGateway".createFlowElementCreation("Event Based Gateway")
+ ]
+ }
+
+
+ def getLocalNodeMapping(String id) {
+ NodeMapping.localRef(Ns.node, id)
+ }
+
+ def createDataTools() {
+ ToolSection.create("Data") [
+ label = "%Data"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/DataObject.png"
+ ownedTools += NodeCreationDescription.createAs(Ns.creation, "Data Object") [
+ label = "%DataObject"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ nodeMappings += getLocalNodeMapping("DataObject")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.DataObject")
+ )
+ )
+ ]
+
+ val dataCreationFactory = [ String dir |
+ NodeCreationDescription.createAs(Ns.creation, "Data " + dir) [
+ label = "%Data" + dir
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ nodeMappings += getLocalNodeMapping("Data" + dir)
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+
+ val containerCase = [ String type, String field, (CreateInstance)=>void init |
+ '''container.oclIsTypeOf(bpmn2::«type»)'''.trimAql.ifThenDo(
+ '''container.«field»->isEmpty()'''.trimAql.ifThenDo(
+ field.creator("bpmn2.InputOutputSpecification") => [
+ init?.apply(it)
+ ]
+ ),
+ '''container.«field»'''.trimAql.toContext(
+ '''data«dir»s'''.toString.creator("bpmn2.Data" + dir)
+ )
+ )
+ ]
+
+ operation = '''container'''.trimAql.toContext(
+ containerCase.apply("Lane", "partitionElement") [
+ it.chain( "lanes".setter('''container'''.trimAql) )
+ ],
+ containerCase.apply("SubProcess", "ioSpecification") []
+ )
+ ]
+ ]
+
+ ownedTools += dataCreationFactory.apply("Input")
+ ownedTools += dataCreationFactory.apply("Output")
+
+ ownedTools += NodeCreationDescription.createAs(Ns.creation, "Data Store") [
+ label = "%DataStore"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ nodeMappings += getLocalNodeMapping("DataStore")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.DataStore")
+ )
+ )
+ ]
+ ]
+ }
+
+ def getEventCreationMappings() {
+ #[
+ NodeMapping.localRef(Ns.node, "TaskBorder"),
+ NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess"),
+ NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process"),
+ NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ }
+ def createEventsTools() {
+ ToolSection.create("Events") [
+ label = "%Events"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/StartEvent.png"
+ ownedTools += "StartEvent".createFlowElementCreation("Start")
+ ownedTools += "EndEvent".createFlowElementCreation("End")
+ ownedTools += "IntermediateCatchEvent".createFlowElementCreation("Intermediate Catch")
+ ownedTools += "IntermediateThrowEvent".createFlowElementCreation("Intermediate Throw")
+ ownedTools += NodeCreationDescription.createAs(Ns.creation, "BoundaryEventCreation") [
+ label = "%Boundary"
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/BoundaryEvent.png"
+ nodeMappings += eventCreationMappings
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainer()'''.trimAql.toContext(
+ "flowElements".creator("bpmn2.BoundaryEvent").chain(
+ '''instance'''.trimAql.toContext(
+ "attachedToRef".setter('''container'''.trimAql),
+ "lanes".setter('''container.lanes'''.trimAql)
+ )
+ )
+ )
+ ]
+ ]
+ }
+
+
+ def createConvertOperation(String target, String conversion, String operationIcon) {
+ OperationAction.createAs(Ns.operation, '''Convert«conversion»To«target»_ContextAction''') [
+ label = "%" + target
+ forceRefresh = true
+ icon = operationIcon ?: "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/" + target + ".png"
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("view",
+ // '''view.convertToSpecific«conversion»(bpmn2::«target»)'''.trimAql.toOperation
+ '''view.convertTo«target»()'''.trimAql.toOperation
+ )
+ ]
+ }
+
+ def createConvertTaskMenu() {
+ PopupMenu.createAs(Ns.menu, "ConvertTask_Popup") [
+ label = "%ConvertTaskTo"
+ precondition = '''self.oclIsKindOf(bpmn2::Task)'''.trimAql
+ forceRefresh = true
+ menuItemDescription += "Task".createConvertOperation("Task", null)
+ menuItemDescription += "BusinessRuleTask".createConvertOperation("Task", null)
+ menuItemDescription += "ManualTask".createConvertOperation("Task", null)
+ menuItemDescription += "ReceiveTask".createConvertOperation("Task", "/org.obeonetwork.dsl.bpmn2.design/icons/obj16/receiveTask.png")
+ menuItemDescription += "ScriptTask".createConvertOperation("Task", "/org.obeonetwork.dsl.bpmn2.design/icons/obj16/scriptTask.png")
+ menuItemDescription += "SendTask".createConvertOperation("Task", null)
+ menuItemDescription += "ServiceTask".createConvertOperation("Task", null)
+ menuItemDescription += "UserTask".createConvertOperation("Task", null)
+ ]
+ }
+
+ def createConvertGatewayMenu() {
+ PopupMenu.createAs(Ns.menu, "ConvertGateway_Popup") [
+ label = "%ConvertGatewayTo"
+ precondition = '''self.oclIsKindOf(bpmn2::Gateway)'''.trimAql
+ forceRefresh = true
+ menuItemDescription += "ComplexGateway".createConvertOperation("Gateway", null)
+ menuItemDescription += "EventBasedGateway".createConvertOperation("Gateway", null)
+ menuItemDescription += "ExclusiveGateway".createConvertOperation("Gateway", null)
+ menuItemDescription += "InclusiveGateway".createConvertOperation("Gateway", null)
+ menuItemDescription += "ParallelGateway".createConvertOperation("Gateway", null)
+ ]
+ }
+
+ def createConvertMenus() {
+ #[
+ createConvertTaskMenu,
+ createConvertGatewayMenu
+ ].get(0)
+ }
+
+
+}
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/CollaborationDiagram.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/CollaborationDiagram.xtend
new file mode 100644
index 00000000..630168d5
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/CollaborationDiagram.xtend
@@ -0,0 +1,1551 @@
+package org.obeonetwork.dsl.bpmn2.design.description
+
+import org.eclipse.sirius.diagram.BackgroundStyle
+import org.eclipse.sirius.diagram.ContainerLayout
+import org.eclipse.sirius.diagram.EdgeArrows
+import org.eclipse.sirius.diagram.EdgeRouting
+import org.eclipse.sirius.diagram.LabelPosition
+import org.eclipse.sirius.diagram.LineStyle
+import org.eclipse.sirius.diagram.ResizeKind
+import org.eclipse.sirius.diagram.description.AdditionalLayer
+import org.eclipse.sirius.diagram.description.CompositeLayout
+import org.eclipse.sirius.diagram.description.ContainerMapping
+import org.eclipse.sirius.diagram.description.DiagramDescription
+import org.eclipse.sirius.diagram.description.EdgeMapping
+import org.eclipse.sirius.diagram.description.Layer
+import org.eclipse.sirius.diagram.description.LayoutDirection
+import org.eclipse.sirius.diagram.description.MappingBasedDecoration
+import org.eclipse.sirius.diagram.description.NodeMapping
+import org.eclipse.sirius.diagram.description.style.BeginLabelStyleDescription
+import org.eclipse.sirius.diagram.description.style.CenterLabelStyleDescription
+import org.eclipse.sirius.diagram.description.style.EdgeStyleDescription
+import org.eclipse.sirius.diagram.description.style.FlatContainerStyleDescription
+import org.eclipse.sirius.diagram.description.style.SquareDescription
+import org.eclipse.sirius.diagram.description.style.WorkspaceImageDescription
+import org.eclipse.sirius.diagram.description.tool.ContainerCreationDescription
+import org.eclipse.sirius.diagram.description.tool.ContainerDropDescription
+import org.eclipse.sirius.diagram.description.tool.DeleteElementDescription
+import org.eclipse.sirius.diagram.description.tool.DirectEditLabel
+import org.eclipse.sirius.diagram.description.tool.DoubleClickDescription
+import org.eclipse.sirius.diagram.description.tool.EdgeCreationDescription
+import org.eclipse.sirius.diagram.description.tool.ElementDoubleClickVariable
+import org.eclipse.sirius.diagram.description.tool.NodeCreationDescription
+import org.eclipse.sirius.diagram.description.tool.NodeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.ReconnectEdgeDescription
+import org.eclipse.sirius.diagram.description.tool.ReconnectionKind
+import org.eclipse.sirius.diagram.description.tool.SourceEdgeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.SourceEdgeViewCreationVariable
+import org.eclipse.sirius.diagram.description.tool.TargetEdgeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.TargetEdgeViewCreationVariable
+import org.eclipse.sirius.diagram.description.tool.ToolGroup
+import org.eclipse.sirius.diagram.description.tool.ToolSection
+import org.eclipse.sirius.viewpoint.FontFormat
+import org.eclipse.sirius.viewpoint.LabelAlignment
+import org.eclipse.sirius.viewpoint.description.DecorationDescriptionsSet
+import org.eclipse.sirius.viewpoint.description.Position
+import org.eclipse.sirius.viewpoint.description.SystemColor
+import org.eclipse.sirius.viewpoint.description.UserFixedColor
+import org.eclipse.sirius.viewpoint.description.style.BasicLabelStyleDescription
+import org.eclipse.sirius.viewpoint.description.tool.ContainerViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.DropContainerVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementDeleteVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementDropVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementSelectVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.OperationAction
+import org.eclipse.sirius.viewpoint.description.tool.PasteDescription
+import org.eclipse.sirius.viewpoint.description.tool.PopupMenu
+import org.eclipse.sirius.viewpoint.description.tool.SelectContainerVariable
+import org.eclipse.sirius.viewpoint.description.tool.SelectionWizardDescription
+import org.eclipse.sirius.viewpoint.description.tool.ToolDescription
+import org.eclipse.sirius.viewpoint.description.tool.Unset
+import org.obeonetwork.dsl.bpmn2.Collaboration
+import org.obeonetwork.dsl.bpmn2.ComplexGateway
+import org.obeonetwork.dsl.bpmn2.DataInput
+import org.obeonetwork.dsl.bpmn2.DataObject
+import org.obeonetwork.dsl.bpmn2.DataOutput
+import org.obeonetwork.dsl.bpmn2.DataStore
+import org.obeonetwork.dsl.bpmn2.EndEvent
+import org.obeonetwork.dsl.bpmn2.EventBasedGateway
+import org.obeonetwork.dsl.bpmn2.ExclusiveGateway
+import org.obeonetwork.dsl.bpmn2.InclusiveGateway
+import org.obeonetwork.dsl.bpmn2.IntermediateCatchEvent
+import org.obeonetwork.dsl.bpmn2.IntermediateThrowEvent
+import org.obeonetwork.dsl.bpmn2.ParallelGateway
+import org.obeonetwork.dsl.bpmn2.StartEvent
+
+import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.*
+
+class CollaborationDiagram extends BpmnDiagram {
+
+ new(BpmnDesign parent) {
+ super(parent, "CollaborationDiagram", "Collaboration Diagram", Collaboration)
+ }
+
+ override initContent(DiagramDescription it) {
+ super.initContent(it)
+ titleExpression = '''self.name'''.trimAql
+ enablePopupBars = true
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ layout = CompositeLayout.create [
+ direction = LayoutDirection.LEFT_TO_RIGHT
+ ]
+ additionalLayers += createProcessLayer
+ }
+
+ override initDefaultStyle(BasicLabelStyleDescription it) {/* No reverse for Default */}
+ override initDefaultEdgeStyle(EdgeStyleDescription it) {/* No reverse for Default */}
+
+ override initContent(Layer it) {
+ containerMappings += ContainerMapping.createAs(Ns.node, "Participant") [
+ semanticCandidatesExpression = '''self.participants'''.trimAql
+ semanticElements = '''self.processRef'''.trimAql
+ domainClass = "bpmn2.Participant"
+ childrenPresentation = ContainerLayout.VERTICAL_STACK
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteParticipant")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 0
+ arcHeight = 0
+ borderSizeComputationExpression = "1"
+ labelSize = 12
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "Lane") [
+ label = "Lane"
+ semanticCandidatesExpression = '''self.processRef.laneSets->first().lanes'''.trimAql
+ domainClass = "bpmn2.Lane"
+ pasteDescriptions += PasteDescription.ref(ProcessDiagram, Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveExtensionValueToLane")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveFlowElementToLane")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "Lane")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 0
+ arcHeight = 0
+ borderSizeComputationExpression = "3"
+ labelSize = 12
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelAlignment = LabelAlignment.LEFT
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "ExternalLabel") [
+ semanticCandidatesExpression = '''containerView.getElementsWithExternalLabel()'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BaseElement"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = SquareDescription.create [
+ borderSizeComputationExpression = "2"
+ showIcon = false
+ labelExpression = '''self.getExternalLabel()'''.trimAql
+ sizeComputationExpression = '''self.getExternalLabelSize()'''.trimAql
+ labelPosition = LabelPosition.NODE_LITERAL
+ resizeKind = ResizeKind.NSEW_LITERAL
+ borderColor = UserFixedColor.ref("color:LightYellow")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ color = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ subNodeMappings += createEventNode(StartEvent, "start-event/start")
+ subNodeMappings += createEventNode(EndEvent, "end-event/end")
+ subNodeMappings += createEventNode(IntermediateCatchEvent, "catch-event/none")
+ subNodeMappings += createEventNode(IntermediateThrowEvent, "throw-event/none")
+ subNodeMappings += createGatewayNode(ParallelGateway, "Parallel Gateway", "parallel-gateway")
+ subNodeMappings += createGatewayNode(InclusiveGateway, "Inclusive Gateway", "inclusive-gateway")
+ subNodeMappings += createGatewayNode(ExclusiveGateway, "Exclusive Gateway", "exclusive-gateway")
+ subNodeMappings += createGatewayNode(ComplexGateway, "Complex Gateway", "complex-gateway")
+ subNodeMappings += createGatewayNode(EventBasedGateway, "EventBased Gateway", "event-based-gateway")
+ subNodeMappings += NodeMapping.createAs(Ns.node, "TextAnnotation") [
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::TextAnnotation)'''.trimAql
+ domainClass = "bpmn2.TextAnnotation"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "TextAnnotationDirectEdit")
+ style = SquareDescription.create [
+ labelExpression = "feature:text"
+ labelAlignment = LabelAlignment.LEFT
+ labelPosition = LabelPosition.NODE_LITERAL
+ resizeKind = ResizeKind.NSEW_LITERAL
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ color = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ subNodeMappings += DataObject.createObjectNode('''self.extensionValues.value->filter(bpmn2::DataObject)'''.trimAql, "data/data-object")
+ .andThen[ name = "DataObject " ] // Typo on name
+ subNodeMappings += DataStore.createObjectNode('''self.extensionValues.value->filter(bpmn2::DataStore)'''.trimAql, "data/data-store")
+ subNodeMappings += DataInput.createObjectNode('''self.getDataInputs()'''.trimAql, "data/data-input")
+ subNodeMappings += DataOutput.createObjectNode('''self.getDataOutputs()'''.trimAql, "data/data-output")
+
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "Task") [
+ semanticCandidatesExpression = '''self.getFlowNodeElements('Task')'''.trimAql
+ domainClass = "bpmn2.Task"
+ pasteDescriptions += PasteDescription.ref(ProcessDiagram, Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "1"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getLabel(not view.ownedBorderedNodes->isEmpty())'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorder") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "CallActivity_Process") [
+ preconditionExpression = '''self.calledElementRef.oclIsTypeOf(bpmn2::Process)'''.trimAql
+ semanticCandidatesExpression = '''self.getFlowNodeElements('CallActivity')'''.trimAql
+ semanticElements = '''Sequence{self,self.calledElementRef})'''.trimAql
+ domainClass = "bpmn2.CallActivity"
+ deletionDescription = DeleteElementDescription.ref(ProcessDiagram, Ns.del, "DeleteCallActivity")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getCallActivityLabel()'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorderOnCallActivity_Process") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "CallActivity_Task") [
+ preconditionExpression = '''self.calledElementRef.oclIsKindOf(bpmn2::GlobalTask)'''.trimAql
+ semanticCandidatesExpression = '''self.getFlowNodeElements('CallActivity')'''.trimAql
+ semanticElements = '''Sequence{self,self.calledElementRef})'''.trimAql
+ domainClass = "bpmn2.CallActivity"
+ deletionDescription = DeleteElementDescription.ref(ProcessDiagram, Ns.del, "DeleteCallActivity")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getCallActivityLabel()'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorderOnCallActivity_Task") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "SubProcess") [
+ semanticCandidatesExpression = '''self.getFlowNodeElements('SubProcess')'''.trimAql
+ domainClass = "bpmn2.SubProcess"
+ pasteDescriptions += PasteDescription.ref(ProcessDiagram, Ns.operation, "Paste")
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteSubProcess")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveFlowElementFromLaneToSubProcess")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "StartEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "EndEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ExternalLabel")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataInput")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataObject")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataOutput")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataStore")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorder")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "Task")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:DarkYellow")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ styleIf(FlatContainerStyleDescription, '''self.triggeredByEvent'''.trimAql) [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ borderLineStyle = LineStyle.DASH_LITERAL
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:DarkYellow")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorderOnSubProcess") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "Group") [
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::Group)'''.trimAql
+ domainClass = "bpmn2.Group"
+ pasteDescriptions += PasteDescription.ref(ProcessDiagram, Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "GroupDirectEdit")
+ style = FlatContainerStyleDescription.create [
+ borderSizeComputationExpression = "1"
+ showIcon = false
+ labelExpression = "feature:description"
+ widthComputationExpression = "15"
+ heightComputationExpression = "3"
+ backgroundStyle = BackgroundStyle.GRADIENT_TOP_TO_BOTTOM_LITERAL
+ borderColor = SystemColor.extraRef("color:gray")
+ labelColor = SystemColor.extraRef("color:black")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "FakeLane") [
+ preconditionExpression = '''self.processRef.laneSets->first().lanes->isEmpty()'''.trimAql
+ semanticCandidatesExpression = '''self'''.trimAql
+ domainClass = "bpmn2.Participant"
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 0
+ arcHeight = 0
+ borderSizeComputationExpression = "1"
+ labelSize = 12
+ showIcon = false
+ labelExpression = ""
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "SequenceFlow") [
+ semanticCandidatesExpression = '''self.participants.processRef.eAllContents()'''.trimAql
+ semanticElements = '''Sequence{self}->union(Sequence{self.conditionExpression})'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "SequenceFlow"
+ useDomainElement = true
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectTargetSequenceFlow")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectSourceSequenceFlow")
+ style = EdgeStyleDescription.create [
+ targetArrow = EdgeArrows.INPUT_FILL_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression!=null and not view.isDefaultPath()'''.trimAql) [
+ sourceArrow = EdgeArrows.DIAMOND_LITERAL
+ targetArrow = EdgeArrows.INPUT_FILL_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ beginLabelStyleDescription = BeginLabelStyleDescription.create [
+ labelExpression = '''self.conditionExpression.description'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression==null and view.isDefaultPath()'''.trimAql) [
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression!=null and view.isDefaultPath()'''.trimAql) [
+ sourceArrow = EdgeArrows.DIAMOND_LITERAL
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ beginLabelStyleDescription = BeginLabelStyleDescription.create [
+ labelExpression = '''self.conditionExpression.description'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "AssociationLink") [
+ semanticCandidatesExpression = '''self.participants.processRef.eAllContents()'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "bpmn2.Association"
+ useDomainElement = true
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataInput")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataObject")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataOutput")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataStore")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataInput")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataObject")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataOutput")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataStore")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ targetMapping += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectTargetAssociationLink")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectSourceAssociationLink")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DOT_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:AssociationLinkColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ showIcon = false
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.sourceRef.oclIsKindOf(bpmn2::TextAnnotation) or self.targetRef.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql) [
+ lineStyle = LineStyle.DOT_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:AssociationLinkColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ showIcon = false
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "MessageFlowOnParticipant") [
+ semanticCandidatesExpression = '''self.messageFlows'''.trimAql
+ targetFinderExpression = '''diagram.getTargetRef(self)'''.trimAql
+ sourceFinderExpression = '''diagram.getSourceRef(self)'''.trimAql
+ domainClass = "MessageFlow"
+ useDomainElement = true
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Participant")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Participant")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectTargetMessageFlow")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectSourceMessageFlow")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_LITERAL
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = SystemColor.extraRef("color:dark_orange")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ labelExpression = '''self.name'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task.png"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "LabelEdge") [
+ targetFinderExpression = '''self'''.trimAql
+ sourceMapping += NodeMapping.localRef(Ns.node, "ExternalLabel")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataInput")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataObject")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataOutput")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataStore")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ strokeColor = SystemColor.extraRef("color:light_gray")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "Group") [
+ targetFinderExpression = '''self'''.trimAql
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Group")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Group")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_DOT_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ sizeComputationExpression = "3"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = SystemColor.extraRef("color:gray")
+ ]
+ ]
+ customizeBpmnNodeStyles
+ toolSections += createTools
+ toolSections += createCollaborationTools
+ decorationDescriptionsSet = DecorationDescriptionsSet.create [
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ScriptTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeScriptTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/script-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "BusinessRuleTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeBusinessRuleTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/business-rule-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ChoreographyTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeChoreographyTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ManualTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeManualTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/manual-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ReceiveTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeReceiveTask() and not self.instantiate'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ReceiveTaskInstanciate"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeReceiveTask() and self.instantiate'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task-process-instantiation.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "SendTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeSendTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/send-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ServiceTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeServiceTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/service-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "UserTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeUserTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/user-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityLoopMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::StandardLoopCharacteristics)'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/loop.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityConpensationMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.isForCompensation'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/compensation.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityParallelMultiInstanceMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::MultiInstanceLoopCharacteristics) and not self.loopCharacteristics.isSequential'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/mi.parallel.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivitySequentialMultiInstanceMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::MultiInstanceLoopCharacteristics) and self.loopCharacteristics.isSequential'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/mi.sequential.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "SubProcess"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''containerView.ownedDiagramElements->first().filter(diagram::DNodeContainer).isCollapsed()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/subprocess.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "AdHocSubProcessMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.oclIsTypeOf(bpmn2::AdHocSubProcess)'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/adhoc-sub-process.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CollapsedSubProcessMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''view.isCollapsed()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/subprocess.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CollectionMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.isCollection'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/collection.png"
+ mappings += NodeMapping.localRef(Ns.node, "DataInput")
+ mappings += NodeMapping.localRef(Ns.node, "DataObject")
+ mappings += NodeMapping.localRef(Ns.node, "DataOutput")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CallActivityCollaboration"
+ position = Position.SOUTH_LITERAL
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/callactivity.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ ]
+ ]
+ }
+
+ def createTools() {
+ ToolSection.create("Tools") [
+ label = "%Tools"
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "FlowElementNameEdit") [
+ label = "FlowElementNameEdit"
+ forceRefresh = true
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ '''not self.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "name".setter('''self.trimLabel(arg0)'''.trimAql)
+ ),
+ '''self.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "text".setter('''self.trimLabel(arg0)'''.trimAql)
+ )
+ )
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveFlowElementFromLaneToSubProcess") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ mappings += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ mappings += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ mappings += NodeMapping.localRef(Ns.node, "StartEvent")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += NodeMapping.localRef(Ns.node, "EndEvent")
+ mappings += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''element.dropFlowElement(oldSemanticContainer, newSemanticContainer'''.trimAql.toOperation
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveFlowElementToLane") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ mappings += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ mappings += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ mappings += NodeMapping.localRef(Ns.node, "StartEvent")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += NodeMapping.localRef(Ns.node, "EndEvent")
+ mappings += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "lanes"
+ elementExpression = '''oldSemanticContainer'''.trimAql
+ ],
+ "lanes".setter('''newSemanticContainer'''.trimAql),
+ '''newSemanticContainer.eContainer(bpmn2::Process)'''.trimAql.toContext(
+ "flowElements".setter('''element'''.trimAql),
+ '''element.boundaryEventRefs'''.trimAql.forDo("event",
+ '''newSemanticContainer.eContainer(bpmn2::Process)'''.trimAql.toContext(
+ "flowElements".setter('''event'''.trimAql)
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += DoubleClickDescription.createAs(Ns.operation, "SubProcessToggleCollapse_DoubleClick") [
+ forceRefresh = true
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ element = ElementDoubleClickVariable.create("element")
+ elementView = ElementDoubleClickVariable.create("elementView")
+ operation = '''elementView.toggleCollapse()'''.trimAql.toOperation
+ ]
+ ownedTools += OperationAction.createAs(Ns.operation, "ToggleCollapseSubProcess_ContextAction") [
+ label = "%ToggleCollapse"
+ precondition = '''self.oclIsKindOf(bpmn2::SubProcess)'''.trimAql
+ forceRefresh = true
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SubProcess.png"
+ view = ContainerViewVariable.create("views")
+ operation = '''views.toggleCollapse()'''.trimAql.toOperation
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveExtensionValueToLane") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += NodeMapping.localRef(Ns.node, "DataObject")
+ mappings += NodeMapping.localRef(Ns.node, "DataStore")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''newSemanticContainer'''.trimAql.toContext(
+ "extensionValues".setter('''element.eContainerOrSelf(bpmn2::ExtensionAttributeValue)'''.trimAql),
+ '''element'''.trimAql.toContext(
+ "lanes".setter('''newSemanticContainer'''.trimAql),
+ Unset.create [
+ featureName = "lanes"
+ elementExpression = '''oldSemanticContainer'''.trimAql
+ ]
+ )
+ )
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteCallActivity") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ operation = '''element.eContainerOrSelf(bpmn2::FlowElementsContainer)'''.trimAql.toContext(
+ Unset.create [
+ featureName = "flowElements"
+ elementExpression = '''element'''.trimAql
+ ]
+ )
+ ]
+ ownedTools += createConvertMenus
+ ownedTools += PasteDescription.createAs(Ns.operation, "Paste") [
+ label = "%Paste"
+ forceRefresh = true
+ container = DropContainerVariable.create("container")
+ containerView = ContainerViewVariable.create("containerView")
+ copiedView = ElementViewVariable.create("copiedView")
+ copiedElement = ElementVariable.create("copiedElement")
+ operation = "service:container.paste(containerView, copiedView, copiedElement)".toOperation
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteSubProcess") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ operation = '''element.deleteSubProcess(elementView)'''.trimAql.toOperation
+ ]
+ ownedTools += PopupMenu.createAs(Ns.menu, "ReorderLane_Popup") [
+ label = "%ReorderLane"
+ precondition = '''self.oclIsKindOf(bpmn2::Lane) and self.eContainer().lanes->size()>1'''.trimAql
+ forceRefresh = true
+ menuItemDescription += OperationAction.createAs(Ns.operation, "LaneUp_ContextAction") [
+ label = "%Up"
+ precondition = '''self.eContainer().lanes->indexOf(self)>1'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("view",
+ '''view.target.up()'''.trimAql.toOperation
+ )
+ ]
+ menuItemDescription += OperationAction.createAs(Ns.operation, "LaneDown_ContextAction") [
+ label = "%Down"
+ precondition = '''self.eContainer().lanes->indexOf(self) <> self.eContainer().lanes->size()'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("view",
+ '''view.target.down()'''.trimAql.toOperation
+ )
+ ]
+ ]
+ ownedTools += OperationAction.createAs(Ns.operation, "ExternalLabel") [
+ label = "%ExternalLabel"
+ precondition = '''self.oclIsKindOf(bpmn2::Event) or self.oclIsKindOf(bpmn2::Gateway) or self.oclIsKindOf(bpmn2::ItemAwareElement)'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = "org.obeonetwork.bpmn2.design.setUnsetExternalLabels".javaDo("SetUnsetExternalLabels",
+ "views" -> '''views'''.trimAql
+ )
+ ]
+ ]
+ }
+
+
+ def createCollaborationTools() {
+ ToolSection.create("Collaboration") [
+ label = "%Collaboration"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageFlow.png"
+ ownedTools += ContainerCreationDescription.createAs(Ns.operation, "ParticpantWithoutProcess") [
+ label = "%ParticipantWithoutProcess"
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Participant.png"
+ containerMappings += ContainerMapping.localRef(Ns.node, "Participant")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container'''.trimAql.toContext(
+ "participants".creator("bpmn2.Participant").andThen[ variableName = "participant" ].chain(
+ createInitDialog("Participant")
+ )
+ )
+ ]
+ ownedTools += ContainerCreationDescription.createAs(Ns.operation, "Particpant") [
+ label = "%ParticipantAndNewProcess"
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ParticipantWithProcess.png"
+ containerMappings += ContainerMapping.localRef(Ns.node, "Participant")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container'''.trimAql.toContext(
+ "participants".creator("bpmn2.Participant").andThen[ variableName = "participant" ].chain(
+ createInitDialog("Participant")
+ ),
+ ''' if participant.eContainer(bpmn2::Definitions) <> null then participant.eContainer(bpmn2::Definitions) else participant.eContainerOrSelf(basemm::Folder) endif'''.trimAql.toContext(
+ '''self.oclIsKindOf(basemm::Folder)'''.trimAql.ifThenDo(
+ "elements".creator("bpmn2::Process").andThen[ variableName = "newProcess" ].chain(
+ createInitDialog("Process"),
+ '''participant'''.trimAql.toContext(
+ "processRef".setter('''newProcess'''.trimAql).chain(
+ '''newProcess'''.trimAql.toContext(
+ "laneSets".creator("bpmn2::LaneSet").chain(
+ "lanes".creator("Lane")
+ )
+ )
+ )
+ )
+ )
+ ),
+ '''self.oclIsKindOf(bpmn2::Definitions)'''.trimAql.ifThenDo(
+ "rootElements".creator("bpmn2::Process").andThen[ variableName = "newProcess" ].chain(
+ createInitDialog("Process"),
+ '''participant'''.trimAql.toContext(
+ "processRef".setter('''newProcess'''.trimAql).chain(
+ '''newProcess'''.trimAql.toContext(
+ "laneSets".creator("bpmn2::LaneSet").chain(
+ "lanes".creator("Lane")
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += SelectionWizardDescription.createAs(Ns.operation, "LinkProcess") [
+ label = "%ParticipantAndExistingProcess"
+ precondition = '''self.oclIsTypeOf(bpmn2::Collaboration)'''.trimAql
+ candidatesExpression = ''' if self.eContainer(bpmn2::Definitions) <> null then self.eContainer(bpmn2::Definitions).eAllContents(bpmn2::Process) else self.eResource().eAllContents(bpmn2::Process) endif'''.trimAql
+ message = "%SelectProcess"
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Process.png"
+ element = ElementSelectVariable.create("element")
+ containerView = ContainerViewVariable.create("containerView")
+ container = SelectContainerVariable.create("container")
+ operation = '''self'''.trimAql.toContext(
+ "participants".creator("bpmn2.Participant").andThen[ variableName = "participant" ].chain(
+ createInitDialog("Participant")
+ ),
+ '''participant'''.trimAql.toContext(
+ "processRef".setter('''element'''.trimAql).chain(
+ '''self.processRef'''.trimAql.toContext(
+ '''self.laneSets->isEmpty()'''.trimAql.ifThenDo(
+ "laneSets".creator("bpmn2::LaneSet").chain(
+ "lanes".creator("Lane")
+ )
+ )
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += EdgeCreationDescription.createAs(Ns.connect, "Message Flow Creation Tool") [
+ label = "%Message"
+ precondition = '''(preSource.oclIsTypeOf(bpmn2::Participant) and preTarget.oclIsTypeOf(bpmn2::Participant)) or not(preSource.eInverse('flowNodeRefs') = preTarget.eInverse('flowNodeRefs'))'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageFlow.png"
+ edgeMappings += EdgeMapping.localRef(Ns.edge, "MessageFlowOnParticipant")
+ sourceVariable = SourceEdgeCreationVariable.create("source")
+ targetVariable = TargetEdgeCreationVariable.create("target")
+ sourceViewVariable = SourceEdgeViewCreationVariable.create("sourceView")
+ targetViewVariable = TargetEdgeViewCreationVariable.create("targetView")
+ operation = '''sourceView.eContainer(diagram::DDiagram).target'''.trimAql.toContext(
+ "messageFlows".creator("bpmn2.MessageFlow").chain(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteParticipant") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ operation = '''element.eContainer(bpmn2::Collaboration)'''.trimAql.toContext(
+ Unset.create [
+ featureName = "participants"
+ elementExpression = '''element'''.trimAql
+ ]
+ )
+ ]
+ ]
+ }
+
+ def createProcessLayer() {
+ AdditionalLayer.create("Process") [
+ activeByDefault = true
+ toolSections += createProcessConnectorsTools
+ toolSections += createEventsTools
+ toolSections += createProcessEventDefinitionsTools
+ toolSections += createActivitiesTools
+ toolSections += createGatewaysTools
+ toolSections += createDataTools
+ toolSections += createProcessOtherTools
+ ]
+ }
+
+ def createProcessConnectorsTools() {
+ ToolSection.create("Connectors") [
+ label = "%Connectors"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SequenceFlow.png"
+ ownedTools += ToolGroup.create("Sequence") [
+ label = "%Sequence"
+ tools += EdgeCreationDescription.createAs(Ns.connect, "SequenceFlowCreationTool") [
+ label = "%Sequence"
+ precondition = '''preSource.eInverse('flowNodeRefs').eContainer() = preTarget.eInverse('flowNodeRefs').eContainer()'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SequenceFlow.png"
+ edgeMappings += EdgeMapping.localRef(Ns.edge, "SequenceFlow")
+ sourceVariable = SourceEdgeCreationVariable.create("source")
+ targetVariable = TargetEdgeCreationVariable.create("target")
+ sourceViewVariable = SourceEdgeViewCreationVariable.create("sourceView")
+ targetViewVariable = TargetEdgeViewCreationVariable.create("targetView")
+ operation = '''source.eContainer()'''.trimAql.toContext(
+ '''source.eContainer(bpmn2::LaneSet)=target.eContainer(bpmn2::LaneSet)'''.trimAql.ifThenDo(
+ "flowElements".creator("bpmn2.SequenceFlow").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ ),
+ '''source.eContainerOrSelf(bpmn2::BoundaryEvent)=null'''.trimAql.ifThenDo(
+ )
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "Condition") [
+ label = "%Condition"
+ precondition = '''element.oclIsKindOf(bpmn2::SequenceFlow) and element.oclAsType(bpmn2::SequenceFlow)==null'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''self'''.trimAql.toContext(
+ "conditionExpression".creator("Expression")
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "SuppressCondition") [
+ label = "%SupressCondition"
+ precondition = '''element.oclIsKindOf(bpmn2::SequenceFlow) and element.oclAsType(bpmn2::SequenceFlow).conditionExpression!=null'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/remove.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = Unset.create [
+ featureName = "conditionExpression"
+ elementExpression = '''self.conditionExpression'''.trimAql
+ ]
+ ]
+ ]
+ ownedTools += EdgeCreationDescription.createAs(Ns.connect, "Association Creation Tool") [
+ label = "%Association"
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Association.png"
+ edgeMappings += EdgeMapping.localRef(Ns.edge, "AssociationLink")
+ sourceVariable = SourceEdgeCreationVariable.create("source")
+ targetVariable = TargetEdgeCreationVariable.create("target")
+ sourceViewVariable = SourceEdgeViewCreationVariable.create("sourceView")
+ targetViewVariable = TargetEdgeViewCreationVariable.create("targetView")
+ operation = '''source.eContainerOrSelf(bpmn2::Process)'''.trimAql.toContext(
+ '''source.oclIsKindOf(bpmn2::DataObject) or source.oclIsKindOf(bpmn2::DataInput) or source.oclIsKindOf(bpmn2::DataOutput) or source.oclIsKindOf(bpmn2::DataStore) or source.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ '''target.oclIsKindOf(bpmn2::Task) or target.oclIsKindOf(bpmn2::ReceiveTask) or target.oclIsKindOf(bpmn2::SendTask) or target.oclIsKindOf(bpmn2::ChoreographyTask) or target.oclIsKindOf(bpmn2::Gateway) or target.oclIsKindOf(bpmn2::Event) or target.oclIsKindOf(bpmn2::SubProcess) or target.oclIsKindOf(bpmn2::CallActivity)'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ ),
+ '''source.oclIsKindOf(bpmn2::Task) or source.oclIsKindOf(bpmn2::ReceiveTask) or source.oclIsKindOf(bpmn2::SendTask) or source.oclIsKindOf(bpmn2::Gateway) or source.oclIsKindOf(bpmn2::Event) or source.oclIsKindOf(bpmn2::SubProcess) or source.oclIsKindOf(bpmn2::CallActivity)'''.trimAql.ifThenDo(
+ '''target.oclIsKindOf(bpmn2::DataObject) or target.oclIsKindOf(bpmn2::DataInput) or target.oclIsKindOf(bpmn2::DataOutput) or target.oclIsKindOf(bpmn2::DataStore) or target.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ ),
+ '''source.oclIsKindOf(bpmn2::BoundaryEvent) and source.eventDefinitions->select(e|e.oclIsTypeOf(bpmn2::CompensateEventDefinition))->notEmpty()'''.trimAql.ifThenDo(
+ '''target.isForCompensation'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectTargetSequenceFlow") [
+ precondition = '''self.sourceRef.lanes->first().eContainer()=target.lanes->first().eContainer() or self.sourceRef.attachedToRef.lanes->first().eContainer()=target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "targetRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectSourceSequenceFlow") [
+ precondition = '''self.sourceRef.lanes->first().eContainer()=target.lanes->first().eContainer() or self.sourceRef.attachedToRef.lanes->first().eContainer()=target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ reconnectionKind = ReconnectionKind.RECONNECT_SOURCE_LITERAL
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "sourceRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectTargetMessageFlow") [
+ precondition = '''self.sourceRef.lanes->first().eContainer()<>target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "targetRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectSourceMessageFlow") [
+ precondition = '''self.targetRef.lanes->first().eContainer()<>target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ reconnectionKind = ReconnectionKind.RECONNECT_SOURCE_LITERAL
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "sourceRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectTargetAssociationLink") [
+ forceRefresh = true
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "targetRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectSourceAssociationLink") [
+ forceRefresh = true
+ reconnectionKind = ReconnectionKind.RECONNECT_SOURCE_LITERAL
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "sourceRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ]
+ }
+
+
+
+
+ def createProcessEventDefinitionsTools() {
+ ToolSection.create("Event Definitions") [
+ label = "%EventDefinitions"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageEventDefinition.png"
+ ownedTools += OperationAction.createAs(Ns.operation, "OperationDeleteEventDefinition") [
+ label = "%RemoveEventDefinition"
+ precondition = '''views->first().target.oclIsKindOf(bpmn2::Event)'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("i",
+ '''i.target'''.trimAql.toContext(
+ Unset.create [
+ featureName = "eventDefinitions"
+ elementExpression = '''self.eventDefinitions->last()'''.trimAql
+ ]
+ )
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Message Event Definition") [
+ label = "%Message"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::MessageEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("MessageEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Timer Event Definition") [
+ label = "%Timer"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and element.eventDefinitions->filter(bpmn2::TimerEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TimerEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("TimerEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Escalation Event Definition") [
+ label = "%Escalation"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not(element.oclIsKindOf(bpmn2::StartEvent)) and not(element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and element.eventDefinitions->filter(bpmn2::EscalationEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/EscalationEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("EscalationEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Conditional Event Definition") [
+ label = "%Conditional"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and element.eventDefinitions->filter(bpmn2::ConditionalEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ConditionalEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("ConditionalEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Link Event Definition") [
+ label = "%Link"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::BoundaryEvent)) and element.eventDefinitions->filter(bpmn2::LinkEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/LinkEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("LinkEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Error Event Definition") [
+ label = "%Error"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and element.eventDefinitions->filter(bpmn2::ErrorEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ErrorEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("ErrorEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Cancel Event Definition") [
+ label = "%Cancel"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and element.eventDefinitions->filter(bpmn2::CancelEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/CancelEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("CancelEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Compensate Event Definition") [
+ label = "%Compensate"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and element.eventDefinitions->filter(bpmn2::CompensateEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/CompensateEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("CompensateEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Signal Event Definition") [
+ label = "%Signal"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::SignalEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SignalEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("SignalEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Terminate Event Definition") [
+ label = "%Terminate"
+ precondition = '''element.oclIsKindOf(bpmn2::EndEvent) and element.eventDefinitions->filter(bpmn2::TerminateEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TerminateEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("TerminateEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Delete Event Definition") [
+ label = "%Delete"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not element.eventDefinitions->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/remove.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "eventDefinitions"
+ elementExpression = '''element.eventDefinitions->last()'''.trimAql
+ ]
+ )
+ ]
+ ]
+ }
+
+
+ def createProcessOtherTools() {
+ ToolSection.create("Other") [
+ label = "%Other"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Process.png"
+ ownedTools += ContainerCreationDescription.createAs(Ns.operation, "Lane") [
+ label = "%Lane"
+ precondition = '''self.processRef!=null or self.oclIsKindOf(bpmn2::Lane)'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Lane.png"
+ containerMappings += ContainerMapping.localRef(Ns.node, "Lane")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''self'''.trimAql.toContext(
+ '''not container.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ '''container.processRef.laneSets->first()'''.trimAql.toContext(
+ "lanes".creator("bpmn2.Lane").andThen[ variableName = "newLane" ].chain(
+ createInitDialog("Lane")
+ ),
+ '''self.moveElementFirstPosition('lanes',newLane)'''.trimAql.toOperation
+ )
+ ),
+ '''container.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ '''container.eContainerOrSelf(bpmn2::LaneSet)'''.trimAql.toContext(
+ "lanes".creator("bpmn2.Lane").andThen[ variableName = "newLane" ].chain(
+ createInitDialog("Lane")
+ ),
+ '''self.moveElement('lanes',newLane,container)'''.trimAql.toOperation
+ )
+ )
+ )
+ ]
+ ownedTools += NodeCreationDescription.createAs(Ns.creation, "TextAnnotation") [
+ label = "%TextAnnotation"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TextAnnotation.png"
+ nodeMappings += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainerOrSelf(bpmn2::Lane)'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.TextAnnotation").chain(
+ "lanes".setter('''container'''.trimAql)
+ )
+ )
+ )
+ ]
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "TextAnnotationDirectEdit") [
+ forceRefresh = true
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ "text".setter('''arg0'''.trimAql)
+ )
+ ]
+ ownedTools += ContainerCreationDescription.createAs(Ns.operation, "Group") [
+ label = "%Group"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ containerMappings += ContainerMapping.localRef(Ns.node, "Group")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainerOrSelf(bpmn2::Lane)'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.Group").chain(
+ "lanes".setter('''container'''.trimAql)
+ )
+ )
+ )
+ ]
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "GroupDirectEdit") [
+ forceRefresh = true
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ "description".setter('''arg0'''.trimAql)
+ )
+ ]
+ ]
+ }
+
+}
\ No newline at end of file
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/GlobalTaskDefinitionsEditionTable.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/GlobalTaskDefinitionsEditionTable.xtend
new file mode 100644
index 00000000..99cdc2b0
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/GlobalTaskDefinitionsEditionTable.xtend
@@ -0,0 +1,69 @@
+package org.obeonetwork.dsl.bpmn2.design.description
+
+import org.eclipse.sirius.table.metamodel.table.description.CreateLineTool
+import org.eclipse.sirius.table.metamodel.table.description.EditionTableDescription
+import org.eclipse.sirius.table.metamodel.table.description.LineMapping
+import org.mypsycho.modit.emf.sirius.api.SiriusFeatureTable
+import org.obeonetwork.dsl.bpmn2.Bpmn2Package
+import org.obeonetwork.dsl.bpmn2.Definitions
+
+import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.*
+
+class GlobalTaskDefinitionsEditionTable extends SiriusFeatureTable {
+
+ new(BpmnDesign parent) {
+ super(parent, "Global Task Definitions", Definitions)
+ }
+
+ override initDefaultLineStyle(LineMapping it) {}
+
+ override initContent(EditionTableDescription it) {
+ metamodel += Bpmn2Package.eINSTANCE
+ name = "GlobalTaskDefinitions"
+ ownedLine("GlobalTask") [
+ domainClass = "bpmn2.GlobalTask"
+ semanticCandidatesExpression = '''self.rootElements->filter(bpmn2::GlobalTask)'''.trimAql
+ ]
+ ownedCreateLine += CreateLineTool.create("Create Global User Task") [
+ initVariables
+ elementsToSelect = "service:stdEmptyCollection"
+ operation = '''container'''.trimAql.toContext(
+ "rootElements".creator("bpmn2.GlobalUserTask").chain(
+ "name".setter("New Global User Task")
+ )
+ )
+ ]
+ ownedCreateLine += CreateLineTool.create("Create Global Manual Task") [
+ initVariables
+ elementsToSelect = "service:stdEmptyCollection"
+ operation = '''container'''.trimAql.toContext(
+ "rootElements".creator("bpmn2.GlobalManualTask").chain(
+ "name".setter("New Global Manual Task")
+ )
+ )
+ ]
+ ownedCreateLine += CreateLineTool.create("Create Global Script Task") [
+ initVariables
+ elementsToSelect = "service:stdEmptyCollection"
+ operation = '''container'''.trimAql.toContext(
+ "rootElements".creator("bpmn2.GlobalScriptTask").chain(
+ "name".setter("New Global Script Task")
+ )
+ )
+ ]
+ ownedCreateLine += CreateLineTool.create("Create Global Business Rule Task") [
+ initVariables
+ elementsToSelect = "service:stdEmptyCollection"
+ operation = '''container'''.trimAql.toContext(
+ "rootElements".creator("bpmn2.GlobalBusinessRuleTask").chain(
+ "name".setter("New Global Business Rule Task")
+ )
+ )
+ ]
+ ownedColumn("Name", "name") [
+ headerLabelExpression = "Name"
+ labelExpression = "feature:name"
+ ]
+ }
+
+}
\ No newline at end of file
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDefinitionsEditionTable.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDefinitionsEditionTable.xtend
new file mode 100644
index 00000000..ce36b2e0
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDefinitionsEditionTable.xtend
@@ -0,0 +1,67 @@
+package org.obeonetwork.dsl.bpmn2.design.description
+
+import org.eclipse.sirius.table.metamodel.table.description.CreateLineTool
+import org.eclipse.sirius.table.metamodel.table.description.EditionTableDescription
+import org.eclipse.sirius.table.metamodel.table.description.LineMapping
+import org.mypsycho.modit.emf.sirius.api.SiriusFeatureTable
+import org.obeonetwork.dsl.bpmn2.Bpmn2Package
+import org.obeonetwork.dsl.bpmn2.Definitions
+
+import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.*
+
+class ProcessDefinitionsEditionTable extends SiriusFeatureTable {
+
+ new(BpmnDesign parent) {
+ super(parent, "Process Definitions", Definitions)
+ }
+
+ override initDefaultLineStyle(LineMapping it) {}
+
+ override initContent(EditionTableDescription it) {
+ metamodel += Bpmn2Package.eINSTANCE
+ name = "ProcessDefinitions"
+ ownedLine("Process") [
+ domainClass = "bpmn2.Process"
+ semanticCandidatesExpression = "[if (self.oclIsTypeOf(bpmn2::Definitions)) then self.oclAsType(bpmn2::Definitions).rootElements else self.oclAsType(bpmn2::Process).decomposedBy endif /]"
+ reusedInMappings += "Process".lineRef
+ create += CreateLineTool.create("Duplicate Process") [
+ initVariables
+ forceRefresh = true
+ elementsToSelect = "service:stdEmptyCollection"
+ mapping = "Process".lineRef
+ operation = '''element.duplicate()'''.trimAql.toOperation
+ ]
+ create += CreateLineTool.create("Create Nested Process") [
+ initVariables
+ forceRefresh = true
+ elementsToSelect = "service:stdEmptyCollection"
+ mapping = "Process".lineRef
+ operation = '''element'''.trimAql.toContext(
+ "decomposedBy".creator("bpmn2.Process").chain(
+ "name".setter("")
+ )
+ )
+ ]
+ ]
+ ownedCreateLine += CreateLineTool.create("Create Root Process") [
+ initVariables
+ forceRefresh = true
+ elementsToSelect = "service:stdEmptyCollection"
+ mapping = "Process".lineRef
+ operation = '''container'''.trimAql.toContext(
+ "rootElements".creator("bpmn2.Process").chain(
+ "name".setter("")
+ )
+ )
+ ]
+ ownedColumn("Name", "name") [
+ headerLabelExpression = "Name"
+ labelExpression = '''name'''.trimAql
+ ]
+ ownedColumn("Description", "description") [
+ headerLabelExpression = "Description"
+ labelExpression = '''description'''.trimAql
+ ]
+ }
+
+}
\ No newline at end of file
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDiagram.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDiagram.xtend
new file mode 100644
index 00000000..29b18bec
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/ProcessDiagram.xtend
@@ -0,0 +1,1447 @@
+package org.obeonetwork.dsl.bpmn2.design.description
+
+import org.eclipse.sirius.diagram.BackgroundStyle
+import org.eclipse.sirius.diagram.ContainerLayout
+import org.eclipse.sirius.diagram.EdgeArrows
+import org.eclipse.sirius.diagram.EdgeRouting
+import org.eclipse.sirius.diagram.LabelPosition
+import org.eclipse.sirius.diagram.LineStyle
+import org.eclipse.sirius.diagram.ResizeKind
+import org.eclipse.sirius.diagram.description.CompositeLayout
+import org.eclipse.sirius.diagram.description.ContainerMapping
+import org.eclipse.sirius.diagram.description.DiagramDescription
+import org.eclipse.sirius.diagram.description.EdgeMapping
+import org.eclipse.sirius.diagram.description.Layer
+import org.eclipse.sirius.diagram.description.LayoutDirection
+import org.eclipse.sirius.diagram.description.MappingBasedDecoration
+import org.eclipse.sirius.diagram.description.NodeMapping
+import org.eclipse.sirius.diagram.description.style.BeginLabelStyleDescription
+import org.eclipse.sirius.diagram.description.style.CenterLabelStyleDescription
+import org.eclipse.sirius.diagram.description.style.EdgeStyleDescription
+import org.eclipse.sirius.diagram.description.style.FlatContainerStyleDescription
+import org.eclipse.sirius.diagram.description.style.SquareDescription
+import org.eclipse.sirius.diagram.description.style.WorkspaceImageDescription
+import org.eclipse.sirius.diagram.description.tool.ContainerCreationDescription
+import org.eclipse.sirius.diagram.description.tool.ContainerDropDescription
+import org.eclipse.sirius.diagram.description.tool.DeleteElementDescription
+import org.eclipse.sirius.diagram.description.tool.DirectEditLabel
+import org.eclipse.sirius.diagram.description.tool.DoubleClickDescription
+import org.eclipse.sirius.diagram.description.tool.EdgeCreationDescription
+import org.eclipse.sirius.diagram.description.tool.ElementDoubleClickVariable
+import org.eclipse.sirius.diagram.description.tool.NodeCreationDescription
+import org.eclipse.sirius.diagram.description.tool.NodeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.ReconnectEdgeDescription
+import org.eclipse.sirius.diagram.description.tool.ReconnectionKind
+import org.eclipse.sirius.diagram.description.tool.SourceEdgeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.SourceEdgeViewCreationVariable
+import org.eclipse.sirius.diagram.description.tool.TargetEdgeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.TargetEdgeViewCreationVariable
+import org.eclipse.sirius.diagram.description.tool.ToolGroup
+import org.eclipse.sirius.diagram.description.tool.ToolSection
+import org.eclipse.sirius.viewpoint.FontFormat
+import org.eclipse.sirius.viewpoint.LabelAlignment
+import org.eclipse.sirius.viewpoint.description.DecorationDescriptionsSet
+import org.eclipse.sirius.viewpoint.description.Position
+import org.eclipse.sirius.viewpoint.description.SystemColor
+import org.eclipse.sirius.viewpoint.description.UserFixedColor
+import org.eclipse.sirius.viewpoint.description.style.BasicLabelStyleDescription
+import org.eclipse.sirius.viewpoint.description.tool.ContainerViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.DropContainerVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementDeleteVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementDropVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementSelectVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.InitialOperation
+import org.eclipse.sirius.viewpoint.description.tool.OperationAction
+import org.eclipse.sirius.viewpoint.description.tool.PasteDescription
+import org.eclipse.sirius.viewpoint.description.tool.PopupMenu
+import org.eclipse.sirius.viewpoint.description.tool.ToolDescription
+import org.eclipse.sirius.viewpoint.description.tool.Unset
+import org.obeonetwork.dsl.bpmn2.ComplexGateway
+import org.obeonetwork.dsl.bpmn2.DataInput
+import org.obeonetwork.dsl.bpmn2.DataObject
+import org.obeonetwork.dsl.bpmn2.DataOutput
+import org.obeonetwork.dsl.bpmn2.DataStore
+import org.obeonetwork.dsl.bpmn2.EndEvent
+import org.obeonetwork.dsl.bpmn2.EventBasedGateway
+import org.obeonetwork.dsl.bpmn2.ExclusiveGateway
+import org.obeonetwork.dsl.bpmn2.InclusiveGateway
+import org.obeonetwork.dsl.bpmn2.IntermediateCatchEvent
+import org.obeonetwork.dsl.bpmn2.IntermediateThrowEvent
+import org.obeonetwork.dsl.bpmn2.ParallelGateway
+import org.obeonetwork.dsl.bpmn2.Process
+import org.obeonetwork.dsl.bpmn2.StartEvent
+
+import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.*
+
+class ProcessDiagram extends BpmnDiagram {
+
+ new(BpmnDesign parent) {
+ super(parent, "ProcessDiagram", "Process Diagram", Process)
+ }
+
+ override initContent(DiagramDescription it) {
+ super.initContent(it)
+ titleExpression = '''self.name'''.trimAql
+ enablePopupBars = true
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ layout = CompositeLayout.create [
+ direction = LayoutDirection.LEFT_TO_RIGHT
+ ]
+ diagramInitialisation = InitialOperation.create [
+ firstModelOperations = '''self'''.trimAql.toContext(
+ '''self.laneSets->isEmpty()'''.trimAql.ifThenDo(
+ "laneSets".creator("bpmn2::LaneSet").chain(
+ "lanes".creator("Lane")
+ )
+ )
+ )
+ ]
+ }
+
+ override initDefaultStyle(BasicLabelStyleDescription it) {/* No reverse for Default */}
+ override initDefaultEdgeStyle(EdgeStyleDescription it) {/* No reverse for Default */}
+
+
+ override initContent(Layer it) {
+
+ containerMappings += ContainerMapping.createAs(Ns.node, "HorizontalLaneSet") [
+ semanticCandidatesExpression = '''self.laneSets'''.trimAql
+ domainClass = "bpmn2.LaneSet"
+ childrenPresentation = ContainerLayout.VERTICAL_STACK
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteLaneSet")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 0
+ arcHeight = 0
+ borderSizeComputationExpression = "1"
+ labelSize = 12
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.eContainer(bpmn2::Process).name'''.trimAql
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "Lane") [
+ label = "Lane"
+ semanticCandidatesExpression = '''self.lanes'''.trimAql
+ domainClass = "bpmn2.Lane"
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveInputOutputSpecificationToLane")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveExtensionValueToLane")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveFlowElementToLane")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "Lane")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 0
+ arcHeight = 0
+ borderSizeComputationExpression = "3"
+ labelSize = 12
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelAlignment = LabelAlignment.LEFT
+ widthComputationExpression = "120"
+ heightComputationExpression = "30"
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "ExternalLabel") [
+ semanticCandidatesExpression = '''containerView.getElementsWithExternalLabel()'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BaseElement"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = SquareDescription.create [
+ borderSizeComputationExpression = "2"
+ showIcon = false
+ labelExpression = '''self.getExternalLabel()'''.trimAql
+ sizeComputationExpression = '''self.getExternalLabelSize()'''.trimAql
+ labelPosition = LabelPosition.NODE_LITERAL
+ resizeKind = ResizeKind.NSEW_LITERAL
+ borderColor = UserFixedColor.ref("color:LightYellow")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ color = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ subNodeMappings += createEventNode(StartEvent, "start-event/start")
+ subNodeMappings += createEventNode(EndEvent, "end-event/end")
+ subNodeMappings += createEventNode(IntermediateCatchEvent, "catch-event/none")
+ subNodeMappings += createEventNode(IntermediateThrowEvent, "throw-event/none")
+ subNodeMappings += createGatewayNode(ParallelGateway, "Parallel Gateway", "parallel-gateway")
+ subNodeMappings += createGatewayNode(InclusiveGateway, "Inclusive Gateway", "inclusive-gateway")
+ subNodeMappings += createGatewayNode(ExclusiveGateway, "Exclusive Gateway", "exclusive-gateway")
+ subNodeMappings += createGatewayNode(ComplexGateway, "Complex Gateway", "complex-gateway")
+ subNodeMappings += createGatewayNode(EventBasedGateway, "EventBased Gateway", "event-based-gateway")
+ subNodeMappings += NodeMapping.createAs(Ns.node, "TextAnnotation") [
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::TextAnnotation)'''.trimAql
+ domainClass = "bpmn2.TextAnnotation"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "TextAnnotationDirectEdit")
+ style = SquareDescription.create [
+ labelExpression = "feature:text"
+ labelAlignment = LabelAlignment.LEFT
+ labelPosition = LabelPosition.NODE_LITERAL
+ resizeKind = ResizeKind.NSEW_LITERAL
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = SystemColor.extraRef("color:black")
+ color = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ subNodeMappings += DataObject.createObjectNode('''self.extensionValues.value->filter(bpmn2::DataObject)'''.trimAql, "data/data-object")
+ .andThen[ name = "DataObject " ] // Typo on name
+ subNodeMappings += DataStore.createObjectNode('''self.extensionValues.value->filter(bpmn2::DataStore)'''.trimAql, "data/data-store")
+ subNodeMappings += DataInput.createObjectNode('''self.getDataInputs()'''.trimAql, "data/data-input")
+ subNodeMappings += DataOutput.createObjectNode('''self.getDataOutputs()'''.trimAql, "data/data-output")
+
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "Task") [
+ semanticCandidatesExpression = '''self.getFlowNodeElements('Task')'''.trimAql
+ domainClass = "bpmn2.Task"
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "1"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getLabel(not view.ownedBorderedNodes->isEmpty())'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorder") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "SubProcess") [
+ semanticCandidatesExpression = '''self.getFlowNodeElements('SubProcess')'''.trimAql
+ domainClass = "bpmn2.SubProcess"
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteSubProcess")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveFlowElementFromLaneToSubProcess")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "EndEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ExternalLabel")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "StartEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorder")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataInput")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataObject")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataOutput")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "DataStore")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "Task")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:DarkYellow")
+ labelColor = SystemColor.extraRef("color:black")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ styleIf(FlatContainerStyleDescription, '''self.triggeredByEvent'''.trimAql) [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ borderLineStyle = LineStyle.DASH_LITERAL
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:DarkYellow")
+ labelColor = SystemColor.extraRef("color:black")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorderOnSubProcess") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "CallActivity_Process") [
+ preconditionExpression = '''self.calledElementRef.oclIsTypeOf(bpmn2::Process)'''.trimAql
+ semanticCandidatesExpression = '''self.getFlowNodeElements('CallActivity')'''.trimAql
+ semanticElements = '''Sequence{self,self.calledElementRef})'''.trimAql
+ domainClass = "bpmn2.CallActivity"
+ deletionDescription = DeleteElementDescription.ref(CollaborationDiagram, Ns.del, "DeleteCallActivity")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getCallActivityLabel()'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorderOnCallActivity_Process") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "CallActivity_Task") [
+ preconditionExpression = '''self.calledElementRef.oclIsKindOf(bpmn2::GlobalTask)'''.trimAql
+ semanticCandidatesExpression = '''self.getFlowNodeElements('CallActivity')'''.trimAql
+ semanticElements = '''Sequence{self,self.calledElementRef})'''.trimAql
+ domainClass = "bpmn2.CallActivity"
+ deletionDescription = DeleteElementDescription.ref(CollaborationDiagram, Ns.del, "DeleteCallActivity")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getCallActivityLabel()'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorderOnCallActivity_Task") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "Group") [
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::Group)'''.trimAql
+ domainClass = "bpmn2.Group"
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "GroupDirectEdit")
+ style = FlatContainerStyleDescription.create [
+ borderSizeComputationExpression = "1"
+ showIcon = false
+ labelExpression = "feature:description"
+ widthComputationExpression = "15"
+ heightComputationExpression = "3"
+ backgroundStyle = BackgroundStyle.GRADIENT_TOP_TO_BOTTOM_LITERAL
+ borderColor = SystemColor.extraRef("color:gray")
+ labelColor = SystemColor.extraRef("color:black")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "SequenceFlow") [
+ semanticCandidatesExpression = '''containerView.target.eAllContents(bpmn2::SequenceFlow)'''.trimAql
+ semanticElements = '''Sequence{self}->union(Sequence{self.conditionExpression})'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "SequenceFlow"
+ useDomainElement = true
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectTargetSequenceFlow")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectSourceSequenceFlow")
+ style = EdgeStyleDescription.create [
+ targetArrow = EdgeArrows.INPUT_FILL_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression!=null and not view.isDefaultPath()'''.trimAql) [
+ sourceArrow = EdgeArrows.DIAMOND_LITERAL
+ targetArrow = EdgeArrows.INPUT_FILL_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ beginLabelStyleDescription = BeginLabelStyleDescription.create [
+ labelExpression = '''self.conditionExpression.description'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression==null and view.isDefaultPath()'''.trimAql) [
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression!=null and view.isDefaultPath()'''.trimAql) [
+ sourceArrow = EdgeArrows.DIAMOND_LITERAL
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ beginLabelStyleDescription = BeginLabelStyleDescription.create [
+ labelExpression = '''self.conditionExpression.description'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "MessageFlow") [
+ semanticCandidatesExpression = '''if self.getDefinitionsObject() <> null then self.getDefinitionsObject().rootElements->filter(bpmn2::Collaboration)->collect(e|e.messageFlows) else Sequence{} endif'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "MessageFlow"
+ useDomainElement = true
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_LITERAL
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:MessageFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ labelExpression = '''self.name'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task.png"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "AssociationLink") [
+ semanticCandidatesExpression = '''containerView.target.eAllContents(bpmn2::Association)'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "bpmn2.Association"
+ useDomainElement = true
+ sourceMapping += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataInput")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataObject")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataOutput")
+ sourceMapping += NodeMapping.localRef(Ns.node, "DataStore")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Task")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Group")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "HorizontalLaneSet")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Lane")
+ sourceMapping += EdgeMapping.localRef(Ns.edge, "MessageFlow")
+ sourceMapping += EdgeMapping.localRef(Ns.edge, "SequenceFlow")
+ targetMapping += ContainerMapping.localRef(Ns.node, "HorizontalLaneSet")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Lane")
+ targetMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += EdgeMapping.localRef(Ns.edge, "MessageFlow")
+ targetMapping += EdgeMapping.localRef(Ns.edge, "SequenceFlow")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataObject")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataOutput")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataStore")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataInput")
+ targetMapping += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ targetMapping += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Group")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectTargetAssociationLink")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectSourceAssociationLink")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DOT_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:AssociationLinkColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ showIcon = false
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.sourceRef.oclIsKindOf(bpmn2::TextAnnotation) or self.targetRef.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql) [
+ lineStyle = LineStyle.DOT_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:AssociationLinkColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ showIcon = false
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "LabelEdge") [
+ targetFinderExpression = '''self'''.trimAql
+ sourceMapping += NodeMapping.localRef(Ns.node, "ExternalLabel")
+ targetMapping += NodeMapping.localRef(Ns.node, "EndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "StartEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataInput")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataObject")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataOutput")
+ targetMapping += NodeMapping.localRef(Ns.node, "DataStore")
+ targetMapping += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorder")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ strokeColor = SystemColor.extraRef("color:light_gray")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "Group") [
+ targetFinderExpression = '''self'''.trimAql
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Group")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Group")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_DOT_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ sizeComputationExpression = "3"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = SystemColor.extraRef("color:gray")
+ ]
+ ]
+ customizeBpmnNodeStyles
+ toolSections += createTools
+ toolSections += createConnectorsTools
+ toolSections += createEventsTools
+ toolSections += createEventDefinitionsTools
+ toolSections += createActivitiesTools
+ toolSections += createGatewaysTools
+ toolSections += createDataTools
+ toolSections += createOtherTools
+ decorationDescriptionsSet = DecorationDescriptionsSet.create [
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ScriptTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeScriptTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/script-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "BusinessRuleTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeBusinessRuleTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/business-rule-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ChoreographyTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeChoreographyTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ManualTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeManualTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/manual-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ReceiveTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeReceiveTask() and not self.instantiate'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ReceiveTaskInstanciate"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeReceiveTask() and self.instantiate'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task-process-instantiation.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "SendTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeSendTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/send-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ServiceTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeServiceTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/service-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "UserTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeUserTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/user-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityLoopMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::StandardLoopCharacteristics)'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/loop.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityConpensationMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.isForCompensation'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/compensation.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityParallelMultiInstanceMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::MultiInstanceLoopCharacteristics) and not self.loopCharacteristics.isSequential'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/mi.parallel.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivitySequentialMultiInstanceMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::MultiInstanceLoopCharacteristics) and self.loopCharacteristics.isSequential'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/mi.sequential.png"
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "TaskBorderOnCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "SubProcess"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''containerView.ownedDiagramElements->first().filter(diagram::DNodeContainer).isCollapsed()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/subprocess.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "AdHocSubProcessMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.oclIsTypeOf(bpmn2::AdHocSubProcess)'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/adhoc-sub-process.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CollapsedSubProcessMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''view.isCollapsed()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/subprocess.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CollectionMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.isCollection'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/collection.png"
+ mappings += NodeMapping.localRef(Ns.node, "DataInput")
+ mappings += NodeMapping.localRef(Ns.node, "DataObject")
+ mappings += NodeMapping.localRef(Ns.node, "DataOutput")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CallActivity"
+ position = Position.SOUTH_LITERAL
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/callactivity.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ ]
+ ]
+ }
+
+ def createTools() {
+ ToolSection.create("Tools") [
+ label = "%Tools"
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "FlowElementNameEdit") [
+ label = "FlowElementNameEdit"
+ forceRefresh = true
+ inputLabelExpression = '''self.name.trim()'''.trimAql
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ '''not self.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "name".setter('''self.trimLabel(arg0)'''.trimAql)
+ ),
+ '''self.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "text".setter('''self.trimLabel(arg0)'''.trimAql)
+ )
+ )
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveFlowElementFromLaneToSubProcess") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ mappings += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ mappings += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ mappings += NodeMapping.localRef(Ns.node, "StartEvent")
+ mappings += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "EndEvent")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''element.dropFlowElement(oldSemanticContainer, newSemanticContainer'''.trimAql.toOperation
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveFlowElementToLane") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += NodeMapping.localRef(Ns.node, "EndEvent")
+ mappings += NodeMapping.localRef(Ns.node, "ExclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "InclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "ParallelGateway")
+ mappings += NodeMapping.localRef(Ns.node, "StartEvent")
+ mappings += NodeMapping.localRef(Ns.node, "ComplexGateway")
+ mappings += NodeMapping.localRef(Ns.node, "EventBasedGateway")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateThrowEvent")
+ mappings += NodeMapping.localRef(Ns.node, "IntermediateCatchEvent")
+ mappings += ContainerMapping.localRef(Ns.node, "Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "CallActivity_Task")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "lanes"
+ elementExpression = '''oldSemanticContainer'''.trimAql
+ ],
+ "lanes".setter('''newSemanticContainer'''.trimAql),
+ '''newSemanticContainer.eContainer(bpmn2::Process)'''.trimAql.toContext(
+ "flowElements".setter('''element'''.trimAql),
+ '''element.boundaryEventRefs'''.trimAql.forDo("event",
+ '''newSemanticContainer.eContainer(bpmn2::Process)'''.trimAql.toContext(
+ "flowElements".setter('''event'''.trimAql)
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += DoubleClickDescription.createAs(Ns.operation, "SubProcessToggleCollapse_DoubleClick") [
+ forceRefresh = true
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ element = ElementDoubleClickVariable.create("element")
+ elementView = ElementDoubleClickVariable.create("elementView")
+ operation = '''elementView.toggleCollapse()'''.trimAql.toOperation
+ ]
+ ownedTools += OperationAction.createAs(Ns.operation, "ToggleCollapseSubProcess_ContextAction") [
+ label = "%ToggleCollapse"
+ precondition = '''self.oclIsKindOf(bpmn2::SubProcess)'''.trimAql
+ forceRefresh = true
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SubProcess.png"
+ view = ContainerViewVariable.create("views")
+ operation = '''views.toggleCollapse()'''.trimAql.toOperation
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveInputOutputSpecificationToLane") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += NodeMapping.localRef(Ns.node, "DataInput")
+ mappings += NodeMapping.localRef(Ns.node, "DataOutput")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''newSemanticContainer'''.trimAql.toContext(
+ '''self.eContainerOrSelf(bpmn2::Lane).partitionElement->isEmpty()'''.trimAql.ifThenDo(
+ "partitionElement".creator("bpmn2.InputOutputSpecification").chain(
+ "lanes".setter('''newSemanticContainer'''.trimAql)
+ )
+ ),
+ '''self.eContainerOrSelf(bpmn2::Lane).partitionElement'''.trimAql.toContext(
+ '''element.oclIsKindOf(bpmn2::DataInput)'''.trimAql.ifThenDo(
+ "dataInputs".setter('''element'''.trimAql).chain(
+ '''element'''.trimAql.toContext(
+ "lanes".setter('''newSemanticContainer.eContainerOrSelf(bpmn2::Lane)'''.trimAql)
+ )
+ )
+ ),
+ '''element.oclIsKindOf(bpmn2::DataOutput)'''.trimAql.ifThenDo(
+ "dataOutputs".setter('''element'''.trimAql).chain(
+ '''element'''.trimAql.toContext(
+ "lanes".setter('''newSemanticContainer.eContainerOrSelf(bpmn2::Lane)'''.trimAql)
+ )
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveExtensionValueToLane") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += NodeMapping.localRef(Ns.node, "DataObject")
+ mappings += NodeMapping.localRef(Ns.node, "DataStore")
+ mappings += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''newSemanticContainer'''.trimAql.toContext(
+ "extensionValues".setter('''element.eContainerOrSelf(bpmn2::ExtensionAttributeValue)'''.trimAql),
+ '''element'''.trimAql.toContext(
+ "lanes".setter('''newSemanticContainer'''.trimAql),
+ Unset.create [
+ featureName = "lanes"
+ elementExpression = '''oldSemanticContainer'''.trimAql
+ ]
+ )
+ )
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteCallActivity") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ operation = '''element.eContainerOrSelf(bpmn2::FlowElementsContainer)'''.trimAql.toContext(
+ Unset.create [
+ featureName = "flowElements"
+ elementExpression = '''element'''.trimAql
+ ]
+ )
+ ]
+ ownedTools += DoubleClickDescription.createAs(Ns.operation, "LaneSet_AutosizeLanes_DoubleClick") [
+ forceRefresh = true
+ mappings += ContainerMapping.localRef(Ns.node, "HorizontalLaneSet")
+ mappings += ContainerMapping.ref(CollaborationDiagram, Ns.node, "Participant")
+ element = ElementDoubleClickVariable.create("element")
+ elementView = ElementDoubleClickVariable.create("elementView")
+ operation = '''elementView.lanesAutoSize()'''.trimAql.toOperation
+ ]
+ ownedTools += OperationAction.createAs(Ns.operation, "LaneSet_AutosizeLanes_ContextAction") [
+ label = "%LanesAutosize"
+ precondition = '''self.oclIsKindOf(bpmn2::LaneSet)'''.trimAql
+ forceRefresh = true
+ icon = "/org.obeonetwork.dsl.bpmn2.design/icons/swimlane/pool.png"
+ view = ContainerViewVariable.create("views")
+ operation = '''views.lanesAutoSize()'''.trimAql.toOperation
+ ]
+ ownedTools += createConvertMenus
+ ownedTools += PasteDescription.createAs(Ns.operation, "Paste") [
+ label = "%Paste"
+ forceRefresh = true
+ container = DropContainerVariable.create("container")
+ containerView = ContainerViewVariable.create("containerView")
+ copiedView = ElementViewVariable.create("copiedView")
+ copiedElement = ElementVariable.create("copiedElement")
+ operation = "service:container.paste(containerView, copiedView, copiedElement)".toOperation
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteSubProcess") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ operation = '''element.deleteSubProcess(elementView)'''.trimAql.toOperation
+ ]
+ ownedTools += PopupMenu.createAs(Ns.menu, "ReorderLane_Popup") [
+ label = "%ReorderLane"
+ precondition = '''self.oclIsKindOf(bpmn2::Lane) and self.eContainer().lanes->size()>1'''.trimAql
+ forceRefresh = true
+ menuItemDescription += OperationAction.createAs(Ns.operation, "LaneUp_ContextAction") [
+ label = "%Up"
+ precondition = '''self.eContainer().lanes->indexOf(self)>1'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("view",
+ '''view.target.up()'''.trimAql.toOperation
+ )
+ ]
+ menuItemDescription += OperationAction.createAs(Ns.operation, "LaneDown_ContextAction") [
+ label = "%Down"
+ precondition = '''self.eContainer().lanes->indexOf(self) <> self.eContainer().lanes->size()'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("view",
+ '''view.target.down()'''.trimAql.toOperation
+ )
+ ]
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteLaneSet") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ // no operation
+ ]
+ ownedTools += OperationAction.createAs(Ns.operation, "ExternalLabel") [
+ label = "%ExternalLabel"
+ precondition = '''self.oclIsKindOf(bpmn2::Event) or self.oclIsKindOf(bpmn2::Gateway) or self.oclIsKindOf(bpmn2::ItemAwareElement)'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = "org.obeonetwork.bpmn2.design.setUnsetExternalLabels".javaDo("SetUnsetExternalLabels",
+ "views" -> '''views'''.trimAql
+ )
+ ]
+ ]
+ }
+
+
+ def createConnectorsTools() {
+ ToolSection.create("Connectors") [
+ label = "%Connectors"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SequenceFlow.png"
+ ownedTools += ToolGroup.create("Sequence") [
+ label = "%Sequence"
+ tools += EdgeCreationDescription.createAs(Ns.connect, "SequenceFlowCreationTool") [
+ label = "%Sequence"
+ precondition = '''preSource.eInverse('flowNodeRefs').eContainer() = preTarget.eInverse('flowNodeRefs').eContainer()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SequenceFlow.png"
+ edgeMappings += EdgeMapping.localRef(Ns.edge, "SequenceFlow")
+ sourceVariable = SourceEdgeCreationVariable.create("source")
+ targetVariable = TargetEdgeCreationVariable.create("target")
+ sourceViewVariable = SourceEdgeViewCreationVariable.create("sourceView")
+ targetViewVariable = TargetEdgeViewCreationVariable.create("targetView")
+ operation = '''source.eContainer()'''.trimAql.toContext(
+ '''source.eContainer(bpmn2::LaneSet)=target.eContainer(bpmn2::LaneSet)'''.trimAql.ifThenDo(
+ "flowElements".creator("bpmn2.SequenceFlow").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ ),
+ '''source.eContainerOrSelf(bpmn2::BoundaryEvent)=null'''.trimAql.ifThenDo(
+ )
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "Condition") [
+ label = "%Condition"
+ precondition = '''element.oclIsKindOf(bpmn2::SequenceFlow) and element.oclAsType(bpmn2::SequenceFlow)==null'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''self'''.trimAql.toContext(
+ "conditionExpression".creator("Expression")
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "SuppressCondition") [
+ label = "%SupressCondition"
+ precondition = '''element.oclIsKindOf(bpmn2::SequenceFlow) and element.oclAsType(bpmn2::SequenceFlow).conditionExpression!=null'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/remove.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = Unset.create [
+ featureName = "conditionExpression"
+ elementExpression = '''self.conditionExpression'''.trimAql
+ ]
+ ]
+ ]
+ ownedTools += EdgeCreationDescription.createAs(Ns.connect, "Association Creation Tool") [
+ label = "%Association"
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Association.png"
+ edgeMappings += EdgeMapping.localRef(Ns.edge, "AssociationLink")
+ sourceVariable = SourceEdgeCreationVariable.create("source")
+ targetVariable = TargetEdgeCreationVariable.create("target")
+ sourceViewVariable = SourceEdgeViewCreationVariable.create("sourceView")
+ targetViewVariable = TargetEdgeViewCreationVariable.create("targetView")
+ operation = '''source.eContainerOrSelf(bpmn2::Process)'''.trimAql.toContext(
+ '''source.oclIsKindOf(bpmn2::DataObject) or source.oclIsKindOf(bpmn2::DataInput) or source.oclIsKindOf(bpmn2::DataOutput) or source.oclIsKindOf(bpmn2::DataStore) or source.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ '''target.oclIsKindOf(bpmn2::Task) or target.oclIsKindOf(bpmn2::ReceiveTask) or target.oclIsKindOf(bpmn2::SendTask) or target.oclIsKindOf(bpmn2::ChoreographyTask) or target.oclIsKindOf(bpmn2::Gateway) or target.oclIsKindOf(bpmn2::Event) or target.oclIsKindOf(bpmn2::SubProcess) or target.oclIsKindOf(bpmn2::CallActivity)'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ ),
+ '''source.oclIsKindOf(bpmn2::Task) or source.oclIsKindOf(bpmn2::ReceiveTask) or source.oclIsKindOf(bpmn2::SendTask) or source.oclIsKindOf(bpmn2::Gateway) or source.oclIsKindOf(bpmn2::Event) or source.oclIsKindOf(bpmn2::SubProcess) or source.oclIsKindOf(bpmn2::CallActivity)'''.trimAql.ifThenDo(
+ '''target.oclIsKindOf(bpmn2::DataObject) or target.oclIsKindOf(bpmn2::DataInput) or target.oclIsKindOf(bpmn2::DataOutput) or target.oclIsKindOf(bpmn2::DataStore) or target.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ ),
+ '''source.oclIsKindOf(bpmn2::BoundaryEvent) and source.eventDefinitions->select(e|e.oclIsTypeOf(bpmn2::CompensateEventDefinition))->notEmpty()'''.trimAql.ifThenDo(
+ '''target.isForCompensation'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectTargetSequenceFlow") [
+ precondition = '''self.sourceRef.lanes->first().eContainer()=target.lanes->first().eContainer() or self.sourceRef.attachedToRef.lanes->first().eContainer()=target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "targetRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectSourceSequenceFlow") [
+ precondition = '''self.sourceRef.lanes->first().eContainer()=target.lanes->first().eContainer() or self.sourceRef.attachedToRef.lanes->first().eContainer()=target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ reconnectionKind = ReconnectionKind.RECONNECT_SOURCE_LITERAL
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "sourceRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectTargetAssociationLink") [
+ forceRefresh = true
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "targetRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectSourceAssociationLink") [
+ forceRefresh = true
+ reconnectionKind = ReconnectionKind.RECONNECT_SOURCE_LITERAL
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "sourceRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ]
+ }
+
+
+
+
+
+ def createEventDefinitionsTools() {
+ ToolSection.create("Event Definitions") [
+ label = "%EventDefinitions"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageEventDefinition.png"
+ ownedTools += OperationAction.createAs(Ns.operation, "OperationDeleteEventDefinition") [
+ label = "%RemoveEventDefinition"
+ precondition = '''views->first().target.oclIsKindOf(bpmn2::Event)'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("i",
+ '''i.target'''.trimAql.toContext(
+ Unset.create [
+ featureName = "eventDefinitions"
+ elementExpression = '''self.eventDefinitions->last()'''.trimAql
+ ]
+ )
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Message Event Definition") [
+ label = "%Message"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::MessageEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("MessageEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Timer Event Definition") [
+ label = "%Timer"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and element.eventDefinitions->filter(bpmn2::TimerEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TimerEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("TimerEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Escalation Event Definition") [
+ label = "%Escalation"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::EscalationEventDefinition)->isEmpty() and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent))'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/EscalationEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("EscalationEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Conditional Event Definition") [
+ label = "%Conditional"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and element.eventDefinitions->filter(bpmn2::ConditionalEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ConditionalEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("ConditionalEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Link Event Definition") [
+ label = "%Link"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::BoundaryEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and element.eventDefinitions->filter(bpmn2::LinkEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/LinkEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("LinkEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Error Event Definition") [
+ label = "%Error"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and element.eventDefinitions->filter(bpmn2::ErrorEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ErrorEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("ErrorEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Cancel Event Definition") [
+ label = "%Cancel"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and element.eventDefinitions->filter(bpmn2::CancelEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/CancelEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("CancelEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Compensate Event Definition") [
+ label = "%Compensate"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and element.eventDefinitions->filter(bpmn2::CompensateEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/CompensateEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("CompensateEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Signal Event Definition") [
+ label = "%Signal"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::SignalEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SignalEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("SignalEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Terminate Event Definition") [
+ label = "%Terminate"
+ precondition = '''element.oclIsKindOf(bpmn2::EndEvent) and element.eventDefinitions->filter(bpmn2::TerminateEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TerminateEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("TerminateEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Delete Event Definition") [
+ label = "%Delete"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not element.eventDefinitions->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/remove.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "eventDefinitions"
+ elementExpression = '''element.eventDefinitions->last()'''.trimAql
+ ]
+ )
+ ]
+ ]
+ }
+
+
+ def createOtherTools() {
+ ToolSection.create("Other") [
+ label = "%Other"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Lane.png"
+ ownedTools += ContainerCreationDescription.createAs(Ns.operation, "Lane") [
+ label = "%Lane"
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Lane.png"
+ containerMappings += ContainerMapping.localRef(Ns.node, "Lane")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainerOrSelf(bpmn2::LaneSet)'''.trimAql.toContext(
+ "lanes".creator("bpmn2.Lane").andThen[ variableName = "newLane" ].chain(
+ createInitDialog("Lane")
+ ),
+ '''container.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ '''container.eContainerOrSelf(bpmn2::LaneSet).moveElement('lanes',newLane,container)'''.trimAql.toOperation
+ ),
+ '''not container.oclIsKindOf(bpmn2::Lane)'''.trimAql.ifThenDo(
+ '''self.moveElementFirstPosition('lanes',newLane)'''.trimAql.toOperation
+ )
+ )
+ ]
+ ownedTools += NodeCreationDescription.createAs(Ns.creation, "TextAnnotation") [
+ label = "%TextAnnotation"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TextAnnotation.png"
+ nodeMappings += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainerOrSelf(bpmn2::Lane)'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.TextAnnotation").chain(
+ "lanes".setter('''container'''.trimAql)
+ )
+ )
+ )
+ ]
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "TextAnnotationDirectEdit") [
+ forceRefresh = true
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ "text".setter('''arg0'''.trimAql)
+ )
+ ]
+ ownedTools += ContainerCreationDescription.createAs(Ns.operation, "Group") [
+ label = "%Group"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ containerMappings += ContainerMapping.localRef(Ns.node, "Group")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainerOrSelf(bpmn2::Lane)'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.Group").chain(
+ "lanes".setter('''container'''.trimAql)
+ )
+ )
+ )
+ ]
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "GroupDirectEdit") [
+ forceRefresh = true
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ "description".setter('''arg0'''.trimAql)
+ )
+ ]
+ ]
+ }
+
+}
\ No newline at end of file
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/SubProcessDiagram.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/SubProcessDiagram.xtend
new file mode 100644
index 00000000..9f2ac811
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/SubProcessDiagram.xtend
@@ -0,0 +1,1715 @@
+package org.obeonetwork.dsl.bpmn2.design.description
+
+import org.eclipse.sirius.diagram.BackgroundStyle
+import org.eclipse.sirius.diagram.EdgeArrows
+import org.eclipse.sirius.diagram.EdgeRouting
+import org.eclipse.sirius.diagram.LabelPosition
+import org.eclipse.sirius.diagram.LineStyle
+import org.eclipse.sirius.diagram.ResizeKind
+import org.eclipse.sirius.diagram.description.CompositeLayout
+import org.eclipse.sirius.diagram.description.ContainerMapping
+import org.eclipse.sirius.diagram.description.ContainerMappingImport
+import org.eclipse.sirius.diagram.description.DiagramDescription
+import org.eclipse.sirius.diagram.description.EdgeMapping
+import org.eclipse.sirius.diagram.description.Layer
+import org.eclipse.sirius.diagram.description.LayoutDirection
+import org.eclipse.sirius.diagram.description.MappingBasedDecoration
+import org.eclipse.sirius.diagram.description.NodeMapping
+import org.eclipse.sirius.diagram.description.style.BeginLabelStyleDescription
+import org.eclipse.sirius.diagram.description.style.CenterLabelStyleDescription
+import org.eclipse.sirius.diagram.description.style.EdgeStyleDescription
+import org.eclipse.sirius.diagram.description.style.FlatContainerStyleDescription
+import org.eclipse.sirius.diagram.description.style.SquareDescription
+import org.eclipse.sirius.diagram.description.style.WorkspaceImageDescription
+import org.eclipse.sirius.diagram.description.tool.ContainerCreationDescription
+import org.eclipse.sirius.diagram.description.tool.ContainerDropDescription
+import org.eclipse.sirius.diagram.description.tool.DeleteElementDescription
+import org.eclipse.sirius.diagram.description.tool.DirectEditLabel
+import org.eclipse.sirius.diagram.description.tool.DoubleClickDescription
+import org.eclipse.sirius.diagram.description.tool.EdgeCreationDescription
+import org.eclipse.sirius.diagram.description.tool.ElementDoubleClickVariable
+import org.eclipse.sirius.diagram.description.tool.NodeCreationDescription
+import org.eclipse.sirius.diagram.description.tool.NodeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.ReconnectEdgeDescription
+import org.eclipse.sirius.diagram.description.tool.ReconnectionKind
+import org.eclipse.sirius.diagram.description.tool.SourceEdgeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.SourceEdgeViewCreationVariable
+import org.eclipse.sirius.diagram.description.tool.TargetEdgeCreationVariable
+import org.eclipse.sirius.diagram.description.tool.TargetEdgeViewCreationVariable
+import org.eclipse.sirius.diagram.description.tool.ToolGroup
+import org.eclipse.sirius.diagram.description.tool.ToolSection
+import org.eclipse.sirius.viewpoint.FontFormat
+import org.eclipse.sirius.viewpoint.LabelAlignment
+import org.eclipse.sirius.viewpoint.description.DecorationDescriptionsSet
+import org.eclipse.sirius.viewpoint.description.Position
+import org.eclipse.sirius.viewpoint.description.SystemColor
+import org.eclipse.sirius.viewpoint.description.UserFixedColor
+import org.eclipse.sirius.viewpoint.description.style.BasicLabelStyleDescription
+import org.eclipse.sirius.viewpoint.description.tool.ContainerViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.DropContainerVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementDeleteVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementDropVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementSelectVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementVariable
+import org.eclipse.sirius.viewpoint.description.tool.ElementViewVariable
+import org.eclipse.sirius.viewpoint.description.tool.OperationAction
+import org.eclipse.sirius.viewpoint.description.tool.PasteDescription
+import org.eclipse.sirius.viewpoint.description.tool.ToolDescription
+import org.eclipse.sirius.viewpoint.description.tool.Unset
+import org.obeonetwork.dsl.bpmn2.SubProcess
+
+import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.*
+
+class SubProcessDiagram extends BpmnDiagram {
+
+ new(BpmnDesign parent) {
+ super(parent, "SubProcessDiagram", "Sub-Process Diagram", SubProcess)
+ }
+
+ override initContent(DiagramDescription it) {
+ super.initContent(it)
+ titleExpression = '''self.name'''.trimAql
+ enablePopupBars = true
+ layout = CompositeLayout.create [
+ direction = LayoutDirection.LEFT_TO_RIGHT
+ ]
+ }
+
+ override initDefaultStyle(BasicLabelStyleDescription it) {/* No reverse for Default */}
+ override initDefaultEdgeStyle(EdgeStyleDescription it) {/* No reverse for Default */}
+
+
+ override initContent(Layer it) {
+ containerMappings += ContainerMapping.createAs(Ns.node, "SubProcess") [
+ semanticCandidatesExpression = '''self'''.trimAql
+ domainClass = "bpmn2.SubProcess"
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteSubProcess")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ dropDescriptions += ContainerDropDescription.localRef(Ns.drop, "MoveFlowElementFromLaneToSubProcess")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:DarkYellow")
+ labelColor = SystemColor.extraRef("color:black")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ styleIf(FlatContainerStyleDescription, '''self.triggeredByEvent'''.trimAql) [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ borderLineStyle = LineStyle.DASH_LITERAL
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:DarkYellow")
+ labelColor = SystemColor.extraRef("color:black")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ borderedNodeMappings += NodeMapping.createAs(Ns.node, "TaskBorderOnSubProcess") [
+ semanticCandidatesExpression = '''self.boundaryEventRefs'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BoundaryEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPExternalLabel") [
+ semanticCandidatesExpression = '''containerView.getElementsWithExternalLabel()'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.BaseElement"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = SquareDescription.create [
+ showIcon = false
+ labelExpression = '''self.getExternalLabel()'''.trimAql
+ sizeComputationExpression = '''self.getExternalLabelSize()'''.trimAql
+ labelPosition = LabelPosition.NODE_LITERAL
+ resizeKind = ResizeKind.NSEW_LITERAL
+ borderColor = UserFixedColor.ref("color:LightYellow")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ color = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPStartEvent") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::StartEvent)'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.StartEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/start.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPEndEvent") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::EndEvent)'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.EndEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/end.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPIntermediateCatchEvent") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::IntermediateCatchEvent)'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.IntermediateCatchEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPIntermediateThrowEvent") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::IntermediateThrowEvent)'''.trimAql
+ semanticElements = '''self.eventDefinitions->union(Sequence{self})'''.trimAql
+ domainClass = "bpmn2.IntermediateThrowEvent"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/none.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPParallelGateway") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::ParallelGateway)'''.trimAql
+ domainClass = "bpmn2.ParallelGateway"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ sizeComputationExpression = "4"
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/gateway/parallel-gateway.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPInclusiveGateway") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::InclusiveGateway)'''.trimAql
+ domainClass = "bpmn2.InclusiveGateway"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ sizeComputationExpression = "4"
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/gateway/inclusive-gateway.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPExclusiveGateway") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::ExclusiveGateway)'''.trimAql
+ domainClass = "bpmn2.ExclusiveGateway"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ sizeComputationExpression = "4"
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/gateway/exclusive-gateway.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPComplexGateway") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::ComplexGateway)'''.trimAql
+ domainClass = "bpmn2.ComplexGateway"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ sizeComputationExpression = "4"
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/gateway/complex-gateway.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPEventBasedGateway") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::EventBasedGateway)'''.trimAql
+ domainClass = "bpmn2.EventBasedGateway"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ sizeComputationExpression = "4"
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/gateway/event-based-gateway.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPDataObject") [
+ name = "SPDataObject " //typo
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::DataObject)'''.trimAql
+ domainClass = "bpmn2.DataObject"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ resizeKind = ResizeKind.NSEW_LITERAL
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/data/data-object.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPDataStore") [
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::DataStore)'''.trimAql
+ domainClass = "bpmn2.DataStore"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ resizeKind = ResizeKind.NSEW_LITERAL
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/data/data-store.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPDataInput") [
+ semanticCandidatesExpression = '''self.ioSpecification.dataInputs'''.trimAql
+ domainClass = "bpmn2.DataInput"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ resizeKind = ResizeKind.NSEW_LITERAL
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/data/data-input.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "SPDataOutput") [
+ semanticCandidatesExpression = '''self.ioSpecification.dataOutputs'''.trimAql
+ domainClass = "bpmn2.DataOutput"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = WorkspaceImageDescription.create [
+ showIcon = false
+ labelExpression = '''self.getNonExternalLabel(view)'''.trimAql
+ resizeKind = ResizeKind.NSEW_LITERAL
+ arcWidth = 1
+ arcHeight = 1
+ workspacePath = "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/data/data-output.svg"
+ borderColor = SystemColor.extraRef("color:black")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ ]
+ ]
+ subNodeMappings += NodeMapping.createAs(Ns.node, "TextAnnotation") [
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::TextAnnotation)'''.trimAql
+ domainClass = "bpmn2.TextAnnotation"
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "TextAnnotationDirectEdit")
+ style = SquareDescription.create [
+ labelExpression = "feature:text"
+ labelAlignment = LabelAlignment.LEFT
+ labelPosition = LabelPosition.NODE_LITERAL
+ resizeKind = ResizeKind.NSEW_LITERAL
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ color = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "SPTask") [
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::Task)'''.trimAql
+ domainClass = "bpmn2.Task"
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "1"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getLabel(not view.ownedBorderedNodes->isEmpty())'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ ]
+ subContainerMappings += ContainerMappingImport.createAs(Ns.node, "SPSubProcess") [
+ semanticCandidatesExpression = "service:getSubElements()"
+ domainClass = "bpmn2.SubProcess"
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteSubProcess")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ reusedBorderedNodeMappings += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPComplexGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPDataInput")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPDataObject")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPDataOutput")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPDataStore")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPEventBasedGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPExclusiveGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPInclusiveGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPParallelGateway")
+ reusedNodeMappings += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ reusedContainerMappings += ContainerMappingImport.localRef(Ns.node, "SPSubProcess")
+ reusedContainerMappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ importedMapping = ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "SPCallActivity_Process") [
+ preconditionExpression = '''self.calledElementRef.oclIsTypeOf(bpmn2::Process)'''.trimAql
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::CallActivity)'''.trimAql
+ semanticElements = '''Sequence{self,self.calledElementRef})'''.trimAql
+ domainClass = "bpmn2.CallActivity"
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteCallActivity")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getCallActivityLabel()'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "SPCallActivity_Task") [
+ preconditionExpression = '''self.calledElementRef.oclIsKindOf(bpmn2::GlobalTask)'''.trimAql
+ semanticCandidatesExpression = '''self.flowElements->filter(bpmn2::CallActivity)'''.trimAql
+ semanticElements = '''Sequence{self,self.calledElementRef})'''.trimAql
+ domainClass = "bpmn2.CallActivity"
+ deletionDescription = DeleteElementDescription.localRef(Ns.del, "DeleteCallActivity")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ style = FlatContainerStyleDescription.create [
+ arcWidth = 20
+ arcHeight = 20
+ borderSizeComputationExpression = "3"
+ labelSize = 9
+ labelFormat += FontFormat.BOLD_LITERAL
+ showIcon = false
+ labelExpression = '''self.getCallActivityLabel()'''.trimAql
+ roundedCorner = true
+ borderColor = UserFixedColor.ref("color:TextBackground")
+ labelColor = UserFixedColor.ref("color:TextBackground")
+ backgroundColor = UserFixedColor.ref("color:Yellow")
+ foregroundColor = UserFixedColor.ref("color:Yellow")
+ ]
+ ]
+ subContainerMappings += ContainerMapping.createAs(Ns.node, "Group") [
+ semanticCandidatesExpression = '''self.extensionValues.value->filter(bpmn2::Group)'''.trimAql
+ domainClass = "bpmn2.Group"
+ pasteDescriptions += PasteDescription.ref(ProcessDiagram, Ns.operation, "Paste")
+ pasteDescriptions += PasteDescription.localRef(Ns.operation, "Paste")
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "GroupDirectEdit")
+ style = FlatContainerStyleDescription.create [
+ borderSizeComputationExpression = "1"
+ showIcon = false
+ labelExpression = "feature:description"
+ widthComputationExpression = "15"
+ heightComputationExpression = "3"
+ backgroundStyle = BackgroundStyle.GRADIENT_TOP_TO_BOTTOM_LITERAL
+ borderColor = SystemColor.extraRef("color:gray")
+ labelColor = SystemColor.extraRef("color:black")
+ backgroundColor = UserFixedColor.ref("color:LightYellow")
+ foregroundColor = UserFixedColor.ref("color:LightYellow")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "SequenceFlow") [
+ semanticCandidatesExpression = '''containerView.target.eAllContents(bpmn2::SequenceFlow)'''.trimAql
+ semanticElements = '''Sequence{self}->union(Sequence{self.conditionExpression})'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "SequenceFlow"
+ useDomainElement = true
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPComplexGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPEventBasedGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPExclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPInclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPParallelGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPTask")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPIntermediateThrowEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPEventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPInclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPTask")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPIntermediateThrowEvent")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectTargetSequenceFlow")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectSourceSequenceFlow")
+ style = EdgeStyleDescription.create [
+ targetArrow = EdgeArrows.INPUT_FILL_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression!=null and not view.isDefaultPath()'''.trimAql) [
+ sourceArrow = EdgeArrows.DIAMOND_LITERAL
+ targetArrow = EdgeArrows.INPUT_FILL_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ beginLabelStyleDescription = BeginLabelStyleDescription.create [
+ labelExpression = '''self.conditionExpression.description'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression==null and view.isDefaultPath()'''.trimAql) [
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.conditionExpression!=null and view.isDefaultPath()'''.trimAql) [
+ sourceArrow = EdgeArrows.DIAMOND_LITERAL
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:SequenceFlowColor")
+ beginLabelStyleDescription = BeginLabelStyleDescription.create [
+ labelExpression = '''self.conditionExpression.description'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ showIcon = false
+ labelExpression = '''self.name'''.trimAql
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "MessageFlow") [
+ semanticCandidatesExpression = '''if self.getDefinitionsObject() <> null then self.getDefinitionsObject().rootElements->filter(bpmn2::Collaboration)->collect(e|e.messageFlows) else Sequence{} endif'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "MessageFlow"
+ useDomainElement = true
+ labelDirectEdit = DirectEditLabel.localRef(Ns.operation, "FlowElementNameEdit")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPTask")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += ContainerMappingImport.localRef(Ns.node, "SPSubProcess")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPTask")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += ContainerMappingImport.localRef(Ns.node, "SPSubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_LITERAL
+ targetArrow = EdgeArrows.INPUT_CLOSED_ARROW_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:MessageFlowColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelFormat += FontFormat.ITALIC_LITERAL
+ labelExpression = '''self.name'''.trimAql
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task.png"
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "AssociationLink") [
+ semanticCandidatesExpression = '''containerView.target.eContainer(bpmn2::Process).eAllContents(bpmn2::Association)'''.trimAql
+ targetFinderExpression = '''self.targetRef'''.trimAql
+ sourceFinderExpression = '''self.sourceRef'''.trimAql
+ domainClass = "bpmn2.Association"
+ useDomainElement = true
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPComplexGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPDataInput")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPDataObject")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPDataOutput")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPDataStore")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPEventBasedGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPInclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPParallelGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPTask")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ sourceMapping += EdgeMapping.localRef(Ns.edge, "MessageFlow")
+ sourceMapping += EdgeMapping.localRef(Ns.edge, "SequenceFlow")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPExclusiveGateway")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Group")
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPIntermediateThrowEvent")
+ sourceMapping += ContainerMappingImport.localRef(Ns.node, "SPSubProcess")
+ sourceMapping += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ targetMapping += EdgeMapping.localRef(Ns.edge, "MessageFlow")
+ targetMapping += EdgeMapping.localRef(Ns.edge, "SequenceFlow")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPComplexGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataInput")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataObject")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataOutput")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataStore")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPEventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPInclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPTask")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ targetMapping += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Group")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPIntermediateThrowEvent")
+ targetMapping += ContainerMappingImport.localRef(Ns.node, "SPSubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectTargetAssociationLink")
+ reconnections += ReconnectEdgeDescription.localRef(Ns.reconnect, "ReconnectSourceAssociationLink")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DOT_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:AssociationLinkColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ showIcon = false
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ styleIf('''self.sourceRef.oclIsKindOf(bpmn2::TextAnnotation) or self.targetRef.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql) [
+ lineStyle = LineStyle.DOT_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ sizeComputationExpression = "2"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = UserFixedColor.ref("color:AssociationLinkColor")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ showIcon = false
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "LabelEdge") [
+ targetFinderExpression = '''self'''.trimAql
+ sourceMapping += NodeMapping.localRef(Ns.node, "SPExternalLabel")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataInput")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataObject")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataOutput")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPDataStore")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPEventBasedGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPExclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPInclusiveGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPIntermediateThrowEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPParallelGateway")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ targetMapping += NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ targetMapping += NodeMapping.localRef(Ns.node, "SPComplexGateway")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = SystemColor.extraRef("color:light_gray")
+ centerLabelStyleDescription = CenterLabelStyleDescription.create [
+ labelColor = SystemColor.extraRef("color:black")
+ ]
+ ]
+ ]
+ edgeMappings += EdgeMapping.createAs(Ns.edge, "Group") [
+ targetFinderExpression = '''self'''.trimAql
+ sourceMapping += ContainerMapping.localRef(Ns.node, "Group")
+ targetMapping += ContainerMapping.localRef(Ns.node, "Group")
+ style = EdgeStyleDescription.create [
+ lineStyle = LineStyle.DASH_DOT_LITERAL
+ targetArrow = EdgeArrows.NO_DECORATION_LITERAL
+ sizeComputationExpression = "3"
+ routingStyle = EdgeRouting.MANHATTAN_LITERAL
+ strokeColor = SystemColor.extraRef("color:gray")
+ ]
+ ]
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CancelEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/cancel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/cancel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/cancel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/cancel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/cancel.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/cancel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CompensateEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/compensation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/compensation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/compensation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/compensation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/compensation.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/compensation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ConditionalEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/conditional.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/conditional.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/conditional.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/conditional.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/conditional.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/conditional.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ErrorEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/error.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/error.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/error.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/error.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/error.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/error.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::EscalationEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/escalation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/escalation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/escalation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/escalation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/escalation.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/escalation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::LinkEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/link.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/link.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/link.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/link.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/link.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/link.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::MessageEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/message.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/message.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/message.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/message.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/message.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/message.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::SignalEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/signal.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/signal.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/signal.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/signal.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/signal.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/signal.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TerminateEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/terminate.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/terminate.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/terminate.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/terminate.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/terminate.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/terminate.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TimerEventDefinition)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/timer.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/timer.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/timer.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/timer.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/timer.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/timer.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CancelEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/cancel.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/cancel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CompensateEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/compensation.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/compensation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ConditionalEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/conditional.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/conditional.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ErrorEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/error.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/error.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::EscalationEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/escalation.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/escalation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::LinkEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/link.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/link.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::MessageEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/message.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/message.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::SignalEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/signal.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/signal.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TerminateEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/terminate.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/terminate.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TimerEventDefinition) and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/timer.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/timer.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and not self.parallelMultiple'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/multiple.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.parallelMultiple'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event/mi.parallel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/multiple.parallel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/catch-event/multiple.parallel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateCatchEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/multiple.parallel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ ),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/boundary-events/multiple.parallel.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-boundary-events/multiple.parallel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and not self.parallelMultiple and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/multiple.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.parallelMultiple and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/multiple.parallel.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/multiple.parallel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==0 and not self.cancelActivity'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/non-interrupting-boundary-events/none.svg"),
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/sub-process-non-interrupting-boundary-events/none.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "TaskBorderOnSubProcess") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.oclIsTypeOf(bpmn2::EndEvent)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/end-event/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEndEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.oclIsTypeOf(bpmn2::IntermediateThrowEvent)'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/throw-event/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPIntermediateThrowEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.instantiate and self.eventGatewayType=bpmn2::EventBasedGatewayType::Parallel'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/gateway/parallel-start-event-based-gateway.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEventBasedGateway") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.instantiate and self.eventGatewayType=bpmn2::EventBasedGatewayType::Exclusive'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/gateway/start-event-based-gateway.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPEventBasedGateway") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CancelEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/cancel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::CompensateEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/compensation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ConditionalEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/conditional.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::ErrorEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/error.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::EscalationEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/escalation.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::LinkEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/link.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::MessageEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/message.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::SignalEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/signal.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TerminateEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/terminate.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==1 and self.eventDefinitions->first().oclIsTypeOf(bpmn2::TimerEventDefinition) and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/timer.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and not self.parallelMultiple and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/multiple.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()>1 and self.parallelMultiple and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/mi.parallel.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ styleCustomisations += '''self.eventDefinitions->size()==0 and not self.isInterrupting'''.trimAql.thenStyle(
+ "workspacePath".attCustomization("/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/start-event-non-interrupting/start.svg",
+ WorkspaceImageDescription.localRef(Ns.node, "SPStartEvent") [ (it as NodeMapping).style as WorkspaceImageDescription ]
+ )
+ )
+ toolSections += createTools
+ toolSections += createConnectorsTools
+ toolSections += createEventsTools
+ toolSections += createEventDefinitionsTools
+ toolSections += createActivitiesTools
+ toolSections += createGatewaysTools
+ toolSections += createDataTools
+ toolSections += createOtherTools
+ decorationDescriptionsSet = DecorationDescriptionsSet.create [
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ScriptTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeScriptTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/script-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ mappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "BusinessRuleTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeBusinessRuleTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/business-rule-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ mappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ChoreographyTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeChoreographyTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ManualTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeManualTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/manual-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ReceiveTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeReceiveTask() and not self.instantiate'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ReceiveTaskInstanciate"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeReceiveTask() and self.instantiate'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/receive-task-process-instantiation.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "SendTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeSendTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/send-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ServiceTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeServiceTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/service-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "UserTask"
+ position = Position.NORTH_WEST_LITERAL
+ preconditionExpression = '''self.isLikeUserTask()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/north-west/user-task.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityLoopMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::StandardLoopCharacteristics)'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/loop.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityConpensationMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.isForCompensation'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/compensation.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivityParallelMultiInstanceMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::MultiInstanceLoopCharacteristics) and not self.loopCharacteristics.isSequential'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/mi.parallel.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "ActivitySequentialMultiInstanceMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.loopCharacteristics.oclIsKindOf(bpmn2::MultiInstanceLoopCharacteristics) and self.loopCharacteristics.isSequential'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/mi.sequential.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "SubProcess"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''containerView.ownedDiagramElements->first().filter(diagram::DNodeContainer).isCollapsed()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/subprocess.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "AdHocSubProcessMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.oclIsTypeOf(bpmn2::AdHocSubProcess)'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/adhoc-sub-process.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CollapsedSubProcessMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''view.isCollapsed()'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/subprocess.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CollectionMarker"
+ position = Position.SOUTH_LITERAL
+ preconditionExpression = '''self.isCollection'''.trimAql
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/collection.png"
+ mappings += NodeMapping.localRef(Ns.node, "SPDataInput")
+ mappings += NodeMapping.localRef(Ns.node, "SPDataObject")
+ mappings += NodeMapping.localRef(Ns.node, "SPDataOutput")
+ ]
+ decorationDescriptions += MappingBasedDecoration.create [
+ name = "CallActivitySubProcess"
+ position = Position.SOUTH_LITERAL
+ imageExpression = "/org.obeonetwork.dsl.bpmn2.design/icons2/decorations/process/south/callactivity.collapsed.png"
+ mappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ ]
+ ]
+ }
+
+ def createTools() {
+ ToolSection.create("Tools") [
+ label = "%Tools"
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "FlowElementNameEdit") [
+ label = "FlowElementNameEdit"
+ forceRefresh = true
+ inputLabelExpression = '''self.name.trim()'''.trimAql
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ '''not self.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "name".setter('''self.trimLabel(arg0)'''.trimAql)
+ ),
+ '''self.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "text".setter('''self.trimLabel(arg0)'''.trimAql)
+ )
+ )
+ ]
+ ownedTools += ContainerDropDescription.createAs(Ns.drop, "MoveFlowElementFromLaneToSubProcess") [
+ forceRefresh = true
+ moveEdges = true
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Process")
+ mappings += ContainerMapping.localRef(Ns.node, "SPCallActivity_Task")
+ mappings += NodeMapping.localRef(Ns.node, "SPComplexGateway")
+ mappings += NodeMapping.localRef(Ns.node, "SPEndEvent")
+ mappings += NodeMapping.localRef(Ns.node, "SPEventBasedGateway")
+ mappings += NodeMapping.localRef(Ns.node, "SPExclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "SPInclusiveGateway")
+ mappings += NodeMapping.localRef(Ns.node, "SPIntermediateCatchEvent")
+ mappings += NodeMapping.localRef(Ns.node, "SPIntermediateThrowEvent")
+ mappings += NodeMapping.localRef(Ns.node, "SPParallelGateway")
+ mappings += NodeMapping.localRef(Ns.node, "SPStartEvent")
+ mappings += ContainerMappingImport.localRef(Ns.node, "SPSubProcess")
+ mappings += ContainerMapping.localRef(Ns.node, "SPTask")
+ oldContainer = DropContainerVariable.create("oldSemanticContainer")
+ newContainer = DropContainerVariable.create("newSemanticContainer")
+ element = ElementDropVariable.create("element")
+ newViewContainer = ContainerViewVariable.create("newContainerView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "lanes"
+ elementExpression = '''oldSemanticContainer'''.trimAql
+ ],
+ '''newSemanticContainer'''.trimAql.toContext(
+ "flowElements".setter('''element'''.trimAql),
+ '''element.boundaryEventRefs'''.trimAql.forDo("event",
+ '''newSemanticContainer'''.trimAql.toContext(
+ "flowElements".setter('''event'''.trimAql)
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += DoubleClickDescription.createAs(Ns.operation, "SubProcessToggleCollapse_DoubleClick") [
+ forceRefresh = true
+ mappings += ContainerMapping.localRef(Ns.node, "SubProcess")
+ element = ElementDoubleClickVariable.create("element")
+ elementView = ElementDoubleClickVariable.create("elementView")
+ operation = '''elementView.toggleCollapse()'''.trimAql.toOperation
+ ]
+ ownedTools += OperationAction.createAs(Ns.operation, "ToggleCollapseSubProcess_ContextAction") [
+ label = "%ToggleCollapse"
+ precondition = '''self.oclIsKindOf(bpmn2::SubProcess)'''.trimAql
+ forceRefresh = true
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SubProcess.png"
+ view = ContainerViewVariable.create("views")
+ operation = '''views.toggleCollapse()'''.trimAql.toOperation
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteCallActivity") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ operation = '''element.eContainerOrSelf(bpmn2::FlowElementsContainer)'''.trimAql.toContext(
+ Unset.create [
+ featureName = "flowElements"
+ elementExpression = '''element'''.trimAql
+ ]
+ )
+ ]
+ ownedTools += createConvertMenus
+ ownedTools += PasteDescription.createAs(Ns.operation, "Paste") [
+ label = "%Paste"
+ forceRefresh = true
+ container = DropContainerVariable.create("container")
+ containerView = ContainerViewVariable.create("containerView")
+ copiedView = ElementViewVariable.create("copiedView")
+ copiedElement = ElementVariable.create("copiedElement")
+ operation = "service:container.paste(containerView, copiedView, copiedElement)".toOperation
+ ]
+ ownedTools += DeleteElementDescription.createAs(Ns.del, "DeleteSubProcess") [
+ forceRefresh = true
+ element = ElementDeleteVariable.create("element")
+ elementView = ElementDeleteVariable.create("elementView")
+ containerView = ContainerViewVariable.create("containerView")
+ operation = '''element.deleteSubProcess(elementView)'''.trimAql.toOperation
+ ]
+ ownedTools += OperationAction.createAs(Ns.operation, "ExternalLabel") [
+ label = "%ExternalLabel"
+ precondition = '''self.oclIsKindOf(bpmn2::Event) or self.oclIsKindOf(bpmn2::Gateway) or self.oclIsKindOf(bpmn2::ItemAwareElement)'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = "org.obeonetwork.bpmn2.design.setUnsetExternalLabels".javaDo("SetUnsetExternalLabels",
+ "views" -> '''views'''.trimAql
+ )
+ ]
+ ]
+ }
+
+
+ def createConnectorsTools() {
+ ToolSection.create("Connectors") [
+ label = "%Connectors"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SequenceFlow.png"
+ ownedTools += ToolGroup.create("Sequence") [
+ label = "%Sequence"
+ tools += EdgeCreationDescription.createAs(Ns.connect, "SequenceFlowCreationTool") [
+ label = "%Sequence"
+ precondition = '''preSource.eInverse('flowNodeRefs').eContainer() = preTarget.eInverse('flowNodeRefs').eContainer()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SequenceFlow.png"
+ edgeMappings += EdgeMapping.localRef(Ns.edge, "SequenceFlow")
+ sourceVariable = SourceEdgeCreationVariable.create("source")
+ targetVariable = TargetEdgeCreationVariable.create("target")
+ sourceViewVariable = SourceEdgeViewCreationVariable.create("sourceView")
+ targetViewVariable = TargetEdgeViewCreationVariable.create("targetView")
+ operation = '''source.eContainer()'''.trimAql.toContext(
+ '''source.eContainer(bpmn2::LaneSet)=target.eContainer(bpmn2::LaneSet)'''.trimAql.ifThenDo(
+ "flowElements".creator("bpmn2.SequenceFlow").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ ),
+ '''source.eContainerOrSelf(bpmn2::BoundaryEvent)=null'''.trimAql.ifThenDo(
+ )
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "Condition") [
+ label = "%Condition"
+ precondition = '''element.oclIsKindOf(bpmn2::SequenceFlow) and element.oclAsType(bpmn2::SequenceFlow)==null'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Expression.gif"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''self'''.trimAql.toContext(
+ "conditionExpression".creator("Expression")
+ )
+ ]
+ tools += ToolDescription.createAs(Ns.operation, "SuppressCondition") [
+ label = "%SupressCondition"
+ precondition = '''element.oclIsKindOf(bpmn2::SequenceFlow) and element.oclAsType(bpmn2::SequenceFlow).conditionExpression!=null'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/remove.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = Unset.create [
+ featureName = "conditionExpression"
+ elementExpression = '''self.conditionExpression'''.trimAql
+ ]
+ ]
+ ]
+ ownedTools += EdgeCreationDescription.createAs(Ns.connect, "Association Creation Tool") [
+ label = "%Association"
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Association.png"
+ edgeMappings += EdgeMapping.localRef(Ns.edge, "AssociationLink")
+ sourceVariable = SourceEdgeCreationVariable.create("source")
+ targetVariable = TargetEdgeCreationVariable.create("target")
+ sourceViewVariable = SourceEdgeViewCreationVariable.create("sourceView")
+ targetViewVariable = TargetEdgeViewCreationVariable.create("targetView")
+ operation = '''source.eContainerOrSelf(bpmn2::Process)'''.trimAql.toContext(
+ '''source.oclIsKindOf(bpmn2::DataObject) or source.oclIsKindOf(bpmn2::DataInput) or source.oclIsKindOf(bpmn2::DataOutput) or source.oclIsKindOf(bpmn2::DataStore) or source.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ '''target.oclIsKindOf(bpmn2::Task) or target.oclIsKindOf(bpmn2::ReceiveTask) or target.oclIsKindOf(bpmn2::SendTask) or target.oclIsKindOf(bpmn2::ChoreographyTask) or target.oclIsKindOf(bpmn2::Gateway) or target.oclIsKindOf(bpmn2::Event) or target.oclIsKindOf(bpmn2::SubProcess) or target.oclIsKindOf(bpmn2::CallActivity)'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ ),
+ '''source.oclIsKindOf(bpmn2::Task) or source.oclIsKindOf(bpmn2::ReceiveTask) or source.oclIsKindOf(bpmn2::SendTask) or source.oclIsKindOf(bpmn2::Gateway) or source.oclIsKindOf(bpmn2::Event) or source.oclIsKindOf(bpmn2::SubProcess) or source.oclIsKindOf(bpmn2::CallActivity)'''.trimAql.ifThenDo(
+ '''target.oclIsKindOf(bpmn2::DataObject) or target.oclIsKindOf(bpmn2::DataInput) or target.oclIsKindOf(bpmn2::DataOutput) or target.oclIsKindOf(bpmn2::DataStore) or target.oclIsKindOf(bpmn2::TextAnnotation)'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ ),
+ '''source.oclIsKindOf(bpmn2::BoundaryEvent) and source.eventDefinitions->select(e|e.oclIsTypeOf(bpmn2::CompensateEventDefinition))->notEmpty()'''.trimAql.ifThenDo(
+ '''target.isForCompensation'''.trimAql.ifThenDo(
+ "artifacts".creator("bpmn2.Association").chain(
+ '''instance'''.trimAql.toContext(
+ "sourceRef".setter('''source'''.trimAql),
+ "targetRef".setter('''target'''.trimAql)
+ )
+ )
+ )
+ )
+ )
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectTargetSequenceFlow") [
+ precondition = '''self.sourceRef.lanes->first().eContainer()=target.lanes->first().eContainer() or self.sourceRef.attachedToRef.lanes->first().eContainer()=target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "targetRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectSourceSequenceFlow") [
+ precondition = '''self.sourceRef.lanes->first().eContainer()=target.lanes->first().eContainer() or self.sourceRef.attachedToRef.lanes->first().eContainer()=target.lanes->first().eContainer()'''.trimAql
+ forceRefresh = true
+ reconnectionKind = ReconnectionKind.RECONNECT_SOURCE_LITERAL
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "sourceRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectTargetAssociationLink") [
+ forceRefresh = true
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "targetRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ownedTools += ReconnectEdgeDescription.createAs(Ns.reconnect, "ReconnectSourceAssociationLink") [
+ forceRefresh = true
+ reconnectionKind = ReconnectionKind.RECONNECT_SOURCE_LITERAL
+ source = SourceEdgeCreationVariable.create("source")
+ target = TargetEdgeCreationVariable.create("target")
+ sourceView = SourceEdgeViewCreationVariable.create("sourceView")
+ targetView = TargetEdgeViewCreationVariable.create("targetView")
+ element = ElementSelectVariable.create("element")
+ operation = '''element'''.trimAql.toContext(
+ "sourceRef".setter('''target'''.trimAql)
+ )
+ edgeView = ElementSelectVariable.create("edgeView")
+ ]
+ ]
+ }
+
+ override getEventCreationMappings() {
+ #[
+ NodeMapping.localRef(Ns.node, "TaskBorderOnSubProcess")
+ ]
+ }
+
+ def createEventDefinitionsTools() {
+ ToolSection.create("Event Definitions") [
+ label = "%EventDefinitions"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageEventDefinition.png"
+ ownedTools += OperationAction.createAs(Ns.operation, "OperationDeleteEventDefinition") [
+ label = "%RemoveEventDefinition"
+ precondition = '''views->first().target.oclIsKindOf(bpmn2::Event)'''.trimAql
+ forceRefresh = true
+ view = ContainerViewVariable.create("views")
+ operation = '''views'''.trimAql.forDo("i",
+ '''i.target'''.trimAql.toContext(
+ Unset.create [
+ featureName = "eventDefinitions"
+ elementExpression = '''self.eventDefinitions->last()'''.trimAql
+ ]
+ )
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Message Event Definition") [
+ label = "%Message"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::MessageEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/MessageEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("MessageEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Timer Event Definition") [
+ label = "%Timer"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and element.eventDefinitions->filter(bpmn2::TimerEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TimerEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("TimerEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Escalation Event Definition") [
+ label = "%Escalation"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::EscalationEventDefinition)->isEmpty() and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent))'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/EscalationEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("EscalationEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Conditional Event Definition") [
+ label = "%Conditional"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and element.eventDefinitions->filter(bpmn2::ConditionalEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ConditionalEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("ConditionalEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Link Event Definition") [
+ label = "%Link"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::EndEvent)) and not (element.oclIsKindOf(bpmn2::BoundaryEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and element.eventDefinitions->filter(bpmn2::LinkEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/LinkEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("LinkEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Error Event Definition") [
+ label = "%Error"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and element.eventDefinitions->filter(bpmn2::ErrorEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/ErrorEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("ErrorEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Cancel Event Definition") [
+ label = "%Cancel"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::IntermediateThrowEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and not (element.oclIsKindOf(bpmn2::StartEvent)) and element.eventDefinitions->filter(bpmn2::CancelEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/CancelEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("CancelEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Compensate Event Definition") [
+ label = "%Compensate"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not (element.oclIsKindOf(bpmn2::StartEvent)) and not (element.oclIsKindOf(bpmn2::IntermediateCatchEvent)) and element.eventDefinitions->filter(bpmn2::CompensateEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/CompensateEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("CompensateEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Signal Event Definition") [
+ label = "%Signal"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and element.eventDefinitions->filter(bpmn2::SignalEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/SignalEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("SignalEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Terminate Event Definition") [
+ label = "%Terminate"
+ precondition = '''element.oclIsKindOf(bpmn2::EndEvent) and element.eventDefinitions->filter(bpmn2::TerminateEventDefinition)->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TerminateEventDefinition.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ "eventDefinitions".creator("TerminateEventDefinition")
+ )
+ ]
+ ownedTools += ToolDescription.createAs(Ns.operation, "Delete Event Definition") [
+ label = "%Delete"
+ precondition = '''element.oclIsKindOf(bpmn2::Event) and not element.eventDefinitions->isEmpty()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.design/icons/remove.png"
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''element'''.trimAql.toContext(
+ Unset.create [
+ featureName = "eventDefinitions"
+ elementExpression = '''element.eventDefinitions->last()'''.trimAql
+ ]
+ )
+ ]
+ ]
+ }
+
+
+ override getLocalNodeMapping(String id) {
+ super.getLocalNodeMapping("SP" + id)
+ }
+
+
+
+ def createOtherTools() {
+ ToolSection.create("Other") [
+ label = "%Other"
+ icon = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/Lane.png"
+ ownedTools += NodeCreationDescription.createAs(Ns.creation, "TextAnnotation") [
+ label = "%TextAnnotation"
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ forceRefresh = true
+ iconPath = "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/TextAnnotation.png"
+ nodeMappings += NodeMapping.localRef(Ns.node, "TextAnnotation")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainerOrSelf(bpmn2::SubProcess)'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.TextAnnotation").chain(
+ "lanes".setter('''container'''.trimAql)
+ )
+ )
+ )
+ ]
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "TextAnnotationDirectEdit") [
+ forceRefresh = true
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ "text".setter('''arg0'''.trimAql)
+ )
+ ]
+ ownedTools += ContainerCreationDescription.createAs(Ns.operation, "Group") [
+ precondition = '''containerView.isNotCollapsed()'''.trimAql
+ containerMappings += ContainerMapping.localRef(Ns.node, "Group")
+ variable = NodeCreationVariable.create("container")
+ viewVariable = ContainerViewVariable.create("containerView")
+ operation = '''container.eContainerOrSelf(bpmn2::SubProcess)'''.trimAql.toContext(
+ "extensionValues".creator("bpmn2.ExtensionAttributeValue"),
+ '''instance'''.trimAql.toContext(
+ "value".creator("bpmn2.Group").chain(
+ "lanes".setter('''container'''.trimAql)
+ )
+ )
+ )
+ ]
+ ownedTools += DirectEditLabel.createAs(Ns.operation, "GroupDirectEdit") [
+ forceRefresh = true
+ mask = "{0}"
+ operation = '''self'''.trimAql.toContext(
+ "description".setter('''arg0'''.trimAql)
+ )
+ ]
+ ]
+ }
+
+}
\ No newline at end of file
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignGeneration.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignGeneration.xtend
new file mode 100644
index 00000000..2a25e482
--- /dev/null
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/tool/DesignGeneration.xtend
@@ -0,0 +1,60 @@
+package org.obeonetwork.dsl.bpmn2.design.tool
+
+import org.obeonetwork.bpmn2.design.Activator
+import java.nio.file.Paths
+import org.eclipse.core.runtime.Platform
+import org.eclipse.emf.common.util.URI
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
+import org.eclipse.emf.ecore.xmi.XMIResource
+import org.junit.Test
+import org.mypsycho.modit.emf.sirius.tool.ODesignVerifications
+import org.obeonetwork.dsl.bpmn2.design.description.BpmnDesign
+
+/**
+ * Tool to generate Sirius design model in 'sirius' plugin.
+ *
+ * Tool also reverse the created model to allows round-trip when design file is modified
+ * directly.
+ *
+ *
+ * @author nperansin
+ */
+class DesignGeneration extends DesignToolBase {
+
+ protected static val GENREVERSE_PATH = "target/gen"
+ val resBundle = Platform.getResourceBundle(Activator.^default.bundle)
+
+ protected static val TARGET_CLASS = BpmnDesign
+
+ @Test
+ def void writeODesign() throws Exception {
+ System.setProperty("modit.registry.debug", "true")
+
+ println("\n### Generating ###\n")
+
+ val res = new ResourceSetImpl()
+ .createResource(URI.createFileURI(ODESIGN_FILE.toString))
+
+ val content = TARGET_CLASS.getDeclaredConstructor()
+ .newInstance()
+ .loadContent(res)
+ .head
+
+ res.save(#{ XMIResource.OPTION_ENCODING -> "UTF-8" })
+
+ println(ODESIGN_FILE.fileName + " is updated.")
+ println(">>" + ODESIGN_FILE)
+
+ println("\n### I18N ###\n")
+ ODesignVerifications.printI18nReport(content, resBundle)
+
+ println()
+ println()
+ DesignReverse.createSiriusReverseIt(
+ content,
+ Paths.get(GENREVERSE_PATH),
+ TARGET_CLASS.name
+ ).perform
+ }
+
+}
From 86328623b134641a40a919ee081fc4ce02784508 Mon Sep 17 00:00:00 2001
From: Nicolas PERANSIN
Date: Thu, 29 Feb 2024 14:58:02 +0100
Subject: [PATCH 4/9] [ODFOREA-5699] Add conversion on tool on gateway.
Conversion tool suffers from position loss.
---
.../META-INF/MANIFEST.MF | 1 +
.../description/BPMN2.odesign | 175 +++++++++++++++---
.../bpmn2/design/FlowNodeService.java | 124 +++++++++++++
.../obeonetwork/bpmn2/design/TaskService.java | 138 +++-----------
.../bpmn2/design/description/BpmnDesign.xtend | 3 +-
.../design/description/BpmnDiagram.xtend | 17 +-
6 files changed, 311 insertions(+), 147 deletions(-)
create mode 100644 plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/META-INF/MANIFEST.MF b/plugins/org.obeonetwork.dsl.bpmn2.design/META-INF/MANIFEST.MF
index b2f6806c..167de5b4 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/META-INF/MANIFEST.MF
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/META-INF/MANIFEST.MF
@@ -20,6 +20,7 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.sirius.diagram,
org.eclipse.sirius.diagram.ui,
org.eclipse.sirius.ext.base,
+ org.eclipse.sirius.common.acceleo.aql,
org.eclipse.emf.edit.ui
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-11
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign b/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
index 1f778e27..2ffff010 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
@@ -353,7 +353,7 @@
-
+
@@ -361,7 +361,7 @@
-
+
@@ -369,7 +369,7 @@
-
+
@@ -377,7 +377,7 @@
-
+
@@ -385,7 +385,7 @@
-
+
@@ -393,7 +393,7 @@
-
+
@@ -401,7 +401,7 @@
-
+
@@ -409,7 +409,49 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1980,7 +2022,7 @@
-
+
@@ -1988,7 +2030,7 @@
-
+
@@ -1996,7 +2038,7 @@
-
+
@@ -2004,7 +2046,7 @@
-
+
@@ -2012,7 +2054,7 @@
-
+
@@ -2020,7 +2062,7 @@
-
+
@@ -2028,7 +2070,7 @@
-
+
@@ -2036,7 +2078,49 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -3908,7 +3992,7 @@
-
+
@@ -3916,7 +4000,7 @@
-
+
@@ -3924,7 +4008,7 @@
-
+
@@ -3932,7 +4016,7 @@
-
+
@@ -3940,7 +4024,7 @@
-
+
@@ -3948,7 +4032,7 @@
-
+
@@ -3956,7 +4040,7 @@
-
+
@@ -3964,7 +4048,49 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5176,6 +5302,7 @@
+
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java
new file mode 100644
index 00000000..c162df98
--- /dev/null
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2024 Obeo.
+ * 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.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *
+ */
+package org.obeonetwork.bpmn2.design;
+
+import java.util.Collection;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature.Setting;
+import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
+import org.eclipse.sirius.diagram.AbstractDNode;
+import org.obeonetwork.dsl.bpmn2.Association;
+import org.obeonetwork.dsl.bpmn2.BaseElement;
+import org.obeonetwork.dsl.bpmn2.Bpmn2Factory;
+import org.obeonetwork.dsl.bpmn2.FlowElementsContainer;
+import org.obeonetwork.dsl.bpmn2.FlowNode;
+import org.obeonetwork.dsl.bpmn2.Gateway;
+import org.obeonetwork.dsl.bpmn2.InteractionNode;
+import org.obeonetwork.dsl.bpmn2.MessageFlow;
+
+
+/**
+ * Test and conversion services to operate on FlowNode objects.
+ *
+ * @author nperansin
+ *
+ */
+public class FlowNodeService {
+
+ public Gateway convertToSpecificGateway(AbstractDNode view, EClass eClass) {
+ Gateway previous = (Gateway) view.getTarget();
+ if (eClass.equals(previous.eClass())) {
+ return previous;
+ }
+
+ // FIXME
+ // Node position is lost as refresh detect a new content.
+ // Instead :
+ // - Store gmf-node of node and edges.
+ // - Create a view and restore gmf-nodes.
+
+ Gateway result = replaceGateway(previous, (Gateway) Bpmn2Factory.eINSTANCE.create(eClass));
+ view.setTarget(result);
+
+ return result;
+ }
+
+ public static Gateway replaceGateway(Gateway previous, Gateway next) {
+ next.setGatewayDirection(previous.getGatewayDirection());
+ return replaceNode(previous, next);
+ }
+
+ public static N replaceNode(FlowNode previous, N next) {
+
+ next.getCategoryValueRef().addAll(previous.getCategoryValueRef());
+ next.getDocumentation().addAll(previous.getDocumentation());
+ next.getExtensionDefinitions().addAll(previous.getExtensionDefinitions());
+ next.getExtensionValues().addAll(previous.getExtensionValues());
+ next.getIncoming().addAll(previous.getIncoming());
+ next.getLanes().addAll(previous.getLanes());
+ next.getOutgoing().addAll(previous.getOutgoing());
+
+ next.setAuditing(previous.getAuditing());
+ next.setId(previous.getId());
+ next.setMonitoring(previous.getMonitoring());
+ next.setName(previous.getName());
+
+ updateLinks(previous, next);
+
+ FlowElementsContainer container = (FlowElementsContainer) previous.eContainer();
+ int index = container.getFlowElements().indexOf(previous);
+ container.getFlowElements().add(index, next);
+ container.getFlowElements().remove(previous);
+
+ return next;
+ }
+
+ private static void updateLinks(BaseElement previous, BaseElement next) {
+ ECrossReferenceAdapter eCrossReferenceAdapter = ServiceHelper.getCrossReferenceAdapter(previous);
+ if (eCrossReferenceAdapter != null) {
+ Collection inverseReferences = eCrossReferenceAdapter.getInverseReferences(previous);
+ for (Setting setting : inverseReferences) {
+ EObject object = setting.getEObject();
+ if (object instanceof MessageFlow
+ && previous instanceof InteractionNode
+ && next instanceof InteractionNode) {
+ updateMessageFlow((InteractionNode) previous,
+ (InteractionNode) next, (MessageFlow) object);
+ } else if (object instanceof Association) {
+ updateAssociation(previous, next, (Association) object);
+ }
+ }
+ }
+ }
+
+ private static void updateMessageFlow(InteractionNode previous, InteractionNode next, MessageFlow it) {
+ if (previous.equals(it.getSourceRef())) {
+ it.setSourceRef(next);
+ }
+ if (previous.equals(it.getTargetRef())) {
+ it.setTargetRef(next);
+ }
+ }
+
+ private static void updateAssociation(BaseElement previous, BaseElement target, Association it) {
+ if (previous.equals(it.getSourceRef())) {
+ it.setSourceRef(target);
+ }
+ if (previous.equals(it.getTargetRef())) {
+ it.setTargetRef(target);
+ }
+ }
+
+
+}
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java
index ee4bbbd4..ecc3458e 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2011-2019 Obeo.
+ * Copyright (c) 2011-2024 Obeo.
* 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
@@ -11,37 +11,27 @@
*/
package org.obeonetwork.bpmn2.design;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature.Setting;
-import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.sirius.business.api.dialect.DialectManager;
import org.eclipse.sirius.diagram.DDiagramElementContainer;
import org.eclipse.sirius.diagram.DNodeContainer;
-import org.obeonetwork.dsl.bpmn2.Association;
import org.obeonetwork.dsl.bpmn2.Bpmn2Factory;
-import org.obeonetwork.dsl.bpmn2.Bpmn2Package;
import org.obeonetwork.dsl.bpmn2.BusinessRuleTask;
import org.obeonetwork.dsl.bpmn2.CallActivity;
import org.obeonetwork.dsl.bpmn2.ChoreographyTask;
-import org.obeonetwork.dsl.bpmn2.FlowElementsContainer;
import org.obeonetwork.dsl.bpmn2.GlobalBusinessRuleTask;
import org.obeonetwork.dsl.bpmn2.GlobalManualTask;
import org.obeonetwork.dsl.bpmn2.GlobalScriptTask;
import org.obeonetwork.dsl.bpmn2.GlobalUserTask;
import org.obeonetwork.dsl.bpmn2.ManualTask;
-import org.obeonetwork.dsl.bpmn2.MessageFlow;
import org.obeonetwork.dsl.bpmn2.ReceiveTask;
import org.obeonetwork.dsl.bpmn2.ScriptTask;
import org.obeonetwork.dsl.bpmn2.SendTask;
import org.obeonetwork.dsl.bpmn2.ServiceTask;
import org.obeonetwork.dsl.bpmn2.Task;
import org.obeonetwork.dsl.bpmn2.UserTask;
-import org.obeonetwork.dsl.bpmn2.impl.TaskImpl;
+
/**
* Test and conversion services to operate on Task objects.
@@ -102,10 +92,6 @@ public boolean isLikeManualTask(final EObject eObject) {
return isLikeManualTask;
}
- public boolean isLikeTask(final EObject eObject) {
- return eObject instanceof Task && eObject.getClass().isAssignableFrom(TaskImpl.class);
- }
-
public boolean isLikeReceiveTask(final EObject eObject) {
return eObject instanceof ReceiveTask;
}
@@ -122,125 +108,45 @@ public boolean isLikeChoreographyTask(final EObject eObject) {
return eObject instanceof ChoreographyTask;
}
- public Task convertToTask(final DNodeContainer view) {
- Task eObject = (Task) view.getTarget();
- if (!eObject.getClass().isAssignableFrom(TaskImpl.class)) {
- return (Task) convertToSpecificTask((Task) view.getTarget(), Bpmn2Package.eINSTANCE.getTask(),view);
- }
- return eObject;
- }
-
- public BusinessRuleTask convertToBusinessRuleTask(final DNodeContainer view) {
- return (BusinessRuleTask) convertToSpecificTask((Task) view.getTarget(),
- Bpmn2Package.eINSTANCE.getBusinessRuleTask(),view);
- }
-
- public ManualTask convertToManualTask(final DNodeContainer view) {
- return (ManualTask) convertToSpecificTask((Task) view.getTarget(), Bpmn2Package.eINSTANCE.getManualTask(),view);
- }
-
- public ReceiveTask convertToReceiveTask(final DNodeContainer view) {
- return (ReceiveTask) convertToSpecificTask((Task) view.getTarget(), Bpmn2Package.eINSTANCE.getReceiveTask(),view);
- }
-
- public ScriptTask convertToScriptTask(final DNodeContainer view) {
- return (ScriptTask) convertToSpecificTask((Task) view.getTarget(), Bpmn2Package.eINSTANCE.getScriptTask(),
- view);
- }
-
- public SendTask convertToSendTask(final DNodeContainer view) {
- return (SendTask) convertToSpecificTask((Task) view.getTarget(), Bpmn2Package.eINSTANCE.getSendTask(),view);
- }
-
- public ServiceTask convertToServiceTask(final DNodeContainer view) {
- return (ServiceTask) convertToSpecificTask((Task) view.getTarget(), Bpmn2Package.eINSTANCE.getServiceTask(),view);
- }
-
- public UserTask convertToUserTask(final DNodeContainer view) {
- return (UserTask) convertToSpecificTask((Task) view.getTarget(), Bpmn2Package.eINSTANCE.getUserTask(),view);
- }
-
- private Task convertToSpecificTask(Task task, EClass eClass, DNodeContainer container) {
- Task result = null;
- if (eClass.equals(task.eClass())) {
- result = task;
- } else {
- Task cloneTask = clone(task, (Task) Bpmn2Factory.eINSTANCE.create(eClass));
- result = cloneTask;
- container.setTarget(result);
- DialectManager.INSTANCE.refresh(container.getParentDiagram(), new NullProgressMonitor());
+ public Task convertToSpecificTask(DNodeContainer view, EClass eClass) {
+ Task previous = (Task) view.getTarget();
+ if (eClass.equals(previous.eClass())) {
+ return previous;
}
+
+ Task result = replaceTask(previous, (Task) Bpmn2Factory.eINSTANCE.create(eClass));
+
+ // FIXME
+ // This breaks EditPart cache and edition state.
+ // Instead :
+ // - Store gmf-node of node and edges.
+ // - Create a view and restore gmf-nodes.
+ view.setTarget(result);
+
+ // DialectManager.INSTANCE.refresh(container.getParentDiagram(), new NullProgressMonitor()); // No effect
+
return result;
}
-
- private Task clone(Task task, Task cloneTask) {
+
+ private Task replaceTask(Task task, Task cloneTask) {
cloneTask.getBoundaryEventRefs().addAll(task.getBoundaryEventRefs());
- cloneTask.getCategoryValueRef().addAll(task.getCategoryValueRef());
cloneTask.getDataInputAssociations().addAll(task.getDataInputAssociations());
cloneTask.getDataOutputAssociations().addAll(task.getDataOutputAssociations());
- cloneTask.getDocumentation().addAll(task.getDocumentation());
- cloneTask.getExtensionDefinitions().addAll(task.getExtensionDefinitions());
- cloneTask.getExtensionValues().addAll(task.getExtensionValues());
- cloneTask.getIncoming().addAll(task.getIncoming());
cloneTask.getIncomingConversationLinks().addAll(task.getIncomingConversationLinks());
- cloneTask.getLanes().addAll(task.getLanes());
- cloneTask.getOutgoing().addAll(task.getOutgoing());
cloneTask.getOutgoingConversationLinks().addAll(task.getOutgoingConversationLinks());
cloneTask.getProperties().addAll(task.getProperties());
cloneTask.getResources().addAll(task.getResources());
-
- cloneTask.setAuditing(task.getAuditing());
cloneTask.setCompletionQuantity(task.getCompletionQuantity());
cloneTask.setDefault(task.getDefault());
- cloneTask.setId(task.getId());
cloneTask.setIoSpecification(task.getIoSpecification());
cloneTask.setIsForCompensation(task.isIsForCompensation());
cloneTask.setLoopCharacteristics(task.getLoopCharacteristics());
- cloneTask.setMonitoring(task.getMonitoring());
- cloneTask.setName(task.getName());
cloneTask.setStartQuantity(task.getStartQuantity());
-
- updateMessageFlowsAndAssociations(task, cloneTask);
-
- FlowElementsContainer container = (FlowElementsContainer) task.eContainer();
- container.getFlowElements().remove(task);
- container.getFlowElements().add(cloneTask);
-
- return cloneTask;
+
+ return FlowNodeService.replaceNode(task, cloneTask);
}
- private void updateMessageFlowsAndAssociations(Task task, Task cloneTask) {
- ECrossReferenceAdapter eCrossReferenceAdapter = ServiceHelper.getCrossReferenceAdapter(task);
- if (eCrossReferenceAdapter != null) {
- Collection inverseReferences = eCrossReferenceAdapter.getInverseReferences(task);
- for (Setting setting : inverseReferences) {
- EObject object = setting.getEObject();
- if (object instanceof MessageFlow) {
- updateMessageFlow(task, cloneTask, (MessageFlow) object);
- } else if (object instanceof Association) {
- updateAssociation(task, cloneTask, (Association) object);
- }
- }
- }
- }
-
- private void updateMessageFlow(Task task, Task cloneTask, MessageFlow messageFlow) {
- if (task.equals(messageFlow.getSourceRef())) {
- messageFlow.setSourceRef(cloneTask);
- }
- if (task.equals(messageFlow.getTargetRef())) {
- messageFlow.setTargetRef(cloneTask);
- }
- }
- private void updateAssociation(Task task, Task cloneTask, Association association) {
- if (task.equals(association.getSourceRef())) {
- association.setSourceRef(cloneTask);
- }
- if (task.equals(association.getTargetRef())) {
- association.setTargetRef(cloneTask);
- }
- }
public void deleteSubProcess(EObject subProcess, DDiagramElementContainer subProcessView) {
if (ExpandCollapseService.isCollapsed(subProcessView)) {
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend
index 49241084..aa246cf8 100644
--- a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDesign.xtend
@@ -9,6 +9,7 @@ import org.eclipse.sirius.viewpoint.description.tool.InitialOperation
import org.mypsycho.modit.emf.sirius.api.SiriusVpGroup
import org.obeonetwork.bpmn2.design.ElementsPositionService
import org.obeonetwork.bpmn2.design.ExpandCollapseService
+import org.obeonetwork.bpmn2.design.FlowNodeService
import org.obeonetwork.bpmn2.design.NamingService
import org.obeonetwork.bpmn2.design.ProcessService
import org.obeonetwork.bpmn2.design.ServiceHelper
@@ -38,7 +39,7 @@ class BpmnDesign extends SiriusVpGroup {
use(ElementsPositionService)
use(ExpandCollapseService)
use(TaskService)
- // use(FlowNodeService)
+ use(FlowNodeService)
use(StandardServices)
use(ProcessService)
use(NamingService)
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
index 03c63178..1c4e6e12 100644
--- a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
@@ -1035,10 +1035,14 @@ abstract class BpmnDiagram extends SiriusDiagram {
label = "%" + target
forceRefresh = true
icon = operationIcon ?: "/org.obeonetwork.dsl.bpmn2.edit/icons/full/obj16/" + target + ".png"
+ // Deal with same type ?? when not precondition, operation is hidden.
+ // precondition = '''self.trace() <> null'''.trimAql
+ // if false,
+ // self is 1 of selection,
+ // views is available
view = ContainerViewVariable.create("views")
operation = '''views'''.trimAql.forDo("view",
- // '''view.convertToSpecific«conversion»(bpmn2::«target»)'''.trimAql.toOperation
- '''view.convertTo«target»()'''.trimAql.toOperation
+ '''view.convertToSpecific«conversion»(bpmn2::«target»)'''.trimAql.toOperation
)
]
}
@@ -1064,11 +1068,12 @@ abstract class BpmnDiagram extends SiriusDiagram {
label = "%ConvertGatewayTo"
precondition = '''self.oclIsKindOf(bpmn2::Gateway)'''.trimAql
forceRefresh = true
+
+ menuItemDescription += "ParallelGateway".createConvertOperation("Gateway", null)
+ menuItemDescription += "ExclusiveGateway".createConvertOperation("Gateway", null)
+ menuItemDescription += "InclusiveGateway".createConvertOperation("Gateway", null)
menuItemDescription += "ComplexGateway".createConvertOperation("Gateway", null)
menuItemDescription += "EventBasedGateway".createConvertOperation("Gateway", null)
- menuItemDescription += "ExclusiveGateway".createConvertOperation("Gateway", null)
- menuItemDescription += "InclusiveGateway".createConvertOperation("Gateway", null)
- menuItemDescription += "ParallelGateway".createConvertOperation("Gateway", null)
]
}
@@ -1076,7 +1081,7 @@ abstract class BpmnDiagram extends SiriusDiagram {
#[
createConvertTaskMenu,
createConvertGatewayMenu
- ].get(0)
+ ]
}
From 5afd2a02012b3a9d6a04e55b0b04b8023ca5ade6 Mon Sep 17 00:00:00 2001
From: Nicolas PERANSIN
Date: Fri, 1 Mar 2024 14:10:01 +0100
Subject: [PATCH 5/9] [ODFOREA-5700] Provides Conversion menu in Palette.
Applicable to Gateways and Tasks.
---
.../description/BPMN2.odesign | 42 ++++++++++
.../obeonetwork/bpmn2/design/Activator.java | 76 ++++++++++++++++-
.../bpmn2/design/FlowNodeService.java | 74 ++++++++++++++++-
.../bpmn2/design/ServiceHelper.java | 21 +++++
.../obeonetwork/bpmn2/design/TaskService.java | 81 ++++++++++++-------
.../bpmn2/design/ui/PopupChoiceSelector.java | 81 +++++++++++++++++++
.../bpmn2/design/ui/UiConstants.java | 42 ++++++++++
.../design/description/BpmnDiagram.xtend | 15 +++-
8 files changed, 399 insertions(+), 33 deletions(-)
create mode 100644 plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/PopupChoiceSelector.java
create mode 100644 plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/UiConstants.java
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign b/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
index 2ffff010..1381c131 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/description/BPMN2.odesign
@@ -1299,6 +1299,13 @@
+
+
+
+
+
+
+
@@ -1336,6 +1343,13 @@
+
+
+
+
+
+
+
@@ -3430,6 +3444,13 @@
+
+
+
+
+
+
+
@@ -3467,6 +3488,13 @@
+
+
+
+
+
+
+
@@ -4914,6 +4942,13 @@
+
+
+
+
+
+
+
@@ -4951,6 +4986,13 @@
+
+
+
+
+
+
+
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java
index 6797d053..c4027782 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/Activator.java
@@ -11,18 +11,27 @@
*/
package org.obeonetwork.bpmn2.design;
+import java.net.URL;
+import java.util.ResourceBundle;
import java.util.Set;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
import org.eclipse.sirius.viewpoint.description.Viewpoint;
+import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
/**
* The activator class controls the plug-in life cycle
*/
public class Activator extends AbstractUIPlugin {
+
+ private static final String PATH_SEPARATOR = "/";
+
// The plug-in ID
public static final String PLUGIN_ID = "org.obeonetwork.dsl.bpmn2.design";
public static final String DESIGN_PATH = PLUGIN_ID + "/description/BPMN2.odesign";
@@ -30,12 +39,14 @@ public class Activator extends AbstractUIPlugin {
private static Activator plugin;
private Set viewpoints;
-
+ private ResourceBundle i10n;
+
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
viewpoints = ViewpointRegistry.getInstance().registerFromPlugin(DESIGN_PATH);
+ i10n = Platform.getResourceBundle(getBundle());
}
@Override
@@ -72,4 +83,67 @@ public static Activator getDefault() {
public static void log(int severity, String message, Throwable exception) {
getDefault().getLog().log(new Status(severity, PLUGIN_ID, message, exception));
}
+
+ /**
+ * Returns a icon from this plugin.
+ *
+ * @param path
+ * (local) of image
+ * @return image or null
+ */
+ public Image getImage(String path) {
+ return getImage(PLUGIN_ID, path);
+ }
+
+ /**
+ * Returns a icon from a plugin.
+ *
+ * @param bundleId
+ * plugin containing the image
+ * @param path
+ * of image
+ * @return image or null
+ */
+ public Image getImage(String bundleId, String path) {
+ String key = bundleId + PATH_SEPARATOR + path;
+ if (getImageRegistry().getDescriptor(key) == null) {
+ // put must unique.
+ Bundle bundle = Platform.getBundle(bundleId == null
+ ? PLUGIN_ID
+ : bundleId);
+ URL url = bundle != null
+ ? bundle.getResource(path)
+ : null;
+ getImageRegistry().put(key, ImageDescriptor.createFromURL(url));
+ }
+ return getImageRegistry().get(key);
+ }
+
+ /**
+ * Returns a icon from a plugin where 1rst segment is a plugin.
+ *
+ * @param bundleId
+ * plugin containing the image
+ * @param path
+ * of image
+ * @return image or null
+ */
+ public Image getImageFromPath(String path) {
+ if (path == null || path.isEmpty()) {
+ return null;
+ }
+ if (path.startsWith(PATH_SEPARATOR)) {
+ return getImageFromPath(path.substring(PATH_SEPARATOR.length()));
+ }
+ int token = path.indexOf(PATH_SEPARATOR);
+ if (token == -1) { // Invalid path (not critical)
+ return null;
+ }
+ return getImage(path.substring(0, token), path.substring(token + PATH_SEPARATOR.length()));
+ }
+
+
+ public static ResourceBundle getI10n() {
+ return getDefault().i10n;
+ }
}
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java
index c162df98..1e76c12d 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/FlowNodeService.java
@@ -11,16 +11,23 @@
*/
package org.obeonetwork.bpmn2.design;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Function;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
import org.eclipse.sirius.diagram.AbstractDNode;
+import org.obeonetwork.bpmn2.design.ui.PopupChoiceSelector;
+import org.obeonetwork.bpmn2.design.ui.UiConstants;
import org.obeonetwork.dsl.bpmn2.Association;
import org.obeonetwork.dsl.bpmn2.BaseElement;
import org.obeonetwork.dsl.bpmn2.Bpmn2Factory;
+import org.obeonetwork.dsl.bpmn2.Bpmn2Package;
import org.obeonetwork.dsl.bpmn2.FlowElementsContainer;
import org.obeonetwork.dsl.bpmn2.FlowNode;
import org.obeonetwork.dsl.bpmn2.Gateway;
@@ -29,14 +36,32 @@
/**
- * Test and conversion services to operate on FlowNode objects.
+ * Conversion services to operate on FlowNode objects.
*
* @author nperansin
*
*/
public class FlowNodeService {
+
+ private static final Bpmn2Package PKG = Bpmn2Package.eINSTANCE;
+ private static final List GATEWAY_CLASSES = Arrays.asList(
+ // Order is the same to Gateways Toolsection of VSM
+ PKG.getParallelGateway(), PKG.getExclusiveGateway(),
+ PKG.getInclusiveGateway(), PKG.getComplexGateway(),
+ PKG.getEventBasedGateway()
+ );
- public Gateway convertToSpecificGateway(AbstractDNode view, EClass eClass) {
+ /**
+ * Converts a Gateway into another kind.
+ *
+ * Most of related data are restored.
+ *
+ *
+ * @param view of Gateway
+ * @param eClass class to convert in
+ * @return created Gateway
+ */
+ public static Gateway convertToSpecificGateway(AbstractDNode view, EClass eClass) {
Gateway previous = (Gateway) view.getTarget();
if (eClass.equals(previous.eClass())) {
return previous;
@@ -54,11 +79,19 @@ public Gateway convertToSpecificGateway(AbstractDNode view, EClass eClass) {
return result;
}
- public static Gateway replaceGateway(Gateway previous, Gateway next) {
+ private static Gateway replaceGateway(Gateway previous, Gateway next) {
next.setGatewayDirection(previous.getGatewayDirection());
return replaceNode(previous, next);
}
+ /**
+ * Replace a node by another node.
+ *
+ * @param type of new node
+ * @param previous node
+ * @param next node
+ * @return next node
+ */
public static N replaceNode(FlowNode previous, N next) {
next.getCategoryValueRef().addAll(previous.getCategoryValueRef());
@@ -120,5 +153,40 @@ private static void updateAssociation(BaseElement previous, BaseElement target,
}
}
+ /**
+ * Applies a function with a type choosen by user.
+ *
+ * @param it context
+ * @param types to choose from
+ * @param transform to apply
+ */
+ public static T applyToChoosableClass(EObject it, List types, Function transform) {
+ PopupChoiceSelector choice = new PopupChoiceSelector<>();
+ types.forEach(eClass -> {
+ String label = Activator.getI10n().getString(eClass.getName());
+ String iconPath = UiConstants.getEditIconPath(eClass);
+ choice.addItem(label, iconPath, eClass);
+ });
+ Optional target = choice.perform();
+ if (!target.isPresent()) {
+ ServiceHelper.abortOperation(it);
+ }
+ return transform.apply(target.get());
+ }
+
+ /**
+ * Converts a gateway in a new type.
+ *
+ * If no gateway is selected, whole operation is aborted.
+ *
+ *
+ * @param it gateway to convert
+ * @param view on which the task is triggered
+ * @return new gateway
+ */
+ public static Gateway convertToChoosableGateway(Gateway it, AbstractDNode view) {
+ return FlowNodeService.applyToChoosableClass(it, GATEWAY_CLASSES,
+ type -> convertToSpecificGateway(view, type));
+ }
}
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ServiceHelper.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ServiceHelper.java
index 37db351f..c8370a9f 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ServiceHelper.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ServiceHelper.java
@@ -17,9 +17,14 @@
import java.util.stream.Collectors;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
+import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.sirius.diagram.DDiagramElement;
import org.eclipse.sirius.diagram.DEdge;
import org.eclipse.sirius.diagram.DNode;
@@ -226,5 +231,21 @@ public List getDataOutputs(EObject container) {
}
return result;
}
+
+ /**
+ * Aborts a Sirius operation.
+ *
+ * @param context of operation
+ * @throws OperationCanceledException always
+ */
+ public static void abortOperation(EObject context) throws OperationCanceledException {
+ TransactionalEditingDomain edt = Session.of(context).get().getTransactionalEditingDomain();
+ // Cancel Operation does not cancel !!
+ // ChangeContext catches them all !!
+ // What a trainer ...
+ ((InternalTransactionalEditingDomain) edt).getActiveTransaction().abort(Status.CANCEL_STATUS);
+ // This hacks prevent history pollution.
+ throw new OperationCanceledException();
+ }
}
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java
index ecc3458e..e3a2e2bc 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/TaskService.java
@@ -11,18 +11,23 @@
*/
package org.obeonetwork.bpmn2.design;
+import java.util.Arrays;
+import java.util.List;
+
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.sirius.diagram.DDiagramElementContainer;
import org.eclipse.sirius.diagram.DNodeContainer;
import org.obeonetwork.dsl.bpmn2.Bpmn2Factory;
+import org.obeonetwork.dsl.bpmn2.Bpmn2Package;
import org.obeonetwork.dsl.bpmn2.BusinessRuleTask;
import org.obeonetwork.dsl.bpmn2.CallActivity;
import org.obeonetwork.dsl.bpmn2.ChoreographyTask;
import org.obeonetwork.dsl.bpmn2.GlobalBusinessRuleTask;
import org.obeonetwork.dsl.bpmn2.GlobalManualTask;
import org.obeonetwork.dsl.bpmn2.GlobalScriptTask;
+import org.obeonetwork.dsl.bpmn2.GlobalTask;
import org.obeonetwork.dsl.bpmn2.GlobalUserTask;
import org.obeonetwork.dsl.bpmn2.ManualTask;
import org.obeonetwork.dsl.bpmn2.ReceiveTask;
@@ -34,13 +39,21 @@
/**
- * Test and conversion services to operate on Task objects.
+ * Evaluation and conversion services to operate on Task objects.
*
* @author vrichard
- *
*/
public class TaskService {
+ private static final Bpmn2Package PKG = Bpmn2Package.eINSTANCE;
+ private static final List TASK_CLASSES = Arrays.asList(
+ // Order is the same to Gateways Toolsection of VSM
+ PKG.getTask(), PKG.getBusinessRuleTask(),
+ PKG.getManualTask(), PKG.getReceiveTask(),
+ PKG.getScriptTask(), PKG.getSendTask(),
+ PKG.getServiceTask(), PKG.getUserTask()
+ );
+
public String getLabel(Task task, boolean borderedNodes) {
String result = " \n \n" + task.getName();
// if (borderedNodes) {
@@ -56,40 +69,26 @@ public String trimLabel(EObject eo, String newLabel) {
return newLabel;
}
+ private boolean isLikeTask(EObject it, Class extends Task> type, Class extends GlobalTask> global) {
+ return type.isInstance(it)
+ || (it instanceof CallActivity
+ && global.isInstance(((CallActivity) it).getCalledElementRef()));
+ }
+
public boolean isLikeScriptTask(final EObject eObject) {
- boolean isLikeScriptTask = eObject instanceof ScriptTask;
- if (!isLikeScriptTask && eObject instanceof CallActivity) {
- CallActivity callActivity = (CallActivity) eObject;
- isLikeScriptTask = callActivity.getCalledElementRef() instanceof GlobalScriptTask;
- }
- return isLikeScriptTask;
+ return isLikeTask(eObject, ScriptTask.class, GlobalScriptTask.class);
}
public boolean isLikeBusinessRuleTask(final EObject eObject) {
- boolean isLikeBusinessRuleTask = eObject instanceof BusinessRuleTask;
- if (!isLikeBusinessRuleTask && eObject instanceof CallActivity) {
- CallActivity callActivity = (CallActivity) eObject;
- isLikeBusinessRuleTask = callActivity.getCalledElementRef() instanceof GlobalBusinessRuleTask;
- }
- return isLikeBusinessRuleTask;
+ return isLikeTask(eObject, BusinessRuleTask.class, GlobalBusinessRuleTask.class);
}
public boolean isLikeUserTask(final EObject eObject) {
- boolean isLikeUserTask = eObject instanceof UserTask;
- if (!isLikeUserTask && eObject instanceof CallActivity) {
- CallActivity callActivity = (CallActivity) eObject;
- isLikeUserTask = callActivity.getCalledElementRef() instanceof GlobalUserTask;
- }
- return isLikeUserTask;
+ return isLikeTask(eObject, UserTask.class, GlobalUserTask.class);
}
public boolean isLikeManualTask(final EObject eObject) {
- boolean isLikeManualTask = eObject instanceof ManualTask;
- if (!isLikeManualTask && eObject instanceof CallActivity) {
- CallActivity callActivity = (CallActivity) eObject;
- isLikeManualTask = callActivity.getCalledElementRef() instanceof GlobalManualTask;
- }
- return isLikeManualTask;
+ return isLikeTask(eObject, ManualTask.class, GlobalManualTask.class);
}
public boolean isLikeReceiveTask(final EObject eObject) {
@@ -108,7 +107,17 @@ public boolean isLikeChoreographyTask(final EObject eObject) {
return eObject instanceof ChoreographyTask;
}
- public Task convertToSpecificTask(DNodeContainer view, EClass eClass) {
+ /**
+ * Converts a task into another kind.
+ *
+ * Most of related data are restored.
+ *
+ *
+ * @param view of task
+ * @param eClass class to convert in
+ * @return created task
+ */
+ public static Task convertToSpecificTask(DNodeContainer view, EClass eClass) {
Task previous = (Task) view.getTarget();
if (eClass.equals(previous.eClass())) {
return previous;
@@ -128,7 +137,7 @@ public Task convertToSpecificTask(DNodeContainer view, EClass eClass) {
return result;
}
- private Task replaceTask(Task task, Task cloneTask) {
+ private static Task replaceTask(Task task, Task cloneTask) {
cloneTask.getBoundaryEventRefs().addAll(task.getBoundaryEventRefs());
cloneTask.getDataInputAssociations().addAll(task.getDataInputAssociations());
cloneTask.getDataOutputAssociations().addAll(task.getDataOutputAssociations());
@@ -155,4 +164,20 @@ public void deleteSubProcess(EObject subProcess, DDiagramElementContainer subPro
}
EcoreUtil.remove(subProcess);
}
+
+
+ /**
+ * Converts a task in a new type.
+ *
+ * If no task is selected, whole operation is aborted.
+ *
+ *
+ * @param it task to convert
+ * @param view on which the task is triggered
+ * @return new task
+ */
+ public static Task convertToChoosableTask(Task it, DNodeContainer view) {
+ return FlowNodeService.applyToChoosableClass(it, TASK_CLASSES,
+ type -> convertToSpecificTask(view, type));
+ }
}
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/PopupChoiceSelector.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/PopupChoiceSelector.java
new file mode 100644
index 00000000..7a3ce7e7
--- /dev/null
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/PopupChoiceSelector.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2024 Obeo.
+ * 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.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *
+ */
+package org.obeonetwork.bpmn2.design.ui;
+
+import java.util.Optional;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.obeonetwork.bpmn2.design.Activator;
+
+/**
+ * Class to display choices in a menu to User.
+ *
+ * @author nperansin
+ */
+public class PopupChoiceSelector {
+
+ private R result = null;
+ private boolean provided = false;
+ private Display ui;
+ private Menu menu;
+
+ /**
+ * Default contructor.
+ */
+ public PopupChoiceSelector() {
+ ui = Display.getCurrent();
+ menu = new Menu(ui.getFocusControl());
+ }
+
+
+ /**
+ * Add an item to the list of choices.
+ *
+ * @param text
+ * @param iconPath
+ * @param value
+ * @return
+ */
+ public MenuItem addItem(String text, String iconPath, R value) {
+ MenuItem choice = new MenuItem(menu, SWT.NONE);
+ choice.setText(text);
+ if (iconPath != null) {
+ choice.setImage(Activator.getDefault().getImageFromPath(iconPath));
+ }
+
+ choice.addSelectionListener(SelectionListener.widgetSelectedAdapter(evt -> {
+ result = value;
+ provided = true;
+ }));
+ return choice;
+ }
+
+ public Optional perform() {
+ menu.setLocation(ui.getCursorLocation());
+ menu.setVisible(true);
+
+ while (!menu.isDisposed() && menu.isVisible()) {
+ if (!ui.readAndDispatch()) {
+ ui.sleep();
+ }
+ }
+ menu.dispose();
+ return provided
+ ? Optional.of(result)
+ : Optional.empty();
+ }
+
+}
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/UiConstants.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/UiConstants.java
new file mode 100644
index 00000000..cb9556f0
--- /dev/null
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ui/UiConstants.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2024 Obeo.
+ * 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.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *
+ */
+package org.obeonetwork.bpmn2.design.ui;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * Constants and basic utilities for UI.
+ *
+ * @author nperansin
+ */
+public class UiConstants {
+
+ /** Icon extension. */
+ public static final String ICON_EXT = ".png";
+
+ /** BPMN Edit plugin. */
+ public static final String EDIT_PLUGIN = "org.obeonetwork.dsl.bpmn2.edit";
+
+ /** BPMN icons path. */
+ public static final String EDIT_ICONS_PATH = EDIT_PLUGIN + "/icons/full/obj16/";
+
+ /**
+ * Returns the path of icon associated to provide EClass of BPMN.
+ *
+ * @param it eClass
+ * @return path
+ */
+ public static String getEditIconPath(EClass it) {
+ return EDIT_ICONS_PATH + it.getName() + ICON_EXT;
+ }
+
+}
diff --git a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
index 1c4e6e12..ea964198 100644
--- a/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
+++ b/toolings/org.obeonetwork.dsl.bpmn2.design.tool/src/org/obeonetwork/dsl/bpmn2/design/description/BpmnDiagram.xtend
@@ -65,7 +65,7 @@ abstract class BpmnDiagram extends SiriusDiagram {
def customImage(String iconPart, String... nodes) {
"workspacePath".attCustomization(
- "/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/" + iconPart + ".svg",
+ '''/org.obeonetwork.dsl.bpmn2.design/icons2/nodes/«iconPart».svg''',
nodes.map[
WorkspaceImageDescription.localRef(Ns.node, it) [
(it as NodeMapping).style as WorkspaceImageDescription
@@ -903,6 +903,8 @@ abstract class BpmnDiagram extends SiriusDiagram {
)
]
]
+
+ ownedTools += createConvertTool("Task")
]
}
@@ -916,6 +918,7 @@ abstract class BpmnDiagram extends SiriusDiagram {
ownedTools += "InclusiveGateway".createFlowElementCreation("Inclusive Gateway")
ownedTools += "ComplexGateway".createFlowElementCreation("Complex Gateway")
ownedTools += "EventBasedGateway".createFlowElementCreation("Event Based Gateway")
+ ownedTools += createConvertTool("Gateway")
]
}
@@ -1084,5 +1087,15 @@ abstract class BpmnDiagram extends SiriusDiagram {
]
}
+ def createConvertTool(String type) {
+ ToolDescription.createAs(Ns.operation, type + "ConvertTool") [
+ label = '''%Convert«type»To'''
+ // icon = TODO
+ precondition = '''self.oclIsKindOf(bpmn2::«type»)'''.trimAql
+ element = ElementVariable.create("element")
+ elementView = ElementViewVariable.create("elementView")
+ operation = '''self.convertToChoosable«type»(elementView)'''.trimAql.toOperation
+ ]
+ }
}
From d33db8662b9cb5298d190eec405dff9591fb8e7c Mon Sep 17 00:00:00 2001
From: Nicolas PERANSIN
Date: Sat, 2 Mar 2024 11:11:57 +0100
Subject: [PATCH 6/9] Clean code.
Remove internal API, warnings and simplify with API.
---
.../bpmn2/design/ProcessService.java | 51 ++-------
.../design/SessionCreationOperation.java | 106 ++++++++----------
.../bpmn2/design/SetUnsetExternalLabels.java | 6 +-
3 files changed, 56 insertions(+), 107 deletions(-)
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ProcessService.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ProcessService.java
index af0d76ec..6909228c 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ProcessService.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/ProcessService.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2011-2019 Obeo.
+ * Copyright (c) 2011-2024 Obeo.
* 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
@@ -19,6 +19,7 @@
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
@@ -26,6 +27,7 @@
import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
import org.obeonetwork.dsl.bpmn2.BoundaryEvent;
import org.obeonetwork.dsl.bpmn2.Bpmn2Factory;
+import org.obeonetwork.dsl.bpmn2.Bpmn2Package;
import org.obeonetwork.dsl.bpmn2.ChoreographyTask;
import org.obeonetwork.dsl.bpmn2.Collaboration;
import org.obeonetwork.dsl.bpmn2.ComplexGateway;
@@ -119,7 +121,9 @@ public static void paste(EObject container, EObject containerView, EObject copie
if (containment.getEType().equals(copiedElement.eClass())
|| copiedElement.eClass().getEAllSuperTypes().contains(containment.getEType())) {
if (containment.isMany()) {
- ((EList) container.eGet(containment)).add(copiedElement);
+ @SuppressWarnings("unchecked")
+ EList values = ((EList) container.eGet(containment));
+ values.add(copiedElement);
} else {
container.eSet(containment, copiedElement);
}
@@ -152,7 +156,7 @@ private boolean isLaneChoregraphyTaskOrSubProcess(EObject element) {
public EObject createFlowElement(EObject container, String typeToCreate) {
FlowElementsContainer flowElementsContainer = getFlowElementsContainer(container);
- FlowNode newElement = createElement(typeToCreate);
+ FlowNode newElement = (FlowNode) createElement(typeToCreate);
flowElementsContainer.getFlowElements().add(newElement);
if (isEventTaskOrGateway(container)) {
@@ -184,44 +188,9 @@ private FlowElementsContainer getFlowElementsContainer(EObject eo) {
return result;
}
- private FlowNode createElement(String typeToCreate) {
- FlowNode result = null;
- if ("StartEvent".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createStartEvent();
- } else if ("EndEvent".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createEndEvent();
- } else if ("IntermediateCatchEvent".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createIntermediateCatchEvent();
- } else if ("IntermediateThrowEvent".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createIntermediateThrowEvent();
- } else if ("Task".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createTask();
- } else if ("BusinessRuleTask".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createBusinessRuleTask();
- } else if ("ManualTask".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createManualTask();
- } else if ("ReceiveTask".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createReceiveTask();
- } else if ("ScriptTask".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createScriptTask();
- } else if ("SendTask".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createSendTask();
- } else if ("ServiceTask".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createServiceTask();
- } else if ("UserTask".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createUserTask();
- } else if ("ParallelGateway".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createParallelGateway();
- } else if ("ExclusiveGateway".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createExclusiveGateway();
- } else if ("InclusiveGateway".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createInclusiveGateway();
- } else if ("ComplexGateway".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createComplexGateway();
- } else if ("EventBasedGateway".equals(typeToCreate)) {
- result = Bpmn2Factory.eINSTANCE.createEventBasedGateway();
- }
- return result;
+ private EObject createElement(String typeToCreate) {
+ EClass eClass = (EClass) Bpmn2Package.eINSTANCE.getEClassifier(typeToCreate);
+ return Bpmn2Factory.eINSTANCE.create(eClass);
}
}
\ No newline at end of file
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SessionCreationOperation.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SessionCreationOperation.java
index e7928d44..b7bd3913 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SessionCreationOperation.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SessionCreationOperation.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2011-2019 Obeo.
+ * Copyright (c) 2011-2024 Obeo.
* 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
@@ -13,17 +13,12 @@
import java.io.IOException;
import java.util.Collections;
-import java.util.HashMap;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
@@ -31,20 +26,19 @@
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
import org.eclipse.sirius.business.api.modelingproject.ModelingProject;
import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelectionCallback;
-import org.eclipse.sirius.ui.tools.internal.actions.nature.ModelingToggleNatureAction;
+import org.eclipse.sirius.ui.tools.api.project.ModelingProjectManager;
import org.eclipse.sirius.viewpoint.description.Viewpoint;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.obeonetwork.bpmn2.design.ui.wizards.newmodel.Messages;
import org.obeonetwork.dsl.bpmn2.Bpmn2Factory;
import org.obeonetwork.dsl.bpmn2.Definitions;
-import com.google.common.collect.Lists;
-
/**
* An operation to create and initialize a new session with empty semantic BPMN
* model.
@@ -95,20 +89,35 @@ public Session getCreatedSession() {
return createdSession;
}
- /**
- * {@inheritDoc}
- */
@Override
protected void execute(final IProgressMonitor monitor)
throws CoreException, InterruptedException {
+ createModelContent();
+
+ // Ensure proper representation
+ IProject prj = modelFile.getProject();
+ if (prj != null) {
+
+ if (!ModelingProject.hasModelingProjectNature(prj)) {
+ // Convert project to Modeling project
+ ModelingProjectManager.INSTANCE.convertToModelingProject(prj, monitor);
+ }
+ final Option created = ModelingProject
+ .asModelingProject(prj);
+ if (created.some()) {
+ addProcessViewpoint(created.get(), monitor);
+ }
+ }
+ }
+
+ private void createModelContent() {
final ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getURIConverter().getURIMap()
- .putAll(EcorePlugin.computePlatformURIMap());
+ .putAll(EcorePlugin.computePlatformURIMap(false));
// Get the URI of the model file.
- final URI fileURI = URI.createPlatformResourceURI(modelFile
- .getFullPath().toString(), true);
+ final URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);
final EObject rootObject = createInitialModel();
@@ -124,56 +133,31 @@ protected void execute(final IProgressMonitor monitor)
Messages.Bpmn2ModelWizard_UI_Error_CreatingBpmn2ModelSession,
e);
}
+ }
- IProject prj = modelFile.getProject();
- if (prj != null
- && !ModelingProject.hasModelingProjectNature(prj)) {
- ModelingToggleNatureAction toogleProject = new ModelingToggleNatureAction();
- EvaluationContext evaluationContext = new EvaluationContext(null,
- Lists.newArrayList(prj));
- @SuppressWarnings("rawtypes")
- ExecutionEvent event = new ExecutionEvent(null, new HashMap(),
- null, evaluationContext);
-
- // Convert project to Modeling project
- try {
- toogleProject.execute(event);
- } catch (ExecutionException e) {
- Activator
- .log(IStatus.ERROR,
- Messages.Bpmn2ModelWizard_UI_Error_CreatingBpmn2ModelSession,
- e);
- }
- final Option created = ModelingProject
- .asModelingProject(prj);
- if (created.some()) {
-
- created.get()
- .getSession()
- .getTransactionalEditingDomain()
- .getCommandStack()
- .execute(
- new RecordingCommand(created.get().getSession()
- .getTransactionalEditingDomain()) {
-
- @Override
- protected void doExecute() {
- ViewpointSelectionCallback selection = new ViewpointSelectionCallback();
- for (Viewpoint vp : ViewpointRegistry
- .getInstance().getViewpoints()) {
- if ("Process".equals(vp.getName())) {
- selection.selectViewpoint(vp,
- created.get()
- .getSession(), new NullProgressMonitor());
- }
- }
- }
- });
+ private void addProcessViewpoint(ModelingProject project, final IProgressMonitor monitor) {
+ Session session = project.getSession();
+ TransactionalEditingDomain edt = session.getTransactionalEditingDomain();
+
+ edt.getCommandStack().execute(new RecordingCommand(edt) {
+
+ @Override
+ protected void doExecute() {
+ for (Viewpoint vp : ViewpointRegistry.getInstance().getViewpoints()) {
+ if (isProcessViewPoint(vp)) {
+ new ViewpointSelectionCallback()
+ .selectViewpoint(vp, session, monitor);
+ }
+ }
}
-
- }
+ });
}
+ private static boolean isProcessViewPoint(Viewpoint vp) {
+ return "Process".equals(vp.getName())
+ && vp.eResource().getURI().toString().endsWith(Activator.DESIGN_PATH);
+ }
+
/**
* Creates the semantic root element from the given operation arguments.
*
diff --git a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SetUnsetExternalLabels.java b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SetUnsetExternalLabels.java
index 4f2dc946..2875e9fb 100644
--- a/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SetUnsetExternalLabels.java
+++ b/plugins/org.obeonetwork.dsl.bpmn2.design/src/org/obeonetwork/bpmn2/design/SetUnsetExternalLabels.java
@@ -26,9 +26,6 @@
*/
public class SetUnsetExternalLabels implements IExternalJavaAction {
- public SetUnsetExternalLabels() {
- // Nada
- }
@Override
public void execute(Collection extends EObject> selections, Map parameters) {
@@ -38,8 +35,7 @@ public void execute(Collection extends EObject> selections, Map list = (List
+ *
+ * @author nperansin
+ *
+ */
+@SuppressWarnings("restriction") // DDiagramElementSynchronizer, DNodeCandidate
+public class SiriusElementRefactor {
+
+ private static final EReference DTARGET_FEATURE = ViewpointPackage.eINSTANCE.getDSemanticDecorator_Target();
+
+ private final EObject origin;
+
+ private final Session session;
+ private final List editedDiagrams;
+
+ protected abstract class RepresentationLayout {
+ final D target;
+ final EObject container; // DDiagram, AbstractDNode{border}, DNodeContainer, DNodeList
+ final M mapping;
+ D newView;
+
+ @SuppressWarnings("unchecked")
+ protected RepresentationLayout(D src, EObject parent) {
+ target = src;
+ this.container = parent;
+ mapping = (M) src.getDiagramElementMapping();
+ }
+
+ protected void bind(D view) {
+ newView = view;
+ }
+
+ protected void update() {
+ if (newView != null) {
+ update(newView);
+ }
+ }
+ protected abstract void update(D newView);
+ }
+
+ private static > T findLayout(Collection layouts, DDiagramElement element) {
+ return layouts.stream()
+ .filter(it -> it.target == element.getTarget()
+ && it.mapping == element.getDiagramElementMapping())
+ .findFirst()
+ .orElse(null);
+ }
+
+ protected class NodeLayout extends RepresentationLayout {
+ final Bounds bounds;
+ final List borders;
+ final List outEdges;
+ final List inEdges;
+
+ protected NodeLayout(AbstractDNode src) {
+ super(src, src.eContainer());
+
+ Bounds bounds = null;
+ View gmfView = SiriusGMFHelper.getGmfView(src, session);
+ if (gmfView instanceof Node) {
+ Node node = (Node) gmfView; // gmfNode.get();
+ if (node.getLayoutConstraint() instanceof Bounds) {
+ bounds = (Bounds) node.getLayoutConstraint();
+ }
+ }
+ this.bounds = bounds;
+ // TODO copy style ?
+
+ borders = src.getOwnedBorderedNodes()
+ .stream()
+ .map(it -> new NodeLayout(it))
+ .collect(Collectors.toList());
+
+ if (src instanceof EdgeTarget) {
+ outEdges = ((EdgeTarget) src).getOutgoingEdges()
+ .stream()
+ .map(it -> new EndLayout(it, src, true))
+ .collect(Collectors.toList());
+ inEdges = ((EdgeTarget) src).getIncomingEdges()
+ .stream()
+ .map(it -> new EndLayout(it, src, false))
+ .collect(Collectors.toList());
+ } else {
+ outEdges = Collections.emptyList();
+ inEdges = Collections.emptyList();
+ }
+ }
+
+ @Override
+ protected void update(AbstractDNode target) {
+ // Update bounds
+ View gmfView = SiriusGMFHelper.getGmfView(target, session);
+ if (gmfView instanceof Node) {
+ ((Node) gmfView).setLayoutConstraint(bounds);
+ }
+ // Update border
+ newView.getOwnedBorderedNodes().forEach(it -> updateBorder(it));
+
+ if (target instanceof EdgeTarget) {
+ ((EdgeTarget) target).getOutgoingEdges()
+ .stream()
+ .forEach(it -> updateEdge(it, outEdges, target));
+ ((EdgeTarget) target).getIncomingEdges()
+ .stream()
+ .forEach(it -> updateEdge(it, inEdges, target));
+ }
+ }
+
+ protected void updateEdge(DEdge current, List layouts, AbstractDNode newNode) {
+ EndLayout layout = findEdgeLayout(current, layouts, newNode);
+ if (layout != null) {
+ layout.update(current);
+ }
+ }
+
+ protected EndLayout findEdgeLayout(DEdge current, List layouts, AbstractDNode newNode) {
+ for (EndLayout layout : layouts) {
+ if (layout.match(current, target, newNode)) {
+ return layout;
+ }
+ }
+ return null;
+ }
+
+ protected void updateBorder(DNode border) {
+ NodeLayout layout = findLayout(borders, border);
+ if (layout != null) {
+ layout.update(border);
+ }
+ }
+
+ }
+
+ protected class EdgeLayout extends RepresentationLayout {
+ final EdgeLayoutData data;
+
+ protected EdgeLayout(DEdge src) {
+ super(src, src.getParentDiagram());
+ View view = SiriusGMFHelper.getGmfView(src, session);
+ data = view instanceof Edge
+ ? new EdgeLayoutData((Edge) view)
+ : null;
+ }
+
+ @Override
+ protected void update(DEdge target) {
+ View gmfView = SiriusGMFHelper.getGmfView(target, session);
+ if (gmfView instanceof Edge) {
+ data.update((Edge) gmfView);
+ }
+ }
+
+ }
+
+ protected static EdgeTarget getEnd(DEdge src, boolean out) {
+ return out ? src.getTargetNode() : src.getSourceNode();
+ }
+
+ protected class EndLayout extends EdgeLayout {
+ final boolean targetChange;
+ final EdgeTarget end;
+ final boolean outEnd;
+ final boolean endChange;
+
+ protected EndLayout(DEdge src, AbstractDNode targeting, boolean out) {
+ super(src);
+ targetChange = src.getTarget() == targeting.getTarget();
+ outEnd = out;
+ end = getEnd(src, out);
+ endChange = end == targeting;
+ }
+
+ protected boolean match(DEdge it, AbstractDNode previous, AbstractDNode current) {
+ EObject expectedTarget = targetChange
+ ? current.getTarget()
+ : target.getTarget();
+ EdgeTarget actualEnd = getEnd(it, outEnd);
+ EdgeTarget expectedEnd = endChange
+ ? (EdgeTarget) current
+ : end;
+
+ return it.getTarget() == expectedTarget // proper target
+ && actualEnd == expectedEnd // proper end
+ && it.getMapping() == mapping; // proper mapping
+ }
+
+ }
+
+
+ private static boolean isGmfLabelNode(Object it) {
+ if (!(it instanceof Node)) {
+ return false;
+ }
+ Node node = (Node) it;
+ return node.getPersistedChildren().isEmpty() && node.getType() != null;
+ }
+
+ protected class EdgeLayoutData {
+
+ final Bendpoints bendPoints;
+ final Anchor sourceAnchor;
+ final Anchor targetAnchor;
+ final List labels;
+
+ protected EdgeLayoutData(Edge src) {
+ bendPoints = src.getBendpoints();
+ sourceAnchor = src.getSourceAnchor();
+ targetAnchor = src.getTargetAnchor();
+
+ labels = ((List>) src.getPersistedChildren())
+ .stream()
+ .filter(it -> isGmfLabelNode(it))
+ .map(Node.class::cast)
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * Updates edge with layout
+ *
+ * @param edge
+ * to update
+ */
+ private void update(Edge edge) {
+ edge.setBendpoints(bendPoints);
+ edge.setSourceAnchor(sourceAnchor);
+ edge.setTargetAnchor(targetAnchor);
+ if (!labels.isEmpty()) {
+ updateLabels(edge);
+ }
+ }
+
+ private void updateLabels(Edge edge) {
+ ((List>) edge.getPersistedChildren())
+ .stream()
+ .filter(it -> isGmfLabelNode(it))
+ .map(Node.class::cast)
+ .forEach(it -> updateLabel(it));
+
+ }
+
+ private void updateLabel(Node it) {
+ Node old = findLabel(it.getType());
+ if (old != null) {
+ it.setLayoutConstraint(old.getLayoutConstraint());
+ }
+ }
+
+ private Node findLabel(String type) {
+ return labels.stream()
+ .filter(it -> Objects.equals(it.getType(), type))
+ .findFirst().orElse(null);
+ }
+
+ }
+
+ class DiagramModifier {
+ final DSemanticDiagram parent;
+ final ModelAccessor accessor;
+ final IInterpreter interpreter;
+ final DDiagramElementSynchronizer dsync;
+ final DiagramMappingsManager mmapping;
+ final RefreshIdsHolder idFactory;
+
+ Map> mappingsToEdgeTargets = null;
+ final Map> edgeToMappings = new HashMap<>();
+ final Map> edgeToSemantics = new HashMap<>();
+
+ private DiagramModifier(DSemanticDiagram diagram) {
+ parent = diagram;
+ accessor = SiriusPlugin.getDefault()
+ .getModelAccessorRegistry()
+ .getModelAccessor(diagram);
+ mmapping = DiagramMappingsManagerRegistry.INSTANCE.getDiagramMappingsManager(session, diagram);
+ interpreter = InterpreterUtil.getInterpreter(diagram);
+ dsync = new DDiagramElementSynchronizer(diagram, interpreter, accessor)
+ /* Should we skip a PermissionAuthority ?
+ {
+
+ @Override
+ public void refresh(final DDiagramElement newNode) {
+ if (newNode instanceof DNode) {
+ refresh((DNode) newNode);
+ } else if (newNode instanceof DNodeListElement) {
+ refresh((DNodeListElement) newNode);
+ } else if (newNode instanceof DDiagramElementContainer) {
+ refresh((DDiagramElementContainer) newNode);
+ } else if (newNode instanceof DEdge) {
+ refresh((DEdge) newNode);
+ }
+ }
+
+ }*/;
+ idFactory = RefreshIdsHolder.getOrCreateHolder(diagram);
+ }
+
+ private void prepareEdges() {
+ if (mappingsToEdgeTargets != null) {
+ return;
+ }
+ mappingsToEdgeTargets = dsync.computeMappingsToEdgeTargets(session.getSelectedViewpoints(false));
+ // Initialize cache
+ new DecorationHelperInternal(parent, interpreter, accessor)
+ .computeDecorations(mappingsToEdgeTargets, edgeToSemantics, edgeToMappings);
+ // TODO update with new nodes ?
+ }
+
+ }
+
+ // Transformation content
+ private List transferableRefs = new ArrayList<>();
+ private List nodeLayouts = new ArrayList<>();
+ private List edgeLayouts = new ArrayList<>();
+ private Map synchs = new HashMap<>();
+
+ public SiriusElementRefactor(DRepresentationElement context) {
+ origin = Objects.requireNonNull(context.getTarget());
+ session = Session.of(context).get();
+
+ editedDiagrams = Stream.of(PlatformUI.getWorkbench().getWorkbenchWindows())
+ .flatMap(it -> Stream.of(it.getPages()))
+ .flatMap(it -> Stream.of(it.getEditorReferences()))
+ .map(it -> it.getEditor(false))
+ .filter(this::isApplicableEditor)
+ .map(this::toDiagram)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ private DDiagram toDiagram(IEditorPart editor) {
+ URI repUri = ((SessionEditorInput) editor.getEditorInput()).getRepDescUri();
+ EObject rep = session.getTransactionalEditingDomain().getResourceSet().getEObject(repUri, false);
+
+ if (rep instanceof DRepresentationDescriptor) { // regular case
+ rep = ((DRepresentationDescriptor) rep).getRepresentation();
+ }
+ return rep instanceof DDiagram
+ ? (DDiagram) rep
+ : null;
+ }
+
+ private boolean isApplicableEditor(IEditorPart it) {
+ return session != null
+ && it instanceof SiriusDiagramEditor
+ && it.getEditorInput() instanceof SessionEditorInput
+ && ((SessionEditorInput) it.getEditorInput()).getSession() == session;
+ }
+
+ // Open diagram -> listeners requires a proper update
+ public EObject transformInto(EClass targetType) {
+ EFactory fct = targetType.getEPackage().getEFactoryInstance();
+ return replaceWith(fct.create(targetType));
+ }
+
+
+ public EObject replaceWith(R target) {
+ try {
+ copyContent(target);
+
+ EStructuralFeature.Setting containment = analyseReferences(target);
+
+ // Change containment first for all listeners to be triggered.
+ replaceReference(containment.getEObject(), containment.getEStructuralFeature(), target);
+ for (EStructuralFeature.Setting ref : transferableRefs) {
+ if (ref.getEStructuralFeature() == DTARGET_FEATURE
+ && ref.getEObject() instanceof DDiagramElement) {
+ replaceDElementTarget((DDiagramElement) ref.getEObject(), target);
+ } else {
+ replaceReference(ref.getEObject(), ref.getEStructuralFeature(), target);
+ };
+ }
+
+ // Recreate Views (Do not use refresh to associate old and new representations).
+ Set toRefresh = new HashSet<>();
+ nodeLayouts.forEach(it -> toRefresh.add(createNewNode(target, it)));
+ edgeLayouts.forEach(it -> toRefresh.add(createNewEdge(target, it)));
+
+ // Refresh Diagrams to create GMF notation
+ toRefresh.forEach(it -> refresh(it));
+
+ // Restore layout nodes
+ nodeLayouts.forEach(it -> it.update());
+ // TODO restore
+ // - edges
+
+ return target;
+ } finally {
+ cleanCache();
+ }
+ }
+
+ /**
+ * Replaces the element target and mapping.
+ *
+ * @param dElement to update
+ * @param target new target
+ */
+ protected void replaceDElementTarget(DDiagramElement dElement, EObject target) {
+ // Update mapping if possible.
+ // Otherwise opening refresh will fix diagram but loose gmf node.
+ // (There is only so much we can do)
+ if (dElement instanceof DEdge) {
+ DEdge edge = (DEdge) dElement;
+ EdgeMapping newMapping = getApplicableEdgeMapping((IEdgeMapping) edge.getMapping(), target);
+ if (newMapping != null) {
+ edge.setActualMapping(newMapping);
+ }
+ } else if (dElement instanceof AbstractDNode) {
+ AbstractDNode node = (AbstractDNode) dElement;
+ AbstractNodeMapping newMapping = getApplicableNodeMapping((AbstractNodeMapping) node.getMapping(), target);
+ updateNodeMapping(node, newMapping);
+ }
+ dElement.setTarget(target);
+ }
+
+ private static void updateNodeMapping(AbstractDNode node, AbstractNodeMapping newMapping) {
+ if (node instanceof DNode) {
+ if (newMapping instanceof NodeMapping) {
+ ((DNode) node).setActualMapping((NodeMapping) newMapping);
+ }
+ } else if (node instanceof DDiagramElementContainer) {
+ if (newMapping instanceof ContainerMapping) {
+ ((DDiagramElementContainer) node).setActualMapping((ContainerMapping) newMapping);
+ }
+ } else if (node instanceof DNodeListElement) {
+ if (newMapping instanceof NodeMapping) {
+ ((DNodeListElement) node).setActualMapping((NodeMapping) newMapping);
+ }
+ }
+ // If the node keep a improper mapping, it will be flushed in next refresh.
+ // (like for a VSM update)
+ }
+
+ private void refresh(DSemanticDiagram it) {
+ Diagram gmfDiagram = getGMFDiagram(it);
+ if (gmfDiagram == null) {
+ return;
+ }
+ // Create proper location
+ DDiagramCanonicalSynchronizer gmfSynch =
+ new DDiagramCanonicalSynchronizer(gmfDiagram);
+ gmfSynch.storeViewsToArrange(false);
+
+ // Clean diagram and related edges
+ DialectManager.INSTANCE.refresh(it, new NullProgressMonitor());
+
+ // Create gmf nodes of new elements. This is performed in pre-commit.
+ gmfSynch.synchronize();
+ }
+
+ private static Diagram getGMFDiagram(DDiagram it) {
+ for (AnnotationEntry anno : it.getOwnedAnnotationEntries()) {
+ if (Objects.equals(anno.getSource(), CustomDataConstants.GMF_DIAGRAMS)) {
+ return (Diagram) anno.getData();
+ }
+ }
+ return null;
+ }
+
+ private DSemanticDiagram createNewNode(EObject target, NodeLayout save) {
+ DSemanticDiagram diagram = getAncestor(DSemanticDiagram.class, save.container);
+ DiagramModifier sync = synchs.computeIfAbsent(diagram, DiagramModifier::new);
+
+ AbstractNodeMapping targetMapping = getApplicableNodeMapping(
+ (AbstractNodeMapping) save.target.getMapping(), target);
+ if (targetMapping == null) {
+ return diagram;
+ }
+ DNodeCandidate candidate = new DNodeCandidate(
+ targetMapping,
+ target,
+ (DragAndDropTarget) save.container,
+ sync.idFactory);
+
+ // Should we keep node order in container ? (Probably not).
+ save.bind(sync.dsync.createNewNode(sync.mmapping, candidate, false));
+ return diagram;
+ }
+
+ /**
+ * Returns the mapping expected for a transformed node.
+ *
+ * @param previous mapping
+ * @param current transformed target
+ * @return mapping or null if not displayed anymore
+ */
+ protected AbstractNodeMapping getApplicableNodeMapping(AbstractNodeMapping previous, EObject current) {
+ return previous;
+ }
+
+ private DSemanticDiagram createNewEdge(EObject target, EdgeLayout save) {
+ DSemanticDiagram diagram = (DSemanticDiagram) save.container;
+ DiagramModifier writer = synchs.computeIfAbsent(diagram, DiagramModifier::new);
+
+ EdgeMapping targetMapping = getApplicableEdgeMapping(
+ (IEdgeMapping) save.target.getMapping(), target);
+ DEdgeCandidate candidate = new DEdgeCandidate(
+ targetMapping,
+ target,
+ getAccurateEgdeTarget(save.target.getSourceNode()),
+ getAccurateEgdeTarget(save.target.getTargetNode()),
+ writer.idFactory);
+
+ // See org.eclipse.sirius.diagram.business.internal.helper.task.operations.CreateViewTask
+ // #createEdgeView(DSemanticDiagram, CreateEdgeView, Session)
+ writer.prepareEdges();
+ save.bind(writer.dsync.createNewEdge(writer.mmapping, candidate,
+ writer.mappingsToEdgeTargets,
+ writer.edgeToMappings,
+ writer.edgeToSemantics));
+ return diagram;
+ }
+
+ /**
+ * Returns the mapping expected for a transformed edge.
+ *
+ * @param previous mapping
+ * @param current transformed target
+ * @return mapping or null if not displayed anymore
+ */
+ protected EdgeMapping getApplicableEdgeMapping(IEdgeMapping previous, EObject current) {
+ return (EdgeMapping) previous;
+ }
+
+
+ private EdgeTarget getAccurateEgdeTarget(EdgeTarget previous) {
+ for(NodeLayout node : nodeLayouts) {
+ if (node.target == previous && node.newView != null) {
+ return (EdgeTarget) node.newView;
+ }
+ }
+ return previous;
+ }
+
+
+ private void cleanCache() {
+ transferableRefs.clear();
+ nodeLayouts.clear();
+ edgeLayouts.clear();
+ synchs.clear();
+ }
+
+ private EStructuralFeature.Setting analyseReferences(EObject target) {
+ EStructuralFeature.Setting containment = null;
+
+ for (EStructuralFeature.Setting ref : session.getSemanticCrossReferencer().getInverseReferences(origin)) {
+ // Refactor
+ // - split reference and get relationship
+ EStructuralFeature feat = ref.getEStructuralFeature();
+ if (feat instanceof EReference && ((EReference) feat).isContainment()) {
+ containment = ref;
+ } else if (isEditable(ref.getEStructuralFeature())) {
+ if (isAssignable(ref.getEStructuralFeature(), target)
+ && shouldRecreateView(ref)) {
+
+ if (DTARGET_FEATURE == ref.getEStructuralFeature()) {
+ DDiagramElement dElement = (DDiagramElement) ref.getEObject();
+ saveLayoutRepresentation(dElement);
+ } // else ignore other reference like 'semanticElements'
+ } else {
+ transferableRefs.add(ref);
+ }
+ }
+ }
+ return containment;
+ }
+
+ protected void saveLayoutRepresentation(DDiagramElement dElement) {
+ if (dElement instanceof AbstractDNode) {
+ nodeLayouts.add(new NodeLayout((AbstractDNode) dElement));
+ } else if (dElement instanceof DEdge) {
+ edgeLayouts.add(new EdgeLayout((DEdge) dElement));
+ } // else no other cases for diagram
+ }
+
+ private boolean shouldRecreateView(EStructuralFeature.Setting ref) {
+ if (!(ref.getEObject() instanceof DDiagramElement)) {
+ return false;
+ }
+ DDiagram container = getAncestor(DDiagram.class, ref.getEObject());
+ return container != null && editedDiagrams.contains(container);
+ }
+
+
+ private void replaceReference(EObject caller, EStructuralFeature feat, EObject target) {
+ if (feat.isMany()) { // remove reference
+ @SuppressWarnings("unchecked")
+ List