/*****************************************************************************
* Copyright (c) 2008 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:
* Cedric Dumoulin Cedric.Dumoulin@lifl.fr - Initial API and implementation
* Obeo
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.statemachine;
import java.util.Iterator;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.NotationFactory;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.uml.diagram.common.commands.CreateBehavioredClassifierDiagramCommand;
import org.eclipse.papyrus.uml.diagram.common.commands.SemanticAdapter;
import org.eclipse.papyrus.uml.diagram.statemachine.custom.helpers.Zone;
import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.PackageEditPart;
import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.StateMachineCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.statemachine.edit.parts.StateMachineNameEditPart;
import org.eclipse.papyrus.uml.diagram.statemachine.part.UMLDiagramEditorPlugin;
import org.eclipse.papyrus.uml.diagram.statemachine.part.UMLVisualIDRegistry;
import org.eclipse.papyrus.uml.diagram.statemachine.providers.ElementInitializers;
import org.eclipse.papyrus.uml.diagram.statemachine.providers.UMLElementTypes;
import org.eclipse.papyrus.uml.tools.utils.NamedElementUtil;
import org.eclipse.uml2.uml.BehavioredClassifier;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Region;
import org.eclipse.uml2.uml.StateMachine;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.UMLPackage;
/**
* Define a command to create a new StateMachine Diagram. This command is used by all UI (toolbar,
* outline, creation wizards) to create a new StateMachine Diagram.
*/
public class CreateStateMachineDiagramCommand extends CreateBehavioredClassifierDiagramCommand {
private StateMachine stateMachine = null;
public final static int defaultX = 30;
public final static int defaultY = 30;
public final static int defaultWidth = 700;
public final static int defaultHeight = 300;
public final static int defaultHeader = 13;
@Override
protected EClass getBehaviorEClass() {
return UMLPackage.eINSTANCE.getStateMachine();
}
/**
* {@inheritDoc}
*/
@Override
protected String getDefaultDiagramName() {
return "SmDiagram";
}
/**
* {@inheritDoc}
*/
@Override
protected String getDiagramNotationID() {
return PackageEditPart.MODEL_ID;
}
/**
* {@inheritDoc}
*/
@Override
protected PreferencesHint getPreferenceHint() {
return UMLDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
}
@Override
protected void initializeDiagram(EObject diagram) {
if(diagram instanceof Diagram) {
Diagram diag = (Diagram)diagram;
if(stateMachine != null) {
diag.setElement(stateMachine);
View stateMachineView = ViewService.getInstance().createView(Node.class, new EObjectAdapter(stateMachine), diag, null, ViewUtil.APPEND, true, getPreferenceHint());
Zone.setX(stateMachineView, defaultX);
Zone.setY(stateMachineView, defaultY);
Zone.setWidth(stateMachineView, defaultWidth);
Zone.setHeight(stateMachineView, defaultHeight);
View compartmentView = null;
Iterator<Node> it = stateMachineView.getChildren().iterator();
while(it.hasNext()) {
Node currentNode = it.next();
if(currentNode.getLayoutConstraint() == null) {
currentNode.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
}
if(UMLVisualIDRegistry.getVisualID(currentNode.getType()) == StateMachineNameEditPart.VISUAL_ID) {
Zone.setWidth(currentNode, defaultWidth);
Zone.setHeight(currentNode, defaultHeader);
} else if(UMLVisualIDRegistry.getVisualID(currentNode.getType()) == StateMachineCompartmentEditPart.VISUAL_ID) {
Zone.setY(currentNode, defaultHeader);
Zone.setWidth(currentNode, defaultWidth);
Zone.setHeight(currentNode, defaultHeight - defaultHeader);
compartmentView = currentNode;
}
}
Region region = null;
EList<Region> regions = stateMachine.getRegions();
if(regions.isEmpty()) {
region = UMLFactory.eINSTANCE.createRegion();
regions.add(region);
region.setName(NamedElementUtil.getDefaultNameWithIncrement(region, regions));
} else {
region = stateMachine.getRegions().get(0);
}
IAdaptable regionAdaptable = new SemanticAdapter(region, null);
String semanticHint = ((IHintedType)UMLElementTypes.Region_3000).getSemanticHint();
if(compartmentView != null) {
Node regionNode = ViewService.getInstance().createNode(regionAdaptable, compartmentView, semanticHint, -1, getPreferenceHint());
if(regionNode.getLayoutConstraint() == null) {
regionNode.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());
}
// add region specifics
Zone.createRegionDefaultAnnotation(regionNode);
Zone.setWidth(regionNode, defaultWidth);
Zone.setHeight(regionNode, defaultHeight - defaultHeader);
}
}
diag.setName(getName());
}
}
@Override
protected void initializeModel(EObject owner) {
if(owner.eClass() == getBehaviorEClass()) {
stateMachine = (StateMachine)owner;
} else {
stateMachine = UMLFactory.eINSTANCE.createStateMachine();
if(owner instanceof BehavioredClassifier) {
BehavioredClassifier behaviorClassifier = (BehavioredClassifier)owner;
behaviorClassifier.getOwnedBehaviors().add(stateMachine);
} else if(owner instanceof Package) {
org.eclipse.uml2.uml.Package pack = (org.eclipse.uml2.uml.Package)owner;
pack.getPackagedElements().add(stateMachine);
}
ElementInitializers.getInstance().init_StateMachine_2000(stateMachine);
}
}
}