trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/engine/preferences/TraceViewerPreferencesPage.java
/*
* 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:
*
* TraceViewer preferences page
*
*/
package com.nokia.traceviewer.engine.preferences;
import java.util.List;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import com.nokia.traceviewer.TraceViewerHelpContextIDs;
import com.nokia.traceviewer.TraceViewerPlugin;
import com.nokia.traceviewer.engine.TraceProvider;
import com.nokia.traceviewer.engine.TraceViewerGlobals;
/**
* TraceViewer preferences page
*
*/
public final class TraceViewerPreferencesPage extends PreferencePage implements
IWorkbenchPreferencePage {
/**
* Preference page ID for opening page directly
*/
public static final String PAGE_ID = "com.nokia.traceviewer.preferences.TraceViewerPreferences"; //$NON-NLS-1$
/**
* PreferenceStore holding all preferences
*/
private final IPreferenceStore store;
/**
* Radio buttons to implify timestamp accuracy
*/
private Button[] timestampAccuracyButton = new Button[2];
/**
* Radio buttons to implify how to show undecoded traces
*/
private Button[] showUndecodedTracesAsButton = new Button[3];
/**
* Time from previous trace checkbox
*/
private Button timeFromPreviousTraceCheckBox;
/**
* Show trace component and group name in trace checkbox
*/
private Button showComponentGroupNameCheckBox;
/**
* Show trace class and function name in trace checkbox
*/
private Button showClassFunctionNameCheckBox;
/**
* Automatically reload changed Dictionaries checkbox
*/
private Button autoReloadDictionariesCheckBox;
/**
* Show BTrace variables checkbox
*/
private Button showBTraceVariablesCheckBox;
/**
* Radio buttons to implify data format
*/
private Button[] dataFormatButton;
/**
* Constructor
*/
public TraceViewerPreferencesPage() {
super();
// Set the preference store for the preference page.
store = TraceViewerPlugin.getDefault().getPreferenceStore();
setPreferenceStore(store);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse
* .swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent) {
// Set help
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
TraceViewerHelpContextIDs.GENERAL_PREFERENCES);
// Create Top composite in top of the parent composite
Composite top = new Composite(parent, SWT.LEFT);
GridData topCompositeGridData = new GridData(SWT.FILL, SWT.FILL, true,
false);
top.setLayoutData(topCompositeGridData);
GridLayout topCompositeGridLayout = new GridLayout();
topCompositeGridLayout.horizontalSpacing = 5;
topCompositeGridLayout.verticalSpacing = 5;
topCompositeGridLayout.marginWidth = 0;
topCompositeGridLayout.marginHeight = 0;
top.setLayout(topCompositeGridLayout);
Label generalTextLabel = new Label(top, SWT.NONE);
String generalTextLabelText = Messages
.getString("TraceViewerPreferencesPage.GeneralSettingsText"); //$NON-NLS-1$
generalTextLabel.setText(generalTextLabelText);
// General group
Group generalGroup = new Group(top, SWT.NONE);
String generalGroupText = Messages
.getString("TraceViewerPreferencesPage.GeneralGroupText"); //$NON-NLS-1$
generalGroup.setText(generalGroupText);
GridData generalGroupGridData = new GridData(SWT.FILL, SWT.FILL, true,
false);
generalGroup.setLayoutData(generalGroupGridData);
generalGroup.setLayout(new GridLayout());
// Show milliseconds from previous trace checkbox
timeFromPreviousTraceCheckBox = new Button(generalGroup, SWT.CHECK);
timeFromPreviousTraceCheckBox.setText(Messages
.getString("TraceViewerPreferencesPage.ShowPreviousTimeText")); //$NON-NLS-1$
timeFromPreviousTraceCheckBox
.setToolTipText(Messages
.getString("TraceViewerPreferencesPage.TimeFromPreviousToolTip")); //$NON-NLS-1$
timeFromPreviousTraceCheckBox
.setSelection(store
.getBoolean(PreferenceConstants.TIME_FROM_PREVIOUS_TRACE_CHECKBOX));
// Show trace component and group before trace text checkbox
showComponentGroupNameCheckBox = new Button(generalGroup, SWT.CHECK);
showComponentGroupNameCheckBox
.setText(Messages
.getString("TraceViewerPreferencesPage.ShowComponentGroupName")); //$NON-NLS-1$
String showComponentGroupToolTip = Messages
.getString("TraceViewerPreferencesPage.ShowComponentAndGroupToolTip"); //$NON-NLS-1$
showComponentGroupNameCheckBox
.setToolTipText(showComponentGroupToolTip);
showComponentGroupNameCheckBox
.setSelection(store
.getBoolean(PreferenceConstants.SHOW_COMPONENT_GROUP_NAME_CHECKBOX));
// Show trace class and function before trace text checkbox
showClassFunctionNameCheckBox = new Button(generalGroup, SWT.CHECK);
showClassFunctionNameCheckBox.setText(Messages
.getString("TraceViewerPreferencesPage.ShowClassFunctionName")); //$NON-NLS-1$
String showClassFunctionToolTip = Messages
.getString("TraceViewerPreferencesPage.ShowClassAndFunctionToolTip"); //$NON-NLS-1$
showClassFunctionNameCheckBox.setToolTipText(showClassFunctionToolTip);
showClassFunctionNameCheckBox
.setSelection(store
.getBoolean(PreferenceConstants.SHOW_CLASS_FUNCTION_NAME_CHECKBOX));
// Automatically reload changed Dictionaries checkbox
autoReloadDictionariesCheckBox = new Button(generalGroup, SWT.CHECK);
String autoReloadText = Messages
.getString("TraceViewerPreferencesPage.AutoReloadDictionariesText"); //$NON-NLS-1$
String autoReloadToolTip = Messages
.getString("TraceViewerPreferencesPage.AutoReloadDictionariesToolTip"); //$NON-NLS-1$
autoReloadDictionariesCheckBox.setText(autoReloadText);
autoReloadDictionariesCheckBox.setToolTipText(autoReloadToolTip);
autoReloadDictionariesCheckBox
.setSelection(store
.getBoolean(PreferenceConstants.AUTO_RELOAD_DICTIONARIES_CHECKBOX));
// Show BTrace variables in OST traces checkbox
showBTraceVariablesCheckBox = new Button(generalGroup, SWT.CHECK);
String btraceVariablesText = Messages
.getString("TraceViewerPreferencesPage.ShowBTraceVariablesText"); //$NON-NLS-1$
String btraceVariablesToolTip = Messages
.getString("TraceViewerPreferencesPage.ShowBTraceVariablesToolTip"); //$NON-NLS-1$
showBTraceVariablesCheckBox.setText(btraceVariablesText);
showBTraceVariablesCheckBox.setToolTipText(btraceVariablesToolTip);
showBTraceVariablesCheckBox
.setSelection(store
.getBoolean(PreferenceConstants.SHOW_BTRACE_VARIABLES_CHECKBOX));
// Timestamp accuracy group
Group timestampAccuracyGroup = new Group(top, SWT.NONE);
String timestampAccuracyGroupText = Messages
.getString("TraceViewerPreferencesPage.TimestampAccuracyText"); //$NON-NLS-1$
timestampAccuracyGroup.setText(timestampAccuracyGroupText);
GridData timestampAccuracyGroupGridData = new GridData(SWT.FILL,
SWT.FILL, true, false);
timestampAccuracyGroup.setLayoutData(timestampAccuracyGroupGridData);
timestampAccuracyGroup.setLayout(new GridLayout());
// Timestamp accuracy milliseconds
timestampAccuracyButton[0] = new Button(timestampAccuracyGroup,
SWT.RADIO);
String milliSecondsText = Messages
.getString("TraceViewerPreferencesPage.MilliSecondsText"); //$NON-NLS-1$
timestampAccuracyButton[0].setText(milliSecondsText);
// Timestamp accuracy microseconds
timestampAccuracyButton[1] = new Button(timestampAccuracyGroup,
SWT.RADIO);
String microSecondsText = Messages
.getString("TraceViewerPreferencesPage.MicroSecondsText"); //$NON-NLS-1$
timestampAccuracyButton[1].setText(microSecondsText);
// Get the current accuracy from PreferenceStore
String accuracy = store
.getString(PreferenceConstants.TIMESTAMP_ACCURACY);
if (accuracy.equals(PreferenceConstants.MILLISECOND_ACCURACY)) {
timestampAccuracyButton[0].setSelection(true);
timestampAccuracyButton[1].setSelection(false);
} else {
timestampAccuracyButton[0].setSelection(false);
timestampAccuracyButton[1].setSelection(true);
}
// Show undecoded traces as group
Group showUndecodedTracesGroup = new Group(top, SWT.NONE);
String showUndecodedTracesAs = Messages
.getString("TraceViewerPreferencesPage.ShowUndecodedTracesAsText"); //$NON-NLS-1$
showUndecodedTracesGroup.setText(showUndecodedTracesAs);
GridData showUndecodedTracesAsGroupGridData = new GridData(SWT.FILL,
SWT.FILL, true, false);
showUndecodedTracesGroup
.setLayoutData(showUndecodedTracesAsGroupGridData);
showUndecodedTracesGroup.setLayout(new GridLayout());
// Show undecoded traces as "BINARY TRACE"
showUndecodedTracesAsButton[0] = new Button(showUndecodedTracesGroup,
SWT.RADIO);
String asInfoText = Messages
.getString("TraceViewerPreferencesPage.ShowUndecodedTracesAsInfoText"); //$NON-NLS-1$
showUndecodedTracesAsButton[0].setText(asInfoText);
// Show undecoded traces as "HEX"
showUndecodedTracesAsButton[1] = new Button(showUndecodedTracesGroup,
SWT.RADIO);
String asHexText = Messages
.getString("TraceViewerPreferencesPage.ShowUndecodedTracesAsHexText"); //$NON-NLS-1$
showUndecodedTracesAsButton[1].setText(asHexText);
// Show undecoded traces as "ID numbers"
showUndecodedTracesAsButton[2] = new Button(showUndecodedTracesGroup,
SWT.RADIO);
String asTraceIDsText = Messages
.getString("TraceViewerPreferencesPage.ShowUndecodedTracesAsIDsText"); //$NON-NLS-1$
showUndecodedTracesAsButton[2].setText(asTraceIDsText);
// Get the current "show undecoded traces" value from PreferenceStore
String showUndecoded = store
.getString(PreferenceConstants.SHOW_UNDECODED_TRACES_TYPE);
if (showUndecoded.equals(PreferenceConstants.UNDECODED_INFO_TEXT)) {
showUndecodedTracesAsButton[0].setSelection(true);
showUndecodedTracesAsButton[1].setSelection(false);
showUndecodedTracesAsButton[2].setSelection(false);
} else if (showUndecoded.equals(PreferenceConstants.UNDECODED_HEX)) {
showUndecodedTracesAsButton[0].setSelection(false);
showUndecodedTracesAsButton[1].setSelection(true);
showUndecodedTracesAsButton[2].setSelection(false);
} else {
showUndecodedTracesAsButton[0].setSelection(false);
showUndecodedTracesAsButton[1].setSelection(false);
showUndecodedTracesAsButton[2].setSelection(true);
}
// Data format editor. Show only if there are more than one
// TraceProviders registered
List<TraceProvider> dataFormats = TraceViewerGlobals
.getListOfTraceProviders();
if (dataFormats.size() > 1) {
// Data format group
String dataFormatText = Messages
.getString("TraceViewerPreferencesPage.DataFormatText"); //$NON-NLS-1$
Group dataFormatGroup = new Group(top, SWT.NONE);
dataFormatGroup.setText(dataFormatText);
GridData dataFormatGroupGridData = new GridData(SWT.FILL, SWT.FILL,
true, false);
dataFormatGroup.setLayoutData(dataFormatGroupGridData);
dataFormatGroup.setLayout(new GridLayout());
dataFormatButton = new Button[dataFormats.size()];
String dataFormat = store
.getString(PreferenceConstants.DATA_FORMAT);
// Go through data formats
for (int i = 0; i < dataFormats.size(); i++) {
dataFormatButton[i] = new Button(dataFormatGroup, SWT.RADIO);
String dataFormatName = dataFormats.get(i).getName();
dataFormatButton[i].setText(dataFormatName);
if (dataFormat.equals(dataFormatName)) {
dataFormatButton[i].setSelection(true);
} else {
dataFormatButton[i].setSelection(false);
}
}
}
return top;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
if (getControl() != null && !getControl().isDisposed()) {
// Timestamp accuracy
timestampAccuracyButton[0].setSelection(true);
timestampAccuracyButton[1].setSelection(false);
timeFromPreviousTraceCheckBox.setSelection(true);
// Show undecoded traces as
showUndecodedTracesAsButton[0].setSelection(false);
showUndecodedTracesAsButton[1].setSelection(false);
showUndecodedTracesAsButton[2].setSelection(true);
showClassFunctionNameCheckBox.setSelection(true);
autoReloadDictionariesCheckBox.setSelection(true);
showBTraceVariablesCheckBox.setSelection(true);
super.performDefaults();
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
@Override
public boolean performOk() {
saveSettings();
return super.performOk();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#performApply()
*/
@Override
public void performApply() {
saveSettings();
super.performApply();
}
/**
* Saves settings
*/
private void saveSettings() {
if (getControl() != null && !getControl().isDisposed()) {
// Save old values before saving
boolean updateNeeded = false;
String oldTimestampAccuracy = store
.getString(PreferenceConstants.TIMESTAMP_ACCURACY);
boolean oldTimeFromPrevious = store
.getBoolean(PreferenceConstants.TIME_FROM_PREVIOUS_TRACE_CHECKBOX);
String oldShowBinaryAsType = store
.getString(PreferenceConstants.SHOW_UNDECODED_TRACES_TYPE);
boolean showComponentGroupNamePrevious = store
.getBoolean(PreferenceConstants.SHOW_COMPONENT_GROUP_NAME_CHECKBOX);
boolean showClassNamePrevious = store
.getBoolean(PreferenceConstants.SHOW_CLASS_FUNCTION_NAME_CHECKBOX);
boolean showThreadId = store
.getBoolean(PreferenceConstants.SHOW_BTRACE_VARIABLES_CHECKBOX);
// Store new values. Timestamp accuracy.
if (timestampAccuracyButton[0].getSelection()) {
store.setValue(PreferenceConstants.TIMESTAMP_ACCURACY,
PreferenceConstants.MILLISECOND_ACCURACY);
} else {
store.setValue(PreferenceConstants.TIMESTAMP_ACCURACY,
PreferenceConstants.MICROSECOND_ACCURACY);
}
// Show time from previous trace
store.setValue(
PreferenceConstants.TIME_FROM_PREVIOUS_TRACE_CHECKBOX,
timeFromPreviousTraceCheckBox.getSelection());
// Store "show undecoded traces" value
if (showUndecodedTracesAsButton[0].getSelection()) {
store.setValue(PreferenceConstants.SHOW_UNDECODED_TRACES_TYPE,
PreferenceConstants.UNDECODED_INFO_TEXT);
} else if (showUndecodedTracesAsButton[1].getSelection()) {
store.setValue(PreferenceConstants.SHOW_UNDECODED_TRACES_TYPE,
PreferenceConstants.UNDECODED_HEX);
} else {
store.setValue(PreferenceConstants.SHOW_UNDECODED_TRACES_TYPE,
PreferenceConstants.UNDECODED_ID_AND_DATA);
}
// Show component and group name
store.setValue(
PreferenceConstants.SHOW_COMPONENT_GROUP_NAME_CHECKBOX,
showComponentGroupNameCheckBox.getSelection());
// Show class and function name
store.setValue(
PreferenceConstants.SHOW_CLASS_FUNCTION_NAME_CHECKBOX,
showClassFunctionNameCheckBox.getSelection());
// Auto reload changed Dictionaries
store.setValue(
PreferenceConstants.AUTO_RELOAD_DICTIONARIES_CHECKBOX,
autoReloadDictionariesCheckBox.getSelection());
// Show Thread ID
store.setValue(PreferenceConstants.SHOW_BTRACE_VARIABLES_CHECKBOX,
showBTraceVariablesCheckBox.getSelection());
// Data format
if (dataFormatButton != null) {
for (int i = 0; i < dataFormatButton.length; i++) {
if (dataFormatButton[i].getSelection()) {
store.setValue(PreferenceConstants.DATA_FORMAT,
dataFormatButton[i].getText());
}
}
}
// Check if new values are different from old values and set
// updateNeeded boolean to true if needed
if (!store.getString(PreferenceConstants.TIMESTAMP_ACCURACY)
.equals(oldTimestampAccuracy)) {
updateNeeded = true;
} else if (store
.getBoolean(PreferenceConstants.TIME_FROM_PREVIOUS_TRACE_CHECKBOX) != oldTimeFromPrevious) {
updateNeeded = true;
} else if (!store.getString(
PreferenceConstants.SHOW_UNDECODED_TRACES_TYPE).equals(
oldShowBinaryAsType)) {
updateNeeded = true;
} else if (store
.getBoolean(PreferenceConstants.SHOW_COMPONENT_GROUP_NAME_CHECKBOX) != showComponentGroupNamePrevious) {
updateNeeded = true;
} else if (store
.getBoolean(PreferenceConstants.SHOW_CLASS_FUNCTION_NAME_CHECKBOX) != showClassNamePrevious) {
updateNeeded = true;
} else if (store
.getBoolean(PreferenceConstants.SHOW_BTRACE_VARIABLES_CHECKBOX) != showThreadId) {
updateNeeded = true;
}
// Update properties
updateProperties(updateNeeded);
}
}
/**
* Updates properties to TraceViewer engine
*
* @param updateNeeded
* if true, update to engine is needed
*/
private void updateProperties(boolean updateNeeded) {
// Change the values and refresh the TraceViewer view if update is
// needed
if (updateNeeded) {
// Set timestamp accuracy to timestampParser
boolean millisec = false;
if (store.getString(PreferenceConstants.TIMESTAMP_ACCURACY).equals(
PreferenceConstants.MILLISECOND_ACCURACY)) {
millisec = true;
}
TraceViewerGlobals.getTraceViewer().getDataProcessorAccess()
.getTimestampParser().setTimestampAccuracyMilliSecs(
millisec);
// Set showing time from previous trace to timestampParser
TraceViewerGlobals.getTraceViewer().getDataProcessorAccess()
.getTimestampParser().setShowTimeFromPrevious(
timeFromPreviousTraceCheckBox.getSelection());
// Set show class and function name before trace text
if (TraceViewerGlobals.getDecodeProvider() != null) {
TraceViewerGlobals.getDecodeProvider().setAddPrefixesToTrace(
showClassFunctionNameCheckBox.getSelection(),
showComponentGroupNameCheckBox.getSelection());
}
// Set show BTrace variables to Decoder
TraceViewerGlobals.getTraceViewer().getDataProcessorAccess()
.getDecoder().setShowBTraceVariables(
showBTraceVariablesCheckBox.getSelection());
// Update the TraceViewer view
TraceViewerGlobals.getTraceViewer().getView().refreshCurrentView();
}
// Set new TraceProvider. Find it from the list of TraceProviders using
// the selected name. TraceViewer handles the change. If provider is
// the same as previously, nothing is done.
List<TraceProvider> dataFormats = TraceViewerGlobals
.getListOfTraceProviders();
if (dataFormatButton != null) {
for (int i = 0; i < dataFormats.size(); i++) {
// Compare the name of the Provider to the name saved to the
// preference store
if (dataFormats.get(i).getName().equals(
store.getString(PreferenceConstants.DATA_FORMAT))) {
// Set new TraceProvider to the TraceViewer
TraceViewerGlobals.setTraceProvider(dataFormats.get(i),
false);
break;
}
}
}
}
}