diff options
author | Pauline DEVILLE | 2017-08-03 11:31:09 +0000 |
---|---|---|
committer | Jeremie Tatibouet | 2017-09-04 12:56:57 +0000 |
commit | 0d3569cafeb5f3ee411fd8b562068a02c090f869 (patch) | |
tree | 238c7c0e563b87111932a7191c8b0c80ab80ec09 | |
parent | 78b5b2fa1b20b0a2e1ebf6bb82cabe51b5c1188b (diff) | |
download | org.eclipse.papyrus-0d3569cafeb5f3ee411fd8b562068a02c090f869.tar.gz org.eclipse.papyrus-0d3569cafeb5f3ee411fd8b562068a02c090f869.tar.xz org.eclipse.papyrus-0d3569cafeb5f3ee411fd8b562068a02c090f869.zip |
Bug 509015 - [StateMachineDiagram] lacks support for UML 2.5 notation of
redefinable elements with isLeaf=true
Change-Id: I2a73f118552593ab7163134bc246808695b39fd5
Signed-off-by: Pauline DEVILLE <pauline.deville@cea.fr>
4 files changed, 156 insertions, 24 deletions
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/figure/node/NodeNamedElementFigure.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/figure/node/NodeNamedElementFigure.java index 699b89949d7..e9812a58791 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/figure/node/NodeNamedElementFigure.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/figure/node/NodeNamedElementFigure.java @@ -44,7 +44,7 @@ public class NodeNamedElementFigure extends PapyrusNodeFigure implements IPapyru protected boolean noBorder = false; /** The Constant CHEVRON. */ - private static final String CHEVRON = String.valueOf("\u00AB") + String.valueOf("\u00BB"); + protected static final String CHEVRON = String.valueOf("\u00AB") + String.valueOf("\u00BB"); /** The tagged label. */ protected PapyrusWrappingLabel taggedLabel; @@ -84,7 +84,7 @@ public class NodeNamedElementFigure extends PapyrusNodeFigure implements IPapyru */ protected PapyrusWrappingLabel stereotypesLabel; - private int namePosition = PositionConstants.MIDDLE; + protected int namePosition = PositionConstants.MIDDLE; /** * Create a basic figure. diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPart.java index bc070eeec1c..8f5b537e1ba 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPart.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 CEA LIST. + * Copyright (c) 2014-2017 CEA LIST. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -9,6 +9,7 @@ * Contributors: * CEA LIST - Initial API and implementation * Nicolas FAUVERGUE (ALL4TEC) nicolas.fauvergue@all4tec.net - Bug 496905 + * Pauline DEVILLE (CEA LIST): Bug 509015 - [StateMachineDiagram] lacks support for UML 2.5 notation of redefinable elements with isLeaf=true */ package org.eclipse.papyrus.uml.diagram.statemachine.custom.edit.part; @@ -76,20 +77,19 @@ public class CustomStateNameEditPart extends StateNameEditPart { protected void refreshVisuals() { super.refreshVisuals(); StateFigure stateFigure = ((StateEditPart) getParent()).getPrimaryShape(); - + View stateLabelView = (View) getModel(); - if(!(stateLabelView.getElement() instanceof State)) { + if (!(stateLabelView.getElement() instanceof State)) { return; } - + State state = (State) stateLabelView.getElement(); - + View stateView = (View) stateLabelView.eContainer(); if (stateView == null) { return; } View stateCompartmentView = CustomStateEditPart.getStateCompartmentView(stateView); - if (stateCompartmentView.getChildren().isEmpty()) { stateFigure.getStateCompartmentFigure().setVisible(false); } else { @@ -104,6 +104,10 @@ public class CustomStateNameEditPart extends StateNameEditPart { stateFigure.setIsSubmachineState(false); } + // set <<final>> label + stateFigure.setIsLeafState(state.isLeaf()); + stateFigure.restoreFinalLabel(); + int width = stateFigure.getBounds().width; // calculate height for labels via position of the rectangle figure after the labels. Layout managers such as the // AutomaticCompartmentLayoutManager add extra space on top of the first label which would not be accounted for @@ -116,8 +120,7 @@ public class CustomStateNameEditPart extends StateNameEditPart { if (height < 0) { height = 0; } - } - else { + } else { height = stateFigure.getNameLabel().getBounds().height; } @@ -144,9 +147,8 @@ public class CustomStateNameEditPart extends StateNameEditPart { internalResizeRequest.setSizeDelta(new Dimension(dx, dy)); Rectangle rect = new Rectangle(x, y, stateWidth + dx, stateHeight + dy); - CustomStateResizeCommand internalResizeCommand = - new CustomStateResizeCommand(adaptableForState, getDiagramPreferencesHint(), getEditingDomain(), DiagramUIMessages.CreateCommand_Label, - internalResizeRequest, rect, true); + CustomStateResizeCommand internalResizeCommand = new CustomStateResizeCommand(adaptableForState, getDiagramPreferencesHint(), getEditingDomain(), DiagramUIMessages.CreateCommand_Label, + internalResizeRequest, rect, true); internalResizeCommand.setOptions(Collections.singletonMap(Transaction.OPTION_UNPROTECTED, Boolean.TRUE)); try { diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPartTN.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPartTN.java index ae73059fb1b..6891f8f1ade 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPartTN.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/edit/part/CustomStateNameEditPartTN.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 CEA LIST. + * Copyright (c) 2014-2017 CEA LIST. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -9,6 +9,7 @@ * Contributors: * CEA LIST - Initial API and implementation * Nicolas FAUVERGUE (ALL4TEC) nicolas.fauvergue@all4tec.net - Bug 496905 + * Pauline DEVILLE (CEA LIST): Bug 509015 - [StateMachineDiagram] lacks support for UML 2.5 notation of redefinable elements with isLeaf=true */ package org.eclipse.papyrus.uml.diagram.statemachine.custom.edit.part; @@ -29,7 +30,6 @@ import org.eclipse.papyrus.uml.diagram.common.commands.SemanticAdapter; import org.eclipse.papyrus.uml.diagram.statemachine.custom.commands.CustomStateResizeCommand; import org.eclipse.papyrus.uml.diagram.statemachine.custom.figures.StateFigure; import org.eclipse.papyrus.uml.diagram.statemachine.custom.helpers.Zone; -import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.StateEditPart; import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.StateEditPartTN; import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.StateNameEditPartTN; import org.eclipse.papyrus.uml.internationalization.utils.utils.UMLLabelInternationalization; @@ -79,12 +79,12 @@ public class CustomStateNameEditPartTN extends StateNameEditPartTN { View stateLabelView = (View) getModel(); StateFigure stateFigure = ((StateEditPartTN) getParent()).getPrimaryShape(); - - if(!(stateLabelView.getElement() instanceof State)) { + + if (!(stateLabelView.getElement() instanceof State)) { return; } State state = (State) stateLabelView.getElement(); - + View stateView = (View) stateLabelView.eContainer(); if (stateView == null) { return; @@ -105,6 +105,10 @@ public class CustomStateNameEditPartTN extends StateNameEditPartTN { stateFigure.setIsSubmachineState(false); } + // set <<final>> label + stateFigure.setIsLeafState(state.isLeaf()); + stateFigure.restoreFinalLabel(); + int width = stateFigure.getBounds().width; // calculate height for labels via position of the rectangle figure after the labels. Layout managers such as the // AutomaticCompartmentLayoutManager add extra space on top of the first label which would not be accounted for @@ -117,8 +121,7 @@ public class CustomStateNameEditPartTN extends StateNameEditPartTN { if (height < 0) { height = 0; } - } - else { + } else { height = stateFigure.getNameLabel().getBounds().height; } @@ -145,9 +148,8 @@ public class CustomStateNameEditPartTN extends StateNameEditPartTN { internalResizeRequest.setSizeDelta(new Dimension(dx, dy)); Rectangle rect = new Rectangle(x, y, stateWidth + dx, stateHeight + dy); - CustomStateResizeCommand internalResizeCommand = - new CustomStateResizeCommand(adaptableForState, getDiagramPreferencesHint(), getEditingDomain(), DiagramUIMessages.CreateCommand_Label, - internalResizeRequest, rect, true); + CustomStateResizeCommand internalResizeCommand = new CustomStateResizeCommand(adaptableForState, getDiagramPreferencesHint(), getEditingDomain(), DiagramUIMessages.CreateCommand_Label, + internalResizeRequest, rect, true); internalResizeCommand.setOptions(Collections.singletonMap(Transaction.OPTION_UNPROTECTED, Boolean.TRUE)); try { diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/figures/StateFigure.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/figures/StateFigure.java index 07838b55d7d..6eaf56b04fb 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/figures/StateFigure.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.statemachine/custom-src/org/eclipse/papyrus/uml/diagram/statemachine/custom/figures/StateFigure.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 CEA LIST. + * Copyright (c) 2014-2017 CEA LIST. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -8,13 +8,16 @@ * * Contributors: * CEA LIST - Initial API and implementation + * Pauline DEVILLE (CEA LIST): Bug 509015 - [StateMachineDiagram] lacks support for UML 2.5 notation of redefinable elements with isLeaf=true */ package org.eclipse.papyrus.uml.diagram.statemachine.custom.figures; import java.util.ArrayList; import java.util.List; +import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.RectangleFigure; +import org.eclipse.papyrus.infra.gmfdiag.common.figure.node.PapyrusWrappingLabel; import org.eclipse.papyrus.uml.diagram.common.figure.node.RoundedCompartmentFigure; /** @@ -26,6 +29,16 @@ public class StateFigure extends RoundedCompartmentFigure { protected boolean isSubmachineState = false; + /** + * The isLeaf feature of the state + */ + protected boolean isLeafState = false; + + /** The final label. */ + protected PapyrusWrappingLabel finalLabel; + + private static final String FINAL_LABEL_VALUE = "final"; + /** The State Compartment */ private final static String STATE_COMPARTMENT = "stateCompartment"; @@ -53,6 +66,7 @@ public class StateFigure extends RoundedCompartmentFigure { */ public StateFigure(String tagLabel) { super(COMPARTMENT, tagLabel); + createFinalLabel(); } public void setSubmachineStateName(String text) { @@ -64,6 +78,14 @@ public class StateFigure extends RoundedCompartmentFigure { } /** + * @param isLeafState + * the isLeafState to set + */ + public void setIsLeafState(boolean isLeafState) { + this.isLeafState = isLeafState; + } + + /** * Get the state compartment figure * * @return @@ -72,4 +94,110 @@ public class StateFigure extends RoundedCompartmentFigure { return getCompartment(STATE_COMPARTMENT); } + /** + * Create the final label in the figure. + */ + protected void createFinalLabel() { + finalLabel = new PapyrusWrappingLabel(); + String textToDisplay = new StringBuffer(CHEVRON).insert(1, FINAL_LABEL_VALUE).toString(); + finalLabel.setText(textToDisplay); + finalLabel.setOpaque(false); + finalLabel.setAlignment(namePosition); + finalLabel.setForegroundColor(getNameLabel().getForegroundColor()); + finalLabel.setFont(getNameLabel().getFont()); + if (isLeafState) { + getTagLabelContainer().add(finalLabel, getTagLabelConstraint(), getFinalLabelPosition()); + } + } + + public void restoreFinalLabel() { + if (isLeafState && finalLabel != null) { + finalLabel.setOpaque(false); + finalLabel.setAlignment(namePosition); + getFinalLabelContainer().add(finalLabel, getFinalLabelConstraint(), getFinalLabelPosition()); + } else { + removeFinalLabel(); + } + } + + /** + * Create a label that contains the stereotype of the element. + */ + protected void removeFinalLabel() { + if (finalLabel != null) { + if (getFinalLabelContainer().getChildren().contains(finalLabel)) { + getFinalLabelContainer().remove(finalLabel); + } + } + } + + /** + * @return the position of the label + */ + protected int getFinalLabelPosition() { + int position = 0; + if (getFinalLabelContainer().equals(getNameLabelContainer())) { + // located after name label + position = getNameLabelPosition(); + if (this.nameLabel != null) { + position++; + } + } else if (getFinalLabelContainer().equals(getQualifiedNameLabelContainer())) { + // located after qualifed name label + position = getQualifiedNameLabelPosition(); + if (this.qualifiedLabel != null) { + position++; + } + } else if (getFinalLabelContainer().equals(getStereotypePropertiesInBraceLabelContainer())) { + // located after stereotype properties in brace label + position = getStereotypePropertiesLabelPosition(); + if (this.stereotypePropertiesInBraceContent != null) { + position++; + } + } else if (getFinalLabelContainer().equals(getStereotypeLabelContainer())) { + // located after stereotype label + position = getStereotypeLabelPosition(); + if (this.stereotypesLabel != null) { + position++; + } + } else if (getFinalLabelContainer().equals(getIconLabelContainer())) { + // located after icon label + position = getIconLabelPosition(); + if ((this.iconLabel != null) && (this.iconLabel.getIcon() != null)) { + position++; + } + } + return position; + } + + /** + * Get the constraint for adding the final label. + * + * @return figure containing the final label + */ + protected Object getFinalLabelConstraint() { + return getDefaultLabelsConstraint(); + } + + /** + * Get the container for the final label. + * + * @return figure containing the final label + */ + protected IFigure getFinalLabelContainer() { + return getDefaultLabelsContainer(); + } + + /** + * Helper method to calculate the height of name + */ + @Override + protected int getNameHeight() { + int nameHeight = super.getNameHeight(); + if (finalLabel != null && getFinalLabelContainer().equals(getNameLabelContainer())) { + nameHeight += finalLabel.getPreferredSize().height; + } + return nameHeight; + } + } |