diff -r ed1c9f64298a -r 5b9d4d8641ce 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 variableItems = TraceViewerGlobals + .getTraceViewer().getDataProcessorAccess() + .getVariableTracingProcessor().getVariableTracingItems(); + + // Create a ArrayList of all events from selected items + List events = new ArrayList(); + 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() { + 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(); + } +}