/******************************************************************************* * 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); } } }