org.eclipse.ptp.remotetools.environment.ui.views.RemoteToolsEnvironmentView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ptp.remotetools.environment.ui.views.RemoteToolsEnvironmentView.java

Source

/**
 * Copyright (c) 2006 IBM Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - Initial Implementation
 *
 */
package org.eclipse.ptp.remotetools.environment.ui.views;

import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.ptp.remotetools.environment.EnvironmentPlugin;
import org.eclipse.ptp.remotetools.environment.control.ITargetControl;
import org.eclipse.ptp.remotetools.environment.core.ITargetElement;
import org.eclipse.ptp.remotetools.environment.core.ITargetElementStatus;
import org.eclipse.ptp.remotetools.environment.core.ITargetEnvironmentEventListener;
import org.eclipse.ptp.remotetools.environment.core.ITargetEventListener;
import org.eclipse.ptp.remotetools.environment.core.TargetElement;
import org.eclipse.ptp.remotetools.environment.core.TargetEnvironmentManager;
import org.eclipse.ptp.remotetools.environment.core.TargetTypeElement;
import org.eclipse.ptp.remotetools.environment.extension.INode;
import org.eclipse.ptp.remotetools.environment.ui.UIEnvironmentPlugin;
import org.eclipse.ptp.remotetools.environment.ui.messages.Messages;
import org.eclipse.ptp.remotetools.environment.wizard.EnvironmentWizard;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.part.ViewPart;

/**
 * 
 * The view uses a label provider to define how model objects should be
 * presented in the view. Each view can present the same model objects using
 * different labels and icons, if needed. Alternatively, a single label provider
 * can be shared between views in order to ensure that objects of the same type
 * are presented in the same way everywhere.
 * <p>
 * 
 * @author Ricardo M. Matinata
 * @since 1.1
 */

public class RemoteToolsEnvironmentView extends ViewPart
        implements ISelectionChangedListener, ITargetEventListener {

    private TreeViewer viewer;
    private Action startAction;
    private Action stopAction;
    private Action resumeAction;
    private Action pauseAction;
    private Action createAction;
    private Action editAction;
    private Action removeAction;
    private Action doubleClickAction;

    private List<Action> workloadControllers = new ArrayList<Action>();
    // Set the table column property names
    private final String ENVIRONMENT_CONTROL_NAME = Messages.RemoteToolsEnvironmentView_0;
    private final String ENVIRONMENT_CONTROL_STATUS = Messages.RemoteToolsEnvironmentView_1;

    // Set column names
    private final String[] columnNames = new String[] { ENVIRONMENT_CONTROL_NAME, ENVIRONMENT_CONTROL_STATUS };

    // Model
    private final TargetEnvironmentManager model = EnvironmentPlugin.getDefault().getTargetsManager();
    private ITargetElement currentElement = null;

    private final ITargetEnvironmentEventListener eventListener = new ITargetEnvironmentEventListener() {
        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.ptp.remotetools.environment.core.
         * ITargetEnvironmentEventListener
         * #elementAdded(org.eclipse.ptp.remotetools
         * .environment.core.TargetElement)
         */
        public void elementAdded(TargetElement element) {
            refresh();
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.ptp.remotetools.environment.core.
         * ITargetEnvironmentEventListener
         * #elementRemoved(org.eclipse.ptp.remotetools
         * .environment.core.ITargetElement)
         */
        public void elementRemoved(ITargetElement element) {
            refresh();
        }
    };

    /*
     * The content provider class is responsible for providing objects to the
     * view. It can wrap existing objects in adapters or simply return objects
     * as-is. These objects may be sensitive to the current input of the view,
     * or ignore it and always show the same content (like Task List, for
     * example).
     */

    private class ViewContentProvider implements ITreeContentProvider {
        private final Object[] EMPTY = new Object[] {};

        /**
         * Gets the children for a TargetEnvironmentTypeElement or
         * TargetEnvironmentConfigElement
         * 
         * @param element
         *            the TargetEnvironmentTypeElement or
         *            TargetEnvironmentConfigElement
         * @return Object[]
         */
        public Object[] getChildren(Object element) {
            if (element instanceof TargetTypeElement) {
                return ((TargetTypeElement) element).getElements().toArray();
            } else if (element instanceof ITargetElement) {
                // gets the children of ITargetElement
                return EnvironmentPlugin.getDefault().getChildrenProviderManager()
                        .getChildren((ITargetElement) element);
            } else if (element instanceof INode) {
                return ((INode) element).getChildren();
            }
            return EMPTY;
        }

        /**
         * Gets the parent TargetEnvironmentTypeElement for a
         * TargetEnvironmentConfigElement
         * 
         * @param arg0
         *            the TargetEnvironmentConfigElement
         * @return Object
         */
        public Object getParent(Object element) {
            if (element instanceof ITargetElement) {
                return ((ITargetElement) element).getType();
            } else if (element instanceof INode) {
                return ((INode) element).getParent();
            }
            return null;
        }

        /**
         * Gets whether this team or player has children
         * 
         * @param arg0
         *            the TargetEnvironmentTypeElement or
         *            TargetEnvironmentConfigElement
         * @return boolean
         */
        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }

        /**
         * Gets the elements for the table
         * 
         * @param arg0
         *            the model
         * @return Object[]
         */
        public Object[] getElements(Object element) {
            if (element instanceof Object[]) {
                return (Object[]) element;
            }
            return getChildren(element);
        }

        /**
         * Disposes any resources
         */
        public void dispose() {
        }

        /**
         * Called when the input changes
         * 
         * @param viewer
         *            the parent viewer
         * @param oldInput
         *            the old input
         * @param newInput
         *            the new input
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // Do nothing
        }
    }

    private class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
        private Image viewIcon;

        public String getColumnText(Object obj, int index) {
            String result = ""; //$NON-NLS-1$

            switch (index) {
            case 0:
                if (obj instanceof INode) {
                    result = ((INode) obj).getDisplayText();
                } else {
                    result = obj.toString();
                }
                break;
            case 1:
                if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                    int status = ((ITargetElement) obj).getStatus();

                    switch (status) {
                    case ITargetElementStatus.STARTED:
                        result = Messages.RemoteToolsEnvironmentView_3;
                        break;
                    case ITargetElementStatus.STOPPED:
                        result = Messages.RemoteToolsEnvironmentView_4;
                        break;
                    case ITargetElementStatus.RESUMED:
                        result = Messages.RemoteToolsEnvironmentView_5;
                        break;
                    case ITargetElementStatus.PAUSED:
                        result = Messages.RemoteToolsEnvironmentView_6;
                        break;
                    }

                }
                break;
            }
            return result;
        }

        public Image getColumnImage(Object obj, int index) {
            if (index == 0) {
                if (obj instanceof INode) {
                    return ((INode) obj).getIcon();
                } else {
                    return getImage(obj);
                }
            }
            return null;
        }

        @Override
        public Image getImage(Object obj) {
            if (TargetTypeElement.class.isAssignableFrom(obj.getClass())) {
                URL url = UIEnvironmentPlugin.getDefault().getBundle().getEntry("/icons/connect_create.gif"); //$NON-NLS-1$
                ImageDescriptor imageMonitorDescriptor = ImageDescriptor.createFromURL(url);
                viewIcon = imageMonitorDescriptor.createImage();
            } else if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                URL url = UIEnvironmentPlugin.getDefault().getBundle().getEntry("/icons/monitor_obj.gif"); //$NON-NLS-1$
                ImageDescriptor imageMonitorDescriptor = ImageDescriptor.createFromURL(url);
                viewIcon = imageMonitorDescriptor.createImage();
            }
            return viewIcon;
        }

        @Override
        public void dispose() {
            super.dispose();
            if (viewIcon != null) {
                viewIcon.dispose();
                viewIcon = null;
            }
        }
    }

    class NameSorter extends ViewerSorter {
    }

    /**
     * The constructor.
     */
    public RemoteToolsEnvironmentView() {
    }

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

        viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelProvider());
        viewer.setSorter(new NameSorter());
        defineTable(viewer);
        viewer.setColumnProperties(columnNames);
        // viewer.setInput(getViewSite());
        viewer.setInput(model.getTypeElements().toArray());
        viewer.refresh();
        getSite().setSelectionProvider(viewer);
        viewer.addSelectionChangedListener(this);
        workloadControllers = getWorkloadControllers();
        for (Action controller : workloadControllers) {
            if (controller instanceof ISelectionChangedListener) {
                viewer.addSelectionChangedListener((ISelectionChangedListener) controller);
            }
        }
        model.addModelEventListener(this);
        model.addModelChangedListener(eventListener);
        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();

        // Pack the window
        parent.pack();

        // Scroll to top
        viewer.reveal(viewer.getTree().getItem(0));
    }

    private void defineTable(TreeViewer viewer) {
        Tree t = viewer.getTree();
        t.setHeaderVisible(true);

        // 1st column with image/checkboxes - NOTE: The SWT.CENTER has no
        // effect!!
        TreeColumn column = new TreeColumn(t, SWT.LEFT, 0);
        column.setText(ENVIRONMENT_CONTROL_NAME);
        column.setWidth(650);

        // 2nd column with task Description
        column = new TreeColumn(t, SWT.RIGHT, 1);
        column.setText(ENVIRONMENT_CONTROL_STATUS);
        column.setWidth(50);

        viewer.expandAll();

        // Pack the columns
        /*
         * for (int i = 0, n = t.getColumnCount(); i < n; i++) {
         * t.getColumn(i).pack(); }
         */
        // Turn on the header and the lines
        t.setHeaderVisible(true);
        t.setLinesVisible(true);

    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj != null) {
                    if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                        // Edit
                        // Remove
                        createAction.setEnabled(false);

                        ITargetElement temp = (ITargetElement) obj;
                        if (temp.getStatus() == ITargetElementStatus.STOPPED) {
                            editAction.setEnabled(true);
                            removeAction.setEnabled(true);
                        } else {
                            editAction.setEnabled(false);
                            removeAction.setEnabled(false);
                        }
                        RemoteToolsEnvironmentView.this.fillContextMenu(manager);
                    } else if (TargetTypeElement.class.isAssignableFrom(obj.getClass())) {
                        // Create
                        createAction.setEnabled(true);
                        editAction.setEnabled(false);
                        removeAction.setEnabled(false);
                        RemoteToolsEnvironmentView.this.fillContextMenu(manager);
                    }
                }
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

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

    private void fillLocalPullDown(IMenuManager manager) {
        // manager.add(action1);
        // manager.add(new Separator());
        // manager.add(action2);
    }

    private void fillContextMenu(IMenuManager manager) {
        manager.add(createAction);
        manager.add(editAction);
        manager.add(removeAction);
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        // Other plug-ins can contribute there actions here
        for (Action controller : workloadControllers) {
            manager.add(controller);
        }

        manager.add(startAction);
        manager.add(stopAction);
        manager.add(resumeAction);
        manager.add(pauseAction);
    }

    @SuppressWarnings("unchecked")
    private List<Action> getWorkloadControllers() {

        List<Action> actions = new ArrayList<Action>();

        IExtensionRegistry registry = Platform.getExtensionRegistry();
        IExtensionPoint extensionPoint = registry
                .getExtensionPoint("org.eclipse.ptp.remotetools.environment.ui.workloadController"); //$NON-NLS-1$
        IExtension[] extensions = extensionPoint.getExtensions();

        try {
            for (int i = 0; i < extensions.length; i++) {
                IExtension extension = extensions[i];
                IConfigurationElement[] elements = extension.getConfigurationElements();
                for (int j = 0; j < elements.length; j++) {
                    IConfigurationElement element = elements[j];
                    if ("controllerDelegate".equals(element.getName())) { //$NON-NLS-1$
                        actions.add((Action) element.createExecutableExtension("class")); //$NON-NLS-1$
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return actions.isEmpty() ? (List<Action>) Collections.EMPTY_LIST : actions;
    }

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

    private void makeActions() {

        URL url = UIEnvironmentPlugin.getDefault().getBundle().getEntry("/icons/run_exc.gif"); //$NON-NLS-1$
        ImageDescriptor imageRun = ImageDescriptor.createFromURL(url);
        url = UIEnvironmentPlugin.getDefault().getBundle().getEntry("/icons/terminatedlaunch.gif"); //$NON-NLS-1$
        ImageDescriptor imageStop = ImageDescriptor.createFromURL(url);
        url = UIEnvironmentPlugin.getDefault().getBundle().getEntry("/icons/suspend.gif"); //$NON-NLS-1$
        ImageDescriptor imageSuspend = ImageDescriptor.createFromURL(url);
        url = UIEnvironmentPlugin.getDefault().getBundle().getEntry("/icons/resume.gif"); //$NON-NLS-1$
        ImageDescriptor imageResume = ImageDescriptor.createFromURL(url);

        IWorkbenchPartSite site = this.getSite();
        final Shell shell = site.getShell();

        final IJobChangeListener ijob = new IJobChangeListener() {

            public void aboutToRun(IJobChangeEvent event) {

            }

            public void awake(IJobChangeEvent event) {

            }

            public void done(IJobChangeEvent event) {
                refresh();
            }

            public void running(IJobChangeEvent event) {

            }

            public void scheduled(IJobChangeEvent event) {

            }

            public void sleeping(IJobChangeEvent event) {

            }
        };

        startAction = new Action() {
            @Override
            public void run() {
                ISelection selection = viewer.getSelection();
                final Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj != null) {
                    if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                        Job job = new Job(Messages.RemoteToolsEnvironmentView_17) {
                            @Override
                            protected IStatus run(IProgressMonitor monitor) {

                                startAction.setEnabled(false);
                                IStatus status = null;
                                ITargetElement element = null;
                                ITargetControl control = null;

                                try {
                                    element = (ITargetElement) obj;
                                    control = element.getControl();
                                    if (control.create(monitor)) {
                                        status = Status.OK_STATUS;
                                    }
                                } catch (CoreException e) {
                                    status = e.getStatus();
                                    startAction.setEnabled(true);
                                }

                                return status;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        job.addJobChangeListener(ijob);
                        return;
                    }
                }
                showMessage(Messages.RemoteToolsEnvironmentView_18, viewer);
            }
        };
        startAction.setText(Messages.RemoteToolsEnvironmentView_19);
        startAction.setToolTipText(Messages.RemoteToolsEnvironmentView_20);
        startAction.setImageDescriptor(imageRun);

        stopAction = new Action() {
            @Override
            public void run() {

                ISelection selection = viewer.getSelection();
                final Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj != null) {
                    if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                        Job job = new Job(Messages.RemoteToolsEnvironmentView_21) {
                            @Override
                            protected IStatus run(IProgressMonitor monitor) {

                                stopAction.setEnabled(false);
                                IStatus status = null;

                                try {
                                    ((ITargetElement) obj).getControl().kill();
                                    status = Status.OK_STATUS;
                                } catch (CoreException e) {
                                    status = e.getStatus();
                                    stopAction.setEnabled(true);
                                }

                                return status;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        job.addJobChangeListener(ijob);
                        return;
                    }
                }
                showMessage(Messages.RemoteToolsEnvironmentView_22, viewer);
            }
        };
        stopAction.setText(Messages.RemoteToolsEnvironmentView_23);
        stopAction.setToolTipText(Messages.RemoteToolsEnvironmentView_24);
        stopAction.setImageDescriptor(imageStop);

        // resume
        resumeAction = new Action() {
            @Override
            public void run() {

                ISelection selection = viewer.getSelection();
                final Object obj = ((IStructuredSelection) selection).getFirstElement();

                if (obj != null) {
                    if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                        Job job = new Job(Messages.RemoteToolsEnvironmentView_25) {
                            @Override
                            protected IStatus run(IProgressMonitor monitor) {

                                resumeAction.setEnabled(false);
                                IStatus status = null;

                                try {
                                    if (((ITargetElement) obj).getControl().resume(monitor)) {
                                        status = Status.OK_STATUS;
                                        pauseAction.setEnabled(true);
                                    }
                                } catch (CoreException e) {
                                    status = e.getStatus();
                                    resumeAction.setEnabled(true);
                                }

                                return status;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        job.addJobChangeListener(ijob);
                        return;
                    }
                }
                showMessage(Messages.RemoteToolsEnvironmentView_26, viewer);
            }
        };
        resumeAction.setText(Messages.RemoteToolsEnvironmentView_27);
        resumeAction.setToolTipText(Messages.RemoteToolsEnvironmentView_28);
        resumeAction.setImageDescriptor(imageResume);

        // stop
        pauseAction = new Action() {
            @Override
            public void run() {

                ISelection selection = viewer.getSelection();
                final Object obj = ((IStructuredSelection) selection).getFirstElement();

                if (obj != null) {
                    if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                        Job job = new Job(Messages.RemoteToolsEnvironmentView_29) {
                            @Override
                            protected IStatus run(IProgressMonitor monitor) {

                                pauseAction.setEnabled(false);
                                IStatus status = null;

                                try {
                                    if (((ITargetElement) obj).getControl().stop(monitor)) {
                                        status = Status.OK_STATUS;
                                        resumeAction.setEnabled(true);
                                    }
                                } catch (CoreException e) {
                                    status = e.getStatus();
                                    pauseAction.setEnabled(true);
                                }

                                return status;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        job.addJobChangeListener(ijob);
                        return;
                    }
                }
                showMessage(Messages.RemoteToolsEnvironmentView_30, viewer);
            }
        };
        pauseAction.setText(Messages.RemoteToolsEnvironmentView_31);
        pauseAction.setToolTipText(Messages.RemoteToolsEnvironmentView_32);
        pauseAction.setImageDescriptor(imageSuspend);

        // Create
        createAction = new Action() {
            @Override
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();

                if (TargetTypeElement.class.isAssignableFrom(obj.getClass())) {
                    EnvironmentWizard wizard = new EnvironmentWizard((TargetTypeElement) obj);
                    WizardDialog dialog = new WizardDialog(shell, wizard);
                    dialog.create();
                    dialog.setBlockOnOpen(true);
                    dialog.open();
                    /*
                     * refresh handled by ITargetEnvironmentEventListener
                     */
                }

            }
        };
        createAction.setText(Messages.RemoteToolsEnvironmentView_33);
        createAction.setToolTipText(Messages.RemoteToolsEnvironmentView_34);

        // Edit
        editAction = new Action() {
            @Override
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();

                if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                    EnvironmentWizard wizard = new EnvironmentWizard((ITargetElement) obj);
                    WizardDialog dialog = new WizardDialog(shell, wizard);
                    dialog.create();
                    dialog.setBlockOnOpen(true);
                    dialog.open();
                    refresh();
                }
            }
        };
        editAction.setText(Messages.RemoteToolsEnvironmentView_35);
        editAction.setToolTipText(Messages.RemoteToolsEnvironmentView_36);

        // Remove
        removeAction = new Action() {
            @Override
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();

                if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                    ITargetElement confElement = (ITargetElement) obj;
                    if (confElement.getStatus() != ITargetElementStatus.STARTED) {
                        if (showConfirm(Messages.RemoteToolsEnvironmentView_37, viewer)) {
                            confElement.getType().removeElement(confElement);
                            /*
                             * refresh handled by
                             * ITargetEnvironmentEventListener
                             */
                        }
                    } else {
                        showMessage(Messages.RemoteToolsEnvironmentView_38, viewer);
                    }
                }
            }
        };
        removeAction.setText(Messages.RemoteToolsEnvironmentView_39);
        removeAction.setToolTipText(Messages.RemoteToolsEnvironmentView_40);

        doubleClickAction = new Action() {
            @Override
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();

                if (TargetTypeElement.class.isAssignableFrom(obj.getClass())) {
                    if (viewer.getExpandedState(obj)) {
                        viewer.setExpandedState(obj, false);
                    } else {
                        viewer.setExpandedState(obj, true);
                    }

                }

                if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                    ITargetElement ele = (ITargetElement) obj;
                    try {
                        ITargetControl control = ele.getControl();
                        if (control.query() == ITargetElementStatus.STOPPED) {
                            editAction.run();
                        }
                    } catch (CoreException e) {
                        e.printStackTrace();
                    }
                }

                if (INode.class.isAssignableFrom(obj.getClass())) {
                    INode node = (INode) obj;
                    UIEnvironmentPlugin.getDefault().getDoubleClickHandlerManager().doubleClickExecute(node);
                }

                // showMessage("Double-click detected on "+obj.toString(),viewer);
            }
        };

        stopAction.setEnabled(false);
        resumeAction.setEnabled(false);
        pauseAction.setEnabled(false);
        createAction.setEnabled(false);
        editAction.setEnabled(false);
        removeAction.setEnabled(false);

    }

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

    private void showMessage(String message, TreeViewer viewer) {
        MessageDialog.openInformation(viewer.getControl().getShell(), Messages.RemoteToolsEnvironmentView_41,
                message);
    }

    private boolean showConfirm(String message, TreeViewer viewer) {
        return MessageDialog.openConfirm(viewer.getControl().getShell(), Messages.RemoteToolsEnvironmentView_42,
                message);
    }

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

    public void selectionChanged(SelectionChangedEvent event) {
        ISelection selection = event.getSelection();
        Object obj = ((IStructuredSelection) selection).getFirstElement();

        if (obj != null) {
            if (TargetElement.class.isAssignableFrom(obj.getClass())) {
                currentElement = (ITargetElement) obj;
                switch (currentElement.getStatus()) {
                case ITargetElementStatus.STARTED:
                    targetStarted(currentElement);
                    break;
                case ITargetElementStatus.STOPPED:
                    targetStopped(currentElement);
                    break;
                case ITargetElementStatus.RESUMED:
                    targetResumed(currentElement);
                    break;
                case ITargetElementStatus.PAUSED:
                    targetPaused(currentElement);
                    break;
                }
            } else {
                currentElement = null;
                startAction.setEnabled(false); // Create
                stopAction.setEnabled(false); // Kill
                resumeAction.setEnabled(false); // Resume
                pauseAction.setEnabled(false); // Pause
            }
        }
    }

    public void targetStarted(ITargetElement event) {

        if (event != null && currentElement != null) {
            if (event.equals(currentElement)) {
                startAction.setEnabled(false); // Create
                stopAction.setEnabled(true); // Kill
                resumeAction.setEnabled(true); // Resume
                pauseAction.setEnabled(false); // Pause
                editAction.setEnabled(false);
                removeAction.setEnabled(false);
            }
        }
        this.refresh();

    }

    public void targetStopped(ITargetElement event) {

        if (event != null && currentElement != null) {
            if (event.equals(currentElement)) {
                startAction.setEnabled(true); // Create
                stopAction.setEnabled(false); // Kill
                resumeAction.setEnabled(false); // Resume
                pauseAction.setEnabled(false); // Pause
                editAction.setEnabled(true);
                removeAction.setEnabled(true);
            }
        }
        this.refresh();

    }

    public void targetPaused(ITargetElement event) {

        if (event != null && currentElement != null) {
            if (event.equals(currentElement)) {
                startAction.setEnabled(false); // Create
                stopAction.setEnabled(true); // Kill
                resumeAction.setEnabled(true); // Resume
                pauseAction.setEnabled(false); // Pause

            }
        }
        this.refresh();

    }

    public void targetResumed(ITargetElement event) {

        if (event != null && currentElement != null) {
            if (event.equals(currentElement)) {
                startAction.setEnabled(false); // Create
                stopAction.setEnabled(true); // Kill
                resumeAction.setEnabled(false); // Resume
                pauseAction.setEnabled(true); // Pause

            }
        }
        this.refresh();

    }

    public void handleStateChangeEvent(int event, ITargetElement from) {

        switch (event) {
        case ITargetElementStatus.STARTED:
            targetStarted(from);
            break;
        case ITargetElementStatus.STOPPED:
            targetStopped(from);
            break;
        case ITargetElementStatus.RESUMED:
            targetResumed(from);
            break;
        case ITargetElementStatus.PAUSED:
            targetPaused(from);
            break;
        }

    }

    @Override
    public void dispose() {
        super.dispose();
        model.removeModelEventListener(this);
    }
}