net.sf.eclipsensis.editor.NSISActionContributor.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.eclipsensis.editor.NSISActionContributor.java

Source

/*******************************************************************************
 * Copyright (c) 2004-2010 Sunil Kamath (IcemanK).
 * All rights reserved.
 * This program is made available under the terms of the Common Public License
 * v1.0 which is available at http://www.eclipse.org/legal/cpl-v10.html
 *
 * Contributors:
 *     Sunil Kamath (IcemanK) - initial API and implementation
 *******************************************************************************/
package net.sf.eclipsensis.editor;

import java.util.ResourceBundle;

import net.sf.eclipsensis.*;
import net.sf.eclipsensis.actions.NSISConfigWizardAction;
import net.sf.eclipsensis.util.Common;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.action.*;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.*;
import org.eclipse.ui.editors.text.TextEditorActionContributor;
import org.eclipse.ui.texteditor.*;

/**
 * Contributes interesting NSIS actions to the desktop's Edit menu and the toolbar.
 */
public class NSISActionContributor extends TextEditorActionContributor implements INSISConstants, IMenuListener {
    private RetargetTextEditorAction mInsertTemplate;
    private RetargetTextEditorAction mContentAssistProposal;
    private RetargetTextEditorAction mTabsToSpaces;
    private RetargetTextEditorAction mToggleComment;
    private RetargetTextEditorAction mAddBlockComment;
    private RetargetTextEditorAction mRemoveBlockComment;
    private RetargetTextEditorAction mInsertFile;
    private RetargetTextEditorAction mInsertDirectory;
    private RetargetTextEditorAction mInsertColor;
    private RetargetTextEditorAction mInsertRegFile;
    private RetargetTextEditorAction mInsertRegKey;
    private RetargetTextEditorAction mInsertRegVal;
    private IContributionItem mConfigWizardAction;

    /**
     * Default constructor.
     */
    public NSISActionContributor() {
        super();
        ResourceBundle bundle = EclipseNSISPlugin.getDefault().getResourceBundle();
        mContentAssistProposal = new RetargetTextEditorAction(bundle, "content.assist.proposal."); //$NON-NLS-1$
        mContentAssistProposal.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);

        mInsertTemplate = new RetargetTextEditorAction(bundle, "insert.template."); //$NON-NLS-1$
        mInsertTemplate.setActionDefinitionId(INSERT_TEMPLATE_COMMAND_ID);

        mTabsToSpaces = new RetargetTextEditorAction(bundle, "tabs.to.spaces."); //$NON-NLS-1$
        mTabsToSpaces.setActionDefinitionId(TABS_TO_SPACES_COMMAND_ID);

        mToggleComment = new RetargetTextEditorAction(bundle, "toggle.comment."); //$NON-NLS-1$
        mToggleComment.setActionDefinitionId(TOGGLE_COMMENT_COMMAND_ID);

        mAddBlockComment = new RetargetTextEditorAction(bundle, "add.block.comment."); //$NON-NLS-1$
        mAddBlockComment.setActionDefinitionId(ADD_BLOCK_COMMENT_COMMAND_ID);

        mRemoveBlockComment = new RetargetTextEditorAction(bundle, "remove.block.comment."); //$NON-NLS-1$
        mRemoveBlockComment.setActionDefinitionId(REMOVE_BLOCK_COMMENT_COMMAND_ID);

        mInsertFile = new RetargetTextEditorAction(bundle, "insert.file."); //$NON-NLS-1$
        mInsertFile.setImageDescriptor(
                EclipseNSISPlugin.getImageManager().getImageDescriptor(bundle.getString("insert.file.image"))); //$NON-NLS-1$
        mInsertFile.setActionDefinitionId(INSERT_FILE_COMMAND_ID);

        mInsertDirectory = new RetargetTextEditorAction(bundle, "insert.directory."); //$NON-NLS-1$
        mInsertDirectory.setImageDescriptor(
                EclipseNSISPlugin.getImageManager().getImageDescriptor(bundle.getString("insert.directory.image"))); //$NON-NLS-1$
        mInsertDirectory.setActionDefinitionId(INSERT_DIRECTORY_COMMAND_ID);

        mInsertColor = new RetargetTextEditorAction(bundle, "insert.color."); //$NON-NLS-1$
        mInsertColor.setImageDescriptor(
                EclipseNSISPlugin.getImageManager().getImageDescriptor(bundle.getString("insert.color.image"))); //$NON-NLS-1$
        mInsertColor.setActionDefinitionId(INSERT_COLOR_COMMAND_ID);

        mInsertRegFile = new RetargetTextEditorAction(bundle, "insert.regfile."); //$NON-NLS-1$
        mInsertRegFile.setImageDescriptor(
                EclipseNSISPlugin.getImageManager().getImageDescriptor(bundle.getString("insert.regfile.image"))); //$NON-NLS-1$
        mInsertRegFile.setActionDefinitionId(INSERT_REGFILE_COMMAND_ID);

        mInsertRegKey = new RetargetTextEditorAction(bundle, "insert.regkey."); //$NON-NLS-1$
        mInsertRegKey.setImageDescriptor(
                EclipseNSISPlugin.getImageManager().getImageDescriptor(bundle.getString("insert.regkey.image"))); //$NON-NLS-1$
        mInsertRegKey.setActionDefinitionId(INSERT_REGKEY_COMMAND_ID);

        mInsertRegVal = new RetargetTextEditorAction(bundle, "insert.regval."); //$NON-NLS-1$
        mInsertRegVal.setImageDescriptor(
                EclipseNSISPlugin.getImageManager().getImageDescriptor(bundle.getString("insert.regval.image"))); //$NON-NLS-1$
        mInsertRegVal.setActionDefinitionId(INSERT_REGVAL_COMMAND_ID);

        mConfigWizardAction = new ActionContributionItem(new NSISConfigWizardAction());
    }

    /*
     * @see IEditorActionBarContributor#init(IActionBars)
     */
    @Override
    public void init(IActionBars bars) {
        super.init(bars);

        IMenuManager menuManager = bars.getMenuManager();
        IMenuManager editMenu = menuManager.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
        if (editMenu != null) {
            editMenu.add(new Separator());
            editMenu.add(mContentAssistProposal);
            editMenu.add(mInsertTemplate);
            editMenu.add(new Separator());
            editMenu.add(mTabsToSpaces);
            editMenu.add(mToggleComment);
            editMenu.add(mAddBlockComment);
            editMenu.add(mRemoveBlockComment);
            editMenu.add(new Separator());
            editMenu.add(mInsertFile);
            editMenu.add(mInsertDirectory);
            editMenu.add(mInsertColor);
            editMenu.add(mInsertRegFile);
            editMenu.add(mInsertRegKey);
            editMenu.add(mInsertRegVal);
            editMenu.addMenuListener(new IMenuListener() {
                public void menuAboutToShow(IMenuManager manager) {
                    IEditorPart editor = getActiveEditorPart();
                    if (editor != null && editor instanceof NSISEditor) {
                        ISelection sel = ((NSISEditor) editor).getSelectionProvider().getSelection();
                        if (sel instanceof ITextSelection) {
                            mAddBlockComment.setEnabled(((ITextSelection) sel).getLength() > 0);
                        }
                    }
                }
            });
        }
    }

    private void doSetActiveEditor(IEditorPart part) {
        IEditorPart oldEditor = getActiveEditorPart();
        if (oldEditor != null) {
            IMenuManager manager = oldEditor.getEditorSite().getActionBars().getMenuManager();
            if (manager != null) {
                manager.removeMenuListener(this);
            }
        }
        ITextEditor editor = null;
        if (part instanceof ITextEditor) {
            editor = (ITextEditor) part;
        }

        if (editor != null) {
            try {
                IMenuManager manager = editor.getEditorSite().getActionBars().getMenuManager();
                manager = manager.findMenuUsingPath("net.sf.eclipsensis.Menu"); //$NON-NLS-1$
                if (manager != null) {
                    manager.addMenuListener(this);
                }
            } catch (NullPointerException e) {
                EclipseNSISPlugin.getDefault().log(e);
            }
        }

        mContentAssistProposal.setAction(getAction(editor, INSISEditorConstants.CONTENT_ASSIST_PROPOSAL));
        mInsertTemplate.setAction(getAction(editor, INSISEditorConstants.INSERT_TEMPLATE));
        mTabsToSpaces.setAction(getAction(editor, INSISEditorConstants.TABS_TO_SPACES));
        mToggleComment.setAction(getAction(editor, INSISEditorConstants.TOGGLE_COMMENT));
        mAddBlockComment.setAction(getAction(editor, INSISEditorConstants.ADD_BLOCK_COMMENT));
        mRemoveBlockComment.setAction(getAction(editor, INSISEditorConstants.REMOVE_BLOCK_COMMENT));
        mInsertFile.setAction(getAction(editor, INSISEditorConstants.INSERT_FILE));
        mInsertDirectory.setAction(getAction(editor, INSISEditorConstants.INSERT_DIRECTORY));
        mInsertColor.setAction(getAction(editor, INSISEditorConstants.INSERT_COLOR));
        mInsertRegFile.setAction(getAction(editor, INSISEditorConstants.INSERT_REGFILE));
        mInsertRegKey.setAction(getAction(editor, INSISEditorConstants.INSERT_REGKEY));
        mInsertRegVal.setAction(getAction(editor, INSISEditorConstants.INSERT_REGVAL));
    }

    /*
     * @see IEditorActionBarContributor#setActiveEditor(IEditorPart)
     */
    @Override
    public void setActiveEditor(IEditorPart part) {
        doSetActiveEditor(part);
        super.setActiveEditor(part);
    }

    /*
     * @see IEditorActionBarContributor#dispose()
     */
    @Override
    public void dispose() {
        doSetActiveEditor(null);
        super.dispose();
    }

    public void menuAboutToShow(IMenuManager manager) {
        if (manager != null) {
            if (showHideActions(getActiveEditorPart(), manager)) {
                manager.updateAll(true);
            }
            if (!EclipseNSISPlugin.getDefault().isConfigured()) {
                if (manager.find(NSISConfigWizardAction.ID) == null) {
                    manager.appendToGroup("net.sf.eclipsensis.Group4", mConfigWizardAction); //$NON-NLS-1$
                }
            } else {
                if (manager.find(NSISConfigWizardAction.ID) != null) {
                    manager.remove(mConfigWizardAction);
                }
            }
        }
    }

    private boolean showHideAction(IContributionManager manager, String id, boolean show) {
        IContributionItem item = manager.find(id);
        if (item != null) {
            if (item.isVisible() != show) {
                item.setVisible(show);
                item.update();
                return true;
            }
        }
        return false;
    }

    /**
     * @param editor
     * @param manager
     */
    private boolean showHideActions(IEditorPart editor, IContributionManager manager) {
        if (editor instanceof NSISEditor) {
            IEditorInput input = editor.getEditorInput();
            boolean openAssociatedScript = false;
            boolean openAssociatedHeaders = false;
            if (input instanceof IFileEditorInput) {
                IFile file = ((IFileEditorInput) input).getFile();
                String ext = file.getFileExtension();
                if (Common.stringsAreEqual(INSISConstants.NSH_EXTENSION, ext)) {
                    openAssociatedScript = true;
                } else if (Common.stringsAreEqual(INSISConstants.NSI_EXTENSION, ext)) {
                    openAssociatedHeaders = true;
                }
            }
            boolean b1 = showHideAction(manager, INSISConstants.OPEN_ASSOCIATED_SCRIPT_ACTION_ID,
                    openAssociatedScript);
            boolean b2 = showHideAction(manager, INSISConstants.OPEN_ASSOCIATED_HEADERS_ACTION_ID,
                    openAssociatedHeaders);
            return b1 || b2;
        }
        return false;
    }
}