package org.eclipse.papyrus.uml.diagram.statemachine.custom.edit.part; import java.util.Collections; import java.util.Iterator; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.transaction.Transaction; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages; import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.papyrus.uml.diagram.common.commands.SemanticAdapter; import org.eclipse.papyrus.uml.diagram.common.figure.node.StereotypePropertiesCompartment; import org.eclipse.papyrus.uml.diagram.statemachine.custom.commands.CustomStateMachineResizeCommand; import org.eclipse.papyrus.uml.diagram.statemachine.custom.helpers.Zone; import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.StateMachineNameEditPart; public class CustomStateMachineNameEditPart extends StateMachineNameEditPart { public CustomStateMachineNameEditPart(View view) { super(view); // TODO Auto-generated constructor stub } @Override protected void createDefaultEditPolicies() { // TODO Auto-generated method stub super.createDefaultEditPolicies(); removeEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE); removeEditPolicy(EditPolicyRoles.POPUPBAR_ROLE); } @Override protected void handleNotificationEvent(Notification notification) { // TODO Auto-generated method stub super.handleNotificationEvent(notification); refreshVisuals(); } @Override protected void refreshVisuals() { // TODO Auto-generated method stub super.refreshVisuals(); int height = 0; int width = 0; Iterator<IFigure> it = (Iterator<IFigure>)getFigure().getParent().getChildren().iterator(); while(it.hasNext()) { IFigure current = it.next(); if((current instanceof Label) || (current instanceof WrappingLabel) || (current instanceof StereotypePropertiesCompartment)) { Dimension d = current.getPreferredSize().getCopy(); height += d.height; width = Math.max(width, d.width); } } View stateMachineLabelView = (View)getModel(); View stateMachineView = (View)stateMachineLabelView.eContainer(); View stateMachineCompartView = (View)stateMachineView.getChildren().get(1); int stateMachineHeight = Zone.getHeight(stateMachineView); int stateMachineWidth = Zone.getWidth(stateMachineView); int stateMachineCompartHeight = Zone.getHeight(stateMachineCompartView); int dx = width - stateMachineWidth; int dy = stateMachineCompartHeight + height - stateMachineHeight; int x = Zone.getX(stateMachineView); int y = Zone.getY(stateMachineView); if((stateMachineHeight != -1) && (width != 0) && (dy != 0)) { dx = (dx > 0) ? dx : 0; // a resize request, which we route to the specific ResizeCommand IAdaptable adaptableForStateMachine = new SemanticAdapter(null, stateMachineView); ChangeBoundsRequest internalResizeRequest = new ChangeBoundsRequest(); internalResizeRequest.setResizeDirection(PositionConstants.EAST); internalResizeRequest.setSizeDelta(new Dimension(dx, dy)); Rectangle rect = new Rectangle(x, y, stateMachineWidth + dx, stateMachineHeight + dy); CustomStateMachineResizeCommand internalResizeCommand = new CustomStateMachineResizeCommand(adaptableForStateMachine, getDiagramPreferencesHint(), getEditingDomain(), DiagramUIMessages.CreateCommand_Label, internalResizeRequest, rect, true); internalResizeCommand.setOptions(Collections.singletonMap(Transaction.OPTION_UNPROTECTED, Boolean.TRUE)); try { internalResizeCommand.execute(null, null); } catch (ExecutionException e) { } } } }