at.spardat.xma.guidesign.presentation.action.GuidesignActionBarContributor.java Source code

Java tutorial

Introduction

Here is the source code for at.spardat.xma.guidesign.presentation.action.GuidesignActionBarContributor.java

Source

/*******************************************************************************
 * Copyright (c) 2003, 2007 s IT Solutions AT Spardat GmbH .
 * 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:
 *     s IT Solutions AT Spardat GmbH - initial API and implementation
 *******************************************************************************/

/**
 * <copyright>
 * </copyright>
 *
 * %W%
 * @version %I% %H%
 */
package at.spardat.xma.guidesign.presentation.action;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;

import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.ui.action.CreateChildAction;
import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
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.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.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.views.properties.IPropertySheetPage;

import at.spardat.xma.guidesign.HiddenWidget;
import at.spardat.xma.guidesign.IFormaterAttachable;
import at.spardat.xma.guidesign.PageComposite;
import at.spardat.xma.guidesign.XMAComponent;
import at.spardat.xma.guidesign.XMAPage;
import at.spardat.xma.guidesign.XMAScrolledComposite;
import at.spardat.xma.guidesign.XMATable;
import at.spardat.xma.guidesign.XMATableColumn;
import at.spardat.xma.guidesign.XMAWidget;
import at.spardat.xma.guidesign.flex.IGeneratable;
import at.spardat.xma.guidesign.plugin.GUIDesignerPlugin;

/**
 * This is the action bar contributor for the Guidesign model editor.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class GuidesignActionBarContributor extends EditingDomainActionBarContributor
        implements ISelectionChangedListener {
    /**
     * This keeps track of the active editor.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected IEditorPart activeEditorPart;

    /**
     * This keeps track of the current selection provider.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected ISelectionProvider selectionProvider;

    /**
     * This will contain one {@link CreateChildAction} corresponding to each descriptor
     * generated for the current selection by the item provider.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected Collection createChildActions;

    /**
     * This is the menu manager into which menu contribution items should be added for CreateChild actions.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected IMenuManager createChildMenuManager;

    /**
     * This will contain one {@link CreateSiblingAction} corresponding to each descriptor
     * generated for the current selection by the item provider.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected Collection createSiblingActions;

    /**
     * This is the menu manager into which menu contribution items should be added for CreateSibling actions.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected IMenuManager createSiblingMenuManager;

    /**
     * This will contain one Edit Action corresponding to each widget
     * @modified
     */
    protected Collection editActions;

    /**
     * This is the menu manager into which menu contribution items should be added for edit actions.
     * @modified
     */
    protected IMenuManager editMenuManager;

    /**
     * This creates an instance of the contributor.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    public GuidesignActionBarContributor() {
    }

    /**
     * This adds Separators for editor additions to the tool bar.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    public void contributeToToolBar(IToolBarManager toolBarManager) {
        toolBarManager.add(new Separator("guidesign-settings"));
        toolBarManager.add(new Separator("guidesign-additions"));
    }

    /**
     * This adds to the menu bar a menu and some separators for editor additions,
     * as well as the sub-menus for object creation items.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @modified
     */
    public void contributeToMenu(IMenuManager menuManager) {
        super.contributeToMenu(menuManager);

        IMenuManager submenuManager = new MenuManager(
                GUIDesignerPlugin.INSTANCE.getString("_UI_GuidesignEditor_menu"), "at.spardat.xma.guidesignMenuID");
        menuManager.insertAfter("additions", submenuManager);
        submenuManager.add(new Separator("settings"));
        submenuManager.add(new Separator("actions"));
        submenuManager.add(new Separator("additions"));
        submenuManager.add(new Separator("additions-end"));

        // Prepare for CreateChild item addition or removal.
        //
        createChildMenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
        submenuManager.insertBefore("additions", createChildMenuManager);

        // Prepare for CreateSibling item addition or removal.
        //
        createSiblingMenuManager = new MenuManager(
                GUIDesignerPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
        submenuManager.insertBefore("additions", createSiblingMenuManager);

        //Prepare for CreateGenerate item addition or removal.
        editMenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_Edit_menu_item"));
        submenuManager.insertBefore("additions", editMenuManager);
    }

    /**
     * When the active editor changes,
     * this remembers the change,
     * and registers with it as a selection provider.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    public void setActiveEditor(IEditorPart part) {
        super.setActiveEditor(part);
        activeEditorPart = part;

        // Switch to the new selection provider.
        //
        if (selectionProvider != null) {
            selectionProvider.removeSelectionChangedListener(this);
        }
        if (part == null) {
            selectionProvider = null;
        } 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()));
            }
        }
    }

    /**
     * This implements {@link ISelectionChangedListener},
     * handling {@link SelectionChangedEvents} by querying for the children and siblings
     * that can be added to the selected object and updating the menus accordingly.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    public void selectionChanged(SelectionChangedEvent event) {
        // Remove any menu items for old selection.
        //
        if (createChildMenuManager != null) {
            depopulateManager(createChildMenuManager, createChildActions);
        }
        if (createSiblingMenuManager != null) {
            depopulateManager(createSiblingMenuManager, createSiblingActions);
        }
        if (editMenuManager != null) {
            depopulateManager(editMenuManager, editActions);
        }
        // Query the new selection for appropriate new child/sibling descriptors
        //
        Collection newChildDescriptors = null;
        Collection newSiblingDescriptors = null;

        Object object = null;
        ISelection selection = event.getSelection();
        if (selection instanceof IStructuredSelection) {
            IStructuredSelection structSels = (IStructuredSelection) selection;
            if (structSels.size() == 1) {
                object = ((IStructuredSelection) selection).getFirstElement();
                EditingDomain domain = ((IEditingDomainProvider) activeEditorPart).getEditingDomain();
                newChildDescriptors = domain.getNewChildDescriptors(object, null);
                newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
            }
            //create edit actions
            editActions = generateEditActions(structSels);
        }

        // Generate actions for selection; populate and redraw the menus.
        //
        createChildActions = generateCreateChildActions(newChildDescriptors, selection);
        createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);

        if (createChildMenuManager != null) {
            populateManager(createChildMenuManager, createChildActions, null);
            createChildMenuManager.update(true);
        }
        if (createSiblingMenuManager != null) {
            populateManager(createSiblingMenuManager, createSiblingActions, null);
            createSiblingMenuManager.update(true);
        }

        if (editMenuManager != null) {
            populateManager(editMenuManager, editActions, null);
            editMenuManager.update(true);
        }
    }

    /**
     * @param sels the currently selected object in the workbench
     * @return a collection of actions dependend of the type of the selection object
     */
    private Collection generateEditActions(IStructuredSelection sels) {
        Collection actions = new LinkedList();
        Object selection = null;
        if (((IStructuredSelection) sels).size() == 1) {
            selection = ((IStructuredSelection) sels).getFirstElement();

            //create edit action for all xmawidget that may have Formdata
            if (selection instanceof XMAWidget && !(selection instanceof HiddenWidget)
                    && !(selection instanceof PageComposite)
                    && !(selection instanceof IGeneratable && ((IGeneratable) selection).isYnGenerated())) {
                actions.add(new EditFormDataAction("FormData", (XMAWidget) selection, activeEditorPart));
            }
            //create edit action for xmacomponent that may have xma properties
            if (selection instanceof XMAComponent) {
                actions.add(new EditComponentPropertyAction("Component Property", (XMAComponent) selection,
                        activeEditorPart));
            }
            //only showable xmawidget may have validator
            if (selection instanceof IFormaterAttachable
                    && !(selection instanceof IGeneratable && ((IGeneratable) selection).isYnGenerated())) {
                actions.add(
                        new EditValidatorAction("Validator", (IFormaterAttachable) selection, activeEditorPart));
            }
            //only showable xmawidget is a table with more than 1 columns
            if (selection instanceof XMATable && ((XMATable) selection).getColumn().size() > 0
                    && !(selection instanceof IGeneratable && ((IGeneratable) selection).isYnGenerated())) {
                actions.add(new EditCalculateTablelayoutAction("Calculate Layout", (XMATable) selection,
                        activeEditorPart));
            }
        } else {
            // we have more than one selection
            ArrayList selWids = new ArrayList();
            for (Iterator it = sels.iterator(); it.hasNext();) {
                Object selObj = it.next();
                if (selObj instanceof XMAWidget && !(selObj instanceof HiddenWidget)
                        && !(selObj instanceof PageComposite)) {
                    selWids.add(selObj);
                }
            }
            if (selWids.size() > 1) {
                actions.add(new MultiEditFormDataAction("FormData (multi selection)", selWids, activeEditorPart));
            }

        }

        return actions;
    }

    /**
     * This generates a {@link CreateChildAction} for each object in <code>descriptors</code>,
     * and returns the collection of these actions.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected Collection generateCreateChildActions(Collection descriptors, ISelection selection) {
        Collection actions = new LinkedList();
        if (descriptors != null) {
            for (Iterator i = descriptors.iterator(); i.hasNext();) {
                CommandParameter parameter = (CommandParameter) i.next();
                //use the own actions to start the new dialogs
                if (parameter.value instanceof XMAWidget) {
                    if (parameter.value instanceof XMAScrolledComposite) {
                        actions.add(new CreateScrolledCompositeAction(activeEditorPart, selection, parameter));
                    } else {
                        actions.add(new CreateXMAWidgetAction(activeEditorPart, selection, parameter));
                    }
                } else if (parameter.value instanceof XMAPage) {
                    actions.add(new CreateXMAPageAction(activeEditorPart, selection, parameter));
                } else if (parameter.value instanceof XMATableColumn) {
                    actions.add(new CreateXMATableColumnAction(activeEditorPart, selection, parameter));
                } else {
                    actions.add(new CreateChildAction(activeEditorPart, selection, parameter));
                }
            }
        }
        return actions;
    }

    /**
     * This generates a {@link CreateSiblingAction} for each object in <code>descriptors</code>,
     * and returns the collection of these actions.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected Collection generateCreateSiblingActions(Collection descriptors, ISelection selection) {
        Collection actions = new LinkedList();
        if (descriptors != null) {
            for (Iterator i = descriptors.iterator(); i.hasNext();) {
                CommandParameter parameter = (CommandParameter) i.next();
                //use the own actions to start the new dialogs
                if (parameter.value instanceof XMAWidget) {
                    if (parameter.value instanceof XMAScrolledComposite) {
                        actions.add(
                                new CreateScrolledCompositeSiblingAction(activeEditorPart, selection, parameter));
                    } else {
                        actions.add(new CreateXMAWidgetSiblingAction(activeEditorPart, selection, parameter));
                    }
                } else if (parameter.value instanceof XMAPage) {
                    actions.add(new CreateXMAPageSiblingAction(activeEditorPart, selection, parameter));
                } else if (parameter.value instanceof XMATableColumn) {
                    actions.add(new CreateXMATableColumnSiblingAction(activeEditorPart, selection, parameter));
                } else {
                    actions.add(new CreateSiblingAction(activeEditorPart, selection, parameter));
                }
            }
        }
        return actions;
    }

    /**
     * This populates the specified <code>manager</code> with {@link ActionContributionItem}s
     * based on the {@link 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.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    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 ActionContributionItem}s
     * based on the {@link IAction}s contained in the <code>actions</code> collection.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    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.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    public void menuAboutToShow(IMenuManager menuManager) {
        //we don't need undo/redo therefore menuAboutToShow is copied from
        //the superclass

        // **** begin copy
        // Add our standard marker.
        menuManager.add(new Separator("additions"));
        menuManager.add(new Separator("edit"));
        // Add the edit menu actions.
        //menuManager.add(new ActionContributionItem(undoAction));
        //menuManager.add(new ActionContributionItem(redoAction));
        menuManager.add(new Separator());
        menuManager.add(new ActionContributionItem(cutAction));
        menuManager.add(new ActionContributionItem(copyAction));
        menuManager.add(new ActionContributionItem(pasteAction));
        menuManager.add(new Separator());
        menuManager.add(new ActionContributionItem(deleteAction));
        // Add our other standard marker.
        menuManager.add(new Separator("additions-end"));
        // **** end copy
        //super.menuAboutToShow(menuManager);

        MenuManager submenuManager = null;

        submenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
        populateManager(submenuManager, createChildActions, null);
        menuManager.insertBefore("additions", submenuManager);

        submenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
        populateManager(submenuManager, createSiblingActions, null);
        menuManager.insertBefore("additions", submenuManager);

        submenuManager = new MenuManager(GUIDesignerPlugin.INSTANCE.getString("_UI_Edit_menu_item"));
        populateManager(submenuManager, editActions, null);
        menuManager.insertBefore("additions", submenuManager);
    }

    /**
     * the sense of this override of the superclass method is to remove
     * undo/redo from the global actions
     */
    public void shareGlobalActions(IPage page, IActionBars actionBars) {
        if (!(page instanceof IPropertySheetPage)) {
            actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
            actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction);
            actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
            actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
        }
        //actionBars.setGlobalActionHandler(IWorkbenchActionConstants.UNDO, undoAction);
        //actionBars.setGlobalActionHandler(IWorkbenchActionConstants.REDO, redoAction);
    }

    /**
     * the sense of this override of the superclass method is to remove
     * undo/redo from the global actions
     */
    public void activate() {
        activeEditor.addPropertyListener(this);

        deleteAction.setActiveEditor(activeEditor);
        cutAction.setActiveEditor(activeEditor);
        copyAction.setActiveEditor(activeEditor);
        pasteAction.setActiveEditor(activeEditor);
        undoAction.setActiveEditor(null);
        redoAction.setActiveEditor(null);

        ISelectionProvider selectionProvider = activeEditor instanceof ISelectionProvider
                ? (ISelectionProvider) activeEditor
                : activeEditor.getEditorSite().getSelectionProvider();
        selectionProvider.addSelectionChangedListener(deleteAction);
        selectionProvider.addSelectionChangedListener(cutAction);
        selectionProvider.addSelectionChangedListener(copyAction);
        selectionProvider.addSelectionChangedListener(pasteAction);

        update();
    }

    /**
     * the sense of this override of the superclass method is to remove
     * undo/redo from the global actions
     */
    public void update() {
        ISelectionProvider selectionProvider = activeEditor instanceof ISelectionProvider
                ? (ISelectionProvider) activeEditor
                : activeEditor.getEditorSite().getSelectionProvider();
        ISelection selection = selectionProvider.getSelection();
        IStructuredSelection structuredSelection = selection instanceof IStructuredSelection
                ? (IStructuredSelection) selection
                : StructuredSelection.EMPTY;

        deleteAction.updateSelection(structuredSelection);
        cutAction.updateSelection(structuredSelection);
        copyAction.updateSelection(structuredSelection);
        pasteAction.updateSelection(structuredSelection);
        //undoAction.update();
        //redoAction.update();
    }
}