trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/dialog/VariableTracingHistoryDialog.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/dialog/VariableTracingHistoryDialog.java Wed Jun 23 14:49:59 2010 +0300
@@ -0,0 +1,463 @@
+/*
+ * 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:
+ *
+ * Variable Tracing History Dialog
+ *
+ */
+package com.nokia.traceviewer.dialog;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.traceviewer.TraceViewerHelpContextIDs;
+import com.nokia.traceviewer.action.OpenTraceLocationAction;
+import com.nokia.traceviewer.engine.TraceMetaData;
+import com.nokia.traceviewer.engine.TraceViewerGlobals;
+import com.nokia.traceviewer.engine.dataprocessor.VariableTracingEvent;
+import com.nokia.traceviewer.engine.dataprocessor.VariableTracingItem;
+
+/**
+ * Variable Tracing History Dialog
+ *
+ */
+public final class VariableTracingHistoryDialog extends BaseDialog {
+
+ /**
+ * Main UI Composite
+ */
+ private Composite mainComposite;
+
+ /**
+ * Top UI Composite
+ */
+ private Composite topComposite;
+
+ /**
+ * Table containing all the information
+ */
+ private Table table;
+
+ /**
+ * Checkbox for activating trace when doubleclicking
+ */
+ private Button activateTraceCheckBox;
+
+ /**
+ * Checkbox for activating codeline when doubleclicking
+ */
+ private Button activateCodeLineCheckBox;
+
+ /**
+ * Tells whether we will activate trace when doubleclicking line
+ */
+ private boolean activateTrace = true;
+
+ /**
+ * Tells whether we will activate codeline when doubleclicking line
+ */
+ private boolean activateCodeLine = true;
+
+ /**
+ * Checks if DataReader was paused when we entered dialog -> Don't pause
+ * again and don't unpause in exit
+ */
+ private boolean wasPausedWhenEntered = true;
+
+ /**
+ * Constructor
+ *
+ * @param parent
+ * parent shell
+ */
+ public VariableTracingHistoryDialog(Shell parent) {
+ super(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.TrayDialog#close()
+ */
+ @Override
+ public boolean close() {
+ boolean close = super.close();
+ if (!wasPausedWhenEntered) {
+ // Unpause
+ TraceViewerGlobals.getTraceViewer().getView().getActionFactory()
+ .getPauseAction().run();
+ }
+ return close;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.nokia.traceviewer.dialog.BaseDialog#createShell()
+ */
+ @Override
+ protected void createDialogContents() {
+ // Pause the datareader if it's not paused already
+ wasPausedWhenEntered = TraceViewerGlobals.getTraceViewer()
+ .getDataReaderAccess().getMainDataReader().isPaused();
+ if (!wasPausedWhenEntered) {
+ TraceViewerGlobals.getTraceViewer().getView().getActionFactory()
+ .getPauseAction().run();
+ }
+
+ // Contents
+ GridLayout gridLayout = new GridLayout();
+ getShell().setText(
+ Messages.getString("VariableTracingHistoryDialog.ShellTitle")); //$NON-NLS-1$
+ composite.setLayout(gridLayout);
+ getShell().setMinimumSize(new Point(400, 250));
+
+ // Create main composite
+ createMainComposite();
+
+ // Set help
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(getShell(),
+ TraceViewerHelpContextIDs.VARIABLE_TRACING_HISTORY);
+ }
+
+ /**
+ * This method initializes mainComposite
+ *
+ */
+ private void createMainComposite() {
+ // Main composite
+ GridData mainCompositeGridData = new GridData();
+ mainCompositeGridData.horizontalAlignment = GridData.FILL;
+ mainCompositeGridData.grabExcessHorizontalSpace = true;
+ mainCompositeGridData.grabExcessVerticalSpace = true;
+ mainCompositeGridData.verticalAlignment = GridData.FILL;
+ mainComposite = new Composite(composite, SWT.NONE);
+ mainComposite.setLayout(new GridLayout());
+ mainComposite.setLayoutData(mainCompositeGridData);
+
+ // Create top composite
+ createTopComposite();
+
+ // Create the table
+ createTable();
+
+ // Create bottom composite
+ createBottomComposite();
+ }
+
+ /**
+ * Creates and initializes table
+ */
+ private void createTable() {
+ // Layout data for table
+ GridData tableGridData = new GridData();
+ tableGridData.horizontalAlignment = GridData.FILL;
+ tableGridData.verticalAlignment = GridData.FILL;
+ tableGridData.grabExcessHorizontalSpace = true;
+ tableGridData.grabExcessVerticalSpace = true;
+ tableGridData.heightHint = 300;
+
+ // Create table
+ table = new Table(mainComposite, SWT.BORDER | SWT.FULL_SELECTION);
+ table.setHeaderVisible(true);
+ table.setLayoutData(tableGridData);
+ table.setLinesVisible(true);
+
+ // Add double click support
+ table.addListener(SWT.DefaultSelection, new Listener() {
+ public void handleEvent(Event e) {
+ handleDoubleClick();
+ }
+ });
+
+ // Create columns
+ TableColumn timestampColumn = new TableColumn(table, SWT.NONE);
+ timestampColumn.setWidth(110);
+ timestampColumn.setText(Messages
+ .getString("VariableTracingHistoryDialog.TimestampColumnName")); //$NON-NLS-1$
+ TableColumn valueColumn = new TableColumn(table, SWT.NONE);
+ valueColumn.setWidth(405);
+ valueColumn.setText(Messages
+ .getString("VariableTracingHistoryDialog.ValueColumnName")); //$NON-NLS-1$
+ TableColumn lineColumn = new TableColumn(table, SWT.NONE);
+ lineColumn.setAlignment(SWT.CENTER);
+ lineColumn.setWidth(65);
+ lineColumn.setText(Messages
+ .getString("VariableTracingHistoryDialog.LineNrText")); //$NON-NLS-1$
+ TableColumn hasCodeLineColumn = new TableColumn(table, SWT.NONE);
+ hasCodeLineColumn.setAlignment(SWT.CENTER);
+ hasCodeLineColumn
+ .setText(Messages
+ .getString("VariableTracingHistoryDialog.HasCodeLineColumnName")); //$NON-NLS-1$
+ hasCodeLineColumn.setWidth(80);
+
+ // Insert data
+ insertData();
+ }
+
+ /**
+ * Inserts data to table
+ */
+ private void insertData() {
+ // First get indices selected in the table
+ int[] indices = TraceViewerGlobals.getTraceViewer().getPropertyView()
+ .getSelectedVariableIndices();
+
+ // Get items from VariableTracingProcessor
+ List<VariableTracingItem> variableItems = TraceViewerGlobals
+ .getTraceViewer().getDataProcessorAccess()
+ .getVariableTracingProcessor().getVariableTracingItems();
+
+ // Create a ArrayList of all events from selected items
+ List<VariableTracingEvent> events = new ArrayList<VariableTracingEvent>();
+ for (int i = 0; i < indices.length; i++) {
+ events.addAll(variableItems.get(indices[i]).getEventList());
+ }
+
+ // Sort the list by line numbers
+ Collections.sort(events, new Comparator<VariableTracingEvent>() {
+ public int compare(VariableTracingEvent o1, VariableTracingEvent o2) {
+ int val = o1.getLine();
+ int val2 = o2.getLine();
+ return val > val2 ? 1 : val < val2 ? -1 : 0;
+ }
+ });
+
+ // Null own timestamp from TimestampParser
+ TraceViewerGlobals.getTraceViewer().getDataProcessorAccess()
+ .getTimestampParser().nullPreviousOwnTimestamp();
+
+ // Insert items
+ for (int j = 0; j < events.size(); j++) {
+ TableItem item = new TableItem(table, SWT.NONE);
+ VariableTracingEvent event = events.get(j);
+ String hasMetadata = Messages
+ .getString("VariableTracingHistoryDialog.YesText"); //$NON-NLS-1$
+
+ // Calculate new timestamp
+ String timestamp = TraceViewerGlobals.getTraceViewer()
+ .getDataProcessorAccess().getTimestampParser()
+ .processTimestampFromPlainText(event.getTimestamp(), false);
+
+ // No metaData
+ if (event.getTraceInformation() == null
+ || TraceViewerGlobals.getDecodeProvider().getTraceMetaData(
+ event.getTraceInformation()) == null
+ || TraceViewerGlobals.getDecodeProvider().getTraceMetaData(
+ event.getTraceInformation()).getLineNumber() == 0) {
+ hasMetadata = Messages
+ .getString("VariableTracingHistoryDialog.NoText"); //$NON-NLS-1$
+ }
+
+ item.setText(new String[] { timestamp,
+ (j + 1) + ". " + event.getParent().getName() //$NON-NLS-1$
+ + event.getValue(),
+ String.valueOf(event.getLine()), hasMetadata });
+
+ // Attach event to the data part of the TableItem for easy get
+ item.setData(event);
+ }
+ }
+
+ /**
+ * Handles double clicks
+ */
+ void handleDoubleClick() {
+ VariableTracingEvent event = (VariableTracingEvent) table
+ .getSelection()[0].getData();
+
+ // Activate trace
+ if (activateTrace) {
+
+ // Set the line highlighted
+ TraceViewerGlobals.getTraceViewer().getView().highlightLines(
+ event.getLine() - 1, 0, false);
+ }
+
+ // Activate code line
+ if (activateCodeLine) {
+ if (event.getTraceInformation() != null) {
+ TraceMetaData metaData = TraceViewerGlobals.getDecodeProvider()
+ .getTraceMetaData(event.getTraceInformation());
+
+ if (metaData.getLineNumber() != 0) {
+ // Get Action used to open trace line
+ OpenTraceLocationAction action = (OpenTraceLocationAction) TraceViewerGlobals
+ .getTraceViewer().getView().getActionFactory()
+ .getOpenTraceLocationAction();
+ action.setMetaData(metaData, true);
+ action.run();
+ }
+ }
+ }
+
+ }
+
+ /**
+ * This method initializes topComposite
+ *
+ */
+ private void createTopComposite() {
+ // Top composite
+ GridData topCompositeGridData = new GridData();
+ topCompositeGridData.horizontalAlignment = GridData.FILL;
+ topCompositeGridData.grabExcessHorizontalSpace = true;
+ topCompositeGridData.heightHint = 90;
+ topCompositeGridData.verticalSpan = 2;
+ topCompositeGridData.verticalAlignment = GridData.CENTER;
+ topComposite = new Composite(mainComposite, SWT.NONE);
+ topComposite.setLayout(new GridLayout());
+ topComposite.setLayoutData(topCompositeGridData);
+
+ // Create settings group
+ createSettingsGroup();
+ }
+
+ /**
+ * This method initializes bottomComposite
+ *
+ */
+ private void createBottomComposite() {
+ // Bottom composite
+ GridData bottomCompositeGridData = new GridData();
+ bottomCompositeGridData.horizontalAlignment = GridData.END;
+ bottomCompositeGridData.verticalAlignment = GridData.CENTER;
+ Composite bottomComposite = new Composite(mainComposite, SWT.NONE);
+ bottomComposite.setLayout(new GridLayout());
+ bottomComposite.setLayoutData(bottomCompositeGridData);
+ }
+
+ /**
+ * This method initializes settingsGroup
+ *
+ */
+ private void createSettingsGroup() {
+ // Settings group
+ GridLayout settingsGroupGridLayout = new GridLayout();
+ settingsGroupGridLayout.numColumns = 2;
+ settingsGroupGridLayout.horizontalSpacing = 15;
+ Group settingsGroup = new Group(topComposite, SWT.NONE);
+ settingsGroup.setText(Messages
+ .getString("VariableTracingHistoryDialog.SettingsGroupText")); //$NON-NLS-1$
+ settingsGroup.setLayout(settingsGroupGridLayout);
+
+ // Information label
+ Label informationLabel = new Label(settingsGroup, SWT.NONE);
+ informationLabel
+ .setText(Messages
+ .getString("VariableTracingHistoryDialog.InformationLabelText")); //$NON-NLS-1$
+
+ // Activate Trace checkbox
+ activateTraceCheckBox = new Button(settingsGroup, SWT.CHECK);
+ activateTraceCheckBox.setText(Messages
+ .getString("VariableTracingHistoryDialog.ActivateTraceText")); //$NON-NLS-1$
+ activateTraceCheckBox.setSelection(activateTrace);
+
+ // Filler
+ new Label(settingsGroup, SWT.NONE);
+
+ // Activate Codeline checkbox
+ activateCodeLineCheckBox = new Button(settingsGroup, SWT.CHECK);
+ activateCodeLineCheckBox
+ .setText(Messages
+ .getString("VariableTracingHistoryDialog.ActivateCodelineText")); //$NON-NLS-1$
+ activateCodeLineCheckBox.setSelection(true);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.nokia.traceviewer.dialog.BaseDialog#createActionListeners()
+ */
+ @Override
+ public void createActionListeners() {
+ // Add listener to ActivateTrace checkbox
+ activateTraceCheckBox.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ activateTrace = activateTraceCheckBox.getSelection();
+ }
+ });
+
+ // Add listener to ActivateCodeLine checkbox
+ activateCodeLineCheckBox.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ activateCodeLine = activateCodeLineCheckBox.getSelection();
+ }
+ });
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
+ */
+ @Override
+ protected void cancelPressed() {
+ table.removeAll();
+ super.cancelPressed();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ @Override
+ protected void okPressed() {
+ table.removeAll();
+ super.okPressed();
+ }
+
+ /**
+ * Tells is the search dialog open
+ *
+ * @return true if dialog is open
+ */
+ public boolean isOpen() {
+ boolean isOpen = false;
+ if (getShell() != null && !getShell().isDisposed()) {
+ isOpen = true;
+ }
+ return isOpen;
+ }
+
+ /**
+ * Sets focus
+ */
+ public void setFocus() {
+ getShell().setFocus();
+ }
+}