org.nightlabs.editor2d.ui.EditorActionBarContributor.java Source code

Java tutorial

Introduction

Here is the source code for org.nightlabs.editor2d.ui.EditorActionBarContributor.java

Source

/* *****************************************************************************
 * NightLabs Editor2D - Graphical editor framework                             *
 * Copyright (C) 2004-2005 NightLabs - http://NightLabs.org                    *
 * Project author: Daniel Mazurek <Daniel.Mazurek [at] nightlabs [dot] org>    *
 *                                                                             *
 * This library is free software; you can redistribute it and/or               *
 * modify it under the terms of the GNU Lesser General Public                  *
 * License as published by the Free Software Foundation; either                *
 * version 2.1 of the License, or (at your option) any later version.          *
 *                                                                             *
 * This library is distributed in the hope that it will be useful,             *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of              *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU           *
 * Lesser General Public License for more details.                             *
 *                                                                             *
 * You should have received a copy of the GNU Lesser General Public            *
 * License along with this library; if not, write to the                       *
 *     Free Software Foundation, Inc.,                                         *
 *     51 Franklin St, Fifth Floor,                                            *
 *     Boston, MA  02110-1301  USA                                             *
 *                                                                             *
 * Or get it online :                                                          *
 *     http://www.gnu.org/copyleft/lesser.html                                 *
 *                                                                             *
 *                                                                             *
 ******************************************************************************/

package org.nightlabs.editor2d.ui;

import org.eclipse.draw2d.PositionConstants;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.ui.actions.ActionBarContributor;
import org.eclipse.gef.ui.actions.AlignmentRetargetAction;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.gef.ui.actions.MatchHeightRetargetAction;
import org.eclipse.gef.ui.actions.MatchWidthRetargetAction;
import org.eclipse.gef.ui.actions.RedoRetargetAction;
import org.eclipse.gef.ui.actions.UndoRetargetAction;
import org.eclipse.gef.ui.actions.ZoomInRetargetAction;
import org.eclipse.gef.ui.actions.ZoomOutRetargetAction;
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.ui.IWorkbenchActionConstants;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.RetargetAction;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.base.ui.util.RCPUtil;
import org.nightlabs.editor2d.render.RenderModeManager;
import org.nightlabs.editor2d.ui.actions.DeleteAction;
import org.nightlabs.editor2d.ui.actions.EditShapeAction;
import org.nightlabs.editor2d.ui.actions.RepaintRetargetAction;
import org.nightlabs.editor2d.ui.actions.RotateAction;
import org.nightlabs.editor2d.ui.actions.copy.CopyAction;
import org.nightlabs.editor2d.ui.actions.copy.CutAction;
import org.nightlabs.editor2d.ui.actions.copy.PasteAction;
import org.nightlabs.editor2d.ui.actions.group.GroupAction;
import org.nightlabs.editor2d.ui.actions.group.UnGroupAction;
import org.nightlabs.editor2d.ui.actions.order.ChangeOrderOneDown;
import org.nightlabs.editor2d.ui.actions.order.ChangeOrderOneUp;
import org.nightlabs.editor2d.ui.actions.order.ChangeOrderToLocalBack;
import org.nightlabs.editor2d.ui.actions.order.ChangeOrderToLocalFront;
import org.nightlabs.editor2d.ui.actions.preferences.ShowFigureToolTipAction;
import org.nightlabs.editor2d.ui.actions.preferences.ShowStatusLineAction;
import org.nightlabs.editor2d.ui.actions.shape.ConvertToShapeAction;
import org.nightlabs.editor2d.ui.actions.shape.ShapeExclusiveOrAction;
import org.nightlabs.editor2d.ui.actions.shape.ShapeIntersectAction;
import org.nightlabs.editor2d.ui.actions.shape.ShapeSubtractAction;
import org.nightlabs.editor2d.ui.actions.shape.ShapeUnionAction;
import org.nightlabs.editor2d.ui.actions.zoom.ZoomAllAction;
import org.nightlabs.editor2d.ui.actions.zoom.ZoomAllRetargetAction;
import org.nightlabs.editor2d.ui.actions.zoom.ZoomPageAction;
import org.nightlabs.editor2d.ui.actions.zoom.ZoomPageRetargetAction;
import org.nightlabs.editor2d.ui.actions.zoom.ZoomSelectionAction;
import org.nightlabs.editor2d.ui.actions.zoom.ZoomSelectionRetargetSelection;
import org.nightlabs.editor2d.ui.custom.EditorZoomComboContributionItem;
import org.nightlabs.editor2d.ui.print.EditorPrintAction;
import org.nightlabs.editor2d.ui.print.EditorPrintSetupAction;
import org.nightlabs.editor2d.ui.resource.Messages;
import org.nightlabs.editor2d.viewer.ui.action.RenderModeContributionItem;
import org.nightlabs.editor2d.viewer.ui.render.RendererRegistry;

public class EditorActionBarContributor extends ActionBarContributor {
    @Override
    protected void buildActions() {
        // Undo / Redo
        addRetargetAction(new UndoRetargetAction());
        addRetargetAction(new RedoRetargetAction());

        // Delete
        //     addRetargetAction(new DeleteRetargetAction());
        addRetargetAction(new RetargetAction(DeleteAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.delete"))); //$NON-NLS-1$

        // Cut / Copy / Paste
        addRetargetAction(new RetargetAction(CopyAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.copy"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(PasteAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.paste"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(CutAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.cut"))); //$NON-NLS-1$

        // Group
        addRetargetAction(new RetargetAction(GroupAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.group"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(UnGroupAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.ungroup"))); //$NON-NLS-1$

        // Alignment
        addRetargetAction(new AlignmentRetargetAction(PositionConstants.LEFT));
        addRetargetAction(new AlignmentRetargetAction(PositionConstants.CENTER));
        addRetargetAction(new AlignmentRetargetAction(PositionConstants.RIGHT));
        addRetargetAction(new AlignmentRetargetAction(PositionConstants.TOP));
        addRetargetAction(new AlignmentRetargetAction(PositionConstants.MIDDLE));
        addRetargetAction(new AlignmentRetargetAction(PositionConstants.BOTTOM));
        addRetargetAction(new MatchWidthRetargetAction());
        addRetargetAction(new MatchHeightRetargetAction());

        // Order
        addRetargetAction(new RetargetAction(ChangeOrderToLocalFront.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.bringToFront"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(ChangeOrderOneUp.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.moveOneUp"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(ChangeOrderOneDown.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.moveOneDown"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(ChangeOrderToLocalBack.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.bringToBack"))); //$NON-NLS-1$

        // Ruler / Grid
        addRetargetAction(new RetargetAction(GEFActionConstants.TOGGLE_RULER_VISIBILITY,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.menu.showRuler"), //$NON-NLS-1$
                IAction.AS_CHECK_BOX));
        addRetargetAction(new RetargetAction(GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.menu.snapToGeometry"), //$NON-NLS-1$
                IAction.AS_CHECK_BOX));
        //     addRetargetAction(new RetargetAction(GEFActionConstants.TOGGLE_GRID_VISIBILITY,
        //           Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.menu.showGrid"), IAction.AS_CHECK_BOX)); //$NON-NLS-1$

        // Zoom
        addRetargetAction(new ZoomInRetargetAction());
        addRetargetAction(new ZoomOutRetargetAction());
        addRetargetAction(new ZoomAllRetargetAction());
        addRetargetAction(new ZoomSelectionRetargetSelection());
        addRetargetAction(new ZoomPageRetargetAction());

        addRetargetAction(new RetargetAction(ShowFigureToolTipAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.showToolTips"), //$NON-NLS-1$
                IAction.AS_CHECK_BOX));
        addRetargetAction(new RetargetAction(ShowStatusLineAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.showStatusLineInfo"), //$NON-NLS-1$
                IAction.AS_CHECK_BOX));

        addRetargetAction(new RepaintRetargetAction());

        // Print
        addRetargetAction(new RetargetAction(EditorPrintAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.print"))); //$NON-NLS-1$
        //     addRetargetAction(new RetargetAction(EditorPrintPreviewAction.ID,
        //           "PrintPreview"));
        addRetargetAction(new RetargetAction(EditorPrintSetupAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.pageSetup"))); //$NON-NLS-1$

        // Shape Actions
        addRetargetAction(new RetargetAction(ConvertToShapeAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.convertToShape"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(EditShapeAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.editShape"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(ShapeUnionAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.shape.union"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(ShapeSubtractAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.shape.subtract"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(ShapeIntersectAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.shape.intersect"))); //$NON-NLS-1$
        addRetargetAction(new RetargetAction(ShapeExclusiveOrAction.ID,
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.shape.exclusiveOr"))); //$NON-NLS-1$
    }

    public static final String ID_VIEW_MENU = IWorkbenchActionConstants.M_VIEW;
    public static final String ID_EDIT_MENU = IWorkbenchActionConstants.M_EDIT;
    public static final String ID_FILE_MENU = IWorkbenchActionConstants.M_FILE;
    public static final String ID_SHAPE_MENU = Messages
            .getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.menu.shape"); //$NON-NLS-1$

    /**
     * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager)
     */
    @Override
    public void contributeToMenu(IMenuManager menubar) {
        super.contributeToMenu(menubar);

        IContributionItem fm = RCPUtil.getMenuItem(ID_FILE_MENU, menubar);
        if (fm instanceof IMenuManager)
            fileMenu = (IMenuManager) fm;
        if (fileMenu != null) {
            IContributionItem printMenu = RCPUtil.getMenuItem(EditorPrintAction.ID, fileMenu);
            if (printMenu == null && fileMenu.find(ActionFactory.QUIT.getId()) != null) {
                fileMenu.insertBefore(ActionFactory.QUIT.getId(), getAction(EditorPrintAction.ID));
                fileMenu.insertAfter(EditorPrintAction.ID, getAction(EditorPrintSetupAction.ID));
                fileMenu.insertAfter(EditorPrintSetupAction.ID, new Separator());
            }
        }

        // Edit
        editMenu = new MenuManager(
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.menu.edit"), ID_EDIT_MENU); //$NON-NLS-1$

        // Undo / Redo
        editMenu.add(getAction(ActionFactory.UNDO.getId()));
        editMenu.add(getAction(ActionFactory.REDO.getId()));
        editMenu.add(new Separator());

        // Copy / Cut / Paste
        editMenu.add(getAction(CopyAction.ID));
        editMenu.add(getAction(PasteAction.ID));
        editMenu.add(getAction(CutAction.ID));
        editMenu.add(new Separator());

        // Delete
        //     editMenu.add(getAction(ActionFactory.DELETE.getId()));
        editMenu.add(getAction(DeleteAction.ID));
        editMenu.add(new Separator());

        // Group
        editMenu.add(getAction(GroupAction.ID));
        editMenu.add(getAction(UnGroupAction.ID));
        editMenu.add(new Separator());

        // Edit - Align
        addAlignActions(editMenu);

        // Edit - Order
        editMenu.add(new Separator());
        addOrderActions(editMenu);

        menubar.insertAfter(IWorkbenchActionConstants.M_FILE, editMenu);

        // View
        viewMenu = new MenuManager(
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.menu.view"), ID_VIEW_MENU); //$NON-NLS-1$
        addZoomActions(viewMenu);

        viewMenu.add(new Separator());
        viewMenu.add(getAction(GEFActionConstants.TOGGLE_RULER_VISIBILITY));
        //     viewMenu.add(getAction(GEFActionConstants.TOGGLE_GRID_VISIBILITY));
        viewMenu.add(getAction(GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY));

        viewMenu.add(new Separator());
        viewMenu.add(getAction(ShowFigureToolTipAction.ID));
        viewMenu.add(getAction(ShowStatusLineAction.ID));

        menubar.insertAfter(ID_EDIT_MENU, viewMenu);

        // Shape
        shapeMenu = new MenuManager(
                Messages.getString("org.nightlabs.editor2d.ui.EditorActionBarContributor.submenu.shape"), //$NON-NLS-1$
                ID_SHAPE_MENU);
        shapeMenu.add(getAction(ConvertToShapeAction.ID));
        shapeMenu.add(getAction(EditShapeAction.ID));
        shapeMenu.add(new Separator());
        addBooleanShapeActions(shapeMenu);

        menubar.insertAfter(ID_VIEW_MENU, shapeMenu);
    }

    private IMenuManager viewMenu = null;

    protected IMenuManager getViewMenu() {
        return viewMenu;
    }

    private IMenuManager editMenu = null;

    protected IMenuManager getEditMenu() {
        return editMenu;
    }

    private IMenuManager fileMenu = null;

    protected IMenuManager getFileMenu() {
        return fileMenu;
    }

    private IMenuManager shapeMenu = null;

    protected IMenuManager getShapeMenu() {
        return shapeMenu;
    }

    protected void addOrderActions(IContributionManager cm) {
        cm.add(getAction(ChangeOrderToLocalFront.ID));
        cm.add(getAction(ChangeOrderOneUp.ID));
        cm.add(getAction(ChangeOrderOneDown.ID));
        cm.add(getAction(ChangeOrderToLocalBack.ID));
    }

    protected void addAlignActions(IContributionManager cm) {
        cm.add(getAction(GEFActionConstants.ALIGN_LEFT));
        cm.add(getAction(GEFActionConstants.ALIGN_CENTER));
        cm.add(getAction(GEFActionConstants.ALIGN_RIGHT));
        cm.add(new Separator());
        cm.add(getAction(GEFActionConstants.ALIGN_TOP));
        cm.add(getAction(GEFActionConstants.ALIGN_MIDDLE));
        cm.add(getAction(GEFActionConstants.ALIGN_BOTTOM));
        cm.add(new Separator());
        cm.add(getAction(GEFActionConstants.MATCH_WIDTH));
        cm.add(getAction(GEFActionConstants.MATCH_HEIGHT));
    }

    protected void addZoomActions(IContributionManager cm) {
        IAction zoomInAction = getAction(GEFActionConstants.ZOOM_IN);
        zoomInAction.setImageDescriptor(SharedImages.getSharedImageDescriptor(EditorPlugin.getDefault(),
                EditorActionBarContributor.class, "ZoomIn")); //$NON-NLS-1$
        cm.add(zoomInAction);

        IAction zoomOutAction = getAction(GEFActionConstants.ZOOM_OUT);
        zoomOutAction.setImageDescriptor(SharedImages.getSharedImageDescriptor(EditorPlugin.getDefault(),
                EditorActionBarContributor.class, "ZoomOut")); //$NON-NLS-1$
        cm.add(zoomOutAction);

        cm.add(getAction(ZoomAllAction.ID));
        cm.add(getAction(ZoomSelectionAction.ID));
        cm.add(getAction(ZoomPageAction.ID));
    }

    protected void addBooleanShapeActions(IContributionManager cm) {
        cm.add(getAction(ShapeUnionAction.ID));
        cm.add(getAction(ShapeIntersectAction.ID));
        cm.add(getAction(ShapeSubtractAction.ID));
        cm.add(getAction(ShapeExclusiveOrAction.ID));
    }

    private EditorZoomComboContributionItem zoomContributionItem = null;

    public EditorZoomComboContributionItem getEditorZoomComboContributionItem() {
        return zoomContributionItem;
    }

    /**
     * Add actions to the given toolbar.
     * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager)
     */
    @Override
    public void contributeToToolBar(IToolBarManager tbm) {
        super.contributeToToolBar(tbm);
        // Undo / Redo
        tbm.add(getAction(ActionFactory.UNDO.getId()));
        tbm.add(getAction(ActionFactory.REDO.getId()));
        tbm.add(new Separator());

        // Align
        addAlignActions(tbm);
        tbm.add(new Separator());

        // Zoom
        String[] zoomStrings = new String[] { ZoomManager.FIT_ALL, ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH };
        zoomContributionItem = new EditorZoomComboContributionItem(getPage(), zoomStrings);
        tbm.add(zoomContributionItem);
        addZoomActions(tbm);
        tbm.add(new Separator());

        // RenderModes
        RenderModeManager renderMan = RendererRegistry.sharedInstance().getRenderModeManager();
        if (renderMan.getRenderModes().size() > 1)
            tbm.add(new RenderModeContributionItem(getPage(), true));
        tbm.add(new Separator());

        //     tbm.add(getAction(RepaintAction.ID));
        //     tbm.add(getAction(ViewerAction.ID));
    }

    /**
     * @see org.eclipse.gef.ui.actions.ActionBarContributor#declareGlobalActionKeys()
     */
    @Override
    protected void declareGlobalActionKeys() {
        addGlobalActionKey(ActionFactory.PRINT.getId());
        addGlobalActionKey(ActionFactory.SELECT_ALL.getId());
        addGlobalActionKey(ActionFactory.PASTE.getId());
        addGlobalActionKey(ActionFactory.COPY.getId());
        addGlobalActionKey(GEFActionConstants.ZOOM_IN);
        addGlobalActionKey(GEFActionConstants.ZOOM_OUT);
        addGlobalActionKey(ActionFactory.SAVE.getId());
        addGlobalActionKey(ActionFactory.SAVE_AS.getId());
        addGlobalActionKey(ActionFactory.UNDO.getId());
        addGlobalActionKey(ActionFactory.REDO.getId());

        addGlobalActionKey(ZoomAllAction.ID);
        addGlobalActionKey(ZoomSelectionAction.ID);
        addGlobalActionKey(ZoomPageAction.ID);
        addGlobalActionKey(RotateAction.ID);
        addGlobalActionKey(EditShapeAction.ID);
        addGlobalActionKey(ChangeOrderOneUp.ID);
        addGlobalActionKey(ChangeOrderOneDown.ID);
        addGlobalActionKey(ChangeOrderToLocalBack.ID);
        addGlobalActionKey(ChangeOrderToLocalFront.ID);
    }

    @Override
    public void dispose() {
        super.dispose();

        // TODO: workaround because printActions are not removed automaticly
        IContributionItem fm = RCPUtil.getMenuItem(ID_FILE_MENU, getActionBars().getMenuManager());
        if (fm instanceof IMenuManager) {
            IMenuManager fileMenu = (IMenuManager) fm;
            removeActionMenu(EditorPrintAction.ID, fileMenu);
            //         removeActionMenu(EditorPrintPreviewAction.ID, fileMenu);
            removeActionMenu(EditorPrintSetupAction.ID, fileMenu);
        }
    }

    protected void removeActionMenu(String actionID, IMenuManager menuMan) {
        IContributionItem ci = RCPUtil.getMenuItem(actionID, menuMan);
        if (ci != null) {
            menuMan.remove(ci);
        }
    }

}