From e44c183e6e4aac4d4035f7a9df8927e8d0ab7dde Mon Sep 17 00:00:00 2001 From: Remi Schnekenburger Date: Fri, 10 Aug 2018 10:46:11 +0200 Subject: Bug 537571: Support for Time Constraint - Add support for time constraint and its 2 labels - Customize layout at creation and resize Change-Id: I2dda9d48be17fa80801befc36396c9d60e7eea77 Signed-off-by: Remi Schnekenburger --- .../gmf/figureview/view/FigureHierarchyView.java | 2 +- .../BorderItemResizableEditPolicy.java | 8 + .../AbstractExecutionSpecificationEditPart.java | 33 +- .../edit/parts/AbstractMessageEditPart.java | 8 +- ...onSpecificationAffixedChildAlignmentPolicy.java | 169 ++++ ...cutionSpecificationGraphicalNodeEditPolicy.java | 4 +- .../policies/MessageGraphicalNodeEditPolicy.java | 4 +- .../policies/TimeRelatedSelectionEditPolicy.java | 86 --- .../sequence/figures/TimeConstraintFigure.java | 70 ++ .../sequence/locator/TimeElementLocator.java | 143 ++++ ...omExecutionSpecificationCreationEditPolicy.java | 194 +---- .../model/sequenceDiagram.gmfgen | 114 ++- .../plugin.xml | 6 +- .../ActionExecutionSpecificationEditPart.java | 28 +- .../BehaviorExecutionSpecificationEditPart.java | 28 +- .../TimeConstraintAppliedStereotypeEditPart.java | 852 ++++++++++++++++++++ .../parts/TimeConstraintBorderNodeEditPart.java | 303 ++++++++ .../edit/parts/TimeConstraintNameEditPart.java | 855 +++++++++++++++++++++ .../sequence/edit/parts/UMLEditPartFactory.java | 9 + .../diagram/sequence/part/UMLDiagramUpdater.java | 114 +++ .../diagram/sequence/part/UMLVisualIDRegistry.java | 34 +- .../sequence/providers/ElementInitializers.java | 22 + .../sequence/providers/UMLElementTypes.java | 12 + .../sequence/providers/UMLParserProvider.java | 37 + .../sequence/providers/UMLViewProvider.java | 36 + .../advice/ExecutionSpecificationHelperAdvice.java | 109 ++- 26 files changed, 2961 insertions(+), 319 deletions(-) create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationAffixedChildAlignmentPolicy.java delete mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/TimeRelatedSelectionEditPolicy.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/figures/TimeConstraintFigure.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/locator/TimeElementLocator.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintAppliedStereotypeEditPart.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintBorderNodeEditPart.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintNameEditPart.java (limited to 'plugins') diff --git a/plugins/toolsmiths/org.eclipse.papyrus.gmf.figureview/src/org/eclipse/papyrus/gmf/figureview/view/FigureHierarchyView.java b/plugins/toolsmiths/org.eclipse.papyrus.gmf.figureview/src/org/eclipse/papyrus/gmf/figureview/view/FigureHierarchyView.java index 41cbc6e0bdf..df8dd843427 100644 --- a/plugins/toolsmiths/org.eclipse.papyrus.gmf.figureview/src/org/eclipse/papyrus/gmf/figureview/view/FigureHierarchyView.java +++ b/plugins/toolsmiths/org.eclipse.papyrus.gmf.figureview/src/org/eclipse/papyrus/gmf/figureview/view/FigureHierarchyView.java @@ -97,7 +97,7 @@ public class FigureHierarchyView extends ViewPart { Object selectedobject = ((IStructuredSelection) selection).getFirstElement(); if (selectedobject instanceof GraphicalEditPart) { GraphicalEditPart graphicalEP = ((GraphicalEditPart) selectedobject); - IFigure figure = graphicalEP.getContentPane(); + IFigure figure = graphicalEP.getFigure(); if (viewer != null) { viewer.setInput(new Object[] { figure }); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editpolicies/BorderItemResizableEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editpolicies/BorderItemResizableEditPolicy.java index 985c770fafd..9e0681d441c 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editpolicies/BorderItemResizableEditPolicy.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editpolicies/BorderItemResizableEditPolicy.java @@ -43,6 +43,14 @@ import org.eclipse.gmf.runtime.notation.View; */ public class BorderItemResizableEditPolicy extends ResizableShapeEditPolicy { + /** + * Constructor. + * + */ + public BorderItemResizableEditPolicy() { + super(); + } + @Override public void eraseSourceFeedback(Request request) { if ((REQ_MOVE.equals(request.getType()) && isDragAllowed()) || REQ_CLONE.equals(request.getType()) || REQ_ADD.equals(request.getType()) || RequestConstants.REQ_DROP.equals(request.getType()) || REQ_RESIZE.equals(request.getType())) { diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractExecutionSpecificationEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractExecutionSpecificationEditPart.java index f2c32ec6a46..478d644a3e3 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractExecutionSpecificationEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractExecutionSpecificationEditPart.java @@ -32,9 +32,11 @@ import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.Request; import org.eclipse.gef.requests.ChangeBoundsRequest; +import org.eclipse.gef.requests.CreateRequest; import org.eclipse.gef.requests.ReconnectRequest; import org.eclipse.gmf.runtime.common.core.util.Log; import org.eclipse.gmf.runtime.common.core.util.Trace; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin; @@ -57,14 +59,17 @@ import org.eclipse.gmf.runtime.notation.View; import org.eclipse.gmf.runtime.notation.datatype.GradientData; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.IPapyrusNodeFigure; import org.eclipse.papyrus.uml.diagram.common.editparts.RoundedCompartmentEditPart; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.AffixedNodeAlignmentEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.anchors.NodeBottomAnchor; import org.eclipse.papyrus.uml.diagram.sequence.anchors.NodeTopAnchor; import org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.AnchorHelper; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.AppliedStereotypeCommentCreationEditPolicyEx; +import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ExecutionSpecificationAffixedChildAlignmentPolicy; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.SequenceReferenceEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.UpdateConnectionReferenceEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.UpdateWeakReferenceForExecSpecEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.figures.ExecutionSpecificationNodePlate; +import org.eclipse.papyrus.uml.diagram.sequence.locator.TimeElementLocator; import org.eclipse.papyrus.uml.diagram.sequence.providers.UMLElementTypes; import org.eclipse.papyrus.uml.diagram.sequence.referencialgrilling.BoundForEditPart; import org.eclipse.papyrus.uml.diagram.sequence.referencialgrilling.ConnectExecutionToGridEditPolicy; @@ -88,7 +93,6 @@ public abstract class AbstractExecutionSpecificationEditPart extends RoundedComp * @deprecated since 5.1 this constant is not used anymore. */ @Deprecated - public static final String EXECUTION_FIX_ANCHOR_POSITION = "Execution Fix Anchor Position"; public static int DEFAUT_HEIGHT = 100; public static int DEFAUT_WIDTH = 20; @@ -158,7 +162,26 @@ public abstract class AbstractExecutionSpecificationEditPart extends RoundedComp feedback.setBounds(rect); } }); + installEditPolicy(AffixedNodeAlignmentEditPolicy.AFFIXED_CHILD_ALIGNMENT_ROLE, new ExecutionSpecificationAffixedChildAlignmentPolicy()); + } + @Override + protected void addBorderItem(IFigure borderItemContainer, IBorderItemEditPart borderItemEditPart) { + if (TimeConstraintBorderNodeEditPart.class.isInstance(borderItemEditPart)) { + borderItemContainer.add(borderItemEditPart.getFigure(), + new TimeElementLocator(getMainFigure())); + } else { + super.addBorderItem(borderItemContainer, borderItemEditPart); + } + } + + + @Override + public EditPart getTargetEditPart(Request request) { + if (request instanceof CreateRequest) { + return super.getTargetEditPart(request); + } + return super.getTargetEditPart(request); } @Override @@ -327,7 +350,7 @@ public abstract class AbstractExecutionSpecificationEditPart extends RoundedComp } // otherwise, this is a recursive call, let destination free } else if (UMLElementTypes.DurationConstraint_Edge.equals(type) || UMLElementTypes.DurationObservation_Edge.equals(type) || UMLElementTypes.GeneralOrdering_Edge.equals(type)) { - return OccurrenceSpecificationUtil.isStart(getFigure(), createRequest) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); + return OccurrenceSpecificationUtil.isStart(getFigure(), createRequestgetLocation()) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); } } } else if (request instanceof ReconnectRequest) { @@ -351,7 +374,7 @@ public abstract class AbstractExecutionSpecificationEditPart extends RoundedComp } } if (DurationLinkUtil.isDurationLink(createRequest) || GeneralOrderingUtil.isGeneralOrderingLink(createRequest)) { - return OccurrenceSpecificationUtil.isStart(getFigure(), createRequest) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); + return OccurrenceSpecificationUtil.isStart(getFigure(), createRequest.getLocation()) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); } } return super.getTargetConnectionAnchor(request); @@ -415,7 +438,7 @@ public abstract class AbstractExecutionSpecificationEditPart extends RoundedComp // Reply Message return new AnchorHelper.FixedAnchorEx(getFigure(), PositionConstants.BOTTOM); } else if (UMLElementTypes.DurationConstraint_Edge.equals(type) || UMLElementTypes.DurationObservation_Edge.equals(type) || UMLElementTypes.GeneralOrdering_Edge.equals(type)) { - return OccurrenceSpecificationUtil.isStart(getFigure(), createRequest) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); + return OccurrenceSpecificationUtil.isStart(getFigure(), createRequest.getLocation()) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); } } } else if (request instanceof ReconnectRequest) { @@ -430,7 +453,7 @@ public abstract class AbstractExecutionSpecificationEditPart extends RoundedComp } else if (request instanceof CreateConnectionViewRequest) { CreateConnectionViewRequest createRequest = (CreateConnectionViewRequest) request; if (DurationLinkUtil.isDurationLink(createRequest) || GeneralOrderingUtil.isGeneralOrderingLink(createRequest)) { - return OccurrenceSpecificationUtil.isStart(getFigure(), createRequest) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); + return OccurrenceSpecificationUtil.isStart(getFigure(), createRequest.getLocation()) ? new NodeTopAnchor(getFigure()) : new NodeBottomAnchor(getFigure()); } } return super.getSourceConnectionAnchor(request); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractMessageEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractMessageEditPart.java index 4b7072b863a..1765a1f7fdf 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractMessageEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/AbstractMessageEditPart.java @@ -542,13 +542,13 @@ public abstract class AbstractMessageEditPart extends UMLConnectionNodeEditPart List relationshipTypes = createRequest.getElementTypes(); for (Object type : relationshipTypes) { if (UMLElementTypes.DurationConstraint_Edge.equals(type) || UMLElementTypes.DurationObservation_Edge.equals(type) || UMLElementTypes.GeneralOrdering_Edge.equals(type)) { - return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); + return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest.getLocation()) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); } } } else if (request instanceof CreateConnectionViewRequest) { CreateConnectionViewRequest createRequest = (CreateConnectionViewRequest) request; if (DurationLinkUtil.isDurationLink(createRequest) || GeneralOrderingUtil.isGeneralOrderingLink(createRequest)) { - return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); + return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest.getLocation()) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); } } else if (request instanceof ReconnectRequest) { ReconnectRequest reconnectRequest = (ReconnectRequest) request; @@ -566,13 +566,13 @@ public abstract class AbstractMessageEditPart extends UMLConnectionNodeEditPart List relationshipTypes = createRequest.getElementTypes(); for (Object type : relationshipTypes) { if (UMLElementTypes.DurationConstraint_Edge.equals(type) || UMLElementTypes.DurationObservation_Edge.equals(type) || UMLElementTypes.GeneralOrdering_Edge.equals(type)) { - return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); + return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest.getLocation()) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); } } } else if (request instanceof CreateConnectionViewRequest) { CreateConnectionViewRequest createRequest = (CreateConnectionViewRequest) request; if (DurationLinkUtil.isDurationLink(createRequest) || GeneralOrderingUtil.isGeneralOrderingLink(createRequest)) { - return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); + return OccurrenceSpecificationUtil.isSource(getConnectionFigure(), createRequest.getLocation()) ? new ConnectionSourceAnchor(getPrimaryShape()) : new ConnectionTargetAnchor(getPrimaryShape()); } } else if (request instanceof ReconnectRequest) { ReconnectRequest reconnectRequest = (ReconnectRequest) request; diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationAffixedChildAlignmentPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationAffixedChildAlignmentPolicy.java new file mode 100644 index 00000000000..a428871b23b --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationAffixedChildAlignmentPolicy.java @@ -0,0 +1,169 @@ +/***************************************************************************** + * Copyright (c) 2018 CEA LIST 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: + * CEA LIST - Initial API and implementation + * + *****************************************************************************/ + +package org.eclipse.papyrus.uml.diagram.sequence.edit.policies; + +import java.util.Collections; +import java.util.List; + +import org.eclipse.draw2d.Cursors; +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.PositionConstants; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.PrecisionRectangle; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.gef.EditPart; +import org.eclipse.gef.EditPolicy; +import org.eclipse.gef.GraphicalEditPart; +import org.eclipse.gef.Request; +import org.eclipse.gef.commands.Command; +import org.eclipse.gef.editpolicies.NonResizableEditPolicy; +import org.eclipse.gef.handles.ResizableHandleKit; +import org.eclipse.gef.requests.ChangeBoundsRequest; +import org.eclipse.gef.tools.ResizeTracker; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator; +import org.eclipse.papyrus.infra.gmfdiag.common.utils.FigureUtils; +import org.eclipse.papyrus.uml.diagram.common.editparts.IFloatingLabelEditPart; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.AllowResizeAffixedNodeAlignmentEditPolicy; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.BorderItemResizableEditPolicy; +import org.eclipse.uml2.uml.TimeConstraint; +import org.eclipse.uml2.uml.TimeObservation; + +/** + * Specific execution specification policy to allow specific resize of {@link TimeConstraint} & {@link TimeObservation}. + */ +public class ExecutionSpecificationAffixedChildAlignmentPolicy extends AllowResizeAffixedNodeAlignmentEditPolicy { + + public ExecutionSpecificationAffixedChildAlignmentPolicy() { + super(); + } + + @Override + protected EditPolicy createChildEditPolicy(EditPart child) { + if ((child instanceof IBorderItemEditPart) && !(child instanceof IFloatingLabelEditPart)) { + BorderItemResizableEditPolicy policy = new BorderItemResizableEditPolicy() { + @Override + protected void createResizeHandle(List handles, int direction) { + if ((getResizeDirections() & direction) == direction) { + ResizableHandleKit.addHandle((GraphicalEditPart) getHost(), + handles, direction, getResizeTracker(direction), Cursors + .getDirectionalCursor(direction, getHostFigure() + .isMirrored())); + } + // no else, otherwise there is some overrride + } + + @Override + protected ResizeTracker getResizeTracker(int direction) { + return new TimeElementResizeTracker((GraphicalEditPart) getHost(), direction); + } + + @Override + protected Command getAutoSizeCommand(Request request) { + return null; + } + + @Override + protected void showChangeBoundsFeedback(ChangeBoundsRequest request) { + IBorderItemEditPart borderItemEP = (IBorderItemEditPart) getHost(); + IBorderItemLocator borderItemLocator = borderItemEP.getBorderItemLocator(); + + if (borderItemLocator != null) { + IFigure feedback = getDragSourceFeedbackFigure(); + PrecisionRectangle rect = new PrecisionRectangle(getInitialFeedbackBounds().getCopy()); + EditPart part = borderItemEP.getParent(); + // position is relative to parent + Point p = ((IGraphicalEditPart) part).getFigure().getBounds().getLocation().getNegated(); + rect.translate(p); + // scaling not taken into account for feedback + double scale = FigureUtils.getScale(getHostFigure()); + Point moveDelta = request.getMoveDelta().getCopy(); + moveDelta.scale(1 / scale); + rect.translate(moveDelta); + Dimension sizeDelta = request.getSizeDelta().getCopy(); + sizeDelta.scale(1 / scale); + rect.resize(sizeDelta); + IFigure borderItemfigure = borderItemEP.getFigure(); + Rectangle realLocation = borderItemLocator.getValidLocation(rect.getCopy(), borderItemfigure); + getHostFigure().translateToAbsolute(realLocation); + feedback.translateToRelative(realLocation); + feedback.setBounds(realLocation); + } + } + }; + policy.setResizeDirections(PositionConstants.EAST | PositionConstants.WEST); + policy.setDragAllowed(false); + return policy; + } + EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); + if (result == null) { + result = new NonResizableEditPolicy(); + } + return result; + + } + + public class TimeElementResizeTracker extends ResizeTracker { + + public TimeElementResizeTracker(GraphicalEditPart owner, int direction) { + super(owner, direction); + } + + @Override + protected List createOperationSet() { + // no multi-selection + return Collections.singletonList(getOwner()); + } + + @Override + protected Request createSourceRequest() { + ChangeBoundsRequest request = new ChangeBoundsRequest(REQ_RESIZE); + request.setConstrainedResize(false); + request.setResizeDirection(getResizeDirection()); + return request; + } + + @Override + protected Command getCommand() { + return super.getCommand(); + } + + /** + * @see org.eclipse.gef.tools.ResizeTracker#updateSourceRequest() + * + */ + @Override + protected void updateSourceRequest() { + super.updateSourceRequest(); + } + + @Override + protected Dimension getMinimumSizeFor(ChangeBoundsRequest request) { + return new Dimension(20, 1); + } + + /** + * @see org.eclipse.gef.tools.SimpleDragTracker#showSourceFeedback() + * + */ + @Override + protected void showSourceFeedback() { + super.showSourceFeedback(); + } + + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationGraphicalNodeEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationGraphicalNodeEditPolicy.java index d4f2f3326b5..d5d83eb6802 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationGraphicalNodeEditPolicy.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/ExecutionSpecificationGraphicalNodeEditPolicy.java @@ -50,7 +50,7 @@ public class ExecutionSpecificationGraphicalNodeEditPolicy extends ElementCreati OccurrenceSpecification sourceOccurrence; ExecutionSpecification execSpec = getExecutionSpecification(); if (execSpec != null) { - if (OccurrenceSpecificationUtil.isStart(getHostFigure(), request)) { + if (OccurrenceSpecificationUtil.isStart(getHostFigure(), request.getLocation())) { sourceOccurrence = execSpec.getStart(); } else { sourceOccurrence = execSpec.getFinish(); @@ -82,7 +82,7 @@ public class ExecutionSpecificationGraphicalNodeEditPolicy extends ElementCreati OccurrenceSpecification targetOccurrence; ExecutionSpecification execSpec = getExecutionSpecification(); if (execSpec != null) { - if (OccurrenceSpecificationUtil.isStart(getHostFigure(), request)) { + if (OccurrenceSpecificationUtil.isStart(getHostFigure(), request.getLocation())) { targetOccurrence = execSpec.getStart(); } else { targetOccurrence = execSpec.getFinish(); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/MessageGraphicalNodeEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/MessageGraphicalNodeEditPolicy.java index 417fe7be73b..5b031be65ba 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/MessageGraphicalNodeEditPolicy.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/MessageGraphicalNodeEditPolicy.java @@ -44,7 +44,7 @@ public class MessageGraphicalNodeEditPolicy extends GraphicalNodeEditPolicy { MessageEnd sourceOccurrence; Message message = getMessage(); if (message != null) { - sourceOccurrence = OccurrenceSpecificationUtil.isSource(getHostFigure(), request) ? message.getSendEvent() : message.getReceiveEvent(); + sourceOccurrence = OccurrenceSpecificationUtil.isSource(getHostFigure(), request.getLocation()) ? message.getSendEvent() : message.getReceiveEvent(); if (sourceOccurrence instanceof OccurrenceSpecification) { @SuppressWarnings("unchecked") Map extendedData = request.getExtendedData(); @@ -66,7 +66,7 @@ public class MessageGraphicalNodeEditPolicy extends GraphicalNodeEditPolicy { MessageEnd targetOccurrence; Message message = getMessage(); if (message != null) { - targetOccurrence = OccurrenceSpecificationUtil.isSource(getHostFigure(), request) ? message.getSendEvent() : message.getReceiveEvent(); + targetOccurrence = OccurrenceSpecificationUtil.isSource(getHostFigure(), request.getLocation()) ? message.getSendEvent() : message.getReceiveEvent(); if (targetOccurrence instanceof OccurrenceSpecification) { @SuppressWarnings("unchecked") Map extendedData = request.getExtendedData(); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/TimeRelatedSelectionEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/TimeRelatedSelectionEditPolicy.java deleted file mode 100644 index 4eec1894c15..00000000000 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/TimeRelatedSelectionEditPolicy.java +++ /dev/null @@ -1,86 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2010 CEA - * - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Atos Origin - Initial API and implementation - * - *****************************************************************************/ -package org.eclipse.papyrus.uml.diagram.sequence.edit.policies; - -import org.eclipse.draw2d.geometry.Dimension; -import org.eclipse.draw2d.geometry.Point; -import org.eclipse.draw2d.geometry.PrecisionRectangle; -import org.eclipse.draw2d.geometry.Rectangle; -import org.eclipse.gef.commands.Command; -import org.eclipse.gef.requests.ChangeBoundsRequest; -import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart; -import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy; -import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator; -import org.eclipse.gmf.runtime.notation.Bounds; -import org.eclipse.gmf.runtime.notation.Node; -import org.eclipse.papyrus.uml.diagram.sequence.util.OccurrenceSpecificationMoveHelper; - -/** - * Edit policy to restrict border item movement. This edit policy moves the related events when a Time/Duration Observation/Constraint is moved. - */ -public class TimeRelatedSelectionEditPolicy extends BorderItemSelectionEditPolicy { - - @Override - protected Command getMoveCommand(ChangeBoundsRequest request) { - updateRequest(request); - // Prepare request - if (getHost() instanceof IBorderItemEditPart) { - OccurrenceSpecificationMoveHelper.prepareTimeRelatedElementMoveRequest(request, (IBorderItemEditPart) getHost()); - } - // In fact, BorderItem can not be moved out of parent bounds, so the moveDelta if not correctly when move out parent. - Command command = super.getMoveCommand(request); - if (command != null) { - command = OccurrenceSpecificationMoveHelper.completeMoveTimeRelatedElementCommand(command, request, getHost(), getHostFigure()); - } - return command; - } - - /** - * By default, the IBorderItemEditPart can not be moved out of the parent. - * - * @param request - */ - private void updateRequest(ChangeBoundsRequest request) { - IBorderItemEditPart borderItemEP = (IBorderItemEditPart) getHost(); - IBorderItemLocator borderItemLocator = borderItemEP.getBorderItemLocator(); - if (borderItemLocator != null) { - Rectangle initialFeedbackBounds = getInitialFeedbackBounds(); - PrecisionRectangle rect = new PrecisionRectangle(initialFeedbackBounds.getCopy()); - getHostFigure().translateToAbsolute(rect); - rect.translate(request.getMoveDelta()); - rect.resize(request.getSizeDelta()); - getHostFigure().translateToRelative(rect); - Rectangle realLocation = borderItemLocator.getValidLocation(rect.getCopy(), borderItemEP.getFigure()); - Point parentOrigin = borderItemEP.getFigure().getParent().getBounds().getTopLeft(); - Dimension d = realLocation.getTopLeft().getDifference(parentOrigin); - Point newLocation = new Point(d.width, d.height); - if (getHost().getModel() instanceof Node && ((Node) getHost().getModel()).getLayoutConstraint() instanceof Bounds) { - Bounds bounds = (Bounds) ((Node) getHost().getModel()).getLayoutConstraint(); - Point moveDelta = request.getMoveDelta(); - moveDelta.x = newLocation.x - bounds.getX(); - moveDelta.y = newLocation.y - bounds.getY(); - } - } - } - - @Override - protected void showChangeBoundsFeedback(ChangeBoundsRequest request) { - if (getHost() instanceof IBorderItemEditPart) { - OccurrenceSpecificationMoveHelper.prepareTimeRelatedElementMoveRequest(request, (IBorderItemEditPart) getHost()); - } - super.showChangeBoundsFeedback(request); - } -} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/figures/TimeConstraintFigure.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/figures/TimeConstraintFigure.java new file mode 100644 index 00000000000..0445201a03c --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/figures/TimeConstraintFigure.java @@ -0,0 +1,70 @@ +/***************************************************************************** + * Copyright (c) 2018 CEA LIST 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: + * CEA LIST - Initial API and implementation + * + *****************************************************************************/ + +package org.eclipse.papyrus.uml.diagram.sequence.figures; + +import org.eclipse.draw2d.Graphics; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure; +import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.IPapyrusNodeFigure; +import org.eclipse.swt.graphics.Color; +import org.eclipse.uml2.uml.TimeConstraint; +import org.eclipse.uml2.uml.TimeObservation; + +/** + * Specific figure for the {@link TimeConstraint} & {@link TimeObservation}. This may be simplified later as a single line only + */ +public class TimeConstraintFigure extends DefaultSizeNodeFigure implements IPapyrusNodeFigure { + + public TimeConstraintFigure() { + super(60, 1); + } + + @Override + public void paintFigure(Graphics graphics) { + super.paintFigure(graphics); + + graphics.pushState(); + + Rectangle clipRectangle = new Rectangle(); + graphics.getClip(clipRectangle); + graphics.setClip(clipRectangle.expand(Math.max(0, getLineWidth()), Math.max(0, getLineWidth()))); + + graphics.setLineWidth(getLineWidth()); + graphics.drawLine(bounds.x, bounds.y, bounds.x + bounds.width, bounds.y); + + graphics.popState(); + } + + + @Override + public Color getBorderColor() { + return null; + } + + @Override + public boolean isShadow() { + return false; + } + + @Override + public void setBorderColor(Color borderColor) { + + } + + @Override + public void setShadow(boolean shadow) { + + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/locator/TimeElementLocator.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/locator/TimeElementLocator.java new file mode 100644 index 00000000000..74bb6d30a4e --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/locator/TimeElementLocator.java @@ -0,0 +1,143 @@ +/***************************************************************************** + * Copyright (c) 2018 CEA LIST 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: + * CEA LIST - Initial API and implementation + * + *****************************************************************************/ + +package org.eclipse.papyrus.uml.diagram.sequence.locator; + +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.PositionConstants; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator; +import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; +import org.eclipse.uml2.uml.TimeConstraint; +import org.eclipse.uml2.uml.TimeObservation; + +/** + * Specific locator for {@link TimeObservation} or {@link TimeConstraint} on exec spec. + */ +public class TimeElementLocator implements IBorderItemLocator { + + private IFigure parentFigure; + private Rectangle constraint; + + public TimeElementLocator(IFigure parentFigure) { + this.setParentFigure(parentFigure); + } + + @Override + public void setConstraint(Rectangle constraint) { + this.constraint = constraint; + } + + private Rectangle getConstraint() { + return constraint; + } + + @Override + public Rectangle getValidLocation(Rectangle proposedLocation, IFigure borderItem) { + Rectangle realLocation = new Rectangle(proposedLocation); + Point newTopLeft = locateOnBorder(realLocation, borderItem); + realLocation.setLocation(newTopLeft); + return realLocation; + } + + @Override + public int getCurrentSideOfParent() { + if (getConstraint().y() >= 10) { + return PositionConstants.SOUTH; + } + return PositionConstants.NORTH; + } + + @Override + public void relocate(IFigure borderItem) { + Dimension size = getSize(borderItem); + Rectangle rectSuggested = new Rectangle( + getPreferredLocation(borderItem), size); + + // Point ptNewLocation = locateOnBorder(rectSuggested, borderItem); + borderItem.setBounds(rectSuggested); + } + + protected Point locateOnBorder(Rectangle rectSuggested, IFigure borderItem) { + int relativeItemLeft = rectSuggested.x; + + int relativeItemTop = 0; + + if (getConstraint().getTopLeft().y() > 0) { + relativeItemTop = getParentFigure().getBounds().height; + } else { + relativeItemTop = 0; + } + Point pt = getAbsoluteToBorder(new Point(relativeItemLeft, relativeItemTop)); + return pt; + } + + protected IFigure getParentFigure() { + return parentFigure; + } + + protected void setParentFigure(IFigure parentFigure) { + this.parentFigure = parentFigure; + } + + /** + * Gets the size of the border item figure. + * + * @param borderItem + * the figure on border + * @return the size of the border item figure. + */ + protected final Dimension getSize(IFigure borderItem) { + Dimension size = getConstraint().getSize(); + if (size.isEmpty()) { + size = borderItem.getPreferredSize(); + } + return size; + } + + protected Point getPreferredLocation(IFigure borderItem) { + Point constraintLocation = locateOnBorder(getConstraint(), borderItem); + return constraintLocation; + } + + + /** + * Convert the relative coords in the model to ones that are Relative to the + * container (absolute in respect to the main figure) + * + * @param ptRelativeOffset + * @return point + */ + protected Point getAbsoluteToBorder(Point ptRelativeOffset) { + Point parentOrigin = getParentBorder().getTopLeft(); + return parentOrigin.translate(ptRelativeOffset); + } + + /** + * Utility to calculate the parent bounds with consideration for the handle + * bounds inset. + * + * @return Rectangle that is the bounds of the parent. + */ + protected Rectangle getParentBorder() { + Rectangle bounds = getParentFigure().getBounds().getCopy(); + if (getParentFigure() instanceof NodeFigure) { + bounds = ((NodeFigure) getParentFigure()).getHandleBounds() + .getCopy(); + } + return bounds; + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/referencialgrilling/CustomExecutionSpecificationCreationEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/referencialgrilling/CustomExecutionSpecificationCreationEditPolicy.java index 0316f632e59..04f217139e8 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/referencialgrilling/CustomExecutionSpecificationCreationEditPolicy.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/referencialgrilling/CustomExecutionSpecificationCreationEditPolicy.java @@ -15,186 +15,40 @@ package org.eclipse.papyrus.uml.diagram.sequence.referencialgrilling; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.gef.EditPart; -import org.eclipse.gef.Request; -import org.eclipse.gef.commands.Command; -import org.eclipse.gef.requests.CreateRequest; -import org.eclipse.gmf.runtime.common.core.command.CommandResult; -import org.eclipse.gmf.runtime.common.core.command.FileModificationValidator; -import org.eclipse.gmf.runtime.diagram.ui.commands.CommandUtilities; -import org.eclipse.gmf.runtime.diagram.ui.commands.CreateOrSelectElementCommand; -import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.gmf.runtime.common.core.command.ICommand; +import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages; -import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeRequest; -import org.eclipse.gmf.runtime.emf.type.core.IElementType; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor; import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultCreationEditPolicy; -import org.eclipse.papyrus.uml.diagram.sequence.util.SequenceUtil; -import org.eclipse.swt.widgets.Display; +import org.eclipse.papyrus.uml.diagram.sequence.util.DurationLinkUtil; +import org.eclipse.papyrus.uml.service.types.element.UMLDIElementTypes; /** * This allows to define the creation edit policy for the execution specification. */ public class CustomExecutionSpecificationCreationEditPolicy extends DefaultCreationEditPolicy { - /** - * {@inheritDoc} - * - * @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy#getCommand(org.eclipse.gef.Request) - */ @Override - public Command getCommand(Request request) { - if (understandsRequest(request)) { - if (request instanceof CreateUnspecifiedTypeRequest) { - return getUnspecifiedTypeCreateCommand((CreateUnspecifiedTypeRequest) request); - } - } - return super.getCommand(request); - } - - /** - * When this is a {@link CreateUnspecifiedTypeRequest}, we need to check if the position needed by the user is on an ExecutionSpecification because this is not allowed by the UML Norm - * but this will be possible graphically. - * - * @param request - * The unspecified type request. - * @return The command. - */ - @SuppressWarnings("unchecked") - private Command getUnspecifiedTypeCreateCommand( - final CreateUnspecifiedTypeRequest request) { - - final Map createCmds = new HashMap<>(); - List validTypes = new ArrayList<>(); - for (Iterator iter = request.getElementTypes().iterator(); iter - .hasNext();) { - IElementType elementType = iter.next(); - Request createRequest = request.getRequestForType(elementType); - if (createRequest != null) { - EditPart target = SequenceUtil.getParentLifelinePart(getHost().getTargetEditPart(createRequest)); - if (target == null) { - continue; - } - Command individualCmd = target.getCommand(createRequest); - - if (individualCmd != null && individualCmd.canExecute()) { - createCmds.put(elementType, individualCmd); - validTypes.add(elementType); - } + protected ICommand getSetBoundsCommand(CreateViewRequest request, ViewDescriptor descriptor) { + if (UMLDIElementTypes.TIME_CONSTRAINT_SHAPE.getSemanticHint().equals(descriptor.getSemanticHint()) + || UMLDIElementTypes.TIME_OBSERVATION_SHAPE.getSemanticHint().equals(descriptor.getSemanticHint())) { + // check the position of the request to give the basic constraint for the created shape (should not be moveable) + Point location = request.getLocation().getCopy(); + location.setX(-10); + boolean isStart = DurationLinkUtil.isStart(((IGraphicalEditPart) getHost()).getFigure(), location); + if (isStart) { + location.setY(-1); + } else { + location.setY(10); } + Dimension size = new Dimension(40, 1); + return new SetBoundsCommand(((IGraphicalEditPart) getHost()).getEditingDomain(), DiagramUIMessages.Commands_MoveElement, descriptor, new Rectangle(location, size)); } - - if (createCmds.isEmpty()) { - return null; - } else if (createCmds.size() == 1) { - return (Command) createCmds.values().toArray()[0]; - } else { - CreateOrSelectElementCommand selectAndCreateViewCmd = new CreateOrSelectElementCommand( - DiagramUIMessages.CreateCommand_Label, Display.getCurrent() - .getActiveShell(), - validTypes) { - - private Command _createCmd; - - /** - * Execute the command that prompts the user with the popup - * menu, then executes the command prepared for the element - * type that the user selected. - */ - @Override - protected CommandResult doExecuteWithResult( - IProgressMonitor progressMonitor, IAdaptable info) - throws ExecutionException { - - CommandResult cmdResult = super.doExecuteWithResult(progressMonitor, info); - if (!cmdResult.getStatus().isOK()) { - return cmdResult; - } - - IElementType type = (IElementType) cmdResult - .getReturnValue(); - - _createCmd = createCmds.get(type); - Assert.isTrue(_createCmd != null && _createCmd.canExecute()); - - // validate the affected files - IStatus status = validateAffectedFiles(_createCmd); - if (!status.isOK()) { - return new CommandResult(status); - } - - _createCmd.execute(); - - // Set the result in the unspecified type request. - CreateRequest createRequest = request - .getRequestForType(type); - - Collection newObject = ((Collection) createRequest - .getNewObject()); - request.setNewObject(newObject); - - return CommandResult.newOKCommandResult(newObject); - } - - @Override - protected CommandResult doUndoWithResult( - IProgressMonitor progressMonitor, IAdaptable info) - throws ExecutionException { - - if (_createCmd != null && _createCmd.canUndo()) { - // validate the affected files - IStatus status = validateAffectedFiles(_createCmd); - if (!status.isOK()) { - return new CommandResult(status); - } - _createCmd.undo(); - } - return super.doUndoWithResult(progressMonitor, info); - } - - @Override - protected CommandResult doRedoWithResult( - IProgressMonitor progressMonitor, IAdaptable info) - throws ExecutionException { - - if (_createCmd != null && CommandUtilities.canRedo(_createCmd)) { - // validate the affected files - IStatus status = validateAffectedFiles(_createCmd); - if (!status.isOK()) { - return new CommandResult(status); - } - _createCmd.redo(); - } - return super.doRedoWithResult(progressMonitor, info); - } - - private IStatus validateAffectedFiles(Command command) { - Collection affectedFiles = CommandUtilities - .getAffectedFiles(command); - int fileCount = affectedFiles.size(); - if (fileCount > 0) { - return FileModificationValidator - .approveFileModification(affectedFiles - .toArray(new IFile[fileCount])); - } - return Status.OK_STATUS; - } - }; - - return new ICommandProxy(selectAndCreateViewCmd); - } + return super.getSetBoundsCommand(request, descriptor); } } diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/sequenceDiagram.gmfgen b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/sequenceDiagram.gmfgen index e1d0efa3a1b..db69337c456 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/sequenceDiagram.gmfgen +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/model/sequenceDiagram.gmfgen @@ -484,6 +484,7 @@ itemSemanticEditPolicyClassName="ActionExecutionSpecificationItemSemanticEditPolicy" notationViewFactoryClassName="ActionExecutionSpecificationViewFactory" canonicalEditPolicyClassName="ActionExecutionSpecificationCanonicalEditPolicy" + childNodes="/0/@diagram/@childNodes.13" graphicalNodeEditPolicyClassName="ActionExecutionSpecificationGraphicalNodeEditPolicy" createCommandClassName="ActionExecutionSpecificationCreateCommand" containers="/0/@diagram/@childNodes.5"> @@ -508,7 +509,7 @@ + editPolicyQualifiedClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ExecutionSpecificationGraphicalNodeEditPolicy"/> @@ -552,7 +554,7 @@ + editPolicyQualifiedClassName="org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ExecutionSpecificationGraphicalNodeEditPolicy"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2178,11 +2268,11 @@ qualifiedName="org.eclipse.papyrus.uml.diagram.common.parser.CommentParser"/> + + + + + diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/plugin.xml b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/plugin.xml index a3eb0dfd578..aab854be387 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/plugin.xml +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/plugin.xml @@ -135,7 +135,7 @@ - + @@ -148,13 +148,13 @@ - + - + diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/ActionExecutionSpecificationEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/ActionExecutionSpecificationEditPart.java index 859b779b024..33c652268b0 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/ActionExecutionSpecificationEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/ActionExecutionSpecificationEditPart.java @@ -25,15 +25,21 @@ import org.eclipse.gef.editpolicies.LayoutEditPolicy; import org.eclipse.gef.editpolicies.NonResizableEditPolicy; import org.eclipse.gef.editpolicies.ResizableEditPolicy; import org.eclipse.gef.requests.CreateRequest; +import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; +import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout; import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultCreationEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultGraphicalNodeEditPolicy; import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultSemanticEditPolicy; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.IPapyrusNodeFigure; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.RoundedRectangleNodePlateFigure; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.SelectableBorderedNodeFigure; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.BorderItemResizableEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ExecutionSpecificationComponentEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ExecutionSpecificationGraphicalNodeEditPolicy; +import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry; import org.eclipse.swt.graphics.Color; /** @@ -68,9 +74,16 @@ public class ActionExecutionSpecificationEditPart extends AbstractExecutionSpeci */ @Override protected void createDefaultEditPolicies() { + installEditPolicy(EditPolicyRoles.CREATION_ROLE, new DefaultCreationEditPolicy()); super.createDefaultEditPolicies(); installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new DefaultSemanticEditPolicy()); + installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new DefaultGraphicalNodeEditPolicy()); + + installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new DragDropEditPolicy()); + // in Papyrus diagrams are not strongly synchronised + // installEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CANONICAL_ROLE, new org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ActionExecutionSpecificationCanonicalEditPolicy()); + installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy()); installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ExecutionSpecificationGraphicalNodeEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new ExecutionSpecificationComponentEditPolicy()); @@ -97,6 +110,14 @@ public class ActionExecutionSpecificationEditPart extends AbstractExecutionSpeci @Override protected EditPolicy createChildEditPolicy(EditPart child) { + View childView = (View) child.getModel(); + String vid = UMLVisualIDRegistry.getVisualID(childView); + if (vid != null) { + switch (vid) { + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return new BorderItemResizableEditPolicy(); + } + } EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); if (result == null) { result = new NonResizableEditPolicy(); @@ -167,7 +188,7 @@ public class ActionExecutionSpecificationEditPart extends AbstractExecutionSpeci * @generated */ @Override - protected NodeFigure createNodeFigure() { + protected NodeFigure createMainFigure() { return new SelectableBorderedNodeFigure(createMainFigureWithSVG()); } @@ -182,6 +203,11 @@ public class ActionExecutionSpecificationEditPart extends AbstractExecutionSpeci */ @Override protected IFigure setupContentPane(IFigure nodeShape) { + if (nodeShape.getLayoutManager() == null) { + ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout(); + layout.setSpacing(5); + nodeShape.setLayoutManager(layout); + } return nodeShape; // use nodeShape itself as contentPane } diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/BehaviorExecutionSpecificationEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/BehaviorExecutionSpecificationEditPart.java index d22ce3a565a..653e33016f4 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/BehaviorExecutionSpecificationEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/BehaviorExecutionSpecificationEditPart.java @@ -25,15 +25,21 @@ import org.eclipse.gef.editpolicies.LayoutEditPolicy; import org.eclipse.gef.editpolicies.NonResizableEditPolicy; import org.eclipse.gef.editpolicies.ResizableEditPolicy; import org.eclipse.gef.requests.CreateRequest; +import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; +import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout; import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultCreationEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultGraphicalNodeEditPolicy; import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultSemanticEditPolicy; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.IPapyrusNodeFigure; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.RoundedRectangleNodePlateFigure; import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.SelectableBorderedNodeFigure; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.BorderItemResizableEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ExecutionSpecificationComponentEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ExecutionSpecificationGraphicalNodeEditPolicy; +import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry; import org.eclipse.swt.graphics.Color; /** @@ -68,9 +74,16 @@ public class BehaviorExecutionSpecificationEditPart extends AbstractExecutionSpe */ @Override protected void createDefaultEditPolicies() { + installEditPolicy(EditPolicyRoles.CREATION_ROLE, new DefaultCreationEditPolicy()); super.createDefaultEditPolicies(); installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new DefaultSemanticEditPolicy()); + installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new DefaultGraphicalNodeEditPolicy()); + + installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE, new DragDropEditPolicy()); + // in Papyrus diagrams are not strongly synchronised + // installEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CANONICAL_ROLE, new org.eclipse.papyrus.uml.diagram.sequence.edit.policies.BehaviorExecutionSpecificationCanonicalEditPolicy()); + installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy()); installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ExecutionSpecificationGraphicalNodeEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new ExecutionSpecificationComponentEditPolicy()); @@ -86,6 +99,14 @@ public class BehaviorExecutionSpecificationEditPart extends AbstractExecutionSpe @Override protected EditPolicy createChildEditPolicy(EditPart child) { + View childView = (View) child.getModel(); + String vid = UMLVisualIDRegistry.getVisualID(childView); + if (vid != null) { + switch (vid) { + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return new BorderItemResizableEditPolicy(); + } + } EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); if (result == null) { result = new NonResizableEditPolicy(); @@ -166,7 +187,7 @@ public class BehaviorExecutionSpecificationEditPart extends AbstractExecutionSpe * @generated */ @Override - protected NodeFigure createNodeFigure() { + protected NodeFigure createMainFigure() { return new SelectableBorderedNodeFigure(createMainFigureWithSVG()); } @@ -181,6 +202,11 @@ public class BehaviorExecutionSpecificationEditPart extends AbstractExecutionSpe */ @Override protected IFigure setupContentPane(IFigure nodeShape) { + if (nodeShape.getLayoutManager() == null) { + ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout(); + layout.setSpacing(5); + nodeShape.setLayoutManager(layout); + } return nodeShape; // use nodeShape itself as contentPane } diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintAppliedStereotypeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintAppliedStereotypeEditPart.java new file mode 100644 index 00000000000..2f093e81fea --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintAppliedStereotypeEditPart.java @@ -0,0 +1,852 @@ +/** + * Copyright (c) 2016 CEA LIST. + * + * 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: + * CEA LIST - Initial API and implementation + */ +package org.eclipse.papyrus.uml.diagram.sequence.edit.parts; + +import java.util.Collections; +import java.util.List; + +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.Label; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.transaction.RecordingCommand; +import org.eclipse.emf.transaction.RunnableWithResult; +import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.gef.AccessibleEditPart; +import org.eclipse.gef.EditPolicy; +import org.eclipse.gef.Request; +import org.eclipse.gef.requests.DirectEditRequest; +import org.eclipse.gef.tools.DirectEditManager; +import org.eclipse.gmf.runtime.common.ui.services.parser.IParser; +import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus; +import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy; +import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator; +import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry; +import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants; +import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager; +import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel; +import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser; +import org.eclipse.gmf.runtime.notation.FontStyle; +import org.eclipse.gmf.runtime.notation.NotationPackage; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.text.contentassist.IContentAssistProcessor; +import org.eclipse.jface.viewers.ICellEditorValidator; +import org.eclipse.jface.window.Window; +import org.eclipse.papyrus.extensionpoints.editors.Activator; +import org.eclipse.papyrus.extensionpoints.editors.configuration.IAdvancedEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.configuration.ICustomDirectEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.configuration.IPopupEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.ui.ExtendedDirectEditionDialog; +import org.eclipse.papyrus.extensionpoints.editors.ui.ILabelEditorDialog; +import org.eclipse.papyrus.extensionpoints.editors.ui.IPopupEditorHelper; +import org.eclipse.papyrus.extensionpoints.editors.utils.DirectEditorsUtil; +import org.eclipse.papyrus.extensionpoints.editors.utils.IDirectEditorsIds; +import org.eclipse.papyrus.infra.gmfdiag.common.editpart.PapyrusLabelEditPart; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.ExternalLabelPrimaryDragRoleEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.IMaskManagedLabelEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.IndirectMaskLabelEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.parsers.ParserUtil; +import org.eclipse.papyrus.uml.diagram.common.directedit.MultilineLabelDirectEditManager; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.AppliedStereotypeExternalNodeEditPolicy; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.AppliedStereotypeLabelDisplayEditPolicy; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.IDirectEdition; +import org.eclipse.papyrus.uml.diagram.common.figure.node.AppliedStereotypeWrappingLabelFigure; +import org.eclipse.papyrus.uml.diagram.common.figure.node.ILabelFigure; +import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.UMLTextSelectionEditPolicy; +import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry; +import org.eclipse.papyrus.uml.diagram.sequence.providers.UMLElementTypes; +import org.eclipse.swt.SWT; +import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.PlatformUI; +import org.eclipse.uml2.uml.Feature; + +/** + * @generated + */ +public class TimeConstraintAppliedStereotypeEditPart extends PapyrusLabelEditPart + implements ITextAwareEditPart, IBorderItemEditPart { + + /** + * @generated + */ + public static final String VISUAL_ID = "TimeConstraint_StereotypeLabel"; + + /** + * @generated + */ + private DirectEditManager manager; + + /** + * @generated + */ + private IParser parser; + + /** + * @generated + */ + private List parserElements; + + /** + * @generated + */ + private String defaultText; + + /** + * direct edition mode (default, undefined, registered editor, etc.) + * + * @generated + */ + protected int directEditionMode = IDirectEdition.UNDEFINED_DIRECT_EDITOR; + + /** + * configuration from a registered edit dialog + * + * @generated + */ + protected IDirectEditorConfiguration configuration; + + /** + * @generated + */ + static { + registerSnapBackPosition(UMLVisualIDRegistry.getType( + org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintAppliedStereotypeEditPart.VISUAL_ID), + new Point(0, 0)); + } + + /** + * @generated + */ + public TimeConstraintAppliedStereotypeEditPart(View view) { + super(view); + } + + /** + * @generated + */ + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy()); + installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new UMLTextSelectionEditPolicy()); + installEditPolicy(AppliedStereotypeLabelDisplayEditPolicy.STEREOTYPE_LABEL_POLICY, + new AppliedStereotypeExternalNodeEditPolicy()); + installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new ExternalLabelPrimaryDragRoleEditPolicy()); + } + + /** + * @generated + */ + @Override + public IBorderItemLocator getBorderItemLocator() { + IFigure parentFigure = getFigure().getParent(); + if (parentFigure != null && parentFigure.getLayoutManager() != null) { + Object constraint = parentFigure.getLayoutManager().getConstraint(getFigure()); + return (IBorderItemLocator) constraint; + } + return null; + } + + /** + * @generated + */ + @Override + public void refreshBounds() { + int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_X())).intValue(); + int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_Y())).intValue(); + int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Width())).intValue(); + int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Height())).intValue(); + getBorderItemLocator().setConstraint(new Rectangle(x, y, width, height)); + } + + /** + * @generated + */ + protected String getLabelTextHelper(IFigure figure) { + if (figure instanceof WrappingLabel) { + return ((WrappingLabel) figure).getText(); + } else if (figure instanceof ILabelFigure) { + return ((ILabelFigure) figure).getText(); + } else { + return ((Label) figure).getText(); + } + } + + /** + * @generated + */ + protected void setLabelTextHelper(IFigure figure, String text) { + if (figure instanceof WrappingLabel) { + ((WrappingLabel) figure).setText(text); + } else if (figure instanceof ILabelFigure) { + ((ILabelFigure) figure).setText(text); + } else { + ((Label) figure).setText(text); + } + } + + /** + * @generated + */ + protected Image getLabelIconHelper(IFigure figure) { + if (figure instanceof WrappingLabel) { + return ((WrappingLabel) figure).getIcon(); + } else if (figure instanceof ILabelFigure) { + return ((ILabelFigure) figure).getIcon(); + } else { + return ((Label) figure).getIcon(); + } + } + + /** + * @generated + */ + protected void setLabelIconHelper(IFigure figure, Image icon) { + if (figure instanceof WrappingLabel) { + ((WrappingLabel) figure).setIcon(icon); + } else if (figure instanceof ILabelFigure) { + ((ILabelFigure) figure).setIcon(icon); + } else { + ((Label) figure).setIcon(icon); + } + } + + /** + * @generated + */ + public void setLabel(IFigure figure) { + unregisterVisuals(); + setFigure(figure); + defaultText = getLabelTextHelper(figure); + registerVisuals(); + refreshVisuals(); + } + + /** + * @generated + */ + @Override + protected List getModelChildren() { + return Collections.EMPTY_LIST; + } + + /** + * @generated + */ + @Override + public IGraphicalEditPart getChildBySemanticHint(String semanticHint) { + return null; + } + + /** + * @generated + */ + public void setParser(IParser parser) { + this.parser = parser; + } + + /** + * @generated + */ + protected EObject getParserElement() { + return resolveSemanticElement(); + } + + /** + * @generated + */ + protected Image getLabelIcon() { + return null; + } + + /** + * @generated + */ + protected String getLabelText() { + String text = null; + EObject parserElement = getParserElement(); + if (parserElement != null && getParser() != null) { + text = getParser().getPrintString(ParserUtil.getParserAdapter(getParserElement(), this), + getParserOptions().intValue()); + } + if (text == null || text.length() == 0) { + text = defaultText; + } + return text; + } + + /** + * @generated + */ + @Override + public void setLabelText(String text) { + setLabelTextHelper(getFigure(), text); + Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); + if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback(); + } + Object sfEditPolicy = getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE); + if (sfEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) sfEditPolicy).refreshFeedback(); + } + } + + /** + * @generated + */ + @Override + public String getEditText() { + if (getParserElement() == null || getParser() == null) { + return ""; //$NON-NLS-1$ + } + return getParser().getEditString(ParserUtil.getParserAdapter(getParserElement(), this), + getParserOptions().intValue()); + } + + /** + * @generated + */ + protected boolean isEditable() { + return false; + } + + /** + * @generated + */ + @Override + public ICellEditorValidator getEditTextValidator() { + return new ICellEditorValidator() { + + @Override + public String isValid(final Object value) { + if (value instanceof String) { + final EObject element = getParserElement(); + final IParser parser = getParser(); + try { + IParserEditStatus valid = (IParserEditStatus) getEditingDomain() + .runExclusive(new RunnableWithResult.Impl() { + + @Override + public void run() { + setResult( + parser.isValidEditString( + ParserUtil.getParserAdapter(getParserElement(), + TimeConstraintAppliedStereotypeEditPart.this), + (String) value)); + } + }); + return valid.getCode() == IParserEditStatus.EDITABLE ? null : valid.getMessage(); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + + // shouldn't get here + return null; + } + }; + } + + /** + * @generated + */ + @Override + public IContentAssistProcessor getCompletionProcessor() { + if (getParserElement() == null || getParser() == null) { + return null; + } + return getParser().getCompletionProcessor(ParserUtil.getParserAdapter(getParserElement(), this)); + } + + /** + * @generated + */ + @Override + public ParserOptions getParserOptions() { + return ParserOptions.NONE; + } + + /** + * @generated + */ + @Override + public IParser getParser() { + if (parser == null) { + parser = ParserUtil.getParser(UMLElementTypes.TimeConstraint_Shape, getParserElement(), this, VISUAL_ID); + } + return parser; + } + + /** + * @generated + */ + protected DirectEditManager getManager() { + if (manager == null) { + setManager(new MultilineLabelDirectEditManager(this, + MultilineLabelDirectEditManager.getTextCellEditorClass(this), + UMLEditPartFactory.getTextCellEditorLocator(this))); + } + return manager; + } + + /** + * @generated + */ + protected void setManager(DirectEditManager manager) { + this.manager = manager; + } + + /** + * @generated + */ + protected void performDirectEdit() { + BusyIndicator.showWhile(Display.getDefault(), new java.lang.Runnable() { + + @Override + public void run() { + getManager().show(); + } + }); + } + + /** + * @generated + */ + protected void performDirectEdit(Point eventLocation) { + if (getManager() instanceof TextDirectEditManager) { + ((TextDirectEditManager) getManager()).show(eventLocation.getSWTPoint()); + } + } + + /** + * @generated + */ + protected void performDirectEdit(char initialCharacter) { + if (getManager() instanceof TextDirectEditManager) { + ((TextDirectEditManager) getManager()).show(initialCharacter); + } else { + performDirectEdit(); + } + } + + /** + * @generated + */ + @Override + protected void performDirectEditRequest(Request request) { + + final Request theRequest = request; + + if (IDirectEdition.UNDEFINED_DIRECT_EDITOR == directEditionMode) { + directEditionMode = getDirectEditionType(); + } + switch (directEditionMode) { + case IDirectEdition.NO_DIRECT_EDITION: + // no direct edition mode => does nothing + return; + case IDirectEdition.EXTENDED_DIRECT_EDITOR: + updateExtendedEditorConfiguration(); + if (configuration == null || configuration.getLanguage() == null) { + // Create default edit manager + setManager(new MultilineLabelDirectEditManager(this, + MultilineLabelDirectEditManager.getTextCellEditorClass(this), + UMLEditPartFactory.getTextCellEditorLocator(this))); + performDefaultDirectEditorEdit(theRequest); + } else { + configuration.preEditAction(resolveSemanticElement()); + Dialog dialog = null; + if (configuration instanceof ICustomDirectEditorConfiguration) { + setManager(((ICustomDirectEditorConfiguration) configuration).createDirectEditManager(this)); + initializeDirectEditManager(theRequest); + return; + } else if (configuration instanceof IPopupEditorConfiguration) { + IPopupEditorHelper helper = ((IPopupEditorConfiguration) configuration) + .createPopupEditorHelper(this); + helper.showEditor(); + return; + } else if (configuration instanceof IAdvancedEditorConfiguration) { + dialog = ((IAdvancedEditorConfiguration) configuration).createDialog( + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), resolveSemanticElement(), + configuration.getTextToEdit(resolveSemanticElement())); + } else if (configuration instanceof IDirectEditorConfiguration) { + dialog = new ExtendedDirectEditionDialog( + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), resolveSemanticElement(), + configuration.getTextToEdit(resolveSemanticElement()), configuration); + } else { + return; + } + final Dialog finalDialog = dialog; + + if (Window.OK == dialog.open()) { + TransactionalEditingDomain domain = getEditingDomain(); + RecordingCommand command = new RecordingCommand(domain, "Edit Label") { + + @Override + protected void doExecute() { + configuration.postEditAction(resolveSemanticElement(), + ((ILabelEditorDialog) finalDialog).getValue()); + + } + }; + domain.getCommandStack().execute(command); + } + } + break; + case IDirectEdition.DEFAULT_DIRECT_EDITOR: + initializeDirectEditManager(theRequest); + break; + default: + break; + } + } + + /** + * @generated + */ + protected void initializeDirectEditManager(final Request request) { + // initialize the direct edit manager + try { + getEditingDomain().runExclusive(new Runnable() { + @Override + public void run() { + if (isActive() && isEditable()) { + if (request.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) { + Character initialChar = (Character) request.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); + performDirectEdit(initialChar.charValue()); + } else { + performDirectEdit(); + } + } + } + }); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * @generated + */ + @Override + protected void refreshVisuals() { + super.refreshVisuals(); + refreshLabel(); + refreshFont(); + refreshFontColor(); + refreshUnderline(); + refreshStrikeThrough(); + } + + /** + * @generated + */ + protected void refreshLabel() { + EditPolicy maskLabelPolicy = getEditPolicy(IMaskManagedLabelEditPolicy.MASK_MANAGED_LABEL_EDIT_POLICY); + if (maskLabelPolicy == null) { + maskLabelPolicy = getEditPolicy(IndirectMaskLabelEditPolicy.INDRIRECT_MASK_MANAGED_LABEL); + } + if (maskLabelPolicy == null) { + View view = (View) getModel(); + if (view.isVisible()) { + setLabelTextHelper(getFigure(), getLabelText()); + setLabelIconHelper(getFigure(), getLabelIcon()); + } else { + setLabelTextHelper(getFigure(), ""); //$NON-NLS-1$ + setLabelIconHelper(getFigure(), null); + } + } + Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); + if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback(); + } + Object sfEditPolicy = getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE); + if (sfEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) sfEditPolicy).refreshFeedback(); + } + } + + /** + * @generated + */ + protected void refreshUnderline() { + FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle()); + if (style != null && getFigure() instanceof WrappingLabel) { + ((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline()); + } + if (resolveSemanticElement() instanceof Feature) { + if (((Feature) resolveSemanticElement()).isStatic()) { + ((WrappingLabel) getFigure()).setTextUnderline(true); + } else { + ((WrappingLabel) getFigure()).setTextUnderline(false); + } + } + } + + /** + * @generated + */ + protected void refreshStrikeThrough() { + FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle()); + if (style != null && getFigure() instanceof WrappingLabel) { + ((WrappingLabel) getFigure()).setTextStrikeThrough(style.isStrikeThrough()); + } + } + + /** + * @generated + */ + @Override + protected void refreshFont() { + FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle()); + if (style != null) { + FontData fontData = new FontData(style.getFontName(), style.getFontHeight(), + (style.isBold() ? SWT.BOLD : SWT.NORMAL) | (style.isItalic() ? SWT.ITALIC : SWT.NORMAL)); + setFont(fontData); + } + } + + /** + * @generated + */ + @Override + protected void setFontColor(Color color) { + getFigure().setForegroundColor(color); + } + + /** + * @generated + */ + @Override + protected void addSemanticListeners() { + if (getParser() instanceof ISemanticParser) { + EObject element = resolveSemanticElement(); + parserElements = ((ISemanticParser) getParser()).getSemanticElementsBeingParsed(element); + for (int i = 0; i < parserElements.size(); i++) { + addListenerFilter("SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$ + } + } else { + super.addSemanticListeners(); + } + } + + /** + * @generated + */ + @Override + protected void removeSemanticListeners() { + if (parserElements != null) { + for (int i = 0; i < parserElements.size(); i++) { + removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$ + } + } else { + super.removeSemanticListeners(); + } + } + + /** + * @generated + */ + @Override + protected AccessibleEditPart getAccessibleEditPart() { + if (accessibleEP == null) { + accessibleEP = new AccessibleGraphicalEditPart() { + + @Override + public void getName(AccessibleEvent e) { + e.result = getLabelTextHelper(getFigure()); + } + }; + } + return accessibleEP; + } + + /** + * @generated + */ + private View getFontStyleOwnerView() { + return getPrimaryView(); + } + + /** + * Returns the kind of associated editor for direct edition. + * + * @return an int corresponding to the kind of direct editor, @see org.eclipse.papyrus.uml.diagram.common.editpolicies.IDirectEdition + * @generated + */ + public int getDirectEditionType() { + // The label is read-only (defined in GMFGen model) + return IDirectEdition.NO_DIRECT_EDITION; + } + + /** + * Checks if an extended editor is present. + * + * @return true if an extended editor is present. + * @generated + */ + protected boolean checkExtendedEditor() { + if (resolveSemanticElement() != null) { + return DirectEditorsUtil.hasSpecificEditorConfiguration(resolveSemanticElement(), this); + } + return false; + } + + /** + * Checks if a default direct edition is available + * + * @return true if a default direct edition is available + * @generated + */ + protected boolean checkDefaultEdition() { + return (getParser() != null); + } + + /** + * Initializes the extended editor configuration + * + * @generated + */ + protected void initExtendedEditorConfiguration() { + if (configuration == null) { + final String languagePreferred = Activator.getDefault().getPreferenceStore().getString( + IDirectEditorsIds.EDITOR_FOR_ELEMENT + resolveSemanticElement().eClass().getInstanceClassName()); + if (languagePreferred != null && !languagePreferred.equals("")) { + configuration = DirectEditorsUtil.findEditorConfiguration(languagePreferred, resolveSemanticElement(), + this); + } else { + configuration = DirectEditorsUtil.findEditorConfiguration(IDirectEditorsIds.UML_LANGUAGE, + resolveSemanticElement(), this); + } + } + } + + /** + * Updates the preference configuration + * + * @generated + */ + protected void updateExtendedEditorConfiguration() { + String languagePreferred = Activator.getDefault().getPreferenceStore().getString( + IDirectEditorsIds.EDITOR_FOR_ELEMENT + resolveSemanticElement().eClass().getInstanceClassName()); + if (languagePreferred != null && !languagePreferred.equals("") + && !languagePreferred.equals(configuration.getLanguage())) { + configuration = DirectEditorsUtil.findEditorConfiguration(languagePreferred, resolveSemanticElement(), + this); + } else if (IDirectEditorsIds.SIMPLE_DIRECT_EDITOR.equals(languagePreferred)) { + configuration = null; + } + } + + /** + * Performs the direct edit usually used by GMF editors. + * + * @param theRequest + * the direct edit request that starts the direct edit system + * @generated + */ + protected void performDefaultDirectEditorEdit(final Request theRequest) { + // initialize the direct edit manager + try { + getEditingDomain().runExclusive(new Runnable() { + + @Override + public void run() { + if (isActive() && isEditable()) { + if (theRequest.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) { + Character initialChar = (Character) theRequest.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); + performDirectEdit(initialChar.charValue()); + } else if ((theRequest instanceof DirectEditRequest) + && (getEditText().equals(getLabelText()))) { + DirectEditRequest editRequest = (DirectEditRequest) theRequest; + performDirectEdit(editRequest.getLocation()); + } else { + performDirectEdit(); + } + } + } + }); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * @generated + */ + @Override + protected void handleNotificationEvent(Notification event) { + Object feature = event.getFeature(); + if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) { + Integer c = (Integer) event.getNewValue(); + setFontColor(DiagramColorRegistry.getInstance().getColor(c)); + } else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(feature)) { + refreshUnderline(); + } else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough().equals(feature)) { + refreshStrikeThrough(); + } else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) + || NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature) + || NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) + || NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) { + refreshFont(); + } else { + if (getParser() != null && getParser().isAffectingEvent(event, getParserOptions().intValue())) { + refreshLabel(); + } + if (getParser() instanceof ISemanticParser) { + ISemanticParser modelParser = (ISemanticParser) getParser(); + if (modelParser.areSemanticElementsAffected(null, event)) { + removeSemanticListeners(); + if (resolveSemanticElement() != null) { + addSemanticListeners(); + } + refreshLabel(); + } + } + } + super.handleNotificationEvent(event); + } + + /** + * @generated + */ + @Override + protected IFigure createFigure() { + IFigure label = createFigurePrim(); + defaultText = getLabelTextHelper(label); + return label; + } + + /** + * @generated + */ + protected IFigure createFigurePrim() { + return new AppliedStereotypeWrappingLabelFigure(); + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintBorderNodeEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintBorderNodeEditPart.java new file mode 100644 index 00000000000..5558d8d104f --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintBorderNodeEditPart.java @@ -0,0 +1,303 @@ +/** + * Copyright (c) 2016 CEA LIST. + * + * 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: + * CEA LIST - Initial API and implementation + */ +package org.eclipse.papyrus.uml.diagram.sequence.edit.parts; + +import java.util.Collections; +import java.util.List; + +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.PositionConstants; +import org.eclipse.draw2d.StackLayout; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.gef.EditPart; +import org.eclipse.gef.EditPolicy; +import org.eclipse.gef.GraphicalEditPart; +import org.eclipse.gef.Request; +import org.eclipse.gef.commands.Command; +import org.eclipse.gef.editpolicies.LayoutEditPolicy; +import org.eclipse.gef.editpolicies.NonResizableEditPolicy; +import org.eclipse.gef.handles.MoveHandle; +import org.eclipse.gef.requests.CreateRequest; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy; +import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; +import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator; +import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; +import org.eclipse.gmf.runtime.notation.BasicCompartment; +import org.eclipse.gmf.runtime.notation.Edge; +import org.eclipse.gmf.runtime.notation.NotationPackage; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultGraphicalNodeEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.DefaultSemanticEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.IPapyrusNodeFigure; +import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.RoundedRectangleNodePlateFigure; +import org.eclipse.papyrus.uml.diagram.common.editparts.BorderNodeEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.figures.TimeConstraintFigure; +import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry; +import org.eclipse.swt.graphics.Color; + +/** + * @generated + */ +public class TimeConstraintBorderNodeEditPart extends BorderNodeEditPart { + + /** + * @generated + */ + public static final String VISUAL_ID = "TimeConstraint_Shape"; + + /** + * @generated + */ + protected IFigure contentPane; + + /** + * @generated + */ + protected IFigure primaryShape; + + /** + * @generated + */ + public TimeConstraintBorderNodeEditPart(View view) { + super(view); + } + + /** + * @generated + */ + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, getPrimaryDragEditPolicy()); + installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new DefaultSemanticEditPolicy()); + + installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new DefaultGraphicalNodeEditPolicy()); + + installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy()); + // XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies + // removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE); + } + + /** + * @generated + */ + protected LayoutEditPolicy createLayoutEditPolicy() { + org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() { + + @Override + protected EditPolicy createChildEditPolicy(EditPart child) { + View childView = (View) child.getModel(); + String vid = UMLVisualIDRegistry.getVisualID(childView); + if (vid != null) { + switch (vid) { + case TimeConstraintNameEditPart.VISUAL_ID: + case TimeConstraintAppliedStereotypeEditPart.VISUAL_ID: + return new BorderItemSelectionEditPolicy() { + + @Override + protected List createSelectionHandles() { + MoveHandle mh = new MoveHandle((GraphicalEditPart) getHost()); + mh.setBorder(null); + return Collections.singletonList(mh); + } + }; + } + } + EditPolicy result = child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); + if (result == null) { + result = new NonResizableEditPolicy(); + } + return result; + } + + @Override + protected Command getMoveChildrenCommand(Request request) { + return null; + } + + @Override + protected Command getCreateCommand(CreateRequest request) { + return null; + } + }; + return lep; + } + + /** + * Papyrus codeGen + * + * @generated + **/ + @Override + protected void handleNotificationEvent(Notification event) { + /* + * when a node have external node labels, the methods refreshChildren() remove the EditPart corresponding to the Label from the EditPart + * Registry. After that, we can't reset the visibility to true (using the Show/Hide Label Action)! + */ + if (NotationPackage.eINSTANCE.getView_Visible().equals(event.getFeature())) { + Object notifier = event.getNotifier(); + List modelChildren = ((View) getModel()).getChildren(); + if (false == notifier instanceof Edge && false == notifier instanceof BasicCompartment) { + if (modelChildren.contains(event.getNotifier())) { + return; + } + } + } + super.handleNotificationEvent(event); + + } + + /** + * @generated + */ + protected IFigure createNodeShape() { + return primaryShape = new TimeConstraintFigure(); + } + + @Override + public void refreshVisuals() { + super.refreshVisuals(); + } + + @Override + protected void refreshBounds() { + if (getBorderItemLocator() != null) { + int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_X())).intValue(); + int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_Y())).intValue(); + Point loc = new Point(x, y); + + int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Width())).intValue(); + int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Height())).intValue(); + Dimension size = new Dimension(width, height); + + getBorderItemLocator().setConstraint(new Rectangle(loc, size)); + } else { + super.refreshBounds(); + } + } + + /** + * org.eclipse.papyrus.uml.diagram.sequence.figures.TimeConstraintFigure + * + * @generated + */ + @Override + public TimeConstraintFigure getPrimaryShape() { + return (TimeConstraintFigure) primaryShape; + } + + /** + * @generated + */ + @Override + protected void addBorderItem(IFigure borderItemContainer, IBorderItemEditPart borderItemEditPart) { + if (borderItemEditPart instanceof TimeConstraintNameEditPart + || borderItemEditPart instanceof TimeConstraintAppliedStereotypeEditPart) { + BorderItemLocator locator = new BorderItemLocator(getMainFigure(), PositionConstants.SOUTH); + locator.setBorderItemOffset(new Dimension(-20, -20)); + borderItemContainer.add(borderItemEditPart.getFigure(), locator); + } else { + super.addBorderItem(borderItemContainer, borderItemEditPart); + } + } + + /** + * @generated + */ + protected NodeFigure createNodePlate() { + RoundedRectangleNodePlateFigure result = new RoundedRectangleNodePlateFigure(40, 1); + return result; + } + + /** + * Creates figure for this edit part. + * + * Body of this method does not depend on settings in generation model + * so you may safely remove generated tag and modify it. + * + * @generated + */ + @Override + protected NodeFigure createMainFigure() { + NodeFigure figure = createNodePlate(); + figure.setLayoutManager(new StackLayout()); + IFigure shape = createNodeShape(); + figure.add(shape); + contentPane = setupContentPane(shape); + return figure; + + } + + /** + * Default implementation treats passed figure as content pane. + * Respects layout one may have set for generated figure. + * + * @param nodeShape + * instance of generated figure class + * @generated + */ + protected IFigure setupContentPane(IFigure nodeShape) { + return nodeShape; // use nodeShape itself as contentPane + } + + /** + * @generated + */ + @Override + public IFigure getContentPane() { + if (contentPane != null) { + return contentPane; + } + return super.getContentPane(); + } + + /** + * @generated + */ + @Override + protected void setForegroundColor(Color color) { + if (primaryShape != null) { + primaryShape.setForegroundColor(color); + } + } + + /** + * @generated + */ + @Override + protected void setLineWidth(int width) { + super.setLineWidth(width); + } + + /** + * @generated + */ + @Override + protected void setLineType(int style) { + if (primaryShape instanceof IPapyrusNodeFigure) { + ((IPapyrusNodeFigure) primaryShape).setLineStyle(style); + } + } + + /** + * @generated + */ + @Override + public EditPart getPrimaryChildEditPart() { + return getChildBySemanticHint(UMLVisualIDRegistry.getType(TimeConstraintNameEditPart.VISUAL_ID)); + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintNameEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintNameEditPart.java new file mode 100644 index 00000000000..a9617d040ec --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/TimeConstraintNameEditPart.java @@ -0,0 +1,855 @@ +/** + * Copyright (c) 2016 CEA LIST. + * + * 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: + * CEA LIST - Initial API and implementation + */ +package org.eclipse.papyrus.uml.diagram.sequence.edit.parts; + +import java.util.Collections; +import java.util.List; + +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.Label; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.transaction.RecordingCommand; +import org.eclipse.emf.transaction.RunnableWithResult; +import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.gef.AccessibleEditPart; +import org.eclipse.gef.EditPolicy; +import org.eclipse.gef.Request; +import org.eclipse.gef.requests.DirectEditRequest; +import org.eclipse.gef.tools.DirectEditManager; +import org.eclipse.gmf.runtime.common.ui.services.parser.IParser; +import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus; +import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy; +import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator; +import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry; +import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants; +import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager; +import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel; +import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser; +import org.eclipse.gmf.runtime.notation.FontStyle; +import org.eclipse.gmf.runtime.notation.NotationPackage; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.text.contentassist.IContentAssistProcessor; +import org.eclipse.jface.viewers.ICellEditorValidator; +import org.eclipse.jface.window.Window; +import org.eclipse.papyrus.extensionpoints.editors.Activator; +import org.eclipse.papyrus.extensionpoints.editors.configuration.IAdvancedEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.configuration.ICustomDirectEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.configuration.IPopupEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.ui.ExtendedDirectEditionDialog; +import org.eclipse.papyrus.extensionpoints.editors.ui.ILabelEditorDialog; +import org.eclipse.papyrus.extensionpoints.editors.ui.IPopupEditorHelper; +import org.eclipse.papyrus.extensionpoints.editors.utils.DirectEditorsUtil; +import org.eclipse.papyrus.extensionpoints.editors.utils.IDirectEditorsIds; +import org.eclipse.papyrus.infra.gmfdiag.common.editpart.PapyrusLabelEditPart; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.ExternalLabelPrimaryDragRoleEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.IMaskManagedLabelEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.editpolicies.IndirectMaskLabelEditPolicy; +import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.PapyrusWrappingLabel; +import org.eclipse.papyrus.infra.gmfdiag.common.parsers.ParserUtil; +import org.eclipse.papyrus.infra.gmfdiag.common.utils.DiagramEditPartsUtil; +import org.eclipse.papyrus.uml.diagram.common.directedit.MultilineLabelDirectEditManager; +import org.eclipse.papyrus.uml.diagram.common.editpolicies.IDirectEdition; +import org.eclipse.papyrus.uml.diagram.common.figure.node.ILabelFigure; +import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.UMLTextSelectionEditPolicy; +import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry; +import org.eclipse.papyrus.uml.diagram.sequence.providers.UMLElementTypes; +import org.eclipse.swt.SWT; +import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.PlatformUI; +import org.eclipse.uml2.uml.Feature; + +/** + * @generated + */ +public class TimeConstraintNameEditPart extends PapyrusLabelEditPart + implements ITextAwareEditPart, IBorderItemEditPart { + + /** + * @generated + */ + public static final String VISUAL_ID = "TimeConstraint_NameLabel"; + + /** + * @generated + */ + private DirectEditManager manager; + + /** + * @generated + */ + private IParser parser; + + /** + * @generated + */ + private List parserElements; + + /** + * @generated + */ + private String defaultText; + + /** + * direct edition mode (default, undefined, registered editor, etc.) + * + * @generated + */ + protected int directEditionMode = IDirectEdition.UNDEFINED_DIRECT_EDITOR; + + /** + * configuration from a registered edit dialog + * + * @generated + */ + protected IDirectEditorConfiguration configuration; + + /** + * @generated + */ + static { + registerSnapBackPosition( + UMLVisualIDRegistry.getType( + org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintNameEditPart.VISUAL_ID), + new Point(0, 0)); + } + + /** + * @generated + */ + public TimeConstraintNameEditPart(View view) { + super(view); + } + + /** + * @generated + */ + @Override + protected void createDefaultEditPolicies() { + super.createDefaultEditPolicies(); + installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy()); + installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new UMLTextSelectionEditPolicy()); + installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new ExternalLabelPrimaryDragRoleEditPolicy()); + } + + /** + * @generated + */ + @Override + public IBorderItemLocator getBorderItemLocator() { + IFigure parentFigure = getFigure().getParent(); + if (parentFigure != null && parentFigure.getLayoutManager() != null) { + Object constraint = parentFigure.getLayoutManager().getConstraint(getFigure()); + return (IBorderItemLocator) constraint; + } + return null; + } + + /** + * @generated + */ + @Override + public void refreshBounds() { + int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_X())).intValue(); + int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_Y())).intValue(); + int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Width())).intValue(); + int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Height())).intValue(); + getBorderItemLocator().setConstraint(new Rectangle(x, y, width, height)); + } + + /** + * @generated + */ + protected String getLabelTextHelper(IFigure figure) { + if (figure instanceof WrappingLabel) { + return ((WrappingLabel) figure).getText(); + } else if (figure instanceof ILabelFigure) { + return ((ILabelFigure) figure).getText(); + } else { + return ((Label) figure).getText(); + } + } + + /** + * @generated + */ + protected void setLabelTextHelper(IFigure figure, String text) { + if (figure instanceof WrappingLabel) { + ((WrappingLabel) figure).setText(text); + } else if (figure instanceof ILabelFigure) { + ((ILabelFigure) figure).setText(text); + } else { + ((Label) figure).setText(text); + } + } + + /** + * @generated + */ + protected Image getLabelIconHelper(IFigure figure) { + if (figure instanceof WrappingLabel) { + return ((WrappingLabel) figure).getIcon(); + } else if (figure instanceof ILabelFigure) { + return ((ILabelFigure) figure).getIcon(); + } else { + return ((Label) figure).getIcon(); + } + } + + /** + * @generated + */ + protected void setLabelIconHelper(IFigure figure, Image icon) { + if (figure instanceof WrappingLabel) { + ((WrappingLabel) figure).setIcon(icon); + } else if (figure instanceof ILabelFigure) { + ((ILabelFigure) figure).setIcon(icon); + } else { + ((Label) figure).setIcon(icon); + } + } + + /** + * @generated + */ + public void setLabel(IFigure figure) { + unregisterVisuals(); + setFigure(figure); + defaultText = getLabelTextHelper(figure); + registerVisuals(); + refreshVisuals(); + } + + /** + * @generated + */ + @Override + protected List getModelChildren() { + return Collections.EMPTY_LIST; + } + + /** + * @generated + */ + @Override + public IGraphicalEditPart getChildBySemanticHint(String semanticHint) { + return null; + } + + /** + * @generated + */ + public void setParser(IParser parser) { + this.parser = parser; + } + + /** + * @generated + */ + protected EObject getParserElement() { + return resolveSemanticElement(); + } + + /** + * @generated + */ + protected Image getLabelIcon() { + return DiagramEditPartsUtil.getIcon(getParserElement(), getViewer()); + } + + /** + * @generated + */ + protected String getLabelText() { + String text = null; + EObject parserElement = getParserElement(); + if (parserElement != null && getParser() != null) { + text = getParser().getPrintString(ParserUtil.getParserAdapter(getParserElement(), this), + getParserOptions().intValue()); + } + if (text == null || text.length() == 0) { + text = defaultText; + } + return text; + } + + /** + * @generated + */ + @Override + public void setLabelText(String text) { + setLabelTextHelper(getFigure(), text); + Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); + if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback(); + } + Object sfEditPolicy = getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE); + if (sfEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) sfEditPolicy).refreshFeedback(); + } + } + + /** + * @generated + */ + @Override + public String getEditText() { + if (getParserElement() == null || getParser() == null) { + return ""; //$NON-NLS-1$ + } + return getParser().getEditString(ParserUtil.getParserAdapter(getParserElement(), this), + getParserOptions().intValue()); + } + + /** + * @generated + */ + protected boolean isEditable() { + return getParser() != null; + } + + /** + * @generated + */ + @Override + public ICellEditorValidator getEditTextValidator() { + return new ICellEditorValidator() { + + @Override + public String isValid(final Object value) { + if (value instanceof String) { + final EObject element = getParserElement(); + final IParser parser = getParser(); + try { + IParserEditStatus valid = (IParserEditStatus) getEditingDomain() + .runExclusive(new RunnableWithResult.Impl() { + + @Override + public void run() { + setResult(parser.isValidEditString(ParserUtil.getParserAdapter( + getParserElement(), TimeConstraintNameEditPart.this), (String) value)); + } + }); + return valid.getCode() == IParserEditStatus.EDITABLE ? null : valid.getMessage(); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + + // shouldn't get here + return null; + } + }; + } + + /** + * @generated + */ + @Override + public IContentAssistProcessor getCompletionProcessor() { + if (getParserElement() == null || getParser() == null) { + return null; + } + return getParser().getCompletionProcessor(ParserUtil.getParserAdapter(getParserElement(), this)); + } + + /** + * @generated + */ + @Override + public ParserOptions getParserOptions() { + return ParserOptions.NONE; + } + + /** + * @generated + */ + @Override + public IParser getParser() { + if (parser == null) { + parser = ParserUtil.getParser(UMLElementTypes.TimeConstraint_Shape, getParserElement(), this, VISUAL_ID); + } + return parser; + } + + /** + * @generated + */ + protected DirectEditManager getManager() { + if (manager == null) { + setManager(new MultilineLabelDirectEditManager(this, + MultilineLabelDirectEditManager.getTextCellEditorClass(this), + UMLEditPartFactory.getTextCellEditorLocator(this))); + } + return manager; + } + + /** + * @generated + */ + protected void setManager(DirectEditManager manager) { + this.manager = manager; + } + + /** + * @generated + */ + protected void performDirectEdit() { + BusyIndicator.showWhile(Display.getDefault(), new java.lang.Runnable() { + + @Override + public void run() { + getManager().show(); + } + }); + } + + /** + * @generated + */ + protected void performDirectEdit(Point eventLocation) { + if (getManager() instanceof TextDirectEditManager) { + ((TextDirectEditManager) getManager()).show(eventLocation.getSWTPoint()); + } + } + + /** + * @generated + */ + protected void performDirectEdit(char initialCharacter) { + if (getManager() instanceof TextDirectEditManager) { + ((TextDirectEditManager) getManager()).show(initialCharacter); + } else { + performDirectEdit(); + } + } + + /** + * @generated + */ + @Override + protected void performDirectEditRequest(Request request) { + + final Request theRequest = request; + + if (IDirectEdition.UNDEFINED_DIRECT_EDITOR == directEditionMode) { + directEditionMode = getDirectEditionType(); + } + switch (directEditionMode) { + case IDirectEdition.NO_DIRECT_EDITION: + // no direct edition mode => does nothing + return; + case IDirectEdition.EXTENDED_DIRECT_EDITOR: + updateExtendedEditorConfiguration(); + if (configuration == null || configuration.getLanguage() == null) { + // Create default edit manager + setManager(new MultilineLabelDirectEditManager(this, + MultilineLabelDirectEditManager.getTextCellEditorClass(this), + UMLEditPartFactory.getTextCellEditorLocator(this))); + performDefaultDirectEditorEdit(theRequest); + } else { + configuration.preEditAction(resolveSemanticElement()); + Dialog dialog = null; + if (configuration instanceof ICustomDirectEditorConfiguration) { + setManager(((ICustomDirectEditorConfiguration) configuration).createDirectEditManager(this)); + initializeDirectEditManager(theRequest); + return; + } else if (configuration instanceof IPopupEditorConfiguration) { + IPopupEditorHelper helper = ((IPopupEditorConfiguration) configuration) + .createPopupEditorHelper(this); + helper.showEditor(); + return; + } else if (configuration instanceof IAdvancedEditorConfiguration) { + dialog = ((IAdvancedEditorConfiguration) configuration).createDialog( + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), resolveSemanticElement(), + configuration.getTextToEdit(resolveSemanticElement())); + } else if (configuration instanceof IDirectEditorConfiguration) { + dialog = new ExtendedDirectEditionDialog( + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), resolveSemanticElement(), + configuration.getTextToEdit(resolveSemanticElement()), configuration); + } else { + return; + } + final Dialog finalDialog = dialog; + + if (Window.OK == dialog.open()) { + TransactionalEditingDomain domain = getEditingDomain(); + RecordingCommand command = new RecordingCommand(domain, "Edit Label") { + + @Override + protected void doExecute() { + configuration.postEditAction(resolveSemanticElement(), + ((ILabelEditorDialog) finalDialog).getValue()); + + } + }; + domain.getCommandStack().execute(command); + } + } + break; + case IDirectEdition.DEFAULT_DIRECT_EDITOR: + initializeDirectEditManager(theRequest); + break; + default: + break; + } + } + + /** + * @generated + */ + protected void initializeDirectEditManager(final Request request) { + // initialize the direct edit manager + try { + getEditingDomain().runExclusive(new Runnable() { + @Override + public void run() { + if (isActive() && isEditable()) { + if (request.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) { + Character initialChar = (Character) request.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); + performDirectEdit(initialChar.charValue()); + } else { + performDirectEdit(); + } + } + } + }); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * @generated + */ + @Override + protected void refreshVisuals() { + super.refreshVisuals(); + refreshLabel(); + refreshFont(); + refreshFontColor(); + refreshUnderline(); + refreshStrikeThrough(); + } + + /** + * @generated + */ + protected void refreshLabel() { + EditPolicy maskLabelPolicy = getEditPolicy(IMaskManagedLabelEditPolicy.MASK_MANAGED_LABEL_EDIT_POLICY); + if (maskLabelPolicy == null) { + maskLabelPolicy = getEditPolicy(IndirectMaskLabelEditPolicy.INDRIRECT_MASK_MANAGED_LABEL); + } + if (maskLabelPolicy == null) { + View view = (View) getModel(); + if (view.isVisible()) { + setLabelTextHelper(getFigure(), getLabelText()); + setLabelIconHelper(getFigure(), getLabelIcon()); + } else { + setLabelTextHelper(getFigure(), ""); //$NON-NLS-1$ + setLabelIconHelper(getFigure(), null); + } + } + Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); + if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback(); + } + Object sfEditPolicy = getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE); + if (sfEditPolicy instanceof UMLTextSelectionEditPolicy) { + ((UMLTextSelectionEditPolicy) sfEditPolicy).refreshFeedback(); + } + } + + /** + * @generated + */ + protected void refreshUnderline() { + FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle()); + if (style != null && getFigure() instanceof WrappingLabel) { + ((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline()); + } + if (resolveSemanticElement() instanceof Feature) { + if (((Feature) resolveSemanticElement()).isStatic()) { + ((WrappingLabel) getFigure()).setTextUnderline(true); + } else { + ((WrappingLabel) getFigure()).setTextUnderline(false); + } + } + } + + /** + * @generated + */ + protected void refreshStrikeThrough() { + FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle()); + if (style != null && getFigure() instanceof WrappingLabel) { + ((WrappingLabel) getFigure()).setTextStrikeThrough(style.isStrikeThrough()); + } + } + + /** + * @generated + */ + @Override + protected void refreshFont() { + FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(NotationPackage.eINSTANCE.getFontStyle()); + if (style != null) { + FontData fontData = new FontData(style.getFontName(), style.getFontHeight(), + (style.isBold() ? SWT.BOLD : SWT.NORMAL) | (style.isItalic() ? SWT.ITALIC : SWT.NORMAL)); + setFont(fontData); + } + } + + /** + * @generated + */ + @Override + protected void setFontColor(Color color) { + getFigure().setForegroundColor(color); + } + + /** + * @generated + */ + @Override + protected void addSemanticListeners() { + if (getParser() instanceof ISemanticParser) { + EObject element = resolveSemanticElement(); + parserElements = ((ISemanticParser) getParser()).getSemanticElementsBeingParsed(element); + for (int i = 0; i < parserElements.size(); i++) { + addListenerFilter("SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$ + } + } else { + super.addSemanticListeners(); + } + } + + /** + * @generated + */ + @Override + protected void removeSemanticListeners() { + if (parserElements != null) { + for (int i = 0; i < parserElements.size(); i++) { + removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$ + } + } else { + super.removeSemanticListeners(); + } + } + + /** + * @generated + */ + @Override + protected AccessibleEditPart getAccessibleEditPart() { + if (accessibleEP == null) { + accessibleEP = new AccessibleGraphicalEditPart() { + + @Override + public void getName(AccessibleEvent e) { + e.result = getLabelTextHelper(getFigure()); + } + }; + } + return accessibleEP; + } + + /** + * @generated + */ + private View getFontStyleOwnerView() { + return getPrimaryView(); + } + + /** + * Returns the kind of associated editor for direct edition. + * + * @return an int corresponding to the kind of direct editor, @see org.eclipse.papyrus.uml.diagram.common.editpolicies.IDirectEdition + * @generated + */ + public int getDirectEditionType() { + if (checkExtendedEditor()) { + initExtendedEditorConfiguration(); + return IDirectEdition.EXTENDED_DIRECT_EDITOR; + } + if (checkDefaultEdition()) { + return IDirectEdition.DEFAULT_DIRECT_EDITOR; + } + + // not a named element. no specific editor => do nothing + return IDirectEdition.NO_DIRECT_EDITION; + } + + /** + * Checks if an extended editor is present. + * + * @return true if an extended editor is present. + * @generated + */ + protected boolean checkExtendedEditor() { + if (resolveSemanticElement() != null) { + return DirectEditorsUtil.hasSpecificEditorConfiguration(resolveSemanticElement(), this); + } + return false; + } + + /** + * Checks if a default direct edition is available + * + * @return true if a default direct edition is available + * @generated + */ + protected boolean checkDefaultEdition() { + return (getParser() != null); + } + + /** + * Initializes the extended editor configuration + * + * @generated + */ + protected void initExtendedEditorConfiguration() { + if (configuration == null) { + final String languagePreferred = Activator.getDefault().getPreferenceStore().getString( + IDirectEditorsIds.EDITOR_FOR_ELEMENT + resolveSemanticElement().eClass().getInstanceClassName()); + if (languagePreferred != null && !languagePreferred.equals("")) { + configuration = DirectEditorsUtil.findEditorConfiguration(languagePreferred, resolveSemanticElement(), + this); + } else { + configuration = DirectEditorsUtil.findEditorConfiguration(IDirectEditorsIds.UML_LANGUAGE, + resolveSemanticElement(), this); + } + } + } + + /** + * Updates the preference configuration + * + * @generated + */ + protected void updateExtendedEditorConfiguration() { + String languagePreferred = Activator.getDefault().getPreferenceStore().getString( + IDirectEditorsIds.EDITOR_FOR_ELEMENT + resolveSemanticElement().eClass().getInstanceClassName()); + if (languagePreferred != null && !languagePreferred.equals("") + && !languagePreferred.equals(configuration.getLanguage())) { + configuration = DirectEditorsUtil.findEditorConfiguration(languagePreferred, resolveSemanticElement(), + this); + } else if (IDirectEditorsIds.SIMPLE_DIRECT_EDITOR.equals(languagePreferred)) { + configuration = null; + } + } + + /** + * Performs the direct edit usually used by GMF editors. + * + * @param theRequest + * the direct edit request that starts the direct edit system + * @generated + */ + protected void performDefaultDirectEditorEdit(final Request theRequest) { + // initialize the direct edit manager + try { + getEditingDomain().runExclusive(new Runnable() { + + @Override + public void run() { + if (isActive() && isEditable()) { + if (theRequest.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) { + Character initialChar = (Character) theRequest.getExtendedData() + .get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); + performDirectEdit(initialChar.charValue()); + } else if ((theRequest instanceof DirectEditRequest) + && (getEditText().equals(getLabelText()))) { + DirectEditRequest editRequest = (DirectEditRequest) theRequest; + performDirectEdit(editRequest.getLocation()); + } else { + performDirectEdit(); + } + } + } + }); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * @generated + */ + @Override + protected void handleNotificationEvent(Notification event) { + Object feature = event.getFeature(); + if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) { + Integer c = (Integer) event.getNewValue(); + setFontColor(DiagramColorRegistry.getInstance().getColor(c)); + } else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(feature)) { + refreshUnderline(); + } else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough().equals(feature)) { + refreshStrikeThrough(); + } else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) + || NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature) + || NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) + || NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) { + refreshFont(); + } else { + if (getParser() != null && getParser().isAffectingEvent(event, getParserOptions().intValue())) { + refreshLabel(); + } + if (getParser() instanceof ISemanticParser) { + ISemanticParser modelParser = (ISemanticParser) getParser(); + if (modelParser.areSemanticElementsAffected(null, event)) { + removeSemanticListeners(); + if (resolveSemanticElement() != null) { + addSemanticListeners(); + } + refreshLabel(); + } + } + } + super.handleNotificationEvent(event); + } + + /** + * @generated + */ + @Override + protected IFigure createFigure() { + IFigure label = createFigurePrim(); + defaultText = getLabelTextHelper(label); + return label; + } + + /** + * @generated + */ + protected IFigure createFigurePrim() { + return new PapyrusWrappingLabel(); + } + +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/UMLEditPartFactory.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/UMLEditPartFactory.java index 2ebda983d8c..4a4923ade4e 100755 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/UMLEditPartFactory.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/UMLEditPartFactory.java @@ -106,6 +106,15 @@ public class UMLEditPartFactory implements EditPartFactory { case GateNameEditPart.VISUAL_ID: return new GateNameEditPart(view); + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return new TimeConstraintBorderNodeEditPart(view); + + case TimeConstraintNameEditPart.VISUAL_ID: + return new TimeConstraintNameEditPart(view); + + case TimeConstraintAppliedStereotypeEditPart.VISUAL_ID: + return new TimeConstraintAppliedStereotypeEditPart(view); + case InteractionInteractionCompartmentEditPart.VISUAL_ID: return new InteractionInteractionCompartmentEditPart(view); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLDiagramUpdater.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLDiagramUpdater.java index 979bd738d2e..9d73f6ebb0f 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLDiagramUpdater.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLDiagramUpdater.java @@ -58,6 +58,7 @@ import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.MessageReplyEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.MessageSyncEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.SequenceDiagramEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintBorderNodeEditPart; import org.eclipse.papyrus.uml.diagram.sequence.providers.UMLElementTypes; import org.eclipse.uml2.uml.ActionExecutionSpecification; import org.eclipse.uml2.uml.BehaviorExecutionSpecification; @@ -84,6 +85,7 @@ import org.eclipse.uml2.uml.OccurrenceSpecification; import org.eclipse.uml2.uml.Package; import org.eclipse.uml2.uml.PackageableElement; import org.eclipse.uml2.uml.StateInvariant; +import org.eclipse.uml2.uml.TimeConstraint; import org.eclipse.uml2.uml.UMLPackage; /** @@ -123,6 +125,10 @@ public class UMLDiagramUpdater implements DiagramUpdater { return getInteractionUse_Shape_SemanticChildren(view); case LifelineEditPart.VISUAL_ID: return getLifeline_Shape_SemanticChildren(view); + case ActionExecutionSpecificationEditPart.VISUAL_ID: + return getActionExecutionSpecification_Shape_SemanticChildren(view); + case BehaviorExecutionSpecificationEditPart.VISUAL_ID: + return getBehaviorExecutionSpecification_Shape_SemanticChildren(view); case InteractionInteractionCompartmentEditPart.VISUAL_ID: return getInteraction_SubfragmentCompartment_SemanticChildren(view); case CombinedFragmentCombinedFragmentCompartmentEditPart.VISUAL_ID: @@ -362,6 +368,54 @@ public class UMLDiagramUpdater implements DiagramUpdater { return result; } + /** + * @generated NOT + */ + public List getActionExecutionSpecification_Shape_SemanticChildren(View view) { + if (!view.isSetElement()) { + return Collections.emptyList(); + } + ActionExecutionSpecification modelElement = (ActionExecutionSpecification) view.getElement(); + LinkedList result = new LinkedList<>(); + Interaction interaction = modelElement.getEnclosingInteraction(); + if (interaction == null) { + return Collections.emptyList(); + } + for (Iterator it = interaction.getOwnedRules().iterator(); it.hasNext();) { + Constraint childElement = (Constraint) it.next(); + String visualID = UMLVisualIDRegistry.getNodeVisualID(view, childElement); + if (TimeConstraintBorderNodeEditPart.VISUAL_ID.equals(visualID)) { + result.add(new UMLNodeDescriptor(childElement, visualID)); + continue; + } + } + return result; + } + + /** + * @generated NOT + */ + public List getBehaviorExecutionSpecification_Shape_SemanticChildren(View view) { + if (!view.isSetElement()) { + return Collections.emptyList(); + } + BehaviorExecutionSpecification modelElement = (BehaviorExecutionSpecification) view.getElement(); + LinkedList result = new LinkedList<>(); + Interaction interaction = modelElement.getEnclosingInteraction(); + if (interaction == null) { + return Collections.emptyList(); + } + for (Iterator it = interaction.getOwnedRules().iterator(); it.hasNext();) { + Constraint childElement = (Constraint) it.next(); + String visualID = UMLVisualIDRegistry.getNodeVisualID(view, childElement); + if (TimeConstraintBorderNodeEditPart.VISUAL_ID.equals(visualID)) { + result.add(new UMLNodeDescriptor(childElement, visualID)); + continue; + } + } + return result; + } + /** * @generated */ @@ -400,6 +454,8 @@ public class UMLDiagramUpdater implements DiagramUpdater { return getComment_Shape_ContainedLinks(view); case GateEditPart.VISUAL_ID: return getGate_Shape_ContainedLinks(view); + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return getTimeConstraint_Shape_ContainedLinks(view); case MessageSyncEditPart.VISUAL_ID: return getMessage_SynchEdge_ContainedLinks(view); case MessageAsyncEditPart.VISUAL_ID: @@ -461,6 +517,8 @@ public class UMLDiagramUpdater implements DiagramUpdater { return getComment_Shape_IncomingLinks(view); case GateEditPart.VISUAL_ID: return getGate_Shape_IncomingLinks(view); + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return getTimeConstraint_Shape_IncomingLinks(view); case MessageSyncEditPart.VISUAL_ID: return getMessage_SynchEdge_IncomingLinks(view); case MessageAsyncEditPart.VISUAL_ID: @@ -522,6 +580,8 @@ public class UMLDiagramUpdater implements DiagramUpdater { return getComment_Shape_OutgoingLinks(view); case GateEditPart.VISUAL_ID: return getGate_Shape_OutgoingLinks(view); + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return getTimeConstraint_Shape_OutgoingLinks(view); case MessageSyncEditPart.VISUAL_ID: return getMessage_SynchEdge_OutgoingLinks(view); case MessageAsyncEditPart.VISUAL_ID: @@ -702,6 +762,17 @@ public class UMLDiagramUpdater implements DiagramUpdater { return Collections.emptyList(); } + /** + * @generated + */ + public List getTimeConstraint_Shape_ContainedLinks(View view) { + TimeConstraint modelElement = (TimeConstraint) view.getElement(); + LinkedList result = new LinkedList<>(); + result.addAll(getOutgoingFeatureModelFacetLinks_Constraint_ConstrainedElementEdge(modelElement)); + result.addAll(getOutgoingFeatureModelFacetLinks_Constraint_ContextEdge(modelElement)); + return result; + } + /** * @generated */ @@ -1100,6 +1171,29 @@ public class UMLDiagramUpdater implements DiagramUpdater { return result; } + /** + * @generated + */ + public List getTimeConstraint_Shape_IncomingLinks(View view) { + TimeConstraint modelElement = (TimeConstraint) view.getElement(); + CrossReferenceAdapter crossReferencer = CrossReferenceAdapter + .getCrossReferenceAdapter(view.eResource().getResourceSet()); + LinkedList result = new LinkedList<>(); + result.addAll(getIncomingTypeModelFacetLinks_Message_SynchEdge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_Message_AsynchEdge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_Message_ReplyEdge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_Message_CreateEdge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_Message_DeleteEdge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_Message_LostEdge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_Message_FoundEdge(modelElement, crossReferencer)); + result.addAll(getIncomingFeatureModelFacetLinks_Comment_AnnotatedElementEdge(modelElement, crossReferencer)); + result.addAll( + getIncomingFeatureModelFacetLinks_Constraint_ConstrainedElementEdge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_DurationConstraint_Edge(modelElement, crossReferencer)); + result.addAll(getIncomingTypeModelFacetLinks_DurationObservation_Edge(modelElement, crossReferencer)); + return result; + } + /** * @generated */ @@ -1585,6 +1679,26 @@ public class UMLDiagramUpdater implements DiagramUpdater { return result; } + /** + * @generated + */ + public List getTimeConstraint_Shape_OutgoingLinks(View view) { + TimeConstraint modelElement = (TimeConstraint) view.getElement(); + LinkedList result = new LinkedList<>(); + result.addAll(getOutgoingTypeModelFacetLinks_Message_SynchEdge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_Message_AsynchEdge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_Message_ReplyEdge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_Message_CreateEdge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_Message_DeleteEdge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_Message_LostEdge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_Message_FoundEdge(modelElement)); + result.addAll(getOutgoingFeatureModelFacetLinks_Constraint_ConstrainedElementEdge(modelElement)); + result.addAll(getOutgoingFeatureModelFacetLinks_Constraint_ContextEdge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_DurationConstraint_Edge(modelElement)); + result.addAll(getOutgoingTypeModelFacetLinks_DurationObservation_Edge(modelElement)); + return result; + } + /** * @generated */ diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLVisualIDRegistry.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLVisualIDRegistry.java index 291ec20c6c8..b4e95fc5e3a 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLVisualIDRegistry.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/part/UMLVisualIDRegistry.java @@ -79,6 +79,9 @@ import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.SequenceDiagramEditPa import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantLabelEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantNameEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintAppliedStereotypeEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintBorderNodeEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintNameEditPart; import org.eclipse.papyrus.uml.diagram.sequence.expressions.UMLOCLFactory; import org.eclipse.uml2.uml.Message; import org.eclipse.uml2.uml.Package; @@ -227,6 +230,16 @@ public class UMLVisualIDRegistry { return DestructionOccurrenceSpecificationEditPart.VISUAL_ID; } break; + case ActionExecutionSpecificationEditPart.VISUAL_ID: + if (UMLPackage.eINSTANCE.getTimeConstraint().isSuperTypeOf(domainElement.eClass())) { + return TimeConstraintBorderNodeEditPart.VISUAL_ID; + } + break; + case BehaviorExecutionSpecificationEditPart.VISUAL_ID: + if (UMLPackage.eINSTANCE.getTimeConstraint().isSuperTypeOf(domainElement.eClass())) { + return TimeConstraintBorderNodeEditPart.VISUAL_ID; + } + break; case InteractionInteractionCompartmentEditPart.VISUAL_ID: if (UMLPackage.eINSTANCE.getConsiderIgnoreFragment().isSuperTypeOf(domainElement.eClass())) { return ConsiderIgnoreFragmentEditPart.VISUAL_ID; @@ -350,6 +363,16 @@ public class UMLVisualIDRegistry { return true; } break; + case ActionExecutionSpecificationEditPart.VISUAL_ID: + if (TimeConstraintBorderNodeEditPart.VISUAL_ID.equals(nodeVisualID)) { + return true; + } + break; + case BehaviorExecutionSpecificationEditPart.VISUAL_ID: + if (TimeConstraintBorderNodeEditPart.VISUAL_ID.equals(nodeVisualID)) { + return true; + } + break; case StateInvariantEditPart.VISUAL_ID: if (StateInvariantNameEditPart.VISUAL_ID.equals(nodeVisualID)) { return true; @@ -376,6 +399,14 @@ public class UMLVisualIDRegistry { return true; } break; + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + if (TimeConstraintNameEditPart.VISUAL_ID.equals(nodeVisualID)) { + return true; + } + if (TimeConstraintAppliedStereotypeEditPart.VISUAL_ID.equals(nodeVisualID)) { + return true; + } + break; case InteractionInteractionCompartmentEditPart.VISUAL_ID: if (ConsiderIgnoreFragmentEditPart.VISUAL_ID.equals(nodeVisualID)) { return true; @@ -639,13 +670,12 @@ public class UMLVisualIDRegistry { switch (visualID) { case SequenceDiagramEditPart.VISUAL_ID: return false; - case BehaviorExecutionSpecificationEditPart.VISUAL_ID: - case ActionExecutionSpecificationEditPart.VISUAL_ID: case ConsiderIgnoreFragmentEditPart.VISUAL_ID: case ConstraintEditPart.VISUAL_ID: case CommentEditPart.VISUAL_ID: case ContinuationEditPart.VISUAL_ID: case StateInvariantEditPart.VISUAL_ID: + case TimeConstraintBorderNodeEditPart.VISUAL_ID: case DestructionOccurrenceSpecificationEditPart.VISUAL_ID: case GateEditPart.VISUAL_ID: return true; diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/ElementInitializers.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/ElementInitializers.java index b9acd06875e..8dada167bcf 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/ElementInitializers.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/ElementInitializers.java @@ -39,6 +39,7 @@ import org.eclipse.uml2.uml.LiteralString; import org.eclipse.uml2.uml.NamedElement; import org.eclipse.uml2.uml.Namespace; import org.eclipse.uml2.uml.StateInvariant; +import org.eclipse.uml2.uml.TimeConstraint; import org.eclipse.uml2.uml.TimeExpression; import org.eclipse.uml2.uml.TimeInterval; import org.eclipse.uml2.uml.UMLFactory; @@ -195,6 +196,20 @@ public class ElementInitializers { } } + /** + * @generated + */ + public void init_TimeConstraint_Shape(TimeConstraint instance) { + try { + Object value_0 = name_TimeConstraint_Shape(instance); + if (value_0 != null) { + instance.setName((String) value_0); + } + } catch (RuntimeException e) { + UMLDiagramEditorPlugin.getInstance().logError("Element initialization failed", e); //$NON-NLS-1$ + } + } + /** * Initialize a time interval * @@ -346,6 +361,13 @@ public class ElementInitializers { return ""; } + /** + * @generated + */ + private String name_TimeConstraint_Shape(TimeConstraint it) { + return getNamedElement(it, "", it.eClass().getName(), ""); + } + /** * @generated */ diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLElementTypes.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLElementTypes.java index 037f97e22ea..fd2ed934547 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLElementTypes.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLElementTypes.java @@ -54,6 +54,7 @@ import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.MessageReplyEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.MessageSyncEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.SequenceDiagramEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintBorderNodeEditPart; import org.eclipse.papyrus.uml.diagram.sequence.part.UMLDiagramEditorPlugin; import org.eclipse.swt.graphics.Image; import org.eclipse.uml2.uml.UMLPackage; @@ -160,6 +161,12 @@ public class UMLElementTypes { */ public static final IElementType Gate_Shape = getElementTypeByUniqueId("org.eclipse.papyrus.umldi.Gate_Shape"); //$NON-NLS-1$ + /** + * @generated + */ + public static final IElementType TimeConstraint_Shape = getElementTypeByUniqueId( + "org.eclipse.papyrus.umldi.TimeConstraint_Shape"); //$NON-NLS-1$ + /** * @generated */ @@ -298,6 +305,8 @@ public class UMLElementTypes { elements.put(Gate_Shape, UMLPackage.eINSTANCE.getGate()); + elements.put(TimeConstraint_Shape, UMLPackage.eINSTANCE.getTimeConstraint()); + elements.put(Message_SynchEdge, UMLPackage.eINSTANCE.getMessage()); elements.put(Message_AsynchEdge, UMLPackage.eINSTANCE.getMessage()); @@ -355,6 +364,7 @@ public class UMLElementTypes { KNOWN_ELEMENT_TYPES.add(Constraint_Shape); KNOWN_ELEMENT_TYPES.add(Comment_Shape); KNOWN_ELEMENT_TYPES.add(Gate_Shape); + KNOWN_ELEMENT_TYPES.add(TimeConstraint_Shape); KNOWN_ELEMENT_TYPES.add(Message_SynchEdge); KNOWN_ELEMENT_TYPES.add(Message_AsynchEdge); KNOWN_ELEMENT_TYPES.add(Message_ReplyEdge); @@ -418,6 +428,8 @@ public class UMLElementTypes { return Comment_Shape; case GateEditPart.VISUAL_ID: return Gate_Shape; + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return TimeConstraint_Shape; case MessageSyncEditPart.VISUAL_ID: return Message_SynchEdge; case MessageAsyncEditPart.VISUAL_ID: diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLParserProvider.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLParserProvider.java index a46cd0ea181..51849fc45d8 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLParserProvider.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLParserProvider.java @@ -61,6 +61,8 @@ import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.MessageSyncAppliedSte import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.MessageSyncNameEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantLabelEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantNameEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintAppliedStereotypeEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintNameEditPart; import org.eclipse.papyrus.uml.diagram.sequence.parser.custom.InteractionUseCustomParsers; import org.eclipse.papyrus.uml.diagram.sequence.parser.custom.LifelineCustomParsers; import org.eclipse.papyrus.uml.diagram.sequence.parser.custom.MessageCustomParser; @@ -256,6 +258,36 @@ public class UMLParserProvider extends AbstractProvider implements IParserProvid return gate_NameLabel_Parser; } + /** + * @generated + */ + private ConstraintParser timeConstraint_NameLabel_Parser; + + /** + * @generated + */ + private IParser getTimeConstraint_NameLabel_Parser() { + if (timeConstraint_NameLabel_Parser == null) { + timeConstraint_NameLabel_Parser = new ConstraintParser(); + } + return timeConstraint_NameLabel_Parser; + } + + /** + * @generated + */ + private AppliedStereotypeParser timeConstraint_StereotypeLabel_Parser; + + /** + * @generated + */ + private IParser getTimeConstraint_StereotypeLabel_Parser() { + if (timeConstraint_StereotypeLabel_Parser == null) { + timeConstraint_StereotypeLabel_Parser = new AppliedStereotypeParser(); + } + return timeConstraint_StereotypeLabel_Parser; + } + /** * @generated */ @@ -577,6 +609,11 @@ public class UMLParserProvider extends AbstractProvider implements IParserProvid case GateNameEditPart.VISUAL_ID: return getGate_NameLabel_Parser(); + case TimeConstraintNameEditPart.VISUAL_ID: + return getTimeConstraint_NameLabel_Parser(); + case TimeConstraintAppliedStereotypeEditPart.VISUAL_ID: + return getTimeConstraint_StereotypeLabel_Parser(); + case MessageSyncNameEditPart.VISUAL_ID: return getMessage_SynchNameLabel_Parser(); case MessageSyncAppliedStereotypeEditPart.VISUAL_ID: diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLViewProvider.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLViewProvider.java index a1b5b218b53..bded96cc179 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLViewProvider.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src-gen/org/eclipse/papyrus/uml/diagram/sequence/providers/UMLViewProvider.java @@ -121,6 +121,9 @@ import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.SequenceDiagramEditPa import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantLabelEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantNameEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintAppliedStereotypeEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintBorderNodeEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintNameEditPart; import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontData; @@ -261,6 +264,7 @@ public class UMLViewProvider extends AbstractProvider implements IViewProvider { case ConstraintEditPart.VISUAL_ID: case CommentEditPart.VISUAL_ID: case GateEditPart.VISUAL_ID: + case TimeConstraintBorderNodeEditPart.VISUAL_ID: if (domainElement == null || !visualID .equals(UMLVisualIDRegistry.getNodeVisualID(op.getContainerView(), domainElement))) { return false; // visual id in semantic hint should match visual id for domain element @@ -361,6 +365,8 @@ public class UMLViewProvider extends AbstractProvider implements IViewProvider { return createComment_Shape(domainElement, containerView, index, persisted, preferencesHint); case GateEditPart.VISUAL_ID: return createGate_Shape(domainElement, containerView, index, persisted, preferencesHint); + case TimeConstraintBorderNodeEditPart.VISUAL_ID: + return createTimeConstraint_Shape(domainElement, containerView, index, persisted, preferencesHint); } } // can't happen, provided #provides(CreateNodeViewOperation) is correct @@ -689,6 +695,36 @@ public class UMLViewProvider extends AbstractProvider implements IViewProvider { return node; } + /** + * @generated + */ + public Node createTimeConstraint_Shape(EObject domainElement, View containerView, int index, boolean persisted, + PreferencesHint preferencesHint) { + Shape node = NotationFactory.eINSTANCE.createShape(); + node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds()); + node.setType(UMLVisualIDRegistry.getType(TimeConstraintBorderNodeEditPart.VISUAL_ID)); + ViewUtil.insertChildView(containerView, node, index, persisted); + node.setElement(domainElement); + // initializeFromPreferences + final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint.getPreferenceStore(); + + PreferenceInitializerForElementHelper.initFontStyleFromPrefs(node, prefStore, "TimeConstraint"); + Node timeConstraint_NameLabel = createLabel(node, + UMLVisualIDRegistry.getType(TimeConstraintNameEditPart.VISUAL_ID)); + timeConstraint_NameLabel.setLayoutConstraint(NotationFactory.eINSTANCE.createLocation()); + Location timeConstraint_NameLabel_Location = (Location) timeConstraint_NameLabel.getLayoutConstraint(); + timeConstraint_NameLabel_Location.setX(25); + timeConstraint_NameLabel_Location.setY(3); + Node timeConstraint_StereotypeLabel = createLabel(node, + UMLVisualIDRegistry.getType(TimeConstraintAppliedStereotypeEditPart.VISUAL_ID)); + timeConstraint_StereotypeLabel.setLayoutConstraint(NotationFactory.eINSTANCE.createLocation()); + Location timeConstraint_StereotypeLabel_Location = (Location) timeConstraint_StereotypeLabel + .getLayoutConstraint(); + timeConstraint_StereotypeLabel_Location.setX(0); + timeConstraint_StereotypeLabel_Location.setY(-22); + return node; + } + /** * @generated */ diff --git a/plugins/uml/org.eclipse.papyrus.uml.service.types/src/org/eclipse/papyrus/uml/service/types/helper/advice/ExecutionSpecificationHelperAdvice.java b/plugins/uml/org.eclipse.papyrus.uml.service.types/src/org/eclipse/papyrus/uml/service/types/helper/advice/ExecutionSpecificationHelperAdvice.java index 8e10935741c..3c405b583e1 100644 --- a/plugins/uml/org.eclipse.papyrus.uml.service.types/src/org/eclipse/papyrus/uml/service/types/helper/advice/ExecutionSpecificationHelperAdvice.java +++ b/plugins/uml/org.eclipse.papyrus.uml.service.types/src/org/eclipse/papyrus/uml/service/types/helper/advice/ExecutionSpecificationHelperAdvice.java @@ -31,13 +31,18 @@ import org.eclipse.gmf.runtime.common.core.command.CommandResult; import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.emf.type.core.commands.ConfigureElementCommand; import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest; +import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest; import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyDependentsRequest; +import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest; import org.eclipse.papyrus.infra.emf.utils.EMFHelper; +import org.eclipse.papyrus.uml.service.types.element.UMLElementTypes; +import org.eclipse.papyrus.uml.service.types.utils.ElementUtil; import org.eclipse.papyrus.uml.service.types.utils.SequenceRequestConstant; import org.eclipse.uml2.uml.Association; import org.eclipse.uml2.uml.ExecutionOccurrenceSpecification; import org.eclipse.uml2.uml.ExecutionSpecification; import org.eclipse.uml2.uml.Interaction; +import org.eclipse.uml2.uml.InteractionOperand; import org.eclipse.uml2.uml.Lifeline; import org.eclipse.uml2.uml.Message; import org.eclipse.uml2.uml.MessageEnd; @@ -53,6 +58,34 @@ import com.google.common.collect.Iterables; */ public class ExecutionSpecificationHelperAdvice extends InteractionFragmentEditHelperAdvice { + @Override + public void configureRequest(IEditCommandRequest request) { + super.configureRequest(request); + + if (request instanceof CreateElementRequest) { + configureCreate((CreateElementRequest) request); + } + } + + private void configureCreate(CreateElementRequest request) { + if (ElementUtil.isTypeOf(request.getElementType(), UMLElementTypes.TIME_CONSTRAINT) + && (request.getContainer() instanceof ExecutionSpecification)) { + + ExecutionSpecification executionSpecification = (ExecutionSpecification) request.getContainer(); + Interaction interaction = executionSpecification.getEnclosingInteraction(); + if (interaction != null) { + request.setContainer(interaction); + } else { + InteractionOperand operand = executionSpecification.getEnclosingOperand(); + if (operand != null) { + request.setContainer(operand); + } + } + } + } + + + /** * Create an execution Occurrence * @@ -72,11 +105,11 @@ public class ExecutionSpecificationHelperAdvice extends InteractionFragmentEditH /** *
 	 * {@inheritDoc}
-	 * 
+	 *
 	 * Complete the {@link Association} creation by:
 	 * 		adding its {@link Property} ends in the model
 	 * 		adding the UML Nature on the {@link Association}.
-	 * 
+	 *
 	 * 
*/ @Override @@ -121,19 +154,19 @@ public class ExecutionSpecificationHelperAdvice extends InteractionFragmentEditH } }; - + return (superResult != null) ? superResult.compose(result) : result; } /** *
 	 * Add a command to associated {@link OccurrenceSpecification} and {@link Message}.
-	 * This command is only added if the start - finish referenced {@link OccurrenceSpecification} is not 
+	 * This command is only added if the start - finish referenced {@link OccurrenceSpecification} is not
 	 * referenced by another element or the start/finish references are of type {@link ExecutionOccurrenceSpecification}.
 	 * 
- * + * * @see org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice#getBeforeDestroyDependentsCommand(org.eclipse.gmf.runtime.emf.type.core.requests.DestroyDependentsRequest) - * + * * @param request * the request * @return the command to execute before the edit helper work is done @@ -141,50 +174,50 @@ public class ExecutionSpecificationHelperAdvice extends InteractionFragmentEditH @Override protected ICommand getBeforeDestroyDependentsCommand(DestroyDependentsRequest request) { - List dependentsToDestroy = new ArrayList(); + List dependentsToDestroy = new ArrayList<>(); ExecutionSpecification es = (ExecutionSpecification) request.getElementToDestroy(); // Check whether start - finish referenced OccurrenceSpecification should be added to the dependents list OccurrenceSpecification osStart = es.getStart(); - if (shouldDestroyOccurrenceSpecification(es, osStart)&& (!(osStart instanceof MessageEnd))) { + if (shouldDestroyOccurrenceSpecification(es, osStart) && (!(osStart instanceof MessageEnd))) { dependentsToDestroy.add(osStart); } OccurrenceSpecification osFinish = es.getFinish(); - if (shouldDestroyOccurrenceSpecification(es, osFinish)&& (!(osFinish instanceof MessageEnd))) { + if (shouldDestroyOccurrenceSpecification(es, osFinish) && (!(osFinish instanceof MessageEnd))) { dependentsToDestroy.add(osFinish); } - Set coveredLifelines = new HashSet(es.getCovereds()); + Set coveredLifelines = new HashSet<>(es.getCovereds()); // find initiating MOS of a synch message -// InteractionFragment previousIft = InteractionFragmentHelper.findPreviousFragment(osStart, es.getOwner()); -// while (previousIft != null) { -// // keep the first ift with the same lifelines, and check it -// if (coveredLifelines.equals(new HashSet(previousIft.getCovereds()))) { -// if (previousIft instanceof MessageOccurrenceSpecification) { -// Message msg = ((MessageOccurrenceSpecification) previousIft).getMessage(); -// if (msg != null && MessageSort.SYNCH_CALL_LITERAL.equals(msg.getMessageSort())) { -// dependentsToDestroy.add(previousIft); -// } -// } -// break; -// } -// previousIft = InteractionFragmentHelper.findPreviousFragment(previousIft, es.getOwner()); -// } -// -// // find MOS between the start and finish -// InteractionFragment fragment = osStart; -// while (fragment != null && !fragment.equals(osFinish)) { -// // remove MOS if it have the same covered lifelines as the ES -// if (fragment instanceof MessageOccurrenceSpecification && coveredLifelines.equals(new HashSet(fragment.getCovereds()))) { -// dependentsToDestroy.add(fragment); -// } -// -// fragment = InteractionFragmentHelper.findNextFragment(fragment, es.getOwner()); -// } -// + // InteractionFragment previousIft = InteractionFragmentHelper.findPreviousFragment(osStart, es.getOwner()); + // while (previousIft != null) { + // // keep the first ift with the same lifelines, and check it + // if (coveredLifelines.equals(new HashSet(previousIft.getCovereds()))) { + // if (previousIft instanceof MessageOccurrenceSpecification) { + // Message msg = ((MessageOccurrenceSpecification) previousIft).getMessage(); + // if (msg != null && MessageSort.SYNCH_CALL_LITERAL.equals(msg.getMessageSort())) { + // dependentsToDestroy.add(previousIft); + // } + // } + // break; + // } + // previousIft = InteractionFragmentHelper.findPreviousFragment(previousIft, es.getOwner()); + // } + // + // // find MOS between the start and finish + // InteractionFragment fragment = osStart; + // while (fragment != null && !fragment.equals(osFinish)) { + // // remove MOS if it have the same covered lifelines as the ES + // if (fragment instanceof MessageOccurrenceSpecification && coveredLifelines.equals(new HashSet(fragment.getCovereds()))) { + // dependentsToDestroy.add(fragment); + // } + // + // fragment = InteractionFragmentHelper.findNextFragment(fragment, es.getOwner()); + // } + // // return command to destroy dependents if (!dependentsToDestroy.isEmpty()) { return request.getDestroyDependentsCommand(dependentsToDestroy); @@ -197,12 +230,12 @@ public class ExecutionSpecificationHelperAdvice extends InteractionFragmentEditH *
 	 * Check that given {@link OccurrenceSpecification} should be destroyed along with {@link ExecutionSpecification} which references it.
 	 * It should be destroyed in case:
-	 * It is of type {@link ExecutionOccurrenceSpecification} (since the opposite reference 
+	 * It is of type {@link ExecutionOccurrenceSpecification} (since the opposite reference
 	 *   'ExecutionOccurrenceSpecification::execution[1]' which designates given {@link ExecutionSpecification} is mandatory).
 	 *   or
 	 * It is not used by another element.
 	 * 
- * + * * @param es * {@link ExecutionSpecification} which references {@link OccurrenceSpecification} (by means of #start/#finish references) * @param os -- cgit v1.2.3