/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ui.actions.ActionFactory;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.gui.workflow.parts.WorkflowNodePart;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* ContextMenu for the Workflow editor.
*
* @author Heinrich Wendel
*/
class WorkflowEditorContextMenuProvider extends ContextMenuProvider {
public static final String GROUP_NODE_ACTIONS = "de.rcenvironment.rce.gui.workflow.editor.nodeActions";
/** The editor's action registry. */
private final ActionRegistry actionRegistry;
private EditPartViewer viewer;
/**
* Instantiate a new menu context provider for the specified EditPartViewer and ActionRegistry.
* @param cs The Command Stack of the editor.
* @param viewer the editor's graphical viewer
* @param actionRegistry the editor's action registry
*/
WorkflowEditorContextMenuProvider(EditPartViewer viewer, ActionRegistry actionRegistry) {
super(viewer);
this.viewer = viewer;
this.actionRegistry = actionRegistry;
}
@Override
public void buildContextMenu(IMenuManager menu) {
if (viewer.getSelectedEditParts().size() > 0) {
addContributedContextMenuActions(menu);
}
// Add standard action groups to the menu
GEFActionConstants.addStandardActionGroups(menu);
// Add shortcut text to the actions
IAction undo = actionRegistry.getAction(ActionFactory.UNDO.getId());
undo.setText(Messages.undo.concat(Messages.undoShortcut));
IAction redo = actionRegistry.getAction(ActionFactory.REDO.getId());
redo.setText(Messages.redo.concat(Messages.redoShortcut));
// Add actions to the menu
menu.appendToGroup(GEFActionConstants.GROUP_UNDO, undo);
menu.appendToGroup(GEFActionConstants.GROUP_UNDO, redo);
}
private void addContributedContextMenuActions(IMenuManager menu) {
menu.add(new Separator(GROUP_NODE_ACTIONS));
// add node actions contributed via extensions
IConfigurationElement[] confElements = Platform.getExtensionRegistry()
.getConfigurationElementsFor("de.rcenvironment.core.gui.workflow.editorActions"); //$NON-NLS-1$
for (final IConfigurationElement confElement : confElements) {
if (viewer.getSelectedEditParts().get(0) instanceof WorkflowNodePart){
WorkflowNode node = (WorkflowNode) ((WorkflowNodePart) viewer.getSelectedEditParts().get(0)).getModel();
if (node.getComponentDescription().getIdentifier().matches(confElement.getAttribute("component"))) { //$NON-NLS-1$
final WorkflowEditorAction action;
try {
Object actionObject = (WorkflowEditorAction) confElement.createExecutableExtension("class");
if (!(actionObject instanceof WorkflowEditorAction)) {
throw new RuntimeException(StringUtils.format(
"Class in attribute 'class' is not a subtype of '%s'.",
WorkflowEditorAction.class.getName()));
}
action = (WorkflowEditorAction) actionObject;
} catch (CoreException e) {
throw new RuntimeException(e);
}
action.setWorkflowNode(node);
menu.appendToGroup(GROUP_NODE_ACTIONS, new Action() {
@Override
public String getText() {
return confElement.getAttribute("label");
}
@Override
public void run() {
action.performAction();
}
@Override
public boolean isEnabled() {
@SuppressWarnings("rawtypes") List selection = ((GraphicalViewer) viewer).getSelectedEditParts();
return selection.size() == 1 && selection.get(0).getClass() == WorkflowNodePart.class;
}
});
}
}
}
}
}