trace/tracebuilder/com.nokia.tracebuilder.view/src/com/nokia/tracebuilder/view/TraceView.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 10 ed1c9f64298a
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.4.0

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