org.eclipse.eclipsemonkey.views.scriptsView.ScriptsView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.eclipsemonkey.views.scriptsView.ScriptsView.java

Source

/**
 * Copyright (c) 2005-2006 Aptana, Inc. 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. If redistributing this code, this entire header must remain intact.
 */
package org.eclipse.eclipsemonkey.views.scriptsView;

import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.eclipsemonkey.EclipseMonkeyPlugin;
import org.eclipse.eclipsemonkey.IScriptStoreListener;
import org.eclipse.eclipsemonkey.MenuRunMonkeyScript;
import org.eclipse.eclipsemonkey.RunMonkeyException;
import org.eclipse.eclipsemonkey.StoredScript;
import org.eclipse.eclipsemonkey.utils.UIUtils;
import org.eclipse.jface.action.Action;
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.dialogs.InputDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import com.aptana.ide.core.ui.PreferenceUtils;

/**
 * ScriptsView
 * 
 * @author Paul Colton (Aptana, Inc.)
 */
public class ScriptsView extends ViewPart implements IScriptStoreListener {

    /*
     * Fields
     */
    static final String INFO_MESSAGE = Messages.ScriptsView_INF_MSG_Aptana_scripts_view;

    static final String[] FILTER_EXTENSIONS = new String[] { "*.js", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$

    static final String[] FILTER_NAMES = new String[] {
            MessageFormat.format(Messages.ScriptsView_Javascript_files_0, new Object[] { FILTER_EXTENSIONS[0] }),
            MessageFormat.format(Messages.ScriptsView_All_files_0, new Object[] { FILTER_EXTENSIONS[1] }) };

    private static Image fProfileFileIcon = getImageDescriptor("icons/js_file.gif").createImage(); //$NON-NLS-1$

    private static ImageDescriptor fAddFileIconDescriptor = getImageDescriptor("icons/js_file_new.gif"); //$NON-NLS-1$

    private static ImageDescriptor fRefreshIconDescriptor = getImageDescriptor("icons/refresh.gif"); //$NON-NLS-1$

    private static ImageDescriptor fEditIconDescriptor = getImageDescriptor("icons/pencil.png"); //$NON-NLS-1$

    private static Image fErrIcon = getImageDescriptor("icons/error.gif").createImage(); //$NON-NLS-1$

    private static Image fProfileIcon = getImageDescriptor("icons/profile.gif").createImage(); //$NON-NLS-1$

    private static Image fProfileDynamicIcon = getImageDescriptor("icons/profile-dynamic.gif").createImage(); //$NON-NLS-1$

    private TreeViewer viewer;

    private StackLayout layout;

    private Composite viewParent;

    private Label infoLabel;

    private Font infoLabelFont;

    private static ImageRegistry imageRegistry = new ImageRegistry();

    private org.eclipse.jface.action.Action actionNewActionSet;

    private org.eclipse.jface.action.Action actionAdd;

    private org.eclipse.jface.action.Action actionEdit;

    private org.eclipse.jface.action.Action actionReload;

    private Action actionCollapseAll;

    private Action actionRefresh;

    private org.eclipse.jface.action.Action actionDelete;

    private org.eclipse.jface.action.Action actionDoubleClick;

    private org.eclipse.jface.action.Action actionAddCurrentFile;

    private org.eclipse.jface.action.Action actionExecute;

    private org.eclipse.jface.action.Action actionMakeExecutable;

    private ArrayList listeners = new ArrayList();

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

    private ScriptActionsManager _scriptActionsManager;

    /*
     * Constructor.
     */

    /**
     * ScriptsView
     */
    public ScriptsView() {
        _scriptActionsManager = ScriptActionsManager.getInstance();
    }

    /*
     * Methods
     */

    /**
     * fireActionsViewEvent
     * 
     * @param e
     */
    public void fireActionsViewEvent(ScriptActionsViewEvent e) {
        for (int i = 0; i < listeners.size(); i++) {
            IScriptActionsViewEventListener listener = (IScriptActionsViewEventListener) listeners.get(i);
            listener.onScriptActionsViewEvent(e);
        }
    }

    /**
     * addActionsViewEventListener
     * 
     * @param l
     */
    public void addScriptsViewEventListener(IScriptActionsViewEventListener l) {
        listeners.add(l);
    }

    /**
     * removeActionsViewEventListener
     * 
     * @param l
     */
    public void removeScriptsViewEventListener(IScriptActionsViewEventListener l) {
        listeners.remove(l);
    }

    /**
     * The content provider class is responsible for providing objects to the view. It can wrap existing objects in
     * adapters or simply return objects as-is. These objects may be sensitive to the current input of the view, or
     * ignore it and always show the same content (like Task List, for example).
     */
    class ScriptsViewContentProvider implements ITreeContentProvider {
        /**
         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        /**
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
        }

        /**
         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
         */
        public Object[] getElements(Object parent) {

            updateActionSets();

            // Get actions and action sets
            IScriptAction[] actions = _scriptActionsManager.getAll();

            if (actions != null && actions.length > 0) {
                if (layout != null && infoLabel != null && viewParent != null && layout.topControl == infoLabel) {
                    layout.topControl = viewer.getControl();
                    viewParent.layout();
                }

                return actions;
            }

            if (layout != null && infoLabel != null && viewParent != null) {
                layout.topControl = infoLabel;
                viewParent.layout();
            }

            return new Object[0];
        }

        /**
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
         */
        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof ScriptActionSet) {
                ScriptActionSet actionSet = (ScriptActionSet) parentElement;
                ScriptAction[] actions = actionSet.getScriptActions();

                return actions;
            } else {
                return new Object[0];
            }
        }

        /**
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
         */
        public Object getParent(Object element) {
            if (element instanceof ScriptAction) {
                return ((ScriptAction) element).getParent();
            } else {
                // ActionSets have no parents
                return null;
            }
        }

        /**
         * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
         */
        public boolean hasChildren(Object element) {
            if (element instanceof ScriptActionSet) {
                ScriptActionSet actionSet = (ScriptActionSet) element;

                return actionSet.getScriptActions().length > 0;
            } else {
                return false;
            }
        }
    }

    /**
     * ViewerSorterProvider
     * 
     * @author Ingo Muschenetz
     */
    class ScriptsViewSorterProvider extends ViewerSorter {

        /**
         * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
         */
        public int category(Object element) {
            if (element instanceof ScriptAction) {
                return 0;
            } else {
                return 1;
            }
        }

        /**
         * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object,
         *      java.lang.Object)
         */
        public int compare(Viewer viewer, Object e1, Object e2) {
            int cat1 = category(e1);
            int cat2 = category(e2);

            if (cat1 == cat2) {
                IScriptAction action1 = (IScriptAction) e1;
                IScriptAction action2 = (IScriptAction) e2;

                return action1.getName().compareTo(action2.getName());
            } else {
                return cat1 - cat2;
            }
        }
    }

    /**
     * ViewLabelProvider
     * 
     * @author Ingo Muschenetz
     */
    class ScriptsViewLabelProvider extends LabelProvider {
        /**
         * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
         */
        public String getText(Object element) {
            if (element instanceof IScriptAction) {
                IScriptAction profile = (IScriptAction) element;
                return profile.getName();
            } else {
                return null;
            }
        }

        // public Image getColumnImage(Object obj, int index)
        // {
        // return getImage(obj);
        // }

        /**
         * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
         */
        public Image getImage(Object obj) {
            if (obj instanceof ScriptActionSet) {
                ScriptActionSet set = (ScriptActionSet) obj;

                if (set.isExecutable()) {
                    return fProfileDynamicIcon;
                } else {
                    return fProfileIcon;
                }
            } else if (obj instanceof ScriptAction) {
                ScriptAction action = (ScriptAction) obj;
                IPath scriptPath = action.getStoredScript().metadata.getPath();
                String imagePath = action.getStoredScript().metadata.getImage();
                if (imagePath != null) {
                    return getImageFromMetadata(scriptPath, imagePath);
                } else {
                    return fProfileFileIcon;
                }
            } else {
                return null;
            }
        }
    }

    /**
     * @param scriptPath
     * @param imagePath
     * @return
     */
    private Image getImageFromMetadata(IPath scriptPath, String imagePath) {
        IPath newPath = scriptPath.removeLastSegments(1).append(imagePath);
        String absolutePath = newPath.toFile().getAbsolutePath();

        Image i = imageRegistry.get(absolutePath);
        if (i == null) {
            ImageDescriptor id = ImageDescriptor.createFromFile(null, absolutePath);
            if (id != null) {
                imageRegistry.put(absolutePath, id);
                i = imageRegistry.get(absolutePath);
            }
        }

        return i;
    }

    /**
     * @see org.eclipse.eclipsemonkey.IScriptStoreListener#storeChanged()
     */
    public void storeChanged() {

        Display display = viewer.getControl().getDisplay();
        if (!display.isDisposed()) {
            display.asyncExec(new Runnable() {
                public void run() {
                    if (viewer.getControl().isDisposed())
                        return;
                    viewer.refresh();
                }
            });
        }
    }

    private void updateActionSets() {
        ArrayList foundItems = new ArrayList();

        Map scriptStore = EclipseMonkeyPlugin.getDefault().getScriptStore();
        Object[] scripts = scriptStore.values().toArray();

        for (int i = 0; i < scripts.length; i++) {
            if (scripts[i] instanceof StoredScript) {
                StoredScript s = (StoredScript) scripts[i];

                if (s.metadata == null || s.metadata.getMenuName() == null)
                    continue;

                String menuName = s.metadata.getMenuName().trim();

                foundItems.add(menuName);

                Matcher match = submenu_pattern.matcher(menuName);

                if (match.find()) {
                    String primary_key = match.group(1).trim();
                    String secondary_key = match.group(2).trim();

                    ScriptActionSet as = _scriptActionsManager.createScriptActionSet(primary_key);
                    as.addScriptAction(secondary_key, s);
                } else {
                    _scriptActionsManager.addScriptAction(menuName, s);
                }
            }
        }

        pruneUnusedActions(foundItems);
    }

    private void pruneUnusedActions(ArrayList foundItems) {

        ScriptAction[] actions = _scriptActionsManager.getScriptActions();
        ScriptActionSet[] sets = _scriptActionsManager.getScriptActionSets();

        for (int i = 0; i < actions.length; i++) {
            String name = actions[i].getStoredScript().metadata.getMenuName();
            if (foundItems.contains(name) == false)
                _scriptActionsManager.removeScriptAction(actions[i]);
        }

        for (int i = 0; i < sets.length; i++) {
            actions = sets[i].getScriptActions();
            for (int j = 0; j < actions.length; j++) {
                String name = actions[j].getStoredScript().metadata.getMenuName();
                if (foundItems.contains(name) == false)
                    _scriptActionsManager.removeScriptActionSet(name);
            }
        }
    }

    /**
     * @see org.eclipse.ui.IWorkbenchPart#dispose()
     */
    public void dispose() {
        if (infoLabelFont != null) {
            infoLabelFont.dispose();
        }

        if (fErrIcon != null) {
            fErrIcon.dispose();
        }

        if (imageRegistry != null) {
            imageRegistry.dispose();
        }

        EclipseMonkeyPlugin.getDefault().removeScriptStoreListener(this);
    }

    /**
     * This is a callback that will allow us to create the viewer and initialize it.
     * 
     * @param parent
     */
    public void createPartControl(Composite parent) {

        layout = new StackLayout();
        parent.setLayout(layout);

        viewer = new TreeViewer(new Tree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL));
        viewer.setContentProvider(new ScriptsViewContentProvider());
        viewer.setLabelProvider(new ScriptsViewLabelProvider());
        viewer.setSorter(new ScriptsViewSorterProvider());
        viewer.setInput(getViewSite());
        viewer.expandAll();

        infoLabel = new Label(parent, SWT.CENTER);
        infoLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
        infoLabelFont = new Font(parent.getDisplay(), Messages.ScriptsView_FNT_Aptana_scripts_view, 14, SWT.NONE);
        infoLabel.setFont(infoLabelFont);
        infoLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_GRAY));
        infoLabel.setText(INFO_MESSAGE);
        layout.topControl = infoLabel;
        layout.topControl = viewer.getControl();
        viewParent = parent;
        viewParent.layout();

        final DropTarget labeldt = new DropTarget(infoLabel, DND.DROP_MOVE);

        labeldt.setTransfer(new Transfer[] { FileTransfer.getInstance() });
        labeldt.addDropListener(new DropTargetAdapter() {
            public void drop(DropTargetEvent event) {
                handleDrop(event);
            }
        });

        /*
         * DragSource ds = new DragSource(viewer.getControl(), DND.DROP_COPY | DND.DROP_MOVE); ds.setTransfer(new
         * Transfer[] { FileTransfer.getInstance() }); ds.addDragListener(new DragSourceAdapter() { public void
         * dragSetData(DragSourceEvent event) { IStructuredSelection selection = (IStructuredSelection)
         * viewer.getSelection(); if (FileTransfer.getInstance().isSupportedType(event.dataType)) { Object[] items =
         * selection.toArray(); ArrayList data = new ArrayList(); for (int j = 0; j < items.length; j++) { Object item =
         * items[j]; if (item instanceof ActionSet) { // no op } else if (item instanceof Action) { String path =
         * ((Action)item).getFilePath(); data.add(path); } } if (data.size() > 0) { event.data = data.toArray(new
         * String[0]); } } } });
         */

        DropTarget dt = new DropTarget(viewer.getControl(), DND.DROP_MOVE);
        dt.setTransfer(new Transfer[] { FileTransfer.getInstance() });
        dt.addDropListener(new DropTargetAdapter() {
            public void drop(DropTargetEvent event) {
                handleDrop(event);
            }
        });

        makeActions();
        hookKeyActions(viewer.getControl());
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();

        EclipseMonkeyPlugin.getDefault().addScriptStoreListener(this);

        PreferenceUtils.registerBackgroundColorPreference(viewer.getControl(),
                "com.aptana.ide.core.ui.background.color.scriptsView"); //$NON-NLS-1$
        PreferenceUtils.registerForegroundColorPreference(viewer.getControl(),
                "com.aptana.ide.core.ui.foreground.color.scriptsView"); //$NON-NLS-1$
    }

    /**
     * handleDrop
     * 
     * @param event
     */
    protected void handleDrop(DropTargetEvent event) {
        String[] files = (String[]) event.data;
        ArrayList paths = new ArrayList();

        for (int i = 0; i < files.length; i++) {
            paths.add(new Path(files[i]));
        }

        if (paths.size() > 0) {
            IPath[] ipaths = (IPath[]) paths.toArray(new IPath[0]);
            ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.DROP);

            e.setPaths(ipaths);

            Widget w = event.item;

            if (w != null) {
                TreeItem item = (TreeItem) w;
                Object element = item.getData();
                IScriptAction action = null;

                if (element instanceof ScriptActionSet) {
                    action = (ScriptActionSet) element;
                } else if (element instanceof ScriptAction) {
                    action = ((ScriptAction) element).getParent();
                }

                if (action != null) {
                    e.setName(action.getName());
                }
            }

            fireActionsViewEvent(e);
        }
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                ISelection selection = viewer.getSelection();
                Object firstElement = ((IStructuredSelection) selection).getFirstElement();
                ScriptsView.this.fillContextMenu(manager, firstElement);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillLocalPullDown(IMenuManager manager) {
        // No toolbar items for the moment
        // manager.add(new Separator());
    }

    private void fillContextMenu(IMenuManager manager, Object element) {

        if (element instanceof ScriptActionSet) {
            ScriptActionSet set = (ScriptActionSet) element;

            if (set.isExecutable()) {
                manager.add(actionExecute);
            }

            manager.add(actionMakeExecutable);
        } else {
            manager.add(actionExecute);
        }

        manager.add(new Separator());
        // manager.add(actionAddCurrentFile);

        if (element instanceof ScriptActionSet == false) {
            manager.add(actionEdit);
        }

        // manager.add(actionReload);
        // manager.add(actionDelete);

        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(actionEdit);
        manager.add(actionCollapseAll);
        manager.add(actionRefresh);
    }

    class PushButtonAction extends Action {
        /**
         * PushButtonAction
         * 
         * @param text
         */
        public PushButtonAction(String text) {
            super(text, Action.AS_PUSH_BUTTON);
        }
    }

    private void makeActions() {

        actionRefresh = new PushButtonAction(Messages.ScriptsView_LBL_Refresh) {
            public void run() {
                _scriptActionsManager.clearAll();
                viewer.refresh();
            }
        };
        actionRefresh.setToolTipText(Messages.ScriptsView_TTP_Refresh);
        actionRefresh.setImageDescriptor(fRefreshIconDescriptor);

        actionMakeExecutable = new org.eclipse.jface.action.Action() {
            public void run() {
                ISelection selection = viewer.getSelection();

                if (selection != null && selection instanceof IStructuredSelection) {
                    IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    Object element = structuredSelection.getFirstElement();
                    if (element instanceof ScriptActionSet) {
                        if (((ScriptActionSet) element).isExecutable()) {
                            ((ScriptActionSet) element).setExecutable(false);
                        } else {
                            ((ScriptActionSet) element).setExecutable(true);
                        }

                        viewer.refresh();
                    }
                }

            }
        };
        actionMakeExecutable.setText(Messages.ScriptsView_LBL_Toggle_executable);
        actionMakeExecutable.setToolTipText(Messages.ScriptsView_TTP_Toggle_executable);

        actionExecute = new org.eclipse.jface.action.Action() {
            public void run() {
                ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.EXECUTE);
                ISelection selection = viewer.getSelection();

                if (selection != null && selection instanceof IStructuredSelection) {
                    IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    Object element = structuredSelection.getFirstElement();
                    IScriptAction[] actions;

                    if (element instanceof ScriptAction) {
                        actions = new IScriptAction[] { (IScriptAction) element };
                        executeScript((ScriptAction) element);
                    } else if (element instanceof ScriptActionSet) {
                        actions = ((ScriptActionSet) element).getScriptActions();
                        for (int i = 0; i < actions.length; i++) {
                            executeScript(actions[i]);
                        }
                    } else {
                        actions = new IScriptAction[0];
                    }

                    e.setActions(actions);
                }

                fireActionsViewEvent(e);
            }
        };
        actionExecute.setText(Messages.ScriptsView_LBL_Execute);
        actionExecute.setToolTipText(Messages.ScriptsView_TTP_Execute);

        actionAddCurrentFile = new org.eclipse.jface.action.Action() {
            public void run() {
                ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.ADD_CURRENT_FILE);
                ISelection selection = viewer.getSelection();
                if (selection != null) {
                    Object firstElement = ((IStructuredSelection) selection).getFirstElement();
                    if (firstElement instanceof ScriptActionSet) {
                        e.setName(((ScriptActionSet) firstElement).getName());
                    }
                }

                fireActionsViewEvent(e);
            }
        };
        actionAddCurrentFile.setText(Messages.ScriptsView_LBL_Add_current_file);
        actionAddCurrentFile.setToolTipText(Messages.ScriptsView_TTP_Add_current_file);

        actionNewActionSet = new org.eclipse.jface.action.Action() {
            public void run() {
                InputDialog input = new InputDialog(getSite().getShell(),
                        Messages.ScriptsView_TTL_New_action_set_name, Messages.ScriptsView_MSG_New_action_set_name,
                        org.eclipse.eclipsemonkey.utils.StringUtils.EMPTY, null);

                if (input.open() == Window.OK && input.getValue().length() > 0) {
                    ScriptActionsViewEvent e = new ScriptActionsViewEvent(
                            ScriptActionsViewEventTypes.CREATE_ACTION_SET);
                    e.setName(input.getValue());
                    fireActionsViewEvent(e);
                }
            }
        };
        actionNewActionSet.setText(Messages.ScriptsView_LBL_New_script_set);
        actionNewActionSet.setToolTipText(Messages.ScriptsView_TTP_New_script_set);
        actionNewActionSet.setImageDescriptor(fAddFileIconDescriptor);

        actionEdit = new org.eclipse.jface.action.Action() {
            public void run() {
                ISelection selection = viewer.getSelection();

                if (selection != null) {
                    Object firstElement = ((IStructuredSelection) selection).getFirstElement();
                    if (firstElement instanceof ScriptAction) {
                        ScriptAction a = (ScriptAction) firstElement;
                        editAction(a);
                    }
                }
            }
        };
        actionEdit.setText(Messages.ScriptsView_LBL_Edit_script);
        actionEdit.setToolTipText(Messages.ScriptsView_TTP_Edit_script);
        actionEdit.setImageDescriptor(fEditIconDescriptor);

        actionReload = new org.eclipse.jface.action.Action() {
            public void run() {
                ISelection selection = viewer.getSelection();

                if (selection != null) {
                    Object firstElement = ((IStructuredSelection) selection).getFirstElement();
                    if (firstElement instanceof ScriptAction) {
                        ScriptAction a = (ScriptAction) firstElement;
                        reloadAction(a);
                    }
                }
            }
        };
        actionReload.setText(Messages.ScriptsView_LBL_Reload_script);
        actionReload.setToolTipText(Messages.ScriptsView_TTP_Reload_script);

        actionAdd = new org.eclipse.jface.action.Action() {
            public void run() {
                FileDialog fileDialog = new FileDialog(viewer.getControl().getShell(), SWT.MULTI);
                fileDialog.setFilterExtensions(FILTER_EXTENSIONS);
                fileDialog.setFilterNames(FILTER_NAMES);
                String text = fileDialog.open();
                if (text != null) {
                    IPath basePath = new Path(fileDialog.getFilterPath());
                    String[] fileNames = fileDialog.getFileNames();
                    IPath[] paths = new IPath[fileNames.length];

                    for (int i = 0; i < paths.length; i++) {
                        paths[i] = basePath.append(fileNames[i]);
                    }

                    ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.ADD);
                    e.setPaths(paths);
                    fireActionsViewEvent(e);
                }
            }
        };

        actionAdd.setText(Messages.ScriptsView_LBL_Add_file);
        actionAdd.setToolTipText(Messages.ScriptsView_TTP_Add_file);
        actionAdd.setImageDescriptor(fAddFileIconDescriptor);

        actionDelete = new org.eclipse.jface.action.Action() {
            public void run() {
                removeFiles(viewer.getSelection());
            }
        };
        actionDelete.setText(Messages.ScriptsView_LBL_Remove_file);
        actionDelete.setToolTipText(Messages.ScriptsView_TTP_Remove_file);
        actionDelete.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));

        actionDoubleClick = new org.eclipse.jface.action.Action() {
            public void run() {
                ISelection selection = viewer.getSelection();
                Object firstElement = ((IStructuredSelection) selection).getFirstElement();

                if (firstElement instanceof ScriptActionSet) {
                    toggleElementState(firstElement);
                } else if (firstElement instanceof IScriptAction) {
                    ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.EXECUTE);
                    IScriptAction[] actions = new IScriptAction[] { (IScriptAction) firstElement };

                    e.setActions(actions);

                    fireActionsViewEvent(e);

                    executeScript((ScriptAction) firstElement);
                }
            }
        };

        this.actionCollapseAll = new Action(Messages.ScriptsView_LBL_Collapse_all) {

            public void run() {
                if (viewer != null) {
                    viewer.collapseAll();
                }
            }

        };
        this.actionCollapseAll.setToolTipText(Messages.ScriptsView_TTP_Collapse_all);
        this.actionCollapseAll.setImageDescriptor(getImageDescriptor("icons/collapseall.gif")); //$NON-NLS-1$
    }

    /**
     * executeScript
     * 
     * @param script
     */
    private void executeScript(IScriptAction script) {
        MenuRunMonkeyScript run = new MenuRunMonkeyScript(script.getStoredScript().scriptPath);
        try {
            run.run("main", new Object[] {}); //$NON-NLS-1$
        } catch (RunMonkeyException e1) {
            e1.printStackTrace();
        }
    }

    /**
     * toggleElementState
     * 
     * @param element
     */
    private void toggleElementState(Object element) {
        boolean state = viewer.getExpandedState(element);

        if (state) {
            viewer.setExpandedState(element, false);
        } else {
            viewer.setExpandedState(element, true);
        }
    }

    /**
     * Removes one or more files
     * 
     * @param selection
     *            The currently selected files
     */
    private void removeFiles(ISelection selection) {
        if (!(selection instanceof StructuredSelection)) {
            return;
        }

        Object o = ((StructuredSelection) selection).getFirstElement();

        if (o == null) {
            return;
        }

        if (o instanceof ScriptActionSet) {
            ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.DELETE_ACTION_SET);
            e.setName(((ScriptActionSet) o).getName());
            fireActionsViewEvent(e);
        } else {

            ArrayList actionsList = new ArrayList();

            for (Iterator iter = ((StructuredSelection) selection).iterator(); iter.hasNext();) {
                actionsList.add(iter.next());
            }

            ScriptAction[] actions = (ScriptAction[]) actionsList.toArray(new ScriptAction[0]);

            if (actions.length > 0) {
                ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.DELETE);
                e.setActions(actions);
                fireActionsViewEvent(e);
            }
        }
    }

    // private void showMessage(String message) {
    // MessageDialog.openInformation(
    // viewer.getControl().getShell(),
    // "File Explorer",
    // message);
    // }

    /**
     * hookDoubleClickAction
     */
    private void hookDoubleClickAction() {
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                actionDoubleClick.run();
            }
        });
    }

    /**
     * hookKeyActions
     * 
     * @param control
     */
    private void hookKeyActions(Control control) {
        control.addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                if (e.character == SWT.DEL) {
                    removeFiles(viewer.getSelection());
                }
            }

            public void keyReleased(KeyEvent e) {
            }
        });
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        viewer.getControl().setFocus();
    }

    /**
     * Retrieves the image descriptor associated with resource from the image descriptor registry. If the image
     * descriptor cannot be retrieved, attempt to find and load the image descriptor at the location specified in
     * resource.
     * 
     * @param imageFilePath
     *            the image descriptor to retrieve
     * @return The image descriptor assocated with resource or the default "missing" image descriptor if one could not
     *         be found
     */
    private static ImageDescriptor getImageDescriptor(String imageFilePath) {

        ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.eclipsemonkey.ui", //$NON-NLS-1$
                imageFilePath);

        if (imageDescriptor == null) {
            imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
        }

        return imageDescriptor;
    }

    /**
     * expandAll
     */
    public void expandAll() {
        this.viewer.expandAll();
    }

    /**
     * expandActionSet
     * 
     * @param setName
     */
    public void expandScriptActionSet(String setName) {
        TreeItem[] treeItems = viewer.getTree().getItems();

        for (int i = 0; i < treeItems.length; i++) {
            Object o = treeItems[i].getData();

            if (o instanceof ScriptActionSet) {
                ScriptActionSet p = (ScriptActionSet) o;
                String name = p.getName();
                if (name.equals(setName)) {
                    viewer.setExpandedState(o, true);
                    viewer.getTree().showItem(treeItems[i]);
                    return;
                }
            }
        }

    }

    /**
     * selectAndReveal
     * 
     * @param actionPath
     */
    public void selectAndReveal(String actionPath) {
        IScriptAction a = findAction(actionPath);

        if (a != null && a instanceof ScriptAction) {
            selectAndReveal((ScriptAction) a);
        }
    }

    /**
     * selectAndReveal
     * 
     * @param action
     */
    public void selectAndReveal(ScriptAction action) {
        TreeItem[] treeItems = viewer.getTree().getItems();

        forcePopulateTree();

        for (int i = 0; i < treeItems.length; i++) {
            Object o = treeItems[i].getData();

            if (o instanceof ScriptActionSet) {
                TreeItem[] children = treeItems[i].getItems();

                for (int j = 0; j < children.length; j++) {
                    IScriptAction a = (IScriptAction) children[j].getData();

                    if (a == action) {
                        viewer.getTree().showItem(children[j]);
                        viewer.getTree().setSelection(new TreeItem[] { children[j] });
                        return;
                    }

                }
            } else if (o instanceof ScriptAction) {
                ScriptAction a = (ScriptAction) o;
                if (a == action) {
                    viewer.getTree().showItem(treeItems[i]);
                    viewer.getTree().setSelection(new TreeItem[] { treeItems[i] });
                    return;
                }
            }
        }
    }

    /**
     * forcePopulateTree
     */
    public void forcePopulateTree() {
        viewer.getTree().setVisible(false);
        Object[] expandedElement = viewer.getExpandedElements();
        viewer.expandAll();
        viewer.setExpandedElements(expandedElement);
        viewer.getTree().setVisible(true);
    }

    /**
     * Find the action set for the given name
     * 
     * @param name
     *            The action set name to find
     * @return Returns the matching action set or null;
     */
    public ScriptActionSet findActionSet(String name) {
        ScriptActionSet result = null;
        TreeItem[] treeItems = viewer.getTree().getItems();

        for (int i = 0; i < treeItems.length; i++) {
            Object itemData = treeItems[i].getData();

            if (itemData instanceof ScriptActionSet) {
                ScriptActionSet actionSet = (ScriptActionSet) itemData;

                if (actionSet.getName().equals(name)) {
                    result = actionSet;
                    break;
                }
            }
        }

        return result;
    }

    /**
     * findAction
     * 
     * @param path
     * @return IAction
     */
    public ScriptAction findAction(String path) {
        ScriptAction result = null;

        if (path != null && path.length() > 0 && path.charAt(0) == '/') {
            int slashIndex = path.indexOf('/', 1);

            if (slashIndex != -1) {
                String actionSetName = path.substring(1, slashIndex);
                String actionName = path.substring(slashIndex + 1);

                ScriptActionSet actionSet = findActionSet(actionSetName);

                if (actionSet != null) {
                    ScriptAction[] actions = actionSet.getScriptActions();

                    for (int i = 0; i < actions.length; i++) {
                        ScriptAction action = actions[i];

                        if (action.getName().equals(actionName)) {
                            result = action;
                            break;
                        }
                    }
                }
            }
        }

        return result;
    }

    /**
     * fireAction
     * 
     * @param actionName
     */
    public void fireAction(String actionName) {
        IScriptAction action = findAction(actionName);

        if (action != null) {
            ScriptActionsViewEvent actionEvent = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.EXECUTE);
            IScriptAction[] actions = new IScriptAction[] { action };
            actionEvent.setActions(actions);
            fireActionsViewEvent(actionEvent);
        }
    }

    /**
     * refresh
     */
    public void refresh() {
        this.viewer.refresh();
    }

    /**
     * editAction
     * 
     * @param path
     */
    public void editAction(String path) {
        editAction(findAction(path));
    }

    /**
     * editAction
     * 
     * @param a
     */
    private void editAction(final IScriptAction a) {
        if (a == null) {
            return;
        }

        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        IEditorDescriptor editorDesc = null;

        File f = a.getStoredScript().metadata.getPath().toFile();

        try {
            editorDesc = IDE.getEditorDescriptor(f.getName());

            if (editorDesc.isOpenExternal() == true) {
                editorDesc = IDE.getEditorDescriptor("foo.txt"); //$NON-NLS-1$
            }

        } catch (PartInitException e) {
            System.err.println("Error opening file in editor: " + e); //$NON-NLS-1$
        }

        try {
            // IEditorPart editorPart =
            IDE.openEditor(page, UIUtils.createJavaFileEditorInput(f), editorDesc.getId());

            // if (editorPart instanceof IUnifiedEditor)
            // {
            // IUnifiedEditor editor = (IUnifiedEditor) editorPart;
            //
            // editor.addSaveListener(new ISaveEvent()
            // {
            // public void onSave(IEditorPart part)
            // {
            // reloadAction(a);
            // }
            // });
            // }
        } catch (PartInitException e) {
            System.err.println("Error opening editor: " + e); //$NON-NLS-1$
        }
    }

    /**
     * reloadAction
     * 
     * @param a
     */
    private void reloadAction(final IScriptAction a) {
        ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.RELOAD);
        e.setActions(new IScriptAction[] { a });
        fireActionsViewEvent(e);
    }
}