package org.eclipse.papyrus.uml.diagram.statemachine.custom.commands;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.uml.diagram.common.commands.SemanticAdapter;
import org.eclipse.papyrus.uml.diagram.statemachine.providers.ElementInitializers;
import org.eclipse.papyrus.uml.diagram.statemachine.providers.UMLElementTypes;
import org.eclipse.uml2.uml.FinalState;
import org.eclipse.uml2.uml.Pseudostate;
import org.eclipse.uml2.uml.Region;
import org.eclipse.uml2.uml.State;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.Vertex;
public class CustomVertexCreateElementCommand extends AbstractTransactionalCommand {
IAdaptable adaptable;
PreferencesHint prefHints;
IHintedType hint;
CreateViewRequest.ViewDescriptor viewDescriptor;
CreateElementRequest createElementRequest;
public CustomVertexCreateElementCommand(IAdaptable adaptable, IHintedType hint, PreferencesHint prefHints, TransactionalEditingDomain domain, String label) {
super(domain, label, null);
this.adaptable = adaptable;
this.hint = hint;
this.prefHints = prefHints;
viewDescriptor = new ViewDescriptor(adaptable, prefHints);
// make sure the return object is available even before
// executing/undoing/redoing
setResult(CommandResult.newOKCommandResult(viewDescriptor));
}
protected void doConfigure(Vertex newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
IElementType elementType = createElementRequest.getElementType();
ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
configureRequest.setClientContext(createElementRequest.getClientContext());
configureRequest.addParameters(createElementRequest.getParameters());
ICommand configureCommand = elementType.getEditCommand(configureRequest);
if(configureCommand != null && configureCommand.canExecute()) {
configureCommand.execute(monitor, info);
}
}
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
// adapt the view at execution time
View regionView = (View)adaptable.getAdapter(View.class);
View compartment = (View)regionView.getChildren().get(0);
Region owner = (Region)regionView.getElement();
Vertex newVertex = null;
if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.FinalState_5000).getSemanticHint())) {
newVertex = UMLFactory.eINSTANCE.createFinalState();
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_FinalState_5000((FinalState)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.FinalState_5000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.State_6000).getSemanticHint())) {
newVertex = UMLFactory.eINSTANCE.createState();
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_State_6000((State)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.State_6000);
} else {
newVertex = UMLFactory.eINSTANCE.createPseudostate();
if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_8000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_8000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_8000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_9000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_9000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_9000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_10000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_10000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_10000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_11000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_11000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_11000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_12000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_12000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_12000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_13000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_13000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_13000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_14000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_14000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_14000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_15000).getSemanticHint())) {
owner.getSubvertices().add(newVertex);
ElementInitializers.getInstance().init_Pseudostate_15000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_15000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_16000).getSemanticHint())) {
((State)owner.eContainer()).getConnectionPoints().add((Pseudostate)newVertex);
ElementInitializers.getInstance().init_Pseudostate_16000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_16000);
} else if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_17000).getSemanticHint())) {
((State)owner.eContainer()).getConnectionPoints().add((Pseudostate)newVertex);
ElementInitializers.getInstance().init_Pseudostate_17000((Pseudostate)newVertex);
createElementRequest = new CreateElementRequest(getEditingDomain(), regionView, UMLElementTypes.Pseudostate_17000);
}
}
doConfigure(newVertex, monitor, info);
// create a view for the new vertex on the regionCompartment
IAdaptable newVertexAdapatable = new SemanticAdapter(newVertex, null);
View newVertexView;
if(hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_16000).getSemanticHint()) || hint.getSemanticHint().equals(((IHintedType)UMLElementTypes.Pseudostate_17000).getSemanticHint())) {
newVertexView = (View)ViewService.getInstance().createNode(newVertexAdapatable, (View)regionView.eContainer().eContainer(), hint.getSemanticHint(), -1, prefHints);
} else {
newVertexView = (View)ViewService.getInstance().createNode(newVertexAdapatable, compartment, hint.getSemanticHint(), -1, prefHints);
}
viewDescriptor.setView(newVertexView);
return CommandResult.newOKCommandResult(viewDescriptor);
}
}