ca.uvic.chisel.javasketch.ui.internal.views.TraceNavigator.java Source code

Java tutorial

Introduction

Here is the source code for ca.uvic.chisel.javasketch.ui.internal.views.TraceNavigator.java

Source

/*******************************************************************************
 * Copyright (c) 2009 the CHISEL group and contributors. 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: Del Myers - initial API and implementation
 *******************************************************************************/
package ca.uvic.chisel.javasketch.ui.internal.views;

import org.eclipse.core.commands.common.CommandException;
import org.eclipse.core.resources.ResourcesPlugin;
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.action.Separator;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.navigator.ICommonMenuConstants;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;

import ca.uvic.chisel.javasketch.IProgramSketch;
import ca.uvic.chisel.javasketch.SketchPlugin;
import ca.uvic.chisel.javasketch.data.model.IThread;
import ca.uvic.chisel.javasketch.ui.internal.SketchUI;
import ca.uvic.chisel.javasketch.ui.internal.presentation.commands.ToggleSketchActivationHandler;

/**
 * A subclass of the Common Navigator, which creates a tree viewer with columns.
 * 
 * @author Del Myers
 * 
 */
public class TraceNavigator extends ViewPart implements ITabbedPropertySheetPageContributor {

    public static final String VIEW_ID = "ca.uvic.chisel.javasketch.views.traces";
    protected static final int VISIBLE_TRACE_COLUMN = 2;
    protected static final int ACTIVE_TRACE_COLUMN = 1;
    protected static final int LABEL_COLUMN = 0;

    private EmptyThreadFilter threadFilter = new EmptyThreadFilter();

    private class TreeMouseListener extends MouseAdapter {

        /*
         * (non-Javadoc)
         * @see
         * org.eclipse.swt.events.MouseAdapter#mouseDoubleClick(org.eclipse.
         * swt.events.MouseEvent)
         */
        @Override
        public void mouseDoubleClick(MouseEvent e) {
            if (e.button == 1) {
                ViewerCell cell = viewer.getCell(new Point(e.x, e.y));
                if (cell != null) {
                    handleDoubleClick(cell, e);
                }
            }
        }

        /*
         * (non-Javadoc)
         * @see
         * org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events
         * .MouseEvent)
         */
        @Override
        public void mouseUp(MouseEvent e) {
            if (e.button == 1) {
                IHandlerService service = (IHandlerService) SketchPlugin.getDefault().getWorkbench()
                        .getService(IHandlerService.class);
                if (service == null)
                    return;
                ViewerCell cell = viewer.getCell(new Point(e.x, e.y));
                if (cell == null)
                    return;
                if (cell.getElement() instanceof IProgramSketch) {
                    if (cell != null) {
                        try {
                            Event event = new Event();
                            event.button = e.button;
                            event.x = e.x;
                            event.y = e.y;
                            event.display = e.display;
                            event.data = e.data;
                            event.widget = e.widget;
                            if (cell.getColumnIndex() == ACTIVE_TRACE_COLUMN) {
                                if (cell.getElement() instanceof IProgramSketch) {
                                    service.executeCommand(ToggleSketchActivationHandler.COMMAND_ID, event);
                                }
                            } else if (cell.getColumnIndex() == VISIBLE_TRACE_COLUMN) {
                                service.executeCommand(ToggleSketchFilteredHandler.COMMAND_ID, event);
                            }
                        } catch (CommandException ex) {
                            SketchPlugin.getDefault().log(ex);
                        }
                    }
                }
            }
        }
    }

    private TreeViewer viewer;
    // TraceViewerActions actions = new TraceViewerActions();
    private MouseListener treeMouseListener = new TreeMouseListener();

    /*
     * (non-Javadoc)
     * @see
     * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
     * .Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        viewer.setUseHashlookup(true);
        // TreeViewerColumn plusColumn = new TreeViewerColumn(viewer, SWT.NONE,
        // 0);
        // plusColumn.getColumn().setWidth(60);
        final TreeViewerColumn labelColumn = new TreeViewerColumn(viewer, SWT.NONE, LABEL_COLUMN);
        labelColumn.getColumn().setWidth(100);
        TreeViewerColumn activeTraceColumn = new TreeViewerColumn(viewer, SWT.NONE, ACTIVE_TRACE_COLUMN);
        activeTraceColumn.getColumn().setWidth(16);
        TreeViewerColumn visibleTraceColumn = new TreeViewerColumn(viewer, SWT.NONE, VISIBLE_TRACE_COLUMN);
        visibleTraceColumn.getColumn().setWidth(16);
        viewer.getTree().addMouseListener(treeMouseListener);

        viewer.getTree().addControlListener(new ControlAdapter() {
            /*
             * (non-Javadoc)
             * @see
             * org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse
             * .swt.events.ControlEvent)
             */
            @Override
            public void controlResized(ControlEvent e) {
                Composite composite = (Composite) e.widget;
                Rectangle b = composite.getBounds();
                ScrollBar scrollbar = composite.getVerticalBar();
                int width = b.width - 32;
                if (scrollbar != null && scrollbar.getVisible()) {
                    width -= 20;
                }
                labelColumn.getColumn().setWidth(Math.max(0, width));
            }
        });
        viewer.setContentProvider(new TraceNavigatorContentProvider());
        viewer.setLabelProvider(new TraceNavigatorLabelProvider());
        viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object o = selection.getFirstElement();
                if (o instanceof IThread) {
                    SketchPlugin.getDefault().getDOI().setThreadSelection((IThread) o);
                } else {
                    SketchPlugin.getDefault().getDOI().setThreadSelection(null);
                }
                SketchUI.INSTANCE.refreshJavaUI();
            }
        });
        createContextMenu(viewer.getControl());
        getSite().setSelectionProvider(viewer);
        IMenuManager manager = getViewSite().getActionBars().getMenuManager();
        Action toggleFilterAction = new Action("Filter Empty Threads", SWT.CHECK) {
            /* (non-Javadoc)
             * @see org.eclipse.jface.action.Action#run()
             */
            @Override
            public void run() {
                IPreferenceStore store = SketchPlugin.getDefault().getPreferenceStore();
                boolean checked = store.getBoolean("tracenavigator.filter.emptythread");
                if (checked) {
                    //uncheck
                    viewer.removeFilter(threadFilter);
                } else {
                    viewer.addFilter(threadFilter);
                }
                store.setValue("tracenavigator.filter.emptythread", !checked);
                viewer.refresh();
            }
        };
        IPreferenceStore store = SketchPlugin.getDefault().getPreferenceStore();
        boolean checked = true;
        if (!store.contains("tracenavigator.filter.emptythread")) {
            store.setValue("tracenavigator.filter.emptythread", true);
        } else {
            checked = store.getBoolean("tracenavigator.filter.emptythread");
        }
        toggleFilterAction.setChecked(checked);
        if (checked) {
            viewer.addFilter(threadFilter);
        }
        manager.add(toggleFilterAction);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
    }

    /**
     * @param cell
     * @param data
     */
    public void handleDoubleClick(ViewerCell cell, MouseEvent event) {
        IHandlerService hs = (IHandlerService) SketchPlugin.getDefault().getWorkbench()
                .getService(IHandlerService.class);
        if (cell != null) {
            if (cell.getElement() instanceof IThread) {
                if (hs != null) {
                    try {
                        Event e = new Event();
                        e.button = event.button;
                        e.x = event.x;
                        e.y = event.y;
                        e.type = SWT.MouseDoubleClick;
                        e.data = event.data;
                        hs.executeCommand(OpenIThreadCommandHandler.COMMAND_ID, e);

                    } catch (CommandException ex) {
                        SketchPlugin.getDefault().log(ex);
                    }
                }
            } else {
                viewer.setExpandedState(cell.getElement(), !viewer.getExpandedState(cell.getElement()));
            }
        }
    }

    /**
     * @param control
     */
    private void createContextMenu(Control control) {
        MenuManager manager = new MenuManager("#PopUp");
        manager.setRemoveAllWhenShown(true);
        manager.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager manager) {
                fillContextMenu(manager);
            }
        });
        control.setMenu(manager.createContextMenu(control));
        getViewSite().registerContextMenu(manager, viewer);
    }

    protected void fillContextMenu(IMenuManager manager) {
        // actions will be added using commands
        manager.add(new Separator(ICommonMenuConstants.GROUP_OPEN));
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    @Override
    public void setFocus() {
    }

    /**
     * @return
     */
    public TreeViewer getTreeViewer() {
        return viewer;
    }

    /*
     * (non-Javadoc)
     * @see
     * org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor
     * #getContributorId()
     */
    @Override
    public String getContributorId() {
        return "ca.uvic.chisel.javasketch.modelProperties";
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
     */
    @SuppressWarnings("unchecked")
    @Override
    public Object getAdapter(Class adapter) {
        if (IPropertySheetPage.class.equals(adapter)) {
            return new TabbedPropertySheetPage(this);
        }
        return super.getAdapter(adapter);
    }

}