/**
* Copyright (c) 2013 committers of YAKINDU and others.
* 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:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.sct.ui.editor.commands;
import java.util.Collections;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IOperationHistory;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.yakindu.sct.model.sgraph.State;
import org.yakindu.sct.ui.editor.DiagramActivator;
import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
import org.yakindu.sct.ui.editor.editparts.StateEditPart;
import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
/**
*
* @author andreas muelder - Initial contribution and API
*
*/
public class CreateSubdiagramCommand extends AbstractHandler {
public Object execute(ExecutionEvent event) throws ExecutionException {
Node state = unwrap(HandlerUtil.getCurrentSelection(event));
if (state == null)
return null;
CreateSubDiagramCommand cmd = new CreateSubDiagramCommand(state);
executeCommand(cmd);
return null;
}
protected void executeCommand(AbstractTransactionalCommand operation) {
IOperationHistory history = OperationHistoryFactory.getOperationHistory();
try {
history.execute(operation, new NullProgressMonitor(), null);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
public Node unwrap(ISelection selection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
Object firstElement = structuredSelection.getFirstElement();
if (firstElement == null)
return null;
return (Node) ((StateEditPart) firstElement).getNotationView();
}
@Override
public boolean isEnabled() {
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWorkbenchWindow == null)
return false;
ISelection selection = activeWorkbenchWindow.getActivePage().getSelection();
if (selection == null)
return false;
Node unwrap = unwrap(selection);
if (unwrap == null) {
return false;
}
State state = (State) unwrap.getElement();
if (state==null || state.isComposite())
return false;
BooleanValueStyle inlineStyle = DiagramPartitioningUtil.getInlineStyle(unwrap);
if (inlineStyle != null && !inlineStyle.isBooleanValue())
return false;
return super.isEnabled();
}
protected static class CreateSubDiagramCommand extends AbstractTransactionalCommand {
private Node node;
public CreateSubDiagramCommand(Node node) {
super(TransactionUtil.getEditingDomain(node), "Create Subdiagram", Collections
.singletonList(WorkspaceSynchronizer.getFile(node.eResource())));
this.node = node;
}
@SuppressWarnings("unchecked")
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
throws ExecutionException {
BooleanValueStyle inlineStyle = DiagramPartitioningUtil.getInlineStyle(node);
if (inlineStyle != null) {
inlineStyle.setBooleanValue(false);
} else {
inlineStyle = DiagramPartitioningUtil.createInlineStyle();
inlineStyle.setBooleanValue(false);
node.getStyles().add(inlineStyle);
}
Diagram subdiagram = ViewService.createDiagram(node.getElement(), StatechartDiagramEditor.ID,
DiagramActivator.DIAGRAM_PREFERENCES_HINT);
node.eResource().getContents().add(subdiagram);
return CommandResult.newOKCommandResult();
}
}
}