diff options
author | cmraidha | 2012-12-05 16:46:23 +0000 |
---|---|---|
committer | cmraidha | 2012-12-05 16:46:23 +0000 |
commit | 83bae825cf2d63d76d045a6135fe8e49c88b5e37 (patch) | |
tree | 9630c9ee19c8d5bf0f1e5fda3b244fdcf8b4ce91 | |
parent | 53623f877d2cd1befb9471037b0ad7dfbb4eee58 (diff) | |
download | org.eclipse.papyrus-83bae825cf2d63d76d045a6135fe8e49c88b5e37.tar.gz org.eclipse.papyrus-83bae825cf2d63d76d045a6135fe8e49c88b5e37.tar.xz org.eclipse.papyrus-83bae825cf2d63d76d045a6135fe8e49c88b5e37.zip |
[Sequence Diagram] https://bugs.eclipse.org/bugs/show_bug.cgi?id=395774
3 files changed, 125 insertions, 6 deletions
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/LifelineXYLayoutEditPolicy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/LifelineXYLayoutEditPolicy.java index c876b440bac..8067232d742 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/LifelineXYLayoutEditPolicy.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/custom-src/org/eclipse/papyrus/uml/diagram/sequence/edit/policies/LifelineXYLayoutEditPolicy.java @@ -29,7 +29,6 @@ import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CompoundCommand; import org.eclipse.gef.commands.UnexecutableCommand; -import org.eclipse.gef.editpolicies.NonResizableEditPolicy; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.gef.requests.CreateRequest; import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; @@ -53,11 +52,9 @@ import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.ActionExecutionSpecif import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.BehaviorExecutionSpecificationEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.CombinedFragment2EditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.DestructionOccurrenceSpecificationEditPart; -import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.DurationConstraintEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.LifelineEditPart; import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantEditPart; -import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeConstraintEditPart; -import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.TimeObservationEditPart; +import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantEditPart.StateInvariantResizableEditPolicy; import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry; import org.eclipse.papyrus.uml.diagram.sequence.providers.UMLElementTypes; import org.eclipse.papyrus.uml.diagram.sequence.util.HighlightUtil; @@ -175,6 +172,8 @@ public class LifelineXYLayoutEditPolicy extends XYLayoutEditPolicy { protected EditPolicy createChildEditPolicy(EditPart child) { View childView = (View)child.getModel(); switch(UMLVisualIDRegistry.getVisualID(childView)) { + case StateInvariantEditPart.VISUAL_ID: + return new StateInvariantResizableEditPolicy(); case DestructionOccurrenceSpecificationEditPart.VISUAL_ID: return new BorderItemResizableEditPolicy(); } diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/LifelineEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/LifelineEditPart.java index 32b4140714a..29d985e0964 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/LifelineEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/LifelineEditPart.java @@ -99,6 +99,7 @@ import org.eclipse.papyrus.uml.diagram.common.editpolicies.BorderItemResizableEd import org.eclipse.papyrus.uml.diagram.common.figure.node.RectangularShadowBorder;
import org.eclipse.papyrus.uml.diagram.common.providers.UIAdapterImpl;
import org.eclipse.papyrus.uml.diagram.sequence.edit.helpers.AnchorHelper;
+import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.StateInvariantEditPart.StateInvariantLocator;
import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.CustomDiagramDragDropEditPolicy;
import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.ElementCreationWithMessageEditPolicy;
import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.InteractionCompartmentXYLayoutEditPolicy;
@@ -390,7 +391,7 @@ public class LifelineEditPart extends NamedElementEditPart { }
if(childEditPart instanceof StateInvariantEditPart) {
- IBorderItemLocator locator = new CenterLocator(getMainFigure(), PositionConstants.NONE);
+ IBorderItemLocator locator = new StateInvariantLocator(getMainFigure(), PositionConstants.NONE);
getBorderedFigure().getBorderItemContainer().add(((StateInvariantEditPart)childEditPart).getFigure(), locator);
return true;
}
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/StateInvariantEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/StateInvariantEditPart.java index 859ba0b4dba..09c6c455928 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/StateInvariantEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.sequence/src/org/eclipse/papyrus/uml/diagram/sequence/edit/parts/StateInvariantEditPart.java @@ -22,6 +22,9 @@ import org.eclipse.draw2d.RoundedRectangle; import org.eclipse.draw2d.Shape;
import org.eclipse.draw2d.StackLayout;
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.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.gef.EditPart;
@@ -30,12 +33,20 @@ 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.requests.ChangeBoundsRequest;
import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand;
import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderItemEditPart;
+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.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator;
+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
@@ -46,9 +57,11 @@ import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.papyrus.infra.gmfdiag.preferences.utils.GradientPreferenceConverter;
import org.eclipse.papyrus.infra.gmfdiag.preferences.utils.PreferenceConstantHelper;
import org.eclipse.papyrus.uml.diagram.common.draw2d.CenterLayout;
+import org.eclipse.papyrus.uml.diagram.common.editpolicies.BorderItemResizableEditPolicy;
import org.eclipse.papyrus.uml.diagram.common.figure.node.CenteredWrappedLabel;
import org.eclipse.papyrus.uml.diagram.common.helper.PreferenceInitializerForElementHelper;
import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.StateInvariantItemSemanticEditPolicy;
+import org.eclipse.papyrus.uml.diagram.sequence.locator.CenterLocator;
import org.eclipse.papyrus.uml.diagram.sequence.part.UMLDiagramEditorPlugin;
import org.eclipse.papyrus.uml.diagram.sequence.part.UMLVisualIDRegistry;
import org.eclipse.papyrus.uml.diagram.sequence.providers.UMLElementTypes;
@@ -1107,10 +1120,116 @@ AbstractBorderItemEditPart { refreshLineWidth();
}
}
- }
+ }
protected void refreshVisuals() {
super.refreshVisuals();
refreshLineWidth();
}
+
+ 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);
+
+ // fix size
+ getFigure().setBounds(new Rectangle(loc, size));
+ getBorderItemLocator().setConstraint(new Rectangle( loc, size));
+ } else {
+ super.refreshBounds();
+ }
+ }
+
+ static class StateInvariantLocator extends CenterLocator{
+ public StateInvariantLocator(IFigure parentFigure, int location) {
+ super(parentFigure, location);
+
+ }
+
+ public void relocate(IFigure borderItem) {
+ Point constraintLocation = getConstraint().getLocation();
+ Dimension size = getSize(borderItem);
+ Point ptNewLocation = new Point(getParentBorder().getCenter().x - size.width / 2, constraintLocation.y);
+ borderItem.setBounds(new Rectangle(ptNewLocation, size));
+ }
+
+ public Rectangle getValidLocation(Rectangle proposedLocation, IFigure borderItem) {
+ Rectangle realLocation = new Rectangle(proposedLocation);
+ Point point = new Point(getParentBorder().getCenter().x - realLocation.getSize().width / 2, realLocation.y);
+ realLocation.setLocation(point);
+ return realLocation;
+ }
+ };
+
+ public static class StateInvariantResizableEditPolicy extends BorderItemResizableEditPolicy{
+
+ protected Command getResizeCommand(ChangeBoundsRequest request) {
+ IBorderItemEditPart borderItemEP = (IBorderItemEditPart)getHost();
+ IBorderItemLocator borderItemLocator = borderItemEP.getBorderItemLocator();
+
+ if(borderItemLocator != null) {
+ PrecisionRectangle rect = new PrecisionRectangle(getInitialFeedbackBounds().getCopy());
+ getHostFigure().translateToAbsolute(rect);
+ rect.translate(request.getMoveDelta());
+ rect.resize(request.getSizeDelta());
+ getHostFigure().translateToRelative(rect);
+ Rectangle realLocation = borderItemLocator.getValidLocation(rect.getCopy(), borderItemEP.getFigure());
+
+ if(borderItemEP.getParent() instanceof LifelineEditPart && !restrictInParentBounds((LifelineEditPart) borderItemEP.getParent(), borderItemEP, realLocation.getCopy()))
+ return null;
+
+ ICommand moveCommand = new SetBoundsCommand(borderItemEP.getEditingDomain(), DiagramUIMessages.Commands_MoveElement, new EObjectAdapter((View)getHost().getModel()), realLocation);
+ return new ICommandProxy(moveCommand);
+ }
+ return null;
+ }
+
+ protected Command getMoveCommand(ChangeBoundsRequest request) {
+ IBorderItemEditPart borderItemEP = (IBorderItemEditPart)getHost();
+ IBorderItemLocator borderItemLocator = borderItemEP.getBorderItemLocator();
+
+ if(borderItemLocator != null) {
+ PrecisionRectangle rect = new PrecisionRectangle(getInitialFeedbackBounds().getCopy());
+ getHostFigure().translateToAbsolute(rect);
+ rect.translate(request.getMoveDelta());
+ rect.resize(request.getSizeDelta());
+
+ getHostFigure().translateToRelative(rect);
+ Rectangle realLocation = borderItemLocator.getValidLocation(rect.getCopy(), borderItemEP.getFigure());
+
+ if(borderItemEP.getParent() instanceof LifelineEditPart && !restrictInParentBounds((LifelineEditPart) borderItemEP.getParent(), borderItemEP, realLocation.getCopy()))
+ return null;
+
+ Point location = realLocation.getTopLeft();
+ ICommand moveCommand = new SetBoundsCommand(borderItemEP.getEditingDomain(), DiagramUIMessages.Commands_MoveElement, new EObjectAdapter((View)getHost().getModel()), location);
+ return new ICommandProxy(moveCommand);
+ }
+ return null;
+ }
+
+ private boolean restrictInParentBounds(LifelineEditPart ep,
+ IBorderItemEditPart borderItemEP, Rectangle realLocation) {
+ borderItemEP.getFigure().translateToAbsolute(realLocation);
+
+ Rectangle bounds = ep.getPrimaryShape().getBounds().getCopy();
+ ep.getPrimaryShape().translateToAbsolute(bounds);
+ int nameHeight = ep.getPrimaryShape().getFigureLifelineNameContainerFigure().getBounds().height;
+
+ if(realLocation.y - nameHeight < bounds.y)
+ return false;
+
+ if(realLocation.getBottom().y > bounds.getBottom().y)
+ return false;
+
+ return true;
+ }
+ }
+
}
|