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.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.StateNameEditPart;
import org.eclipse.uml2.uml.State;
/*****************************************************************************
* Copyright (c) 2010-2011 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:
*
* Arthur daussy (Atos) arthur.daussy@atos.net - Bug : 365405: [State Machine Diagram] Behaviours (Entry,exit,do) on states should have their own mechanisms
*
*****************************************************************************/
public class CustomStateNameEditPart extends StateNameEditPart {
public CustomStateNameEditPart(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();
StateFigure stateFigure = ((StateEditPart)getParent()).getPrimaryShape();
State state = (State)((View)getModel()).getElement();
View stateLabelView = (View)getModel();
View stateView = (View)stateLabelView.eContainer();
View stateCompartView = (View)stateView.getChildren().get(1);
if(stateCompartView.getChildren().isEmpty())
stateFigure.getStateCompartmentFigure().setVisible(false);
else
stateFigure.getStateCompartmentFigure().setVisible(true);
if(state.isSubmachineState()) {
stateFigure.setSubmachineStateName(state.getName() + " : " + state.getSubmachine().getQualifiedName());
stateFigure.setIsSubmachineState(true);
} else
stateFigure.setIsSubmachineState(false);
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);
}
}
width += 10;
int stateHeight = Zone.getHeight(stateView);
int stateWidth = Zone.getWidth(stateView);
int stateCompartHeight = Zone.getHeight(stateCompartView);
int dx = width - stateWidth;
int dy = stateCompartHeight + height - stateHeight;
int x = Zone.getX(stateView);
int y = Zone.getY(stateView);
if((stateHeight != -1) && (width != 0) && (dy != 0)) {
dx = (dx > 0) ? dx : 0;
// a resize request, which we route to the specific ResizeCommand
IAdaptable adaptableForState = new SemanticAdapter(null, stateView);
ChangeBoundsRequest internalResizeRequest = new ChangeBoundsRequest();
internalResizeRequest.setResizeDirection(PositionConstants.EAST);
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);
internalResizeCommand.setOptions(Collections.singletonMap(Transaction.OPTION_UNPROTECTED, Boolean.TRUE));
try {
internalResizeCommand.execute(null, null);
} catch (ExecutionException e) {
}
}
}
}