1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 18:26:01 +02:00

[302873] [dis] Toggling "Show Source" jumps to unexpected location

This commit is contained in:
Anton Leherbauer 2010-03-01 11:10:52 +00:00
parent a16c5bc0d5
commit ecac1992cc
2 changed files with 31 additions and 118 deletions

View file

@ -256,12 +256,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
protected Map<String, Action> fGlobalActions = new HashMap<String, Action>(); protected Map<String, Action> fGlobalActions = new HashMap<String, Action>();
private List<Action> fSelectionActions = new ArrayList<Action>(); private List<Action> fSelectionActions = new ArrayList<Action>();
private List<AbstractDisassemblyAction> fStateDependentActions = new ArrayList<AbstractDisassemblyAction>(); private List<AbstractDisassemblyAction> fStateDependentActions = new ArrayList<AbstractDisassemblyAction>();
private boolean fSourceOnlyMode;
private boolean fShowSource; private boolean fShowSource;
private boolean fShowOpcodes; private boolean fShowOpcodes;
private boolean fShowSymbols; private boolean fShowSymbols;
private Map<String, Object> fFile2Storage = new HashMap<String, Object>(); private Map<String, Object> fFile2Storage = new HashMap<String, Object>();
private boolean fShowDisassembly; private boolean fShowDisassembly = true;
private LinkedList<AddressRangePosition> fPCHistory = new LinkedList<AddressRangePosition>(); private LinkedList<AddressRangePosition> fPCHistory = new LinkedList<AddressRangePosition>();
private int fPCHistorySizeMax = 4; private int fPCHistorySizeMax = 4;
private boolean fGotoFramePending; private boolean fGotoFramePending;
@ -351,11 +350,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
@Override @Override
public void run() { public void run() {
IPreferenceStore store = DsfUIPlugin.getDefault().getPreferenceStore(); IPreferenceStore store = DsfUIPlugin.getDefault().getPreferenceStore();
store.setValue(DisassemblyPreferenceConstants.SHOW_FUNCTION_OFFSETS, !isOpcodeRulerVisible()); store.setValue(DisassemblyPreferenceConstants.SHOW_FUNCTION_OFFSETS, !isFunctionOffsetsRulerVisible());
} }
@Override @Override
public void update() { public void update() {
setChecked(isOpcodeRulerVisible()); setChecked(isFunctionOffsetsRulerVisible());
} }
} }
@ -405,12 +404,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
@Override @Override
public void run() { public void run() {
IPreferenceStore store = DsfUIPlugin.getDefault().getPreferenceStore(); IPreferenceStore store = DsfUIPlugin.getDefault().getPreferenceStore();
boolean showSourceEnabled = store.getBoolean(DisassemblyPreferenceConstants.SHOW_SOURCE); store.setValue(DisassemblyPreferenceConstants.SHOW_SOURCE, !fShowSource);
if (showSourceEnabled == fShowSource) {
store.setValue(DisassemblyPreferenceConstants.SHOW_SOURCE, !fShowSource);
} else {
sourceModeChanged(!fShowSource);
}
} }
@Override @Override
public void update() { public void update() {
@ -472,10 +466,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fEndAddress = new BigInteger(endAddressString.substring(2), 16); fEndAddress = new BigInteger(endAddressString.substring(2), 16);
else else
fEndAddress = new BigInteger(endAddressString, 16); fEndAddress = new BigInteger(endAddressString, 16);
// TLETODO [disassembly[ source only mode fShowSource = prefs.getBoolean(DisassemblyPreferenceConstants.SHOW_SOURCE);
fSourceOnlyMode = false; //prefs.getBoolean(DisassemblyPreferenceConstants.USE_SOURCE_ONLY_MODE);
fShowSource = fSourceOnlyMode || prefs.getBoolean(DisassemblyPreferenceConstants.SHOW_SOURCE);
fShowDisassembly = !fSourceOnlyMode || !fShowSource;
fShowOpcodes = prefs.getBoolean(DisassemblyPreferenceConstants.SHOW_FUNCTION_OFFSETS); fShowOpcodes = prefs.getBoolean(DisassemblyPreferenceConstants.SHOW_FUNCTION_OFFSETS);
fShowSymbols = prefs.getBoolean(DisassemblyPreferenceConstants.SHOW_SYMBOLS); fShowSymbols = prefs.getBoolean(DisassemblyPreferenceConstants.SHOW_SYMBOLS);
fUpdateBeforeFocus = !prefs.getBoolean(DisassemblyPreferenceConstants.AVOID_READ_BEFORE_PC); fUpdateBeforeFocus = !prefs.getBoolean(DisassemblyPreferenceConstants.AVOID_READ_BEFORE_PC);
@ -566,45 +557,28 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
showAddressRuler(); showAddressRuler();
} }
} else if (property.equals(DisassemblyPreferenceConstants.SHOW_SOURCE)) { } else if (property.equals(DisassemblyPreferenceConstants.SHOW_SOURCE)) {
sourceModeChanged(store.getBoolean(property)); boolean showSource = store.getBoolean(property);
} else if (property.equals(DisassemblyPreferenceConstants.INSTRUCTION_RADIX)) { if (fShowSource == showSource) {
Runnable doit = new Runnable() { return;
public void run() { }
fDocument.invalidateAddressRange(fStartAddress, fEndAddress, true); fShowSource = showSource;
if (!fShowDisassembly) { fActionToggleSource.update();
fDocument.invalidateDisassemblyWithSource(true); refreshView(10);
}
fDocument.setMaxOpcodeLength(0);
fGotoFramePending = true;
}};
doScrollLocked(doit);
} else if (property.equals(DisassemblyPreferenceConstants.SHOW_SYMBOLS)) { } else if (property.equals(DisassemblyPreferenceConstants.SHOW_SYMBOLS)) {
boolean showSymbols = store.getBoolean(property); boolean showSymbols = store.getBoolean(property);
if (fShowSymbols == showSymbols) { if (fShowSymbols == showSymbols) {
return; return;
} }
fShowSymbols = showSymbols; fShowSymbols = showSymbols;
Runnable doit = new Runnable() { fActionToggleSymbols.update();
public void run() { refreshView(10);
fDocument.invalidateAddressRange(fStartAddress, fEndAddress, true);
if (!fShowDisassembly) {
fDocument.invalidateDisassemblyWithSource(true);
}
fGotoFramePending = true;
}};
doScrollLocked(doit);
} else if (property.equals(DisassemblyPreferenceConstants.USE_SOURCE_ONLY_MODE)) {
fSourceOnlyMode = store.getBoolean(property);
if (fDebugSessionId != null) {
disassemblyModeChanged(isDissemblyMixedModeOn());
}
} else if (property.equals(DisassemblyPreferenceConstants.SHOW_FUNCTION_OFFSETS)) { } else if (property.equals(DisassemblyPreferenceConstants.SHOW_FUNCTION_OFFSETS)) {
fShowOpcodes = store.getBoolean(property); fShowOpcodes = store.getBoolean(property);
fActionToggleFunctionColumn.update(); fActionToggleFunctionColumn.update();
if (isOpcodeRulerVisible()) { if (isFunctionOffsetsRulerVisible()) {
showOpcodeRuler(); showFunctionOffsetsRuler();
} else { } else {
hideOpcodeRuler(); hideFunctionOffsetsRuler();
} }
} else if (property.equals(DisassemblyPreferenceConstants.AVOID_READ_BEFORE_PC)) { } else if (property.equals(DisassemblyPreferenceConstants.AVOID_READ_BEFORE_PC)) {
fUpdateBeforeFocus = !store.getBoolean(property); fUpdateBeforeFocus = !store.getBoolean(property);
@ -671,8 +645,8 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
if (isAddressRulerVisible()) { if (isAddressRulerVisible()) {
showAddressRuler(); showAddressRuler();
} }
if (isOpcodeRulerVisible()) { if (isFunctionOffsetsRulerVisible()) {
showOpcodeRuler(); showFunctionOffsetsRuler();
} }
initDragAndDrop(); initDragAndDrop();
PlatformUI.getWorkbench().getHelpSystem().setHelp(fViewer.getControl(), IDisassemblyHelpContextIds.DISASSEMBLY_VIEW); PlatformUI.getWorkbench().getHelpSystem().setHelp(fViewer.getControl(), IDisassemblyHelpContextIds.DISASSEMBLY_VIEW);
@ -986,9 +960,9 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
* *
* @return the created line number column * @return the created line number column
*/ */
protected IVerticalRulerColumn createOpcodeRulerColumn() { protected IVerticalRulerColumn createFunctionOffsetsRulerColumn() {
fOpcodeRulerColumn= new FunctionOffsetRulerColumn(); fOpcodeRulerColumn= new FunctionOffsetRulerColumn();
initializeRulerColumn(fOpcodeRulerColumn, DisassemblyPreferenceConstants.OPCODE_COLOR); initializeRulerColumn(fOpcodeRulerColumn, DisassemblyPreferenceConstants.FUNCTION_OFFSETS_COLOR);
return fOpcodeRulerColumn; return fOpcodeRulerColumn;
} }
@ -1071,19 +1045,19 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
} }
} }
private boolean isOpcodeRulerVisible() { private boolean isFunctionOffsetsRulerVisible() {
return fShowOpcodes; return fShowOpcodes;
} }
/** /**
* Shows the opcode ruler column. * Shows the opcode ruler column.
*/ */
private void showOpcodeRuler() { private void showFunctionOffsetsRuler() {
if (fOpcodeRulerColumn == null) { if (fOpcodeRulerColumn == null) {
IVerticalRuler v= getVerticalRuler(); IVerticalRuler v= getVerticalRuler();
if (v instanceof CompositeRuler) { if (v instanceof CompositeRuler) {
CompositeRuler c= (CompositeRuler) v; CompositeRuler c= (CompositeRuler) v;
c.addDecorator(2, createOpcodeRulerColumn()); c.addDecorator(2, createFunctionOffsetsRulerColumn());
} }
} }
} }
@ -1091,7 +1065,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
/** /**
* Hides the opcode ruler column. * Hides the opcode ruler column.
*/ */
private void hideOpcodeRuler() { private void hideFunctionOffsetsRuler() {
if (fOpcodeRulerColumn != null) { if (fOpcodeRulerColumn != null) {
IVerticalRuler v= getVerticalRuler(); IVerticalRuler v= getVerticalRuler();
if (v instanceof CompositeRuler) { if (v instanceof CompositeRuler) {
@ -2407,7 +2381,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
public void lockScroller() { public void lockScroller() {
assert isGuiThread(); assert isGuiThread();
assert fScrollPos == null; assert fScrollPos == null;
if (isOpcodeRulerVisible()) { if (isFunctionOffsetsRulerVisible()) {
fRedrawControl = fViewer.getControl(); fRedrawControl = fViewer.getControl();
} else { } else {
fRedrawControl = fViewer.getTextWidget(); fRedrawControl = fViewer.getTextWidget();
@ -2597,12 +2571,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
} }
} }
private boolean isDissemblyMixedModeOn() { /**
// TLETODO [disassembly] mixed mode on/off
return true;
}
/**
* Close this part * Close this part
*/ */
protected abstract void closePart(); protected abstract void closePart();
@ -2756,54 +2725,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
return pos; return pos;
} }
private void disassemblyModeChanged(boolean isDisassemblyOn) {
if (fShowDisassembly == isDisassemblyOn) {
return;
}
if (fShowDisassembly && !fSourceOnlyMode) {
// if not in source-only mode, do not update if disassembly mode is disabled
return;
}
fShowDisassembly = isDisassemblyOn;
if (!fShowDisassembly) {
sourceModeChanged(true);
}
fActionToggleSource.update();
Runnable doit = new Runnable() {
public void run() {
fDocument.invalidateDisassemblyWithSource(!fShowDisassembly);
fGotoFramePending = true;
}};
doScrollLocked(doit);
}
/**
* Turn on/off source mode.
* @param isSourceModeOn
*/
private void sourceModeChanged(boolean isSourceModeOn) {
if (fShowSource == isSourceModeOn) {
return;
}
fShowSource = isSourceModeOn;
fActionToggleSource.update();
fDocument.invalidateSource();
if (!fShowSource && !fShowDisassembly) {
disassemblyModeChanged(true);
} else {
fPCAnnotationUpdatePending = true;
updateInvalidSource();
if (fShowSource) {
Runnable doit = new Runnable() {
public void run() {
fDocument.invalidateAddressRange(fStartAddress, fEndAddress, true);
fGotoFramePending = true;
}};
doScrollLocked(doit);
}
}
}
public AddressBarContributionItem getAddressBar() { public AddressBarContributionItem getAddressBar() {
return fAddressBar; return fAddressBar;

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2007, 2008 Wind River Systems and others. * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -29,24 +29,20 @@ public class DisassemblyPreferenceConstants {
public static final String END_ADDRESS = "disassembly.endAddress"; //$NON-NLS-1$ public static final String END_ADDRESS = "disassembly.endAddress"; //$NON-NLS-1$
public static final String PC_HISTORY_SIZE = "disassembly.pcHistorySize"; //$NON-NLS-1$ public static final String PC_HISTORY_SIZE = "disassembly.pcHistorySize"; //$NON-NLS-1$
public static final String SHOW_SOURCE = "disassembly.showSource"; //$NON-NLS-1$ public static final String SHOW_SOURCE = "disassembly.showSource"; //$NON-NLS-1$
public static final String SHOW_LABELS = "disassembly.showLabels"; //$NON-NLS-1$
public static final String SHOW_SYMBOLS = "disassembly.showSymbols"; //$NON-NLS-1$ public static final String SHOW_SYMBOLS = "disassembly.showSymbols"; //$NON-NLS-1$
public static final String SIMPLIFIED = "disassembly.simplified"; //$NON-NLS-1$
public static final String INSTRUCTION_RADIX = "disassembly.instructionRadix"; //$NON-NLS-1$
public static final String ADDRESS_RADIX = "disassembly.addressRadix"; //$NON-NLS-1$ public static final String ADDRESS_RADIX = "disassembly.addressRadix"; //$NON-NLS-1$
public static final String SHOW_ADDRESS_RADIX = "disassembly.showAddressRadix"; //$NON-NLS-1$ public static final String SHOW_ADDRESS_RADIX = "disassembly.showAddressRadix"; //$NON-NLS-1$
public static final String SHOW_ADDRESS_RULER = "disassembly.showAddressRuler"; //$NON-NLS-1$ public static final String SHOW_ADDRESS_RULER = "disassembly.showAddressRuler"; //$NON-NLS-1$
public static final String ADDRESS_COLOR = "disassembly.addressColor"; //$NON-NLS-1$ public static final String ADDRESS_COLOR = "disassembly.addressColor"; //$NON-NLS-1$
public static final String SHOW_FUNCTION_OFFSETS = "disassembly.showFunctionOffsetRuler"; //$NON-NLS-1$ public static final String SHOW_FUNCTION_OFFSETS = "disassembly.showFunctionOffsetRuler"; //$NON-NLS-1$
public static final String OPCODE_COLOR = "disassembly.opcodeColor"; //$NON-NLS-1$ public static final String FUNCTION_OFFSETS_COLOR = "disassembly.functionOffsetsColor"; //$NON-NLS-1$
public static final String USE_SOURCE_ONLY_MODE = "disassembly.useSourceOnlyMode"; //$NON-NLS-1$
public static final String AVOID_READ_BEFORE_PC = "disassembly.avoidReadBeforePC"; //$NON-NLS-1$ public static final String AVOID_READ_BEFORE_PC = "disassembly.avoidReadBeforePC"; //$NON-NLS-1$
/** /**
* *
*/ */
private DisassemblyPreferenceConstants() { private DisassemblyPreferenceConstants() {
// not intended to be subclassed or instatiated // not intended to be subclassed or instantiated
} }
/** /**
@ -60,17 +56,13 @@ public class DisassemblyPreferenceConstants {
store.setDefault(PC_HISTORY_SIZE, 4); store.setDefault(PC_HISTORY_SIZE, 4);
store.setDefault(SHOW_SOURCE, true); store.setDefault(SHOW_SOURCE, true);
store.setDefault(SHOW_FUNCTION_OFFSETS, false); store.setDefault(SHOW_FUNCTION_OFFSETS, false);
store.setDefault(SHOW_LABELS, true);
store.setDefault(SHOW_SYMBOLS, true); store.setDefault(SHOW_SYMBOLS, true);
store.setDefault(SIMPLIFIED, true);
store.setDefault(INSTRUCTION_RADIX, 16);
store.setDefault(ADDRESS_RADIX, 16); store.setDefault(ADDRESS_RADIX, 16);
store.setDefault(SHOW_ADDRESS_RADIX, false); store.setDefault(SHOW_ADDRESS_RADIX, false);
store.setDefault(SHOW_ADDRESS_RULER, true); store.setDefault(SHOW_ADDRESS_RULER, true);
store.setDefault(AVOID_READ_BEFORE_PC, false); store.setDefault(AVOID_READ_BEFORE_PC, false);
store.setDefault(USE_SOURCE_ONLY_MODE, false);
PreferenceConverter.setDefault(store, ADDRESS_COLOR, new RGB(0, 96, 0)); PreferenceConverter.setDefault(store, ADDRESS_COLOR, new RGB(0, 96, 0));
PreferenceConverter.setDefault(store, OPCODE_COLOR, new RGB(96, 0, 0)); PreferenceConverter.setDefault(store, FUNCTION_OFFSETS_COLOR, new RGB(96, 0, 0));
} }
public static class Initializer extends AbstractPreferenceInitializer { public static class Initializer extends AbstractPreferenceInitializer {