/*******************************************************************************
* Copyright (c) 2007, 2011 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.preferences;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyMessages;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyHelpContextIds;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
/**
* DisassemblyPreferencePage
*/
public class DisassemblyPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private List<Button> fCheckBoxes = new ArrayList<Button>();
private List<Combo> fComboBoxes = new ArrayList<Combo>();
private ArrayList<Text> fNumberFields = new ArrayList<Text>();
private ModifyListener fNumberFieldListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
numberFieldChanged((Text)e.widget);
}
};
private Combo fAddressFormatCombo;
private Combo fOpcodeFormatCombo;
private final static String[] fcRadixItems = {
DisassemblyMessages.DisassemblyPreferencePage_radix_octal,
DisassemblyMessages.DisassemblyPreferencePage_radix_decimal,
DisassemblyMessages.DisassemblyPreferencePage_radix_hexadecimal,
};
private final static int[] fcRadixValues = {
8, 10, 16
};
/**
* Create the Disassembly preference page.
*/
public DisassemblyPreferencePage() {
super();
setPreferenceStore(DsfUIPlugin.getDefault().getPreferenceStore());
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
super.createControl(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDisassemblyHelpContextIds.DISASSEMBLY_PREFERENCE_PAGE);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = 3;
composite.setLayout(layout);
composite.setFont(parent.getFont());
String label;
// label = DisassemblyMessages.DisassemblyPreferencePage_startAddress; //$NON-NLS-1$
// addTextField(composite, label, DisassemblyPreferenceConstants.START_ADDRESS, 20, 0, true);
// label = DisassemblyMessages.DisassemblyPreferencePage_endAddress; //$NON-NLS-1$
// addTextField(composite, label, DisassemblyPreferenceConstants.END_ADDRESS, 20, 0, true);
label = DisassemblyMessages.DisassemblyPreferencePage_showAddress;
final Button showAddressCB = addCheckBox(composite, label, DisassemblyPreferenceConstants.SHOW_ADDRESS_RULER, 0);
showAddressCB.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fAddressFormatCombo.setEnabled(showAddressCB.getSelection());
}
});
showAddressCB.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_showAddressTooltip);
label = DisassemblyMessages.DisassemblyPreferencePage_addressRadix;
fAddressFormatCombo = addComboBox(composite, label, DisassemblyPreferenceConstants.ADDRESS_RADIX, fcRadixItems);
fAddressFormatCombo.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_addressFormatTooltip);
label = DisassemblyMessages.DisassemblyPreferencePage_showCodeBytes;
final Button showCodeBytes= addCheckBox(composite, label, DisassemblyPreferenceConstants.SHOW_CODE_BYTES, 0);
showCodeBytes.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fOpcodeFormatCombo.setEnabled(showCodeBytes.getSelection());
}
});
showCodeBytes.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_showCodeBytesTooltip);
label = DisassemblyMessages.DisassemblyPreferencePage_OpcodeFormat;
fOpcodeFormatCombo = addComboBox(composite, label, DisassemblyPreferenceConstants.OPCODE_RADIX, fcRadixItems);
fOpcodeFormatCombo.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_OpcodeFormatTooltip);
// label = DisassemblyMessages.DisassemblyPreferencePage_instructionRadix;
// addComboBox(composite, label, DisassemblyPreferenceConstants.INSTRUCTION_RADIX, fcRadixItems);
label = DisassemblyMessages.DisassemblyPreferencePage_showSource;
Button showSourceCB = addCheckBox(composite, label, DisassemblyPreferenceConstants.SHOW_SOURCE, 0);
showSourceCB.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_showSourceTooltip);
label = DisassemblyMessages.DisassemblyPreferencePage_showSymbols;
Button showSymbolsCB = addCheckBox(composite, label, DisassemblyPreferenceConstants.SHOW_SYMBOLS, 0);
showSymbolsCB.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_showSymbolsTooltip);
// label = DisassemblyMessages.DisassemblyPreferencePage_simplifiedMnemonics;
// addCheckBox(composite, label, DisassemblyPreferenceConstants.SIMPLIFIED, 0);
label = DisassemblyMessages.DisassemblyPreferencePage_showAddressRadix;
Button showRadixCB = addCheckBox(composite, label, DisassemblyPreferenceConstants.SHOW_ADDRESS_RADIX, 0);
showRadixCB.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_showRadixTooltip);
label = DisassemblyMessages.DisassemblyPreferencePage_showFunctionOffsets;
Button showFunctionOffsets = addCheckBox(composite, label, DisassemblyPreferenceConstants.SHOW_FUNCTION_OFFSETS, 0);
showFunctionOffsets.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_showFunctionOffsetsTooltip);
// label = DisassemblyMessages.DisassemblyPreferencePage_avoidReadBeforePC;
// addCheckBox(composite, label, DisassemblyPreferenceConstants.AVOID_READ_BEFORE_PC, 0);
// horizontal line
// Label separator = new Label(composite, SWT.SEPARATOR|SWT.HORIZONTAL);
// GridData data;
// data = new GridData(GridData.FILL_HORIZONTAL);
// data.horizontalSpan = layout.numColumns;
// separator.setLayoutData(data);
//
// label = DisassemblyMessages.DisassemblyPreferencePage_useSourceOnlyMode;
// addCheckBox(composite, label, DisassemblyPreferenceConstants.USE_SOURCE_ONLY_MODE, 0);
//
// // note
// String noteTitle = DisassemblyMessages.DisassemblyPreferencePage_useSourceOnlyMode_noteTtitle;
// String noteMessage = DisassemblyMessages.DisassemblyPreferencePage_useSourceOnlyMode_noteMessage;
// Composite note = createNoteComposite(composite.getFont(), composite, noteTitle, noteMessage);
// data = (GridData)note.getLayoutData();
// if (data == null) {
// data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
// note.setLayoutData(data);
// }
// data.horizontalSpan = layout.numColumns;
// Control msgControl = note.getChildren()[1];
// data = new GridData(GridData.FILL_HORIZONTAL);
// data.widthHint = convertWidthInCharsToPixels(65);
// data.heightHint = convertHeightInCharsToPixels(3);
// msgControl.setLayoutData(data);
Dialog.applyDialogFont(parent);
initialize();
return composite;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
}
private Button addCheckBox(Composite parent, String label, String key, int indentation) {
Button checkBox = new Button(parent, SWT.CHECK);
checkBox.setText(label);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalIndent = indentation;
gd.horizontalSpan = 3;
checkBox.setLayoutData(gd);
checkBox.setData(key);
fCheckBoxes.add(checkBox);
return checkBox;
}
private Combo addComboBox(Composite parent, String label, String key, String[] items) {
Label labelControl= new Label(parent, SWT.NONE);
labelControl.setText(label);
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent = 16;
gd.horizontalSpan = 2;
labelControl.setLayoutData(gd);
Combo combo = new Combo(parent, SWT.READ_ONLY);
gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
combo.setLayoutData(gd);
combo.setItems(items);
combo.setData(key);
fComboBoxes.add(combo);
return combo;
}
protected Text addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {
return getTextControl(addLabelledTextField(composite, label, key, textLimit, indentation, isNumber));
}
// private static Label getLabelControl(Control[] labelledTextField){
// return (Label)labelledTextField[0];
// }
private static Text getTextControl(Control[] labelledTextField){
return (Text)labelledTextField[1];
}
/**
* Returns an array of size 2:
* - first element is of type <code>Label</code>
* - second element is of type <code>Text</code>
* Use <code>getLabelControl</code> and <code>getTextControl</code> to get the 2 controls.
*/
private Control[] addLabelledTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {
Label labelControl= new Label(composite, SWT.NONE);
labelControl.setText(label);
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent= indentation;
labelControl.setLayoutData(gd);
Text textControl= new Text(composite, SWT.BORDER | SWT.SINGLE);
gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint= convertWidthInCharsToPixels(textLimit + 1);
textControl.setLayoutData(gd);
textControl.setTextLimit(textLimit);
textControl.setData(key);
if (isNumber) {
fNumberFields.add(textControl);
textControl.addModifyListener(fNumberFieldListener);
}
return new Control[]{labelControl, textControl};
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/
@Override
public boolean performOk() {
IPreferenceStore store = getPreferenceStore();
for (Iterator<Button> iter = fCheckBoxes.iterator(); iter.hasNext();) {
Button btn = iter.next();
store.setValue((String)btn.getData(), btn.getSelection());
}
for (Iterator<Text> iter = fNumberFields.iterator(); iter.hasNext();) {
Text field = iter.next();
store.setValue((String)field.getData(), Long.decode(field.getText()).longValue());
}
for (Iterator<Combo> iter = fComboBoxes.iterator(); iter.hasNext();) {
Combo combo = iter.next();
store.setValue((String)combo.getData(), fcRadixValues[combo.getSelectionIndex()]);
}
return super.performOk();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
IPreferenceStore store = getPreferenceStore();
for (Iterator<Button> iter = fCheckBoxes.iterator(); iter.hasNext();) {
Button btn = iter.next();
btn.setSelection(store.getDefaultBoolean((String)btn.getData()));
}
for (Iterator<Text> iter = fNumberFields.iterator(); iter.hasNext();) {
Text field = iter.next();
long value = store.getDefaultLong((String)field.getData());
field.setText("0x"+Long.toHexString(value)); //$NON-NLS-1$
}
for (Iterator<Combo> iter = fComboBoxes.iterator(); iter.hasNext();) {
Combo combo = iter.next();
int value = store.getDefaultInt((String)combo.getData());
for (int i = 0; i < fcRadixValues.length; i++) {
if (fcRadixValues[i] == value) {
combo.select(i);
}
}
}
super.performDefaults();
}
/**
* Initialize widget values from preference store.
*/
private void initialize() {
IPreferenceStore store = getPreferenceStore();
for (Iterator<Button> iter = fCheckBoxes.iterator(); iter.hasNext();) {
Button btn = iter.next();
btn.setSelection(store.getBoolean((String)btn.getData()));
}
for (Iterator<Text> iter = fNumberFields.iterator(); iter.hasNext();) {
Text field = iter.next();
long value = store.getLong((String)field.getData());
field.setText("0x"+Long.toHexString(value)); //$NON-NLS-1$
}
for (Iterator<Combo> iter = fComboBoxes.iterator(); iter.hasNext();) {
Combo combo = iter.next();
int value = store.getInt((String)combo.getData());
for (int i = 0; i < fcRadixValues.length; i++) {
if (fcRadixValues[i] == value) {
combo.select(i);
break;
}
}
}
}
/**
* @param text
*/
protected void numberFieldChanged(Text text) {
try {
long value = Long.decode(text.getText()).longValue();
if (value < 0) {
setErrorMessage(DisassemblyMessages.DisassemblyPreferencePage_error_negative_number);
} else {
setErrorMessage(null);
}
} catch(NumberFormatException nfe) {
setErrorMessage(DisassemblyMessages.DisassemblyPreferencePage_error_not_a_number);
}
}
}