testlink.eclipse.plugin.views.TestLinkView.java Source code

Java tutorial

Introduction

Here is the source code for testlink.eclipse.plugin.views.TestLinkView.java

Source

/*
 * Daniel R Padilla
 *
 * Copyright (c) 2009, Daniel R Padilla
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package testlink.eclipse.plugin.views;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;

import testlink.eclipse.plugin.UserMsg;
import testlink.eclipse.plugin.preferences.TestLinkPreferences;
import testlink.eclipse.plugin.views.tree.TestLinkTree;
import testlink.eclipse.plugin.views.tree.ViewContentProvider;
import testlink.eclipse.plugin.views.tree.ViewLabelProvider;

/**
 * Add documentation here
 */

public class TestLinkView extends ViewPart {
    // Singletons
    public static TestLinkTree testLinkTree;
    public static TreeViewer viewer;

    // locals
    private DrillDownAdapter drillDownAdapter;
    private Action doubleClickAction;
    private TestLinkActions testPlanActions = new TestLinkActions();

    class NameSorter extends ViewerSorter {
    }

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

    /**
     * This is a callback that will allow us
     * to create the viewer and initialize it.
     */
    public void createPartControl(Composite parent) {
        UserMsg.shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
        createTreeView(parent);
    }

    public void createTreeView(Composite parent) {
        try {
            // Initialize view
            viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

            // Setup user message display
            UserMsg.shell = viewer.getControl().getShell();

            // Setup preferences (This should be only preference to constructor in project)
            TestLinkPreferences prefs = new TestLinkPreferences();

            // Setup adapter
            drillDownAdapter = new DrillDownAdapter(viewer);
            testLinkTree = new TestLinkTree(prefs);

            // Setup content provider
            ViewContentProvider contentProvider = null;
            contentProvider = new ViewContentProvider(getViewSite(), testLinkTree.getInvisibleRoot());

            viewer.setContentProvider(contentProvider);

            // Setup label provider
            ViewLabelProvider labelProvider = new ViewLabelProvider(this.getConfigurationElement());
            viewer.setLabelProvider(labelProvider);

            // Complete tree setup
            // viewer.setSorter(new NameSorter());
            viewer.setInput(getViewSite());

            // Create actions
            testPlanActions.makeActions(labelProvider);

            // Create double click action
            doubleClickAction = new TestLinkAction(labelProvider, TestLinkAction.DOUBLE_CLICK,
                    "Get information about the node.");

            // Assign actions
            hookContextMenu(viewer);
            hookDoubleClickAction();
            contributeToActionBars();
        } catch (Exception e) {
            UserMsg.error(e, "Failed to create the TestLink view.");
        }
    }

    public static void refresh() {
        try {
            Display display = Display.getDefault();
            display.syncExec(new Runnable() {
                public void run() {
                    Object[] expanded = viewer.getExpandedElements();
                    viewer.refresh();
                    viewer.setExpandedElements(expanded);
                }
            });
        } catch (Exception e) {
        }
    }

    public static void update(Object element) {
        try {
            if (element != null) {
                viewer.update(element, null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void refresh(Object element) {
        try {
            if (element != null) {
                viewer.refresh(element, true);
                viewer.setExpandedState(element, true);

                // Stumbled across this way of making the tree finally refresh during a test
                // TODO: Need to figure how to get the test to refresh in an expanded way
                // much like the junit plugin
                viewer.collapseToLevel(element, TreeViewer.ALL_LEVELS);
                viewer.expandToLevel(element, TreeViewer.ALL_LEVELS);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * Private methods
     */
    private void hookContextMenu(TreeViewer viewer) {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        final TreeViewer v = viewer;
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {

                /*
                 * Using the selection is a way to decide what we want
                 * filled in as actions on the menu.
                 */
                IStructuredSelection selection = (IStructuredSelection) v.getSelection();

                Object node = null;
                if (selection != null) {
                    node = selection.getFirstElement();
                }

                TestLinkView.this.testPlanActions.fillContextMenu(node, drillDownAdapter, manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);

        IWorkbenchPartSite site = getSite();
        site.registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IViewSite site = getViewSite();
        IActionBars bars = site.getActionBars();
        testPlanActions.fillLocalPullDown(bars.getMenuManager());
        testPlanActions.fillLocalToolBar(drillDownAdapter, bars.getToolBarManager());
    }

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

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