blob: 175317cbbfe4ea8860e17d57a76061eaef66835c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui;
import java.util.List;
import org.eclipse.bpel.common.ui.tray.AddChildInTrayAction;
import org.eclipse.bpel.ui.actions.AbstractDeclarationAction;
import org.eclipse.bpel.ui.actions.AutoArrangeFlowsAction;
import org.eclipse.bpel.ui.actions.BPELCopyAction;
import org.eclipse.bpel.ui.actions.BPELCutAction;
import org.eclipse.bpel.ui.actions.BPELDeleteAction;
import org.eclipse.bpel.ui.actions.BPELDuplicateAction;
import org.eclipse.bpel.ui.actions.BPELPasteAction;
import org.eclipse.bpel.ui.actions.EditPartContextAction;
import org.eclipse.bpel.ui.actions.MakePartner2WayAction;
import org.eclipse.bpel.ui.actions.ShowPaletteInPaletteViewAction;
import org.eclipse.bpel.ui.actions.ShowPropertiesViewAction;
import org.eclipse.bpel.ui.actions.ToggleAutoFlowLayout;
import org.eclipse.bpel.ui.actions.ToggleLayoutOrientationAction;
import org.eclipse.bpel.ui.actions.ToggleShowCompensationHandler;
import org.eclipse.bpel.ui.actions.ToggleShowEventHandler;
import org.eclipse.bpel.ui.actions.ToggleShowFaultHandler;
import org.eclipse.bpel.ui.actions.ToggleShowTerminationHandler;
import org.eclipse.bpel.ui.actions.editpart.IEditPartAction;
import org.eclipse.bpel.ui.adapters.IEditPartActionContributor;
import org.eclipse.bpel.ui.editparts.BPELEditPart;
import org.eclipse.bpel.ui.editparts.CorrelationSetsEditPart;
import org.eclipse.bpel.ui.editparts.MessageExchangesEditPart;
import org.eclipse.bpel.ui.editparts.PartnerLinksEditPart;
import org.eclipse.bpel.ui.editparts.ReferencePartnerLinksEditPart;
import org.eclipse.bpel.ui.editparts.VariablesEditPart;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
/**
* Process Context Menu Provider.
*
* @author IBM
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
*
*/
public class ProcessContextMenuProvider extends ContextMenuProvider {
private ActionRegistry actionRegistry;
private ITextEditor textEditor;
/**
* @param viewer
* @param registry
*/
public ProcessContextMenuProvider(BPELEditor editor, ActionRegistry registry) {
super(editor.getGraphicalViewer());
this.actionRegistry = registry;
textEditor = editor.getMultipageEditor().getTextEditor();
}
protected static final String EDITPART_ACTIONS = "org.eclipse.bpel.ui.EditPartActions"; //$NON-NLS-1$
protected static final String FREQUENT_ACTIONS = "org.eclipse.bpel.ui.FrequentActions"; //$NON-NLS-1$
protected static final String ADVANCED_ACTIONS = IWorkbenchActionConstants.MB_ADDITIONS;
protected static final String LAYOUT_ACTIONS = "org.eclipse.bpel.ui.LayoutActions"; //$NON-NLS-1$
protected static final String DEBUG_ACTIONS = "org.eclipse.bpel.ui.DebugActions"; //$NON-NLS-1$
/**
* @see org.eclipse.gef.ContextMenuProvider#buildContextMenu(org.eclipse.jface.action.IMenuManager)
*/
@Override
public void buildContextMenu(IMenuManager menu) {
IAction action, action2;
menu.add(new Separator(GEFActionConstants.GROUP_UNDO));
menu.add(new Separator(EDITPART_ACTIONS));
menu.add(new Separator(FREQUENT_ACTIONS));
menu.add(new Separator(GEFActionConstants.GROUP_COPY));
menu.add(new Separator(GEFActionConstants.GROUP_EDIT));
menu.add(new Separator(GEFActionConstants.GROUP_REST));
menu.add(new Separator(ADVANCED_ACTIONS));
menu.add(new Separator(GEFActionConstants.GROUP_VIEW));
menu.add(new Separator(LAYOUT_ACTIONS));
menu.add(new Separator(DEBUG_ACTIONS));
menu.add(new Separator(IWorkbenchActionConstants.GROUP_SHOW_IN));
// Undo, Redo (always shown) and Revert (if appropriate)
// menu.appendToGroup(GEFActionConstants.GROUP_UNDO, actionRegistry.getAction(ActionFactory.UNDO.getId()));
// menu.appendToGroup(GEFActionConstants.GROUP_UNDO, actionRegistry.getAction(ActionFactory.REDO.getId()));
menu.appendToGroup(GEFActionConstants.GROUP_UNDO, textEditor.getAction(ITextEditorActionConstants.UNDO));
menu.appendToGroup(GEFActionConstants.GROUP_UNDO, textEditor.getAction(ITextEditorActionConstants.REDO));
action = actionRegistry.getAction(ActionFactory.REVERT.getId());
if (action.isEnabled()) menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
// Cut, Copy, Paste (always shown)
menu.appendToGroup(GEFActionConstants.GROUP_COPY, actionRegistry.getAction(BPELCutAction.ID));
menu.appendToGroup(GEFActionConstants.GROUP_COPY, actionRegistry.getAction(BPELCopyAction.ID));
menu.appendToGroup(GEFActionConstants.GROUP_COPY, actionRegistry.getAction(BPELPasteAction.ID));
menu.appendToGroup(GEFActionConstants.GROUP_COPY, actionRegistry.getAction(BPELDuplicateAction.ACTION_ID));
// https://issues.jboss.org/browse/JBIDE-7953
// create the "Add" sub-menu before we iterate through all the EditPartActions;
// some of these will go in the main context menu, some in the "Add" sub-menu
MenuManager addMenu = new MenuManager(Messages.ProcessContextMenuProvider_Add_1);
// Frequently-used actions
List selected = getViewer().getSelectedEditParts();
if (selected.size() == 1) {// any more than 1 is ambiguous
if (selected.get(0) instanceof BPELEditPart) {
BPELEditPart p = (BPELEditPart)selected.get(0);
Object model = p.getModel();
IEditPartActionContributor contributor = BPELUtil.adapt(model, IEditPartActionContributor.class);
if (contributor != null) {
for (IEditPartAction epAction : contributor.getEditPartActions(p)) {
String s = epAction.getToolTip();
// TODO: change IEditPartAction to provide lifecycle management
// for the images themselves (i.e. an action could either create/destroy
// an image from the decriptor, or it could return a shared image and do
// nothing on destroy).
ImageDescriptor imageDes = epAction.getIcon();
//Image image = epAction.getIconImg();
if (s != null && imageDes != null) {
EditPartContextAction conAction = new EditPartContextAction(null, p, epAction);
// if the action creates a declaration element (variables, partnerLinks, etc.)
// then add it to the "Add" sub-menu, instead of cluttering up the main context menu
if ( epAction instanceof AbstractDeclarationAction )
addMenu.add(conAction);
else
menu.appendToGroup(EDITPART_ACTIONS, conAction);
}
}
}
}
}
// Add and Insert actions
if (addMenu.getItems().length>0)
addMenu.add(new Separator());
MenuManager insertMenu = new MenuManager(Messages.ProcessContextMenuProvider_Insert_Before_2);
// TODO: There should be a better way to do this
BPELEditor bpelEditor = ((BPELMultipageEditorPart)(((DefaultEditDomain)getViewer().getEditDomain()).getEditorPart())).getDesignEditor();
// add all the possible actions
// TODO: need to be more selective here! Only add actions that make sense for this
// context..
for (IAction anAction : bpelEditor.getAppendNewActions()) {
if (anAction != null) {
// https://issues.jboss.org/browse/JBIDE-8043
// update the action's current selection
if (anAction instanceof SelectionAction)
((SelectionAction)anAction).update();
if (anAction.isEnabled())
addMenu.add(anAction);
}
}
for (IAction anAction : bpelEditor.getInsertNewActions()) {
if (anAction != null) {
// https://issues.jboss.org/browse/JBIDE-8043
if (anAction instanceof SelectionAction)
((SelectionAction)anAction).update();
if (anAction.isEnabled())
insertMenu.add(anAction);
}
}
if (!addMenu.isEmpty()) {
menu.appendToGroup(FREQUENT_ACTIONS, addMenu);
}
if (!insertMenu.isEmpty()) {
menu.appendToGroup(FREQUENT_ACTIONS, insertMenu);
}
// Change Type Actions
MenuManager changeTypeMenu = new MenuManager(Messages.ProcessContextMenuProvider_Change_Type_3);
for(IAction anAction : bpelEditor.getChangeTypeActions()) {
if (anAction != null && anAction.isEnabled()) {
changeTypeMenu.add( anAction );
}
}
menu.appendToGroup(FREQUENT_ACTIONS, changeTypeMenu);
action = actionRegistry.getAction(AddChildInTrayAction.calculateId(PartnerLinksEditPart.class));
if (action != null && action.isEnabled()) {
menu.appendToGroup(FREQUENT_ACTIONS, action);
}
action = actionRegistry.getAction(AddChildInTrayAction.calculateId(ReferencePartnerLinksEditPart.class));
if (action != null && action.isEnabled()) {
menu.appendToGroup(FREQUENT_ACTIONS, action);
}
action = actionRegistry.getAction(AddChildInTrayAction.calculateId(VariablesEditPart.class));
if (action != null && action.isEnabled()) {
menu.appendToGroup(FREQUENT_ACTIONS, action);
}
action = actionRegistry.getAction(AddChildInTrayAction.calculateId(CorrelationSetsEditPart.class));
if (action != null && action.isEnabled()) {
menu.appendToGroup(FREQUENT_ACTIONS, action);
}
action = actionRegistry.getAction(AddChildInTrayAction.calculateId(MessageExchangesEditPart.class));
if (action != null && action.isEnabled()) {
menu.appendToGroup(FREQUENT_ACTIONS, action);
}
action = actionRegistry.getAction(MakePartner2WayAction.ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(FREQUENT_ACTIONS, action);
}
// Delete (always shown) and Rename (if appropriate)
menu.appendToGroup(GEFActionConstants.GROUP_EDIT, actionRegistry.getAction(BPELDeleteAction.ID));
action = actionRegistry.getAction(ActionFactory.RENAME.getId());
if (action != null && action.isEnabled()) {
menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
}
action = actionRegistry.getAction(GEFActionConstants.ZOOM_IN);
action2 = actionRegistry.getAction(GEFActionConstants.ZOOM_OUT);
if (action.isEnabled() || action2.isEnabled()) {
menu.appendToGroup(GEFActionConstants.GROUP_VIEW, action);
menu.appendToGroup(GEFActionConstants.GROUP_VIEW, action2);
}
action = actionRegistry.getAction(ToggleAutoFlowLayout.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(LAYOUT_ACTIONS, action);
action.setChecked(true);
}
action = actionRegistry.getAction(AutoArrangeFlowsAction.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(LAYOUT_ACTIONS, action);
}
action = actionRegistry.getAction(ToggleLayoutOrientationAction.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(LAYOUT_ACTIONS, action);
}
action = actionRegistry.getAction(ToggleShowFaultHandler.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(LAYOUT_ACTIONS, action);
action.setChecked(true);
}
action = actionRegistry.getAction(ToggleShowCompensationHandler.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(LAYOUT_ACTIONS, action);
action.setChecked(true);
}
action = actionRegistry.getAction(ToggleShowTerminationHandler.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(LAYOUT_ACTIONS, action);
action.setChecked(true);
}
action = actionRegistry.getAction(ToggleShowEventHandler.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(LAYOUT_ACTIONS, action);
action.setChecked(true);
}
action = actionRegistry.getAction(ShowPropertiesViewAction.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(IWorkbenchActionConstants.GROUP_SHOW_IN, action);
action.setChecked(false);
}
action = actionRegistry.getAction(ShowPaletteInPaletteViewAction.ACTION_ID);
if (action != null && action.isEnabled()) {
menu.appendToGroup(IWorkbenchActionConstants.GROUP_SHOW_IN, action);
action.setChecked(false);
}
}
}