trace/traceviewer/com.nokia.trace.eventview/src/com/nokia/trace/eventview/TraceEventView.java
changeset 11 5b9d4d8641ce
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trace/traceviewer/com.nokia.trace.eventview/src/com/nokia/trace/eventview/TraceEventView.java	Wed Jun 23 14:49:59 2010 +0300
@@ -0,0 +1,451 @@
+/*
+ * Copyright (c) 2007-2010 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:
+ *
+ * Event view
+ *
+ */
+package com.nokia.trace.eventview;
+
+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.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+
+/**
+ * Event view. {@link #getEventList() getEventList} method is the access point
+ * for view extensions.
+ */
+public class TraceEventView extends ViewPart implements ContentChangeListener {
+
+	/**
+	 * Type column title
+	 */
+	private static final String TYPE_TITLE = Messages
+			.getString("TraceEventView.TypeColumnTitle"); //$NON-NLS-1$
+
+	/**
+	 * Category column title
+	 */
+	private static final String CATEGORY_TITLE = Messages
+			.getString("TraceEventView.CategoryColumnTitle"); //$NON-NLS-1$
+
+	/**
+	 * Source column title
+	 */
+	private static final String SOURCE_TITLE = Messages
+			.getString("TraceEventView.SourceColumnTitle"); //$NON-NLS-1$
+
+	/**
+	 * Description column title
+	 */
+	private static final String DESCRIPTION_TITLE = Messages
+			.getString("TraceEventView.DescriptionColumnTitle"); //$NON-NLS-1$
+
+	/**
+	 * Type width configuration entry
+	 */
+	private static final String TYPE_WIDTH_CONFIGURATION = "TraceEventView.TypeWidth"; //$NON-NLS-1$
+
+	/**
+	 * Category width configuration entry
+	 */
+	private static final String CATEGORY_WIDTH_CONFIGURATION = "TraceEventView.CategoryWidth"; //$NON-NLS-1$
+
+	/**
+	 * Source width configuration entry
+	 */
+	private static final String SOURCE_WIDTH_CONFIGURATION = "TraceEventView.SourceWidth"; //$NON-NLS-1$
+
+	/**
+	 * Description width configuration entry
+	 */
+	private static final String DESCRIPTION_WIDTH_CONFIGURATION = "TraceEventView.DescriptionsWidth"; //$NON-NLS-1$
+
+	/**
+	 * Default width for type column
+	 */
+	private static final int DEFAULT_TYPE_WIDTH = 75;
+
+	/**
+	 * Default width for category column
+	 */
+	private static final int DEFAULT_CATEGORY_WIDTH = 150;
+
+	/**
+	 * Default width for source column
+	 */
+	private static final int DEFAULT_SOURCE_WIDTH = 150;
+
+	/**
+	 * Default width for description column
+	 */
+	private static final int DEFAULT_DESCRIPTION_WIDTH = 800;
+
+	/**
+	 * Type column index
+	 */
+	static final int TYPE_COLUM_INDEX = 0;
+
+	/**
+	 * Category column index
+	 */
+	static final int CATEGORY_COLUM_INDEX = 1;
+
+	/**
+	 * Source column index
+	 */
+	static final int SOURCE_COLUM_INDEX = 2;
+
+	/**
+	 * Description column index
+	 */
+	static final int DESCRIPTION_COLUM_INDEX = 3;
+
+	/**
+	 * Message list
+	 */
+	private TableViewer table;
+
+	/**
+	 * Remove event action
+	 */
+	private RemoveEventAction removeEventAction;
+
+	/**
+	 * Remove event action
+	 */
+	private RemoveAllEventsAction removeAllEventsAction;
+
+	/**
+	 * Descriptions column
+	 */
+	private TableColumn descriptionColumn;
+
+	/**
+	 * Descriptions column
+	 */
+	private TableColumn categoryColumn;
+
+	/**
+	 * Source column
+	 */
+	private TableColumn sourceColumn;
+
+	/**
+	 * Type column
+	 */
+	private TableColumn typeColumn;
+
+	/**
+	 * Content change listener
+	 */
+	public static ContentChangeListener contentChangeListener;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
+	 * .Composite)
+	 */
+	@Override
+	public void createPartControl(Composite parent) {
+		table = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
+				| SWT.V_SCROLL | SWT.FULL_SELECTION);
+		EventListContentProvider contentProvider = (EventListContentProvider) getEventList();
+		EventListLabelProvider labelProvider = new EventListLabelProvider();
+		removeEventAction = new RemoveEventAction(contentProvider);
+		removeAllEventsAction = new RemoveAllEventsAction(contentProvider);
+		table.setContentProvider(contentProvider);
+		table.setLabelProvider(labelProvider);
+
+		// Content provider creates the viewer updater. The updater needs the
+		// display reference in order to create asynchronous callbacks to the UI
+		// thread.
+		Table tableWidget = table.getTable();
+		createTypeColumn(tableWidget);
+		createCategoryColumn(tableWidget);
+		createSourceColumn(tableWidget);
+		createDescriptionColumn(tableWidget);
+		configureWidgets();
+		tableWidget.setHeaderVisible(true);
+		tableWidget.setLinesVisible(true);
+		hookContextMenu();
+		table.setInput(getViewSite().getShell().getDisplay());
+		setContentListener(this);
+	}
+
+	/**
+	 * Sets content listener
+	 * 
+	 * @param listener
+	 *            new content listener
+	 */
+	private void setContentListener(ContentChangeListener listener) {
+		contentChangeListener = listener;
+	}
+
+	/**
+	 * Configures the widgets
+	 */
+	void configureWidgets() {
+
+		// Get preference store from the plugin
+		IPreferenceStore preferences = Activator.getDefault()
+				.getPreferenceStore();
+
+		// Set description column width
+		int value = preferences.getInt(DESCRIPTION_WIDTH_CONFIGURATION);
+		if (value > 0) {
+			descriptionColumn.setWidth(value);
+		} else {
+			descriptionColumn.setWidth(DEFAULT_DESCRIPTION_WIDTH);
+		}
+
+		// Set category column width
+		value = preferences.getInt(CATEGORY_WIDTH_CONFIGURATION);
+		if (value > 0) {
+			categoryColumn.setWidth(value);
+		} else {
+			categoryColumn.setWidth(DEFAULT_CATEGORY_WIDTH);
+		}
+
+		// Set source column width
+		value = preferences.getInt(SOURCE_WIDTH_CONFIGURATION);
+		if (value > 0) {
+			sourceColumn.setWidth(value);
+		} else {
+			sourceColumn.setWidth(DEFAULT_SOURCE_WIDTH);
+		}
+
+		// Set type column width
+		value = preferences.getInt(TYPE_WIDTH_CONFIGURATION);
+		if (value > 0) {
+			typeColumn.setWidth(value);
+		} else {
+			typeColumn.setWidth(DEFAULT_TYPE_WIDTH);
+		}
+	}
+
+	/**
+	 * Creates the descriptions column
+	 * 
+	 * @param tableWidget
+	 *            the table widget
+	 */
+	private void createDescriptionColumn(Table tableWidget) {
+		descriptionColumn = new TableColumn(tableWidget, SWT.NONE);
+		descriptionColumn.setText(DESCRIPTION_TITLE);
+		descriptionColumn.addControlListener(new ControlListener() {
+
+			public void controlMoved(ControlEvent e) {
+			}
+
+			public void controlResized(ControlEvent e) {
+				Activator.getDefault().getPreferenceStore().setValue(
+						DESCRIPTION_WIDTH_CONFIGURATION,
+						descriptionColumn.getWidth());
+			}
+
+		});
+		createColumnSorter(tableWidget, descriptionColumn,
+				DESCRIPTION_COLUM_INDEX);
+	}
+
+	/**
+	 * Creates the category column
+	 * 
+	 * @param tableWidget
+	 *            the table widget
+	 */
+	private void createCategoryColumn(Table tableWidget) {
+		categoryColumn = new TableColumn(tableWidget, SWT.NONE);
+		categoryColumn.setText(CATEGORY_TITLE);
+		categoryColumn.addControlListener(new ControlListener() {
+
+			public void controlMoved(ControlEvent e) {
+			}
+
+			public void controlResized(ControlEvent e) {
+				Activator.getDefault().getPreferenceStore()
+						.setValue(CATEGORY_WIDTH_CONFIGURATION,
+								categoryColumn.getWidth());
+			}
+
+		});
+		createColumnSorter(tableWidget, categoryColumn, CATEGORY_COLUM_INDEX);
+	}
+
+	/**
+	 * Creates the sources column
+	 * 
+	 * @param tableWidget
+	 *            the table widget
+	 */
+	private void createSourceColumn(Table tableWidget) {
+		sourceColumn = new TableColumn(tableWidget, SWT.NONE);
+		sourceColumn.setText(SOURCE_TITLE);
+		sourceColumn.addControlListener(new ControlListener() {
+
+			public void controlMoved(ControlEvent e) {
+			}
+
+			public void controlResized(ControlEvent e) {
+				Activator.getDefault().getPreferenceStore().setValue(
+						SOURCE_WIDTH_CONFIGURATION, sourceColumn.getWidth());
+			}
+
+		});
+		createColumnSorter(tableWidget, sourceColumn, SOURCE_COLUM_INDEX);
+	}
+
+	/**
+	 * Creates the type column
+	 * 
+	 * @param tableWidget
+	 *            the table widget
+	 */
+	private void createTypeColumn(final Table tableWidget) {
+		typeColumn = new TableColumn(tableWidget, SWT.NONE);
+		typeColumn.setText(TYPE_TITLE);
+		typeColumn.addControlListener(new ControlListener() {
+
+			public void controlMoved(ControlEvent e) {
+			}
+
+			public void controlResized(ControlEvent e) {
+				Activator.getDefault().getPreferenceStore().setValue(
+						TYPE_WIDTH_CONFIGURATION, typeColumn.getWidth());
+			}
+
+		});
+		createColumnSorter(tableWidget, typeColumn, TYPE_COLUM_INDEX);
+	}
+
+	/**
+	 * Creates sort listener
+	 * 
+	 * @param tableWidget
+	 *            table widget
+	 * @param column
+	 *            column to create sort listener for
+	 * @param index
+	 *            column index
+	 */
+	private void createColumnSorter(final Table tableWidget,
+			final TableColumn column, final int index) {
+
+		TableColumnSorter cSorter = new TableColumnSorter(table, column) {
+
+			@Override
+			protected int doCompare(Viewer v, Object o1, Object o2) {
+				ITableLabelProvider lp = ((ITableLabelProvider) table
+						.getLabelProvider());
+				String t1 = lp.getColumnText(o1, index);
+				String t2 = lp.getColumnText(o2, index);
+				return t1.compareTo(t2);
+			}
+		};
+
+		// Set no sorter as initial state
+		cSorter.setSorter(cSorter, TableColumnSorter.NONE);
+	}
+
+	/**
+	 * Adds menu listener to popup menu
+	 */
+	private void hookContextMenu() {
+
+		// Create menumanager
+		MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+		menuMgr.setRemoveAllWhenShown(true);
+
+		// Create the menu when event is received
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				IStructuredSelection selection = (IStructuredSelection) table
+						.getSelection();
+				if (!selection.isEmpty()) {
+					EventListEntry entry = (EventListEntry) selection
+							.getFirstElement();
+					removeEventAction.setEntry(entry);
+					manager.add(removeAllEventsAction);
+					manager.add(removeEventAction);
+					if (entry.hasSourceActions()) {
+						manager.add(new Separator());
+						entry.addSourceActions(manager);
+					}
+					manager.add(new Separator(
+							IWorkbenchActionConstants.MB_ADDITIONS));
+				}
+			}
+		});
+
+		// Set the menu in to the table
+		Menu menu = menuMgr.createContextMenu(table.getControl());
+		table.getControl().setMenu(menu);
+		getSite().registerContextMenu(menuMgr, table);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+	 */
+	@Override
+	public void setFocus() {
+		table.getControl().setFocus();
+	}
+
+	/**
+	 * Gets the event list interface
+	 * 
+	 * @return the event list
+	 */
+	public static TraceEventList getEventList() {
+		TraceEventList list = Activator.getDefault().eventList;
+		if (list == null) {
+			list = new EventListContentProvider();
+			Activator.getDefault().eventList = list;
+		}
+		return list;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.trace.eventview.ContentChangeListener#contentChanged()
+	 */
+	public void contentChanged() {
+		IWorkbenchSiteProgressService progressService = (IWorkbenchSiteProgressService) getSite()
+				.getAdapter(IWorkbenchSiteProgressService.class);
+		progressService.warnOfContentChange();
+	}
+}