[497702] Fix edge selection problem
* bordered node expanded zone when edge selected now does take in
consideration the size of the node with the zoom.
* The minimum length the edge must have to use expanded nodes is now
constant whereas it increased regarding the difference between node size
and minimum selectable requirement.
* The computing on the edge selection has been updated to select node
expanded only if edge selectable zone is present.
Change-Id: Ia6c28cd624dd73a668aa595b512161de9451e0ba
Signed-off-by: pguilet <pierre.guilet@obeo.fr>
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
index 4375323..1fd6cb7 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
@@ -63,6 +63,7 @@
import org.eclipse.sirius.diagram.ui.tools.internal.graphical.edit.policies.SiriusConnectionEndPointEditPolicy;
import org.eclipse.sirius.diagram.ui.tools.internal.routers.SiriusBendpointConnectionRouter;
import org.eclipse.sirius.diagram.ui.tools.internal.ruler.SiriusSnapToHelperUtil;
+import org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper;
import org.eclipse.sirius.ext.gmf.runtime.editpolicies.SiriusSnapFeedbackPolicy;
import org.eclipse.sirius.viewpoint.description.tool.AbstractToolDescription;
import org.eclipse.sirius.viewpoint.description.tool.PaneBasedSelectionWizardDescription;
@@ -78,6 +79,19 @@
public abstract class AbstractDiagramEdgeEditPart extends ConnectionNodeEditPart implements IDiagramEdgeEditPart {
/**
+ * The minimum length(width or height) the edge box must have to be
+ * considered as selectable.
+ */
+ private static final int EDGE_MINIMUM_LENGTH = 20;
+
+ /**
+ * The minimum thickness the edge box at top, bottom, left or right position
+ * of the union of the nodes boxes must have to be considered as selectable
+ * zone.
+ */
+ private static final int EDGE_MINIMUM_THICKNESS = 20;
+
+ /**
* Define the minimum selection box size for the source and target of the
* edge (if source or target is bordered node), to fix the horizontal and
* vertical increment around which the selection of this edge select the
@@ -712,7 +726,12 @@
* CreateUnspecifiedTypeConnectionRequest is used to create a NoteAtachment
* directly from the Note.
*
+ * The returned edit part can be this edge one or the target or source's one
+ * if this edge part is over the nodes ones.
+ *
* @see org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart#getTargetEditPart(org.eclipse.gef.Request)
+ *
+ * T
*/
@Override
public EditPart getTargetEditPart(final Request request) {
@@ -726,42 +745,158 @@
if (tool instanceof RequestDescription || tool instanceof SelectionWizardDescription || tool instanceof PaneBasedSelectionWizardDescription) {
return this;
} else if (request instanceof SelectionRequest) {
- // if there is the source of the target near this edge select it.
+ boolean expandSource = false;
+ boolean expandTarget = false;
+ Rectangle sourceBoundsWithMargin = null;
+ Rectangle targetBoundsWithMargin = null;
+ int horizontalSourceIncrement = 0;
+ int verticalSourceIncrement = 0;
+ int horizontalTargetIncrement = 0;
+ int verticalTargetIncrement = 0;
+ Rectangle sourceBounds = null;
+ Rectangle targetBounds = null;
+
+ // We compute the bounds of the source edit part with margins if it
+ // is too small.
if (getSource() instanceof AbstractBorderItemEditPart) {
- final IFigure sourceFigure = ((AbstractBorderItemEditPart) getSource()).getFigure();
- final int horizontalIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > sourceFigure.getSize().width ? SOURCE_TARGET_MINIMUM_SIZE_SELECTION - sourceFigure.getSize().width : 0;
- final int verticalIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > sourceFigure.getSize().height ? SOURCE_TARGET_MINIMUM_SIZE_SELECTION - sourceFigure.getSize().height : 0;
- final Rectangle rectWithMarges = sourceFigure.getBounds().getExpanded(horizontalIncrement, verticalIncrement);
- sourceFigure.translateToAbsolute(rectWithMarges);
- // in very specific cases (Note attachment on specific
- // edges)
- // request.getLocation() can be null
- Point location = ((SelectionRequest) request).getLocation();
- if (location != null && rectWithMarges.contains(location)) {
+ sourceBounds = GraphicalHelper.getAbsoluteBounds((IGraphicalEditPart) getSource());
+ // The method used to add margins doubles the given horizontal
+ // and vertical so we divide these values to always have the
+ // same minimum selection box.
+ horizontalSourceIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > sourceBounds.width ? Math.round((SOURCE_TARGET_MINIMUM_SIZE_SELECTION - sourceBounds.width) / 2) : 0;
+ verticalSourceIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > sourceBounds.height ? Math.round((SOURCE_TARGET_MINIMUM_SIZE_SELECTION - sourceBounds.height) / 2) : 0;
+
+ if (horizontalSourceIncrement > 0 || verticalSourceIncrement > 0) {
+ expandSource = true;
+ sourceBoundsWithMargin = sourceBounds.getExpanded(horizontalSourceIncrement, verticalSourceIncrement);
+ } else {
+ sourceBoundsWithMargin = sourceBounds;
+ }
+ }
+ // We compute the bounds of the target edit part with margins if it
+ // is too small.
+ if (getTarget() instanceof AbstractBorderItemEditPart) {
+ targetBounds = GraphicalHelper.getAbsoluteBounds((IGraphicalEditPart) getTarget());
+ horizontalTargetIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > targetBounds.width ? Math.round((SOURCE_TARGET_MINIMUM_SIZE_SELECTION - targetBounds.width) / 2) : 0;
+ verticalTargetIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > targetBounds.height ? Math.round((SOURCE_TARGET_MINIMUM_SIZE_SELECTION - targetBounds.height) / 2) : 0;
+
+ if (horizontalTargetIncrement > 0 || verticalTargetIncrement > 0) {
+ expandTarget = true;
+ targetBoundsWithMargin = targetBounds.getExpanded(horizontalTargetIncrement, verticalTargetIncrement);
+ } else {
+ targetBoundsWithMargin = targetBounds;
+ }
+
+ }
+
+ // We test if an edge selectable zone exists with the margined
+ // source and target edit part. Margins can be zero if parts are big
+ // enough.
+ boolean isEdgeSelectableZonePresent = false;
+ if (expandTarget || expandSource) {
+ Rectangle edgeBounds = GraphicalHelper.getAbsoluteBounds(this);
+ isEdgeSelectableZonePresent = isEdgeSelectableZonePresent(edgeBounds, sourceBoundsWithMargin, targetBoundsWithMargin);
+ }
+
+ Point location = ((SelectionRequest) request).getLocation();
+ if (location != null) {
+ boolean returnSource = isEdgeSelectableZonePresent && sourceBoundsWithMargin != null && sourceBoundsWithMargin.contains(location);
+ returnSource = returnSource || (sourceBounds != null && sourceBounds.contains(location));
+ if (returnSource) {
+ // The mouse is located in the margined source part and an
+ // edge selectable zone is present. So the considered
+ // selection is the source one.
result = getSource();
+ } else if (result == null) {
+ boolean returnTarget = isEdgeSelectableZonePresent && targetBoundsWithMargin != null && targetBoundsWithMargin.contains(location);
+ returnTarget = returnTarget || (targetBounds != null && targetBounds.contains(location));
+ if (returnTarget) {
+ // The mouse is located in the margined target part and
+ // an edge selectable zone is present. So the considered
+ // selection is the target one.
+ result = getTarget();
+ }
}
}
- if (result == null && getTarget() instanceof AbstractBorderItemEditPart) {
- final IFigure targetFigure = ((AbstractBorderItemEditPart) getTarget()).getFigure();
- final int horizontalIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > targetFigure.getSize().width ? SOURCE_TARGET_MINIMUM_SIZE_SELECTION - targetFigure.getSize().width : 0;
- final int verticalIncrement = SOURCE_TARGET_MINIMUM_SIZE_SELECTION > targetFigure.getSize().height ? SOURCE_TARGET_MINIMUM_SIZE_SELECTION - targetFigure.getSize().height : 0;
- final Rectangle rectWithMarges = targetFigure.getBounds().getExpanded(horizontalIncrement, verticalIncrement);
- targetFigure.translateToAbsolute(rectWithMarges);
- // in very specific cases (Note attachment on specific
- // edges)
- // request.getLocation() can be null
- Point location = ((SelectionRequest) request).getLocation();
- if (location != null && rectWithMarges.contains(((SelectionRequest) request).getLocation())) {
- result = getTarget();
- }
- }
+
}
if (result == null) {
+ // The mouse is located in the edge bounds but not in the margined
+ // source and target one so we return it.
result = super.getTargetEditPart(request);
}
return result;
}
+ /**
+ * Returns true if the edge represented by the given bounds has a zone with
+ * the minimum width or height allowing its selection.
+ *
+ * Either the edge has a box outside the one formed by the union of the
+ * nodes boxes that meets the minimum requirement that is a thickness of
+ * {@link AbstractDiagramEdgeEditPart#EDGE_MINIMUM_THICKNESS}.
+ *
+ * Or it does not. In this case we compute the edge length from its box by
+ * taking in consideration the margin expansions of the nodes boxes. The
+ * computing is done based on the worst scenario of nodes occupation over
+ * the edge. The computing depends on the existence of source and target
+ * bounds. If both exist, then the worst scenario is the boxes of the two
+ * nodes are upon the edge's one. In this case, the edge's box is considered
+ * as selectable if its bound width or height is greater than the minimum
+ * considered when removed from the width or height of the margined nodes.
+ * If only one node exists, then the worst scenario is one node is
+ * completely over the edge. In this case, the edge's box is considered as
+ * selectable if its width or height is greater than the minimum considered
+ * when removed from the minimum width or height of the unique margined
+ * node.
+ *
+ * @param edgeBounds
+ * the {@link Rectangle} encapsulating the selected edge.
+ * @param sourceBoundsWithMargins
+ * the {@link Rectangle} encapsulating the source part of the
+ * selected edge.
+ * @param targetBoundsWithMargins
+ * the {@link Rectangle} encapsulating the target part of the
+ * selected edge.
+ * @return true if the edge represented by the given bounds has the minimum
+ * width or height allowing its selection. False otherwise.
+ */
+ private boolean isEdgeSelectableZonePresent(Rectangle edgeBounds, Rectangle sourceBoundsWithMargins, Rectangle targetBoundsWithMargins) {
+ if (sourceBoundsWithMargins == null && targetBoundsWithMargins == null) {
+ return true;
+ } else {
+ boolean isEdgeSelectableZonePresent = false;
+ if (sourceBoundsWithMargins != null && targetBoundsWithMargins != null) {
+ // We check that the edge is selectable on the edge boxes not in
+ // the union of nodes boxes in all directions (top, bottom,
+ // left, right).
+ Rectangle sourceTargetUnionBox = sourceBoundsWithMargins.getUnion(targetBoundsWithMargins);
+ // compute left box
+ isEdgeSelectableZonePresent = isEdgeSelectableZonePresent || (sourceTargetUnionBox.x - edgeBounds.x > EDGE_MINIMUM_THICKNESS);
+
+ // compute right box
+ isEdgeSelectableZonePresent = isEdgeSelectableZonePresent || ((edgeBounds.x + edgeBounds.width) - (sourceTargetUnionBox.x + sourceTargetUnionBox.width) > EDGE_MINIMUM_THICKNESS);
+
+ // compute top box
+ isEdgeSelectableZonePresent = isEdgeSelectableZonePresent || (sourceTargetUnionBox.y - edgeBounds.y > EDGE_MINIMUM_THICKNESS);
+
+ // compute bottom box
+ isEdgeSelectableZonePresent = isEdgeSelectableZonePresent || ((edgeBounds.y + edgeBounds.height) - (sourceTargetUnionBox.y + sourceTargetUnionBox.height) > EDGE_MINIMUM_THICKNESS);
+
+ }
+ if (!isEdgeSelectableZonePresent) {
+ // there are no edge boxes selectable outside of the box made of
+ // the union of the nodes boxes. So we checks we have the
+ // minimum width or height between the two nodes boxes with
+ // maximum margins.
+ isEdgeSelectableZonePresent = sourceBoundsWithMargins == null || targetBoundsWithMargins == null
+ ? edgeBounds.width - SOURCE_TARGET_MINIMUM_SIZE_SELECTION >= EDGE_MINIMUM_LENGTH || edgeBounds.height - SOURCE_TARGET_MINIMUM_SIZE_SELECTION > EDGE_MINIMUM_LENGTH
+ : edgeBounds.width - (SOURCE_TARGET_MINIMUM_SIZE_SELECTION * 2) >= EDGE_MINIMUM_LENGTH || edgeBounds.height - (SOURCE_TARGET_MINIMUM_SIZE_SELECTION * 2) >= EDGE_MINIMUM_LENGTH;
+ }
+ return isEdgeSelectableZonePresent;
+ }
+ }
+
@Override
public Object getAdapter(Class key) {
if (key == SnapToHelper.class) {
diff --git a/plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/business/UIDiagramRepresentation.java b/plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/business/UIDiagramRepresentation.java
index cf3fa6f..a1992a4 100644
--- a/plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/business/UIDiagramRepresentation.java
+++ b/plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/business/UIDiagramRepresentation.java
@@ -47,6 +47,11 @@
ZOOM_50("50%", 0.5),
/**
+ * Zoom 75%.
+ */
+ ZOOM_75("75%", 0.75),
+
+ /**
* Zoom 100%.
*/
ZOOM_100("100%", 1.0),
diff --git a/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.aird b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.aird
new file mode 100644
index 0000000..9ce017c
--- /dev/null
+++ b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.aird
@@ -0,0 +1,884 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" 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/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style" xmi:id="_qgswEE2TEeakleECKSbEyQ" selectedViews="_rJzXcE2TEeakleECKSbEyQ" version="11.1.0.201606300900">
+ <semanticResources>3358.ecore</semanticResources>
+ <ownedViews xmi:type="viewpoint:DView" xmi:id="_rJzXcE2TEeakleECKSbEyQ">
+ <viewpoint xmi:type="description:Viewpoint" href="3358.odesign#//@ownedViewpoints[name='3358']"/>
+ <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" xmi:id="_rKod4E2TEeakleECKSbEyQ" name="diagram_3358" representation="_rKpE8E2TEeakleECKSbEyQ">
+ <description xmi:type="description_1:DiagramDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']"/>
+ <target xmi:type="ecore:EPackage" href="3358.ecore#/"/>
+ </ownedRepresentationDescriptors>
+ <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_rKpE8E2TEeakleECKSbEyQ" name="diagram_3358">
+ <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_rKpE8U2TEeakleECKSbEyQ" source="DANNOTATION_CUSTOMIZATION_KEY">
+ <data xmi:type="diagram:ComputedStyleDescriptionRegistry" xmi:id="_rKpE8k2TEeakleECKSbEyQ"/>
+ </ownedAnnotationEntries>
+ <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_rK4VgE2TEeakleECKSbEyQ" source="GMF_DIAGRAMS">
+ <data xmi:type="notation:Diagram" xmi:id="_rK4VgU2TEeakleECKSbEyQ" type="Sirius" element="_rKpE8E2TEeakleECKSbEyQ" measurementUnit="Pixel">
+ <children xmi:type="notation:Node" xmi:id="_rK9OAE2TEeakleECKSbEyQ" type="2002" element="_rKpE802TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLD7sE2TEeakleECKSbEyQ" type="5006"/>
+ <children xmi:type="notation:Node" xmi:id="_rLFw4E2TEeakleECKSbEyQ" type="7001">
+ <children xmi:type="notation:Node" xmi:id="_rLKCUE2TEeakleECKSbEyQ" type="3008" element="_rKpE9U2TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLKpYE2TEeakleECKSbEyQ" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_rLOTwE2TEeakleECKSbEyQ" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rLOTwU2TEeakleECKSbEyQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rLOTwk2TEeakleECKSbEyQ"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLVBcE2TEeakleECKSbEyQ" type="3012" element="_rKpE9k2TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLXdsE2TEeakleECKSbEyQ" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rLXdsU2TEeakleECKSbEyQ" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLfZgE2TEeakleECKSbEyQ" type="3005" element="_rKpE902TEeakleECKSbEyQ">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLfZgU2TEeakleECKSbEyQ" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLfZgk2TEeakleECKSbEyQ"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLVBcU2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8" lineColor="10011046"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLVBck2TEeakleECKSbEyQ" x="58" y="6" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLKCUU2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLKCUk2TEeakleECKSbEyQ" x="50" y="69" width="68" height="50"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLPh4E2TEeakleECKSbEyQ" type="3008" element="_rKpE-U2TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLQI8E2TEeakleECKSbEyQ" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_rLQwAE2TEeakleECKSbEyQ" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rLQwAU2TEeakleECKSbEyQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rLQwAk2TEeakleECKSbEyQ"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLgAkE2TEeakleECKSbEyQ" type="3012" element="_rKpE-k2TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLgnoE2TEeakleECKSbEyQ" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rLgnoU2TEeakleECKSbEyQ" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLh1wE2TEeakleECKSbEyQ" type="3005" element="_rKpE-02TEeakleECKSbEyQ">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLh1wU2TEeakleECKSbEyQ" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLh1wk2TEeakleECKSbEyQ"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLgAkU2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLgAkk2TEeakleECKSbEyQ" x="3" y="10" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLPh4U2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLPh4k2TEeakleECKSbEyQ" x="161" y="64" width="60" height="48"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLQwA02TEeakleECKSbEyQ" type="3008" element="_rKpE_U2TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLRXEE2TEeakleECKSbEyQ" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_rLRXEU2TEeakleECKSbEyQ" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rLRXEk2TEeakleECKSbEyQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rLRXE02TEeakleECKSbEyQ"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLQwBE2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLQwBU2TEeakleECKSbEyQ" x="85" y="1216"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLR-IE2TEeakleECKSbEyQ" type="3008" element="_rKpE_02TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLSlME2TEeakleECKSbEyQ" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_rLSlMU2TEeakleECKSbEyQ" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rLSlMk2TEeakleECKSbEyQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rLSlM02TEeakleECKSbEyQ"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_OFI_gE3BEeaLwfxB3LP_RQ" type="3012" element="_OFBDsE3BEeaLwfxB3LP_RQ">
+ <children xmi:type="notation:Node" xmi:id="_OFJmkE3BEeaLwfxB3LP_RQ" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_OFJmkU3BEeaLwfxB3LP_RQ" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_OFJmkk3BEeaLwfxB3LP_RQ" type="3005" element="_OFBDsU3BEeaLwfxB3LP_RQ">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_OFJmk03BEeaLwfxB3LP_RQ" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OFJmlE3BEeaLwfxB3LP_RQ"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_OFI_gU3BEeaLwfxB3LP_RQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OFI_gk3BEeaLwfxB3LP_RQ" x="38" y="25" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLR-IU2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLR-Ik2TEeakleECKSbEyQ" x="70" y="127" width="48" height="48"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_rLTMQE2TEeakleECKSbEyQ" type="3008" element="_rKpFAU2TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_rLTzUE2TEeakleECKSbEyQ" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_rLTzUU2TEeakleECKSbEyQ" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rLTzUk2TEeakleECKSbEyQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rLTzU02TEeakleECKSbEyQ"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NZ1YsE3BEeaLwfxB3LP_RQ" type="3012" element="_NZsOwE3BEeaLwfxB3LP_RQ">
+ <children xmi:type="notation:Node" xmi:id="_NZ3N4E3BEeaLwfxB3LP_RQ" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NZ3N4U3BEeaLwfxB3LP_RQ" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NZ5qIE3BEeaLwfxB3LP_RQ" type="3005" element="_NZs10E3BEeaLwfxB3LP_RQ">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_NZ5qIU3BEeaLwfxB3LP_RQ" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NZ5qIk3BEeaLwfxB3LP_RQ"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_NZ1_wE3BEeaLwfxB3LP_RQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NZ1_wU3BEeaLwfxB3LP_RQ" x="3" y="22" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rLTMQU2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rLTMQk2TEeakleECKSbEyQ" x="150" y="127" width="52" height="51"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_9bFg8E5YEeaITJAJbUiGEA" type="3008" element="_9agSIE5YEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_9bOq4E5YEeaITJAJbUiGEA" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_9bRuME5YEeaITJAJbUiGEA" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_9bRuMU5YEeaITJAJbUiGEA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_9bRuMk5YEeaITJAJbUiGEA"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_CMn9UE5ZEeaITJAJbUiGEA" type="3012" element="_CMVCYE5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_CMrnsE5ZEeaITJAJbUiGEA" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CMrnsU5ZEeaITJAJbUiGEA" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_CM0xoE5ZEeaITJAJbUiGEA" type="3005" element="_CMVCYU5ZEeaITJAJbUiGEA">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_CM0xoU5ZEeaITJAJbUiGEA" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CM0xok5ZEeaITJAJbUiGEA"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_CMn9UU5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CMn9Uk5ZEeaITJAJbUiGEA" x="31" y="39" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_9bFg8U5YEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9bFg8k5YEeaITJAJbUiGEA" x="279" y="23" width="57" height="49"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="__IgFAE5YEeaITJAJbUiGEA" type="3008" element="__IQNYE5YEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="__IgsEE5YEeaITJAJbUiGEA" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="__IgsEU5YEeaITJAJbUiGEA" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="__IgsEk5YEeaITJAJbUiGEA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__IgsE05YEeaITJAJbUiGEA"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_CrGCAE5ZEeaITJAJbUiGEA" type="3012" element="_Cq2KYE5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_CrGpEE5ZEeaITJAJbUiGEA" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CrGpEU5ZEeaITJAJbUiGEA" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_CrGpEk5ZEeaITJAJbUiGEA" type="3005" element="_Cq2KYU5ZEeaITJAJbUiGEA">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_CrGpE05ZEeaITJAJbUiGEA" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CrGpFE5ZEeaITJAJbUiGEA"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_CrGCAU5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CrGCAk5ZEeaITJAJbUiGEA" x="28" y="3" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="__IgFAU5YEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__IgFAk5YEeaITJAJbUiGEA" x="282" y="127" width="52" height="48"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NpFZkE5ZEeaITJAJbUiGEA" type="3008" element="_NozFsE5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_NpFZk05ZEeaITJAJbUiGEA" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_NpGAoE5ZEeaITJAJbUiGEA" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_NpGAoU5ZEeaITJAJbUiGEA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_NpGAok5ZEeaITJAJbUiGEA"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_QyPi4E5ZEeaITJAJbUiGEA" type="3012" element="_Qx_rQE5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_QyQJ8E5ZEeaITJAJbUiGEA" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QyQJ8U5ZEeaITJAJbUiGEA" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_QyQxAE5ZEeaITJAJbUiGEA" type="3005" element="_QyASUE5ZEeaITJAJbUiGEA">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_QyQxAU5ZEeaITJAJbUiGEA" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QyQxAk5ZEeaITJAJbUiGEA"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_QyPi4U5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QyPi4k5ZEeaITJAJbUiGEA" x="31" y="40" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_NpFZkU5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NpFZkk5ZEeaITJAJbUiGEA" x="363" y="22" width="53" height="50"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_O3V8cE5ZEeaITJAJbUiGEA" type="3008" element="_O3DBgE5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_O3WjgE5ZEeaITJAJbUiGEA" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_O3WjgU5ZEeaITJAJbUiGEA" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_O3Wjgk5ZEeaITJAJbUiGEA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_O3Wjg05ZEeaITJAJbUiGEA"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_QVtX4E5ZEeaITJAJbUiGEA" type="3012" element="_QVeHUE5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_QVt-8E5ZEeaITJAJbUiGEA" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QVt-8U5ZEeaITJAJbUiGEA" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_QVumAE5ZEeaITJAJbUiGEA" type="3005" element="_QVeuYE5ZEeaITJAJbUiGEA">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_QVumAU5ZEeaITJAJbUiGEA" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QVumAk5ZEeaITJAJbUiGEA"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_QVtX4U5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QVtX4k5ZEeaITJAJbUiGEA" x="26" y="3" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_O3V8cU5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_O3V8ck5ZEeaITJAJbUiGEA" x="370" y="94" width="53" height="49"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_Ss9G0E5_Eea8mczBvLtT0g" type="3008" element="_SsbiYE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_StCmYE5_Eea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_StDNcE5_Eea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_StDNcU5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_StDNck5_Eea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_VNDsEE5_Eea8mczBvLtT0g" type="3012" element="_VMvjAE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_VNE6ME5_Eea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VNE6MU5_Eea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_VNIkkE5_Eea8mczBvLtT0g" type="3005" element="_VMwKEE5_Eea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_VNIkkU5_Eea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VNIkkk5_Eea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_VNDsEU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VNDsEk5_Eea8mczBvLtT0g" x="50" y="25" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_Ss9t4E5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ss9t4U5_Eea8mczBvLtT0g" x="83" y="274" width="60" height="64"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_UAKbIE5_Eea8mczBvLtT0g" type="3008" element="_T_1rAE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_UALCME5_Eea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_UALCMU5_Eea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_UALCMk5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_UALCM05_Eea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_Vw-RcE5_Eea8mczBvLtT0g" type="3012" element="_Vwko0E5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_Vw-4gE5_Eea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Vw-4gU5_Eea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_Vw_fkE5_Eea8mczBvLtT0g" type="3005" element="_Vwko0U5_Eea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_Vw_fkU5_Eea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Vw_fkk5_Eea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_Vw-RcU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Vw-Rck5_Eea8mczBvLtT0g" x="3" y="28" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_UAKbIU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UAKbIk5_Eea8mczBvLtT0g" x="170" y="274" width="56" height="60"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_qz4qkE5_Eea8mczBvLtT0g" type="3008" element="_qzlvoE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_qz4qk05_Eea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_qz5RoE5_Eea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_qz5RoU5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_qz5Rok5_Eea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_tTHGEE5_Eea8mczBvLtT0g" type="3012" element="_tSxH0E5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_tTHtIE5_Eea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_tTHtIU5_Eea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_tTHtIk5_Eea8mczBvLtT0g" type="3005" element="_tSxu4E5_Eea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_tTHtI05_Eea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tTHtJE5_Eea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_tTHGEU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tTHGEk5_Eea8mczBvLtT0g" x="29" y="49" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_qz4qkU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qz4qkk5_Eea8mczBvLtT0g" x="276" y="239" width="63" height="59"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_ss5aoE5_Eea8mczBvLtT0g" type="3008" element="_ssmfsE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_ss6BsE5_Eea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_ss6BsU5_Eea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ss6Bsk5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ss6owE5_Eea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_tyHWQE5_Eea8mczBvLtT0g" type="3012" element="_tx1CYE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_tyH9UE5_Eea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_tyH9UU5_Eea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_tyJLcE5_Eea8mczBvLtT0g" type="3005" element="_tx1CYU5_Eea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_tyJLcU5_Eea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tyJLck5_Eea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_tyHWQU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tyHWQk5_Eea8mczBvLtT0g" x="25" y="3" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_ss5aoU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ss5aok5_Eea8mczBvLtT0g" x="282" y="324" width="60" height="60"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_8DX1YE5_Eea8mczBvLtT0g" type="3008" element="_8DGvoE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_8DYccE5_Eea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_8DYccU5_Eea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8DYcck5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8DYcc05_Eea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_99L2sE5_Eea8mczBvLtT0g" type="3012" element="_9847wE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_99L2s05_Eea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_99L2tE5_Eea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_99MdwE5_Eea8mczBvLtT0g" type="3005" element="_985i0E5_Eea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_99MdwU5_Eea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_99Mdwk5_Eea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_99L2sU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_99L2sk5_Eea8mczBvLtT0g" x="46" y="26" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_8DX1YU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8DX1Yk5_Eea8mczBvLtT0g" x="75" y="373" width="56" height="56"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_9D9vsE5_Eea8mczBvLtT0g" type="3008" element="_9Drb0E5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_9D9vs05_Eea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_9D-WwE5_Eea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_9D-WwU5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_9D-Wwk5_Eea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_9htboE5_Eea8mczBvLtT0g" type="3012" element="_9hVoME5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_9huCsE5_Eea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_9huCsU5_Eea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_9huCsk5_Eea8mczBvLtT0g" type="3005" element="_9hWPQE5_Eea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_9huCs05_Eea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9huCtE5_Eea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_9htboU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9htbok5_Eea8mczBvLtT0g" x="3" y="26" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_9D9vsU5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9D9vsk5_Eea8mczBvLtT0g" x="159" y="375" width="52" height="52"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_Hov9EE6AEea8mczBvLtT0g" type="3008" element="_Hob0AE6AEea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_Hov9E06AEea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_HowkIE6AEea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_HowkIU6AEea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_HowkIk6AEea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_J4bgsE6AEea8mczBvLtT0g" type="3012" element="_J4GJgE6AEea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_J4bgs06AEea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_J4bgtE6AEea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_J4bgtU6AEea8mczBvLtT0g" type="3005" element="_J4GJgU6AEea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_J4bgtk6AEea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_J4bgt06AEea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_J4bgsU6AEea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_J4bgsk6AEea8mczBvLtT0g" x="31" y="50" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_Hov9EU6AEea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Hov9Ek6AEea8mczBvLtT0g" x="399" y="239" width="60" height="60"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_I3yjEE6AEea8mczBvLtT0g" type="3008" element="_I3WeME6AEea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_I3zKIE6AEea8mczBvLtT0g" type="5005"/>
+ <children xmi:type="notation:Node" xmi:id="_I3zKIU6AEea8mczBvLtT0g" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_I3zKIk6AEea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_I3zKI06AEea8mczBvLtT0g"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_JciO4E6AEea8mczBvLtT0g" type="3012" element="_JcOs4E6AEea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_Jci18E6AEea8mczBvLtT0g" type="5010">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Jci18U6AEea8mczBvLtT0g" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_Jci18k6AEea8mczBvLtT0g" type="3005" element="_JcOs4U6AEea8mczBvLtT0g">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_Jci1806AEea8mczBvLtT0g" fontName="Segoe UI"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Jci19E6AEea8mczBvLtT0g"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_JciO4U6AEea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JciO4k6AEea8mczBvLtT0g" x="27" y="3" width="5" height="5"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_I3yjEU6AEea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_I3yjEk6AEea8mczBvLtT0g" x="403" y="330" width="56" height="49"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rLFw4U2TEeakleECKSbEyQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rLFw4k2TEeakleECKSbEyQ"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_rK9OAU2TEeakleECKSbEyQ" fontName="Segoe UI" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rK9OAk2TEeakleECKSbEyQ" x="-220" y="-35" width="1297" height="1063"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_rK4Vgk2TEeakleECKSbEyQ"/>
+ <edges xmi:type="notation:Edge" xmi:id="_3CkCcE3FEeapKa6g4htD_Q" type="4001" element="_3CYcQE3FEeapKa6g4htD_Q" source="_rLgAkE2TEeakleECKSbEyQ" target="_rLVBcE2TEeakleECKSbEyQ">
+ <children xmi:type="notation:Node" xmi:id="_3Cl3oE3FEeapKa6g4htD_Q" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3Cl3oU3FEeapKa6g4htD_Q" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_3CmesE3FEeapKa6g4htD_Q" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3CnFwE3FEeapKa6g4htD_Q" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_3Cns0E3FEeapKa6g4htD_Q" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3Cns0U3FEeapKa6g4htD_Q" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_3CkpgE3FEeapKa6g4htD_Q"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_3CkpgU3FEeapKa6g4htD_Q" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3Ckpgk3FEeapKa6g4htD_Q" points="[-2, 0, 54, -1]$[-53, 0, 3, -1]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3CoT4E3FEeapKa6g4htD_Q" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_3CoT4U3FEeapKa6g4htD_Q" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_4N_60E3FEeapKa6g4htD_Q" type="4001" element="_4N5NIE3FEeapKa6g4htD_Q" source="_NZ1YsE3BEeaLwfxB3LP_RQ" target="_OFI_gE3BEeaLwfxB3LP_RQ">
+ <children xmi:type="notation:Node" xmi:id="_4N_61E3FEeapKa6g4htD_Q" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4N_61U3FEeapKa6g4htD_Q" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_4OAh4E3FEeapKa6g4htD_Q" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4OAh4U3FEeapKa6g4htD_Q" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_4OAh4k3FEeapKa6g4htD_Q" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4OAh403FEeapKa6g4htD_Q" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_4N_60U3FEeapKa6g4htD_Q"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_4N_60k3FEeapKa6g4htD_Q" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_4N_6003FEeapKa6g4htD_Q" points="[-2, 0, 43, -3]$[-42, 2, 3, -1]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_4OAh5E3FEeapKa6g4htD_Q" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_4OAh5U3FEeapKa6g4htD_Q" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_F9hcEE5ZEeaITJAJbUiGEA" type="4001" element="_F9HMYE5ZEeaITJAJbUiGEA" source="_CMn9UE5ZEeaITJAJbUiGEA" target="_CrGCAE5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_F9kfYE5ZEeaITJAJbUiGEA" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F9kfYU5ZEeaITJAJbUiGEA" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_F9m7oE5ZEeaITJAJbUiGEA" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F9nisE5ZEeaITJAJbUiGEA" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_F9nisU5ZEeaITJAJbUiGEA" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F9nisk5ZEeaITJAJbUiGEA" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_F9hcEU5ZEeaITJAJbUiGEA"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_F9hcEk5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_F9hcE05ZEeaITJAJbUiGEA" points="[0, 3, 0, -65]$[0, 66, 0, -2]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_F9qmAE5ZEeaITJAJbUiGEA" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_F9qmAU5ZEeaITJAJbUiGEA" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_a-psgE5ZEeaITJAJbUiGEA" type="4001" element="_a-SgIE5ZEeaITJAJbUiGEA" source="_QyPi4E5ZEeaITJAJbUiGEA" target="_QVtX4E5ZEeaITJAJbUiGEA">
+ <children xmi:type="notation:Node" xmi:id="_a-qTkE5ZEeaITJAJbUiGEA" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_a-qTkU5ZEeaITJAJbUiGEA" x="9" y="-9"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_a-qTkk5ZEeaITJAJbUiGEA" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_a-qTk05ZEeaITJAJbUiGEA" x="2" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_a-qTlE5ZEeaITJAJbUiGEA" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_a-qTlU5ZEeaITJAJbUiGEA" x="-2" y="12"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_a-psgU5ZEeaITJAJbUiGEA"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_a-psgk5ZEeaITJAJbUiGEA" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_a-psg05ZEeaITJAJbUiGEA" points="[0, 0, -2, -35]$[1, 33, -1, -2]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a-q6oE5ZEeaITJAJbUiGEA" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a-q6oU5ZEeaITJAJbUiGEA" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_ZT4-kE5_Eea8mczBvLtT0g" type="4001" element="_ZTeu4E5_Eea8mczBvLtT0g" source="_Vw-RcE5_Eea8mczBvLtT0g" target="_VNDsEE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_ZT6MsE5_Eea8mczBvLtT0g" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b8ib0E5_Eea8mczBvLtT0g" x="-2" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_ZT6zwE5_Eea8mczBvLtT0g" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b8ib0U5_Eea8mczBvLtT0g" x="-11" y="-2"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_ZT7a0E5_Eea8mczBvLtT0g" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b8ib0k5_Eea8mczBvLtT0g" x="15"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_ZT4-kU5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_ZT4-kk5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ZT4-k05_Eea8mczBvLtT0g" points="[0, -2, 40, 1]$[0, -31, 40, -28]$[-40, -31, 0, -28]$[-40, -5, 0, -2]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ZT8B4E5_Eea8mczBvLtT0g" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ZT8B4U5_Eea8mczBvLtT0g" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_vYNKUE5_Eea8mczBvLtT0g" type="4001" element="_vX5oUE5_Eea8mczBvLtT0g" source="_tTHGEE5_Eea8mczBvLtT0g" target="_tyHWQE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_vYNxYE5_Eea8mczBvLtT0g" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYNxYU5_Eea8mczBvLtT0g" x="-21" y="7"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_vYNxYk5_Eea8mczBvLtT0g" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYNxY05_Eea8mczBvLtT0g" x="2" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_vYNxZE5_Eea8mczBvLtT0g" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vYNxZU5_Eea8mczBvLtT0g" x="1" y="-10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_vYNKUU5_Eea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_vYNKUk5_Eea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vYNKU05_Eea8mczBvLtT0g" points="[0, -1, -2, -40]$[32, 0, 30, -39]$[32, 39, 30, 0]$[2, 39, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vYNxZk5_Eea8mczBvLtT0g" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vYNxZ05_Eea8mczBvLtT0g" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_AcOE8E6AEea8mczBvLtT0g" type="4001" element="_Ab6i8E6AEea8mczBvLtT0g" source="_9htboE5_Eea8mczBvLtT0g" target="_99L2sE5_Eea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_AcOsAE6AEea8mczBvLtT0g" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AcOsAU6AEea8mczBvLtT0g" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_AcOsAk6AEea8mczBvLtT0g" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AcOsA06AEea8mczBvLtT0g" x="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_AcOsBE6AEea8mczBvLtT0g" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AcOsBU6AEea8mczBvLtT0g" x="-6"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_AcOE8U6AEea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_AcOE8k6AEea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_AcOE806AEea8mczBvLtT0g" points="[-1, 0, 40, 2]$[0, 35, 41, 37]$[-41, 35, 0, 37]$[-41, -2, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_AcOsBk6AEea8mczBvLtT0g" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_AcOsB06AEea8mczBvLtT0g" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_LXccYE6AEea8mczBvLtT0g" type="4001" element="_LXHFME6AEea8mczBvLtT0g" source="_J4bgsE6AEea8mczBvLtT0g" target="_JciO4E6AEea8mczBvLtT0g">
+ <children xmi:type="notation:Node" xmi:id="_LXdDcE6AEea8mczBvLtT0g" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LXdDcU6AEea8mczBvLtT0g" x="-25" y="-7"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_LXdDck6AEea8mczBvLtT0g" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LXdDc06AEea8mczBvLtT0g" x="-4" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_LXdDdE6AEea8mczBvLtT0g" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LXdDdU6AEea8mczBvLtT0g" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_LXccYU6AEea8mczBvLtT0g"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_LXccYk6AEea8mczBvLtT0g" fontName="Segoe UI" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_LXccY06AEea8mczBvLtT0g" points="[-2, -1, -2, -45]$[-39, 0, -39, -44]$[-39, 44, -39, 0]$[-2, 43, -2, -1]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LXdDdk6AEea8mczBvLtT0g" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LXdDd06AEea8mczBvLtT0g" id="(0.5,0.5)"/>
+ </edges>
+ </data>
+ </ownedAnnotationEntries>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_rKpE802TEeakleECKSbEyQ" name="subpackage1">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_rKpE9E2TEeakleECKSbEyQ" borderSize="1" borderSizeComputationExpression="1" backgroundColor="204,242,166">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']"/>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_rKpE9U2TEeakleECKSbEyQ" name="sp3">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp3"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp3"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_rKpE9k2TEeakleECKSbEyQ" name="C1" incomingEdges="_3CYcQE3FEeapKa6g4htD_Q" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp3/C1"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp3/C1"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_rKpE902TEeakleECKSbEyQ" borderColor="166,193,152" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <customFeatures>borderColor</customFeatures>
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_rKpE-E2TEeakleECKSbEyQ" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_rKpE-U2TEeakleECKSbEyQ" name="sp4">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp4"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp4"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_rKpE-k2TEeakleECKSbEyQ" name="C2" outgoingEdges="_3CYcQE3FEeapKa6g4htD_Q" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp4/C2"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp4/C2"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_rKpE-02TEeakleECKSbEyQ" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_rKpE_E2TEeakleECKSbEyQ" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_rKpE_U2TEeakleECKSbEyQ" name="sp5">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp5"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp5"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_rKpE_k2TEeakleECKSbEyQ" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_rKpE_02TEeakleECKSbEyQ" name="sp6">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp6"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp6"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_OFBDsE3BEeaLwfxB3LP_RQ" name="C4" incomingEdges="_4N5NIE3FEeapKa6g4htD_Q" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp6/C4"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp6/C4"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_OFBDsU3BEeaLwfxB3LP_RQ" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_rKpFAE2TEeakleECKSbEyQ" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_rKpFAU2TEeakleECKSbEyQ" name="sp7">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp7"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp7"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_NZsOwE3BEeaLwfxB3LP_RQ" name="C3" outgoingEdges="_4N5NIE3FEeapKa6g4htD_Q" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp7/C3"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp7/C3"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_NZs10E3BEeaLwfxB3LP_RQ" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_rKpFAk2TEeakleECKSbEyQ" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_9agSIE5YEeaITJAJbUiGEA" name="sp8">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp8"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp8"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_CMVCYE5ZEeaITJAJbUiGEA" name="C6" outgoingEdges="_F9HMYE5ZEeaITJAJbUiGEA" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp8/C6"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp8/C6"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_CMVCYU5ZEeaITJAJbUiGEA" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_9ag5ME5YEeaITJAJbUiGEA" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="__IQNYE5YEeaITJAJbUiGEA" name="sp9">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp9"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp9"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_Cq2KYE5ZEeaITJAJbUiGEA" name="C7" incomingEdges="_F9HMYE5ZEeaITJAJbUiGEA" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp9/C7"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp9/C7"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_Cq2KYU5ZEeaITJAJbUiGEA" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="__IQNYU5YEeaITJAJbUiGEA" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_NozFsE5ZEeaITJAJbUiGEA" name="sp10">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp10"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp10"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_Qx_rQE5ZEeaITJAJbUiGEA" name="C9" outgoingEdges="_a-SgIE5ZEeaITJAJbUiGEA" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp10/C9"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp10/C9"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_QyASUE5ZEeaITJAJbUiGEA" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_NozFsU5ZEeaITJAJbUiGEA" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_O3DBgE5ZEeaITJAJbUiGEA" name="sp11">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp11"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp11"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_QVeHUE5ZEeaITJAJbUiGEA" name="C8" incomingEdges="_a-SgIE5ZEeaITJAJbUiGEA" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp11/C8"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp11/C8"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_QVeuYE5ZEeaITJAJbUiGEA" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_O3DokE5ZEeaITJAJbUiGEA" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_SsbiYE5_Eea8mczBvLtT0g" name="sp12">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp12"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp12"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_VMvjAE5_Eea8mczBvLtT0g" name="C10" incomingEdges="_ZTeu4E5_Eea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp12/C10"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp12/C10"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_VMwKEE5_Eea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_SscwgE5_Eea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_T_1rAE5_Eea8mczBvLtT0g" name="sp13">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp13"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp13"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_Vwko0E5_Eea8mczBvLtT0g" name="C11" outgoingEdges="_ZTeu4E5_Eea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp13/C11"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp13/C11"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_Vwko0U5_Eea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_T_2SEE5_Eea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_qzlvoE5_Eea8mczBvLtT0g" name="sp14">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp14"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp14"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_tSxH0E5_Eea8mczBvLtT0g" name="C12" outgoingEdges="_vX5oUE5_Eea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp14/C12"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp14/C12"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_tSxu4E5_Eea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_qzlvoU5_Eea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_ssmfsE5_Eea8mczBvLtT0g" name="sp15">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp15"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp15"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_tx1CYE5_Eea8mczBvLtT0g" name="C13" incomingEdges="_vX5oUE5_Eea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp15/C13"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp15/C13"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_tx1CYU5_Eea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_ssnGwE5_Eea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_8DGvoE5_Eea8mczBvLtT0g" name="sp16">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp16"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp16"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_9847wE5_Eea8mczBvLtT0g" name="C15" incomingEdges="_Ab6i8E6AEea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp16/C15"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp16/C15"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_985i0E5_Eea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_8DHWsE5_Eea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_9Drb0E5_Eea8mczBvLtT0g" name="sp17">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp17"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp17"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_9hVoME5_Eea8mczBvLtT0g" name="C14" outgoingEdges="_Ab6i8E6AEea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp17/C14"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp17/C14"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_9hWPQE5_Eea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_9DsC4E5_Eea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_Hob0AE6AEea8mczBvLtT0g" name="sp18">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp18"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp18"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_J4GJgE6AEea8mczBvLtT0g" name="C17" outgoingEdges="_LXHFME6AEea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp18/C17"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp18/C17"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_J4GJgU6AEea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_HocbEE6AEea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_I3WeME6AEea8mczBvLtT0g" name="sp19">
+ <target xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp19"/>
+ <semanticElements xmi:type="ecore:EPackage" href="3358.ecore#//subpackage1/sp19"/>
+ <ownedBorderedNodes xmi:type="diagram:DNode" xmi:id="_JcOs4E6AEea8mczBvLtT0g" name="C16" incomingEdges="_LXHFME6AEea8mczBvLtT0g" width="-1" height="-1" resizeKind="NSEW">
+ <target xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp19/C16"/>
+ <semanticElements xmi:type="ecore:EClass" href="3358.ecore#//subpackage1/sp19/C16"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_JcOs4U6AEea8mczBvLtT0g" labelPosition="node" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <description xmi:type="style:WorkspaceImageDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']"/>
+ </ownedBorderedNodes>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_I3WeMU6AEea8mczBvLtT0g" borderSize="1" borderSizeComputationExpression="1">
+ <description xmi:type="style:FlatContainerStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@style"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']"/>
+ </ownedDiagramElements>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_3CYcQE3FEeapKa6g4htD_Q" sourceNode="_rKpE-k2TEeakleECKSbEyQ" targetNode="_rKpE9k2TEeakleECKSbEyQ">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp4/C2/ref2"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp4/C2/ref2"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_3CZDUE3FEeapKa6g4htD_Q" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_3CZDUU3FEeapKa6g4htD_Q"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_4N5NIE3FEeapKa6g4htD_Q" sourceNode="_NZsOwE3BEeaLwfxB3LP_RQ" targetNode="_OFBDsE3BEeaLwfxB3LP_RQ">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp7/C3/ref3"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp7/C3/ref3"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_4N5NIU3FEeapKa6g4htD_Q" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_4N5NIk3FEeapKa6g4htD_Q"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_F9HMYE5ZEeaITJAJbUiGEA" sourceNode="_CMVCYE5ZEeaITJAJbUiGEA" targetNode="_Cq2KYE5ZEeaITJAJbUiGEA">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp8/C6/ref4"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp8/C6/ref4"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_F9HMYU5ZEeaITJAJbUiGEA" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_F9HMYk5ZEeaITJAJbUiGEA"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_a-SgIE5ZEeaITJAJbUiGEA" sourceNode="_Qx_rQE5ZEeaITJAJbUiGEA" targetNode="_QVeHUE5ZEeaITJAJbUiGEA">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp10/C9/ref5"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp10/C9/ref5"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_a-SgIU5ZEeaITJAJbUiGEA" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_a-SgIk5ZEeaITJAJbUiGEA"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_ZTeu4E5_Eea8mczBvLtT0g" sourceNode="_Vwko0E5_Eea8mczBvLtT0g" targetNode="_VMvjAE5_Eea8mczBvLtT0g">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp13/C11/ref6"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp13/C11/ref6"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_ZTfV8E5_Eea8mczBvLtT0g" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_ZTfV8U5_Eea8mczBvLtT0g"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_vX5oUE5_Eea8mczBvLtT0g" sourceNode="_tSxH0E5_Eea8mczBvLtT0g" targetNode="_tx1CYE5_Eea8mczBvLtT0g">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp14/C12/ref7"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp14/C12/ref7"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_vX5oUU5_Eea8mczBvLtT0g" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_vX5oUk5_Eea8mczBvLtT0g"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_Ab6i8E6AEea8mczBvLtT0g" sourceNode="_9hVoME5_Eea8mczBvLtT0g" targetNode="_9847wE5_Eea8mczBvLtT0g">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp17/C14/ref8"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp17/C14/ref8"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_Ab6i8U6AEea8mczBvLtT0g" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_Ab6i8k6AEea8mczBvLtT0g"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_LXHFME6AEea8mczBvLtT0g" sourceNode="_J4GJgE6AEea8mczBvLtT0g" targetNode="_JcOs4E6AEea8mczBvLtT0g">
+ <target xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp18/C17/ref9"/>
+ <semanticElements xmi:type="ecore:EReference" href="3358.ecore#//subpackage1/sp18/C17/ref9"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_LXHFMU6AEea8mczBvLtT0g" size="2" centered="Both">
+ <description xmi:type="style:EdgeStyleDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']/@style"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_LXHFMk6AEea8mczBvLtT0g"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']"/>
+ </ownedDiagramElements>
+ <description xmi:type="description_1:DiagramDescription" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']"/>
+ <filterVariableHistory xmi:type="diagram:FilterVariableHistory" xmi:id="_rKpFBk2TEeakleECKSbEyQ"/>
+ <activatedLayers xmi:type="description_1:Layer" href="3358.odesign#//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer"/>
+ <target xmi:type="ecore:EPackage" href="3358.ecore#/"/>
+ </ownedRepresentations>
+ </ownedViews>
+</viewpoint:DAnalysis>
diff --git a/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.ecore b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.ecore
new file mode 100644
index 0000000..8498652
--- /dev/null
+++ b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.ecore
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage 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" name="package" nsURI="package" nsPrefix="package">
+ <eSubpackages name="subpackage1" nsURI="subpackage1" nsPrefix="subpackage1">
+ <eSubpackages name="sp3">
+ <eClassifiers xsi:type="ecore:EClass" name="C1"/>
+ </eSubpackages>
+ <eSubpackages name="sp4">
+ <eClassifiers xsi:type="ecore:EClass" name="C2">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref2" eType="#//subpackage1/sp3/C1"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp5"/>
+ <eSubpackages name="sp6">
+ <eClassifiers xsi:type="ecore:EClass" name="C4"/>
+ </eSubpackages>
+ <eSubpackages name="sp7">
+ <eClassifiers xsi:type="ecore:EClass" name="C3">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref3" eType="#//subpackage1/sp6/C4"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp8">
+ <eClassifiers xsi:type="ecore:EClass" name="C6">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref4" eType="#//subpackage1/sp9/C7"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp9">
+ <eClassifiers xsi:type="ecore:EClass" name="C7"/>
+ </eSubpackages>
+ <eSubpackages name="sp10">
+ <eClassifiers xsi:type="ecore:EClass" name="C9">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref5" eType="#//subpackage1/sp11/C8"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp11">
+ <eClassifiers xsi:type="ecore:EClass" name="C8"/>
+ </eSubpackages>
+ <eSubpackages name="sp12">
+ <eClassifiers xsi:type="ecore:EClass" name="C10"/>
+ </eSubpackages>
+ <eSubpackages name="sp13">
+ <eClassifiers xsi:type="ecore:EClass" name="C11">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref6" eType="#//subpackage1/sp12/C10"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp14">
+ <eClassifiers xsi:type="ecore:EClass" name="C12">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref7" eType="#//subpackage1/sp15/C13"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp15">
+ <eClassifiers xsi:type="ecore:EClass" name="C13"/>
+ </eSubpackages>
+ <eSubpackages name="sp16">
+ <eClassifiers xsi:type="ecore:EClass" name="C15"/>
+ </eSubpackages>
+ <eSubpackages name="sp17">
+ <eClassifiers xsi:type="ecore:EClass" name="C14">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref8" eType="#//subpackage1/sp16/C15"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp18">
+ <eClassifiers xsi:type="ecore:EClass" name="C17">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref9" eType="#//subpackage1/sp19/C16"/>
+ </eClassifiers>
+ </eSubpackages>
+ <eSubpackages name="sp19">
+ <eClassifiers xsi:type="ecore:EClass" name="C16"/>
+ </eSubpackages>
+ </eSubpackages>
+</ecore:EPackage>
diff --git a/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.odesign b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.odesign
new file mode 100644
index 0000000..f283c92
--- /dev/null
+++ b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/3358.odesign
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<description:Group xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:tool="http://www.eclipse.org/sirius/diagram/description/tool/1.1.0" xmlns:tool_1="http://www.eclipse.org/sirius/description/tool/1.1.0" name="SmallBorderedNodes" version="11.0.0.201601261200">
+ <ownedViewpoints name="3358" modelFileExtension="*.ecore">
+ <ownedRepresentations xsi:type="description_1:DiagramDescription" name="diagram_3358" domainClass="ecore.EPackage" enablePopupBars="true">
+ <metamodel href="http://www.eclipse.org/emf/2002/Ecore#/"/>
+ <defaultLayer name="Default">
+ <edgeMappings name="EReference" sourceMapping="//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass'] //@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']" targetMapping="//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass'] //@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']" targetFinderExpression="aql:self.eType" sourceFinderExpression="aql:self.eContainer()" domainClass="ecore.EReference" useDomainElement="true">
+ <style sizeComputationExpression="2" endsCentering="Both">
+ <strokeColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='gray']"/>
+ <centerLabelStyleDescription>
+ <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ </style>
+ </edgeMappings>
+ <containerMappings name="container" semanticCandidatesExpression="aql:self.eContents()->first()" domainClass="ecore.EPackage">
+ <subContainerMappings name="SubPackage" semanticCandidatesExpression="aql:self.eContents()" domainClass="ecore.EPackage">
+ <borderedNodeMappings name="EClass" semanticCandidatesExpression="feature:eContents" domainClass="ecore.EClass">
+ <style xsi:type="style:WorkspaceImageDescription" sizeComputationExpression="-1" labelPosition="node" resizeKind="NSEW" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </style>
+ </borderedNodeMappings>
+ <style xsi:type="style:FlatContainerStyleDescription" borderSizeComputationExpression="1">
+ <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='white']"/>
+ <foregroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='light_gray']"/>
+ </style>
+ </subContainerMappings>
+ <style xsi:type="style:FlatContainerStyleDescription" borderSizeComputationExpression="1">
+ <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='light_green']"/>
+ <foregroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='light_gray']"/>
+ </style>
+ </containerMappings>
+ <containerMappings name="SubPackage" semanticCandidatesExpression="aql:self.eContents()->excluding(self.eContents()->first())" domainClass="ecore.EPackage">
+ <borderedNodeMappings name="EClass" semanticCandidatesExpression="aql:self.eContents()" domainClass="ecore.EClass">
+ <style xsi:type="style:WorkspaceImageDescription" sizeComputationExpression="-1" labelPosition="node" resizeKind="NSEW" workspacePath="/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png">
+ <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </style>
+ </borderedNodeMappings>
+ <style xsi:type="style:FlatContainerStyleDescription" borderSizeComputationExpression="1">
+ <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='white']"/>
+ <foregroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='light_gray']"/>
+ </style>
+ </containerMappings>
+ <toolSections name="Tools">
+ <ownedTools xsi:type="tool:ContainerCreationDescription" name="CreatePackage" containerMappings="//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container'] //@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='SubPackage'] //@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']">
+ <variable name="container"/>
+ <viewVariable name="containerView"/>
+ <initialOperation>
+ <firstModelOperations xsi:type="tool_1:CreateInstance" typeName="ecore.EPackage" referenceName="eSubpackages">
+ <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:instance">
+ <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="aql:'sp'.concat((self.eResource().getContents()->first().eAllContents()->filter(ecore::EPackage)->size()+1).toString())"/>
+ </subModelOperations>
+ </firstModelOperations>
+ </initialOperation>
+ </ownedTools>
+ <ownedTools xsi:type="tool:NodeCreationDescription" name="CreateEClass" nodeMappings="//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass'] //@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@containerMappings[name='container']/@subContainerMappings[name='SubPackage']/@borderedNodeMappings[name='EClass']">
+ <variable name="container"/>
+ <viewVariable name="containerView"/>
+ <initialOperation>
+ <firstModelOperations xsi:type="tool_1:CreateInstance" typeName="ecore.EClass" referenceName="eClassifiers">
+ <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:instance">
+ <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="aql:'C'.concat((self.eResource().getContents()->first().eAllContents()->filter(ecore::EClass)->size()+1).toString())"/>
+ </subModelOperations>
+ </firstModelOperations>
+ </initialOperation>
+ </ownedTools>
+ <ownedTools xsi:type="tool:EdgeCreationDescription" name="Creation Edge" edgeMappings="//@ownedViewpoints[name='3358']/@ownedRepresentations[name='diagram_3358']/@defaultLayer/@edgeMappings[name='EReference']">
+ <sourceVariable name="source"/>
+ <targetVariable name="target"/>
+ <sourceViewVariable name="sourceView"/>
+ <targetViewVariable name="targetView"/>
+ <initialOperation>
+ <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:source">
+ <subModelOperations xsi:type="tool_1:CreateInstance" typeName="ecore.EReference" referenceName="eReferences">
+ <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:instance">
+ <subModelOperations xsi:type="tool_1:SetValue" featureName="eType" valueExpression="var:target"/>
+ <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="aql:'ref'.concat((self.eResource().getContents()->first().eAllContents()->filter(ecore::EReference)->size()+1).toString())"/>
+ </subModelOperations>
+ </subModelOperations>
+ </firstModelOperations>
+ </initialOperation>
+ </ownedTools>
+ </toolSections>
+ </defaultLayer>
+ </ownedRepresentations>
+ </ownedViewpoints>
+</description:Group>
diff --git a/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png
new file mode 100644
index 0000000..36c440f
--- /dev/null
+++ b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png
Binary files differ
diff --git a/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/EdgeSelectionTest.java b/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/EdgeSelectionTest.java
new file mode 100644
index 0000000..0c16a28
--- /dev/null
+++ b/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/EdgeSelectionTest.java
@@ -0,0 +1,1099 @@
+/*******************************************************************************
+ * Copyright (c) 2016 THALES GLOBAL SERVICES.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.tests.swtbot;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.sirius.diagram.DDiagram;
+import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramEdgeEditPart;
+import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNode4EditPart;
+import org.eclipse.sirius.tests.swtbot.support.api.AbstractSiriusSwtBotGefTestCase;
+import org.eclipse.sirius.tests.swtbot.support.api.business.UIDiagramRepresentation.ZoomLevel;
+import org.eclipse.sirius.tests.swtbot.support.api.business.UILocalSession;
+import org.eclipse.sirius.tests.swtbot.support.api.business.UIResource;
+import org.eclipse.sirius.tests.swtbot.support.api.condition.CheckSelectedCondition;
+import org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditPart;
+
+/**
+ * Tests the method
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * . The returned edit part can be either the edge one or the source and target
+ * ones. It depends on the position of the mouse. If the mouse is over the node
+ * expanded until 20px or over the minimum selection zone around a small node
+ * and the edge box has a big enough selectable zone, then the node's part must
+ * be return. Otherwise, the edge part must be returned.
+ *
+ * The location given by {@link SWTBotSiriusDiagramEditor} are integer. The
+ * method tested uses precise. So when testing the selection limits between edge
+ * and nodes, it is possible to have a -1 or +1 regarding the case.
+ *
+ * @author pguilet
+ */
+public class EdgeSelectionTest extends AbstractSiriusSwtBotGefTestCase {
+
+ /**
+ * Number of pixels to remove or add from a mouse position to click on the
+ * last pixel of a node with a computed expanded zone in the side the edge
+ * is attached to it.
+ */
+ private static final int LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE = 7;
+
+ /**
+ * Number of pixels to remove or add from a mouse position to click on the
+ * first pixel of the edge after the last pixel of a node with a computed
+ * expanded zone.
+ */
+ private static final int LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE = 8;
+
+ private static final String FILE_DIR = "/";
+
+ private static final String VIEWPOINT_NAME = "3358";
+
+ private static final String DIAGRAM_INSTANCE_NAME = "diagram_3358";
+
+ private static final String DIAGRAM_DESCRIPTION = "diagram_3358";
+
+ private static final String MODEL_FILE = "3358.ecore";
+
+ private static final String SESSION_FILE = "3358.aird";
+
+ private static final String VSM_FILE = "3358.odesign";
+
+ private static final String DATA_UNIT_DIR = "data/unit/edgeSelection/";
+
+ private SWTBotSiriusDiagramEditor editor;
+
+ private UIResource sessionAirdResource;
+
+ private UILocalSession localSession;
+
+ @Override
+ protected void onSetUpBeforeClosingWelcomePage() throws Exception {
+ copyFileToTestProject(Activator.PLUGIN_ID, DATA_UNIT_DIR, MODEL_FILE, SESSION_FILE, VSM_FILE);
+ }
+
+ @Override
+ protected void onSetUpAfterOpeningDesignerPerspective() throws Exception {
+ sessionAirdResource = new UIResource(designerProject, FILE_DIR, SESSION_FILE);
+ localSession = designerPerspective.openSessionFromFile(sessionAirdResource, true);
+
+ }
+
+ private void openDiagram(String descriptionName, String instanceName, ZoomLevel zoomLevel) {
+ editor = (SWTBotSiriusDiagramEditor) openRepresentation(localSession.getOpenedSession(), descriptionName, instanceName, DDiagram.class);
+ editor.zoom(zoomLevel);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed horizontally. The edge
+ * has the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the last pixel of the expanded zone over the
+ * edge that is attached to the source node on the left side. The returned
+ * part must be the source node.
+ */
+ public void testSimpleCaseHorizontallyNodeSelectionEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C2");
+ Point sourceNodePartLocation = editor.getLocation(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+ editor.click(new Point(sourceNodePartLocation.x - LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE, sourceNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed horizontally. The edge
+ * has the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the first pixel after the last pixel of the
+ * expanded node zone over the edge. The returned part must be the edge one.
+ */
+ public void testSimpleCaseHorizontallyEdgeSelectionEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C2");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Point sourceNodePartLocation = editor.getLocation(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(sourceNodePartLocation.x - LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE, sourceNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed horizontally. The edge
+ * has not the minimum size of 20px to be considered as selectable whereas
+ * we have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the last pixel of the source node figure over
+ * the edge attached to it on the left side. The returned part must be the
+ * source node.
+ */
+ public void testSimpleCaseHorizontallyNodeSelectionEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C3");
+ Point sourceNodePartLocation = editor.getLocation(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+ // we add +1 because the absolute location has a number behind ','
+ editor.click(new Point(sourceNodePartLocation.x + 1, sourceNodePartLocation.y + 1));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed horizontally. The edge
+ * has not the minimum size of 20px to be considered as selectable whereas
+ * we have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the first pixel after the last pixel of the
+ * source node's left side. The returned part must be the edge one because
+ * we don't take in consideration the expanded nodes size in this situation
+ * to have a selectable edge.
+ */
+ public void testSimpleCaseHorizontallyEdgeSelectionEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C3");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Point sourceNodePartLocation = editor.getLocation(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(sourceNodePartLocation.x - 1, sourceNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case style *-----* : where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed vertically. The edge
+ * has the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the last pixel of the expanded zone over the
+ * edge that is attached to the target node on the right side. The returned
+ * part must be the target node.
+ */
+ public void testSimpleCaseHorizontallyTargetNodeSelectionEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C1");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ editor.click(new Point((targetNodePartLocation.x + targetNodePartLocation.width) + LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE, targetNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed horizontally. The edge
+ * has the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the first pixel after the last pixel of the
+ * expanded target node zone over the edge on the right side of the node.
+ * The returned part must be the edge one.
+ */
+ public void testSimpleCaseHorizontallyEdgeSelectionOnTargetNodeEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C1");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point((targetNodePartLocation.x + targetNodePartLocation.width) + LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE, targetNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed horizontally. The edge
+ * has not the minimum size of 20px to be considered as selectable whereas
+ * we have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the last pixel of the target node figure over
+ * the edge attached to it on the right side. The returned part must be the
+ * target node.
+ */
+ public void testSimpleCaseHorizontallyTargetNodeSelectionEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C4");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ editor.click(new Point((targetNodePartLocation.x + targetNodePartLocation.width) - 1, targetNodePartLocation.y + 1));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the right. The edge is displayed horizontally. The edge
+ * has not the minimum size of 20px to be considered as selectable whereas
+ * we have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the first pixel after the last pixel of the
+ * target node's right side. The returned part must be the edge one because
+ * we don't take in consideration the expanded nodes size in this situation
+ * to have a selectable edge.
+ */
+ public void testSimpleCaseHorizontallyEdgeSelectionOnTargetNodeEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C4");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point((targetNodePartLocation.x + targetNodePartLocation.width) + 1, targetNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * the minimum size of 20px to be considered as selectable whereas we have
+ * virtually expanded the node size from 5px to 20px to compute this area.
+ * Zoom is 75%, edge is in a container with scroll and main screen is also
+ * scrolled. We click on the last pixel of the expanded zone over the edge
+ * that is attached to the source node on the bottom side. The returned part
+ * must be the source node.
+ */
+ public void testSimpleCaseVerticallyNodeSelectionEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C6");
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+ editor.click(new Point(sourceNodePartLocation.x, (sourceNodePartLocation.y + sourceNodePartLocation.height) + LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * the minimum size of 20px to be considered as selectable whereas we have
+ * virtually expanded the node size from 5px to 20px to compute this area.
+ * Zoom is 75%, edge is in a container with scroll and main screen is also
+ * scrolled. We click on the first pixel after the last pixel of the
+ * expanded node zone over the edge at the bottom side. The returned part
+ * must be the edge one.
+ */
+ public void testSimpleCaseVerticallyEdgeSelectionEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C6");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(sourceNodePartLocation.x, (sourceNodePartLocation.y + sourceNodePartLocation.height) + LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * not the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the last pixel of the source node figure over
+ * the edge attached to it on the bottom side. The returned part must be the
+ * source node.
+ */
+ public void testSimpleCaseVerticallyNodeSelectionEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C6");
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+ // we add +1 because the absolute location has a number behind ','
+ editor.click(new Point(sourceNodePartLocation.x + 1, (sourceNodePartLocation.y + sourceNodePartLocation.height)));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * not the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the first pixel after the last pixel of the
+ * source node's bottom side. The returned part must be the edge one because
+ * we don't take in consideration the expanded nodes size in this situation
+ * to have a selectable edge.
+ */
+ public void testSimpleCaseVerticallyEdgeSelectionEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C9");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(sourceNodePartLocation.x, (sourceNodePartLocation.y + sourceNodePartLocation.height) + 1));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * the minimum size of 20px to be considered as selectable whereas we have
+ * virtually expanded the node size from 5px to 20px to compute this area.
+ * Zoom is 75%, edge is in a container with scroll and main screen is also
+ * scrolled. We click on the last pixel of the expanded zone over the edge
+ * that is attached to the target node on the top side. The returned part
+ * must be the target node.
+ */
+ public void testSimpleCaseVerticallyTargetNodeSelectionEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C7");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ editor.click(new Point(targetNodePartLocation.x, targetNodePartLocation.y - LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * the minimum size of 20px to be considered as selectable whereas we have
+ * virtually expanded the node size from 5px to 20px to compute this area.
+ * Zoom is 75%, edge is in a container with scroll and main screen is also
+ * scrolled. We click on the first pixel after the last pixel of the
+ * expanded target node zone over the edge on the top side of the node. The
+ * returned part must be the edge one.
+ */
+ public void testSimpleCaseVerticallyEdgeSelectionOnTargetNodeEdgeSelectableZonePresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C7");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(targetNodePartLocation.x, targetNodePartLocation.y - LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * not the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the last pixel of the target node figure over
+ * the edge attached to it on the top side. The returned part must be the
+ * target node.
+ */
+ public void testSimpleCaseVerticallyTargetNodeSelectionEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C8");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ // we add +1 because the absolute location has a number behind ','
+ editor.click(new Point(targetNodePartLocation.x + 1, targetNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ * Source node is on the top. The edge is displayed vertically. The edge has
+ * not the minimum size of 20px to be considered as selectable whereas we
+ * have virtually expanded the node size from 5px to 20px to compute this
+ * area. Zoom is 75%, edge is in a container with scroll and main screen is
+ * also scrolled. We click on the first pixel after the last pixel of the
+ * target node's at top side position. The returned part must be the edge
+ * one because we don't take in consideration the expanded nodes size in
+ * this situation to have a selectable edge.
+ */
+ public void testSimpleCaseVerticallyEdgeSelectionOnTargetNodeEdgeSelectableZoneNotPresent() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C8");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(targetNodePartLocation.x, targetNodePartLocation.y - 1));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the right. Nodes are images of 5px. Source node
+ * is on the top. The edge is displayed vertically. Zoom is 75%, edge is in
+ * a container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the right position of the union box of
+ * the two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the target node on the right side. The returned part must be
+ * the target node.
+ */
+ public void testTargetNodeSelectionWithExtraSelectableZoneAtRightPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C13");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ editor.click(new Point(targetNodePartLocation.x + targetNodePartLocation.width + LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE, targetNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the right. Nodes are images of 5px. Source node
+ * is on the top. The edge is displayed vertically. Zoom is 75%, edge is in
+ * a container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the right position of the union box of
+ * the two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the source node on the right side. The returned part must be
+ * the source node.
+ */
+ public void testSourceNodeSelectionWithExtraSelectableZoneAtRightPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C12");
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+
+ editor.click(new Point(sourceNodePartLocation.x + sourceNodePartLocation.width + LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE, sourceNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the right. Nodes are images of 5px. Source node
+ * is on the top. The edge is displayed vertically. Zoom is 75%, edge is in
+ * a container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the right position of the union box of
+ * the two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the source node on the right side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToSourceNodeWithExtraSelectableZoneAtRightPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C12");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ // we add +1 because the absolute location has a number behind ','
+ editor.click(new Point(sourceNodePartLocation.x + sourceNodePartLocation.width + LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE, sourceNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the right. Nodes are images of 5px. Source node
+ * is on the top. The edge is displayed vertically. Zoom is 75%, edge is in
+ * a container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the right position of the union box of
+ * the two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the target node on the right side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToTargetNodeWithExtraSelectableZoneAtRightPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C13");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(targetNodePartLocation.x + targetNodePartLocation.width + LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE, targetNodePartLocation.y - 1));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the left. Nodes are images of 5px. Source node is
+ * on the top. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the left position of the union box of
+ * the two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the target node on the left side. The returned part must be
+ * the target node.
+ */
+ public void testTargetNodeSelectionWithExtraSelectableZoneAtLeftPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C16");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ editor.click(new Point(targetNodePartLocation.x - LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE, targetNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the left. Nodes are images of 5px. Source node is
+ * on the top. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the left position of the union box of
+ * the two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the source node on the left side. The returned part must be
+ * the source node.
+ */
+ public void testSourceNodeSelectionWithExtraSelectableZoneAtLeftPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C17");
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+
+ editor.click(new Point(sourceNodePartLocation.x - LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE, sourceNodePartLocation.y + 2));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the left. Nodes are images of 5px. Source node is
+ * on the top. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the left position of the union box of
+ * the two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the source node on the left side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToSourceNodeWithExtraSelectableZoneAtLeftPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C17");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(sourceNodePartLocation.x - LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE, sourceNodePartLocation.y));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is vertically aligned to the source one and the top of
+ * the edge is oriented to the left. Nodes are images of 5px. Source node is
+ * on the top. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the left position of the union box of
+ * the two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the target node on the left side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToTargetNodeWithExtraSelectableZoneAtLeftPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C16");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(targetNodePartLocation.x - LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE, targetNodePartLocation.y - 1));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the top position of the union box of the
+ * two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the target node on the top side. The returned part must be
+ * the target node.
+ */
+ public void testTargetNodeSelectionWithExtraSelectableZoneAtTopPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C10");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ editor.click(new Point(targetNodePartLocation.x, targetNodePartLocation.y - LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the top position of the union box of the
+ * two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the source node on the down side. The returned part must be
+ * the source node.
+ */
+ public void testSourceNodeSelectionWithExtraSelectableZoneAtTopPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C11");
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+ editor.click(new Point(sourceNodePartLocation.x, sourceNodePartLocation.y - LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the top position of the union box of the
+ * two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the source node on the top side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToSourceNodeWithExtraSelectableZoneAtTopPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C11");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+
+ editor.click(new Point(sourceNodePartLocation.x, sourceNodePartLocation.y - LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the top position of the union box of the
+ * two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the target node on the down side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToTargetNodeWithExtraSelectableZoneAtTopPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C10");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(targetNodePartLocation.x, targetNodePartLocation.y - LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the bottom position of the union box of
+ * the two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the target node on the bottom side. The returned part must be
+ * the target node.
+ */
+ public void testTargetNodeSelectionWithExtraSelectableZoneAtBottomPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C15");
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, targetNodePart.part().getParent());
+ editor.click(new Point(targetNodePartLocation.x, targetNodePartLocation.y + targetNodePartLocation.height + LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the bottom position of the union box of
+ * the two nodes.
+ *
+ * We click on the last pixel of the expanded zone over the edge that is
+ * attached to the source node on the bottom side. The returned part must be
+ * the source node.
+ */
+ public void testSourceNodeSelectionWithExtraSelectableZoneAtBottomPosition() {
+
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C14");
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+ editor.click(new Point(sourceNodePartLocation.x, sourceNodePartLocation.y + sourceNodePartLocation.height + LENGTH_TO_REACH_LAST_PIXEL_OF_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the bottom position of the union box of
+ * the two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the source node on the bottom side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToSourceNodeWithExtraSelectableZoneAtBottomPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C14");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Rectangle sourceNodePartLocation = editor.getBounds(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+
+ editor.click(new Point(sourceNodePartLocation.x + 2, sourceNodePartLocation.y + sourceNodePartLocation.height + LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with the following case : ._|¨|_.
+ *
+ * The target node is horizontally aligned to the source one and the top of
+ * the edge is oriented to the top. Nodes are images of 5px. Source node is
+ * on the right. The edge is displayed vertically. Zoom is 75%, edge is in a
+ * container with scroll and main screen is also scrolled.
+ *
+ * The edge has not the minimum size of 20px to be considered as selectable
+ * whereas we have virtually expanded the node size from 5px to 20px to
+ * compute this area.
+ *
+ * But we have a selectable area at the bottom position of the union box of
+ * the two nodes.
+ *
+ * We click on the pixel after the last pixel of the expanded zone over the
+ * edge that is attached to the target node on the bottom side. The returned
+ * part must be the edge.
+ */
+ public void testEdgeSelectionNextToTargetNodeWithExtraSelectableZoneAtBottomPosition() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_75);
+
+ SWTBotGefEditPart targetNodePart = editor.getEditPart("C15");
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) targetNodePart.part().getParent()).getTargetConnections().get(0);
+ Rectangle targetNodePartLocation = editor.getBounds(targetNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(targetNodePartLocation.x, targetNodePartLocation.y + targetNodePartLocation.height + LENGTH_TO_REACH_FIRST_EDGE_PIXEL_AFTER_EXPANDED_NODE));
+ bot.waitUntil(checkc1Selected);
+
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ *
+ * Source node is on the right. The edge is displayed horizontally.
+ *
+ * The edge has the minimum size of 20px to be considered as selectable.
+ * area. Edge is in a container with scroll and main screen is also
+ * scrolled.
+ *
+ * Zoom is 400% making the node image to have a size of 20px that means no
+ * expanded zone is computed during selection.
+ *
+ * We click on the first pixel on the left side of the zoomed source node.
+ *
+ * The selecting element must be the source node.
+ */
+ public void testExpansionZoneWithZoomedImagesEdgeSelection() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_400);
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C2");
+ editor.reveal(sourceNodePart.part());
+ Point sourceNodePartLocation = editor.getLocation(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, sourceNodePart.part().getParent());
+ editor.click(new Point(sourceNodePartLocation.x + 1, sourceNodePartLocation.y + 1));
+ bot.waitUntil(checkc1Selected);
+ }
+
+ /**
+ *
+ * Tests the edge selection(
+ * {@link AbstractDiagramEdgeEditPart#getTargetEditPart(org.eclipse.gef.Request)}
+ * ) with a simple case : *----------* where the nodes are images of 5px.
+ *
+ * Source node is on the right. The edge is displayed horizontally.
+ *
+ * The edge has the minimum size of 20px to be considered as selectable.
+ * area. Edge is in a container with scroll and main screen is also
+ * scrolled.
+ *
+ * Zoom is 400% making the node image to have a size of 20px that means no
+ * expanded zone is computed during selection.
+ *
+ * We click on the pixel after the last pixel of the zoomed source node (at
+ * left).
+ *
+ * The selecting element must be the edge.
+ */
+ public void testExpansionZoneWithZoomedImagesSourceNodeSelection() {
+ openDiagram(DIAGRAM_DESCRIPTION, DIAGRAM_INSTANCE_NAME, ZoomLevel.ZOOM_400);
+
+ SWTBotGefEditPart sourceNodePart = editor.getEditPart("C2");
+ editor.reveal(sourceNodePart.part());
+ AbstractDiagramEdgeEditPart edgePart = (AbstractDiagramEdgeEditPart) ((DNode4EditPart) sourceNodePart.part().getParent()).getSourceConnections().get(0);
+ Point sourceNodePartLocation = editor.getLocation(sourceNodePart);
+
+ CheckSelectedCondition checkc1Selected = new CheckSelectedCondition(editor, edgePart);
+ editor.click(new Point(sourceNodePartLocation.x - 1, sourceNodePartLocation.y + 1));
+ bot.waitUntil(checkc1Selected);
+ }
+
+}
diff --git a/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/suite/AllTestSuite.java b/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/suite/AllTestSuite.java
index 927dd70..e79171c 100644
--- a/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/suite/AllTestSuite.java
+++ b/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/suite/AllTestSuite.java
@@ -152,6 +152,7 @@
suite.addTestSuite(LineStyleTest.class);
suite.addTestSuite(CompartmentsCreationTest.class);
suite.addTestSuite(CompartmentsDragAndDropTest.class);
+ suite.addTestSuite(EdgeSelectionTest.class);
}
/**
@@ -289,14 +290,15 @@
* the suite into which to add the tests.
*/
public static void addPart2(TestSuite suite) {
- // The ViewpointProjectCreationTest should be done before the others ones:
+ // The ViewpointProjectCreationTest should be done before the others
+ // ones:
// to verify the behavior when a specifier first launches the product.
suite.addTestSuite(ViewpointSpecificationProjectCreationTest.class);
-
+
addGerritPart2(suite);
STDSwtbotTestSuite.addPart2(suite);
TableSwtbotTestSuite.addPart2(suite);
-
+
suite.addTestSuite(CustomizationPropertySectionsTests.class);
suite.addTestSuite(GoToMarkerTraceabilityWithUserInteractionTest.class);
suite.addTestSuite(NoteCreationWithSnapToGridTest.class);