| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2006 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 implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.authoring.ui.actions; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| |
| import org.eclipse.emf.common.ui.viewer.IViewerProvider; |
| import org.eclipse.emf.edit.domain.EditingDomain; |
| import org.eclipse.emf.edit.domain.IEditingDomainProvider; |
| import org.eclipse.emf.edit.ui.action.CopyAction; |
| import org.eclipse.emf.edit.ui.action.CutAction; |
| import org.eclipse.emf.edit.ui.action.DeleteAction; |
| import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; |
| import org.eclipse.emf.edit.ui.action.PasteAction; |
| import org.eclipse.emf.edit.ui.action.RedoAction; |
| import org.eclipse.emf.edit.ui.action.UndoAction; |
| import org.eclipse.epf.authoring.ui.AuthoringUIPlugin; |
| import org.eclipse.epf.authoring.ui.AuthoringUIResources; |
| import org.eclipse.epf.authoring.ui.editors.ProcessEditor; |
| import org.eclipse.epf.validation.LibraryEValidator; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.ActionContributionItem; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.action.IContributionItem; |
| import org.eclipse.jface.action.IContributionManager; |
| import org.eclipse.jface.action.IMenuListener; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.IToolBarManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.action.SubContributionItem; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.ISelectionProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.ISharedImages; |
| import org.eclipse.ui.IViewPart; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.actions.ActionFactory; |
| |
| /** |
| * The Library view action bar contributor. |
| * |
| * @author Phong Nguyen Le |
| * @since 1.0 |
| */ |
| public class LibraryActionBarContributor extends |
| EditingDomainActionBarContributor implements |
| ILibraryActionBarContributor, ISelectionChangedListener { |
| |
| // Keep track of the active editor. |
| protected IViewPart activeViewPart; |
| |
| // Keep track of the current selection provider. |
| protected ISelectionProvider selectionProvider; |
| |
| protected IActionBars viewActionBars; |
| |
| // Library view edit action |
| protected LibraryViewEditAction libraryViewEditAction; |
| |
| // Configuration view edit action |
| protected ConfigurationViewEditAction configViewEditAction; |
| |
| private EditingDomain editingDomain; |
| |
| /** |
| * Displays the Properties view. |
| */ |
| protected IAction showPropertiesViewAction = new Action( |
| AuthoringUIResources._UI_ShowPropertiesView_menu_item) { |
| public void run() { |
| try { |
| try { |
| getPage().showView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$ |
| } catch (PartInitException exception) { |
| exception.printStackTrace(); |
| } |
| } catch (RuntimeException e) { |
| AuthoringUIPlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| }; |
| |
| /** |
| * Refreshes the viewer of the current editor if the editor implements |
| * {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}. |
| */ |
| protected IAction refreshViewerAction = new Action( |
| AuthoringUIResources._UI_RefreshViewer_menu_item) { |
| public boolean isEnabled() { |
| return activeViewPart instanceof IViewerProvider; |
| } |
| |
| public void run() { |
| if (activeViewPart instanceof IViewerProvider) { |
| Viewer viewer = ((IViewerProvider) activeViewPart).getViewer(); |
| if (viewer != null) { |
| refreshViewer(viewer); |
| } |
| } |
| } |
| }; |
| |
| /** |
| * This will contain one |
| * {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to |
| * each descriptor generated for the current selection by the item provider. |
| */ |
| protected Collection createChildActions; |
| |
| /** |
| * The menu manager into which menu contribution items should be added for |
| * CreateChild actions. |
| */ |
| protected IMenuManager createChildMenuManager; |
| |
| /** |
| * This will contain one |
| * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding |
| * to each descriptor generated for the current selection by the item |
| * provider. |
| */ |
| protected Collection createSiblingActions; |
| |
| /** |
| * This is the menu manager into which menu contribution items should be |
| * added for CreateSibling actions. |
| */ |
| protected IMenuManager createSiblingMenuManager; |
| |
| /** |
| * Creates a new instance. |
| */ |
| public LibraryActionBarContributor(EditingDomain editingDomain) { |
| this.editingDomain = editingDomain; |
| |
| validateAction = new LibraryValidateAction(); |
| ((LibraryValidateAction)validateAction).putContextData(LibraryEValidator.CTX_ADAPTER_FACTORY_PROVIDER, |
| ProcessEditor.adapterFactoryProvider); |
| } |
| |
| /** |
| * @param viewer |
| */ |
| protected void refreshViewer(Viewer viewer) { |
| viewer.refresh(); |
| } |
| |
| /** |
| * Adds Separators for editor additions to the tool bar. |
| */ |
| public void contributeToToolBar(IToolBarManager toolBarManager) { |
| toolBarManager.add(new Separator("method-settings")); //$NON-NLS-1$ |
| toolBarManager.add(new Separator("method-additions")); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Adds to the menu bar a menu and some separators for editor |
| * additions, as well as the sub-menus for object creation items. |
| */ |
| public void contributeToMenu(IMenuManager menuManager) { |
| super.contributeToMenu(menuManager); |
| |
| IMenuManager submenuManager = new MenuManager( |
| AuthoringUIResources._UI_MethodEditor_menu, "com.ibm.methodMenuID"); //$NON-NLS-1$ |
| menuManager.insertAfter("additions", submenuManager); //$NON-NLS-1$ |
| submenuManager.add(new Separator("settings")); //$NON-NLS-1$ |
| submenuManager.add(new Separator("actions")); //$NON-NLS-1$ |
| submenuManager.add(new Separator("additions")); //$NON-NLS-1$ |
| submenuManager.add(new Separator("additions-end")); //$NON-NLS-1$ |
| |
| // Prepare for CreateChild item addition or removal. |
| createChildMenuManager = new MenuManager( |
| AuthoringUIResources._UI_CreateChild_menu_item); |
| submenuManager.insertBefore("additions", createChildMenuManager); //$NON-NLS-1$ |
| |
| // Prepare for CreateSibling item addition or removal. |
| createSiblingMenuManager = new MenuManager( |
| AuthoringUIResources._UI_CreateSibling_menu_item); |
| submenuManager.insertBefore("additions", createSiblingMenuManager); //$NON-NLS-1$ |
| |
| // Force an update because Eclipse hides empty menus now. |
| submenuManager.addMenuListener(new IMenuListener() { |
| public void menuAboutToShow(IMenuManager menuManager) { |
| menuManager.updateAll(true); |
| } |
| }); |
| |
| addGlobalActions(submenuManager); |
| } |
| |
| public IViewPart getActiveView() { |
| return activeViewPart; |
| } |
| |
| public void setActiveView(IViewPart part) { |
| // TODO - may need to check other method |
| if (part != null) |
| super.setActiveView(part); |
| if (part == activeViewPart) |
| return; |
| if (activeViewPart != null) { |
| deactivate(); |
| } |
| if (part == null) { |
| selectionProvider = null; |
| } |
| if (!(part instanceof IEditingDomainProvider)) |
| return; |
| activeViewPart = part; |
| editingDomain = ((IEditingDomainProvider) part).getEditingDomain(); |
| |
| // Switch to the new selection provider. |
| if (selectionProvider != null) { |
| selectionProvider.removeSelectionChangedListener(this); |
| } else { |
| selectionProvider = part.getSite().getSelectionProvider(); |
| selectionProvider.addSelectionChangedListener(this); |
| |
| // Fake a selection changed event to update the menus. |
| if (selectionProvider.getSelection() != null) { |
| selectionChanged(new SelectionChangedEvent(selectionProvider, |
| selectionProvider.getSelection())); |
| } |
| } |
| |
| activate(); |
| |
| } |
| |
| public void deactivate() { |
| activeViewPart.removePropertyListener(this); |
| |
| deleteAction.setEditingDomain(null); |
| cutAction.setEditingDomain(null); |
| copyAction.setEditingDomain(null); |
| pasteAction.setEditingDomain(null); |
| undoAction.setEditingDomain(null); |
| redoAction.setEditingDomain(null); |
| |
| if (loadResourceAction != null) { |
| loadResourceAction.setEditingDomain(null); |
| } |
| |
| ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart |
| : activeViewPart.getSite().getSelectionProvider(); |
| selectionProvider.removeSelectionChangedListener(deleteAction); |
| selectionProvider.removeSelectionChangedListener(libraryViewEditAction); |
| selectionProvider.removeSelectionChangedListener(cutAction); |
| selectionProvider.removeSelectionChangedListener(copyAction); |
| selectionProvider.removeSelectionChangedListener(pasteAction); |
| } |
| |
| public void disableGlobalEditMenu() { |
| deleteAction.setEnabled(false); |
| if (libraryViewEditAction != null) |
| libraryViewEditAction.setEnabled(false); |
| if (configViewEditAction != null) |
| configViewEditAction.setEnabled(false); |
| cutAction.setEnabled(false); |
| copyAction.setEnabled(false); |
| pasteAction.setEnabled(false); |
| undoAction.setEnabled(false); |
| redoAction.setEnabled(false); |
| } |
| |
| public void enableGlobalEditMenu() { |
| deleteAction.setEnabled(true); |
| if (libraryViewEditAction != null) |
| libraryViewEditAction.setEnabled(true); |
| if (configViewEditAction != null) |
| configViewEditAction.setEnabled(true); |
| cutAction.setEnabled(true); |
| copyAction.setEnabled(true); |
| pasteAction.setEnabled(true); |
| undoAction.setEnabled(true); |
| redoAction.setEnabled(true); |
| } |
| |
| /** |
| * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#activate() |
| */ |
| public void activate() { |
| activeViewPart.addPropertyListener(this); |
| |
| deleteAction.setEditingDomain(editingDomain); |
| cutAction.setEditingDomain(editingDomain); |
| copyAction.setEditingDomain(editingDomain); |
| pasteAction.setEditingDomain(editingDomain); |
| undoAction.setEditingDomain(editingDomain); |
| redoAction.setEditingDomain(editingDomain); |
| |
| if (loadResourceAction != null) { |
| loadResourceAction.setEditingDomain(editingDomain); |
| } |
| |
| ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart |
| : activeViewPart.getSite().getSelectionProvider(); |
| selectionProvider.addSelectionChangedListener(deleteAction); |
| selectionProvider.addSelectionChangedListener(libraryViewEditAction); |
| selectionProvider.addSelectionChangedListener(cutAction); |
| selectionProvider.addSelectionChangedListener(copyAction); |
| selectionProvider.addSelectionChangedListener(pasteAction); |
| if (validateAction != null) { |
| selectionProvider.addSelectionChangedListener(validateAction); |
| } |
| |
| if (controlAction != null) { |
| selectionProvider.addSelectionChangedListener(controlAction); |
| } |
| |
| update(); |
| } |
| |
| /** |
| * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#update() |
| */ |
| public void update() { |
| if (activeViewPart == null) |
| return; |
| |
| ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart |
| : activeViewPart.getSite().getSelectionProvider(); |
| ISelection selection = selectionProvider.getSelection(); |
| IStructuredSelection structuredSelection = selection instanceof IStructuredSelection ? (IStructuredSelection) selection |
| : StructuredSelection.EMPTY; |
| |
| deleteAction.updateSelection(structuredSelection); |
| libraryViewEditAction.updateSelection(structuredSelection); |
| cutAction.updateSelection(structuredSelection); |
| copyAction.updateSelection(structuredSelection); |
| pasteAction.updateSelection(structuredSelection); |
| undoAction.update(); |
| redoAction.update(); |
| |
| if (loadResourceAction != null) { |
| loadResourceAction.update(); |
| } |
| |
| if (validateAction != null) { |
| validateAction.updateSelection(structuredSelection); |
| } |
| } |
| |
| /** |
| * This implements |
| * {@link org.eclipse.jface.viewers.ISelectionChangedListener}, handling |
| * {@link org.eclipse.jface.viewers.SelectionChangedEvent} by querying for |
| * the children and siblings that can be added to the selected object and |
| * updating the menus accordingly. |
| */ |
| public void selectionChanged(SelectionChangedEvent event) { |
| // Remove any menu items for old selection. |
| if (createChildMenuManager != null) { |
| depopulateManager(createChildMenuManager, createChildActions); |
| } |
| if (createSiblingMenuManager != null) { |
| depopulateManager(createSiblingMenuManager, createSiblingActions); |
| } |
| |
| // Query the new selection for appropriate new child/sibling descriptors |
| Collection newChildDescriptors = null; |
| |
| ISelection selection = event.getSelection(); |
| if (selection instanceof IStructuredSelection |
| && ((IStructuredSelection) selection).size() == 1) { |
| Object object = ((IStructuredSelection) selection) |
| .getFirstElement(); |
| |
| EditingDomain domain = ((IEditingDomainProvider) activeViewPart) |
| .getEditingDomain(); |
| |
| newChildDescriptors = domain.getNewChildDescriptors(object, null); |
| } |
| |
| // Generate actions for selection; populate and redraw the menus. |
| createChildActions = generateCreateChildActions(newChildDescriptors, |
| selection); |
| |
| if (createChildMenuManager != null) { |
| populateManager(createChildMenuManager, createChildActions, null); |
| createChildMenuManager.update(true); |
| } |
| } |
| |
| /** |
| * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} |
| * for each object in <code>descriptors</code>, and returns the |
| * collection of these actions. |
| */ |
| protected Collection generateCreateChildActions(Collection descriptors, |
| ISelection selection) { |
| Collection actions = new ArrayList(); |
| if (descriptors != null) { |
| for (Iterator i = descriptors.iterator(); i.hasNext();) { |
| actions.add(new MethodCreateChildAction(editingDomain, |
| selection, i.next())); |
| } |
| } |
| return actions; |
| } |
| |
| /** |
| * This generates a |
| * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each |
| * object in <code>descriptors</code>, and returns the collection of |
| * these actions. |
| */ |
| protected Collection generateCreateSiblingActions(Collection descriptors, |
| ISelection selection) { |
| Collection actions = new ArrayList(); |
| if (descriptors != null) { |
| for (Iterator i = descriptors.iterator(); i.hasNext();) { |
| actions.add(new MethodCreateSiblingAction(activeViewPart, |
| selection, i.next())); |
| } |
| } |
| return actions; |
| } |
| |
| /** |
| * This populates the specified <code>manager</code> with |
| * {@link org.eclipse.jface.action.ActionContributionItem}s based on the |
| * {@link org.eclipse.jface.action.IAction}s contained in the |
| * <code>actions</code> collection, by inserting them before the specified |
| * contribution item <code>contributionID</code>. If <code>ID</code> is |
| * <code>null</code>, they are simply added. |
| */ |
| protected void populateManager(IContributionManager manager, |
| Collection actions, String contributionID) { |
| if (actions != null) { |
| for (Iterator i = actions.iterator(); i.hasNext();) { |
| IAction action = (IAction) i.next(); |
| if (contributionID != null) { |
| manager.insertBefore(contributionID, action); |
| } else { |
| manager.add(action); |
| } |
| } |
| } |
| } |
| |
| /** |
| * This removes from the specified <code>manager</code> all |
| * {@link org.eclipse.jface.action.ActionContributionItem}s based on the |
| * {@link org.eclipse.jface.action.IAction}s contained in the |
| * <code>actions</code> collection. |
| */ |
| protected void depopulateManager(IContributionManager manager, |
| Collection actions) { |
| if (actions != null) { |
| IContributionItem[] items = manager.getItems(); |
| for (int i = 0; i < items.length; i++) { |
| // Look into SubContributionItems |
| IContributionItem contributionItem = items[i]; |
| while (contributionItem instanceof SubContributionItem) { |
| contributionItem = ((SubContributionItem) contributionItem) |
| .getInnerItem(); |
| } |
| |
| // Delete the ActionContributionItems with matching action. |
| if (contributionItem instanceof ActionContributionItem) { |
| IAction action = ((ActionContributionItem) contributionItem) |
| .getAction(); |
| if (actions.contains(action)) { |
| manager.remove(contributionItem); |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * This populates the pop-up menu before it appears. |
| */ |
| public void menuAboutToShow(IMenuManager menuManager) { |
| super.menuAboutToShow(menuManager); |
| MenuManager submenuManager = null; |
| |
| submenuManager = new MenuManager(AuthoringUIResources._UI_CreateChild_menu_item); |
| populateManager(submenuManager, createChildActions, null); |
| menuManager.insertBefore("additions", submenuManager); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Inserts global actions before the "additions-end" separator. |
| */ |
| protected void addGlobalActions(IMenuManager menuManager) { |
| menuManager.insertAfter("additions-end", new Separator("ui-actions")); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| refreshViewerAction.setEnabled(refreshViewerAction.isEnabled()); |
| menuManager.insertAfter("ui-actions", refreshViewerAction); //$NON-NLS-1$ |
| |
| menuManager.insertBefore("additions-end", new Separator()); //$NON-NLS-1$ |
| |
| String key = (style & ADDITIONS_LAST_STYLE) == 0 ? "additions-end" : "additions"; //$NON-NLS-1$ //$NON-NLS-2$ |
| if (validateAction != null) |
| { |
| menuManager.insertBefore(key, new ActionContributionItem(validateAction)); |
| } |
| |
| } |
| |
| /** |
| * @see org.eclipse.ui.part.EditorActionBarContributor#init(IActionBars, |
| * IWorkbenchPage) |
| */ |
| public void init(IActionBars actionBars, IWorkbenchPage page) { |
| super.init(actionBars, page); |
| } |
| |
| /** |
| * @see org.eclipse.ui.part.EditorActionBarContributor#init(IActionBars) |
| */ |
| public void init(IActionBars actionBars) { |
| viewActionBars = actionBars; |
| |
| ISharedImages sharedImages = PlatformUI.getWorkbench() |
| .getSharedImages(); |
| |
| libraryViewEditAction = new LibraryViewEditAction(AuthoringUIResources.actionLabel_edit); |
| actionBars.setGlobalActionHandler(LibraryViewEditAction.ACTION_ID, |
| libraryViewEditAction); |
| |
| cutAction = createCutAction(); |
| cutAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_CUT)); |
| actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction); |
| |
| copyAction = createCopyAction(); |
| copyAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_COPY)); |
| actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), |
| copyAction); |
| |
| pasteAction = createPasteAction(); |
| pasteAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE)); |
| actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), |
| pasteAction); |
| |
| deleteAction = createDeleteAction(); |
| deleteAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); |
| actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), |
| deleteAction); |
| |
| undoAction = new UndoAction(); |
| undoAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)); |
| actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), |
| undoAction); |
| |
| redoAction = new RedoAction(); |
| redoAction.setImageDescriptor(sharedImages |
| .getImageDescriptor(ISharedImages.IMG_TOOL_REDO)); |
| actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), |
| redoAction); |
| |
| libraryViewEditAction.setEnabled(false); |
| |
| contributeToToolBar(actionBars.getToolBarManager()); |
| } |
| |
| /** |
| * Creates cut action |
| * @return action |
| */ |
| protected CutAction createCutAction() { |
| return new CutAction(); |
| } |
| |
| /** |
| * Creates paste action |
| * @return action |
| */ |
| protected PasteAction createPasteAction() { |
| return new PasteAction(); |
| } |
| |
| /** |
| * Creates copy action |
| * @return action |
| */ |
| protected CopyAction createCopyAction() { |
| return new CopyAction(); |
| } |
| |
| /** |
| * Creates delete action |
| * @return action |
| */ |
| protected DeleteAction createDeleteAction() { |
| return new DeleteAction(); |
| } |
| |
| /** |
| * @see org.eclipse.ui.part.EditorActionBarContributor#getActionBars() |
| */ |
| public IActionBars getActionBars() { |
| return viewActionBars; |
| } |
| } |