com.nokia.tools.s60.editor.menus.EditorActionBarContributor.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.s60.editor.menus.EditorActionBarContributor.java

Source

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.tools.s60.editor.menus;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.draw2d.PositionConstants;
import org.eclipse.gef.editparts.ZoomListener;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.ui.actions.AlignmentRetargetAction;
import org.eclipse.gef.ui.actions.CopyRetargetAction;
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.PasteRetargetAction;
import org.eclipse.gef.ui.actions.RedoRetargetAction;
import org.eclipse.gef.ui.actions.UndoRetargetAction;
import org.eclipse.gef.ui.actions.WorkbenchPartAction;
import org.eclipse.gef.ui.actions.ZoomInRetargetAction;
import org.eclipse.gef.ui.actions.ZoomOutRetargetAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
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.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionFactory;

import com.nokia.tools.content.core.IContent;
import com.nokia.tools.content.core.IContentAdapter;
import com.nokia.tools.media.utils.IMediaConstants;
import com.nokia.tools.s60.editor.Series60EditorPart;
import com.nokia.tools.s60.editor.actions.AlignmentToolsDropDownAction;
import com.nokia.tools.s60.editor.actions.BrowseForFileAction;
import com.nokia.tools.s60.editor.actions.ClearImageEditorAction;
import com.nokia.tools.s60.editor.actions.ConvertAndEditSVGInBitmapEditorAction;
import com.nokia.tools.s60.editor.actions.EditImageInBitmapEditorAction;
import com.nokia.tools.s60.editor.actions.EditImageInSVGEditorAction;
import com.nokia.tools.s60.editor.actions.EditInSystemEditorAction;
import com.nokia.tools.s60.editor.actions.EditMaskAction;
import com.nokia.tools.s60.editor.actions.EditMaskAction2;
import com.nokia.tools.s60.editor.actions.EditSoundInSoundEditorAction;
import com.nokia.tools.s60.editor.actions.ElevenPieceConvertAction;
import com.nokia.tools.s60.editor.actions.NinePieceConvertAction;
import com.nokia.tools.s60.editor.actions.PasteContentDataAction;
import com.nokia.tools.s60.editor.actions.SetColorAction;
import com.nokia.tools.s60.editor.actions.SetStretchModeAction;
import com.nokia.tools.s60.editor.actions.ThreePieceConvertAction;
import com.nokia.tools.s60.editor.ui.views.Messages;
import com.nokia.tools.s60.ide.S60WorkspacePlugin;
import com.nokia.tools.s60.ide.actions.ThemeModelDropDownAction;
import com.nokia.tools.s60.ide.actions.menu.GeneralRetargetAction;
import com.nokia.tools.screen.core.IScreenElement;
import com.nokia.tools.screen.ui.IScreenConstants;
import com.nokia.tools.screen.ui.UiPlugin;
import com.nokia.tools.screen.ui.actions.PausePlayingAction;
import com.nokia.tools.screen.ui.actions.PlayAllAction;
import com.nokia.tools.screen.ui.actions.PlayRetargetAction;
import com.nokia.tools.screen.ui.actions.PlaySelectionAction;
import com.nokia.tools.screen.ui.actions.SetPlayingSpeedAction;
import com.nokia.tools.screen.ui.actions.StopPlayingAction;
import com.nokia.tools.screen.ui.editor.BaseEditorContributor;
import com.nokia.tools.screen.ui.editor.embedded.IEmbeddedEditorActionBarContributor;
import com.nokia.tools.screen.ui.editor.embedded.IEmbeddedEditorContributor;
import com.nokia.tools.screen.ui.extension.ExtensionManager;
import com.nokia.tools.screen.ui.extension.IEmbeddedEditorDescriptor;
import com.nokia.tools.screen.ui.utils.ScreenUtil;

/**
 * This contributor contributes the zooming and resolution change actions to the
 * main action bar and the menu.
 */
public class EditorActionBarContributor extends BaseEditorContributor implements ZoomListener {

    private static final String EDIT_MENU_ID = "edit";

    private static final String TOOLS_MENU_ID = "Tools";

    private static final String ALIGNMENT_ID = "alignment";

    /**
     * Parent cool bar is not editor specific, in order to keep it alive after
     * closing the last editor of different type while another editor is still
     * using the same coolbar, we keep a global reference count only for parent
     * coolbar.
     */
    private static int refCount;

    private boolean embeddedActionAdded;

    private MenuManager viewMenu;

    private ComboContributionItem[] items;

    private IToolBarManager[] toolBars;

    private CustomZoomComboContributionItem zoom;

    private List<IEmbeddedEditorActionBarContributor> contributors = new ArrayList<IEmbeddedEditorActionBarContributor>();

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.BaseEditorContributor#init(org.eclipse.ui.IActionBars)
     */
    @Override
    public void init(IActionBars bars) {
        super.init(bars);
        refCount++;

        for (IEmbeddedEditorDescriptor descriptor : ExtensionManager.getEmbeddedEditorDescriptors()) {
            IEmbeddedEditorContributor contributor = descriptor.getContributor();
            if (contributor != null) {
                try {
                    IEmbeddedEditorActionBarContributor contrib = descriptor.getContributor()
                            .getActionBarContributor();
                    contrib.init(getActionBars(), getPage());
                    contrib.setParentEditorClass(Series60EditorPart.class);
                    contributors.add(contrib);
                } catch (Exception e) {
                    S60WorkspacePlugin.error(e);
                }
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.BaseEditorContributor#contributeToParentCoolBar()
     */
    protected void contributeToParentCoolBar() {
        if (!coolBarItems.isEmpty()) {
            return;
        }
        // Create zooming items
        String[] zoomStrings = new String[] { ZoomManager.FIT_ALL, ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH };
        zoom = new CustomZoomComboContributionItem(getPage(), zoomStrings);
        IToolBarManager zoomToolBar = contributeToolBarToCoolBar(zoom);
        zoomToolBar.add(new Separator());
        zoomToolBar.add(getAction(GEFActionConstants.ZOOM_IN));
        zoomToolBar.add(getAction(GEFActionConstants.ZOOM_OUT));

        IToolBarManager modelToolBar = contributeToolBarToCoolBar(new ThemeModelDropDownAction());

        // Resolution tools
        ResolutionComboContributionItem resolution = new ResolutionComboContributionItem();
        IToolBarManager resolutionToolBar = contributeToolBarToCoolBar(resolution);
        resolutionToolBar.add(new Separator());
        Action orientationAction = resolution.getOrientationAction();
        resolutionToolBar.add(orientationAction);

        items = new ComboContributionItem[] { resolution };
        toolBars = new IToolBarManager[] { modelToolBar };

        IToolBarManager playToolbar = contributeToolBarToCoolBar(getAction(PlayAllAction.ID));
        playToolbar.add(getAction(PlaySelectionAction.ID));
        playToolbar.add(getAction(PausePlayingAction.ID));
        playToolbar.add(getAction(StopPlayingAction.ID));
        playToolbar.add(new Separator());
        playToolbar.add(getAction(SetPlayingSpeedAction.ID));
    }

    private void contributeEmbeddedActions() {
        if (embeddedActionAdded) {
            return;
        }
        // Alignment and sizing tools
        AlignmentToolsDropDownAction alignmentToolsDropDownAction = new AlignmentToolsDropDownAction(
                getActionRegistry());
        IToolBarManager alignmentToolBar = contributeToolBarToCoolBar(alignmentToolsDropDownAction);
        alignmentToolBar.add(new Separator());
        alignmentToolBar.add(getAction(GEFActionConstants.MATCH_WIDTH));
        alignmentToolBar.add(getAction(GEFActionConstants.MATCH_HEIGHT));

        embeddedActionAdded = true;

        parentCoolBarManager.update(true);
        viewMenu.update(true);
    }

    private void removeEmbeddedActions() {
        if (!embeddedActionAdded) {
            return;
        }

        parentCoolBarManager.remove(AlignmentToolsDropDownAction.ID);
        embeddedActionAdded = false;
        //in order to make sure that coolItems controlled by
        //parentCoolBarManager are not disposed when we call an
        //update, we have to check for the empty condition here.
        if (!coolBarItems.isEmpty())
            parentCoolBarManager.update(true);
        viewMenu.update(true);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.gef.ui.actions.ActionBarContributor#buildActions()
     */
    @Override
    protected void buildActions() {
        addRetargetAction(new CopyRetargetAction());
        addRetargetAction(new PasteRetargetAction());
        addRetargetAction(new UndoRetargetAction());
        addRetargetAction(new RedoRetargetAction());
        addRetargetAction(new ZoomInRetargetAction());
        addRetargetAction(new ZoomOutRetargetAction());

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

        IAction act = new EditImageInBitmapEditorAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new BrowseForFileAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new EditImageInSVGEditorAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new EditSoundInSoundEditorAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new EditMaskAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new ConvertAndEditSVGInBitmapEditorAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new EditInSystemEditorAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new NinePieceConvertAction((ISelectionProvider) null, null, 1);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new NinePieceConvertAction((ISelectionProvider) null, null, 9);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));
        //11 pic support
        act = new ElevenPieceConvertAction((ISelectionProvider) null, null, 1);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new ElevenPieceConvertAction((ISelectionProvider) null, null, 11);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new ClearImageEditorAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new SetColorAction((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        act = new SetStretchModeAction((IWorkbenchPart) null, IMediaConstants.STRETCHMODE_STRETCH);
        addRetargetAction(
                new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText(), IAction.AS_CHECK_BOX));

        act = new SetStretchModeAction((IWorkbenchPart) null, IMediaConstants.STRETCHMODE_ASPECT);
        addRetargetAction(
                new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText(), IAction.AS_CHECK_BOX));

        act = new EditMaskAction2((ISelectionProvider) null, null);
        addRetargetAction(new GeneralRetargetAction(act.getId(), act.getText(), act.getToolTipText()));

        addRetargetAction(new PlayRetargetAction(new PlayAllAction((IWorkbenchPart) null)));

        addRetargetAction(new PlayRetargetAction(new PlaySelectionAction((IWorkbenchPart) null)));

        addRetargetAction(new PlayRetargetAction(new PausePlayingAction((IWorkbenchPart) null)));

        addRetargetAction(new PlayRetargetAction(new StopPlayingAction((IWorkbenchPart) null)));

        addRetargetAction(new PlayRetargetAction(new SetPlayingSpeedAction((IWorkbenchPart) null)));

        addRetargetAction(
                new GeneralRetargetAction(new PasteContentDataAction((ISelectionProvider) null, null, null)));
    }

    private void contributeEmbeddedMenus(IEditorPart editor) {
        if (viewMenu.find(ALIGNMENT_ID) != null) {
            return;
        }

        viewMenu.add(new Separator());
        MenuManager alignMenu = new MenuManager("&Alignment Tools", ALIGNMENT_ID);
        alignMenu.add(getAction(GEFActionConstants.ALIGN_LEFT));
        alignMenu.add(getAction(GEFActionConstants.ALIGN_CENTER));
        alignMenu.add(getAction(GEFActionConstants.ALIGN_RIGHT));
        alignMenu.add(new Separator());
        alignMenu.add(getAction(GEFActionConstants.ALIGN_TOP));
        alignMenu.add(getAction(GEFActionConstants.ALIGN_MIDDLE));
        alignMenu.add(getAction(GEFActionConstants.ALIGN_BOTTOM));
        viewMenu.add(alignMenu);
        viewMenu.add(new Separator());
        viewMenu.add(getAction(GEFActionConstants.MATCH_WIDTH));
        viewMenu.add(getAction(GEFActionConstants.MATCH_HEIGHT));
    }

    private void removeEmbeddedMenus() {
        for (IContributionItem item : viewMenu.getItems()) {
            if (!GEFActionConstants.ZOOM_IN.equals(item.getId())
                    && !GEFActionConstants.ZOOM_OUT.equals(item.getId())) {
                viewMenu.remove(item);
            }
        }
    } /*
        * (non-Javadoc)
        * 
        * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager)
        */

    public void contributeToMenu(IMenuManager menubar) {
        viewMenu = new MenuManager("&View", "view");
        viewMenu.add(getAction(GEFActionConstants.ZOOM_IN));
        viewMenu.add(getAction(GEFActionConstants.ZOOM_OUT));

        IMenuManager editMenu = menubar.findMenuUsingPath(EDIT_MENU_ID);

        editMenu.insertAfter(ActionFactory.PASTE.getId(), getAction(PasteContentDataAction.ID));

        editMenu.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                // refresh action label
                GeneralRetargetAction retarget = (GeneralRetargetAction) getAction(PasteContentDataAction.ID);
                if (retarget != null && retarget.isHandled()) {
                    ((WorkbenchPartAction) retarget.getActionHandler()).update();
                    retarget.setText(retarget.getActionHandler().getText());
                    retarget.setEnabled(retarget.getActionHandler().isEnabled());
                }
            }
        });

        editMenu.add(new Separator());
        IAction action = getAction(BrowseForFileAction.ID);
        action.setImageDescriptor(S60WorkspacePlugin.getImageDescriptor("icons/etool16/select_file.gif"));
        action.setDisabledImageDescriptor(S60WorkspacePlugin.getImageDescriptor("icons/dtool16/select_file.gif"));
        editMenu.add(action);
        editMenu.add(new Separator());
        editMenu.add(getAction(EditImageInBitmapEditorAction.ID));
        editMenu.add(getAction(EditImageInSVGEditorAction.ID));
        editMenu.add(getAction(ConvertAndEditSVGInBitmapEditorAction.ID));
        editMenu.add(getAction(EditSoundInSoundEditorAction.ID));
        editMenu.add(getAction(EditInSystemEditorAction.ID));
        editMenu.add(new Separator());
        editMenu.add(getAction(EditMaskAction.ID));
        editMenu.add(getAction(EditMaskAction2.ID));
        editMenu.add(new Separator());
        action = getAction(ClearImageEditorAction.ID);
        action.setImageDescriptor(S60WorkspacePlugin.getImageDescriptor("icons/etool16/clear_co.gif"));
        action.setDisabledImageDescriptor(S60WorkspacePlugin.getImageDescriptor("icons/dtool16/clear_co.gif"));
        editMenu.add(action);
        editMenu.add(new Separator());
        editMenu.add(getAction(NinePieceConvertAction.ID_NINE));
        editMenu.add(getAction(NinePieceConvertAction.ID_SINGLE));

        editMenu.add(getAction(ElevenPieceConvertAction.ID_ELEVEN));
        editMenu.add(getAction(ElevenPieceConvertAction.ID_SINGLE));

        /*editMenu.add(getAction(ThreePieceConvertAction.ID_THREE));
        editMenu.add(getAction(ThreePieceConvertAction.ID_SINGLE));*/

        MenuManager menu = new MenuManager(Messages.submenu_StretchMode_label);
        menu.add(getAction(SetStretchModeAction.ID_Stretch));
        menu.add(getAction(SetStretchModeAction.ID_Aspect));
        editMenu.add(new Separator());
        editMenu.add(menu);

        try {
            menubar.insertBefore(TOOLS_MENU_ID, viewMenu);
        } catch (Exception e) {

            menubar.insertAfter(EDIT_MENU_ID, viewMenu);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.gef.ui.actions.ActionBarContributor#declareGlobalActionKeys()
     */
    @Override
    protected void declareGlobalActionKeys() {
        addGlobalActionKey(ActionFactory.PRINT.getId());
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.s60.editor.menus.BaseEditorContributor#refresh(boolean)
     */
    protected void refresh(int state) {
        if (items != null) {
            for (ComboContributionItem item : items) {
                item.update();
            }
        }
        if (toolBars != null) {
            for (IToolBarManager toolBar : toolBars) {
                toolBar.update(true);
            }
        }
        if (isEditorActive()) {
            if (getContentEditor() != null) {
                ZoomManager manager = (ZoomManager) getContentEditor().getAdapter(ZoomManager.class);
                if (manager != null) {
                    manager.removeZoomListener(this);
                    manager.addZoomListener(this);
                }
                zoom.setZoomManager(manager);
            }
        } else {
            zoom.setZoomManager(null);
        }
        IEditorPart editor = getContentEditor();
        if (STATE_ACTIVATE == state) {
            IScreenElement element = ScreenUtil.getScreen(editor);
            if (element != null && element.getData() != null && element.getData().getRoot() != null) {
                if (!ScreenUtil.isPrimaryContent(element.getData())) {
                    contributeEmbeddedActions();
                } else {
                    removeEmbeddedActions();
                }
            }
        } else if (STATE_DEACTIVATE == state) {
            removeEmbeddedActions();
        }
        if (editor != null) {
            setActiveEditor(editor);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.gef.editparts.ZoomListener#zoomChanged(double)
     */
    public void zoomChanged(double zoom) {
        IPreferenceStore store = UiPlugin.getDefault().getPreferenceStore();
        store.setValue(IScreenConstants.PREF_ZOOMING_FACTOR, zoom);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(org.eclipse.ui.IEditorPart)
     */
    @Override
    public void setActiveEditor(IEditorPart editor) {
        super.setActiveEditor(editor);
        boolean showEmbeddedMenu = false;
        if (editor != null) {
            IContentAdapter adapter = (IContentAdapter) editor.getAdapter(IContentAdapter.class);
            if (adapter != null) {
                for (IContent content : adapter.getContents()) {
                    if (!ScreenUtil.isPrimaryContent(content)) {
                        showEmbeddedMenu = true;
                        break;
                    }
                }
            }
        }
        if (showEmbeddedMenu) {
            contributeEmbeddedMenus(editor);
        } else {
            removeEmbeddedMenus();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.s60.editor.menus.BaseEditorContributor#getContentEditor()
     */
    @Override
    protected IEditorPart getContentEditor() {
        IEditorPart part = super.getContentEditor();
        if (part != null
                && (part instanceof Series60EditorPart || part.getAdapter(Series60EditorPart.class) != null)) {
            return part;
        }
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.BaseEditorContributor#dispose()
     */
    @Override
    public void dispose() {
        refCount--;
        if (refCount < 0) {
            refCount = 0;
        }
        for (IEditorActionBarContributor contributor : contributors) {
            contributor.dispose();
        }
        super.dispose();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.BaseEditorContributor#canDisposeCoolBarItems()
     */
    @Override
    protected boolean canDisposeCoolBarItems() {
        return refCount <= 0;
    }
}