diff options
| author | Maxime Porhel | 2015-09-10 12:13:00 +0000 |
|---|---|---|
| committer | Maxime Porhel | 2015-09-11 09:55:21 +0000 |
| commit | c519ba977db3dc4fb31e1270883cabb4e650b2e6 (patch) | |
| tree | 3e4859f2c579701ac819d0ea39be2ada4fe0e49e | |
| parent | c22c95db074dc6f12790a0fd39ccaf2d460f13a3 (diff) | |
| download | org.eclipse.sirius-c519ba977db3dc4fb31e1270883cabb4e650b2e6.tar.gz org.eclipse.sirius-c519ba977db3dc4fb31e1270883cabb4e650b2e6.tar.xz org.eclipse.sirius-c519ba977db3dc4fb31e1270883cabb4e650b2e6.zip | |
[477049] Delegate edge creation and reconnection to the RegionContainer
. Delegates the edge creation request to the RegionContainer when there
is no executable creation command. The getCommand() method is called in
understand request to easily handle all cases:
getConnectionCreationCommand, getConnectionCompleteCommand,
EdgeCreationTool with(out) precondition, extra mappings, NoteAttachment.
. Always delegate the reconnect request to the RegionContainer.
Bug: 477049
Change-Id: Ic848d03bafa2cfcb4ce25708cfbccc6561431918
Signed-off-by: Maxime Porhel <maxime.porhel@obeo.fr>
4 files changed, 86 insertions, 14 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java index 4cffa47282..014d5bc0a5 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java @@ -69,10 +69,10 @@ import org.eclipse.sirius.diagram.ui.edit.internal.part.AbstractDiagramNodeEditP import org.eclipse.sirius.diagram.ui.edit.internal.part.DiagramContainerEditPartOperation; import org.eclipse.sirius.diagram.ui.edit.internal.part.DiagramElementEditPartOperation; import org.eclipse.sirius.diagram.ui.edit.internal.validators.ResizeValidator; -import org.eclipse.sirius.diagram.ui.graphical.edit.policies.SiriusGraphicalNodeEditPolicy; import org.eclipse.sirius.diagram.ui.internal.edit.parts.AbstractDiagramElementContainerNameEditPart; import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNode4EditPart; import org.eclipse.sirius.diagram.ui.internal.edit.policies.NonResizableAndNonDuplicableEditPolicy; +import org.eclipse.sirius.diagram.ui.internal.edit.policies.RegionGraphicalNodeEditPolicy; import org.eclipse.sirius.diagram.ui.internal.view.factories.ViewLocationHint; import org.eclipse.sirius.diagram.ui.tools.api.figure.AlphaDropShadowBorder; import org.eclipse.sirius.diagram.ui.tools.api.figure.FoldingToggleAwareClippingStrategy; @@ -190,11 +190,11 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo @Override protected void createDefaultEditPolicies() { super.createDefaultEditPolicies(); - // CompoundEditPolicy compoundEditPolicy = new CompoundEditPolicy(); - // compoundEditPolicy.addEditPolicy(new - // SiriusGraphicalNodeEditPolicy(getEditingDomain())); + AbstractDiagramNodeEditPartOperation.createDefaultEditPolicies(this); - installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new SiriusGraphicalNodeEditPolicy()); + if (isRegion()) { + installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new RegionGraphicalNodeEditPolicy()); + } installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy()); } @@ -862,7 +862,7 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo if (containerCompartment != null) { mainFigure.add(containerCompartment); } - + // Update drop shadow. mainFigure.setBorder(tmpFigure.getBorder()); } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SiriusGraphicalNodeEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SiriusGraphicalNodeEditPolicy.java index 8c2f1de2e9..531abbc85a 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SiriusGraphicalNodeEditPolicy.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SiriusGraphicalNodeEditPolicy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2015 THALES GLOBAL SERVICES. + * Copyright (c) 2007, 2015 THALES GLOBAL SERVICES and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -879,6 +879,9 @@ public class SiriusGraphicalNodeEditPolicy extends TreeGraphicalNodeEditPolicy { * the snapToGrid state. */ protected EdgeLayoutData getEdgeLayoutDataWithSnapToGrid(CreateConnectionRequest request, INodeEditPart sourceEditPart, INodeEditPart targetEditPart, Point sourceLocation, Point targetLocation) { + IGraphicalEditPart srcEditPart = (IGraphicalEditPart) sourceEditPart; + IGraphicalEditPart tgtEditPart = (IGraphicalEditPart) targetEditPart; + // Get the absolute source and target location but in 100% to facilitate // the computing Rectangle absoluteSourceBoundsIn100Percent = GraphicalHelper.getAbsoluteBoundsIn100Percent(sourceEditPart); @@ -888,12 +891,10 @@ public class SiriusGraphicalNodeEditPolicy extends TreeGraphicalNodeEditPolicy { // Compute intersection between the line (source location<-->target // location) and the source node - Option<Point> intersectionSourcePoint = GraphicalHelper.getIntersection(absoluteSourceLocationIn100Percent, absoluteTargetLocationIn100Percent, (IGraphicalEditPart) sourceEditPart, false, - true); + Option<Point> intersectionSourcePoint = GraphicalHelper.getIntersection(absoluteSourceLocationIn100Percent, absoluteTargetLocationIn100Percent, srcEditPart, false, true); // Compute intersection between the line (source location<-->target // location) and the target node - Option<Point> intersectionTargetPoint = GraphicalHelper.getIntersection(absoluteSourceLocationIn100Percent, absoluteTargetLocationIn100Percent, (IGraphicalEditPart) targetEditPart, true, - true); + Option<Point> intersectionTargetPoint = GraphicalHelper.getIntersection(absoluteSourceLocationIn100Percent, absoluteTargetLocationIn100Percent, tgtEditPart, true, true); // Compute the snap source location and the snap target location Point absoluteSourceLocationSnapIn100Percent; Point absoluteTargetLocationSnapIn100Percent; @@ -925,9 +926,9 @@ public class SiriusGraphicalNodeEditPolicy extends TreeGraphicalNodeEditPolicy { // Applied the zoom of the current diagram to set the pointList, the // source reference point and the target reference point. PrecisionPoint absoluteSourceLocationSnap = new PrecisionPoint(absoluteSourceLocationSnapIn100Percent); - GraphicalHelper.applyInverseZoomOnPoint((IGraphicalEditPart) sourceEditPart, absoluteSourceLocationSnap); + GraphicalHelper.applyInverseZoomOnPoint(srcEditPart, absoluteSourceLocationSnap); PrecisionPoint absoluteTargteLoactionSnap = new PrecisionPoint(absoluteTargetLocationSnapIn100Percent); - GraphicalHelper.applyInverseZoomOnPoint((IGraphicalEditPart) targetEditPart, absoluteTargteLoactionSnap); + GraphicalHelper.applyInverseZoomOnPoint(tgtEditPart, absoluteTargteLoactionSnap); edgeLayoutData.setSourceRefPoint(absoluteSourceLocationSnap); edgeLayoutData.setTargetRefPoint(absoluteTargteLoactionSnap); diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/AbstractDDiagramElementContainerItemSemanticEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/AbstractDDiagramElementContainerItemSemanticEditPolicy.java index eadba88acb..da77ba5bf2 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/AbstractDDiagramElementContainerItemSemanticEditPolicy.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/AbstractDDiagramElementContainerItemSemanticEditPolicy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2013 THALES GLOBAL SERVICES. + * Copyright (c) 2007, 2015 THALES GLOBAL SERVICES and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.sirius.diagram.ui.internal.edit.policies; +import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CompoundCommand; import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand; @@ -18,6 +19,7 @@ import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest; import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.sirius.diagram.DiagramPackage; +import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramElementContainerEditPart; import org.eclipse.sirius.diagram.ui.internal.edit.commands.DEdgeCreateCommand; import org.eclipse.sirius.diagram.ui.internal.edit.commands.DNode4CreateCommand; import org.eclipse.sirius.diagram.ui.internal.providers.SiriusElementTypes; @@ -94,4 +96,20 @@ public abstract class AbstractDDiagramElementContainerItemSemanticEditPolicy ext return null; } + @Override + public boolean understandsRequest(Request request) { + boolean understandsRequest = super.understandsRequest(request); + if (understandsRequest) { + // Reconnect is disabled on Regions: the reconnect tool does not + // handle extra source/target mapping and there is currently no + // other means to allow reconnect tools on the RegionContainer. + if (REQ_RECONNECT_SOURCE.equals(request.getType()) || REQ_RECONNECT_TARGET.equals(request.getType())) { + if (getHost() instanceof AbstractDiagramElementContainerEditPart) { + return !((AbstractDiagramElementContainerEditPart) getHost()).isRegion(); + } + } + } + return understandsRequest; + } + } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/RegionGraphicalNodeEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/RegionGraphicalNodeEditPolicy.java new file mode 100644 index 0000000000..7ea223dbd2 --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/RegionGraphicalNodeEditPolicy.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2015 Obeo. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.diagram.ui.internal.edit.policies; + +import org.eclipse.gef.EditPart; +import org.eclipse.gef.Request; +import org.eclipse.gef.commands.Command; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.sirius.diagram.DDiagramElementContainer; +import org.eclipse.sirius.diagram.business.internal.query.DDiagramElementContainerExperimentalQuery; +import org.eclipse.sirius.diagram.ui.graphical.edit.policies.SiriusGraphicalNodeEditPolicy; + +/** + * Specific graphical node policy for Regions: if an edge creation tool + * + * @author mporhel + */ +@SuppressWarnings("restriction") +public class RegionGraphicalNodeEditPolicy extends SiriusGraphicalNodeEditPolicy { + + @Override + public EditPart getTargetEditPart(Request request) { + EditPart targetEp = super.getTargetEditPart(request); + org.eclipse.gef.GraphicalEditPart host = (org.eclipse.gef.GraphicalEditPart) this.getHost(); + if (targetEp == host && host.getModel() instanceof View) { + View view = (View) host.getModel(); + if (view.getElement() instanceof DDiagramElementContainer && new DDiagramElementContainerExperimentalQuery((DDiagramElementContainer) view.getElement()).isRegion()) { + if (REQ_CONNECTION_START.equals(request.getType()) || REQ_CONNECTION_END.equals(request.getType())) { + // Delegate this request to the RegionContainer if there is + // no valid edge creation tool for this request. + Command command = getCommand(request); + if (command == null || !command.canExecute()) { + targetEp = null; + } + } else { + // Delegate all reconnect requests to the RegionContainer + // until ReconnectionEdgeDescription handles extra + // source/target mappings. + targetEp = null; + } + } + } + return targetEp; + } +} |
