diff options
Diffstat (limited to 'plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src')
20 files changed, 1238 insertions, 7 deletions
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractShortCutDiagramEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractShortCutDiagramEditPart.java index 47344d1dac7..3793f57eae0 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractShortCutDiagramEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractShortCutDiagramEditPart.java @@ -22,7 +22,6 @@ import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.gef.GraphicalEditPart; -import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.View; @@ -30,13 +29,14 @@ import org.eclipse.papyrus.infra.core.editorsfactory.IPageIconsRegistry; import org.eclipse.papyrus.infra.core.editorsfactory.PageIconsRegistry; import org.eclipse.papyrus.infra.core.services.ServiceException; import org.eclipse.papyrus.infra.gmfdiag.common.utils.ServiceUtilsForEditPart; +import org.eclipse.papyrus.uml.diagram.common.editparts.linkslf.LinksLFBorderedShapeEditPart; import org.eclipse.papyrus.uml.diagram.common.figure.node.DiagramNodeFigure; /** * this class is used to constraint the behavior of a node to obtain the * behavior a short cut */ -public abstract class AbstractShortCutDiagramEditPart extends AbstractBorderedShapeEditPart implements Adapter { +public abstract class AbstractShortCutDiagramEditPart extends LinksLFBorderedShapeEditPart implements Adapter { protected static final String DELETE_ICON = "icons/delete.gif"; diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/ClassifierEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/ClassifierEditPart.java index 09a4a9b3eea..44ca57d6452 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/ClassifierEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/ClassifierEditPart.java @@ -15,6 +15,7 @@ package org.eclipse.papyrus.uml.diagram.common.editparts; import org.eclipse.emf.common.notify.Notification; import org.eclipse.gmf.runtime.notation.FontStyle; import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.uml.diagram.common.editparts.linkslf.LinksLFNamedElementEditPart; import org.eclipse.papyrus.uml.diagram.common.figure.node.ClassifierFigure; import org.eclipse.papyrus.uml.diagram.common.helper.BasicClassifierCompartmentLayoutHelper; import org.eclipse.swt.SWT; @@ -27,7 +28,7 @@ import org.eclipse.uml2.uml.UMLPackage; * * @author tlandre */ -public abstract class ClassifierEditPart extends NamedElementEditPart { +public abstract class ClassifierEditPart extends LinksLFNamedElementEditPart/*Merge comment*/ { /** * isAbstract Classifier property diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/CompositeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/CompositeEditPart.java index 95bea0691c6..af1ebfc8544 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/CompositeEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/CompositeEditPart.java @@ -14,7 +14,6 @@ package org.eclipse.papyrus.uml.diagram.common.editparts; import org.eclipse.emf.common.notify.Notification; -import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart; import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; import org.eclipse.gmf.runtime.notation.FillStyle; import org.eclipse.gmf.runtime.notation.NotationPackage; @@ -22,12 +21,13 @@ import org.eclipse.gmf.runtime.notation.View; import org.eclipse.gmf.runtime.notation.datatype.GradientData; import org.eclipse.papyrus.infra.emf.appearance.helper.AppearanceHelper; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.IPapyrusNodeFigure; +import org.eclipse.papyrus.uml.diagram.common.editparts.linkslf.LinksLFBorderedShapeEditPart; import org.eclipse.swt.graphics.Color; /** * this uml edit part can refresh shadow and gradient. */ -public abstract class CompositeEditPart extends AbstractBorderedShapeEditPart { +public abstract class CompositeEditPart extends LinksLFBorderedShapeEditPart { public CompositeEditPart(View view) { super(view); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/DeploymentNodeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/DeploymentNodeEditPart.java index 45ad2a0826d..d484b9b16e2 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/DeploymentNodeEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/DeploymentNodeEditPart.java @@ -14,7 +14,6 @@ package org.eclipse.papyrus.uml.diagram.common.editparts; import org.eclipse.emf.common.notify.Notification; -import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart; import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; import org.eclipse.gmf.runtime.notation.FillStyle; import org.eclipse.gmf.runtime.notation.NotationPackage; @@ -22,9 +21,10 @@ import org.eclipse.gmf.runtime.notation.View; import org.eclipse.gmf.runtime.notation.datatype.GradientData; import org.eclipse.papyrus.infra.gmfdiag.common.editpart.IPapyrusEditPart; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.IPapyrusNodeFigure; +import org.eclipse.papyrus.uml.diagram.common.editparts.linkslf.LinksLFBorderedShapeEditPart; import org.eclipse.swt.graphics.Color; -public abstract class DeploymentNodeEditPart extends AbstractBorderedShapeEditPart implements IPapyrusEditPart { +public abstract class DeploymentNodeEditPart extends LinksLFBorderedShapeEditPart implements IPapyrusEditPart { public DeploymentNodeEditPart(View view) { super(view); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/DefaultEditPolicies.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/DefaultEditPolicies.java new file mode 100644 index 00000000000..f8bd578a99e --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/DefaultEditPolicies.java @@ -0,0 +1,16 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.gef.EditPolicy; +import org.eclipse.gmf.runtime.diagram.ui.editparts.INodeEditPart; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.editpolicies.AdjustImplicitlyMovedLinksEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.editpolicies.LinksLFGraphicalNodeEditPolicy; + + +class DefaultEditPolicies { + + static void installNodeEditPolicies(INodeEditPart nodeEP) { + nodeEP.installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new LinksLFGraphicalNodeEditPolicy()); + nodeEP.installEditPolicy(AdjustImplicitlyMovedLinksEditPolicy.ROLE, new AdjustImplicitlyMovedLinksEditPolicy()); + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFAbstractShapeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFAbstractShapeEditPart.java new file mode 100644 index 00000000000..c4ea15ce1e4 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFAbstractShapeEditPart.java @@ -0,0 +1,41 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; +import org.eclipse.papyrus.uml.diagram.common.editparts.AbstractShapeEditPart; + + +public abstract class LinksLFAbstractShapeEditPart extends AbstractShapeEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFAbstractShapeEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderEditPart.java new file mode 100644 index 00000000000..80ae1b9eeb2 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderEditPart.java @@ -0,0 +1,40 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; +import org.eclipse.papyrus.uml.diagram.common.editparts.AbstractBorderEditPart; + + +public abstract class LinksLFBorderEditPart extends AbstractBorderEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFBorderEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderItemEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderItemEditPart.java new file mode 100644 index 00000000000..41a616eb93b --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderItemEditPart.java @@ -0,0 +1,41 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderItemEditPart; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; + + +public abstract class LinksLFBorderItemEditPart extends AbstractBorderItemEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFBorderItemEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderNamedElementEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderNamedElementEditPart.java new file mode 100644 index 00000000000..b0ce97f7d96 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderNamedElementEditPart.java @@ -0,0 +1,40 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; +import org.eclipse.papyrus.uml.diagram.common.editparts.BorderNamedElementEditPart; + + +public abstract class LinksLFBorderNamedElementEditPart extends BorderNamedElementEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFBorderNamedElementEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } +}
\ No newline at end of file diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderedBorderItemEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderedBorderItemEditPart.java new file mode 100644 index 00000000000..07625585e10 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderedBorderItemEditPart.java @@ -0,0 +1,40 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.diagram.ui.editparts.BorderedBorderItemEditPart; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; + + +public abstract class LinksLFBorderedBorderItemEditPart extends BorderedBorderItemEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFBorderedBorderItemEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderedShapeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderedShapeEditPart.java new file mode 100644 index 00000000000..4ecbdb5a7f5 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFBorderedShapeEditPart.java @@ -0,0 +1,40 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; + + +public abstract class LinksLFBorderedShapeEditPart extends AbstractBorderedShapeEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFBorderedShapeEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFCommentEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFCommentEditPart.java new file mode 100644 index 00000000000..cdcae044922 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFCommentEditPart.java @@ -0,0 +1,41 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; +import org.eclipse.papyrus.uml.diagram.common.editparts.AbstractCommentEditPart; + + +public class LinksLFCommentEditPart extends AbstractCommentEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFCommentEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFConnectionEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFConnectionEditPart.java new file mode 100644 index 00000000000..3ef32e945f6 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFConnectionEditPart.java @@ -0,0 +1,113 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.draw2d.Bendpoint; +import org.eclipse.draw2d.Connection; +import org.eclipse.gef.EditPolicy; +import org.eclipse.gmf.runtime.diagram.ui.util.EditPartUtil; +import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx; +import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.ForestRouter; +import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.OrthogonalRouter; +import org.eclipse.gmf.runtime.gef.ui.internal.editpolicies.LineMode; +import org.eclipse.gmf.runtime.gef.ui.internal.l10n.Cursors; +import org.eclipse.gmf.runtime.notation.NotationPackage; +import org.eclipse.gmf.runtime.notation.RelativeBendpoints; +import org.eclipse.gmf.runtime.notation.RoutingStyle; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.editpart.ConnectionEditPart; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.AbsoluteBendpointsConvention; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.editpolicies.DebugShowConnectionEndPointsAndAnchorsEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.editpolicies.LinksLFConnectionBendpointEditPolicy; + + +public abstract class LinksLFConnectionEditPart extends ConnectionEditPart { + + public LinksLFConnectionEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + + installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new DebugShowConnectionEndPointsAndAnchorsEditPolicy()); + installBendpointEditPolicy(); + } + + @Override + protected void refreshBendpoints() { + RelativeBendpoints bendpoints = (RelativeBendpoints)getEdge().getBendpoints(); + List<?> modelConstraint = bendpoints.getPoints(); + List<Bendpoint> figureConstraint = new ArrayList<Bendpoint>(); + for(int i = 0; i < modelConstraint.size(); i++) { + org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint wbp = (org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint)modelConstraint.get(i); + float weight; + if(modelConstraint.size() == 1) { + weight = 0.5f; + } else { + weight = i / ((float)modelConstraint.size() - 1); + } + Bendpoint bp = AbsoluteBendpointsConvention.d2dBendpoint(wbp, getConnectionFigure(), weight); + figureConstraint.add(bp); + } + getConnectionFigure().setRoutingConstraint(figureConstraint); + } + + /** + * [GMFRT] make protected + */ + protected final void installBendpointEditPolicy() { + if(getConnectionFigure().getConnectionRouter() instanceof ForestRouter) { + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.ORTHOGONAL_CONSTRAINED)); + } else if(getConnectionFigure().getConnectionRouter() instanceof OrthogonalRouter) { + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.ORTHOGONAL_FREE)); + } else { + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.OBLIQUE)); + } + + EditPartUtil.synchronizeRunnableToMainThread(this, new Runnable() { + + public void run() { + if(getConnectionFigure().getConnectionRouter() instanceof ForestRouter) { + getConnectionFigure().setCursor(Cursors.CURSOR_SEG_MOVE); + } else if(getConnectionFigure().getConnectionRouter() instanceof OrthogonalRouter) { + getConnectionFigure().setCursor(Cursors.CURSOR_SEG_MOVE); + } else { + getConnectionFigure().setCursor(Cursors.CURSOR_SEG_ADD); + } + }; + }); + } + + protected void refreshRouterChange() { + refreshBendpoints(); + installBendpointEditPolicy(); + } + + @Override + protected void refreshRoutingStyles() { + Connection connection = getConnectionFigure(); + if(!(connection instanceof PolylineConnectionEx)) + return; + + PolylineConnectionEx poly = (PolylineConnectionEx)connection; + + RoutingStyle style = (RoutingStyle)((View)getModel()).getStyle(NotationPackage.Literals.ROUTING_STYLE); + if(style != null) { + + boolean closestDistance = style.isClosestDistance(); + boolean avoidObstruction = style.isAvoidObstructions(); + + poly.setRoutingStyles(closestDistance, avoidObstruction); + + if(avoidObstruction) + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, null); + else + installBendpointEditPolicy(); + } + } + + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFConstraintEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFConstraintEditPart.java new file mode 100644 index 00000000000..3843632e38f --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFConstraintEditPart.java @@ -0,0 +1,41 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; +import org.eclipse.papyrus.uml.diagram.common.editparts.AbstractConstraintEditPart; + + +public class LinksLFConstraintEditPart extends AbstractConstraintEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFConstraintEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFNamedElementEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFNamedElementEditPart.java new file mode 100644 index 00000000000..c4620795b7c --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFNamedElementEditPart.java @@ -0,0 +1,41 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; +import org.eclipse.papyrus.uml.diagram.common.editparts.NamedElementEditPart; + + +public abstract class LinksLFNamedElementEditPart extends NamedElementEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFNamedElementEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFShapeCompartmentEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFShapeCompartmentEditPart.java new file mode 100644 index 00000000000..9bd6780745d --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFShapeCompartmentEditPart.java @@ -0,0 +1,276 @@ +/*****************************************************************************
+ * Copyright (c) 2014 CEA LIST, Montages AG and others
+ *
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Anatoly Tishenko (ticher777@gmail.com) - Initial API and implementation
+ */
+package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.draw2d.FreeformViewport;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.LayoutAnimator;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RangeModel;
+import org.eclipse.draw2d.ScrollBar;
+import org.eclipse.draw2d.ScrollPane;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.geometry.Translatable;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.SnapToGrid;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeCompartmentEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemsAwareFreeFormLayer;
+import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
+import org.eclipse.gmf.runtime.diagram.ui.figures.ShapeCompartmentFigure;
+import org.eclipse.gmf.runtime.diagram.ui.layout.FreeFormLayoutEx;
+import org.eclipse.gmf.runtime.draw2d.ui.internal.figures.AnimatableScrollPane;
+import org.eclipse.gmf.runtime.draw2d.ui.internal.figures.OverlayScrollPaneLayout;
+import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
+import org.eclipse.gmf.runtime.notation.View;
+
+
+public class LinksLFShapeCompartmentEditPart extends ShapeCompartmentEditPart {
+
+ private final PropertyChangeListener myGridListener = new PropertyChangeListener() {
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ String propertyName = evt.getPropertyName();
+ if(SnapToGrid.PROPERTY_GRID_ORIGIN.equals(propertyName) || //
+ SnapToGrid.PROPERTY_GRID_ENABLED.equals(propertyName) || //
+ SnapToGrid.PROPERTY_GRID_SPACING.equals(propertyName)) {
+
+ updateGridBehavior();
+ }
+ }
+ };
+
+ public LinksLFShapeCompartmentEditPart(View view) {
+ super(view);
+ }
+
+ @Override
+ public IFigure createFigure() {
+ ShapeCompartmentFigure result = new ShapeCompartmentFigureEx(getCompartmentName(), getMapMode());
+ result.getContentPane().setLayoutManager(getLayoutManager());
+ result.getContentPane().addLayoutListener(LayoutAnimator.getDefault());
+ return result;
+ }
+
+ @Override
+ public void addNotify() {
+ super.addNotify();
+ getViewer().addPropertyChangeListener(myGridListener);
+ updateGridBehavior();
+ }
+
+ @Override
+ public void removeNotify() {
+ getViewer().removePropertyChangeListener(myGridListener);
+ super.removeNotify();
+ }
+
+ protected void updateGridBehavior() {
+ Rectangle gridSpec = getGridSpec(getViewer());
+ if(gridSpec != null) {
+ setScrollGridBehaviour((ResizableCompartmentFigure)getFigure());
+ }
+ }
+
+ protected void setScrollGridBehaviour(ResizableCompartmentFigure compartmentFigure) {
+ ScrollPane sp = compartmentFigure.getScrollPane();
+ decorateHorizontalRange(sp);
+ decorateVerticalRange(sp);
+ updateStepIncrements(sp);
+ }
+
+ private void updateStepIncrements(ScrollPane pane) {
+ Rectangle gridSpec = getGridSpec(getViewer());
+ if(gridSpec == null) {
+ return;
+ }
+ ScrollBar hScroll = pane.getHorizontalScrollBar();
+ hScroll.setStepIncrement(gridSpec.height);
+ ScrollBar wScroll = pane.getVerticalScrollBar();
+ wScroll.setStepIncrement(gridSpec.width);
+ }
+
+ private void decorateVerticalRange(ScrollPane pane) {
+ ScrollBar scroll = pane.getVerticalScrollBar();
+ RangeModel model = scroll.getRangeModel();
+ if(false == model instanceof SnapToGridRangeModel) {
+ SnapToGridRangeModel range = new SnapToGridRangeModel(model);
+ scroll.setRangeModel(range);
+ pane.getViewport().setVerticalRangeModel(range);
+ }
+ }
+
+ private void decorateHorizontalRange(ScrollPane pane) {
+ ScrollBar scroll = pane.getHorizontalScrollBar();
+ RangeModel model = scroll.getRangeModel();
+ if(false == model instanceof SnapToGridRangeModel) {
+ SnapToGridRangeModel range = new SnapToGridRangeModel(model);
+ scroll.setRangeModel(range);
+ pane.getViewport().setHorizontalRangeModel(range);
+ }
+ }
+
+ protected static Rectangle getGridSpec(EditPartViewer viewer) {
+ Boolean enabled = (Boolean)viewer.getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);
+ if(enabled == null || !enabled) {
+ return null;
+ }
+ int gridX = 0;
+ int gridY = 0;
+ Point origin;
+ Dimension spacing = (Dimension)viewer.getProperty(SnapToGrid.PROPERTY_GRID_SPACING);
+ if(spacing != null) {
+ gridX = spacing.width;
+ gridY = spacing.height;
+ }
+ if(gridX == 0) {
+ gridX = SnapToGrid.DEFAULT_GRID_SIZE;
+ }
+ if(gridY == 0) {
+ gridY = SnapToGrid.DEFAULT_GRID_SIZE;
+ }
+ Point loc = (Point)viewer.getProperty(SnapToGrid.PROPERTY_GRID_ORIGIN);
+ if(loc != null) {
+ origin = loc;
+ } else {
+ origin = new Point();
+ }
+
+ return new Rectangle(origin.x, origin.y, gridX, gridY);
+
+ }
+
+ private class SnapToGridRangeModel implements RangeModel {
+
+ private final RangeModel myBaseRangeModel;
+
+ public SnapToGridRangeModel(RangeModel rangeModel) {
+ myBaseRangeModel = rangeModel;
+ }
+
+ public void setValue(int value) {
+ Rectangle gridSpec = getGridSpec(getViewer());
+ if(gridSpec != null) {
+ value = Math.max(value, 0);
+ value = gridSpec.height * (value / gridSpec.height);
+ }
+ if(value + getMinimum() <= getMaximum()) {
+ myBaseRangeModel.setValue(value);
+ }
+ }
+
+ public void setMinimum(int min) {
+ myBaseRangeModel.setMinimum(min);
+ }
+
+ public void setMaximum(int max) {
+ myBaseRangeModel.setMaximum(max);
+ }
+
+ public void setExtent(int extent) {
+ myBaseRangeModel.setExtent(extent);
+ }
+
+ public void setAll(int min, int extent, int max) {
+ myBaseRangeModel.setAll(min, extent, max);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ myBaseRangeModel.removePropertyChangeListener(listener);
+ }
+
+ public boolean isEnabled() {
+ return true;
+ }
+
+ public int getValue() {
+ return myBaseRangeModel.getValue();
+ }
+
+ public int getMinimum() {
+ return myBaseRangeModel.getMinimum();
+ }
+
+ public int getMaximum() {
+ return myBaseRangeModel.getMaximum();
+ }
+
+ public int getExtent() {
+ return myBaseRangeModel.getExtent();
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ myBaseRangeModel.addPropertyChangeListener(listener);
+ }
+ }
+
+ public static class ShapeCompartmentFigureEx extends ShapeCompartmentFigure {
+
+ public ShapeCompartmentFigureEx(String title, IMapMode mm) {
+ super(title, mm);
+ }
+
+ @Override
+ protected void configureFigure(IMapMode mm) {
+ ScrollPane scrollpane = getScrollPane();
+ if(scrollpane == null) {
+ scrollpane = scrollPane = new AnimatableScrollPaneWithMM(mm);
+ }
+ scrollpane.setViewport(new FreeformViewport());
+ scrollPane.setScrollBarVisibility(ScrollPane.AUTOMATIC);
+ scrollpane.setLayoutManager(new OverlayScrollPaneLayout());
+
+ IFigure contents = new BorderItemsAwareFreeFormLayer();
+ contents.setLayoutManager(new FreeFormLayoutEx());
+ scrollpane.setContents(contents);
+
+ int MB = mm.DPtoLP(5);
+ scrollpane.setBorder(new MarginBorder(MB, MB, MB, MB));
+ int SZ = mm.DPtoLP(10);
+ scrollpane.setMinimumSize(new Dimension(SZ, SZ));
+
+ this.setFont(FONT_TITLE);
+ }
+
+ }
+
+ private static class AnimatableScrollPaneWithMM extends AnimatableScrollPane implements IMapMode {
+
+ private IMapMode myMapMode;
+
+ public AnimatableScrollPaneWithMM(IMapMode mm) {
+ myMapMode = mm;
+ }
+
+ public int LPtoDP(int logicalUnit) {
+ return myMapMode.LPtoDP(logicalUnit);
+ }
+
+ public int DPtoLP(int deviceUnit) {
+ return myMapMode.DPtoLP(deviceUnit);
+ }
+
+ public Translatable LPtoDP(Translatable t) {
+ return myMapMode.LPtoDP(t);
+ }
+
+ public Translatable DPtoLP(Translatable t) {
+ return myMapMode.DPtoLP(t);
+ }
+ }
+
+}
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFShapeNodeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFShapeNodeEditPart.java new file mode 100644 index 00000000000..766d95beb8c --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFShapeNodeEditPart.java @@ -0,0 +1,42 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; + + +public abstract class LinksLFShapeNodeEditPart extends ShapeNodeEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFShapeNodeEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } + + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFUMLConnectionNodeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFUMLConnectionNodeEditPart.java new file mode 100644 index 00000000000..1d2a5773f01 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFUMLConnectionNodeEditPart.java @@ -0,0 +1,113 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.draw2d.Bendpoint; +import org.eclipse.draw2d.Connection; +import org.eclipse.gef.EditPolicy; +import org.eclipse.gmf.runtime.diagram.ui.util.EditPartUtil; +import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx; +import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.ForestRouter; +import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.OrthogonalRouter; +import org.eclipse.gmf.runtime.gef.ui.internal.editpolicies.LineMode; +import org.eclipse.gmf.runtime.gef.ui.internal.l10n.Cursors; +import org.eclipse.gmf.runtime.notation.NotationPackage; +import org.eclipse.gmf.runtime.notation.RelativeBendpoints; +import org.eclipse.gmf.runtime.notation.RoutingStyle; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.AbsoluteBendpointsConvention; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.editpolicies.DebugShowConnectionEndPointsAndAnchorsEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.editpolicies.LinksLFConnectionBendpointEditPolicy; +import org.eclipse.papyrus.uml.diagram.common.editparts.UMLConnectionNodeEditPart; + + +public abstract class LinksLFUMLConnectionNodeEditPart extends UMLConnectionNodeEditPart { + + public LinksLFUMLConnectionNodeEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + + installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new DebugShowConnectionEndPointsAndAnchorsEditPolicy()); + installBendpointEditPolicy(); + } + + @Override + protected void refreshBendpoints() { + RelativeBendpoints bendpoints = (RelativeBendpoints)getEdge().getBendpoints(); + List<?> modelConstraint = bendpoints.getPoints(); + List<Bendpoint> figureConstraint = new ArrayList<Bendpoint>(); + for(int i = 0; i < modelConstraint.size(); i++) { + org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint wbp = (org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint)modelConstraint.get(i); + float weight; + if(modelConstraint.size() == 1) { + weight = 0.5f; + } else { + weight = i / ((float)modelConstraint.size() - 1); + } + Bendpoint bp = AbsoluteBendpointsConvention.d2dBendpoint(wbp, getConnectionFigure(), weight); + figureConstraint.add(bp); + } + getConnectionFigure().setRoutingConstraint(figureConstraint); + } + + /** + * [GMFRT] make protected + */ + protected final void installBendpointEditPolicy() { + if(getConnectionFigure().getConnectionRouter() instanceof ForestRouter) { + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.ORTHOGONAL_CONSTRAINED)); + } else if(getConnectionFigure().getConnectionRouter() instanceof OrthogonalRouter) { + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.ORTHOGONAL_FREE)); + } else { + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new LinksLFConnectionBendpointEditPolicy(LineMode.OBLIQUE)); + } + + EditPartUtil.synchronizeRunnableToMainThread(this, new Runnable() { + + public void run() { + if(getConnectionFigure().getConnectionRouter() instanceof ForestRouter) { + getConnectionFigure().setCursor(Cursors.CURSOR_SEG_MOVE); + } else if(getConnectionFigure().getConnectionRouter() instanceof OrthogonalRouter) { + getConnectionFigure().setCursor(Cursors.CURSOR_SEG_MOVE); + } else { + getConnectionFigure().setCursor(Cursors.CURSOR_SEG_ADD); + } + }; + }); + } + + protected void refreshRouterChange() { + refreshBendpoints(); + installBendpointEditPolicy(); + } + + @Override + protected void refreshRoutingStyles() { + Connection connection = getConnectionFigure(); + if(!(connection instanceof PolylineConnectionEx)) + return; + + PolylineConnectionEx poly = (PolylineConnectionEx)connection; + + RoutingStyle style = (RoutingStyle)((View)getModel()).getStyle(NotationPackage.Literals.ROUTING_STYLE); + if(style != null) { + + boolean closestDistance = style.isClosestDistance(); + boolean avoidObstruction = style.isAvoidObstructions(); + + poly.setRoutingStyles(closestDistance, avoidObstruction); + + if(avoidObstruction) + installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, null); + else + installBendpointEditPolicy(); + } + } + + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFUMLNodeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFUMLNodeEditPart.java new file mode 100644 index 00000000000..5781d91869a --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFUMLNodeEditPart.java @@ -0,0 +1,42 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import org.eclipse.draw2d.ConnectionAnchor; +import org.eclipse.gef.Request; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.linklf.ShapeNodeAnchorDelegate; +import org.eclipse.papyrus.uml.diagram.common.editparts.UMLNodeEditPart; + + +public abstract class LinksLFUMLNodeEditPart extends UMLNodeEditPart { + + private ShapeNodeAnchorDelegate myShapeNodeAnchorDelegate; + + public LinksLFUMLNodeEditPart(View view) { + super(view); + } + + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + DefaultEditPolicies.installNodeEditPolicies(this); + } + + + @Override + public final ConnectionAnchor getSourceConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getSourceConnectionAnchor(request); + } + + @Override + public final ConnectionAnchor getTargetConnectionAnchor(Request request) { + return getShapeNodeAnchorDelegate().getTargetConnectionAnchor(request); + } + + private ShapeNodeAnchorDelegate getShapeNodeAnchorDelegate() { + if(myShapeNodeAnchorDelegate == null) { + myShapeNodeAnchorDelegate = new ShapeNodeAnchorDelegate(getNodeFigure()); + } + return myShapeNodeAnchorDelegate; + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFXYLayoutShapeCompartmentEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFXYLayoutShapeCompartmentEditPart.java new file mode 100644 index 00000000000..6aa09c57757 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/linkslf/LinksLFXYLayoutShapeCompartmentEditPart.java @@ -0,0 +1,263 @@ +package org.eclipse.papyrus.uml.diagram.common.editparts.linkslf; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import org.eclipse.draw2d.FreeformViewport; +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.LayoutAnimator; +import org.eclipse.draw2d.MarginBorder; +import org.eclipse.draw2d.RangeModel; +import org.eclipse.draw2d.ScrollBar; +import org.eclipse.draw2d.ScrollPane; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.draw2d.geometry.Translatable; +import org.eclipse.gef.EditPartViewer; +import org.eclipse.gef.SnapToGrid; +import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemsAwareFreeFormLayer; +import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure; +import org.eclipse.gmf.runtime.diagram.ui.figures.ShapeCompartmentFigure; +import org.eclipse.gmf.runtime.diagram.ui.layout.FreeFormLayoutEx; +import org.eclipse.gmf.runtime.draw2d.ui.internal.figures.AnimatableScrollPane; +import org.eclipse.gmf.runtime.draw2d.ui.internal.figures.OverlayScrollPaneLayout; +import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.editpart.XYLayoutShapeCompartmentEditPart; + +public class LinksLFXYLayoutShapeCompartmentEditPart extends XYLayoutShapeCompartmentEditPart { + + private final PropertyChangeListener myGridListener = new PropertyChangeListener() { + + public void propertyChange(PropertyChangeEvent evt) { + String propertyName = evt.getPropertyName(); + if(SnapToGrid.PROPERTY_GRID_ORIGIN.equals(propertyName) || // + SnapToGrid.PROPERTY_GRID_ENABLED.equals(propertyName) || // + SnapToGrid.PROPERTY_GRID_SPACING.equals(propertyName)) { + + updateGridBehavior(); + } + } + }; + + public LinksLFXYLayoutShapeCompartmentEditPart(View view) { + super(view); + } + + @Override + public IFigure createFigure() { + ShapeCompartmentFigure result = new ShapeCompartmentFigureEx(getCompartmentName(), getMapMode()); + result.getContentPane().setLayoutManager(getLayoutManager()); + result.getContentPane().addLayoutListener(LayoutAnimator.getDefault()); + return result; + } + + @Override + public void addNotify() { + super.addNotify(); + getViewer().addPropertyChangeListener(myGridListener); + updateGridBehavior(); + } + + @Override + public void removeNotify() { + getViewer().removePropertyChangeListener(myGridListener); + super.removeNotify(); + } + + protected void updateGridBehavior() { + Rectangle gridSpec = getGridSpec(getViewer()); + if(gridSpec != null) { + setScrollGridBehaviour((ResizableCompartmentFigure)getFigure()); + } + } + + protected void setScrollGridBehaviour(ResizableCompartmentFigure compartmentFigure) { + ScrollPane sp = compartmentFigure.getScrollPane(); + decorateHorizontalRange(sp); + decorateVerticalRange(sp); + updateStepIncrements(sp); + } + + private void updateStepIncrements(ScrollPane pane) { + Rectangle gridSpec = getGridSpec(getViewer()); + if(gridSpec == null) { + return; + } + ScrollBar hScroll = pane.getHorizontalScrollBar(); + hScroll.setStepIncrement(gridSpec.height); + ScrollBar wScroll = pane.getVerticalScrollBar(); + wScroll.setStepIncrement(gridSpec.width); + } + + private void decorateVerticalRange(ScrollPane pane) { + ScrollBar scroll = pane.getVerticalScrollBar(); + RangeModel model = scroll.getRangeModel(); + if(false == model instanceof SnapToGridRangeModel) { + SnapToGridRangeModel range = new SnapToGridRangeModel(model); + scroll.setRangeModel(range); + pane.getViewport().setVerticalRangeModel(range); + } + } + + private void decorateHorizontalRange(ScrollPane pane) { + ScrollBar scroll = pane.getHorizontalScrollBar(); + RangeModel model = scroll.getRangeModel(); + if(false == model instanceof SnapToGridRangeModel) { + SnapToGridRangeModel range = new SnapToGridRangeModel(model); + scroll.setRangeModel(range); + pane.getViewport().setHorizontalRangeModel(range); + } + } + + protected static Rectangle getGridSpec(EditPartViewer viewer) { + Boolean enabled = (Boolean)viewer.getProperty(SnapToGrid.PROPERTY_GRID_ENABLED); + if(enabled == null || !enabled) { + return null; + } + int gridX = 0; + int gridY = 0; + Point origin; + Dimension spacing = (Dimension)viewer.getProperty(SnapToGrid.PROPERTY_GRID_SPACING); + if(spacing != null) { + gridX = spacing.width; + gridY = spacing.height; + } + if(gridX == 0) { + gridX = SnapToGrid.DEFAULT_GRID_SIZE; + } + if(gridY == 0) { + gridY = SnapToGrid.DEFAULT_GRID_SIZE; + } + Point loc = (Point)viewer.getProperty(SnapToGrid.PROPERTY_GRID_ORIGIN); + if(loc != null) { + origin = loc; + } else { + origin = new Point(); + } + + return new Rectangle(origin.x, origin.y, gridX, gridY); + + } + + private class SnapToGridRangeModel implements RangeModel { + + private final RangeModel myBaseRangeModel; + + public SnapToGridRangeModel(RangeModel rangeModel) { + myBaseRangeModel = rangeModel; + } + + public void setValue(int value) { + Rectangle gridSpec = getGridSpec(getViewer()); + if(gridSpec != null) { + value = Math.max(value, 0); + value = gridSpec.height * (value / gridSpec.height); + } + if(value + getMinimum() <= getMaximum()) { + myBaseRangeModel.setValue(value); + } + } + + public void setMinimum(int min) { + myBaseRangeModel.setMinimum(min); + } + + public void setMaximum(int max) { + myBaseRangeModel.setMaximum(max); + } + + public void setExtent(int extent) { + myBaseRangeModel.setExtent(extent); + } + + public void setAll(int min, int extent, int max) { + myBaseRangeModel.setAll(min, extent, max); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + myBaseRangeModel.removePropertyChangeListener(listener); + } + + public boolean isEnabled() { + return true; + } + + public int getValue() { + return myBaseRangeModel.getValue(); + } + + public int getMinimum() { + return myBaseRangeModel.getMinimum(); + } + + public int getMaximum() { + return myBaseRangeModel.getMaximum(); + } + + public int getExtent() { + return myBaseRangeModel.getExtent(); + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + myBaseRangeModel.addPropertyChangeListener(listener); + } + } + + public static class ShapeCompartmentFigureEx extends ShapeCompartmentFigure { + + public ShapeCompartmentFigureEx(String title, IMapMode mm) { + super(title, mm); + } + + @Override + protected void configureFigure(IMapMode mm) { + ScrollPane scrollpane = getScrollPane(); + if(scrollpane == null) { + scrollpane = scrollPane = new AnimatableScrollPaneWithMM(mm); + } + scrollpane.setViewport(new FreeformViewport()); + scrollPane.setScrollBarVisibility(ScrollPane.AUTOMATIC); + scrollpane.setLayoutManager(new OverlayScrollPaneLayout()); + + IFigure contents = new BorderItemsAwareFreeFormLayer(); + contents.setLayoutManager(new FreeFormLayoutEx()); + scrollpane.setContents(contents); + + int MB = mm.DPtoLP(5); + scrollpane.setBorder(new MarginBorder(MB, MB, MB, MB)); + int SZ = mm.DPtoLP(10); + scrollpane.setMinimumSize(new Dimension(SZ, SZ)); + + this.setFont(FONT_TITLE); + } + + } + + private static class AnimatableScrollPaneWithMM extends AnimatableScrollPane implements IMapMode { + + private IMapMode myMapMode; + + public AnimatableScrollPaneWithMM(IMapMode mm) { + myMapMode = mm; + } + + public int LPtoDP(int logicalUnit) { + return myMapMode.LPtoDP(logicalUnit); + } + + public int DPtoLP(int deviceUnit) { + return myMapMode.DPtoLP(deviceUnit); + } + + public Translatable LPtoDP(Translatable t) { + return myMapMode.LPtoDP(t); + } + + public Translatable DPtoLP(Translatable t) { + return myMapMode.DPtoLP(t); + } + } + +} |