/*******************************************************************************
* Copyright (c) 2010 AtosOrigin.
* 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:
* AtosOrigin - initial API and implementation
*******************************************************************************/
package org.eclipse.papyrus.uml.diagram.common.commands;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
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.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.papyrus.infra.gmfdiag.common.AbstractPapyrusGmfCreateDiagramCommandHandler;
import org.eclipse.papyrus.uml.tools.utils.NamedElementUtil;
import org.eclipse.uml2.uml.Behavior;
import org.eclipse.uml2.uml.BehavioredClassifier;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.UMLFactory;
/**
* Define a command to create a new Behavioral Diagram. This command is used by
* all UI (toolbar, outline, creation wizards) to create a new Behavioral
* Diagram. This class should be extended by behavioral diagram only.
*/
public abstract class CreateBehavioredClassifierDiagramCommand extends AbstractPapyrusGmfCreateDiagramCommandHandler {
private Behavior behavior = null;
private String name = ""; //$NON-NLS-1$
/**
* {@inheritDoc}
*/
@Override
protected void initializeDiagram(EObject diagram) {
if(diagram instanceof Diagram) {
Diagram diag = (Diagram)diagram;
if(behavior != null) {
diag.setElement(behavior);
createBehaviorView(diag);
}
diag.setName(getName());
}
}
/**
* Create the associated behavior
*
* @return
*/
protected Behavior createBehavior() {
Behavior newBehavior = (Behavior)UMLFactory.eINSTANCE.create(getBehaviorEClass());
return newBehavior;
}
/**
* Get the kind of behavior associated to the diagram
*
* @return the EClass of the behavior supposed to own the diagram.
*/
protected abstract EClass getBehaviorEClass();
/**
* {@inheritDoc}
*/
protected void initializeModel(EObject owner) {
if(owner.eClass() == getBehaviorEClass()) {
behavior = (Behavior)owner;
} else {
behavior = (Behavior)UMLFactory.eINSTANCE.create(getBehaviorEClass());
if(owner instanceof BehavioredClassifier) {
BehavioredClassifier behaviorClassifier = (BehavioredClassifier)owner;
behaviorClassifier.getOwnedBehaviors().add(behavior);
} else if(owner instanceof Package) {
org.eclipse.uml2.uml.Package pack = (org.eclipse.uml2.uml.Package)owner;
pack.getPackagedElements().add(behavior);
}
behavior.setName(NamedElementUtil.getName(behavior));
}
}
private void createBehaviorView(Diagram diagram) {
ViewService.getInstance().createView(Node.class, new EObjectAdapter(behavior), diagram, null, ViewUtil.APPEND, true, getPreferenceHint());
}
/**
* {@inheritDoc}
*/
@Override
protected Diagram createDiagram(Resource diagramResource, EObject owner, String name) {
Diagram diagram = null;
if(owner instanceof org.eclipse.uml2.uml.Package) {
diagram = ViewService.createDiagram(owner, getDiagramNotationID(), getPreferenceHint());
} else if(owner instanceof BehavioredClassifier) {
diagram = ViewService.createDiagram(((BehavioredClassifier)owner).getNearestPackage(), getDiagramNotationID(), getPreferenceHint());
}
// create diagram
if(diagram != null) {
setName(name);
initializeModel(owner);
initializeDiagram(diagram);
diagramResource.getContents().add(diagram);
}
return diagram;
}
/**
* Set the name of the diagram and its containing element
*
* @param newName
*/
protected void setName(String newName) {
if(newName == null || newName.equals(name)) {
return;
}
name = newName;
}
protected String getName() {
return name;
}
// @Override
// protected void runAsTransaction(DiResourceSet diResourceSet, EObject
// container, String name) {
// if(name == null && container instanceof NamedElement) {
// setName(((NamedElement)container).getName());
// if(!"".equals(getName())) {
// // initialize name with activity's name
// name = openDiagramNameDialog(getName());
// if(name == null) {
// // operation canceled
// return;
// }
// }
// }
// super.runAsTransaction(diResourceSet, container,
// getDefaultDiagramName());
// }
/**
* Check if the creation of this diagram is strongly attached to its parent
* or if it can be reassigned after creation.
*
* @return true if parent can be reassigned
*/
public boolean isParentReassignable() {
// Behavioral diagrams describe their parent behavior and only this one.
// They can not be moved to another parent.
return false;
}
}