package org.eclipse.papyrus.uml.diagram.statemachine.custom.commands;
import java.util.Iterator;
import java.util.List;
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.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.IHintedType;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.View;
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.StateMachineCompartmentEditPart;
import org.eclipse.papyrus.uml.diagram.statemachine.part.UMLVisualIDRegistry;
import org.eclipse.papyrus.uml.diagram.statemachine.providers.UMLElementTypes;
import org.eclipse.uml2.uml.Region;
import org.eclipse.uml2.uml.StateMachine;
public class CustomStateMachineWithDefaultRegionCreateNodeCommand extends AbstractTransactionalCommand {
IAdaptable adaptable;
PreferencesHint prefHints;
CreateViewRequest.ViewDescriptor viewDescriptor;
public CustomStateMachineWithDefaultRegionCreateNodeCommand(IAdaptable adaptable, PreferencesHint prefHints, TransactionalEditingDomain domain, String label, List affectedFiles) {
super(domain, label, affectedFiles);
this.adaptable = adaptable;
this.prefHints = prefHints;
viewDescriptor = new ViewDescriptor(adaptable, prefHints);
// make sure the return object is available even before
// executing/undoing/redoing
setResult(CommandResult.newOKCommandResult(viewDescriptor));
}
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
// adapt the view at execution time
View stateMachineView = (View)adaptable.getAdapter(View.class);
View compartmentView = null;
Iterator<View> it = stateMachineView.getChildren().iterator();
while((compartmentView == null) && it.hasNext()) {
View currentView = (View)it.next();
if(UMLVisualIDRegistry.getVisualID(currentView.getType()) == StateMachineCompartmentEditPart.VISUAL_ID)
compartmentView = currentView;
}
StateMachine stateMachine = (StateMachine)stateMachineView.getElement();
Iterator<Region> regions = stateMachine.getRegions().iterator();
while(regions.hasNext()) {
Region region = regions.next();
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, prefHints);
// add region specifics
Zone.createRegionDefaultAnnotation(regionNode);
if(regionNode != null) {
viewDescriptor.setView(regionNode);
}
}
}
return CommandResult.newOKCommandResult(viewDescriptor);
}
}