package org.yakindu.sct.ui.editor.providers; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.common.ui.services.action.global.IGlobalActionContext; import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart; import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandler; /** * The purpose of this subclass is to provide our own copy command * {@link org.yakindu.sct.ui.editor.providers.SubdiagramAwareCopyCommand.SubdiagramAwareCopyCommand(TransactionalEditingDomain, * String, View, List)} to allow for copying states together with their sub diagrams. * * @author Thomas Kutz * */ public class StatechartDiagramGlobalActionHandler extends DiagramGlobalActionHandler { @Override protected ICommand getCopyCommand(IGlobalActionContext cntxt, IDiagramWorkbenchPart diagramPart, final boolean isUndoable) { TransactionalEditingDomain editingDomain = getEditingDomain(diagramPart); if (editingDomain == null) { return null; } // return own copy command to also copy sub diagrams for copied states return new SubdiagramAwareCopyCommand(editingDomain, cntxt.getLabel(), diagramPart.getDiagram(), getSelectedViews(cntxt.getSelection())) { public boolean canUndo() { return isUndoable; } public boolean canRedo() { return isUndoable; } protected IStatus doUndo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { if (isUndoable) { return Status.OK_STATUS; } return super.doUndo(monitor, info); } protected IStatus doRedo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { if (isUndoable) { return Status.OK_STATUS; } return super.doRedo(monitor, info); } }; } /** * Copied from * DiagramGlobalActionHandler.getEditingDomain(IDiagramWorkbenchPart) because it is private. */ private TransactionalEditingDomain getEditingDomain(IDiagramWorkbenchPart part) { TransactionalEditingDomain result = null; IEditingDomainProvider provider = (IEditingDomainProvider) part.getAdapter(IEditingDomainProvider.class); if (provider != null) { EditingDomain domain = provider.getEditingDomain(); if (domain != null && domain instanceof TransactionalEditingDomain) { result = (TransactionalEditingDomain) domain; } } return result; } }