Java tutorial
/******************************************************************************* * 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); } }