1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-21 21:52:10 +02:00

Bug 501609 - Fix colors for disassembly view

All colors were hard-coded and it was nearly impossible to use the
view with a dark theme. Added colors to the preferences and changed
the main view background according to the theme.

Change-Id: Ic35df1e272e8b2a90f11c1af3cb3b105cd535fe5
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
This commit is contained in:
Marco Stornelli 2019-04-25 17:54:54 +02:00 committed by Doug Schaefer
parent fc25433621
commit 225ee8550a
10 changed files with 252 additions and 11 deletions

View file

@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-SymbolicName: org.eclipse.cdt.dsf.ui;singleton:=true
Bundle-Version: 2.5.1.qualifier
Bundle-Version: 2.5.100.qualifier
Bundle-Activator: org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin
Bundle-Localization: plugin
Require-Bundle: org.eclipse.ui;bundle-version="3.5.0",

View file

@ -54,6 +54,7 @@ public class AddressRulerColumn extends DisassemblyRulerColumn
setForeground(getColor(DisassemblyPreferenceConstants.ADDRESS_COLOR));
setRadix(prefs.getInt(DisassemblyPreferenceConstants.ADDRESS_RADIX));
setShowRadixPrefix(prefs.getBoolean(DisassemblyPreferenceConstants.SHOW_ADDRESS_RADIX));
setBackground(getColor(DisassemblyPreferenceConstants.RULER_BACKGROUND_COLOR));
setAddressSize(32);
}
@ -199,6 +200,9 @@ public class AddressRulerColumn extends DisassemblyRulerColumn
computeIndentations();
layout(false);
needRedraw = true;
} else if (DisassemblyPreferenceConstants.RULER_BACKGROUND_COLOR.equals(property)) {
setBackground(getColor(property));
needRedraw = true;
}
if (needRedraw) {
redraw();

View file

@ -68,6 +68,14 @@ public final class DisassemblyMessages extends NLS {
public static String DisassemblyPreferencePage_OpcodeFormat;
public static String DisassemblyPreferencePage_OpcodeFormatTooltip;
public static String DisassemblyPreferencePage_showRadixTooltip;
public static String DisassemblyPreferencePage_addressColor;
public static String DisassemblyPreferencePage_rulerBackgroundColor;
public static String DisassemblyPreferencePage_errorColor;
public static String DisassemblyPreferencePage_instructionColor;
public static String DisassemblyPreferencePage_sourceColor;
public static String DisassemblyPreferencePage_labelColor;
public static String DisassemblyPreferencePage_codeBytesColor;
public static String DisassemblyPreferencePage_offsetsColor;
public static String DisassemblyIPAnnotation_primary;
public static String DisassemblyIPAnnotation_secondary;
public static String SourceReadingJob_name;

View file

@ -64,6 +64,14 @@ DisassemblyPreferencePage_radix_hexadecimal=Hexadecimal
DisassemblyPreferencePage_OpcodeFormatTooltip=Use this format for the instruction value
DisassemblyPreferencePage_OpcodeFormat=Opcode display format:
DisassemblyPreferencePage_showRadixTooltip=Show '0x' with hexadecimal addresses
DisassemblyPreferencePage_addressColor=Address color
DisassemblyPreferencePage_codeBytesColor=Code bytes color
DisassemblyPreferencePage_offsetsColor=Offsets color
DisassemblyPreferencePage_rulerBackgroundColor=Ruler background color
DisassemblyPreferencePage_errorColor=Error color
DisassemblyPreferencePage_instructionColor=Instruction color
DisassemblyPreferencePage_sourceColor=Source color
DisassemblyPreferencePage_labelColor=Label color
DisassemblyIPAnnotation_primary=Debug Current Instruction Pointer
DisassemblyIPAnnotation_secondary=Debug Call Stack

View file

@ -725,8 +725,23 @@ public abstract class DisassemblyPart extends WorkbenchPart
support.setColumnVisible(desc, newState);
}
}
} else if (property.equals(DisassemblyPreferenceConstants.ERROR_COLOR)) {
fErrorColor = EditorsUI.getSharedTextColors().getColor(
PreferenceConverter.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.ERROR_COLOR));
refreshView(10);
} else if (property.equals(DisassemblyPreferenceConstants.INSTRUCTION_COLOR)) {
fInstructionColor = EditorsUI.getSharedTextColors().getColor(PreferenceConverter
.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.INSTRUCTION_COLOR));
refreshView(10);
} else if (property.equals(DisassemblyPreferenceConstants.SOURCE_COLOR)) {
fSourceColor = EditorsUI.getSharedTextColors().getColor(
PreferenceConverter.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.SOURCE_COLOR));
refreshView(10);
} else if (property.equals(DisassemblyPreferenceConstants.LABEL_COLOR)) {
fLabelColor = EditorsUI.getSharedTextColors().getColor(
PreferenceConverter.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.LABEL_COLOR));
refreshView(10);
}
}
/**
@ -741,7 +756,7 @@ public abstract class DisassemblyPart extends WorkbenchPart
parent.setLayout(layout);
fVerticalRuler = createVerticalRuler();
int styles = SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION;
fViewer = new DisassemblyViewer(parent, fVerticalRuler, getOverviewRuler(), true, styles);
fViewer = new DisassemblyViewer(parent, fVerticalRuler, getOverviewRuler(), true, styles, getPreferenceStore());
SourceViewerConfiguration sourceViewerConfig = new DisassemblyViewerConfiguration(this);
fViewer.addTextPresentationListener(this);
fViewer.configure(sourceViewerConfig);
@ -785,10 +800,14 @@ public abstract class DisassemblyPart extends WorkbenchPart
}
});
fErrorColor = getSharedColors().getColor(new RGB(96, 0, 0));
fInstructionColor = getSharedColors().getColor(new RGB(0, 0, 96));
fSourceColor = getSharedColors().getColor(new RGB(64, 0, 80));
fLabelColor = getSharedColors().getColor(new RGB(0, 0, 96));
fErrorColor = EditorsUI.getSharedTextColors().getColor(
PreferenceConverter.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.ERROR_COLOR));
fInstructionColor = EditorsUI.getSharedTextColors().getColor(
PreferenceConverter.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.INSTRUCTION_COLOR));
fSourceColor = EditorsUI.getSharedTextColors().getColor(
PreferenceConverter.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.SOURCE_COLOR));
fLabelColor = EditorsUI.getSharedTextColors().getColor(
PreferenceConverter.getColor(getPreferenceStore(), DisassemblyPreferenceConstants.LABEL_COLOR));
IVerticalRuler ruler = getVerticalRuler();
if (ruler instanceof CompositeRuler) {

View file

@ -37,6 +37,7 @@ public class FunctionOffsetRulerColumn extends DisassemblyRulerColumn {
public FunctionOffsetRulerColumn() {
super();
setForeground(getColor(DisassemblyPreferenceConstants.FUNCTION_OFFSETS_COLOR));
setBackground(getColor(DisassemblyPreferenceConstants.RULER_BACKGROUND_COLOR));
}
/*
@ -78,6 +79,9 @@ public class FunctionOffsetRulerColumn extends DisassemblyRulerColumn {
if (DisassemblyPreferenceConstants.FUNCTION_OFFSETS_COLOR.equals(property)) {
setForeground(getColor(property));
needRedraw = true;
} else if (DisassemblyPreferenceConstants.RULER_BACKGROUND_COLOR.equals(property)) {
setBackground(getColor(property));
needRedraw = true;
}
if (needRedraw) {
redraw();

View file

@ -40,6 +40,7 @@ public class OpcodeRulerColumn extends DisassemblyRulerColumn {
*/
public OpcodeRulerColumn() {
super();
setBackground(getColor(DisassemblyPreferenceConstants.RULER_BACKGROUND_COLOR));
setForeground(getColor(DisassemblyPreferenceConstants.CODE_BYTES_COLOR));
setRadix(getPreferenceStore().getInt(DisassemblyPreferenceConstants.OPCODE_RADIX));
}
@ -120,6 +121,9 @@ public class OpcodeRulerColumn extends DisassemblyRulerColumn {
setRadix(store.getInt(property));
layout(false);
needRedraw = true;
} else if (DisassemblyPreferenceConstants.RULER_BACKGROUND_COLOR.equals(property)) {
setBackground(getColor(property));
needRedraw = true;
}
if (needRedraw) {
redraw();

View file

@ -41,6 +41,11 @@ public class DisassemblyPreferenceConstants {
public static final String AVOID_READ_BEFORE_PC = "disassembly.avoidReadBeforePC"; //$NON-NLS-1$
public static final String TRACK_EXPRESSION = "disassembly.trackExpression"; //$NON-NLS-1$
public static final String SYNC_ACTIVE_CONTEXT = "disassembly.syncActiveContext"; //$NON-NLS-1$
public static final String RULER_BACKGROUND_COLOR = "disassembly.rulerBackgroundColor"; //$NON-NLS-1$
public static final String ERROR_COLOR = "disassembly.errorColor"; //$NON-NLS-1$
public static final String INSTRUCTION_COLOR = "disassembly.instructionColor"; //$NON-NLS-1$
public static final String SOURCE_COLOR = "disassembly.sourceColor"; //$NON-NLS-1$
public static final String LABEL_COLOR = "disassembly.labelColor"; //$NON-NLS-1$
/**
*
@ -66,6 +71,11 @@ public class DisassemblyPreferenceConstants {
PreferenceConverter.setDefault(store, ADDRESS_COLOR, new RGB(0, 96, 0));
PreferenceConverter.setDefault(store, FUNCTION_OFFSETS_COLOR, new RGB(96, 0, 0));
PreferenceConverter.setDefault(store, CODE_BYTES_COLOR, new RGB(96, 0, 0));
PreferenceConverter.setDefault(store, RULER_BACKGROUND_COLOR, new RGB(255, 255, 255));
PreferenceConverter.setDefault(store, ERROR_COLOR, new RGB(96, 0, 0));
PreferenceConverter.setDefault(store, INSTRUCTION_COLOR, new RGB(0, 0, 96));
PreferenceConverter.setDefault(store, SOURCE_COLOR, new RGB(64, 0, 80));
PreferenceConverter.setDefault(store, LABEL_COLOR, new RGB(0, 0, 96));
}
public static class Initializer extends AbstractPreferenceInitializer {

View file

@ -21,8 +21,11 @@ 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.ColorSelector;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.DataFormatException;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
@ -46,6 +49,7 @@ public class DisassemblyPreferencePage extends PreferencePage implements IWorkbe
private List<Button> fCheckBoxes = new ArrayList<>();
private List<Combo> fComboBoxes = new ArrayList<>();
private ArrayList<Text> fNumberFields = new ArrayList<>();
private List<ColorSelector> colors = new ArrayList<>();
private ModifyListener fNumberFieldListener = new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
@ -111,6 +115,31 @@ public class DisassemblyPreferencePage extends PreferencePage implements IWorkbe
Button showSymbolsCB = addCheckBox(composite, label, DisassemblyPreferenceConstants.SHOW_SYMBOLS, 0);
showSymbolsCB.setToolTipText(DisassemblyMessages.DisassemblyPreferencePage_showSymbolsTooltip);
Composite stylesComposite = new Composite(parent, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = 2;
stylesComposite.setLayout(layout);
stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.ERROR_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_errorColor, stylesComposite));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.INSTRUCTION_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_instructionColor, stylesComposite));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.SOURCE_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_sourceColor, stylesComposite));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.LABEL_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_labelColor, stylesComposite));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.RULER_BACKGROUND_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_rulerBackgroundColor, stylesComposite));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.ADDRESS_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_addressColor, stylesComposite));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.CODE_BYTES_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_codeBytesColor, stylesComposite));
colors.add(createColorFieldEditor(DisassemblyPreferenceConstants.FUNCTION_OFFSETS_COLOR,
DisassemblyMessages.DisassemblyPreferencePage_offsetsColor, stylesComposite));
Dialog.applyDialogFont(parent);
initialize();
@ -118,6 +147,25 @@ public class DisassemblyPreferencePage extends PreferencePage implements IWorkbe
return composite;
}
/**
* Creates a new color field editor.
*/
private ColorSelector createColorFieldEditor(String preferenceName, String label, Composite parent) {
Label labelControl = new Label(parent, SWT.LEFT);
labelControl.setText(label);
GridData gd = new GridData();
gd.horizontalIndent = GridData.BEGINNING;
labelControl.setLayoutData(gd);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalAlignment = GridData.END;
ColorSelector colorSelector = new ColorSelector(parent);
colorSelector.getButton().setLayoutData(gd);
colorSelector.getButton().setData(preferenceName);
return colorSelector;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
@ -216,7 +264,10 @@ public class DisassemblyPreferencePage extends PreferencePage implements IWorkbe
Combo combo = iter.next();
store.setValue((String) combo.getData(), fcRadixValues[combo.getSelectionIndex()]);
}
return super.performOk();
for (ColorSelector c : colors) {
store.setValue((String) c.getButton().getData(), StringConverter.asString(c.getColorValue()));
}
return true;
}
/* (non-Javadoc)
@ -243,7 +294,13 @@ public class DisassemblyPreferencePage extends PreferencePage implements IWorkbe
}
}
}
super.performDefaults();
for (ColorSelector c : colors) {
try {
c.setColorValue(StringConverter.asRGB(store.getDefaultString((String) c.getButton().getData())));
} catch (DataFormatException e) {
DsfUIPlugin.log(e);
}
}
}
/**
@ -270,6 +327,13 @@ public class DisassemblyPreferencePage extends PreferencePage implements IWorkbe
}
}
}
for (ColorSelector c : colors) {
try {
c.setColorValue(StringConverter.asRGB(store.getString((String) c.getButton().getData())));
} catch (DataFormatException e) {
DsfUIPlugin.log(e);
}
}
}
/**

View file

@ -19,6 +19,8 @@ import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocume
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
@ -27,20 +29,27 @@ import org.eclipse.jface.text.source.IOverviewRuler;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.jface.text.source.IVerticalRulerColumn;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.texteditor.AbstractTextEditor;
/**
* DisassemblyViewer
*/
public class DisassemblyViewer extends SourceViewer {
public class DisassemblyViewer extends SourceViewer implements IPropertyChangeListener {
class ResizeListener implements ControlListener {
@Override
@ -53,8 +62,12 @@ public class DisassemblyViewer extends SourceViewer {
}
}
private Color fForegroundColor;
private Color fBackgroundColor;
private boolean fUserTriggeredScrolling;
private int fCachedLastTopPixel;
private IPreferenceStore fPreferenceStore;
private boolean fIsConfigured = false;
/**
* Create a new DisassemblyViewer.
@ -65,10 +78,107 @@ public class DisassemblyViewer extends SourceViewer {
* @param styles
*/
public DisassemblyViewer(Composite parent, IVerticalRuler ruler, IOverviewRuler overviewRuler,
boolean showsAnnotationOverview, int styles) {
boolean showsAnnotationOverview, int styles, IPreferenceStore store) {
super(parent, ruler, overviewRuler, showsAnnotationOverview, styles);
// always readonly
setEditable(false);
setPreferenceStore(store);
}
/**
* Creates a color from the information stored in the given preference store.
* Returns <code>null</code> if there is no such information available.
*
* @param store the store to read from
* @param key the key used for the lookup in the preference store
* @param display the display used create the color
* @return the created color according to the specification in the preference store
*/
private Color createColor(IPreferenceStore store, String key, Display display) {
RGB rgb = null;
if (store.contains(key)) {
if (store.isDefault(key)) {
rgb = PreferenceConverter.getDefaultColor(store, key);
} else {
rgb = PreferenceConverter.getColor(store, key);
}
if (rgb != null)
return new Color(display, rgb);
}
return null;
}
protected void initializeViewerColors() {
if (fPreferenceStore != null) {
StyledText styledText = getTextWidget();
// ----------- foreground color --------------------
Color color = fPreferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT)
? null
: createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND,
styledText.getDisplay());
styledText.setForeground(color);
if (fForegroundColor != null)
fForegroundColor.dispose();
fForegroundColor = color;
// ---------- background color ----------------------
color = fPreferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT) ? null
: createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND,
styledText.getDisplay());
styledText.setBackground(color);
if (fBackgroundColor != null)
fBackgroundColor.dispose();
fBackgroundColor = color;
}
}
public void setPreferenceStore(IPreferenceStore store) {
if (fIsConfigured && fPreferenceStore != null)
fPreferenceStore.removePropertyChangeListener(this);
fPreferenceStore = store;
if (fIsConfigured && fPreferenceStore != null) {
fPreferenceStore.addPropertyChangeListener(this);
initializeViewerColors();
}
}
@Override
public void unconfigure() {
if (fForegroundColor != null) {
fForegroundColor.dispose();
fForegroundColor = null;
}
if (fBackgroundColor != null) {
fBackgroundColor.dispose();
fBackgroundColor = null;
}
if (fPreferenceStore != null)
fPreferenceStore.removePropertyChangeListener(this);
super.unconfigure();
fIsConfigured = false;
}
@Override
public void configure(SourceViewerConfiguration configuration) {
super.configure(configuration);
if (fPreferenceStore != null) {
fPreferenceStore.addPropertyChangeListener(this);
initializeViewerColors();
}
fIsConfigured = true;
}
/*
@ -273,4 +383,14 @@ public class DisassemblyViewer extends SourceViewer {
super.updateViewportListeners(origin);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND.equals(property)
|| AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT.equals(property)
|| AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND.equals(property)
|| AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(property)) {
initializeViewerColors();
}
}
}