org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor.java

Source

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

    protected void updatePasteAction() {
        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;
        pasteAction.setEnabled(pasteAction.updateSelection(structuredSelection));
    }

    /**
     * @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();) {
                Object obj = i.next();
                if (obj instanceof Separator) {
                    actions.add(obj);
                } else {
                    actions.add(new MethodCreateChildAction(editingDomain, selection, obj));
                }
            }
        }

        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();) {
                Object obj = i.next();
                if (obj instanceof IAction) {
                    IAction action = (IAction) obj;
                    if (contributionID != null) {
                        manager.insertBefore(contributionID, action);
                    } else {
                        manager.add(action);
                    }
                } else if (obj instanceof Separator) {
                    manager.add((Separator) obj);
                }
            }
        }
    }

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