org.eclipse.eclipsemonkey.actions.RecreateMonkeyCoolbarAction.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.eclipsemonkey.actions.RecreateMonkeyCoolbarAction.java

Source

/*******************************************************************************
 * Copyright (c) 2005, 2006 Eclipse Foundation
 * 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:
 *     Bjorn Freeman-Benson - initial implementation
 *     Ward Cunningham - initial implementation
 *     Channing Walton - bug 143456
 *******************************************************************************/

package org.eclipse.eclipsemonkey.actions;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.core.runtime.IPath;
import org.eclipse.eclipsemonkey.EclipseMonkeyPlugin;
import org.eclipse.eclipsemonkey.MenuRunMonkeyScript;
import org.eclipse.eclipsemonkey.RunMonkeyException;
import org.eclipse.eclipsemonkey.ScriptMetadata;
import org.eclipse.eclipsemonkey.StoredScript;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.CoolBarManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.internal.WorkbenchWindow;

/**
 *
 */
public class RecreateMonkeyCoolbarAction implements IWorkbenchWindowActionDelegate {

    public static Hashtable toolbars = new Hashtable();

    /**
     * 
     */
    public RecreateMonkeyCoolbarAction() {
    }

    /**
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    public void run(IAction action) {
        clearTheToolbar();
        Collection metaDatas = getAllMetadatas();
        List toolbarData = createToolbarFromMetadatas(metaDatas);
        createTheToolbar(toolbarData, action);
    }

    private Collection getAllMetadatas() {
        ArrayList result = new ArrayList();
        Iterator iter = EclipseMonkeyPlugin.getDefault().getScriptStore().values().iterator();
        for (; iter.hasNext();) {
            StoredScript element = (StoredScript) iter.next();
            result.add(element.metadata);
        }
        return result;
    }

    private void clearTheToolbar() {
        CoolBarManager manager = ((WorkbenchWindow) window).getCoolBarManager();
        if (manager != null) {
            for (Iterator iter = toolbars.values().iterator(); iter.hasNext();) {
                IToolBarManager element = (IToolBarManager) iter.next();
                IContributionItem[] items = element.getItems();
                for (int i = 0; i < items.length; i++) {
                    element.remove(items[i]);
                }
            }
        }
    }

    private Pattern subtoolbar_pattern = Pattern.compile("^(.+?)>(.*)$"); //$NON-NLS-1$

    class MonkeyToolbarStruct {
        String key;
        IToolBarManager toolbar;
        MonkeyToolbarStruct subtoolbar;
    }

    private void createTheToolbar(List toolbarData, final IAction action) {
        CoolBarManager outerManager = ((WorkbenchWindow) window).getCoolBarManager();

        MonkeyToolbarStruct current = new MonkeyToolbarStruct();
        current.key = ""; //$NON-NLS-1$
        current.subtoolbar = new MonkeyToolbarStruct();

        SortedSet sorted = new TreeSet();
        sorted.addAll(toolbarData);

        Iterator iter = sorted.iterator();
        while (iter.hasNext()) {
            Association element = (Association) iter.next();
            final IPath script_file_to_run = element.path;
            addNestedToolbarAction(current, outerManager, element.key, script_file_to_run, element.imagePath);
        }

        outerManager.update(true);
    }

    private void addNestedToolbarAction(MonkeyToolbarStruct current, ICoolBarManager manager, String toolbar_string,
            final IPath script_file_to_run, String imagePath) {

        if (toolbar_string == null)
            return;

        Matcher match = subtoolbar_pattern.matcher(toolbar_string);
        if (match.find()) {
            String primary_key = match.group(1).trim();
            String secondary_key = match.group(2).trim();
            IToolBarManager tManager = (IToolBarManager) toolbars.get(primary_key);

            if (tManager == null) {
                tManager = new ToolBarManager();
                toolbars.put(primary_key, tManager);
                manager.add(tManager);
            }

            ActionContributionItem item = new ActionContributionItem(
                    toolbarAction(secondary_key, script_file_to_run, imagePath));
            tManager.add(item);
        }
    }

    private Action toolbarAction(String key, final IPath path, String imagePath) {
        final MenuRunMonkeyScript runner = new MenuRunMonkeyScript(path, window);
        Action action = new Action(key) {
            public void run() {
                try {
                    runner.run("main", new Object[] {}); //$NON-NLS-1$
                } catch (RunMonkeyException x) {
                    MessageDialog.openError(window.getShell(), x.exceptionName,
                            x.errorMessage + "\n" + x.fileName + x.optionalLineNumber()); //$NON-NLS-1$
                }
            }
        };
        action.setId(key);
        if (imagePath != null) {
            IPath newPath = path.removeLastSegments(1).append(imagePath);
            ImageDescriptor id = ImageDescriptor.createFromFile(null, newPath.toFile().getAbsolutePath());
            if (id != null) {
                action.setImageDescriptor(id);
            }
        }
        return action;
    }

    private List createToolbarFromMetadatas(Collection metaDatas) {
        List toolbarData = new ArrayList();
        for (Iterator iter = metaDatas.iterator(); iter.hasNext();) {
            ScriptMetadata data = (ScriptMetadata) iter.next();
            if (data.getToolbarName() != null)
                toolbarData.add(new Association(data.getToolbarName(), data.getPath(), data.getAccelerator(),
                        data.getImage()));
        }
        return toolbarData;
    }

    private static int id = 0;

    class Association implements Comparable {
        String accelerator;
        String key;
        IPath path;
        int uniqueId;
        String imagePath;

        Association(String k, IPath p, String accelerator, String imagePath) {
            this.key = k;
            this.path = p;
            this.accelerator = accelerator;
            this.uniqueId = id++;
            this.imagePath = imagePath;
        }

        /**
         * @see java.lang.Comparable#compareTo(java.lang.Object)
         */
        public int compareTo(Object arg0) {
            Association b = (Association) arg0;
            int value = key.compareTo(b.key);
            if (value == 0) {
                if (uniqueId < b.uniqueId)
                    return -1;
                else
                    return 1;
            } else
                return value;
        }
    }

    /**
     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged(IAction action, ISelection selection) {
    }

    /**
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
     */
    public void dispose() {
    }

    /**
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
     */
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

    private IWorkbenchWindow window;
}