com.centurylink.mdw.plugin.designer.views.ProcessExplorerActionGroup.java Source code

Java tutorial

Introduction

Here is the source code for com.centurylink.mdw.plugin.designer.views.ProcessExplorerActionGroup.java

Source

/*
 * Copyright (C) 2017 CenturyLink, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.centurylink.mdw.plugin.designer.views;

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

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.ui.IContextMenuConstants;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
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.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.dialogs.ListSelectionDialog;

import com.centurylink.mdw.common.constant.WorkAttributeConstant;
import com.centurylink.mdw.designer.testing.TestCase;
import com.centurylink.mdw.designer.testing.TestFile;
import com.centurylink.mdw.designer.testing.TestFileLine;
import com.centurylink.mdw.model.value.attribute.RuleSetVO;
import com.centurylink.mdw.model.value.process.ProcessInstanceVO;
import com.centurylink.mdw.model.value.process.ProcessVO;
import com.centurylink.mdw.model.value.user.UserRoleVO;
import com.centurylink.mdw.plugin.MdwPlugin;
import com.centurylink.mdw.plugin.PluginMessages;
import com.centurylink.mdw.plugin.actions.MdwMenuManager;
import com.centurylink.mdw.plugin.actions.WebLaunchActions;
import com.centurylink.mdw.plugin.actions.WebLaunchActions.WebApp;
import com.centurylink.mdw.plugin.actions.WebLaunchActions.WebLaunchAction;
import com.centurylink.mdw.plugin.actions.WorkflowElementActionHandler;
import com.centurylink.mdw.plugin.designer.DesignerProxy;
import com.centurylink.mdw.plugin.designer.model.Activity;
import com.centurylink.mdw.plugin.designer.model.Activity.AdapterActivity;
import com.centurylink.mdw.plugin.designer.model.Activity.EvaluatorActivity;
import com.centurylink.mdw.plugin.designer.model.Activity.StartActivity;
import com.centurylink.mdw.plugin.designer.model.AutomatedTestCase;
import com.centurylink.mdw.plugin.designer.model.AutomatedTestResults;
import com.centurylink.mdw.plugin.designer.model.AutomatedTestSuite;
import com.centurylink.mdw.plugin.designer.model.CamelRoute;
import com.centurylink.mdw.plugin.designer.model.ElementChangeEvent.ChangeType;
import com.centurylink.mdw.plugin.designer.model.ExternalEvent;
import com.centurylink.mdw.plugin.designer.model.File;
import com.centurylink.mdw.plugin.designer.model.Folder;
import com.centurylink.mdw.plugin.designer.model.JarFile;
import com.centurylink.mdw.plugin.designer.model.JavaSource;
import com.centurylink.mdw.plugin.designer.model.Json;
import com.centurylink.mdw.plugin.designer.model.LegacyExpectedResults;
import com.centurylink.mdw.plugin.designer.model.Page;
import com.centurylink.mdw.plugin.designer.model.Report;
import com.centurylink.mdw.plugin.designer.model.Rule;
import com.centurylink.mdw.plugin.designer.model.Script;
import com.centurylink.mdw.plugin.designer.model.SpringConfig;
import com.centurylink.mdw.plugin.designer.model.TaskTemplate;
import com.centurylink.mdw.plugin.designer.model.Template;
import com.centurylink.mdw.plugin.designer.model.TextResource;
import com.centurylink.mdw.plugin.designer.model.WebResource;
import com.centurylink.mdw.plugin.designer.model.WordDoc;
import com.centurylink.mdw.plugin.designer.model.WorkflowAsset;
import com.centurylink.mdw.plugin.designer.model.WorkflowElement;
import com.centurylink.mdw.plugin.designer.model.WorkflowPackage;
import com.centurylink.mdw.plugin.designer.model.WorkflowProcess;
import com.centurylink.mdw.plugin.designer.model.XmlDoc;
import com.centurylink.mdw.plugin.designer.properties.PageletTab;
import com.centurylink.mdw.plugin.preferences.model.MdwSettings;
import com.centurylink.mdw.plugin.preferences.model.PreferenceConstants;
import com.centurylink.mdw.plugin.project.WorkflowProjectManager;
import com.centurylink.mdw.plugin.project.model.WorkflowProject;

public class ProcessExplorerActionGroup extends ActionGroup {
    private ProcessExplorerView view;
    private WorkflowElementActionHandler actionHandler;

    WorkflowElementActionHandler getActionHandler() {
        return actionHandler;
    }

    private ActionGroup newActionGroup;
    private ActionGroup importActionGroup;
    private ActionGroup exportActionGroup;
    private ActionGroup runActionGroup;
    private ActionGroup webActionGroup;
    private ActionGroup formatActionGroup;
    private ActionGroup serverActionGroup;
    private ActionGroup swingActionGroup;

    private MenuManager newMenu;
    private MenuManager importMenu;
    private MenuManager exportMenu;
    private MenuManager runMenu;
    private MenuManager webMenu;
    private MenuManager formatMenu;
    private MenuManager serverMenu;
    private MenuManager swingMenu;

    private IAction openAction;
    private IAction propertiesAction;
    private IAction incrementVersionAction;
    private IAction setVersionAction;
    private IAction tagVersionAction;
    private IAction copyAction;
    private IAction pasteAction;
    private IAction deleteAction;
    private IAction renameAction;
    private IAction importPackageAction;
    private IAction importVcsAction;
    private IAction importProjectAction;
    private IAction importProcessAction;
    private IAction importWorkflowAssetAction;
    private IAction importTaskTemplateAction;
    private IAction exportPackageAction;
    private IAction exportProjectAction;
    private IAction exportProcessAction;
    private IAction exportTaskTemplateAction;
    private IAction exportWorkflowAssetAction;
    private IAction exportAsAction;
    private IAction runAction;
    private IAction runOnServerAction;
    private IAction runTestsAction;
    private IAction pageRunAction;
    private IAction debugAction;
    private IAction instancesAction;
    private IAction collapseAllAction;
    private IAction refreshAction;
    private IAction refreshToolbarAction;
    private IAction refreshCachesAction;
    private IAction updateAction;
    private IAction stubServerAction;
    private IAction logWatcherAction;
    private IAction newCloudProjectAction;
    private IAction newRemoteProjectAction;
    private IAction newPackageAction;
    private IAction newPackageToolbarAction;
    private IAction newProcessAction;
    private IAction newGeneralActivityAction;
    private IAction newStartActivityAction;
    private IAction newAdapterActivityAction;
    private IAction newEvaluatorActivityAction;
    private IAction newEventHandlerAction;
    private IAction newCamelProcessHandlerAction;
    private IAction newCamelNotifyHandlerAction;
    private IAction newPageAction;
    private IAction newReportAction;
    private IAction newRuleAction;
    private IAction newWordDocAction;
    private IAction newCamelRouteAction;
    private IAction newScriptAction;
    private IAction newTextResourceAction;
    private IAction newJavaSourceAction;
    private IAction newTemplateAction;
    private IAction newWebResourceAction;
    private IAction newSpringConfigAction;
    private IAction newXmlDocAction;
    private IAction newJarFileAction;
    private IAction newTestCaseAction;
    private IAction newYamlAction;
    private IAction newJsonAction;
    private IAction newTaskTemplateAction;
    private IAction searchAction;
    private IAction findCallersAction;
    private IAction showProcessHierarchyAction;
    private IAction compareResultsAction;
    private IAction openInstanceAction;
    private IAction mdwHubAction;
    private IAction taskManagerAction;
    private IAction webToolsAction;
    private IAction sortToolbarAction;
    private IAction filterToolbarAction;
    private IAction eventManagerAction;
    private IAction threadPoolManagerAction;
    private IAction visualVmAction;
    private IAction jconsoleAction;
    private IAction formatFunctionTestResultsAction;
    private IAction formatLoadTestResultsAction;
    private IAction unlockAction;

    private IAction myTasksAction; // TODO maybe submenu

    public ProcessExplorerActionGroup(ProcessExplorerView view) {
        this.view = view;
        this.actionHandler = new WorkflowElementActionHandler();

        newActionGroup = createNewActionGroup();
        importActionGroup = createImportActionGroup();
        exportActionGroup = createExportActionGroup();
        runActionGroup = createRunActionGroup();
        webActionGroup = createWebActionGroup();
        formatActionGroup = createFormatActionGroup();
        serverActionGroup = createServerActionGroup();
        swingActionGroup = createSwingActionGroup();

        openAction = createOpenAction();
        propertiesAction = createPropertiesAction();
        incrementVersionAction = createIncrementVersionAction();
        setVersionAction = createSetVersionAction();
        tagVersionAction = createTagVersionAction();
        copyAction = createCopyAction();
        pasteAction = createPasteAction();
        deleteAction = createDeleteAction();
        renameAction = createRenameAction();
        importPackageAction = createImportPackageAction();
        importVcsAction = createImportVcsAction();
        importProjectAction = createImportProjectAction();
        importProcessAction = createImportProcessAction();
        importTaskTemplateAction = createImportTaskTemplateAction();
        importWorkflowAssetAction = createImportWorkflowAssetAction();
        exportPackageAction = createExportPackageAction();
        exportProjectAction = createExportProjectAction();
        exportProcessAction = createExportProcessAction();
        exportTaskTemplateAction = createExportTaskTemplateAction();
        exportWorkflowAssetAction = createExportWorkflowAssetAction();
        exportAsAction = createExportAsAction();
        runAction = createRunAction();
        runOnServerAction = createRunOnServerAction();
        runTestsAction = createRunTestsAction();
        pageRunAction = createRunFromStartPageAction();
        debugAction = createDebugAction();
        instancesAction = createInstancesAction();
        collapseAllAction = createCollapseAllAction();
        refreshAction = createRefreshAction(false);
        refreshToolbarAction = createRefreshAction(true);
        refreshCachesAction = createRefreshCachesAction();
        updateAction = createUpdateAction();
        stubServerAction = createStubServerAction();
        logWatcherAction = createLogWatcherAction();
        newCloudProjectAction = createNewAction(WorkflowElement.class, "Local Project", "cloud_project.gif");
        newRemoteProjectAction = createNewAction(WorkflowProject.class,
                MdwPlugin.isRcp() ? "Workflow Project" : "Remote Project", "remote_project.gif");
        newPackageAction = createNewAction(WorkflowPackage.class, "MDW Package", "package.gif");
        newPackageToolbarAction = createNewAction(WorkflowPackage.class, "New Package", "new_package.gif");
        newProcessAction = createNewAction(WorkflowProcess.class, "MDW Process", "process.gif");
        newGeneralActivityAction = createNewAction(Activity.class, "General Activity", "genact_wiz.gif");
        newStartActivityAction = createNewAction(StartActivity.class, "Start Activity", "startact_wiz.gif");
        newAdapterActivityAction = createNewAction(AdapterActivity.class, "Adapter Activity", "adaptact_wiz.gif");
        newEvaluatorActivityAction = createNewAction(EvaluatorActivity.class, "Evaluator Activity",
                "evalact_wiz.gif");
        newEventHandlerAction = createNewAction(ExternalEvent.class, "External Event Handler", "extevent_wiz.gif");
        newCamelProcessHandlerAction = createNewAction(ExternalEvent.CamelProcessLaunch.class,
                "Camel Process Launch Handler", "camel.gif");
        newCamelNotifyHandlerAction = createNewAction(ExternalEvent.CamelEventNotify.class,
                "Camel Event Notify Handler", "camel.gif");
        newPageAction = createNewAction(Page.class, "Page", "page.gif");
        newReportAction = createNewAction(Report.class, "Report", "report.gif");
        newRuleAction = createNewAction(Rule.class, "Rule", "drools.gif");
        newWordDocAction = createNewAction(WordDoc.class, "Word Document", "word.gif");
        newScriptAction = createNewAction(Script.class, "Script", "script.gif");
        newCamelRouteAction = createNewAction(CamelRoute.class, "Camel Route", "camel.gif");
        newTextResourceAction = createNewAction(TextResource.class, "Text Resource", "doc.gif");
        newXmlDocAction = createNewAction(XmlDoc.class, "XML Document", "xml.gif");
        newJavaSourceAction = createNewAction(JavaSource.class, "Java Source", "java.gif");
        newTemplateAction = createNewAction(Template.class, "Template", "template.gif");
        newWebResourceAction = createNewAction(WebResource.class, "Web Resource", "webtools.gif");
        newSpringConfigAction = createNewAction(SpringConfig.class, "Spring Config", "spring.gif");
        newJarFileAction = createNewAction(JarFile.class, "Jar File", "jar.gif");
        newTestCaseAction = createNewAction(AutomatedTestCase.class, "Test Case", "test.gif");
        newYamlAction = createNewAction(AutomatedTestResults.class, "YAML", "yaml.gif");
        newJsonAction = createNewAction(Json.class, "JSON", "javascript.gif");
        newTaskTemplateAction = createNewAction(TaskTemplate.class, "Task Template", "task.gif");
        searchAction = createSearchAction();
        findCallersAction = createFindCallersAction();
        showProcessHierarchyAction = createShowProcessHierarchyAction();
        compareResultsAction = createCompareResultsAction();
        openInstanceAction = createOpenInstanceAction();
        formatFunctionTestResultsAction = createFormatFunctionTestResultsAction();
        formatLoadTestResultsAction = createFormatLoadTestResultsAction();
        mdwHubAction = createMdwHubAction();
        taskManagerAction = createTaskManagerAction();
        webToolsAction = createWebToolsAction();
        sortToolbarAction = createSortToolbarAction();
        filterToolbarAction = createFilterToolbarAction();
        unlockAction = createUnlockAction();

        eventManagerAction = createSwingLaunchAction("Event Manager", null, "event_mgr", "EventManagerHandler");
        threadPoolManagerAction = createSwingLaunchAction("Thread Pool Manager", null, "thread_pool_mgr",
                "ThreadPoolManagerHandler");
        visualVmAction = createSwingLaunchAction("Java VisualVM", "visualvm.gif", null, null);
        jconsoleAction = createSwingLaunchAction("JConsole", "jmxconsole.gif", null, null);

        myTasksAction = createMyTasksAction();
    }

    @Override
    public void setContext(ActionContext context) {
        super.setContext(context);
        newActionGroup.setContext(context);
    }

    @Override
    public void fillContextMenu(IMenuManager menu) {
        menu.add(new Separator(IContextMenuConstants.GROUP_NEW));
        menu.appendToGroup(IContextMenuConstants.GROUP_NEW, newMenu);
        newActionGroup.fillContextMenu(menu);

        final IStructuredSelection selection = getSelection();
        List<?> elements = selection.toList();
        if (elements.size() > 0) {
            // open
            menu.add(new Separator());
            if (openApplies(selection))
                menu.add(openAction);

            // refresh
            if (refreshApplies(selection))
                menu.add(refreshAction);

            // update
            if (updateApplies(selection))
                menu.add(updateAction);

            // properties
            if (showPropertiesApplies(selection))
                menu.add(propertiesAction);

            // inc version
            if (incrementVersionApplies(selection))
                menu.add(incrementVersionAction);

            // inc version
            if (setVersionApplies(selection))
                menu.add(setVersionAction);

            // tag version
            if (tagVersionApplies(selection))
                menu.add(tagVersionAction);

            menu.add(new Separator());

            // copy
            if (copyApplies(selection))
                menu.add(copyAction);

            // paste
            if (pasteApplies(selection)) {
                pasteAction.setEnabled(isSomethingToPaste(selection));
                menu.add(pasteAction);
            }

            // delete
            if (deleteApplies(selection))
                menu.add(deleteAction);

            // rename
            if (renameApplies(selection))
                menu.add(renameAction);
        }

        // determine which menu items should appear according to selection
        menu.add(new Separator());
        menu.add(new Separator("ImportExport"));
        menu.appendToGroup("ImportExport", importMenu);
        importActionGroup.fillContextMenu(menu);

        if (elements.size() > 0) {
            if (exportApplies(selection)) {
                menu.appendToGroup("ImportExport", exportMenu);
                exportActionGroup.fillContextMenu(menu);
            }

            if (exportAsApplies(selection))
                menu.add(exportAsAction);

            menu.add(new Separator("MdwActions"));

            if (runMenuApplies(selection)) {
                menu.appendToGroup("MdwActions", runMenu);
                runActionGroup.fillContextMenu(menu);
            }

            // run
            if (runApplies(selection))
                menu.add(runAction);

            if (runFromPageApplies(selection))
                menu.add(pageRunAction);

            if (debugApplies(selection))
                menu.add(debugAction);

            // instances
            if (showInstancesApplies(selection))
                menu.add(instancesAction);

            // web launch
            if (webLaunchApplies(selection)) {
                menu.appendToGroup("MdwActions", webMenu);
                webActionGroup.fillContextMenu(menu);
            }

            // format
            if (formatMenuApplies(selection)) {
                menu.appendToGroup("MdwActions", formatMenu);
                formatActionGroup.fillContextMenu(menu);
            }

            // server
            if (serverActionApplies(selection)) {
                menu.appendToGroup("MdwActions", serverMenu);
                serverActionGroup.fillContextMenu(menu);
            }

            // swing tools
            if (swingLaunchApplies(selection)) {
                menu.appendToGroup("MdwActions", swingMenu);
                swingActionGroup.fillContextMenu(menu);
            }

            // search
            if (searchApplies(selection))
                menu.add(searchAction);

            // find callers
            if (findCallersApplies(selection))
                menu.add(findCallersAction);

            // show process hierarchy
            if (showProcessHierarchyApplies(selection))
                menu.add(showProcessHierarchyAction);

            // compare results
            if (compareResultsApplies(selection))
                menu.add(compareResultsAction);

            // open instance
            if (openInstanceApplies(selection))
                menu.add(openInstanceAction);

            if (myTasksApplies(selection))
                menu.add(myTasksAction);

            // unlock project
            if (unlockApplies(selection))
                menu.add(unlockAction);
        }
    }

    @Override
    public void fillActionBars(IActionBars actionBars) {
        super.fillActionBars(actionBars);
        IToolBarManager toolbar = actionBars.getToolBarManager();
        toolbar.add(new GroupMarker("mdw.process.explorer.group"));
        toolbar.add(collapseAllAction);
        toolbar.add(sortToolbarAction);
        toolbar.add(filterToolbarAction);
        toolbar.add(refreshToolbarAction);
        toolbar.add(new Separator());
        toolbar.add(newPackageToolbarAction);
    }

    private ActionGroup createNewActionGroup() {
        newMenu = new MenuManager("New", null, MdwMenuManager.MDW_MENU_PREFIX + "menu.new");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                newMenu.removeAll();
                IStructuredSelection selection = getSelection();

                if (!newMenuApplies(selection))
                    return;

                if (!MdwPlugin.isRcp())
                    newMenu.add(newCloudProjectAction);

                if (createApplies(WorkflowProject.class, selection))
                    newMenu.add(newRemoteProjectAction);

                newMenu.add(new Separator());

                if (createApplies(WorkflowPackage.class, selection))
                    newMenu.add(newPackageAction);

                if (createApplies(WorkflowProcess.class, selection))
                    newMenu.add(newProcessAction);

                newMenu.add(new Separator());

                if (createApplies(Activity.class, selection)) {
                    MenuManager activityMenu = new MenuManager("Activity", null,
                            MdwMenuManager.MDW_MENU_PREFIX + "menu.new.activity");
                    activityMenu.add(newGeneralActivityAction);
                    activityMenu.add(newStartActivityAction);
                    activityMenu.add(newAdapterActivityAction);
                    activityMenu.add(newEvaluatorActivityAction);
                    newMenu.add(activityMenu);
                }

                if (createApplies(ExternalEvent.class, selection)) {
                    MenuManager eventHandlerMenu = new MenuManager("Event Handler", null,
                            MdwMenuManager.MDW_MENU_PREFIX + "menu.new.event.handler");
                    eventHandlerMenu.add(newEventHandlerAction);
                    eventHandlerMenu.add(newCamelProcessHandlerAction);
                    eventHandlerMenu.add(newCamelNotifyHandlerAction);
                    newMenu.add(eventHandlerMenu);
                }

                newMenu.add(new Separator());

                if (createApplies(WorkflowAsset.class, selection)) {
                    newMenu.add(new Separator());
                    newMenu.add(newCamelRouteAction);
                    newMenu.add(newJarFileAction);
                    newMenu.add(newJavaSourceAction);
                    newMenu.add(newJsonAction);
                    newMenu.add(newPageAction);
                    newMenu.add(newReportAction);
                    newMenu.add(newRuleAction);
                    newMenu.add(newScriptAction);
                    newMenu.add(newSpringConfigAction);
                    if (selection.getFirstElement() instanceof WorkflowElement
                            && ((WorkflowElement) selection.getFirstElement()).getProject().isFilePersist())
                        newMenu.add(newTaskTemplateAction);
                    newMenu.add(newTemplateAction);
                    newMenu.add(newTestCaseAction);
                    newMenu.add(newTextResourceAction);
                    newMenu.add(newWebResourceAction);
                    newMenu.add(newWordDocAction);
                    newMenu.add(newXmlDocAction);
                    newMenu.add(newYamlAction);
                    newMenu.add(new Separator());
                }

                newMenu.add(new Separator("Other"));
                IWorkbenchAction otherAction = ActionFactory.NEW.create(getViewSite().getWorkbenchWindow());
                otherAction.setId(MdwMenuManager.MDW_MENU_PREFIX + "new.other");
                otherAction.setText("Other...");
                newMenu.add(otherAction);
            }
        };
    }

    private ActionGroup createImportActionGroup() {
        importMenu = new MenuManager("Import", MdwPlugin.getImageDescriptor("icons/import.gif"),
                MdwMenuManager.MDW_MENU_PREFIX + "menu.import");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                importMenu.removeAll();
                IStructuredSelection selection = getSelection();

                if (!importMenuApplies(selection))
                    return;

                if (importProjectApplies(selection))
                    importMenu.add(importProjectAction);

                if (importPackageApplies(selection))
                    importMenu.add(importPackageAction);

                if (importVcsApplies(selection))
                    importMenu.add(importVcsAction);

                if (importProcessApplies(selection)) {
                    if (selection.getFirstElement() instanceof WorkflowProcess) {
                        importProcessAction.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.new.process.version");
                        importProcessAction.setText("New Process Version...");
                    } else {
                        importProcessAction.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.process");
                        importProcessAction.setText("Process...");
                    }
                    importMenu.add(importProcessAction);
                }

                if (importWorkflowAssetApplies(selection)) {
                    if (selection.getFirstElement() instanceof WorkflowAsset) {
                        WorkflowAsset asset = (WorkflowAsset) selection.getFirstElement();
                        // menu item text and icon are dynamic
                        importWorkflowAssetAction
                                .setId(MdwMenuManager.MDW_MENU_PREFIX + "import.new.asset.version");
                        importWorkflowAssetAction.setText("New " + asset.getTitle() + " Version...");
                        importWorkflowAssetAction
                                .setImageDescriptor(MdwPlugin.getImageDescriptor("icons/" + asset.getIcon()));
                    } else {
                        importWorkflowAssetAction.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.asset");
                        importWorkflowAssetAction.setText("Asset...");
                        importWorkflowAssetAction.setImageDescriptor(MdwPlugin.getImageDescriptor("icons/doc.gif"));
                    }
                    importMenu.add(importWorkflowAssetAction);
                }

                if (importAttributesApplies(selection)) {
                    List<IAction> importAttrsActions = getImportAttributeActions(selection);
                    if (!importAttrsActions.isEmpty()) {
                        MenuManager attributesMenu = new MenuManager("Attributes",
                                MdwPlugin.getImageDescriptor("icons/attribute.gif"),
                                MdwMenuManager.MDW_MENU_PREFIX + "menu.import.attributes");
                        attributesMenu.removeAll();
                        for (IAction action : importAttrsActions)
                            attributesMenu.add(action);
                        importMenu.add(attributesMenu);
                    }
                }

                if (importTaskTemplateApplies(selection))
                    importMenu.add(importTaskTemplateAction);

                importMenu.add(new Separator("Other"));
                IWorkbenchAction otherAction = ActionFactory.IMPORT.create(getViewSite().getWorkbenchWindow());
                otherAction.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.other");
                otherAction.setText("Other...");
                importMenu.add(otherAction);
            }
        };
    }

    private ActionGroup createExportActionGroup() {
        exportMenu = new MenuManager("Export", MdwPlugin.getImageDescriptor("icons/export.gif"),
                MdwMenuManager.MDW_MENU_PREFIX + "menu.export");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                exportMenu.removeAll();
                IStructuredSelection selection = getSelection();

                if (exportProjectApplies(selection))
                    exportMenu.add(exportProjectAction);

                if (exportPackageApplies(selection))
                    exportMenu.add(exportPackageAction);

                if (exportProcessApplies(selection))
                    exportMenu.add(exportProcessAction);

                if (exportWorkflowAssetApplies(selection)) {
                    WorkflowAsset asset = (WorkflowAsset) selection.getFirstElement();
                    // menu item text and icon are dynamic
                    exportWorkflowAssetAction.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.to.file");
                    exportWorkflowAssetAction.setText(asset.getTitle() + " to File...");
                    exportWorkflowAssetAction
                            .setImageDescriptor(MdwPlugin.getImageDescriptor("icons/" + asset.getIcon()));
                    exportMenu.add(exportWorkflowAssetAction);
                }

                if (exportAttributesApplies(selection)) {
                    List<IAction> exportAttrsActions = getExportAttributeActions(selection);
                    if (!exportAttrsActions.isEmpty()) {
                        MenuManager attributesMenu = new MenuManager("Attributes",
                                MdwPlugin.getImageDescriptor("icons/attribute.gif"),
                                MdwMenuManager.MDW_MENU_PREFIX + "menu.export.attributes");
                        attributesMenu.removeAll();
                        for (IAction action : exportAttrsActions)
                            attributesMenu.add(action);
                        exportMenu.add(attributesMenu);
                    }
                }

                if (exportTaskTemplatesApplies(selection))
                    exportMenu.add(exportTaskTemplateAction);

                exportMenu.add(new Separator("Other"));
                IWorkbenchAction otherAction = ActionFactory.EXPORT.create(getViewSite().getWorkbenchWindow());
                otherAction.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.other");
                otherAction.setText("Other...");
                exportMenu.add(otherAction);
            }
        };
    }

    private ActionGroup createRunActionGroup() {
        runMenu = new MenuManager("Run", MdwPlugin.getImageDescriptor("icons/run.gif"),
                MdwMenuManager.MDW_MENU_PREFIX + "menu.run");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                runMenu.removeAll();
                IStructuredSelection selection = getSelection();

                if (runOnServerApplies(selection))
                    runMenu.add(runOnServerAction);
                if (runTestsApplies(selection))
                    runMenu.add(runTestsAction);
            }
        };
    }

    private ActionGroup createWebActionGroup() {
        webMenu = new MenuManager("Web", MdwPlugin.getImageDescriptor("icons/webtools.gif"),
                MdwMenuManager.MDW_MENU_PREFIX + "menu.web");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                webMenu.removeAll();
                IStructuredSelection selection = getSelection();
                if (webLaunchApplies(selection)) {
                    if (selection.getFirstElement() instanceof WorkflowElement) {
                        if (((WorkflowElement) selection.getFirstElement()).getProject().checkRequiredVersion(5,
                                5)) {
                            webMenu.add(mdwHubAction);
                        } else {
                            webMenu.add(taskManagerAction);
                            webMenu.add(webToolsAction);
                        }
                    }
                }
            }
        };
    }

    private ActionGroup createFormatActionGroup() {
        formatMenu = new MenuManager("Format", null, MdwMenuManager.MDW_MENU_PREFIX + "menu.format");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                formatMenu.removeAll();
                IStructuredSelection selection = getSelection();

                WorkflowProject project = ((WorkflowElement) selection.getFirstElement()).getProject();

                if (formatFunctionTestResultsApplies(selection))
                    formatMenu.add(formatFunctionTestResultsAction);
                java.io.File resultsFile = project.getFunctionTestResultsFile();
                formatFunctionTestResultsAction.setEnabled(resultsFile != null && resultsFile.exists());
                if (formatLoadTestResultsApplies(selection))
                    formatMenu.add(formatLoadTestResultsAction);
                resultsFile = project.getLoadTestResultsFile();
                formatLoadTestResultsAction.setEnabled(resultsFile != null && resultsFile.exists());
            }
        };
    }

    private ActionGroup createServerActionGroup() {
        serverMenu = new MenuManager("Server", MdwPlugin.getImageDescriptor("icons/server.gif"),
                MdwMenuManager.MDW_MENU_PREFIX + "menu.server");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                serverMenu.removeAll();
                IStructuredSelection selection = getSelection();

                if (serverActionApplies(selection)) {
                    WorkflowProject project = (WorkflowProject) selection.getFirstElement();

                    if (project.isUserAuthorizedForSystemAdmin())
                        serverMenu.add(refreshCachesAction);
                    if (!project.isRemote() || project.isUserAuthorizedForSystemAdmin()) {
                        stubServerAction.setChecked(project.getDesignerProxy().isStubServerRunning());
                        serverMenu.add(stubServerAction);
                        logWatcherAction.setChecked(DesignerProxy.isLogWatcherRunning());
                        serverMenu.add(logWatcherAction);
                    }

                    if (!MdwPlugin.isRcp()) {
                        if (!serverMenu.isEmpty())
                            serverMenu.add(new Separator("VM"));
                        serverMenu.add(visualVmAction);
                        serverMenu.add(jconsoleAction);
                    }
                }
            }
        };
    }

    private ActionGroup createSwingActionGroup() {
        swingMenu = new MenuManager("Swing Tools", null, MdwMenuManager.MDW_MENU_PREFIX + "menu.swing.tools");
        return new ActionGroup() {
            @Override
            public void fillContextMenu(IMenuManager menu) {
                swingMenu.removeAll();
                IStructuredSelection selection = getSelection();

                if (swingLaunchApplies(selection)) {
                    WorkflowProject project = (WorkflowProject) selection.getFirstElement();
                    MdwSettings settings = MdwPlugin.getSettings();

                    if (settings.isSwingLaunchEventManager() && project.isUserAuthorizedForSystemAdmin())
                        swingMenu.add(eventManagerAction);
                    if (settings.isSwingLaunchThreadPoolManager() && project.isUserAuthorizedForSystemAdmin())
                        swingMenu.add(threadPoolManagerAction);
                }
            }
        };
    }

    private IAction createOpenAction() {
        IAction action = new Action() {
            public void run() {
                if (!openApplies(getSelection()))
                    return;

                for (Object item : getSelection().toList()) {
                    if (!actionHandler.open((WorkflowElement) item))
                        view.expand(item);
                }
            }
        };
        action.setActionDefinitionId("org.eclipse.jdt.ui.edit.text.java.open.editor");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "open");
        action.setText("Open");
        getActionBars().setGlobalActionHandler("org.eclipse.ui.navigator.Open", action);
        return action;
    }

    private IAction createPropertiesAction() {
        IAction action = new Action() {
            public void run() {
                actionHandler.showPropertiesView();
                view.setFocus();
            }
        };
        ImageDescriptor propsImageDesc = MdwPlugin.getImageDescriptor("icons/properties.gif");
        action.setImageDescriptor(propsImageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "show.properties");
        action.setText("Show Properties");

        return action;
    }

    private IAction createIncrementVersionAction() {
        IAction action = new Action() {
            public void run() {
                if (incrementVersionApplies(getSelection()))
                    actionHandler.incrementVersion((WorkflowElement) getSelection().getFirstElement());
                view.setFocus();
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "increment.version");
        action.setText("Increment Version");

        return action;
    }

    private IAction createSetVersionAction() {
        IAction action = new Action() {
            public void run() {
                if (setVersionApplies(getSelection()))
                    actionHandler.setVersion((WorkflowElement) getSelection().getFirstElement());
                view.setFocus();
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "set.version");
        action.setText("Set Version");

        return action;
    }

    private IAction createTagVersionAction() {
        IAction action = new Action() {
            public void run() {
                if (tagVersionApplies(getSelection()))
                    actionHandler.tagVersion(selectionToElementArray(getSelection()));
                view.setFocus();
            }
        };
        ImageDescriptor propsImageDesc = MdwPlugin.getImageDescriptor("icons/package.gif");
        action.setImageDescriptor(propsImageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "tag.version");
        action.setText("Tag Version...");

        return action;
    }

    private IAction createCopyAction() {
        IAction action = new Action() {
            public void run() {
                if (!copyApplies(getSelection()))
                    return;

                view.setFocus();

                Object[] items = getSelection().toArray();
                WorkflowElement[] elements = new WorkflowElement[items.length];
                for (int i = 0; i < items.length; i++) {
                    elements[i] = (WorkflowElement) items[i];
                }
                actionHandler.copy(elements, view.getClipboard());
            }
        };
        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
        action.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
        action.setActionDefinitionId("org.eclipse.ui.edit.copy");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "copy");
        action.setText("Copy");
        getActionBars().setGlobalActionHandler(ActionFactory.COPY.getId(), action);
        return action;
    }

    private IAction createPasteAction() {
        IAction action = new Action() {
            public void run() {
                if (!pasteApplies(getSelection()))
                    return;

                view.setFocus();

                actionHandler.paste(view.getClipboard(), view.getDropTarget(),
                        (WorkflowElement) getSelection().getFirstElement());
            }
        };
        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
        action.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
        action.setActionDefinitionId("org.eclipse.ui.edit.paste");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "paste");
        action.setText("Paste");
        getActionBars().setGlobalActionHandler(ActionFactory.PASTE.getId(), action);
        return action;
    }

    private IAction createDeleteAction() {

        IAction action = new Action() {
            public void run() {
                if (!deleteApplies(getSelection()))
                    return;

                view.setFocus();

                Object[] items = getSelection().toArray();
                WorkflowElement[] elements = new WorkflowElement[items.length];
                boolean includesArchived = false;
                for (int i = 0; i < items.length; i++) {
                    elements[i] = (WorkflowElement) items[i];
                    if (elements[i].isArchived())
                        includesArchived = true;
                }

                actionHandler.delete(elements);
                view.select(null);
                getContext().setSelection(new StructuredSelection());

                if (includesArchived) // TODO archived elements are not being
                                      // listened to
                    view.refreshItem(elements[0].getProject());
            }
        };
        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
        action.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
        action.setActionDefinitionId("org.eclipse.ui.edit.delete");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "delete");
        action.setText("Delete");
        getActionBars().setGlobalActionHandler(ActionFactory.DELETE.getId(), action);
        return action;
    }

    private IAction createRenameAction() {
        IAction action = new Action() {
            public void run() {
                if (!renameApplies(getSelection()))
                    return;

                view.setFocus();

                actionHandler.rename((WorkflowElement) getSelection().getFirstElement());
            }
        };
        action.setActionDefinitionId("org.eclipse.ui.edit.rename");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "rename");
        action.setText("Rename...");
        getActionBars().setGlobalActionHandler(ActionFactory.RENAME.getId(), action);
        return action;
    }

    private IAction createImportProjectAction() {
        IAction action = new Action() {
            public void run() {
                if (!importProjectApplies(getSelection()))
                    return;
                actionHandler.imporT(WorkflowProject.class, (WorkflowElement) getSelection().getFirstElement());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/remote_project.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.projecs");
        action.setText("Project(s)...");
        return action;
    }

    private IAction createImportPackageAction() {
        IAction action = new Action() {
            public void run() {
                if (!importPackageApplies(getSelection()))
                    return;

                WorkflowElement selection = (WorkflowElement) getSelection().getFirstElement();
                WorkflowProject workflowProject = selection.getProject();
                boolean authorized = (workflowProject.isFilePersist() && !workflowProject.isRemote())
                        || workflowProject.getDesignerDataModel().userHasRoleInAnyGroup(UserRoleVO.PROCESS_DESIGN);
                if (!authorized) {
                    MessageDialog.openError(getViewSite().getShell(), "Package Import",
                            "You are not authorized to import into project: " + workflowProject.getName());
                    return;
                }
                actionHandler.imporT(WorkflowPackage.class, selection);
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/package.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.packages");
        action.setText("Package(s)...");
        return action;
    }

    private IAction createImportVcsAction() {
        IAction action = new Action() {
            public void run() {
                if (!importVcsApplies(getSelection()))
                    return;

                WorkflowElement selection = (WorkflowElement) getSelection().getFirstElement();
                WorkflowProject workflowProject = selection.getProject();
                boolean authorized = workflowProject.getDesignerDataModel()
                        .userHasRoleInAnyGroup(UserRoleVO.PROCESS_DESIGN);
                if (!authorized) {
                    MessageDialog.openError(getViewSite().getShell(), "Package Import",
                            "You are not authorized to import into project: " + workflowProject.getName());
                    return;
                }
                actionHandler.remoteImportVcs(selection.getProject());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/gitrepo.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "assets.from.vcs");
        action.setText("Assets from VCS...");
        return action;
    }

    private IAction createImportProcessAction() {
        IAction action = new Action() {
            public void run() {
                if (!importProcessApplies(getSelection()))
                    return;
                actionHandler.imporT(WorkflowProcess.class, (WorkflowElement) getSelection().getFirstElement());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/process.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.process");
        action.setText("Process...");
        return action;
    }

    private IAction createImportTaskTemplateAction() {
        IAction action = new Action() {
            public void run() {
                if (!importTaskTemplateApplies(getSelection()))
                    return;
                WorkflowElement selection = (WorkflowElement) getSelection().getFirstElement();
                WorkflowProject workflowProject = selection.getProject();
                if (!workflowProject.isUserAuthorizedInAnyGroup(UserRoleVO.PROCESS_DESIGN)) {
                    MessageDialog.openError(getViewSite().getShell(), "Task Template Import",
                            "You are not authorized to import into project: " + workflowProject.getName());
                    return;
                }
                actionHandler.imporT(TaskTemplate.class, selection);
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/task.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.tasks");
        action.setText("Task Templates...");
        return action;
    }

    private IAction createImportWorkflowAssetAction() {
        IAction action = new Action() {
            public void run() {
                if (!importWorkflowAssetApplies(getSelection()))
                    return;
                actionHandler.imporT(WorkflowAsset.class, (WorkflowElement) getSelection().getFirstElement());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/doc.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "new.asset.version");
        action.setText("New Version...");
        return action;
    }

    private IAction createExportPackageAction() {
        IAction action = new Action() {
            public void run() {
                if (!exportPackageApplies(getSelection()))
                    return;

                view.setFocus();

                actionHandler.export(WorkflowPackage.class, getSelection());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/package.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.packages");
        action.setText("Package(s)...");
        return action;
    }

    private List<IAction> getExportAttributeActions(IStructuredSelection selection) {
        List<IAction> exportAttributesActions = new ArrayList<IAction>();
        if (selection != null && selection.getFirstElement() instanceof WorkflowElement) {
            // bam
            IAction action = new Action() {
                public void run() {
                    if (!exportAttributesApplies(getSelection()))
                        return;
                    view.setFocus();
                    actionHandler.exportAttributes(WorkAttributeConstant.BAM_ATTR_PREFIX,
                            (WorkflowElement) getSelection().getFirstElement());
                }
            };
            action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.monitoring");
            action.setText("Monitoring...");
            exportAttributesActions.add(action);

            // simulation
            action = new Action() {
                public void run() {
                    if (!exportAttributesApplies(getSelection()))
                        return;
                    view.setFocus();
                    actionHandler.exportAttributes(WorkAttributeConstant.SIMULATION_ATTR_PREFIX,
                            (WorkflowElement) getSelection().getFirstElement());
                }
            };
            action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.simulation");
            action.setText("Simulation...");
            exportAttributesActions.add(action);

            // pagelet-driven attributes
            WorkflowProject project = ((WorkflowElement) selection.getFirstElement()).getProject();
            List<PageletTab> pageletTabs = project.getPageletTabs();
            if (pageletTabs != null) {
                for (PageletTab pageletTab : pageletTabs) {
                    final String prefix = pageletTab.getOverrideAttributePrefix();
                    action = new Action() {
                        public void run() {
                            if (!exportAttributesApplies(getSelection()))
                                return;
                            view.setFocus();
                            actionHandler.exportAttributes(prefix,
                                    (WorkflowElement) getSelection().getFirstElement());
                        }
                    };
                    action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.attributes." + prefix);
                    action.setText(pageletTab.getLabel() + "...");
                    exportAttributesActions.add(action);
                }
            }
        }

        return exportAttributesActions;
    }

    private List<IAction> getImportAttributeActions(IStructuredSelection selection) {
        List<IAction> importAttributesActions = new ArrayList<IAction>();

        if (selection != null && selection.getFirstElement() instanceof WorkflowElement) {

            // bam
            IAction action = new Action() {
                public void run() {
                    if (!importAttributesApplies(getSelection()))
                        return;
                    view.setFocus();
                    actionHandler.importAttributes(WorkAttributeConstant.BAM_ATTR_PREFIX,
                            (WorkflowElement) getSelection().getFirstElement());
                }
            };
            action.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.monitoring");
            action.setText("Monitoring...");
            importAttributesActions.add(action);

            // simulation
            action = new Action() {
                public void run() {
                    if (!importAttributesApplies(getSelection()))
                        return;
                    view.setFocus();
                    actionHandler.importAttributes(WorkAttributeConstant.SIMULATION_ATTR_PREFIX,
                            (WorkflowElement) getSelection().getFirstElement());
                }
            };
            action.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.simulation");
            action.setText("Simulation...");
            importAttributesActions.add(action);

            // pagelet-driven attributes
            WorkflowProject project = ((WorkflowElement) selection.getFirstElement()).getProject();
            List<PageletTab> pageletTabs = project.getPageletTabs();
            if (pageletTabs != null) {
                for (PageletTab pageletTab : pageletTabs) {
                    final String prefix = pageletTab.getOverrideAttributePrefix();
                    action = new Action() {
                        public void run() {
                            if (!importAttributesApplies(getSelection()))
                                return;
                            view.setFocus();
                            actionHandler.importAttributes(prefix,
                                    (WorkflowElement) getSelection().getFirstElement());
                        }
                    };
                    action.setId(MdwMenuManager.MDW_MENU_PREFIX + "import.attributes." + prefix);
                    action.setText(pageletTab.getLabel() + "...");
                    importAttributesActions.add(action);
                }
            }
        }

        return importAttributesActions;
    }

    private IAction createExportProjectAction() {
        IAction action = new Action() {
            public void run() {
                if (!exportProjectApplies(getSelection()))
                    return;

                view.setFocus();

                actionHandler.export(WorkflowProject.class, getSelection());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/remote_project.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.projects");
        action.setText("Project(s)...");
        return action;
    }

    private IAction createExportProcessAction() {
        IAction action = new Action() {
            public void run() {
                if (!exportProcessApplies(getSelection()))
                    return;

                view.setFocus();

                actionHandler.export(WorkflowProcess.class, getSelection());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/process.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.process");
        action.setText("Process...");
        return action;
    }

    private IAction createExportTaskTemplateAction() {
        IAction action = new Action() {
            public void run() {
                if (!exportTaskTemplatesApplies(getSelection()))
                    return;

                view.setFocus();

                actionHandler.export(TaskTemplate.class, getSelection());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/task.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.tasks");
        action.setText("Task Templates...");
        return action;
    }

    private IAction createSwingLaunchAction(final String title, final String icon, final String formName,
            final String dataInit) {
        IAction action = new Action() {
            public void run() {
                if (!swingLaunchApplies(getSelection()))
                    return;

                WorkflowProject workflowProject = (WorkflowProject) getSelection().getFirstElement();
                boolean is55 = workflowProject.checkRequiredVersion(5, 5);
                String handlerPkg = is55 ? "com.centurylink.mdw.listener.formaction."
                        : "com.qwest.mdw.listener.formaction.";
                String listenerPackage = is55 ? "com.centurylink.mdw.swingtools/" : "";
                actionHandler.launchSwing(workflowProject, title,
                        formName == null ? null : listenerPackage + formName, handlerPkg + dataInit);
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "swing." + title);
        action.setText(title);
        if (icon != null) {
            ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/" + icon);
            action.setImageDescriptor(imageDesc);
        }
        return action;
    }

    private IAction createExportWorkflowAssetAction() {
        IAction action = new Action() {
            public void run() {
                if (!exportWorkflowAssetApplies(getSelection()))
                    return;
                actionHandler.export(WorkflowAsset.class, getSelection());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/doc.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.asset.to.file");
        action.setText("To File...");
        return action;
    }

    private IAction createExportAsAction() {
        IAction action = new Action() {
            public void run() {
                if (!exportAsApplies(getSelection()))
                    return;

                view.setFocus();

                Object element = getSelection().getFirstElement();
                actionHandler.exportAs((WorkflowElement) element);
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/export_as.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "export.as");
        action.setText("Export As...");
        return action;
    }

    private IAction createRunAction() {
        IAction action = new Action() {
            public void run() {
                if (!runApplies(getSelection()))
                    return;

                view.setFocus();

                Object element = getSelection().getFirstElement();
                if (element instanceof AutomatedTestSuite || element instanceof AutomatedTestCase)
                    actionHandler.test(getSelection());
                else
                    actionHandler.run((WorkflowElement) element);
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/run.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "run");
        action.setText("Run...");
        return action;
    }

    private IAction createRunOnServerAction() {
        IAction action = new Action() {
            public void run() {
                if (!runOnServerApplies(getSelection()))
                    return;
                view.setFocus();
                actionHandler.run((WorkflowElement) getSelection().getFirstElement());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/run_on_server.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "run.on.server");
        action.setText("Run on Server");
        return action;
    }

    private IAction createRunTestsAction() {
        IAction action = new Action() {
            public void run() {
                if (!runTestsApplies(getSelection()))
                    return;
                view.setFocus();
                actionHandler.test(getSelection());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/testrun.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "run.tests");
        action.setText("Run Tests...");
        return action;
    }

    private IAction createRunFromStartPageAction() {
        IAction action = new Action() {
            public void run() {
                if (!runFromPageApplies(getSelection()))
                    return;

                view.setFocus();

                Object element = getSelection().getFirstElement();
                if (element instanceof AutomatedTestSuite || element instanceof AutomatedTestCase)
                    actionHandler.test(getSelection());
                else if (element instanceof File && ((File) element).getParent() instanceof AutomatedTestCase
                        && TestCase.LEGACY_TEST_CASE_FILENAMES.values().contains(((File) element).getName()))
                    actionHandler.test(getSelection());
                else
                    actionHandler.runFromPage((WorkflowElement) element);
            }
        };

        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/run.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "run.start.page");
        action.setText("Run Start Page...");
        return action;
    }

    private IAction createDebugAction() {
        IAction action = new Action() {
            public void run() {
                if (!debugApplies(getSelection()))
                    return;

                view.setFocus();

                Object element = getSelection().getFirstElement();
                if (element instanceof AutomatedTestSuite || element instanceof AutomatedTestCase)
                    actionHandler.debugTest(getSelection());
                else
                    actionHandler.debug((WorkflowElement) element);
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/debug.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "debug");
        action.setText("Debug...");
        return action;
    }

    private IAction createInstancesAction() {
        IAction action = new Action() {
            public void run() {
                if (!showInstancesApplies(getSelection()))
                    return;
                view.setFocus();
                actionHandler.showInstances((WorkflowElement) getSelection().getFirstElement());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/list.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "view.instances");
        action.setText("View Instances");
        return action;
    }

    private IAction createMyTasksAction() {
        IAction action = new Action() {
            public void run() {
                if (!myTasksApplies(getSelection()))
                    return;
                view.setFocus();
                actionHandler.showInstances((WorkflowElement) getSelection().getFirstElement());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/list.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "my.tasks");
        action.setText("My Tasks");
        return action;
    }

    private IAction createCollapseAllAction() {
        IAction action = new Action() {
            public void run() {
                view.handleCollapseAll();
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "collapse.all");
        action.setText("Collapse All");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/collapseall.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createRefreshAction(final boolean viewRefresh) {
        IAction action = new Action() {
            public void run() {
                if (viewRefresh)
                    view.handleRefresh();
                else if (refreshApplies(getSelection()))
                    actionHandler.refresh((WorkflowElement) getSelection().getFirstElement());
            }
        };
        action.setText(viewRefresh ? "Refresh View" : "Refresh");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + (viewRefresh ? "view.refresh" : "refresh"));
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/refresh.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createRefreshCachesAction() {
        IAction action = new Action() {
            public void run() {
                actionHandler.serverAction((WorkflowElement) getSelection().getFirstElement(),
                        WorkflowElementActionHandler.REFRESH_CACHES);
            }
        };
        action.setText("Refresh Caches");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "refresh.caches");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/refr_cache.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createUpdateAction() {
        IAction action = new Action() {
            public void run() {
                if (updateApplies(getSelection())) {
                    WorkflowElement workflowElement = (WorkflowElement) getSelection().getFirstElement();
                    actionHandler.update(workflowElement);
                }
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "update.to.latest");
        action.setText("Update to Latest");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/sync.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createStubServerAction() {
        IAction action = new Action("Stub Server", Action.AS_CHECK_BOX) {
            public void run() {
                WorkflowProject project = (WorkflowProject) getSelection().getFirstElement();
                actionHandler.serverAction(project, WorkflowElementActionHandler.STUB_SERVER);
                project.fireElementChangeEvent(ChangeType.STATUS_CHANGE,
                        project.getDesignerProxy().isStubServerRunning());
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/stubserv.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createLogWatcherAction() {
        IAction action = new Action("Log Watcher", Action.AS_CHECK_BOX) {
            public void run() {
                WorkflowProject project = (WorkflowProject) getSelection().getFirstElement();
                actionHandler.serverAction(project, WorkflowElementActionHandler.LOG_WATCHER);
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/logwatch.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createSortToolbarAction() {
        IAction action = new Action() {
            public void run() {
                IPreferenceStore prefsStore = MdwPlugin.getDefault().getPreferenceStore();
                prefsStore.setValue(PreferenceConstants.PREFS_SORT_PACKAGE_CONTENTS_A_TO_Z, isChecked());
                view.handleApply();
            }
        };

        action.setText("Sort Package Contents");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "sort.package.contents");
        ImageDescriptor sortImageDesc = MdwPlugin.getImageDescriptor("icons/sort.gif");
        action.setImageDescriptor(sortImageDesc);
        IPreferenceStore prefsStore = MdwPlugin.getDefault().getPreferenceStore();
        action.setChecked(prefsStore.getBoolean(PreferenceConstants.PREFS_SORT_PACKAGE_CONTENTS_A_TO_Z));
        return action;
    }

    private IAction createFilterToolbarAction() {
        IAction action = new Action() {
            public void run() {
                IPreferenceStore prefsStore = MdwPlugin.getDefault().getPreferenceStore();
                List<String> options = new ArrayList<String>();
                options.add(PreferenceConstants.PREFS_FILTER_PROCESSES_IN_PEX);
                options.add(PreferenceConstants.PREFS_FILTER_WORKFLOW_ASSETS_IN_PEX);
                options.add(PreferenceConstants.PREFS_FILTER_EVENT_HANDLERS_IN_PEX);
                options.add(PreferenceConstants.PREFS_SHOW_ACTIVITY_IMPLEMENTORS_IN_PEX);
                options.add(PreferenceConstants.PREFS_FILTER_TASK_TEMPLATES_IN_PEX);
                options.add(PreferenceConstants.PREFS_FILTER_ARCHIVED_ITEMS_IN_PEX);

                List<String> selected = new ArrayList<String>();
                for (String option : options) {
                    boolean show = !prefsStore.getBoolean(option);
                    if (option.startsWith("Show"))
                        show = !show; // means default is filtered
                    if (show)
                        selected.add(option);
                }
                ListSelectionDialog lsd = new ListSelectionDialog(view.getSite().getShell(), options,
                        new IStructuredContentProvider() {
                            public Object[] getElements(Object inputElement) {
                                return ((List<?>) inputElement).toArray(new String[0]);
                            }

                            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                            }

                            public void dispose() {
                            }
                        }, new ILabelProvider() {
                            public void addListener(ILabelProviderListener listener) {
                            }

                            public void removeListener(ILabelProviderListener listener) {
                            }

                            public boolean isLabelProperty(Object element, String property) {
                                return false;
                            }

                            public void dispose() {
                            }

                            public Image getImage(Object element) {
                                return null;
                            }

                            public String getText(Object element) {
                                if (PreferenceConstants.PREFS_FILTER_PROCESSES_IN_PEX.equals(element))
                                    return "Processes";
                                else if (PreferenceConstants.PREFS_FILTER_WORKFLOW_ASSETS_IN_PEX.equals(element))
                                    return "Assets";
                                else if (PreferenceConstants.PREFS_FILTER_EVENT_HANDLERS_IN_PEX.equals(element))
                                    return "Event Handlers";
                                else if (PreferenceConstants.PREFS_SHOW_ACTIVITY_IMPLEMENTORS_IN_PEX
                                        .equals(element))
                                    return "Activity Implementors";
                                else if (PreferenceConstants.PREFS_FILTER_TASK_TEMPLATES_IN_PEX.equals(element))
                                    return "Task Templates";
                                else if (PreferenceConstants.PREFS_FILTER_ARCHIVED_ITEMS_IN_PEX.equals(element))
                                    return "Archived Items";
                                else
                                    return null;
                            }
                        }, "Workflow elements to display in Process Explorer");
                lsd.setTitle("Show Package Contents");
                lsd.setInitialSelections(selected.toArray(new String[0]));
                int res = lsd.open();
                if (res != Dialog.CANCEL) {
                    Object[] results = (Object[]) lsd.getResult();
                    for (String option : options) {
                        boolean show = false;
                        for (Object result : results) {
                            if (option.equals(result))
                                show = true;
                        }
                        if (option.startsWith("Filter"))
                            show = !show; // default is to show
                        prefsStore.setValue(option, show);
                    }
                    view.handleApply();
                }
            }
        };

        action.setText("Filter Package Contents");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "filter.package.contents");
        ImageDescriptor sortImageDesc = MdwPlugin.getImageDescriptor("icons/filter.gif");
        action.setImageDescriptor(sortImageDesc);
        return action;
    }

    private IAction createNewAction(final Class<? extends WorkflowElement> elementClass, String label,
            String icon) {
        IAction action = new Action() {
            public void run() {
                if (!createApplies(elementClass, getSelection()))
                    return;
                actionHandler.create(elementClass, (WorkflowElement) getSelection().getFirstElement());
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "new." + label);
        action.setText(label);
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/" + icon);
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createSearchAction() {
        IAction action = new Action() {
            public void run() {
                if (!searchApplies(getSelection()))
                    return;

                Object[] items = getSelection().toArray();
                WorkflowElement[] elements = new WorkflowElement[items.length];
                for (int i = 0; i < items.length; i++)
                    elements[i] = (WorkflowElement) items[i];

                actionHandler.search(elements);
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "search");
        action.setText("Search");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/search.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createFindCallersAction() {
        IAction action = new Action() {
            public void run() {
                if (!findCallersApplies(getSelection()))
                    return;

                actionHandler.findCallers((WorkflowElement) getSelection().getFirstElement());
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "find.calling.processes");
        action.setText("Find Calling Processes");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/process.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createShowProcessHierarchyAction() {
        IAction action = new Action() {
            public void run() {
                if (!showProcessHierarchyApplies(getSelection()))
                    return;

                actionHandler.showHierarchy((WorkflowElement) getSelection().getFirstElement());
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "show.process.hierarchy");
        action.setText("Show Process Hierarchy");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/hierarchy.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createCompareResultsAction() {
        IAction action = new Action() {
            @SuppressWarnings("restriction")
            public void run() {
                if (compareResultsApplies(getSelection())) {
                    WorkflowProject project = ((WorkflowElement) getSelection().getFirstElement()).getProject();
                    try {
                        project.getProjectFolder(project.getTestResultsPath(AutomatedTestCase.FUNCTION_TEST))
                                .refreshLocal(IResource.DEPTH_INFINITE, null);
                        Object[] items = new Object[2];
                        if (getSelection().getFirstElement() instanceof AutomatedTestResults) {
                            AutomatedTestResults expectedResults = (AutomatedTestResults) getSelection()
                                    .getFirstElement();
                            if (project.isFilePersist()) {
                                items[0] = project.getProjectFile(expectedResults.getVcsAssetPath());
                            } else {
                                expectedResults.openTempFile(new NullProgressMonitor());
                                items[0] = expectedResults.getTempFile(expectedResults.getTempFolder());
                            }
                            String actualResultsPath = expectedResults.getPackage().getName() + "/"
                                    + expectedResults.getName();
                            items[1] = project
                                    .getProjectFile(project.getTestResultsPath(AutomatedTestCase.FUNCTION_TEST)
                                            + "/" + actualResultsPath);
                        } else if (getSelection().getFirstElement() instanceof LegacyExpectedResults) {
                            LegacyExpectedResults expectedResult = (LegacyExpectedResults) getSelection()
                                    .getFirstElement();
                            items[0] = expectedResult.getExpectedResult();
                            items[1] = expectedResult.getActualResult();
                        }
                        if (items[1] == null || !((IFile) items[1]).exists()) {
                            MessageDialog.openWarning(view.getSite().getShell(), "No Results",
                                    "Unable to locate results file: "
                                            + ((IFile) items[1]).getLocation().toString());
                            return;
                        }
                        StructuredSelection compareSelection = new StructuredSelection(items);
                        ResultsCompareAction compareAction = new ResultsCompareAction(compareSelection);
                        compareAction.run(compareSelection);
                    } catch (Exception ex) {
                        PluginMessages.uiError(ex, "Compare Test Results", project);
                    }
                }
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "compare.results");
        action.setText("Compare Results");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/compare.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createOpenInstanceAction() {
        IAction action = new Action() {
            public void run() {
                if (openInstanceApplies(getSelection())) {
                    WorkflowProject project = ((WorkflowElement) getSelection().getFirstElement()).getProject();
                    try {
                        Long procInstId = null;
                        if (getSelection().getFirstElement() instanceof AutomatedTestResults) {
                            AutomatedTestResults expectedResults = (AutomatedTestResults) getSelection()
                                    .getFirstElement();
                            procInstId = expectedResults.getActualProcessInstanceId();
                        } else if (getSelection().getFirstElement() instanceof LegacyExpectedResults) {
                            LegacyExpectedResults expectedResult = (LegacyExpectedResults) getSelection()
                                    .getFirstElement();
                            java.io.File resultsFile = expectedResult.getActualResultFile();
                            TestFile testFile = new TestFile(null, resultsFile.getPath());
                            testFile.load();
                            TestFileLine line1 = testFile.getLines().get(0);
                            procInstId = new Long(line1.getWord(3));
                        }

                        if (procInstId == null) {
                            MessageDialog.openWarning(view.getSite().getShell(), "No Results",
                                    "Unable to locate results file.");
                            return;
                        }
                        ProcessInstanceVO procInst = project.getDataAccess().getProcessInstance(procInstId);
                        Long processId = procInst.getProcessId();
                        ProcessVO procVO = project.getProcess(processId).getProcessVO();
                        if (procVO == null)
                            PluginMessages.uiError("Unable to locate process: " + processId,
                                    "Open Process Instance", project);
                        WorkflowProcess instance = new WorkflowProcess(project, procVO);
                        instance.setProcessInstance(procInst);
                        actionHandler.open(instance);
                    } catch (Exception ex) {
                        PluginMessages.uiError(ex, "Open Process Instance", project);
                    }
                }
            }
        };
        action.setText("Open Process Instance");
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "open.process.instance");
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/process.gif");
        action.setImageDescriptor(imageDesc);
        return action;
    }

    private IAction createFormatFunctionTestResultsAction() {
        IAction action = new Action() {
            public void run() {
                if (formatFunctionTestResultsApplies(getSelection())) {
                    WorkflowElement element = (WorkflowElement) getSelection().getFirstElement();
                    actionHandler.formatResults(element.getProject(), AutomatedTestCase.FUNCTION_TEST);
                }
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/auto_test.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "format.function.test.results");
        action.setText("Function Tests Results");
        return action;
    }

    private IAction createFormatLoadTestResultsAction() {
        IAction action = new Action() {
            public void run() {
                if (formatLoadTestResultsApplies(getSelection())) {
                    WorkflowElement element = (WorkflowElement) getSelection().getFirstElement();
                    actionHandler.formatResults(element.getProject(), AutomatedTestCase.LOAD_TEST);
                }
            }
        };
        ImageDescriptor imageDesc = MdwPlugin.getImageDescriptor("icons/load_test.gif");
        action.setImageDescriptor(imageDesc);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "format.load.test.results");
        action.setText("Load Test Results");
        return action;
    }

    private IAction createTaskManagerAction() {
        IAction action = new Action() {
            public void run() {
                if (webLaunchApplies(getSelection())) {
                    if (getSelection().getFirstElement() instanceof WorkflowProject) {
                        WorkflowProject project = (WorkflowProject) getSelection().getFirstElement();
                        WebLaunchActions.getLaunchAction(project, WebApp.TaskManager).launch(project);
                    } else if (getSelection().getFirstElement() instanceof WorkflowPackage) {
                        WorkflowPackage packageVersion = (WorkflowPackage) getSelection().getFirstElement();
                        WebLaunchActions.getLaunchAction(packageVersion.getProject(), WebApp.TaskManager)
                                .launch(packageVersion);
                    }
                }
            }
        };
        WebLaunchAction launchAction = WebLaunchActions.getLaunchAction(null, WebApp.TaskManager);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "launch.task.manager");
        action.setText(launchAction.getLabel());
        action.setImageDescriptor(launchAction.getImageDescriptor());
        return action;
    }

    private IAction createMdwHubAction() {
        IAction action = new Action() {
            public void run() {
                if (webLaunchApplies(getSelection())) {
                    if (getSelection().getFirstElement() instanceof WorkflowProject) {
                        WorkflowProject project = (WorkflowProject) getSelection().getFirstElement();
                        WebLaunchActions.getLaunchAction(project, WebApp.MdwHub).launch(project);
                    } else if (getSelection().getFirstElement() instanceof WorkflowPackage) {
                        WorkflowPackage packageVersion = (WorkflowPackage) getSelection().getFirstElement();
                        WebLaunchActions.getLaunchAction(packageVersion.getProject(), WebApp.MdwHub)
                                .launch(packageVersion);
                    }
                }
            }
        };
        WebLaunchAction launchAction = WebLaunchActions.getLaunchAction(null, WebApp.MdwHub);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "launch.hub");
        action.setText(launchAction.getLabel());
        action.setImageDescriptor(launchAction.getImageDescriptor());
        return action;
    }

    private IAction createWebToolsAction() {
        IAction action = new Action() {
            public void run() {
                if (webLaunchApplies(getSelection())) {
                    if (getSelection().getFirstElement() instanceof WorkflowProject) {
                        WorkflowProject project = (WorkflowProject) getSelection().getFirstElement();
                        WebLaunchActions.getLaunchAction(project, WebApp.WebTools).launch(project);
                    } else if (getSelection().getFirstElement() instanceof WorkflowPackage) {
                        WorkflowPackage pkg = (WorkflowPackage) getSelection().getFirstElement();
                        WebLaunchActions.getLaunchAction(pkg.getProject(), WebApp.WebTools).launch(pkg);
                    }
                }
            }
        };
        WebLaunchAction launchAction = WebLaunchActions.getLaunchAction(null, WebApp.WebTools);
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "launch.web.tools");
        action.setText(launchAction.getLabel());
        action.setImageDescriptor(launchAction.getImageDescriptor());
        return action;
    }

    private IAction createUnlockAction() {
        IAction action = new Action() {
            public void run() {
                if (unlockApplies(getSelection())) {
                    WorkflowProject project = (WorkflowProject) getSelection().getFirstElement();
                    WorkflowProjectManager.getInstance().makeLocal(project);
                    project.fireElementChangeEvent(ChangeType.SETTINGS_CHANGE, project.getMdwVcsRepository());
                    MessageDialog.openInformation(getViewSite().getShell(), "Remote Project Unlocked",
                            project.getName() + " has been unlocked.  Please close any open assets and refresh.");
                }
            }
        };
        action.setId(MdwMenuManager.MDW_MENU_PREFIX + "unlock");
        action.setText("Unlock");

        return action;
    }

    private IViewSite getViewSite() {
        return view.getViewSite();
    }

    private IActionBars getActionBars() {
        return getViewSite().getActionBars();
    }

    private IStructuredSelection getSelection() {
        if (getContext() == null || WorkflowProjectManager.getInstance().getWorkflowProjects().isEmpty())
            return new StructuredSelection();

        return (IStructuredSelection) getContext().getSelection();
    }

    public boolean showPropertiesApplies(IStructuredSelection selection) {
        if (selection.size() != 1)
            return false;

        Object element = selection.getFirstElement();
        if (!(element instanceof WorkflowElement))
            return false;
        if (element instanceof AutomatedTestCase)
            return !((AutomatedTestCase) element).isLegacy();
        if (element instanceof WorkflowProject || element instanceof WorkflowPackage
                || element instanceof WorkflowProcess || element instanceof ExternalEvent
                || element instanceof WorkflowAsset || element instanceof AutomatedTestCase) {
            return true;
        }

        return false;
    }

    public boolean incrementVersionApplies(IStructuredSelection selection) {
        if (selection.size() != 1)
            return false;
        if (!(selection.getFirstElement() instanceof WorkflowPackage))
            return false;

        WorkflowPackage packageVersion = (WorkflowPackage) selection.getFirstElement();
        if (packageVersion.isDefaultPackage() || packageVersion.isArchived()
                || !packageVersion.isUserAuthorized(UserRoleVO.ASSET_DESIGN))
            return false;

        return true;
    }

    public boolean setVersionApplies(IStructuredSelection selection) {
        if (selection.size() != 1)
            return false;
        if (!(selection.getFirstElement() instanceof WorkflowPackage))
            return false;

        WorkflowPackage packageVersion = (WorkflowPackage) selection.getFirstElement();
        if (packageVersion.isDefaultPackage() || packageVersion.isArchived()
                || !packageVersion.isUserAuthorized(UserRoleVO.ASSET_DESIGN))
            return false;

        return true;
    }

    public boolean tagVersionApplies(IStructuredSelection selection) {
        boolean allowArchived = MdwPlugin.getDefault().getPreferenceStore()
                .getBoolean(PreferenceConstants.PREFS_ALLOW_DELETE_ARCHIVED_PROCESSES);

        for (Object item : selection.toList()) {
            if (!(item instanceof WorkflowPackage))
                return false;
            WorkflowPackage pkg = (WorkflowPackage) item;
            if (pkg.isDefaultPackage() || (pkg.isArchived() && !allowArchived)) {
                return false;
            }
            if (!pkg.isUserAuthorized(UserRoleVO.ASSET_DESIGN)) {
                return false;
            }
        }
        return true;
    }

    public boolean copyApplies(IStructuredSelection selection) {
        for (Object item : selection.toList()) {
            WorkflowElement workflowElement = (WorkflowElement) item;
            if (!(workflowElement instanceof WorkflowProcess) && !(workflowElement instanceof ExternalEvent)
                    && !(workflowElement instanceof WorkflowAsset))
                return false;
            if (workflowElement instanceof AutomatedTestCase)
                return !((AutomatedTestCase) workflowElement).isLegacy();
        }
        return true;
    }

    public boolean pasteApplies(IStructuredSelection selection) {
        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof WorkflowElement) {
                WorkflowElement element = (WorkflowElement) selection.getFirstElement();
                WorkflowPackage pkg = element.getPackage();
                if (pkg != null) {
                    if (!pkg.isArchived() && pkg.isUserAuthorized(UserRoleVO.ASSET_DESIGN))
                        return true;
                }
            }

        }

        return false;
    }

    public boolean isSomethingToPaste(IStructuredSelection selection) {
        if (selection.getFirstElement() instanceof WorkflowElement) {
            WorkflowElement element = (WorkflowElement) selection.getFirstElement();
            WorkflowPackage destPackage = element.getPackage();

            if (destPackage != null) {
                Object clipboardContents = view.getClipboard().getContents(TextTransfer.getInstance());
                if (clipboardContents instanceof String) {
                    String clipString = (String) clipboardContents;
                    if (clipString != null
                            && (clipString.startsWith("Process~") || clipString.startsWith("ExternalEvent~")
                                    || clipString.startsWith("WorkflowAsset~"))) {
                        ProcessExplorerDropTarget dropTarget = view.getDropTarget();
                        return (dropTarget != null
                                && dropTarget.isValidDrop(clipString, destPackage, DND.DROP_COPY));
                    }
                }
            }
        }
        return false;
    }

    public boolean deleteApplies(IStructuredSelection selection) {
        boolean deleteArchived = MdwPlugin.getDefault().getPreferenceStore()
                .getBoolean(PreferenceConstants.PREFS_ALLOW_DELETE_ARCHIVED_PROCESSES);

        for (Object item : selection.toList()) {
            WorkflowElement workflowElement = (WorkflowElement) item;
            if (workflowElement.isArchived() && !deleteArchived) {
                return false;
            }
            if (workflowElement instanceof Folder || workflowElement instanceof AutomatedTestSuite) {
                return false;
            }
            if (!(workflowElement instanceof WorkflowProject)
                    && !workflowElement.isUserAuthorized(UserRoleVO.ASSET_DESIGN)) {
                return false;
            }
        }
        return true;
    }

    public boolean renameApplies(IStructuredSelection selection) {
        if (selection.size() != 1)
            return false;

        Object element = selection.getFirstElement();
        if (!(element instanceof WorkflowElement) || ((WorkflowElement) element).isArchived())
            return false;

        WorkflowElement workflowElement = (WorkflowElement) element;
        if (element instanceof Folder || element instanceof AutomatedTestSuite)
            return false;
        if (element instanceof AutomatedTestCase)
            return !((AutomatedTestCase) element).isLegacy();
        if (element instanceof File || element instanceof LegacyExpectedResults)
            return false;
        return workflowElement.isUserAuthorized(UserRoleVO.ASSET_DESIGN);
    }

    public boolean importPackageApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement element = (WorkflowElement) selection.getFirstElement();
        if (element.isArchived())
            return false;

        if (!(element instanceof WorkflowProject))
            return false;

        WorkflowProject project = (WorkflowProject) element;

        if (!project.isInitialized())
            return false;

        if (project.isFilePersist() && !project.isRemote())
            return true; // local file persist can always import (even Git)

        return project.getDesignerDataModel().userHasRoleInAnyGroup(UserRoleVO.PROCESS_DESIGN);
    }

    public boolean importVcsApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement element = (WorkflowElement) selection.getFirstElement();
        if (element.isArchived())
            return false;

        if (!(element instanceof WorkflowProject))
            return false;

        WorkflowProject project = (WorkflowProject) element;

        if (!project.isInitialized())
            return false;

        if (!project.isGitVcs() || !project.isRemote())
            return false;

        return project.getDesignerDataModel().userHasRoleInAnyGroup(UserRoleVO.PROCESS_DESIGN);
    }

    public boolean importProjectApplies(IStructuredSelection selection) {
        return true;
    }

    public boolean importProcessApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement element = (WorkflowElement) selection.getFirstElement();
        if (element.isArchived())
            return false;

        if (element instanceof WorkflowPackage) {
            WorkflowPackage pkg = (WorkflowPackage) element;
            return !pkg.isDefaultPackage() && pkg.isUserAuthorized(UserRoleVO.ASSET_DESIGN);
        } else if (element instanceof WorkflowProcess) {
            WorkflowProcess proc = (WorkflowProcess) element;
            return !proc.isInDefaultPackage() && proc.getPackage().isUserAuthorized(UserRoleVO.ASSET_DESIGN);
        }

        return false;
    }

    public boolean importWorkflowAssetApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement element = (WorkflowElement) selection.getFirstElement();
        if (element.isArchived())
            return false;

        if (element instanceof WorkflowPackage) {
            WorkflowPackage pkg = (WorkflowPackage) element;
            return !pkg.isDefaultPackage() && pkg.isUserAuthorized(UserRoleVO.ASSET_DESIGN);
        } else if (element instanceof WorkflowAsset) {
            WorkflowAsset asset = (WorkflowAsset) element;
            return !asset.isInDefaultPackage() && asset.isUserAuthorized(UserRoleVO.ASSET_DESIGN);
        }

        return false;
    }

    public boolean importAttributesApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement element = (WorkflowElement) selection.getFirstElement();
        if (element.isArchived() || !element.getProject().checkRequiredVersion(5, 2))
            return false;

        if (element instanceof WorkflowPackage) {
            WorkflowPackage pkg = (WorkflowPackage) element;
            return !pkg.isDefaultPackage() && pkg.getProject().getDataAccess().getDesignerDataModel()
                    .userHasRole(pkg.getGroup(), UserRoleVO.ASSET_DESIGN);
        } else if (element instanceof WorkflowProcess) {
            WorkflowProcess proc = (WorkflowProcess) element;
            return !proc.isInDefaultPackage() && proc.isInRuleSet()
                    && proc.getPackage().isUserAuthorized(UserRoleVO.ASSET_DESIGN);
        }

        return false;
    }

    public boolean importTaskTemplateApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement element = (WorkflowElement) selection.getFirstElement();
        if (element.isArchived() || !element.getProject().isFilePersist())
            return false;

        if (!(element instanceof WorkflowPackage))
            return false;

        WorkflowPackage pkg = (WorkflowPackage) element;
        return !pkg.isDefaultPackage() && pkg.isUserAuthorized(UserRoleVO.ASSET_DESIGN);
    }

    public boolean exportApplies(IStructuredSelection selection) {
        return exportProjectApplies(selection) || exportPackageApplies(selection) || exportProcessApplies(selection)
                || exportWorkflowAssetApplies(selection) || exportAttributesApplies(selection)
                || exportTaskTemplatesApplies(selection);
    }

    public boolean exportProjectApplies(IStructuredSelection selection) {
        if (selection.size() == 0)
            return false;

        for (Object element : selection.toArray()) {
            if (!(element instanceof WorkflowProject))
                return false;
        }

        return true;
    }

    public boolean exportPackageApplies(IStructuredSelection selection) {
        Object element = selection.getFirstElement();
        if (!(element instanceof WorkflowElement))
            return false;
        WorkflowProject project = ((WorkflowElement) element).getProject();
        if (selection.size() > 1 && !project.getProject().checkRequiredVersion(5, 5))
            return false;

        for (Object item : selection.toList()) {
            if (!(item instanceof WorkflowPackage))
                return false;
            WorkflowPackage pkg = (WorkflowPackage) item;
            if (pkg.isDefaultPackage() || !pkg.getProject().equals(project))
                return false;
        }
        return true;
    }

    public boolean exportProcessApplies(IStructuredSelection selection) {
        return selection.size() == 1 && (selection.getFirstElement() instanceof WorkflowProcess);
    }

    public boolean exportWorkflowAssetApplies(IStructuredSelection selection) {
        return selection.size() == 1 && (selection.getFirstElement() instanceof WorkflowAsset)
                && !((WorkflowAsset) selection.getFirstElement()).getProject().isFilePersist();
    }

    public boolean exportAttributesApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement element = (WorkflowElement) selection.getFirstElement();
        if (!element.getProject().checkRequiredVersion(5, 2))
            return false;
        if (element instanceof WorkflowProcess)
            return ((WorkflowProcess) element).isInRuleSet() && !element.isInDefaultPackage();
        else if (element instanceof WorkflowPackage)
            return !((WorkflowPackage) element).isDefaultPackage();

        return false;
    }

    public boolean exportTaskTemplatesApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowPackage))
            return false;

        WorkflowPackage pkg = (WorkflowPackage) selection.getFirstElement();
        return pkg.getProject().isFilePersist();
    }

    public boolean exportAsApplies(IStructuredSelection selection) {
        return selection.size() == 1 && (selection.getFirstElement() instanceof WorkflowProcess);
    }

    // more specific run actions for submenu
    public boolean runOnServerApplies(IStructuredSelection selection) {
        if (selection.size() == 1 && selection.getFirstElement() instanceof WorkflowProject) {
            WorkflowProject workflowProject = (WorkflowProject) selection.getFirstElement();
            return !workflowProject.isOsgi() && !workflowProject.isRemote();
        }
        return false;
    }

    public boolean runTestsApplies(IStructuredSelection selection) {
        if (selection.size() == 1 && selection.getFirstElement() instanceof WorkflowElement) {
            WorkflowElement element = (WorkflowElement) selection.getFirstElement();
            if (element instanceof WorkflowProject)
                return ((WorkflowProject) element).isUserAuthorizedInAnyGroup(UserRoleVO.PROCESS_EXECUTION);
            if (element.getProject().isFilePersist() && element instanceof WorkflowPackage)
                return ((WorkflowPackage) element).isUserAuthorized(UserRoleVO.PROCESS_EXECUTION);
        }
        return false;
    }

    public boolean runMenuApplies(IStructuredSelection selection) {
        return runOnServerApplies(selection) || runTestsApplies(selection);
    }

    // top-level run action
    public boolean runApplies(IStructuredSelection selection) {
        if (selection.size() > 1) {
            Boolean legacy = null;
            WorkflowPackage testPkg = null;
            for (Object o : selection.toArray()) {
                if (!(o instanceof AutomatedTestCase))
                    return false;
                // make sure they're all in the same package or legacy suite
                AutomatedTestCase testCase = (AutomatedTestCase) o;
                if (legacy == null)
                    legacy = testCase.isLegacy();
                if (legacy.booleanValue() != testCase.isLegacy())
                    return false;
                if (!testCase.isLegacy()) {
                    if (testPkg == null)
                        testPkg = testCase.getPackage();
                    if (!testPkg.equals(testCase.getPackage()))
                        return false;
                }
            }
            return ((AutomatedTestCase) selection.getFirstElement()).getProject()
                    .isUserAuthorizedInAnyGroup(UserRoleVO.PROCESS_EXECUTION);
        }

        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement workflowElement = (WorkflowElement) selection.getFirstElement();

        if (workflowElement instanceof Report)
            return true;

        if (workflowElement instanceof Page)
            return true;

        if (workflowElement instanceof Template
                && ((Template) workflowElement).getLanguage().equals(RuleSetVO.VELOCITY))
            return true;

        if (workflowElement instanceof WorkflowProcess || workflowElement instanceof ExternalEvent)
            return workflowElement.isUserAuthorized(UserRoleVO.PROCESS_EXECUTION);

        if (workflowElement instanceof AutomatedTestSuite || workflowElement instanceof AutomatedTestCase) {
            if (workflowElement.getProject() == null
                    || !workflowElement.getProject().isUserAuthorizedInAnyGroup(UserRoleVO.PROCESS_EXECUTION))
                return false;
            WorkflowPackage pkg = workflowElement.getPackage();
            if (pkg != null && !pkg.isUserAuthorized(UserRoleVO.PROCESS_EXECUTION))
                return false;
            try {
                AutomatedTestView testView = (AutomatedTestView) MdwPlugin.getActivePage()
                        .showView("mdw.views.launch.automatedTest");
                return !testView.isLocked();
            } catch (PartInitException ex) {
                PluginMessages.uiError(ex, "Menu", workflowElement.getProject());
            }
        }

        return false;
    }

    public boolean runFromPageApplies(IStructuredSelection selection) {

        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement workflowElement = (WorkflowElement) selection.getFirstElement();

        if (workflowElement instanceof WorkflowProcess)
            return workflowElement.isUserAuthorized(UserRoleVO.PROCESS_EXECUTION);

        return false;
    }

    public boolean debugApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowElement))
            return false;

        WorkflowElement workflowElement = (WorkflowElement) selection.getFirstElement();

        if (workflowElement instanceof AutomatedTestSuite || workflowElement instanceof AutomatedTestCase) {
            WorkflowProject prj = workflowElement.getProject();
            if (prj == null || !prj.checkRequiredVersion(6, 0)
                    || !prj.isUserAuthorizedInAnyGroup(UserRoleVO.PROCESS_EXECUTION))
                return false;
            WorkflowPackage pkg = workflowElement.getPackage();
            if (pkg != null && !pkg.isUserAuthorized(UserRoleVO.PROCESS_EXECUTION))
                return false;
            try {
                AutomatedTestView testView = (AutomatedTestView) MdwPlugin.getActivePage()
                        .showView("mdw.views.launch.automatedTest");
                return !testView.isLocked();
            } catch (PartInitException ex) {
                PluginMessages.uiError(ex, "Menu", workflowElement.getProject());
            }
        }

        if (workflowElement instanceof WorkflowProcess || workflowElement instanceof ExternalEvent)
            return !MdwPlugin.isRcp() && workflowElement.isUserAuthorized(UserRoleVO.PROCESS_EXECUTION);
        else
            return false;
    }

    public boolean showInstancesApplies(IStructuredSelection selection) {
        return selection.size() == 1 && selection.getFirstElement() instanceof WorkflowProcess;
    }

    public boolean myTasksApplies(IStructuredSelection selection) {
        return selection.size() == 1 && selection.getFirstElement() instanceof WorkflowProject;
    }

    public boolean searchApplies(IStructuredSelection selection) {
        return selection.size() == 1 && (selection.getFirstElement() instanceof WorkflowProject
                || selection.getFirstElement() instanceof WorkflowPackage);
    }

    public boolean findCallersApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowProcess))
            return false;
        WorkflowProject project = ((WorkflowProcess) selection.getFirstElement()).getProject();
        return project.isPureMdw52();
    }

    public boolean showProcessHierarchyApplies(IStructuredSelection selection) {
        if (selection.size() != 1 || !(selection.getFirstElement() instanceof WorkflowProcess))
            return false;
        WorkflowProject project = ((WorkflowProcess) selection.getFirstElement()).getProject();
        return project.isFilePersist(); // otherwise it's too slow
    }

    public boolean createApplies(Class<? extends WorkflowElement> elementClass, IStructuredSelection selection) {
        if (selection.size() > 1)
            return false;

        if (WorkflowProject.class.equals(elementClass) || WorkflowElement.class.equals(elementClass))
            return true; // create a new local project

        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof WorkflowElement) {
                WorkflowElement workflowElement = (WorkflowElement) selection.getFirstElement();
                if (!workflowElement.getProject().isUserAuthorizedInAnyGroup(UserRoleVO.PROCESS_DESIGN))
                    return false;
            }
            return true;
        }

        return false;
    }

    public boolean openApplies(IStructuredSelection selection) {
        return true; // open is always applicable
    }

    public boolean refreshApplies(IStructuredSelection selection) {
        if (selection.size() == 1 && selection.getFirstElement() instanceof WorkflowProject)
            return true;

        if (selection.size() == 1 && (selection.getFirstElement() instanceof AutomatedTestSuite
                || selection.getFirstElement() instanceof AutomatedTestCase))
            return true;

        return false;
    }

    public boolean updateApplies(IStructuredSelection selection) {
        if (selection.size() == 1 && selection.getFirstElement() instanceof WorkflowPackage) {
            WorkflowPackage pkgVersion = (WorkflowPackage) selection.getFirstElement();
            return !pkgVersion.isArchived() && !pkgVersion.isDefaultPackage();
        }

        return false;
    }

    public boolean webLaunchApplies(IStructuredSelection selection) {
        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof WorkflowProject)
                return true;
            else if (selection.getFirstElement() instanceof WorkflowPackage) {
                WorkflowPackage packageVersion = (WorkflowPackage) selection.getFirstElement();
                return packageVersion.getProject().checkRequiredVersion(5, 1);
            }
        }

        return false;
    }

    public boolean serverActionApplies(IStructuredSelection selection) {
        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof WorkflowProject) {
                WorkflowProject project = (WorkflowProject) selection.getFirstElement();
                if (project.isUserAuthorizedForSystemAdmin()
                        || project.isUserAuthorizedInAnyGroup(UserRoleVO.PROCESS_EXECUTION))
                    return true;
            }
        }
        return false;
    }

    public boolean swingLaunchApplies(IStructuredSelection selection) {
        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof WorkflowProject)
                return true;
        }
        return false;
    }

    public boolean newMenuApplies(IStructuredSelection selection) {
        if (selection.size() == 0) {
            return true; // need to be able to create new workflow projects
        } else if (selection.size() == 1 && selection.getFirstElement() instanceof WorkflowElement) {
            WorkflowElement element = (WorkflowElement) selection.getFirstElement();
            if (element.isArchived())
                return false;
            else if (element instanceof Folder)
                return false;
            else if (element instanceof AutomatedTestSuite)
                return false;
            else if (element instanceof AutomatedTestCase)
                return !((AutomatedTestCase) element).isLegacy();
            else if (element instanceof LegacyExpectedResults)
                return false;
            else if (element instanceof File)
                return false;
            else
                return true;
        }
        return false;
    }

    public boolean importMenuApplies(IStructuredSelection selection) {
        if (selection.size() == 0) {
            return true; // need to be able to import workflow projects
        } else if (selection.size() == 1 && selection.getFirstElement() instanceof WorkflowElement) {
            WorkflowElement element = (WorkflowElement) selection.getFirstElement();
            if (element.isArchived())
                return false;
            else if (element instanceof Folder)
                return false;
            else if (element instanceof AutomatedTestSuite)
                return false;
            else if (element instanceof AutomatedTestCase)
                return !((AutomatedTestCase) element).isLegacy();
            else if (element instanceof LegacyExpectedResults)
                return false;
            else if (element instanceof File)
                return false;
            else
                return true;
        }
        return false;
    }

    public boolean formatMenuApplies(IStructuredSelection selection) {
        return formatFunctionTestResultsApplies(selection) || formatLoadTestResultsApplies(selection);
    }

    public boolean formatFunctionTestResultsApplies(IStructuredSelection selection) {
        // enablement is governed by existance of test results
        return selection.size() == 1 && selection.getFirstElement() instanceof WorkflowProject;
    }

    public boolean formatLoadTestResultsApplies(IStructuredSelection selection) {
        // enablement is governed by existance of test results
        return selection.size() == 1 && selection.getFirstElement() instanceof WorkflowProject;
    }

    public boolean testApplies(IStructuredSelection selection) {
        return selection.size() == 1 && selection.getFirstElement() instanceof WorkflowProject;
    }

    public boolean compareResultsApplies(IStructuredSelection selection) {
        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof AutomatedTestResults) {
                AutomatedTestResults expectedResults = (AutomatedTestResults) selection.getFirstElement();
                return expectedResults.getActualResults().exists();
            } else if (selection.getFirstElement() instanceof LegacyExpectedResults) {
                LegacyExpectedResults expectedResult = (LegacyExpectedResults) selection.getFirstElement();
                return expectedResult.getActualResult().exists();
            }
        }
        return false;
    }

    public boolean openInstanceApplies(IStructuredSelection selection) {
        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof AutomatedTestResults) {
                AutomatedTestResults expectedResults = (AutomatedTestResults) selection.getFirstElement();
                return expectedResults.getActualResults().exists();
            } else if (selection.getFirstElement() instanceof LegacyExpectedResults) {
                LegacyExpectedResults expectedResult = (LegacyExpectedResults) selection.getFirstElement();
                return expectedResult.getActualResult().exists();
            }
        }
        return false;
    }

    public boolean unlockApplies(IStructuredSelection selection) {
        if (selection.size() == 1) {
            if (selection.getFirstElement() instanceof WorkflowProject) {
                WorkflowProject workflowProject = (WorkflowProject) selection.getFirstElement();
                return workflowProject.isFilePersist() && workflowProject.isRemote();
            }
        }
        return false;
    }

    @SuppressWarnings("restriction")
    class ResultsCompareAction extends org.eclipse.compare.internal.CompareAction {
        public ResultsCompareAction(ISelection selection) {
            // prime the pump
            super.isEnabled(selection);
            setActivePart(compareResultsAction, view.getViewSite().getPart());
        }
    }

    private WorkflowElement[] selectionToElementArray(IStructuredSelection selection) {
        Object[] items = selection.toArray();
        WorkflowElement[] elements = new WorkflowElement[items.length];
        for (int i = 0; i < items.length; i++)
            elements[i] = (WorkflowElement) items[i];
        return elements;
    }
}