trace/tracebuilder/com.nokia.tracebuilder.view/src/com/nokia/tracebuilder/view/TraceView.java
/*
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
* Trace Builder view implementation
*
*/
package com.nokia.tracebuilder.view;
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.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
import com.nokia.carbide.cpp.internal.featureTracker.FeatureUseTrackerConsts;
import com.nokia.carbide.cpp.internal.featureTracker.FeatureUseTrackerPlugin;
import com.nokia.tracebuilder.action.ActionFactory;
import com.nokia.tracebuilder.action.TraceViewActions;
import com.nokia.tracebuilder.engine.TraceBuilderActions;
import com.nokia.tracebuilder.engine.TraceBuilderConfiguration;
import com.nokia.tracebuilder.engine.TraceBuilderDialogs;
import com.nokia.tracebuilder.engine.TraceBuilderGlobals;
import com.nokia.tracebuilder.engine.TraceBuilderView;
import com.nokia.tracebuilder.engine.TraceLocation;
import com.nokia.tracebuilder.engine.TraceObjectPropertyDialog;
import com.nokia.tracebuilder.model.TraceObject;
import com.nokia.tracebuilder.preferences.ConfigurationImpl;
/**
* Trace Builder view implementation
*
*/
public final class TraceView extends ViewPart implements TraceBuilderView {
/**
* Trace Groups branch text
*/
private static final String TRACE_GROUPS_BRANCH_TEXT = "Trace Groups"; //$NON-NLS-1$
/**
* Tree viewer widget
*/
private TreeViewer viewer;
/**
* Tree view selection listener
*/
private TraceViewSelectionListener selectionListener;
/**
* Tree view expansion listener
*/
private TraceViewTreeListener treeListener;
/**
* Dialog interface implementation
*/
private TraceViewDialogs dialogs;
/**
* Action factory
*/
private TraceViewActions actions;
/**
* Configuration
*/
private TraceBuilderConfiguration configuration;
/**
* Help listener
*/
private TraceViewHelpListener helpListener;
/**
* Property dialog properties
*/
private PropertyDialogProperties propertyDialog;
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets
* .Composite)
*/
@Override
public void createPartControl(Composite parent) {
actions = new ActionFactory();
configuration = new ConfigurationImpl();
selectionListener = new TraceViewSelectionListener(actions);
// Creates the tree viewer
viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL
| SWT.V_SCROLL);
TraceContentProvider contentProvider = new TraceContentProvider();
TraceLabelProvider labelProvider = new TraceLabelProvider();
TraceNameSorter nameSorter = new TraceNameSorter();
viewer.setContentProvider(contentProvider);
viewer.setLabelProvider(labelProvider);
viewer.setSorter(nameSorter);
// Content provider creates the viewer updater. The updater needs the
// display reference in order to create asynchronous callbacks to the UI
// thread.
viewer.setInput(getViewSite().getShell().getDisplay());
treeListener = new TraceViewTreeListener(viewer);
helpListener = new TraceViewHelpListener();
viewer.addSelectionChangedListener(selectionListener);
viewer.addDoubleClickListener(selectionListener);
viewer.addHelpListener(helpListener);
viewer.addTreeListener(treeListener);
// Hooks actions to menus
hookContextMenu();
fillMenuAndToolBar();
// Start using feature
FeatureUseTrackerPlugin.getFeatureUseProxy().startUsingFeature(
FeatureUseTrackerConsts.CARBIDE_OST_TRACE);
// Sets the view reference to trace builder engine
TraceBuilderGlobals.setView(this);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
@Override
public void dispose() {
TraceBuilderGlobals.setView(null);
viewer.removeTreeListener(treeListener);
viewer.removeSelectionChangedListener(selectionListener);
viewer.removeHelpListener(helpListener);
// Stop using feature
FeatureUseTrackerPlugin.getFeatureUseProxy().stopUsingFeature(
FeatureUseTrackerConsts.CARBIDE_OST_TRACE);
super.dispose();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#hasFocus()
*/
public boolean hasFocus() {
return viewer.getControl().isFocusControl();
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#
* selectObject(com.nokia.tracebuilder.model.TraceObject)
*/
public void selectObject(TraceObject object) {
TraceObjectWrapper wrapper = object
.getExtension(TraceObjectWrapper.class);
// Wrapper is null if user makes a selection before view is updated
if (wrapper != null) {
revealSelectedObject(wrapper);
actions.enableActions(object);
}
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#
* selectLocation(com.nokia.tracebuilder.engine.TraceLocation)
*/
public void selectLocation(TraceLocation location) {
TraceLocationWrapper wrapper = (TraceLocationWrapper) location
.getProperties().getViewReference();
// Wrapper is null if user makes a selection before view is updated
if (wrapper != null) {
revealSelectedObject(wrapper);
actions.enableActions(location);
}
}
/**
* Reveals the given wrapper
*
* @param wrapper
* the wrapper to be revealed
*/
private void revealSelectedObject(WrapperBase wrapper) {
ListWrapper parent = (ListWrapper) wrapper.getParent();
WrapperBase updated = parent.moveChildToView(wrapper);
if (updated != null) {
viewer.removeSelectionChangedListener(selectionListener);
updated.getUpdater().update(updated);
viewer.addSelectionChangedListener(selectionListener);
}
wrapper.getUpdater().queueSelection(wrapper);
}
/**
* Gets the view shell
*
* @return the shell of the tree viewer
*/
Shell getShell() {
Shell retval = null;
if (viewer != null) {
retval = viewer.getControl().getShell();
if (retval != null && retval.isDisposed()) {
retval = null;
}
}
return retval;
}
/**
* Adds menu listener to popup menu
*/
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
/**
* Adds action items to menu and toolbar
*/
private void fillMenuAndToolBar() {
IActionBars bars = getViewSite().getActionBars();
fillMenu(bars.getMenuManager());
fillToolBar(bars.getToolBarManager());
}
/**
* Adds menu items to view pull-down menu
*
* @param manager
* the menu to be filled
*/
private void fillMenu(IMenuManager manager) {
actions.fillMenu(manager);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/**
* Adds actions to tool bar
*
* @param manager
* the tool bar
*/
private void fillToolBar(IToolBarManager manager) {
actions.fillToolBar(manager);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/**
* Called prior to showing the context menu
*
* @param manager
* the menu to be filled
*/
private void fillContextMenu(IMenuManager manager) {
actions.fillContextMenu(manager);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#getDialogs()
*/
public TraceBuilderDialogs getDialogs() {
if (dialogs == null) {
dialogs = new TraceViewDialogs(this);
}
return dialogs;
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#getPropertyDialog()
*/
public TraceObjectPropertyDialog getPropertyDialog() {
if (propertyDialog == null) {
propertyDialog = new PropertyDialogProperties(this);
}
return propertyDialog;
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#getActions()
*/
public TraceBuilderActions getActions() {
return actions;
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#getConfiguration()
*/
public TraceBuilderConfiguration getConfiguration() {
return configuration;
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView#
* runAsyncOperation(java.lang.Runnable)
*/
public void runAsyncOperation(Runnable runnable) {
Shell shell = getShell();
if (shell != null) {
shell.getDisplay().asyncExec(runnable);
}
}
/*
* (non-Javadoc)
*
* @see com.nokia.tracebuilder.engine.TraceBuilderView# refresh()
*/
public void refresh() {
viewer.refresh();
}
/*
* (non-Javadoc)
*
* @see
* com.nokia.tracebuilder.engine.TraceBuilderView#expandTraceGroupsBranch()
*/
public void expandTraceGroupsBranch() {
TreeItem[] items = viewer.getTree().getItems();
if (items != null) {
for (TreeItem item : items) {
if (item.getText().equals(TRACE_GROUPS_BRANCH_TEXT)) {
item.setExpanded(true);
break;
}
}
}
}
}