diff options
| author | pguilet | 2016-07-20 13:34:52 +0000 |
|---|---|---|
| committer | Steve Monnier | 2016-07-22 15:09:33 +0000 |
| commit | f7808468db2b9cb9b219e641f2be5903a7274148 (patch) | |
| tree | 96e0865dd600d0b476943dffdb9c5c14dd145ba3 | |
| parent | 7e837ed7e3790edb368a6682800f09b6dbb93cba (diff) | |
| download | org.eclipse.sirius-f7808468db2b9cb9b219e641f2be5903a7274148.tar.gz org.eclipse.sirius-f7808468db2b9cb9b219e641f2be5903a7274148.tar.xz org.eclipse.sirius-f7808468db2b9cb9b219e641f2be5903a7274148.zip | |
[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>
8 files changed, 2317 insertions, 27 deletions
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 43753233d0..1fd6cb71d1 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.api.requests.RequestConstants; 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 @@ import org.eclipse.swt.graphics.Image; 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 @@ public abstract class AbstractDiagramEdgeEditPart extends ConnectionNodeEditPart * 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 @@ public abstract class AbstractDiagramEdgeEditPart extends ConnectionNodeEditPart 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)) { - result = getSource(); + 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; } } - 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(); + // 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) { + // 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 cf3fa6f8bb..a1992a4c5c 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 @@ public class UIDiagramRepresentation extends AbstractUIRepresentation<SWTBotSiri 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 0000000000..9ce017c890 --- /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 0000000000..8498652860 --- /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 0000000000..f283c92081 --- /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 Binary files differnew file mode 100644 index 0000000000..36c440fc40 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.swtbot/data/unit/edgeSelection/smallImage.png 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 0000000000..0c16a28675 --- /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 927dd70c75..e79171c3b3 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 @@ public class AllTestSuite extends TestCase { suite.addTestSuite(LineStyleTest.class); suite.addTestSuite(CompartmentsCreationTest.class); suite.addTestSuite(CompartmentsDragAndDropTest.class); + suite.addTestSuite(EdgeSelectionTest.class); } /** @@ -289,14 +290,15 @@ public class AllTestSuite extends TestCase { * 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); |
