Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2015-12-02 14:45:38 +0000
committerGerrit Code Review @ Eclipse.org2015-12-04 12:59:05 +0000
commitf8dedc59a0e9bc39beaa61b7a8c2cad1252c9438 (patch)
tree0e03fa04aaa10fd1c0c48028dec5a61b64bd06c9 /plugins/infra
parent1f171bd0213d10d1d791f622e7ebf0b6484c40c5 (diff)
downloadorg.eclipse.papyrus-f8dedc59a0e9bc39beaa61b7a8c2cad1252c9438.tar.gz
org.eclipse.papyrus-f8dedc59a0e9bc39beaa61b7a8c2cad1252c9438.tar.xz
org.eclipse.papyrus-f8dedc59a0e9bc39beaa61b7a8c2cad1252c9438.zip
Bug 477384: [Canonical] Should not use drop requests to create views
https://bugs.eclipse.org/bugs/show_bug.cgi?id=477384 Changes to core APIs to remove PapyrusCanonicalEditPolicy's dependence on the generated diagram drag-and-drop behavior: * extract the CommonDiagramDragDropEditPolicy's abstract API for information about diagram-specific view types into a new service * update the canonical edit-policy and diagram-to-diagram synchronization infrastructure to use the new VisualTypeService to obtain information about the diagram's specific view types to then let the view service create views without resorting to drop commands * update extensions of various canonical strategies in the UML diagrams to adapt to the new drop-free synchronization mechanism Update the Papyrus Diagram GMFGen extensions and code generation templates to add generation of the IVisualTypeProvider that plugs into the new VisualTypeService to support canonical synchronization and drag-and-drop. Includes regeneration of the GMFGen extension model using EMF's most recent templates, which result in minor changes to most model source files. Regenerate all UML diagrams to create and register the visual type provider extensions. Also update the BREE for diagrams to 1.8 because at least one of them requires Java 8 to compile properly. * Note that the interaction overview diagram uses a code generator that is not published on Eclipse.org, so I had to emulate the code generation step for this one * Note also that the SysML 1.1 diagrams likewise cannot be re-generated but, moreover, they do not implement the common pattern for Visual ID Registry, so they are also updated "by hand" for parity with the Mars implementation of drag-and-drop (which had gaps) Deprecate the ICreationTargetStrategy extension API which was only needed to redirect drag-and-drop requests, but these are no longer employed in the canonical synchronization. Also some fixes for region layout problems in the State Machine Diagram: * update custom creation edit policies to re-use the commands used by drag-and-drop and untargeted creation that perform initial placement of new regions * fix the GMFGen to register the custom creation edit policy for the state machine compartment Change-Id: I3afc68d6f0f1bfe05e336c9138a7f1acbc8f643b
Diffstat (limited to 'plugins/infra')
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.classpath2
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/META-INF/MANIFEST.MF2
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.di2
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.mediawiki160
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.notation572
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.uml111
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/gmfgenextension.jpgbin0 -> 12852 bytes
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/main.jpgbin0 -> 50206 bytes
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/schema/strategies.exsd7
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/editpolicy/PapyrusCanonicalEditPolicy.java209
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/CreationTargetStrategyRegistration.java5
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ICreationTargetStrategy.java5
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ISemanticChildrenStrategy.java99
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/SemanticChildrenStrategyRegistry.java12
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/VisuallyNestedElementsImpl.java112
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.commands/src/org/eclipse/papyrus/commands/util/CommandTreeIterator.java10
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/META-INF/MANIFEST.MF1
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/plugin.xml1
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/schema/visualTypeProviders.exsd128
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/commands/requests/CanonicalDropObjectsRequest.java4
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/AbstractVisualTypeProvider.java46
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetElementTypeOperation.java52
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetLinkTypeOperation.java52
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetNodeTypeOperation.java52
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeOperation.java26
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeProvider.java70
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/VisualTypeService.java179
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/AbstractNestedDiagramViewsSyncFeature.java62
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/DiagramEdgesSyncFeature.java75
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.dnd/src/org/eclipse/papyrus/infra/gmfdiag/dnd/policy/CustomizableDropEditPolicy.java22
31 files changed, 2029 insertions, 55 deletions
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.classpath b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.classpath
index 098194ca4b7..eca7bdba8f0 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.classpath
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.settings/org.eclipse.jdt.core.prefs
index 9ca8e68231b..62a08f4494d 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/.settings/org.eclipse.jdt.core.prefs
@@ -1,10 +1,10 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/META-INF/MANIFEST.MF b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/META-INF/MANIFEST.MF
index 7c1357afe19..e99f122fb7f 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/META-INF/MANIFEST.MF
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/META-INF/MANIFEST.MF
@@ -26,4 +26,4 @@ Bundle-Activator: org.eclipse.papyrus.infra.gmfdiag.canonical.internal.Activator
Bundle-ManifestVersion: 2
Bundle-Description: %pluginDescription
Bundle-SymbolicName: org.eclipse.papyrus.infra.gmfdiag.canonical;singleton:=true
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.di b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.di
new file mode 100644
index 00000000000..bf9abab340f
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"/>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.mediawiki b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.mediawiki
new file mode 100644
index 00000000000..d9376e6e54e
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.mediawiki
@@ -0,0 +1,160 @@
+
+== Dropless Canonical Edit Policy ==
+
+This document describes the design of an enhancement in the Neon release in which the
+synchronization of canonical diagram views with the model no longer relies on the
+drag-and-drop infrastructure.
+
+=== Contents ===
+
+__TOC__
+
+=== Requirements ===
+
+In the Mars release, a new <code>PapyrusCanonicalEditPolicy</code> was introduced that replaces
+GMF's standard canonical edit policy (the <code>EditPolicyRoles.CANONICAL_ROLE</code>). The key
+design point of this policy was its delegation to the diagram's specific drag-and-drop policy
+to create views of existing elements. As indicated by
+[https://bugs.eclipse.org/bugs/show_bug.cgi?id=477384 bug 477384], this does have the side-effect
+of limiting the customizability of drag-and-drop in the diagrams. In particular, the canonical
+synchronization implemented by the <code>CanonicalEditPolicy</code> expects the drop edit policy
+to do nothing (or very little) more than create a view of an existing element. This restricts
+the amount of intelligent dropping of elements to create related new elements in various scenarios,
+without also going to lengths to constrain what kinds of elements the canonical edit policy will
+attempt to visualize.
+
+Accordingly, the primary requirements for the Neon implementation of the canonical edit policy are:
+
+* '''R1''': the <code>PapyrusCanonicalEditPolicy</code> {{req|wont}} depend on the diagram's drag-and-drop edit policy to create new views of model elements
+* '''R2''': the <code>PapyrusCanonicalEditPolicy</code> {{req|shall}} simply use <code>CreateRequest</code>s to create new views for elements as directly as possible, according to the specific visual element types of each diagram
+** '''R2.1''': the diagrams {{req|should}} publish information about their specific visual element types in some reusable form that other components (such as drag-and-drop, itself) may likewise rely on
+
+=== Design ===
+
+The core issue addressed by the Mars design was that a generic edit policy such as the
+<code>PapyrusCanonicalEditPolicy</code> had no means to determine the specific visual element types
+(in particular, ''visual IDs'') of the views that it needed to create for semantic elements in
+any given diagram. These specific element types are required to formulate the
+<code>CreateRequest</code>s that ultimately are satisfied by the diagram's particular
+<code>ViewProvider</code>. The solution in the Mars release was to delegate to the diagram's
+generated <code>DragDropEditPolicy</code> by transforming <code>CreateRequest</code> to
+<code>DropObjectsRequest</code>s (encapsulated in a wrapper to pass them through the customizable
+drop policy with its pluggable strategies, but that's a minor detail). This worked because
+each diagram actually substitutes a custom drop edit policy implementation that is specifically
+coded to be aware of the mapping of semantic element types to visual element types in each
+parent view that can visualize each semantic element within the context of the particular diagram.
+
+Accordingly, the new design for Neon hoists this knowledge of the diagram's specific visual element
+types out of the drop edit policy and into a new GMF-style ''service'' that the generic
+<code>PapyrusCanonicalEditPolicy</code> can query to determine the visual element types that it
+should request.
+
+[[image:images/main.jpg|Canonical Edit Policy and Visual Type Registry]]
+
+The <code>PapyrusCanonicalEditPolicy</code> uses a new <code>VisualTypeService</code> to query the
+following diagram-specific information that it needs to formulate <code>CreateRequest</code>s to
+create new views for the semantic elements that it needs to visualize:
+
+* the most appropriate view type (''visual ID'' in generated diagrams, but generally some string type code) for an element to be visualized as a child <code>Node</code> of some parent <code>View</code> (which could be the diagram surface or some shape or compartment)
+* the most appropriate view type (''visual ID'' or string) for an element to be visualized as an <code>Edge</code> in the <code>Diagram</code>
+* the element type corresponding to a view type (''visual ID'' or string, as obtained from one of the two previous queries) specific to a particular <code>Diagram</code>
+
+Thus the dependence on the diagram-specific drop edit policies is removed, as the canonical edit
+policy now has independent access to the visual type information that it needs, specific to each
+diagram. The generic <code>CommonDiagramDragDropEditPolicy</code> is also updated to use the new
+<code>VisualTypeService</code> to implement the previously abstract API methods that the diagrams'
+custom subclasses implemented to provide this same visual type information. As a result, diagrams
+that don't need special drop behaviour but only need drag-and-drop to create new views can be
+somewhat simplified.
+
+=== Code Generation ===
+
+A new code generation template is added in the <code>org.eclipse.papyrus.def</code> bundle that
+generates the diagram's contribution of a concrete implementation of the
+<code>IVisualTypeProvider</code>. The implementations of the provider API methods simply delegate
+to static APIs that are also generated for each diagram:
+
+* <code>getNodeType</code> and <code>getLinkType</code> methods delegate to the corresponding APIs of the generated visual ID registry (usually named <code>UMLVisualIDRegistry</code>)
+* <code>getElementType</code> delegates to the generated element-types enumeration (usually named <code>UMLElementTypes</code>
+
+Because the APIs that the visual type provider delegates to are static, there is no way in the
+existing GMF/Papyrus frameworks to plug them into the core diagram layer without an intermediate
+object like the visual type provider. The generated <code>UMLElementTypes</code> classes do all
+include a <code>TYPED_INSTANCE</code> field implementing a <code>DiagramElementTypes</code> interface,
+but this, too, is a static API, so it has to be injected by code into any class that needs it. There
+is no facility for injecting these into a core component like the
+<code>PapyrusCanonicalEditPolicy</code>. Besides that the <code>DiagramElementTypes</code> API
+doesn't provide all that is needed in this scenario. So, the alternatives are to create a new
+template for generation of subclasses of the <code>PapyrusCanonicalEditPolicy</code> in each diagram
+(which would obviate the need for the <code>VisualTypeService</code>) or create a new template for
+generation of visual type providers. The latter seems a cleaner design, separating out the concern
+of diagram-specific visual ID discovery into a reusable component that may be of service to other
+clients than just the <code>PapyrusCanonicalEditPolicy</code> (such as, in fact, the
+<code>CommonDiagramDragDropEditPolicy</code>).
+
+Because there is now a new generated visual type provider class, the GMFGen model for a diagram
+needs to be able to specify the name of the generated class, if necessary, and also a custom subclass
+for overrides of the generated default behaviour. This is a common pattern, especially in the
+edit-parts and edit-policies models. These use cases are satisfied by the addition of the
+<code>GenVisualTypeProvider</code> class in Papyrus's GMFGen extension model on the one hand and
+by registration of a higher-priority custom provider on the other (as is done for
+edit-part providers, for example).
+
+[[image:images/gmfgenextension.jpg|Visual Type Provider Model in GMFGen Extension]]
+
+The <code>GenVisualTypeProvider</code> optionally specifies a provider class name; the default value
+is <code>"UMLVisualTypeProvider"</code>. Static methods are defined that obtain, respectively, the
+simple and the qualified name of the visual type provider class for a diagram. This accounts for
+the absence of a <code>GenVisualTypeProvider</code> element in the GMFGen model (it is an optional
+extension element) to provide the defaults even in that case. Thus, none of the existing UML
+diagrams' GMFGen models need changes to generate the new provider class.
+
+=== Deprecations ===
+
+==== ICreationTargetStrategy ====
+
+The custom drop edit policies of some of the diagrams are rather particular about what an element
+needs to be dropped on in order to add it to the diagram. For example, some connections cannot just
+be dropped anywhere in the diagram but only on a particular shape (perhaps one of its ends). In
+the State Machine Diagram, a region that is not the first region visualized in a composite state must
+be dropped onto some other region in order to partition the space that it occupies in two. To
+account for these cases, the Mars design included pluggable <code>ICreationTargetStrategy</code>
+extensions. These allowed the diagrams to re-direct the drop operation from the obvious target
+(the edit-part of the parent element) to some other edit-part. This mechanism is now no longer
+necessary, because the <code>PapyrusCanonicalEditPolicy</code> knows ''a priori'' which parent view
+must contain the node that it is trying to create, and the diagrams' view providers know how to
+create the child views (note that edges are a simpler case because they are all owned by the root
+diagram view).
+
+Accordingly, the <code>ICreationTargetStrategy</code> API is deprecated in Neon and all
+implementations in the UML diagrams are deleted (the framework still delegates to these strategies
+if they happen to exist). The special case of regions in a diagram might have needed this target
+strategy but it is easily handled in the custom creation strategies for state machine compartment
+and state compartment using GEF's own <code>getTargetEditPart(Request)</code> protocol, for the
+case of the <code>CreateRequest</code>.
+
+==== CanonicalDropObjectsRequest ====
+
+The Mars design delegated to the diagrams' generated drop edit policies. This required a mechanism
+to sidestep the <code>CustomizableDropEditPolicy</code> installed by the core Papyrus diagram layer
+to override the diagrams' generated policies, because it would not be desirable to let pluggable
+drop strategies interfere with the straightforward drop behaviour needed for view synchronization.
+
+The solution was similar to protocol encapsulation in networking: wrap the
+<code>DropObjectsRequest</code> in a <code>CanonicalDropObjectsRequest</code> which the
+<code>CustomizableDropEditPolicy</code> recognized. On receiving the wrapper, the customizable
+policy would simply unwrap the <code>DropObjectsRequest</code> within it and forward that to the
+default drop policy provided by the diagram.
+
+None of this encapsulation is needed in Neon, so the <code>CanonicalDropObjectsRequest</code> class
+is deprecated and the <code>CustomizableDropEditPolicy</code> no longer recognizes it.
+
+=== Limitations ===
+
+All of the UML diagrams are regenerated in Neon to plug in their visual type providers. However,
+the SysML 1.1 diagrams in the main Papyrus repository cannot be generated (they do not use GMFGen
+models) and, more importantly, they do not use visual ID registries as the UML diagrams do.
+They prefer the use of non-integer view types, using integer visual IDs only for elements
+inherited from the UML diagrams that they extend. So, a different pattern of delegation to
+existing SysML-specific view-type registries and the inherited UML visual type providers is
+devised in the SysML diagrams to implement their specific visual type providers. \ No newline at end of file
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.notation b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.notation
new file mode 100644
index 00000000000..8e5c065c611
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.notation
@@ -0,0 +1,572 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/viewpoints/policy/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
+ <notation:Diagram xmi:id="_IFWDsHi_EeWLz9_fOdUDAA" type="PapyrusUMLClassDiagram" name="main" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_aG0sIHi_EeWLz9_fOdUDAA" type="2004" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_otjsAHi_EeWLz9_fOdUDAA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_otkTEHi_EeWLz9_fOdUDAA" key="QualifiedNameDepth" value="1"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_aG1TMHi_EeWLz9_fOdUDAA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_aG1TMXi_EeWLz9_fOdUDAA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_aG1TMni_EeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aG1TM3i_EeWLz9_fOdUDAA" visible="false" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aG1TNHi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aG1TNXi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aG1TNni_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aG1TN3i_EeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aG1TOHi_EeWLz9_fOdUDAA" type="7007">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aG1TOXi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aG1TOni_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aG1TO3i_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aG1TPHi_EeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aG1TPXi_EeWLz9_fOdUDAA" visible="false" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aG1TPni_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aG1TP3i_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aG1TQHi_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aG1TQXi_EeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="dropless.uml#_SiEhQHi_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aG0sIXi_EeWLz9_fOdUDAA" x="472" y="50" height="65"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_aHMfkHi_EeWLz9_fOdUDAA" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_otkTEXi_EeWLz9_fOdUDAA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_otkTEni_EeWLz9_fOdUDAA" key="QualifiedNameDepth" value="1"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_aHNGoHi_EeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_aHNGoXi_EeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_aHNGoni_EeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aHNGo3i_EeWLz9_fOdUDAA" type="7017" collapsed="true">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aHNGpHi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aHNGpXi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aHNGpni_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aHNGp3i_EeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aHNGqHi_EeWLz9_fOdUDAA" type="7018" collapsed="true">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aHNGqXi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aHNGqni_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aHNGq3i_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aHNGrHi_EeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_aHNGrXi_EeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_aHNGrni_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_aHNGr3i_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_aHNGsHi_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aHNGsXi_EeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_U3PB0Hi_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aHMfkXi_EeWLz9_fOdUDAA" x="265" y="51" height="68"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_7maoYHi_EeWLz9_fOdUDAA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_7maoYni_EeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_7maoY3i_EeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_7maoZHi_EeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_7maoZXi_EeWLz9_fOdUDAA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_7maoZni_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_7maoZ3i_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_7maoaHi_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7maoaXi_EeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_7maoani_EeWLz9_fOdUDAA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_7maoa3i_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_7maobHi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_7maobXi_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7maobni_EeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_7maob3i_EeWLz9_fOdUDAA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_7maocHi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_7maocXi_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_7maocni_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7maoc3i_EeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_7mYzMHi_EeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7maoYXi_EeWLz9_fOdUDAA" x="267" y="194"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_FKPvEHjAEeWLz9_fOdUDAA" type="2004">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FKPvEnjAEeWLz9_fOdUDAA" type="5011"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FKPvE3jAEeWLz9_fOdUDAA" type="8507">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FKPvFHjAEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_FKPvFXjAEeWLz9_fOdUDAA" type="7006">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_FKPvFnjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_FKPvF3jAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_FKPvGHjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FKPvGXjAEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_FKPvGnjAEeWLz9_fOdUDAA" type="7007">
+ <children xmi:type="notation:Shape" xmi:id="_KrHrwHjCEeWLz9_fOdUDAA" type="3007">
+ <element xmi:type="uml:Operation" href="dropless.uml#_Kq_I4HjCEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KrHrwXjCEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_NDX8kHjCEeWLz9_fOdUDAA" type="3007">
+ <element xmi:type="uml:Operation" href="dropless.uml#_NDPZsHjCEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NDX8kXjCEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_N67PoHjCEeWLz9_fOdUDAA" type="3007">
+ <element xmi:type="uml:Operation" href="dropless.uml#_N6yswHjCEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_N67PoXjCEeWLz9_fOdUDAA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_FKPvG3jAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_FKPvHHjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_FKPvHXjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FKPvHnjAEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_FKPvH3jAEeWLz9_fOdUDAA" type="7008">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_FKPvIHjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_FKPvIXjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_FKPvInjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FKPvI3jAEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Interface" href="dropless.uml#_FKN54HjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FKPvEXjAEeWLz9_fOdUDAA" x="440" y="193"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_QxhUMHjAEeWLz9_fOdUDAA" type="2008" fillColor="12632256">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_VfJg8HjAEeWLz9_fOdUDAA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_VfJg8XjAEeWLz9_fOdUDAA" key="QualifiedNameDepth" value="1"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QxhUMnjAEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QxhUM3jAEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QxhUNHjAEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_QxhUNXjAEeWLz9_fOdUDAA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Qxh7QHjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Qxh7QXjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Qxh7QnjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qxh7Q3jAEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Qxh7RHjAEeWLz9_fOdUDAA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Qxh7RXjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Qxh7RnjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Qxh7R3jAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qxh7SHjAEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Qxh7SXjAEeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Qxh7SnjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Qxh7S3jAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Qxh7THjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qxh7TXjAEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_PomkUHjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QxhUMXjAEeWLz9_fOdUDAA" x="36" y="55" width="140" height="63"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_b7Is8HjAEeWLz9_fOdUDAA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_b7JUAHjAEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_b7JUAXjAEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_b7JUAnjAEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_b7JUA3jAEeWLz9_fOdUDAA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_b7JUBHjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_b7JUBXjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_b7JUBnjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b7JUB3jAEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_b7JUCHjAEeWLz9_fOdUDAA" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_Jg4QwHjDEeWLz9_fOdUDAA" type="3013">
+ <element xmi:type="uml:Operation" href="dropless.uml#_JgvG0HjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Jg4QwXjDEeWLz9_fOdUDAA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_b7JUCXjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_b7JUCnjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_b7JUC3jAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b7JUDHjAEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_b7JUDXjAEeWLz9_fOdUDAA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_b7JUDnjAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_b7JUD3jAEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_b7JUEHjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b7JUEXjAEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_b7He0HjAEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b7Is8XjAEeWLz9_fOdUDAA" x="28" y="195" width="147"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hvE6IHjDEeWLz9_fOdUDAA" type="2008" fillColor="8905185">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_owiKsHjDEeWLz9_fOdUDAA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_owiKsXjDEeWLz9_fOdUDAA" key="QualifiedNameDepth" value="1"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hvFhMHjDEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hvFhMXjDEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_hvFhMnjDEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hvFhM3jDEeWLz9_fOdUDAA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hvFhNHjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hvFhNXjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hvFhNnjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvFhN3jDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hvFhOHjDEeWLz9_fOdUDAA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hvFhOXjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hvFhOnjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hvFhO3jDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvFhPHjDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hvFhPXjDEeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hvFhPnjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hvFhP3jDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hvFhQHjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvFhQXjDEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_VVaOwHjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvE6IXjDEeWLz9_fOdUDAA" x="188" y="426" height="71"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hvd7sHjDEeWLz9_fOdUDAA" type="2008" fillColor="8905185">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_owiKsnjDEeWLz9_fOdUDAA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_owiKs3jDEeWLz9_fOdUDAA" key="QualifiedNameDepth" value="1"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hvd7snjDEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hvd7s3jDEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_hvd7tHjDEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hvd7tXjDEeWLz9_fOdUDAA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hvd7tnjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hvd7t3jDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hvd7uHjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvd7uXjDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hvd7unjDEeWLz9_fOdUDAA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hvd7u3jDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hvd7vHjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hvd7vXjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvd7vnjDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hvd7v3jDEeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hvd7wHjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hvd7wXjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hvd7wnjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvd7w3jDEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_YNzYMXjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hvd7sXjDEeWLz9_fOdUDAA" x="357" y="427" height="71"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hv3kUHjDEeWLz9_fOdUDAA" type="2008" fillColor="8905185">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_owixwHjDEeWLz9_fOdUDAA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_owixwXjDEeWLz9_fOdUDAA" key="QualifiedNameDepth" value="1"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hv4LYHjDEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hv4LYXjDEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_hv4LYnjDEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hv4LY3jDEeWLz9_fOdUDAA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hv4LZHjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hv4LZXjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hv4LZnjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hv4LZ3jDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hv4LaHjDEeWLz9_fOdUDAA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hv4LaXjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hv4LanjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hv4La3jDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hv4LbHjDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hv4LbXjDEeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hv4LbnjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hv4Lb3jDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hv4LcHjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hv4LcXjDEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_YqWxUXjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hv3kUXjDEeWLz9_fOdUDAA" x="533" y="427" height="71"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hwTCIHjDEeWLz9_fOdUDAA" type="2008" fillColor="8905185">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_owixwnjDEeWLz9_fOdUDAA" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_owixw3jDEeWLz9_fOdUDAA" key="QualifiedNameDepth" value="1"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hwTCInjDEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_hwTCI3jDEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_hwTCJHjDEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hwTCJXjDEeWLz9_fOdUDAA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hwTCJnjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hwTCJ3jDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hwTCKHjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hwTCKXjDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hwTCKnjDEeWLz9_fOdUDAA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hwTCK3jDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hwTCLHjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hwTCLXjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hwTCLnjDEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_hwTCL3jDEeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_hwTCMHjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_hwTCMXjDEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_hwTCMnjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hwTCM3jDEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_Yxmo0XjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hwTCIXjDEeWLz9_fOdUDAA" x="753" y="425" height="71"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_7kqYEHjDEeWLz9_fOdUDAA" type="2012">
+ <children xmi:type="notation:DecorationNode" xmi:id="_7kqYEnjDEeWLz9_fOdUDAA" type="5038"/>
+ <element xmi:type="uml:Comment" href="dropless.uml#_7kpJ8HjDEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7kqYEXjDEeWLz9_fOdUDAA" x="462" y="532"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_IFWDsXi_EeWLz9_fOdUDAA" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_IFWDsni_EeWLz9_fOdUDAA"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_IFWDs3i_EeWLz9_fOdUDAA">
+ <owner xmi:type="uml:Model" href="dropless.uml#_IElOsHi_EeWLz9_fOdUDAA"/>
+ </styles>
+ <element xmi:type="uml:Model" href="dropless.uml#_IElOsHi_EeWLz9_fOdUDAA"/>
+ <edges xmi:type="notation:Connector" xmi:id="_f3C-UHi_EeWLz9_fOdUDAA" type="4007" source="_aHMfkHi_EeWLz9_fOdUDAA" target="_aG0sIHi_EeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_f3C-U3i_EeWLz9_fOdUDAA" type="6016">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_h1rYwHjAEeWLz9_fOdUDAA" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_h1rYwXjAEeWLz9_fOdUDAA" key="visible" value="true"/>
+ </eAnnotations>
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_ekdfoHjAEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_f3DlYHi_EeWLz9_fOdUDAA" x="-1" y="38"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_f3DlYXi_EeWLz9_fOdUDAA" type="6017">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_h1r_0HjAEeWLz9_fOdUDAA" source="PapyrusCSSForceValue">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_h1r_0XjAEeWLz9_fOdUDAA" key="visible" value="true"/>
+ </eAnnotations>
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_ekmCgHjAEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_f3DlYni_EeWLz9_fOdUDAA" x="-1" y="14"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_f3C-UXi_EeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:Usage" href="dropless.uml#_f3AiEHi_EeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_f3C-Uni_EeWLz9_fOdUDAA" points="[265, 105, -643984, -643984]$[182, 102, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_f3V5QHi_EeWLz9_fOdUDAA" id="(1.0,0.5147058823529411)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_f3V5QXi_EeWLz9_fOdUDAA" id="(0.0,0.5230769230769231)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="__uyL8Hi_EeWLz9_fOdUDAA" type="4002" source="_7maoYHi_EeWLz9_fOdUDAA" target="_aHMfkHi_EeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="__uyzAHi_EeWLz9_fOdUDAA" type="6007">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_AMPkAHjAEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__uyzAXi_EeWLz9_fOdUDAA" x="-1" y="38"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="__uyL8Xi_EeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:Generalization" href="dropless.uml#__ureQHi_EeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="__uyL8ni_EeWLz9_fOdUDAA" points="[320, 193, -643984, -643984]$[317, 119, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="__u_nUHi_EeWLz9_fOdUDAA" id="(0.5,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="__u_nUXi_EeWLz9_fOdUDAA" id="(0.52,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_HZzW4HjAEeWLz9_fOdUDAA" type="4003" source="_7maoYHi_EeWLz9_fOdUDAA" target="_FKPvEHjAEeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_HZzW43jAEeWLz9_fOdUDAA" type="6008">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_ek6yoHjAEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_HZzW5HjAEeWLz9_fOdUDAA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_HZzW5XjAEeWLz9_fOdUDAA" type="6009">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_elCucHjAEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_HZzW5njAEeWLz9_fOdUDAA" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_HZzW4XjAEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:InterfaceRealization" href="dropless.uml#_HZrbEHjAEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HZzW4njAEeWLz9_fOdUDAA" points="[269, 218, -643984, -643984]$[188, 218, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HaG44HjAEeWLz9_fOdUDAA" id="(1.0,0.24)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HaG44XjAEeWLz9_fOdUDAA" id="(0.0,0.17985611510791366)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_If41MHjAEeWLz9_fOdUDAA" type="4002" source="_FKPvEHjAEeWLz9_fOdUDAA" target="_aG0sIHi_EeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_If41M3jAEeWLz9_fOdUDAA" type="6007">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_ekt-UHjAEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_If41NHjAEeWLz9_fOdUDAA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_If41MXjAEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:Generalization" href="dropless.uml#_IfyukHjAEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_If41MnjAEeWLz9_fOdUDAA" points="[558, 192, -643984, -643984]$[529, 115, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_IgGQkHjAEeWLz9_fOdUDAA" id="(0.25336927223719674,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_IgGQkXjAEeWLz9_fOdUDAA" id="(0.59,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_kTiiUHjAEeWLz9_fOdUDAA" type="4007" source="_b7Is8HjAEeWLz9_fOdUDAA" target="_7maoYHi_EeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_kTiiU3jAEeWLz9_fOdUDAA" type="6016">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_DHSRcHjDEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kTiiVHjAEeWLz9_fOdUDAA" y="40"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kTiiVXjAEeWLz9_fOdUDAA" type="6017">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_DHaNQHjDEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kTiiVnjAEeWLz9_fOdUDAA" x="-4" y="12"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_kTiiUXjAEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:Usage" href="dropless.uml#_kTgtIHjAEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kTiiUnjAEeWLz9_fOdUDAA" points="[175, 276, -643984, -643984]$[285, 264, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kT3ScHjAEeWLz9_fOdUDAA" id="(1.0,0.34)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kT3ScXjAEeWLz9_fOdUDAA" id="(0.0,0.35)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_wGJ_UHjBEeWLz9_fOdUDAA" type="4002" source="_b7Is8HjAEeWLz9_fOdUDAA" target="_QxhUMHjAEeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_wGKmYHjBEeWLz9_fOdUDAA" type="6007">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_DHiwIHjDEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_wGKmYXjBEeWLz9_fOdUDAA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_wGJ_UXjBEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:Generalization" href="dropless.uml#_wGCDgHjBEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_wGJ_UnjBEeWLz9_fOdUDAA" points="[175, 195, -643984, -643984]$[176, 118, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wGaeAHjBEeWLz9_fOdUDAA" id="(0.5102040816326531,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wGbFEHjBEeWLz9_fOdUDAA" id="(0.4785714285714286,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_0fJG4HjDEeWLz9_fOdUDAA" type="4003" source="_hvE6IHjDEeWLz9_fOdUDAA" target="_FKPvEHjAEeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_0fJG43jDEeWLz9_fOdUDAA" type="6008">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_CNyKkHzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0fJt8HjDEeWLz9_fOdUDAA" x="1" y="38"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0fJt8XjDEeWLz9_fOdUDAA" type="6009">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_CN--4HzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0fJt8njDEeWLz9_fOdUDAA" y="59"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_0fJG4XjDEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:InterfaceRealization" href="dropless.uml#_0e-HwHjDEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_0fJG4njDEeWLz9_fOdUDAA" points="[314, 459, -643984, -643984]$[472, 332, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_0fjWkHjDEeWLz9_fOdUDAA" id="(0.8571428571428571,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_0fjWkXjDEeWLz9_fOdUDAA" id="(0.04043126684636118,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_1ZlV4HjDEeWLz9_fOdUDAA" type="4003" source="_hvd7sHjDEeWLz9_fOdUDAA" target="_FKPvEHjAEeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_1ZlV43jDEeWLz9_fOdUDAA" type="6008">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_COLMIHzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_1Zl88HjDEeWLz9_fOdUDAA" y="39"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_1Zl88XjDEeWLz9_fOdUDAA" type="6009">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_COWyUHzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_1Zl88njDEeWLz9_fOdUDAA" y="58"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_1ZlV4XjDEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:InterfaceRealization" href="dropless.uml#_1ZaWwHjDEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_1ZlV4njDEeWLz9_fOdUDAA" points="[483, 462, -643984, -643984]$[519, 332, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_1Z-XcHjDEeWLz9_fOdUDAA" id="(0.6746031746031746,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_1Z-XcXjDEeWLz9_fOdUDAA" id="(0.1752021563342318,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_2DLsgHjDEeWLz9_fOdUDAA" type="4003" source="_hv3kUHjDEeWLz9_fOdUDAA" target="_FKPvEHjAEeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_2DLsg3jDEeWLz9_fOdUDAA" type="6008">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_COi_kHzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2DMTkHjDEeWLz9_fOdUDAA" y="39"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2DMTkXjDEeWLz9_fOdUDAA" type="6009">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_COwa8HzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2DMTknjDEeWLz9_fOdUDAA" x="1" y="59"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_2DLsgXjDEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:InterfaceRealization" href="dropless.uml#_2DAGUHjDEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2DLsgnjDEeWLz9_fOdUDAA" points="[579, 427, -643984, -643984]$[578, 332, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2Djf8HjDEeWLz9_fOdUDAA" id="(0.36507936507936506,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2Djf8XjDEeWLz9_fOdUDAA" id="(0.3423180592991914,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_26BN4HjDEeWLz9_fOdUDAA" type="4003" source="_hwTCIHjDEeWLz9_fOdUDAA" target="_FKPvEHjAEeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_26BN43jDEeWLz9_fOdUDAA" type="6008">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_CO8oMHzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_26BN5HjDEeWLz9_fOdUDAA" x="-1" y="38"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_26BN5XjDEeWLz9_fOdUDAA" type="6009">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_CPI1cHzJEeW-84Rud4Kaxg" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_26BN5njDEeWLz9_fOdUDAA" x="-34" y="-92"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_26BN4XjDEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:InterfaceRealization" href="dropless.uml#_250ZkHjDEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_26BN4njDEeWLz9_fOdUDAA" points="[797, 425, -643984, -643984]$[731, 332, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_26cEoHjDEeWLz9_fOdUDAA" id="(0.3492063492063492,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_26cEoXjDEeWLz9_fOdUDAA" id="(0.7789757412398922,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_JRR5EHjEEeWLz9_fOdUDAA" type="4013" source="_7kqYEHjDEeWLz9_fOdUDAA" target="_hvd7sHjDEeWLz9_fOdUDAA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_JRR5EXjEEeWLz9_fOdUDAA"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_JRR5EnjEEeWLz9_fOdUDAA" points="[487, 532, -643984, -643984]$[460, 498, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_JRwaMHjEEeWLz9_fOdUDAA" id="(0.25506024096385543,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_JRwaMXjEEeWLz9_fOdUDAA" id="(0.8211895199847006,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_JtwZsHjEEeWLz9_fOdUDAA" type="4013" source="_7kqYEHjDEeWLz9_fOdUDAA" target="_hv3kUHjDEeWLz9_fOdUDAA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_JtwZsXjEEeWLz9_fOdUDAA"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_JtwZsnjEEeWLz9_fOdUDAA" points="[507, 532, -643984, -643984]$[545, 498, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_JuGX8HjEEeWLz9_fOdUDAA" id="(0.69,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_JuGX8XjEEeWLz9_fOdUDAA" id="(0.0960591133004928,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_KMPFcHjEEeWLz9_fOdUDAA" type="4013" source="_7kqYEHjDEeWLz9_fOdUDAA" target="_hvE6IHjDEeWLz9_fOdUDAA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_KMPFcXjEEeWLz9_fOdUDAA"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_KMPFcnjEEeWLz9_fOdUDAA" points="[509, 532, -643984, -643984]$[314, 474, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_KMkcoHjEEeWLz9_fOdUDAA" id="(0.0,0.43333333333333335)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_KMkcoXjEEeWLz9_fOdUDAA" id="(1.0,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Kmjp8HjEEeWLz9_fOdUDAA" type="4013" source="_7kqYEHjDEeWLz9_fOdUDAA" target="_hwTCIHjDEeWLz9_fOdUDAA">
+ <styles xmi:type="notation:FontStyle" xmi:id="_Kmjp8XjEEeWLz9_fOdUDAA"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Kmjp8njEEeWLz9_fOdUDAA" points="[507, 532, -643984, -643984]$[753, 490, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Km6PQHjEEeWLz9_fOdUDAA" id="(1.0,0.3333333333333333)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Km6PQXjEEeWLz9_fOdUDAA" id="(0.0,0.9275653923541244)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_6bO7wHjMEeWLz9_fOdUDAA" type="PapyrusUMLClassDiagram" name="gmfgenextension" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_-Sh9cHjMEeWLz9_fOdUDAA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-SikgHjMEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-SikgXjMEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-SikgnjMEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_-SjLkHjMEeWLz9_fOdUDAA" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_v4mOAHjNEeWLz9_fOdUDAA" type="3012">
+ <element xmi:type="uml:Property" href="dropless.uml#_v4gucHjNEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_v4mOAXjNEeWLz9_fOdUDAA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_-SjLkXjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_-SjLknjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_-SjLk3jMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-SjLlHjMEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_-SjLlXjMEeWLz9_fOdUDAA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_-SjLlnjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_-SjLl3jMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_-SjLmHjMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-SjLmXjMEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_-SjLmnjMEeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_-SjLm3jMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_-SjLnHjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_-SjLnXjMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-SjLnnjMEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#_-SgIQHjMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-Sh9cXjMEeWLz9_fOdUDAA" x="258" y="97" height="75"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__o5TcHjMEeWLz9_fOdUDAA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="__o5TcnjMEeWLz9_fOdUDAA" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="__o5Tc3jMEeWLz9_fOdUDAA" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__o5TdHjMEeWLz9_fOdUDAA" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__o5TdXjMEeWLz9_fOdUDAA" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_5r5UEHjNEeWLz9_fOdUDAA" type="3012">
+ <element xmi:type="uml:Property" href="dropless.uml#_5r0bkHjNEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5r5UEXjNEeWLz9_fOdUDAA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="__o5TdnjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__o5Td3jMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__o5TeHjMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__o5TeXjMEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__o5TenjMEeWLz9_fOdUDAA" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_CmbmIHjOEeWLz9_fOdUDAA" type="3013">
+ <element xmi:type="uml:Operation" href="dropless.uml#_CmWtoHjOEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CmbmIXjOEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_PqpqYHjOEeWLz9_fOdUDAA" type="3013">
+ <element xmi:type="uml:Operation" href="dropless.uml#_MF4jIHjOEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PqpqYXjOEeWLz9_fOdUDAA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="__o5Te3jMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__o5TfHjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__o5TfXjMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__o5TfnjMEeWLz9_fOdUDAA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__o5Tf3jMEeWLz9_fOdUDAA" visible="false" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__o5TgHjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__o5TgXjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__o5TgnjMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__o5Tg3jMEeWLz9_fOdUDAA"/>
+ </children>
+ <element xmi:type="uml:Class" href="dropless.uml#__o4sYHjMEeWLz9_fOdUDAA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__o5TcXjMEeWLz9_fOdUDAA" x="195" y="255" height="92"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_6bO7wXjMEeWLz9_fOdUDAA" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_6bO7wnjMEeWLz9_fOdUDAA"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_6bO7w3jMEeWLz9_fOdUDAA">
+ <owner xmi:type="uml:Package" href="dropless.uml#_3mb44HjMEeWLz9_fOdUDAA"/>
+ </styles>
+ <element xmi:type="uml:Package" href="dropless.uml#_3mb44HjMEeWLz9_fOdUDAA"/>
+ <edges xmi:type="notation:Connector" xmi:id="_SEczUHjOEeWLz9_fOdUDAA" type="4002" source="__o5TcHjMEeWLz9_fOdUDAA" target="_-Sh9cHjMEeWLz9_fOdUDAA">
+ <children xmi:type="notation:DecorationNode" xmi:id="_SEczU3jOEeWLz9_fOdUDAA" type="6007">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_ZuvlgHjOEeWLz9_fOdUDAA" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_SEczVHjOEeWLz9_fOdUDAA" x="1" y="39"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_SEczUXjOEeWLz9_fOdUDAA"/>
+ <element xmi:type="uml:Generalization" href="dropless.uml#_SEZI8HjOEeWLz9_fOdUDAA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_SEczUnjOEeWLz9_fOdUDAA" points="[240, 255, -643984, -643984]$[400, 169, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_SEl9QHjOEeWLz9_fOdUDAA" id="(0.46153846153846156,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_SEl9QXjOEeWLz9_fOdUDAA" id="(0.5034013605442177,1.0)"/>
+ </edges>
+ </notation:Diagram>
+</xmi:XMI>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.uml b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.uml
new file mode 100644
index 00000000000..dab6e92df91
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/dropless.uml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_IElOsHi_EeWLz9_fOdUDAA" name="dropless">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_7kpJ8HjDEeWLz9_fOdUDAA" annotatedElement="_YNzYMXjDEeWLz9_fOdUDAA _YqWxUXjDEeWLz9_fOdUDAA _VVaOwHjDEeWLz9_fOdUDAA _Yxmo0XjDEeWLz9_fOdUDAA">
+ <body>generated</body>
+ </ownedComment>
+ <packageImport xmi:type="uml:PackageImport" xmi:id="_kZUIQHjCEeWLz9_fOdUDAA">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/JavaPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:type="uml:PackageImport" xmi:id="_1fAc4HjNEeWLz9_fOdUDAA">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:type="uml:PackageImport" xmi:id="_1qJD0HzIEeW-84Rud4Kaxg">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Package" xmi:id="_MkUJYHi_EeWLz9_fOdUDAA" name="gmf">
+ <packagedElement xmi:type="uml:Interface" xmi:id="_SiEhQHi_EeWLz9_fOdUDAA" name="IProvider"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_U3PB0Hi_EeWLz9_fOdUDAA" name="Service"/>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_f3AiEHi_EeWLz9_fOdUDAA" client="_U3PB0Hi_EeWLz9_fOdUDAA" supplier="_SiEhQHi_EeWLz9_fOdUDAA"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_PomkUHjAEeWLz9_fOdUDAA" name="CanonicalEditPolicy"/>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_4F7SQHjBEeWLz9_fOdUDAA" name="Diagram"/>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_JEwK4HjCEeWLz9_fOdUDAA" name="IElementType"/>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_YwlxoHjCEeWLz9_fOdUDAA" name="View"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_7mYzMHi_EeWLz9_fOdUDAA" name="VisualTypeService">
+ <generalization xmi:type="uml:Generalization" xmi:id="__ureQHi_EeWLz9_fOdUDAA" general="_U3PB0Hi_EeWLz9_fOdUDAA"/>
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_HZrbEHjAEeWLz9_fOdUDAA" client="_7mYzMHi_EeWLz9_fOdUDAA" supplier="_FKN54HjAEeWLz9_fOdUDAA" contract="_FKN54HjAEeWLz9_fOdUDAA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Interface" xmi:id="_FKN54HjAEeWLz9_fOdUDAA" name="IVisualTypeProvider">
+ <generalization xmi:type="uml:Generalization" xmi:id="_IfyukHjAEeWLz9_fOdUDAA" general="_SiEhQHi_EeWLz9_fOdUDAA"/>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_Kq_I4HjCEeWLz9_fOdUDAA" name="getNodeType" visibility="public">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_cVn-oHjCEeWLz9_fOdUDAA" name="view" type="_YwlxoHjCEeWLz9_fOdUDAA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_gaZboHjCEeWLz9_fOdUDAA" name="element" type="_8_dNAHjBEeWLz9_fOdUDAA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_pMkb4HjCEeWLz9_fOdUDAA" direction="return">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_NDPZsHjCEeWLz9_fOdUDAA" name="getLinkType">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_xhW8kHjCEeWLz9_fOdUDAA" name="diagram" type="_4F7SQHjBEeWLz9_fOdUDAA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_0COW0HjCEeWLz9_fOdUDAA" name="element" type="_8_dNAHjBEeWLz9_fOdUDAA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_2jXd4HjCEeWLz9_fOdUDAA" direction="return">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_N6yswHjCEeWLz9_fOdUDAA" name="getElementType">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_7a2KMHjCEeWLz9_fOdUDAA" name="diagram" type="_4F7SQHjBEeWLz9_fOdUDAA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_9Y-q0HjCEeWLz9_fOdUDAA" name="viewType" effect="read">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_BU678HjDEeWLz9_fOdUDAA" type="_JEwK4HjCEeWLz9_fOdUDAA" direction="return" effect="read"/>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_b7He0HjAEeWLz9_fOdUDAA" name="PapyrusCanonicalEditPolicy">
+ <generalization xmi:type="uml:Generalization" xmi:id="_wGCDgHjBEeWLz9_fOdUDAA" general="_PomkUHjAEeWLz9_fOdUDAA"/>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_JgvG0HjDEeWLz9_fOdUDAA" name="refreshSemantic" visibility="protected"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Usage" xmi:id="_kTgtIHjAEeWLz9_fOdUDAA" client="_b7He0HjAEeWLz9_fOdUDAA" supplier="_7mYzMHi_EeWLz9_fOdUDAA"/>
+ <packagedElement xmi:type="uml:Package" xmi:id="_5mrTUHjBEeWLz9_fOdUDAA" name="ecore">
+ <packagedElement xmi:type="uml:Interface" xmi:id="_8_dNAHjBEeWLz9_fOdUDAA" name="EObject"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_RDo3kHjDEeWLz9_fOdUDAA" name="uml.diagram.clazz">
+ <packagedElement xmi:type="uml:Class" xmi:id="_VVaOwHjDEeWLz9_fOdUDAA" name="UMLVisualTypeProvider">
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_0e-HwHjDEeWLz9_fOdUDAA" client="_VVaOwHjDEeWLz9_fOdUDAA" supplier="_FKN54HjAEeWLz9_fOdUDAA" contract="_FKN54HjAEeWLz9_fOdUDAA"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_YNzYMHjDEeWLz9_fOdUDAA" name="uml.diagram.composite">
+ <packagedElement xmi:type="uml:Class" xmi:id="_YNzYMXjDEeWLz9_fOdUDAA" name="UMLVisualTypeProvider">
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_1ZaWwHjDEeWLz9_fOdUDAA" client="_YNzYMXjDEeWLz9_fOdUDAA" supplier="_FKN54HjAEeWLz9_fOdUDAA" contract="_FKN54HjAEeWLz9_fOdUDAA"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_YqWxUHjDEeWLz9_fOdUDAA" name="uml.diagram.activity">
+ <packagedElement xmi:type="uml:Class" xmi:id="_YqWxUXjDEeWLz9_fOdUDAA" name="UMLVisualTypeProvider">
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_2DAGUHjDEeWLz9_fOdUDAA" client="_YqWxUXjDEeWLz9_fOdUDAA" supplier="_FKN54HjAEeWLz9_fOdUDAA" contract="_FKN54HjAEeWLz9_fOdUDAA"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_Yxmo0HjDEeWLz9_fOdUDAA" name="uml.diagram.usecase">
+ <packagedElement xmi:type="uml:Class" xmi:id="_Yxmo0XjDEeWLz9_fOdUDAA" name="UMLVisualTypeProvider">
+ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="_250ZkHjDEeWLz9_fOdUDAA" name="• • •" client="_Yxmo0XjDEeWLz9_fOdUDAA" supplier="_FKN54HjAEeWLz9_fOdUDAA" contract="_FKN54HjAEeWLz9_fOdUDAA"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Package" xmi:id="_3mb44HjMEeWLz9_fOdUDAA" name="gmfgenextension">
+ <packagedElement xmi:type="uml:Class" xmi:id="_-SgIQHjMEeWLz9_fOdUDAA" name="CommentedElement">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_v4gucHjNEeWLz9_fOdUDAA" name="comment">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_YbtQUHjOEeWLz9_fOdUDAA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_YbwToHjOEeWLz9_fOdUDAA" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="__o4sYHjMEeWLz9_fOdUDAA" name="GenVisualTypeProvider">
+ <generalization xmi:type="uml:Generalization" xmi:id="_SEZI8HjOEeWLz9_fOdUDAA" general="_-SgIQHjMEeWLz9_fOdUDAA"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_5r0bkHjNEeWLz9_fOdUDAA" name="className">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_2-onIHjOEeWLz9_fOdUDAA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_2-p1QHjOEeWLz9_fOdUDAA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_e5fMEHjOEeWLz9_fOdUDAA" value="UMLVisualTypeProvider"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_CmWtoHjOEeWLz9_fOdUDAA" name="getClassName" isStatic="true" isQuery="true">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_G0hXMHjOEeWLz9_fOdUDAA" name="diagram" type="_Aj2DUHjOEeWLz9_fOdUDAA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_JcVG8HjOEeWLz9_fOdUDAA" direction="return">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_MF4jIHjOEeWLz9_fOdUDAA" name="getQualifiedClassName" isStatic="true" isQuery="true">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_MF4jIXjOEeWLz9_fOdUDAA" name="diagram" type="_Aj2DUHjOEeWLz9_fOdUDAA" effect="read"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_MF4jInjOEeWLz9_fOdUDAA" direction="return">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_Aj2DUHjOEeWLz9_fOdUDAA" name="GenDiagram"/>
+ </packagedElement>
+</uml:Model>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/gmfgenextension.jpg b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/gmfgenextension.jpg
new file mode 100644
index 00000000000..199e205e29e
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/gmfgenextension.jpg
Binary files differ
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/main.jpg b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/main.jpg
new file mode 100644
index 00000000000..2c58936dedc
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/doc/neon/images/main.jpg
Binary files differ
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/schema/strategies.exsd b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/schema/strategies.exsd
index 7965c815fbd..8a1ea71f990 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/schema/strategies.exsd
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/schema/strategies.exsd
@@ -144,9 +144,14 @@ The nested &amp;lt;enablement&amp;gt; expression, if specified, is used to match
<element name="creationTargetStrategy">
<annotation>
+ <appinfo>
+ <meta.element deprecated="true"/>
+ </appinfo>
<documentation>
- An extension that provides an alternative target edit part to which requests should be sent for canonical creation of child views.
+ As of Neon, this strategy is no longer needed because the PapyrusCanonicalEditPolicy no longer uses the drag-and-drop infrastructure to create views of existing elements in the diagram.
&lt;p&gt;
+An extension that provides an alternative target edit part to which requests should be sent for canonical creation of child views.
+&lt;/p&gt;&lt;p&gt;
The nested &amp;lt;enablement&amp;gt; expression, if specified, is used to match edit parts that the strategy supports. The expression has three variables available to it:
&lt;/p&gt;
&lt;table border=&quot;1&quot; align=&quot;center&quot;&gt;
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/editpolicy/PapyrusCanonicalEditPolicy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/editpolicy/PapyrusCanonicalEditPolicy.java
index 7150fb0b5b6..a5ef24c7b5d 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/editpolicy/PapyrusCanonicalEditPolicy.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/editpolicy/PapyrusCanonicalEditPolicy.java
@@ -12,6 +12,7 @@
* Christian W. Damus - bug 420549
* Christian W. Damus - bug 472155
* Christian W. Damus - bug 471954
+ * Christian W. Damus - bug 477384
*
*****************************************************************************/
package org.eclipse.papyrus.infra.gmfdiag.canonical.editpolicy;
@@ -42,13 +43,15 @@ import org.eclipse.gmf.runtime.diagram.ui.editparts.ListCompartmentEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.TopGraphicEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor;
-import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.notation.CanonicalStyle;
import org.eclipse.gmf.runtime.notation.Connector;
import org.eclipse.gmf.runtime.notation.DecorationNode;
+import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.Sorting;
import org.eclipse.gmf.runtime.notation.SortingStyle;
@@ -56,20 +59,20 @@ import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.commands.util.CommandTreeIterator;
import org.eclipse.papyrus.commands.wrappers.EMFtoGEFCommandWrapper;
import org.eclipse.papyrus.commands.wrappers.GEFCommandWrapper;
-import org.eclipse.papyrus.infra.core.utils.AdapterUtils;
import org.eclipse.papyrus.infra.gmfdiag.canonical.internal.Activator;
-import org.eclipse.papyrus.infra.gmfdiag.canonical.strategy.ICreationTargetStrategy;
import org.eclipse.papyrus.infra.gmfdiag.canonical.strategy.ISemanticChildrenStrategy;
import org.eclipse.papyrus.infra.gmfdiag.canonical.strategy.IVisualChildrenStrategy;
import org.eclipse.papyrus.infra.gmfdiag.canonical.strategy.SemanticChildrenStrategyRegistry;
-import org.eclipse.papyrus.infra.gmfdiag.common.commands.requests.CanonicalDropObjectsRequest;
+import org.eclipse.papyrus.infra.gmfdiag.common.commands.SemanticElementAdapter;
import org.eclipse.papyrus.infra.gmfdiag.common.commands.requests.RollingDeferredArrangeRequest;
import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.EdgeWithNoSemanticElementRepresentationImpl;
import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.IPapyrusCanonicalEditPolicy;
import org.eclipse.papyrus.infra.gmfdiag.common.helper.DiagramHelper;
+import org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype.VisualTypeService;
+import org.eclipse.papyrus.infra.gmfdiag.common.utils.DiagramEditPartsUtil;
+import org.eclipse.papyrus.infra.tools.util.PlatformHelper;
import com.google.common.base.Function;
-import com.google.common.base.Optional;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
@@ -108,7 +111,9 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
};
private ISemanticChildrenStrategy semanticChildrenStrategy = null;
- private ICreationTargetStrategy creationTargetStrategy;
+
+ @SuppressWarnings("deprecation")
+ private org.eclipse.papyrus.infra.gmfdiag.canonical.strategy.ICreationTargetStrategy creationTargetStrategy;
private Collection<? extends EObject> dependents = null;
@@ -119,12 +124,15 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
private boolean overrideEnabled;
+ private ChildrenKindStack currentChildrenKind;
+
+ @SuppressWarnings("deprecation")
@Override
public final void activate() {
if (host().getNotationView() != null) {
final SemanticChildrenStrategyRegistry reg = SemanticChildrenStrategyRegistry.getInstance();
semanticChildrenStrategy = reg.getSemanticChildrenStrategy(getHost());
- creationTargetStrategy = ICreationTargetStrategy.Safe.safe(reg.getCreationTargetStrategy(getHost()));
+ creationTargetStrategy = org.eclipse.papyrus.infra.gmfdiag.canonical.strategy.ICreationTargetStrategy.Safe.safe(reg.getCreationTargetStrategy(getHost()));
hookCanonicalStateListener();
if (isEnabled()) {
@@ -532,7 +540,12 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
List<IAdaptable> createdViews = Collections.emptyList();
if (isInState(State.ACTIVE)) {
if (!semanticChildren.isEmpty()) {
- createdViews = createViews(semanticChildren);
+ pushChildrenKind(kind);
+ try {
+ createdViews = createViews(semanticChildren);
+ } finally {
+ popChildrenKind();
+ }
}
if (isManagedListCompartment()) {
@@ -551,6 +564,18 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
return createdViews;
}
+ private void pushChildrenKind(ChildrenKind kind) {
+ currentChildrenKind = new ChildrenKindStack(kind);
+ }
+
+ private void popChildrenKind() {
+ currentChildrenKind = currentChildrenKind.parent();
+ }
+
+ protected final ChildrenKind currentChildrenKind() {
+ return (currentChildrenKind == null) ? null : currentChildrenKind.kind();
+ }
+
@Override
protected boolean isOrphaned(Collection<EObject> semanticChildren, View view) {
if (super.isOrphaned(semanticChildren, view)) {
@@ -602,13 +627,64 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
}
@Override
+ protected ViewDescriptor getViewDescriptor(EObject element) {
+ ViewDescriptor result;
+ boolean isEdge = false;
+
+ // Consult the visual type service to get the appropriate
+ IGraphicalEditPart parentPart = host();
+ IGraphicalEditPart sourcePart = null;
+ IGraphicalEditPart targetPart = null;
+
+ // Look for a node to create
+ String viewType;
+
+ switch (currentChildrenKind()) {
+ case NODE:
+ viewType = VisualTypeService.getInstance().getNodeType(parentPart.getNotationView(), element);
+ break;
+ case CONNECTION:
+ isEdge = true;
+ parentPart = DiagramEditPartsUtil.getDiagramEditPart(host());
+ viewType = VisualTypeService.getInstance().getLinkType(host().getNotationView().getDiagram(), element);
+ if (viewType != null) {
+ // Identify the source and target
+ sourcePart = semanticChildrenStrategy.resolveSourceEditPart(element, host());
+ targetPart = semanticChildrenStrategy.resolveTargetEditPart(element, host());
+ }
+ break;
+ default:
+ viewType = null;
+ break;
+ }
+
+ if ((viewType != null) && (!isEdge || ((sourcePart != null) && (targetPart != null)))) {
+ IAdaptable elementAdapter = new SemanticElementAdapter(
+ element,
+ VisualTypeService.getInstance().getElementType(
+ host().getNotationView().getDiagram(),
+ viewType));
+
+ int pos = getViewIndexFor(element);
+ result = isEdge
+ ? new ChildConnectionDescriptor(elementAdapter, viewType, pos, sourcePart, targetPart)
+ : new ChildNodeDescriptor(elementAdapter, viewType, pos, parentPart);
+ } else {
+ // i.e., return a view descriptor that is certain not to result in an useful command
+ result = super.getViewDescriptor(element);
+ }
+
+ return result;
+ }
+
+ @Override
protected Command getCreateViewCommand(CreateRequest request) {
Command result;
if (!(request instanceof CreateViewRequest)) {
result = super.getCreateViewCommand(request);
} else {
- // Transform the request to a drop request serviced by the canonical drop policy
+ // Obtain the view creation commands and decorate them
CreateViewRequest createViewRequest = (CreateViewRequest) request;
Iterable<? extends ViewDescriptor> descriptors = createViewRequest.getViewDescriptors();
@@ -617,13 +693,33 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
EObject element = viewDescriptor.getElementAdapter().getAdapter(EObject.class);
if (element != null) {
- List<EObject> elementToDrop = Collections.singletonList(element);
- DropObjectsRequest dropRequest = new DropObjectsRequest();
- dropRequest.setObjects(elementToDrop);
- dropRequest.setLocation(createViewRequest.getLocation());
- CanonicalDropObjectsRequest canonicalRequest = new CanonicalDropObjectsRequest(dropRequest);
+ CreateRequest newRequest = createCreateRequest(viewDescriptor);
+ Command cmd;
+
+ if (newRequest instanceof CreateConnectionViewRequest) {
+ // Connection case
+ EditPart sourceEditPart = ((CreateConnectionViewRequest) newRequest).getSourceEditPart();
+ EditPart targetEditPart = ((CreateConnectionViewRequest) newRequest).getTargetEditPart();
+
+ // Initialize the command
+ newRequest.setType(RequestConstants.REQ_CONNECTION_START);
+ sourceEditPart.getCommand(newRequest);
+ newRequest.setType(RequestConstants.REQ_CONNECTION_END);
+
+ // Get the command
+ cmd = targetEditPart.getCommand(newRequest);
+ } else {
+ // Node case
+ EditPart parentEditPart = (viewDescriptor instanceof ChildNodeDescriptor)
+ ? ((ChildNodeDescriptor) viewDescriptor).getParentEditPart()
+ : host();
+
+ @SuppressWarnings("deprecation")
+ EditPart targetEditPart = creationTargetStrategy.getTargetEditPart(parentEditPart, element);
+
+ cmd = targetEditPart.getCommand(newRequest);
+ }
- Command cmd = creationTargetStrategy.getTargetEditPart(getHost(), element).getCommand(canonicalRequest);
if ((cmd != null) && cmd.canExecute()) {
compoundCommand.add(cmd);
}
@@ -639,6 +735,27 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
return result;
}
+ protected CreateRequest createCreateRequest(ViewDescriptor viewDescriptor) {
+ CreateRequest result;
+
+ if (viewDescriptor instanceof CreateConnectionViewRequest.ConnectionViewDescriptor) {
+ CreateConnectionViewRequest.ConnectionViewDescriptor cvd = (CreateConnectionViewRequest.ConnectionViewDescriptor) viewDescriptor;
+ CreateConnectionViewRequest ccvr = new CreateConnectionViewRequest(cvd);
+
+ if (cvd instanceof ChildConnectionDescriptor) {
+ ChildConnectionDescriptor ccd = (ChildConnectionDescriptor) cvd;
+ ccvr.setSourceEditPart(ccd.getSourceEditPart());
+ ccvr.setTargetEditPart(ccd.getTargetEditPart());
+ }
+
+ result = ccvr;
+ } else {
+ result = new CreateViewRequest(viewDescriptor);
+ }
+
+ return result;
+ }
+
@Override
protected List<View> getViewChildren() {
List<View> result = getViewChildren(ChildrenKind.NODE);
@@ -806,6 +923,26 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
NODE, CONNECTION;
}
+ private final class ChildrenKindStack {
+ private final ChildrenKind kind;
+ private final ChildrenKindStack parent;
+
+ ChildrenKindStack(ChildrenKind kind) {
+ super();
+
+ this.kind = kind;
+ this.parent = currentChildrenKind;
+ }
+
+ ChildrenKind kind() {
+ return kind;
+ }
+
+ ChildrenKindStack parent() {
+ return parent;
+ }
+ }
+
protected static abstract class PostCreationWrapperCommand<A> extends GEFCommandWrapper {
public PostCreationWrapperCommand(Command command) {
super(command);
@@ -845,9 +982,9 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
}
protected void postProcessView(Object viewish, A accumulator) {
- Optional<View> view = AdapterUtils.adapt(viewish, View.class);
- if (view.isPresent()) {
- postProcessView(view.get(), accumulator);
+ View view = PlatformHelper.getAdapter(viewish, View.class);
+ if (view != null) {
+ postProcessView(view, accumulator);
}
}
@@ -855,4 +992,40 @@ public class PapyrusCanonicalEditPolicy extends CanonicalEditPolicy implements I
// Pass
}
}
+
+ private class ChildNodeDescriptor extends CreateViewRequest.ViewDescriptor {
+
+ private final EditPart parentEditPart;
+
+ public ChildNodeDescriptor(IAdaptable elementAdapter, String factoryHint, int index, EditPart parentEditPart) {
+ super(elementAdapter, Node.class, factoryHint, index, host().getDiagramPreferencesHint());
+
+ this.parentEditPart = parentEditPart;
+ }
+
+ EditPart getParentEditPart() {
+ return parentEditPart;
+ }
+ }
+
+ private class ChildConnectionDescriptor extends CreateConnectionViewRequest.ConnectionViewDescriptor {
+
+ private final EditPart sourceEditPart;
+ private final EditPart targetEditPart;
+
+ public ChildConnectionDescriptor(IAdaptable elementAdapter, String factoryHint, int index, EditPart sourceEditPart, EditPart targetEditPart) {
+ super(elementAdapter, factoryHint, index, host().getDiagramPreferencesHint());
+
+ this.sourceEditPart = sourceEditPart;
+ this.targetEditPart = targetEditPart;
+ }
+
+ EditPart getSourceEditPart() {
+ return sourceEditPart;
+ }
+
+ EditPart getTargetEditPart() {
+ return targetEditPart;
+ }
+ }
}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/CreationTargetStrategyRegistration.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/CreationTargetStrategyRegistration.java
index 0688a69c684..afb6918c615 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/CreationTargetStrategyRegistration.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/CreationTargetStrategyRegistration.java
@@ -14,11 +14,16 @@ package org.eclipse.papyrus.infra.gmfdiag.canonical.strategy;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.papyrus.infra.gmfdiag.canonical.editpolicy.PapyrusCanonicalEditPolicy;
/**
* The registration of a creation target strategy.
+ *
+ * @deprecated As of Neon, this strategy is no longer needed because the {@link PapyrusCanonicalEditPolicy}
+ * no longer uses the drag-and-drop infrastructure to create views of existing elements in the diagram.
*/
+@Deprecated
class CreationTargetStrategyRegistration extends Registration<ICreationTargetStrategy, CreationTargetStrategyRegistration> {
CreationTargetStrategyRegistration(IConfigurationElement config) throws CoreException {
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ICreationTargetStrategy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ICreationTargetStrategy.java
index 9a663619aa1..21c4c8efa01 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ICreationTargetStrategy.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ICreationTargetStrategy.java
@@ -16,11 +16,16 @@ package org.eclipse.papyrus.infra.gmfdiag.canonical.strategy;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.papyrus.infra.gmfdiag.canonical.editpolicy.PapyrusCanonicalEditPolicy;
/**
* A pluggable strategy for determining which edit part should be requested to create
* canonical views on behalf of a requesting edit part.
+ *
+ * @deprecated As of Neon, this strategy is no longer needed because the {@link PapyrusCanonicalEditPolicy}
+ * no longer uses the drag-and-drop infrastructure to create views of existing elements in the diagram.
*/
+@Deprecated
public interface ICreationTargetStrategy {
/**
* A creation-target strategy that always returns the requesting host edit-part as the creation target.
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ISemanticChildrenStrategy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ISemanticChildrenStrategy.java
index a1284edd561..78fca957362 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ISemanticChildrenStrategy.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/ISemanticChildrenStrategy.java
@@ -10,6 +10,7 @@
* Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
* Christian W. Damus - bug 433206
* Christian W. Damus - bug 420549
+ * Christian W. Damus - bug 477384
*
*****************************************************************************/
package org.eclipse.papyrus.infra.gmfdiag.canonical.strategy;
@@ -18,9 +19,12 @@ import java.util.Collection;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
import org.eclipse.gmf.runtime.notation.View;
+import com.google.common.collect.Lists;
+
/**
* A pluggable strategy for determination of semantic "children" of an element, those being
* either contained elements, relationships of the element, or other related elements.
@@ -66,4 +70,99 @@ public interface ISemanticChildrenStrategy {
*/
public Collection<? extends EObject> getCanonicalDependents(EObject semanticFromEditPart, View viewFromEditPart);
+ /**
+ * Obtains the source of a semantic connection element. This may either be an
+ * {@link EObject} in the most common straight-forward case, or a
+ * {@link VisuallyNestedElements} in the more complex case of an element whose
+ * visualization is repeated in a nesting structure that qualifies each repeated
+ * occurrence (such as in the case of connected ports on parts in an UML composite
+ * structure diagram).
+ *
+ * @param connectionElement
+ * a semantic connection in the model to be visualized
+ *
+ * @return the connection's source element, or {@code null} if not known
+ */
+ public default Object getSource(EObject connectionElement) {
+ return null;
+ }
+
+ /**
+ * Obtains the target of a semantic connection element. This may either be an
+ * {@link EObject} in the most common straight-forward case, or a
+ * {@link VisuallyNestedElements} in the more complex case of an element whose
+ * visualization is repeated in a nesting structure that qualifies each repeated
+ * occurrence (such as in the case of connected ports on parts in an UML composite
+ * structure diagram).
+ *
+ * @param connectionElement
+ * a semantic connection in the model to be visualized
+ *
+ * @return the connection's target element, or {@code null} if not known
+ */
+ public default Object getTarget(EObject connectionElement) {
+ return null;
+ }
+
+ public default IGraphicalEditPart resolveSourceEditPart(EObject connectionElement, IGraphicalEditPart context) {
+ return VisuallyNestedElementsImpl.resolveEditPart(getSource(connectionElement), context);
+ }
+
+ public default IGraphicalEditPart resolveTargetEditPart(EObject connectionElement, IGraphicalEditPart context) {
+ return VisuallyNestedElementsImpl.resolveEditPart(getTarget(connectionElement), context);
+ }
+
+ public static VisuallyNestedElements createVisualStack(EObject top, EObject nested, EObject... more) {
+ return new VisuallyNestedElementsImpl(Lists.asList(top, nested, more));
+ }
+
+ //
+ // Nested types
+ //
+
+ /**
+ * <p>
+ * In the case that the presentation of a connection end is more complex
+ * than simply a shape, where in fact the connection end may be visualized
+ * multiple times in the diagram and each occurrence is semantically qualified
+ * by the elements that visually contain it (possibly recursively to any
+ * depth), then a {@code VisuallyNestedElements} is supplied to represent
+ * that structure.
+ * </p>
+ * <p>
+ * This interface is a sequence of elements where the first is the most
+ * deeply nested element and the last is the element that is, truly, the
+ * connection end that is nested within all those that precede it in the list.
+ * This is convenient for iterative searching of the diagram for edit-parts
+ * that present the stack of elements.
+ * </p>
+ * <p>
+ * The canonical (pun intended) case is in the UML Composite Structure Diagram,
+ * where a connector may connect a port that is on a part. Any number of parts
+ * (or the composite classifier, itself) may also feature this port, but the
+ * connector end qualifies the port with the featuring part that is actually
+ * connected via that port.
+ * </p>
+ *
+ * @see ISemanticChildrenStrategy#getSource(EObject)
+ * @see ISemanticChildrenStrategy#getTarget(EObject)
+ */
+ interface VisuallyNestedElements extends List<EObject> {
+ /**
+ * Obtains the topmost element of the nesting structure.
+ *
+ * @return the top element
+ */
+ EObject top();
+
+ /**
+ * Obtains the nesting of elements within the {@linkplain #top() top} element,
+ * recursively. The {@code top} of the result is visually presented "within"
+ * my {@code top}.
+ *
+ * @return the elements visually nested with the {@linkplain #top() top} element,
+ * or {@code null} if none (when my {@code top} is, in fact, the deepest nested element)
+ */
+ VisuallyNestedElements nested();
+ }
}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/SemanticChildrenStrategyRegistry.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/SemanticChildrenStrategyRegistry.java
index d694c066b5b..cacb1b8fa24 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/SemanticChildrenStrategyRegistry.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/SemanticChildrenStrategyRegistry.java
@@ -9,6 +9,7 @@
* Contributors:
* Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
* Christian W. Damus - bug 433206
+ * Christian W. Damus - bug 477384
*
*****************************************************************************/
package org.eclipse.papyrus.infra.gmfdiag.canonical.strategy;
@@ -18,6 +19,7 @@ import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.gef.EditPart;
+import org.eclipse.papyrus.infra.gmfdiag.canonical.editpolicy.PapyrusCanonicalEditPolicy;
import org.eclipse.papyrus.infra.gmfdiag.canonical.internal.Activator;
import com.google.common.collect.ArrayListMultimap;
@@ -35,6 +37,7 @@ public class SemanticChildrenStrategyRegistry {
private final List<DefaultSemanticChildrenStrategyRegistration> defaultStrategies;
private final List<VisualChildrenStrategyRegistration> visualChildrenStrategies;
private final Multimap<Class<?>, VisualChildrenStrategyRegistration> visualChildrenStrategiesByEditPart = ArrayListMultimap.create();
+ @SuppressWarnings("deprecation")
private final List<CreationTargetStrategyRegistration> creationTargetStrategies;
private static SemanticChildrenStrategyRegistry INSTANCE = new SemanticChildrenStrategyRegistry();
@@ -48,6 +51,7 @@ public class SemanticChildrenStrategyRegistry {
List<SemanticChildrenStrategyRegistration> strategies = Lists.newArrayList();
List<DefaultSemanticChildrenStrategyRegistration> defaultStrategies = Lists.newArrayListWithExpectedSize(1);
+ @SuppressWarnings("deprecation")
List<CreationTargetStrategyRegistration> creationTargetStrategies = Lists.newArrayList();
List<VisualChildrenStrategyRegistration> visualChildrenStrategies = Lists.newArrayList();
@@ -65,7 +69,9 @@ public class SemanticChildrenStrategyRegistry {
defaultStrategies.add(new DefaultSemanticChildrenStrategyRegistration(config));
break;
case "creationTargetStrategy": //$NON-NLS-1$
- creationTargetStrategies.add(new CreationTargetStrategyRegistration(config));
+ @SuppressWarnings("deprecation")
+ CreationTargetStrategyRegistration creationReg = new CreationTargetStrategyRegistration(config);
+ creationTargetStrategies.add(creationReg);
break;
case "visualChildrenStrategy": //$NON-NLS-1$
visualChildrenStrategies.add(new VisualChildrenStrategyRegistration(config));
@@ -158,7 +164,11 @@ public class SemanticChildrenStrategyRegistry {
* an edit part in a diagram
*
* @return the {@link ICreationTargetStrategy} or {@code null} if no applicable strategy is registered
+ *
+ * @deprecated As of Neon, this strategy is no longer needed because the {@link PapyrusCanonicalEditPolicy}
+ * no longer uses the drag-and-drop infrastructure to create views of existing elements in the diagram.
*/
+ @Deprecated
public ICreationTargetStrategy getCreationTargetStrategy(EditPart editPart) {
return getStrategy(editPart, creationTargetStrategies);
}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/VisuallyNestedElementsImpl.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/VisuallyNestedElementsImpl.java
new file mode 100644
index 00000000000..a9868b96cb3
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.canonical/src/org/eclipse/papyrus/infra/gmfdiag/canonical/strategy/VisuallyNestedElementsImpl.java
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.canonical.strategy;
+
+import java.util.AbstractList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.papyrus.infra.gmfdiag.canonical.strategy.ISemanticChildrenStrategy.VisuallyNestedElements;
+import org.eclipse.papyrus.infra.gmfdiag.common.utils.DiagramEditPartsUtil;
+
+/**
+ * Default implementation of the {@link VisuallyNestedElements} protocol.
+ */
+class VisuallyNestedElementsImpl extends AbstractList<EObject>implements VisuallyNestedElements {
+
+ private final List<EObject> delegate;
+
+ private VisuallyNestedElements nested;
+
+ VisuallyNestedElementsImpl(List<EObject> delegate) {
+ super();
+
+ this.delegate = delegate;
+ }
+
+ @Override
+ public boolean add(EObject e) {
+ throw new UnsupportedOperationException("add"); //$NON-NLS-1$
+ }
+
+ @Override
+ public EObject get(int index) {
+ return delegate.get(index);
+ }
+
+ @Override
+ public EObject set(int index, EObject element) {
+ throw new UnsupportedOperationException("set"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void add(int index, EObject element) {
+ throw new UnsupportedOperationException("add"); //$NON-NLS-1$
+ }
+
+ @Override
+ public EObject remove(int index) {
+ throw new UnsupportedOperationException("remove"); //$NON-NLS-1$
+ }
+
+ @Override
+ public int size() {
+ return delegate.size();
+ }
+
+ @Override
+ public EObject top() {
+ return get(0);
+ }
+
+ @Override
+ public VisuallyNestedElements nested() {
+ if ((nested == null) && (size() > 1)) {
+ nested = new VisuallyNestedElementsImpl(delegate.subList(1, size()));
+ }
+
+ return nested;
+ }
+
+ static IGraphicalEditPart resolveEditPart(Object connectionEnd, IGraphicalEditPart context) {
+ IGraphicalEditPart result = null;
+ EObject contextElement = context.resolveSemanticElement();
+ IGraphicalEditPart search = DiagramEditPartsUtil.getDiagramEditPart(context);
+
+ if (connectionEnd instanceof VisuallyNestedElements) {
+ VisuallyNestedElements stack = (VisuallyNestedElements) connectionEnd;
+
+ for (EObject next : stack) {
+ result = DiagramEditPartsUtil.getChildByEObject(next, search, false);
+ if (result != null) {
+ search = result;
+ } else {
+ break;
+ }
+ }
+ } else {
+ EObject eEnd = (EObject) connectionEnd;
+ if (eEnd == contextElement) {
+ result = context.getTopGraphicEditPart();
+ } else {
+ result = DiagramEditPartsUtil.getChildByEObject(eEnd, search, false);
+ }
+ }
+
+ return result;
+ }
+
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.commands/src/org/eclipse/papyrus/commands/util/CommandTreeIterator.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.commands/src/org/eclipse/papyrus/commands/util/CommandTreeIterator.java
index 3e2637de3bd..9285142a88a 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.commands/src/org/eclipse/papyrus/commands/util/CommandTreeIterator.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.commands/src/org/eclipse/papyrus/commands/util/CommandTreeIterator.java
@@ -44,7 +44,6 @@ public class CommandTreeIterator<C> implements Iterator<C> {
private List<Iterator<?>> iterators = new ArrayList<Iterator<?>>();
private C preparedNext;
- private boolean done;
private CommandTreeIterator(Object root, Class<C> type) {
super();
@@ -56,7 +55,7 @@ public class CommandTreeIterator<C> implements Iterator<C> {
if (isCompound(root)) {
pushIterator(root);
} else {
- done = !prepareNext(root);
+ prepareNext(root);
}
}
@@ -99,7 +98,6 @@ public class CommandTreeIterator<C> implements Iterator<C> {
private Iterator<?> popIterator() {
if (iterators.isEmpty()) {
current = null;
- done = true;
} else {
current = iterators.remove(iterators.size() - 1);
}
@@ -128,8 +126,12 @@ public class CommandTreeIterator<C> implements Iterator<C> {
return result;
}
+ boolean isDone() {
+ return (current == null) && iterators.isEmpty();
+ }
+
public boolean hasNext() {
- while (!done && (preparedNext == null)) {
+ while (!isDone() && (preparedNext == null)) {
Object next = internalNext();
if (type.isInstance(next)) {
preparedNext = type.cast(next);
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/META-INF/MANIFEST.MF b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/META-INF/MANIFEST.MF
index 73d03a1c6e7..2086f868ede 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/META-INF/MANIFEST.MF
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/META-INF/MANIFEST.MF
@@ -29,6 +29,7 @@ Export-Package: org.eclipse.papyrus.infra.gmfdiag.common,
org.eclipse.papyrus.infra.gmfdiag.common.reconciler,
org.eclipse.papyrus.infra.gmfdiag.common.selection,
org.eclipse.papyrus.infra.gmfdiag.common.service.shape,
+ org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype,
org.eclipse.papyrus.infra.gmfdiag.common.snap,
org.eclipse.papyrus.infra.gmfdiag.common.snap.copy,
org.eclipse.papyrus.infra.gmfdiag.common.strategy,
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/plugin.xml b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/plugin.xml
index ec3bfd1fd8a..4ad8e04a92e 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/plugin.xml
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/plugin.xml
@@ -12,6 +12,7 @@
<extension-point id="copyStrategy" name="copyStrategy" schema="schema/copyStrategy.exsd"/>
<extension-point id="diagramReconciler" name="diagramReconciler" schema="schema/diagramReconciler.exsd"/>
<extension-point id="diagramExpansion" name="diagramExpansion" schema="schema/DiagramExpansion.exsd"/>
+ <extension-point id="visualTypeProviders" name="Visual Type Providers" schema="schema/visualTypeProviders.exsd"/>
<extension
point="org.eclipse.ui.handlers">
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/schema/visualTypeProviders.exsd b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/schema/visualTypeProviders.exsd
new file mode 100644
index 00000000000..d2ce2cad190
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/schema/visualTypeProviders.exsd
@@ -0,0 +1,128 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrus.infra.gmfdiag.common" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.papyrus.infra.gmfdiag.common" id="visualTypeProviders" name="Visual Type Providers"/>
+ </appInfo>
+ <documentation>
+ Provider of information about the visual types supported by a particular diagram. The extension associates a provider with a diagram type, and the provider supplies element types for visual IDs and the best visual IDs for presentation of model elements as nodes and edges in the diagram.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="visualTypeProvider"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="visualTypeProvider">
+ <complexType>
+ <sequence>
+ <element ref="Priority" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="diagramType" type="string" use="required">
+ <annotation>
+ <documentation>
+ The diagram type for which the provider supplies visual type information.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ The class implementing the provider.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype.AbstractVisualTypeProvider:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="Priority">
+ <complexType>
+ <attribute name="name" use="default" value="Lowest">
+ <annotation>
+ <documentation>
+ The priority of the provider. It can be one of the following values:
+[Lowest, Low, Medium, High, Highest].
+ </documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="Lowest">
+ </enumeration>
+ <enumeration value="Low">
+ </enumeration>
+ <enumeration value="Medium">
+ </enumeration>
+ <enumeration value="High">
+ </enumeration>
+ <enumeration value="Highest">
+ </enumeration>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.2
+ </documentation>
+ </annotation>
+
+
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2015 Christian W. Damus and others.
+
+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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/commands/requests/CanonicalDropObjectsRequest.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/commands/requests/CanonicalDropObjectsRequest.java
index 577576cbd57..bb90cf6a0f8 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/commands/requests/CanonicalDropObjectsRequest.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/commands/requests/CanonicalDropObjectsRequest.java
@@ -20,7 +20,11 @@ import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest;
/**
* A request to drop objects into an {@link EditPart} as canonical children,
* which is a "canonical drop".
+ *
+ * @deprecated No longer used by the Canonical Edit Policy nor answered by the
+ * Customizable Drop Edit Policy
*/
+@Deprecated
public class CanonicalDropObjectsRequest extends Request {
/** The request type for the "canonical drop" command. */
public static final String REQ_CANONICAL_DROP_OBJECTS = "org.eclipse.papyrus.CANONICAL_DROP_OBJECTS";
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/AbstractVisualTypeProvider.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/AbstractVisualTypeProvider.java
new file mode 100644
index 00000000000..6e716001444
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/AbstractVisualTypeProvider.java
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+
+/**
+ * Abstract superclass of all {@link IVisualTypeProvider} extensions.
+ */
+public abstract class AbstractVisualTypeProvider extends AbstractProvider implements IVisualTypeProvider {
+
+ private String diagramType;
+
+ public AbstractVisualTypeProvider() {
+ super();
+ }
+
+ @Override
+ public boolean provides(IOperation operation) {
+ return (operation instanceof IVisualTypeOperation)
+ && Objects.equal(((IVisualTypeOperation) operation).getDiagramType(), diagramType);
+ }
+
+ void setConfiguration(IConfigurationElement config) {
+ diagramType = config.getAttribute("diagramType"); //$NON-NLS-1$
+ if (Strings.isNullOrEmpty(diagramType)) {
+ throw new IllegalArgumentException("No diagramType attribute specified by visual type provider extension"); //$NON-NLS-1$
+ }
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetElementTypeOperation.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetElementTypeOperation.java
new file mode 100644
index 00000000000..2faad3eef1c
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetElementTypeOperation.java
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype;
+
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+import org.eclipse.gmf.runtime.common.core.service.IProvider;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.Diagram;
+
+/**
+ * The {@link IVisualTypeProvider#getElementType(Diagram, String)} operation.
+ */
+public class GetElementTypeOperation implements IOperation, IVisualTypeOperation {
+
+ private Diagram diagram;
+ private String viewType;
+
+ public GetElementTypeOperation(Diagram diagram, String viewType) {
+ super();
+
+ this.diagram = diagram;
+ this.viewType = viewType;
+ }
+
+ @Override
+ public Object execute(IProvider provider) {
+ IElementType result = null;
+
+ if (provider instanceof IVisualTypeProvider) {
+ result = ((IVisualTypeProvider) provider).getElementType(diagram, viewType);
+ }
+
+ return result;
+ }
+
+ @Override
+ public String getDiagramType() {
+ return diagram.getType();
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetLinkTypeOperation.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetLinkTypeOperation.java
new file mode 100644
index 00000000000..edd17e8232b
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetLinkTypeOperation.java
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+import org.eclipse.gmf.runtime.common.core.service.IProvider;
+import org.eclipse.gmf.runtime.notation.Diagram;
+
+/**
+ * The {@link IVisualTypeProvider#getLinkType(EObject)} operation.
+ */
+public class GetLinkTypeOperation implements IOperation, IVisualTypeOperation {
+
+ private Diagram diagram;
+ private EObject element;
+
+ public GetLinkTypeOperation(Diagram diagram, EObject element) {
+ super();
+
+ this.diagram = diagram;
+ this.element = element;
+ }
+
+ @Override
+ public Object execute(IProvider provider) {
+ String result = null;
+
+ if (provider instanceof IVisualTypeProvider) {
+ result = ((IVisualTypeProvider) provider).getLinkType(diagram, element);
+ }
+
+ return result;
+ }
+
+ @Override
+ public String getDiagramType() {
+ return diagram.getType();
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetNodeTypeOperation.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetNodeTypeOperation.java
new file mode 100644
index 00000000000..64c7dbfe465
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/GetNodeTypeOperation.java
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+import org.eclipse.gmf.runtime.common.core.service.IProvider;
+import org.eclipse.gmf.runtime.notation.View;
+
+/**
+ * The {@link IVisualTypeProvider#getNodeType(View, EObject)} operation.
+ */
+public class GetNodeTypeOperation implements IOperation, IVisualTypeOperation {
+
+ private View parentView;
+ private EObject element;
+
+ public GetNodeTypeOperation(View parentView, EObject element) {
+ super();
+
+ this.parentView = parentView;
+ this.element = element;
+ }
+
+ @Override
+ public Object execute(IProvider provider) {
+ String result = null;
+
+ if (provider instanceof IVisualTypeProvider) {
+ result = ((IVisualTypeProvider) provider).getNodeType(parentView, element);
+ }
+
+ return result;
+ }
+
+ @Override
+ public String getDiagramType() {
+ return parentView.getDiagram().getType();
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeOperation.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeOperation.java
new file mode 100644
index 00000000000..9e37ba69463
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeOperation.java
@@ -0,0 +1,26 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype;
+
+/**
+ * A private interface implemented by all {@link IVisualTypeProvider} operations.
+ */
+interface IVisualTypeOperation {
+ /**
+ * Queries the type identifier of the diagram that is the context of the visual-type operation.
+ *
+ * @return the contextual diagram type
+ */
+ String getDiagramType();
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeProvider.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeProvider.java
new file mode 100644
index 00000000000..28259b99b77
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/IVisualTypeProvider.java
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.service.IProvider;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+
+/**
+ * A GMF service provider for visual element-type information specific to a diagram.
+ *
+ * @noimplement Providers should extend the {@link AbstractVisualTypeProvider} class.
+ */
+public interface IVisualTypeProvider extends IProvider {
+ /**
+ * Obtains the element-type indicated by the specified {@code visualID}.
+ *
+ * @param diagram
+ * the diagram context in which the visualID is encountered
+ * @param viewType
+ * the {@linkplain View#getType() view type} for an element visualized in the diagram
+ *
+ * @return the corresponding element type, or {@code null} if the {@code visualID} is
+ * not recognized by this provider
+ */
+ IElementType getElementType(Diagram diagram, String viewType);
+
+ /**
+ * Obtains the unique view type for the visualization of an {@code element} in a parent view.
+ *
+ * @param parentView
+ * the view within which the {@code element} is to be visualized
+ * @param element
+ * a model element to visualize
+ *
+ * @return the {@linkplain View#getType() view type} of the node that would present the {@code element} in the parent view,
+ * or {@code null} if the {@code element} is not supported by this provider in the given parent view
+ */
+ String getNodeType(View parentView, EObject element);
+
+ /**
+ * Obtains the unique view type for the visualization of an {@code element} as an edge in the
+ * diagram. Note that, unlike the case of {@linkplain #getNodeType(View, EObject) nodes},
+ * there is no meaningful container-view context to qualify this query, as all edges are
+ * children of the root {@link Diagram}.
+ *
+ * @param diagram
+ * the diagram in which the {@code element} is to be visualized as an edge
+ * @param element
+ * a model element to visualize as an edge
+ *
+ * @return the {@linkplain View#getType() view type} of the edge that would present the {@code element} in the diagram,
+ * or {@code null} if the {@code element} is not supported by this provider in its diagram
+ */
+ String getLinkType(Diagram diagram, EObject element);
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/VisualTypeService.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/VisualTypeService.java
new file mode 100644
index 00000000000..892ee816794
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/service/visualtype/VisualTypeService.java
@@ -0,0 +1,179 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.common.core.service.ExecutionStrategy;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+import org.eclipse.gmf.runtime.common.core.service.IProvider;
+import org.eclipse.gmf.runtime.common.core.service.IProviderChangeListener;
+import org.eclipse.gmf.runtime.common.core.service.ProviderPriority;
+import org.eclipse.gmf.runtime.common.core.service.Service;
+import org.eclipse.gmf.runtime.common.ui.services.util.ActivityFilterProviderDescriptor;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.papyrus.infra.gmfdiag.common.Activator;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+
+/**
+ * A GMF service for visual element-type information specific to a diagram.
+ */
+public class VisualTypeService extends Service implements IVisualTypeProvider {
+ private static final VisualTypeService INSTANCE;
+
+ static {
+ INSTANCE = new VisualTypeService();
+ INSTANCE.configureProviders(Activator.ID, "visualTypeProviders"); //$NON-NLS-1$
+ }
+
+ private VisualTypeService() {
+ super(true, true);
+ }
+
+ public static VisualTypeService getInstance() {
+ return INSTANCE;
+ }
+
+ @Override
+ protected Object getCachingKey(IOperation operation) {
+ return ((IVisualTypeOperation) operation).getDiagramType();
+ }
+
+ @Override
+ public String getPriority(IConfigurationElement element) {
+ String result = ProviderPriority.LOWEST.getName();
+
+ IConfigurationElement[] priorities = element.getChildren("Priority");
+ if (priorities.length > 0) {
+ String priority = priorities[0].getAttribute("name");
+ if (!Strings.isNullOrEmpty(priority)) {
+ result = priority;
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ protected ProviderDescriptor newProviderDescriptor(IConfigurationElement element) {
+ class VTPDesc extends ActivityFilterProviderDescriptor {
+ private final String diagramType;
+
+ public VTPDesc(IConfigurationElement element) {
+ super(element);
+
+ diagramType = element.getAttribute("diagramType");
+ }
+
+ @Override
+ public boolean provides(IOperation operation) {
+ return (operation instanceof IVisualTypeOperation)
+ && Objects.equal(((IVisualTypeOperation) operation).getDiagramType(), diagramType)
+ && super.provides(operation);
+ }
+
+ @Override
+ public IProvider getProvider() {
+ IProvider result = provider;
+
+ if (result == null) {
+ // We are initializing the provider
+ result = super.getProvider();
+ if (result == null) {
+ Activator.log.warn(String.format("Provider initialization failed for <%s> in %s.", getElement().getName(), getElement().getContributor().getName()));
+ provider = new NullProvider();
+ result = provider;
+ } else {
+ ((AbstractVisualTypeProvider) result).setConfiguration(getElement());
+ }
+ }
+
+ return result;
+ }
+ }
+
+ return new VTPDesc(element);
+ }
+
+ //
+ // Provider API
+ //
+
+ @Override
+ public IElementType getElementType(Diagram diagram, String viewType) {
+ IOperation operation = new GetElementTypeOperation(diagram, viewType);
+ List<?> result = ExecutionStrategy.FIRST.execute(this, operation);
+
+ return result.isEmpty() ? null : (IElementType) result.get(0);
+ }
+
+ @Override
+ public String getNodeType(View parentView, EObject element) {
+ IOperation operation = new GetNodeTypeOperation(parentView, element);
+ List<?> result = ExecutionStrategy.FIRST.execute(this, operation);
+
+ return result.isEmpty() ? null : (String) result.get(0);
+ }
+
+ @Override
+ public String getLinkType(Diagram diagram, EObject element) {
+ IOperation operation = new GetLinkTypeOperation(diagram, element);
+ List<?> result = ExecutionStrategy.FIRST.execute(this, operation);
+
+ return result.isEmpty() ? null : (String) result.get(0);
+ }
+
+ //
+ // Nested types
+ //
+
+ private static final class NullProvider implements IVisualTypeProvider {
+ @Override
+ public boolean provides(IOperation operation) {
+ return false;
+ }
+
+ @Override
+ public void addProviderChangeListener(IProviderChangeListener listener) {
+ // No point
+ }
+
+ @Override
+ public void removeProviderChangeListener(IProviderChangeListener listener) {
+ // Never added any
+ }
+
+ @Override
+ public IElementType getElementType(Diagram diagram, String viewType) {
+ return null;
+ }
+
+ @Override
+ public String getNodeType(View parentView, EObject element) {
+ return null;
+ }
+
+ @Override
+ public String getLinkType(Diagram diagram, EObject element) {
+ return null;
+ }
+
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/AbstractNestedDiagramViewsSyncFeature.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/AbstractNestedDiagramViewsSyncFeature.java
index 341cc35e9ea..76284615b5a 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/AbstractNestedDiagramViewsSyncFeature.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/AbstractNestedDiagramViewsSyncFeature.java
@@ -9,15 +9,16 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - bug 465416
+ * Christian W. Damus - bug 477384
*
*****************************************************************************/
package org.eclipse.papyrus.infra.gmfdiag.common.sync;
-import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.common.command.AbstractCommand;
@@ -29,9 +30,15 @@ import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.edit.command.DeleteCommand;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.papyrus.infra.gmfdiag.common.commands.requests.CanonicalDropObjectsRequest;
+import org.eclipse.papyrus.infra.gmfdiag.common.commands.SemanticElementAdapter;
+import org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype.VisualTypeService;
import org.eclipse.papyrus.infra.sync.EStructuralFeatureSyncFeature;
import org.eclipse.papyrus.infra.sync.SyncBucket;
import org.eclipse.papyrus.infra.sync.SyncItem;
@@ -159,19 +166,14 @@ public abstract class AbstractNestedDiagramViewsSyncFeature<M extends EObject, N
FigureCanvas figureCanvas = (FigureCanvas) control;
Point location = figureCanvas.getViewport().getViewLocation();
- DropObjectsRequest dropObjectsRequest = new DropObjectsRequest();
objectToDrop = getTargetModel(from, to, newModel);
- dropObjectsRequest.setObjects(Collections.singletonList(objectToDrop));
- dropObjectsRequest.setLocation(location);
+ IGraphicalEditPart dropEditPart = (IGraphicalEditPart) getEffectiveEditPart(to.getBackend());
- EditPart dropEditPart = getEffectiveEditPart(to.getBackend());
- EditPart targetEditPart = getTargetEditPart(dropEditPart, dropObjectsRequest);
- if (targetEditPart != null) {
- dropEditPart = targetEditPart;
+ CreateRequest createRequest = getCreateRequest(dropEditPart, objectToDrop, location);
+ if (createRequest != null) {
+ dropCommand = getCreateCommand(dropEditPart, createRequest);
}
- dropCommand = dropEditPart.getCommand(new CanonicalDropObjectsRequest(dropObjectsRequest));
-
if (dropCommand == null) {
dropCommand = org.eclipse.gef.commands.UnexecutableCommand.INSTANCE;
}
@@ -221,8 +223,40 @@ public abstract class AbstractNestedDiagramViewsSyncFeature<M extends EObject, N
};
}
- protected EditPart getTargetEditPart(EditPart parentEditPart, DropObjectsRequest dropObjectsRequest) {
- return parentEditPart.getTargetEditPart(dropObjectsRequest);
+ protected CreateRequest getCreateRequest(IGraphicalEditPart parentPart, EObject element, Point atLocation) {
+ CreateRequest result = null;
+
+ View parentView = parentPart.getNotationView();
+
+ // Consult the visual type service to get the appropriate view type
+ String viewType = VisualTypeService.getInstance().getNodeType(parentView, element);
+ if (viewType != null) {
+ IElementType elementType = VisualTypeService.getInstance().getElementType(parentView.getDiagram(), viewType);
+ IAdaptable elementAdapter = new SemanticElementAdapter(element, elementType);
+
+ CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(
+ elementAdapter,
+ Node.class,
+ viewType,
+ parentPart.getDiagramPreferencesHint());
+ result = new CreateViewRequest(descriptor);
+ result.setLocation(atLocation);
+ }
+
+ return result;
+ }
+
+ protected org.eclipse.gef.commands.Command getCreateCommand(IGraphicalEditPart parentPart, CreateRequest request) {
+ EditPart targetEditPart = getTargetEditPart(parentPart, request);
+ if (targetEditPart instanceof IGraphicalEditPart) {
+ parentPart = (IGraphicalEditPart) targetEditPart;
+ }
+
+ return parentPart.getCommand(request);
+ }
+
+ protected EditPart getTargetEditPart(EditPart parentEditPart, Request request) {
+ return parentEditPart.getTargetEditPart(request);
}
/**
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/DiagramEdgesSyncFeature.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/DiagramEdgesSyncFeature.java
index fd728c86549..9d1d80af299 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/DiagramEdgesSyncFeature.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.common/src/org/eclipse/papyrus/infra/gmfdiag/common/sync/DiagramEdgesSyncFeature.java
@@ -13,13 +13,23 @@
package org.eclipse.papyrus.infra.gmfdiag.common.sync;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
+import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
+import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.papyrus.infra.gmfdiag.common.commands.SemanticElementAdapter;
+import org.eclipse.papyrus.infra.gmfdiag.common.service.visualtype.VisualTypeService;
import org.eclipse.papyrus.infra.gmfdiag.common.utils.DiagramEditPartsUtil;
import org.eclipse.papyrus.infra.sync.SyncBucket;
@@ -69,4 +79,69 @@ public abstract class DiagramEdgesSyncFeature<M extends EObject, N extends EObje
return result;
}
+
+ @Override
+ protected CreateRequest getCreateRequest(IGraphicalEditPart parentPart, EObject element, Point atLocation) {
+ CreateConnectionViewRequest result = null;
+
+ DiagramEditPart diagramPart = DiagramEditPartsUtil.getDiagramEditPart(parentPart);
+ Diagram diagram = diagramPart.getDiagramView();
+ EObject source = getSourceElement(element);
+ EObject target = getTargetElement(element);
+
+ EditPart sourcePart = DiagramEditPartsUtil.getChildByEObject(source, diagramPart, false);
+ EditPart targetPart = DiagramEditPartsUtil.getChildByEObject(target, diagramPart, false);
+
+ if ((sourcePart != null) && (targetPart != null)) {
+ // Consult the visual type service to get the appropriate view type
+ String viewType = VisualTypeService.getInstance().getLinkType(diagram, element);
+ if (viewType != null) {
+ IElementType elementType = VisualTypeService.getInstance().getElementType(diagram, viewType);
+ IAdaptable elementAdapter = new SemanticElementAdapter(element, elementType);
+
+ CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(
+ elementAdapter,
+ viewType,
+ parentPart.getDiagramPreferencesHint());
+ result = new CreateConnectionViewRequest(descriptor);
+ result.setLocation(atLocation);
+ result.setSourceEditPart(sourcePart);
+ result.setTargetEditPart(targetPart);
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Queries the source element of a semantic connection.
+ *
+ * @param connectionElement
+ * a semantic connection element
+ *
+ * @return its source element
+ */
+ protected abstract EObject getSourceElement(EObject connectionElement);
+
+ /**
+ * Queries the target element of a semantic connection.
+ *
+ * @param connectionElement
+ * a semantic connection element
+ *
+ * @return its target element
+ */
+ protected abstract EObject getTargetElement(EObject connectionElement);
+
+ @Override
+ protected org.eclipse.gef.commands.Command getCreateCommand(IGraphicalEditPart parentPart, CreateRequest request) {
+ // Initialize the command
+ request.setType(RequestConstants.REQ_CONNECTION_START);
+ ((CreateConnectionViewRequest) request).getSourceEditPart().getCommand(request);
+ request.setType(RequestConstants.REQ_CONNECTION_END);
+
+ // Get the command
+ return ((CreateConnectionViewRequest) request).getTargetEditPart().getCommand(request);
+ }
+
}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.dnd/src/org/eclipse/papyrus/infra/gmfdiag/dnd/policy/CustomizableDropEditPolicy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.dnd/src/org/eclipse/papyrus/infra/gmfdiag/dnd/policy/CustomizableDropEditPolicy.java
index 21b991a442c..8387e373cc3 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.dnd/src/org/eclipse/papyrus/infra/gmfdiag/dnd/policy/CustomizableDropEditPolicy.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.dnd/src/org/eclipse/papyrus/infra/gmfdiag/dnd/policy/CustomizableDropEditPolicy.java
@@ -9,6 +9,7 @@
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Christian W. Damus - bug 433206
+ * Christian W. Damus - bug 477384
*****************************************************************************/
package org.eclipse.papyrus.infra.gmfdiag.dnd.policy;
@@ -41,7 +42,6 @@ import org.eclipse.gmf.runtime.notation.Shape;
import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.papyrus.infra.gmfdiag.common.commands.DefaultActionHandler;
import org.eclipse.papyrus.infra.gmfdiag.common.commands.SelectAndExecuteCommand;
-import org.eclipse.papyrus.infra.gmfdiag.common.commands.requests.CanonicalDropObjectsRequest;
import org.eclipse.papyrus.infra.gmfdiag.dnd.Activator;
import org.eclipse.papyrus.infra.gmfdiag.dnd.strategy.DefaultDropStrategy;
import org.eclipse.papyrus.infra.gmfdiag.dnd.strategy.DropStrategy;
@@ -104,13 +104,8 @@ public class CustomizableDropEditPolicy extends DragDropEditPolicy {
command = getCustomCommand(request);
}
} else if (this.understands(request)) {
- if (CanonicalDropObjectsRequest.REQ_CANONICAL_DROP_OBJECTS.equals(request.getType())) {
- // Forward canonical drop to the default drop policy
- command = getCanonicalDropObjectsCommand(request);
- } else {
- // Add request
- command = getCreationCommand(request);
- }
+ // Add request
+ command = getCreationCommand(request);
} else if (defaultCreationEditPolicy != null) {
// Creation request
if (defaultCreationEditPolicy.understandsRequest(request)) {
@@ -141,8 +136,7 @@ public class CustomizableDropEditPolicy extends DragDropEditPolicy {
}
protected boolean understands(Request request) {
- return org.eclipse.gef.RequestConstants.REQ_ADD.equals(request.getType())
- || CanonicalDropObjectsRequest.REQ_CANONICAL_DROP_OBJECTS.equals(request.getType());
+ return org.eclipse.gef.RequestConstants.REQ_ADD.equals(request.getType());
}
protected boolean isCustomRequest(Request request) {
@@ -153,11 +147,15 @@ public class CustomizableDropEditPolicy extends DragDropEditPolicy {
return getCustomCommand(request);
}
+ /**
+ * @deprecated No longer used.
+ */
+ @Deprecated
protected Command getCanonicalDropObjectsCommand(Request request) {
Command result = null;
- if ((defaultDropEditPolicy != null) && (request instanceof CanonicalDropObjectsRequest)) {
- result = defaultDropEditPolicy.getCommand(((CanonicalDropObjectsRequest) request).getDropObjectsRequest());
+ if ((defaultDropEditPolicy != null) && (request instanceof org.eclipse.papyrus.infra.gmfdiag.common.commands.requests.CanonicalDropObjectsRequest)) {
+ result = defaultDropEditPolicy.getCommand(((org.eclipse.papyrus.infra.gmfdiag.common.commands.requests.CanonicalDropObjectsRequest) request).getDropObjectsRequest());
}
return result;

Back to the top