GP-2914 fixed issue with snapshot listing colors. Also, cleaned up color usage in FieldFactories

This commit is contained in:
ghidragon 2022-12-06 18:34:40 -05:00
parent ac29835fc3
commit db464c8bb2
62 changed files with 641 additions and 1382 deletions

View file

@ -20,6 +20,7 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.AttributedString;
import docking.widgets.fieldpanel.field.TextFieldElement;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GColor;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.*;
import ghidra.app.util.viewer.format.FieldFormatModel;
@ -42,6 +43,7 @@ import ghidra.taint.model.TaintVec;
*/
public class TaintFieldFactory extends FieldFactory {
public static final String PROPERTY_NAME = TaintTracePcodeExecutorStatePiece.NAME;
public static final GColor COLOR = new GColor("color.fg.listing.taint");
public static final String FIELD_NAME = "Taint";
public TaintFieldFactory() {
@ -90,7 +92,7 @@ public class TaintFieldFactory extends FieldFactory {
}
return ListingTextField.createSingleLineTextField(this, proxy,
new TextFieldElement(new AttributedString(vec.toDisplay(), color, getMetrics()), 0, 0),
new TextFieldElement(new AttributedString(vec.toDisplay(), COLOR, getMetrics()), 0, 0),
startX + varWidth, width, hlProvider);
}

View file

@ -21,8 +21,8 @@ import java.util.List;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors.Messages;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.*;
import ghidra.app.util.viewer.format.FieldFormatModel;
@ -35,6 +35,7 @@ import ghidra.program.util.ProgramLocation;
import ghidra.util.classfinder.ClassSearcher;
public class ExternalDisassemblyFieldFactory extends FieldFactory {
public static final GColor COLOR = new GColor("color.fg.listing.disassembly.external");
private static List<ExternalDisassembler> availableDisassemblers;
@ -65,12 +66,6 @@ public class ExternalDisassemblyFieldFactory extends FieldFactory {
super(FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
// have no options
}
@Override
public boolean acceptsType(int category, Class<?> proxyObjectClass) {
return (category == FieldFormatModel.INSTRUCTION_OR_DATA);
@ -131,7 +126,7 @@ public class ExternalDisassemblyFieldFactory extends FieldFactory {
if (disassembly == null) {
return null;
}
AttributedString text = new AttributedString(disassembly, Palette.BLACK, getMetrics());
AttributedString text = new AttributedString(disassembly, COLOR, getMetrics());
FieldElement fieldElement = new TextFieldElement(text, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, fieldElement,
startX + varWidth, width, hlProvider);

View file

@ -20,6 +20,7 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GColor;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.*;
import ghidra.app.util.viewer.format.FieldFormatModel;
@ -34,6 +35,7 @@ import ghidra.program.util.ProgramLocation;
public class EntropyFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Entropy";
public static final GColor COLOR = new GColor("color.fg.listing.bytes.entropy");
StringBuffer sb = new StringBuffer();
/**
@ -80,19 +82,19 @@ public class EntropyFieldFactory extends FieldFactory {
}
entropy = calcEntropy(bytes, 0, bytes.length);
float[] hsbvals = Color.RGBtoHSB(255, 0, 0, null);
color =
Color color =
Color.getHSBColor(hsbvals[0], hsbvals[1], (float) (hsbvals[1] * (entropy / 8.0)));
String str = "" + (int) ((entropy / 8.0) * 100);
AttributedString text = new AttributedString(str, color, getMetrics());
FieldElement fieldElement = new TextFieldElement(text, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, fieldElement,
startX + varWidth, width, hlProvider);
}
catch (MemoryAccessException e) {
return null;
}
String str = "" + (int) ((entropy / 8.0) * 100);
AttributedString text = new AttributedString(str, color, getMetrics());
FieldElement fieldElement = new TextFieldElement(text, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, fieldElement,
startX + varWidth, width, hlProvider);
}
private double calcEntropy(byte[] b, int start, int len) {
@ -153,8 +155,8 @@ public class EntropyFieldFactory extends FieldFactory {
@Override
public FieldFactory newInstance(FieldFormatModel myModel, HighlightProvider myHlProvider,
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new EntropyFieldFactory(myModel, myHlProvider, displayOptions, fieldOptions);
ToolOptions displayOptions1, ToolOptions fieldOptions) {
return new EntropyFieldFactory(myModel, myHlProvider, displayOptions1, fieldOptions);
}
}

View file

@ -22,11 +22,10 @@ color.cursor.focused.listing = color.cursor.focused
color.cursor.unfocused.listing = color.cursor.unfocused
color.fg.listing.address = color.fg
color.fg.listing.ref.bad = red
color.fg.listing.bytes = blue
color.fg.listing.constant = green
color.fg.listing.label.unreferenced = black
color.fg.listing.entrypoint = magenta
color.fg.listing.ext.entrypoint = magenta
color.fg.listing.comment.auto = lightGray
color.fg.listing.comment.eol = blue
color.fg.listing.comment.repeatable = darkOrange
@ -34,7 +33,9 @@ color.fg.listing.comment.ref.repeatable = cornflowerBlue
color.fg.listing.comment.plate = gray
color.fg.listing.comment.post = blue
color.fg.listing.comment.pre = indigo
color.fg.listing.ref.ext.resolved = teal
color.fg.listing.ref.bad = red
color.fg.listing.ext.ref.unresolved = color.fg.listing.ref.bad
color.fg.listing.ext.ref.resolved = teal
color.fg.listing.fieldname = color.fg
color.fg.listing.function.callfixup = fuchsia
color.fg.listing.function.name = blue
@ -44,20 +45,33 @@ color.fg.listing.function.param.auto = gray
color.fg.listing.function.return.type = black
color.fg.listing.function.param.custom = indigo
color.fg.listing.function.param.dynamic = #006666
color.fg.listing.function.variable = purple
color.fg.listing.function.variable.assigned = purple
color.fg.listing.function.name.thunk = color.fg.listing.function.name
color.fg.listing.label.local = green
color.fg.listing.label.non.primary = olive
color.fg.listing.label.primary = darkBlue
color.fg.listing.mnemonic.override = deepPink
color.fg.listing.mnemonic = navy
color.fg.listing.mnemonic.unimplemented = navy
color.fg.listing.array.values = color.fg
color.fg.listing.bytes.alignment = gray
color.fg.listing.bytes.entropy = color.fg
color.fg.listing.disassembly.external = color.fg
color.fg.listing.file.offset = color.fg
color.fg.listing.function.purge = blue
color.fg.listing.function.source = color.fg
color.fg.listing.mask.bits = navy
color.fg.listing.mask.value = green
color.fg.listing.mask.label = color.fg
color.fg.listing.block.start = indigo
color.fg.listing.instruction.parallel = blue
// TODO
color.fg.listing.flow.arrow.inactive = lightGray
color.fg.listing.flow.arrow.active = color.fg
color.fg.listing.flow.arrow.selected = limeGreen
color.fg.listing.separator = color.fg
color.fg.listing.variable = purple
color.fg.listing.version.tracking = purple
color.fg.listing.xref = darkGreen
color.fg.listing.xref.offcut = gray
color.fg.listing.xref.read = blue
@ -66,9 +80,12 @@ color.fg.listing.xref.other = color.fg
color.fg.listing.register = olive
color.fg.listing.underline = cornflowerBlue
color.fg.listing.pcode.label = blue
color.fg.listing.pcode.space = blue
color.fg.listing.pcode.address.space = blue
color.fg.listing.pcode.varnode = blue
color.fg.listing.pcode.userop = blue
color.fg.listing.stack.depth = blue
color.fg.listing.taint = color.fg
color.bg.listing.comparison.bytes = chartreuse
color.bg.listing.comparison.mnemonic = chartreuse
@ -97,10 +114,8 @@ color.fg.listing.header.active.field = black
color.fg.listing.address = color.fg
color.fg.listing.ref.bad = color.palette.red
color.fg.listing.bytes = color.palette.blue
color.fg.listing.constant = color.palette.green
color.fg.listing.label.unreferenced = color.fg
color.fg.listing.entrypoint = color.palette.magenta
color.fg.listing.comment.auto = color.fg
color.fg.listing.comment.eol = color.palette.blue
@ -109,7 +124,7 @@ color.fg.listing.comment.ref.repeatable = color.palette.darkcyan
color.fg.listing.comment.plate = gray
color.fg.listing.comment.post = color.palette.blue
color.fg.listing.comment.pre = color.palette.indigo
color.fg.listing.ref.ext.resolved = color.palette.teal
color.fg.listing.ref.resolved = color.palette.teal
color.fg.listing.fieldname = color.fg
color.fg.listing.function.callfixup = color.palette.magenta
color.fg.listing.function.name = color.palette.blue
@ -119,9 +134,12 @@ color.fg.listing.function.param.auto = gray
color.fg.listing.function.return.type = color.fg
color.fg.listing.function.param.custom = color.palette.indigo
color.fg.listing.function.param.dynamic = color.palette.teal
color.fg.listing.function.variable = color.palette.purple
color.fg.listing.function.variable.assigned = color.palette.purple
color.fg.listing.label.local = color.palette.green
color.fg.listing.label.non.primary = color.palette.olive
color.fg.listing.label.primary = color.palette.cyan
color.fg.listing.label.unreferenced = color.fg
color.fg.listing.mnemonic.override = color.palette.pink
color.fg.listing.mnemonic = color.palette.cyan
color.fg.listing.mnemonic.unimplemented = color.palette.cyan
@ -131,7 +149,6 @@ color.fg.listing.flow.arrow.inactive = lightGray
color.fg.listing.flow.arrow.active = color.fg
color.fg.listing.flow.arrow.selected = limeGreen
color.fg.listing.separator = color.fg
color.fg.listing.variable = color.palette.purple
color.fg.listing.version.tracking = color.palette.purple
color.fg.listing.xref = color.palette.darkgreen
color.fg.listing.xref.offcut = gray
@ -141,6 +158,6 @@ color.fg.listing.xref.other = color.fg
color.fg.listing.register = color.palette.olive
color.fg.listing.underline = cornflowerBlue
color.fg.listing.pcode.label = color.palette.blue
color.fg.listing.pcode.space = color.palette.blue
color.fg.listing.pcode.address.space = color.palette.blue
color.fg.listing.pcode.varnode = color.palette.blue
color.fg.listing.pcode.userop = color.palette.blue

View file

@ -5,11 +5,7 @@ color.bg.undefined = rgb(220, 220, 220) // bg for clients displaying undefined f
color.flowtype.fall.through = red
color.flowtype.jump.conditional = #007C00 // dark green
color.flowtype.jump.unconditional = blue
color.function.thunk = color.palette.blue
color.fg.function.name = color.palette.blue
color.fg.function.params = color.palette.magenta
color.bg.table.selection.bundle = [color]textHighlight
color.fg.table.selection.bundle = [color]textHighlightText
color.fg.table.bundle.disabled = darkGray
@ -75,6 +71,8 @@ color.bg.plugin.datamgr.edge.composite = magenta
color.bg.plugin.datamgr.edge.reference = blue
color.bg.plugin.datamgr.icon.highlight = rgb(204, 204, 255)
color.fg.plugin.disassembledview.address = color.fg
color.bg.plugin.editors.compositeeditor.text = color.fg
color.bg.plugin.editors.compositeeditor.line = system.color.border
color.bg.plugin.editors.compositeeditor.line.interior = #D4D4D4
@ -87,11 +85,10 @@ color.bg.plugin.editors.compositeeditor.non.bit = #A0A0FF
color.fg.plugin.equate.enum = lightskyblue
color.fg.plugin.function.editor.dialog.thunk = color.function.thunk
color.fg.plugin.function.editor.dialog.textfield.default = color.fg
color.fg.plugin.function.editor.dialog.textfield.error = color.fg.error
color.fg.plugin.function.editor.dialog.textfield.function.name = color.palette.blue
color.fg.plugin.function.editor.dialog.textfield.parameter = color.fg.function.params
color.fg.plugin.function.editor.dialog.textfield.parameter = color.fg.listing.function.param
color.bg.plugin.instructionsearch.table.masked.instruction = rgb(237, 243, 254) // faint blue
color.bg.plugin.instructionsearch.table.masked.non.instruction = rgb(255, 242, 214) // tan

View file

@ -40,12 +40,10 @@ import ghidra.app.plugin.core.codebrowser.hover.ListingHoverService;
import ghidra.app.services.*;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.ProgramDropProvider;
import ghidra.app.util.viewer.field.ListingField;
import ghidra.app.util.viewer.field.ListingTextField;
import ghidra.app.util.viewer.field.*;
import ghidra.app.util.viewer.format.*;
import ghidra.app.util.viewer.listingpanel.*;
import ghidra.app.util.viewer.options.ListingDisplayOptionsEditor;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.util.AddressIndexMap;
import ghidra.framework.model.*;
import ghidra.framework.options.*;
@ -112,7 +110,7 @@ public abstract class AbstractCodeBrowserPlugin<P extends CodeViewerProvider> ex
connectedProvider = createProvider(formatMgr, true);
tool.showComponentProvider(connectedProvider, true);
initOptions(fieldOptions);
initDisplayOptions(displayOptions);
connectedProvider.getListingPanel().setTextBackgroundColor(ListingColors.BACKGROUND);
initMiscellaneousOptions();
displayOptions.addOptionsChangeListener(this);
fieldOptions.addOptionsChangeListener(this);
@ -385,13 +383,7 @@ public abstract class AbstractCodeBrowserPlugin<P extends CodeViewerProvider> ex
Object newValue) {
ListingPanel listingPanel = connectedProvider.getListingPanel();
if (options.getName().equals(GhidraOptions.CATEGORY_BROWSER_DISPLAY)) {
if (optionName.equals(OptionsGui.BACKGROUND.getColorOptionName())) {
Color c = (Color) newValue;
listingPanel.setTextBackgroundColor(c);
}
}
else if (options.getName().equals(GhidraOptions.CATEGORY_BROWSER_FIELDS)) {
if (options.getName().equals(GhidraOptions.CATEGORY_BROWSER_FIELDS)) {
FieldPanel fieldPanel = listingPanel.getFieldPanel();
if (optionName.equals(GhidraOptions.OPTION_SELECTION_COLOR)) {
@ -563,12 +555,9 @@ public abstract class AbstractCodeBrowserPlugin<P extends CodeViewerProvider> ex
"The highlight color in the browser.");
fieldOptions.registerThemeColorBinding(CURSOR_COLOR_OPTIONS_NAME,
FOCUSED_CURSOR_COLOR.getId(),
helpLocation,
"The color of the cursor in the browser.");
FOCUSED_CURSOR_COLOR.getId(), helpLocation, "The color of the cursor in the browser.");
fieldOptions.registerThemeColorBinding(UNFOCUSED_CURSOR_COLOR_OPTIONS_NAME,
UNFOCUSED_CURSOR_COLOR.getId(),
helpLocation,
UNFOCUSED_CURSOR_COLOR.getId(), helpLocation,
"The color of the cursor in the browser when the browser does not have focus.");
fieldOptions.registerOption(BLINK_CURSOR_OPTIONS_NAME, true, helpLocation,
"When selected, the cursor will blink when the containing window is focused.");
@ -580,8 +569,7 @@ public abstract class AbstractCodeBrowserPlugin<P extends CodeViewerProvider> ex
helpLocation = new HelpLocation(getName(), "Keyboard_Controls_Shift");
fieldOptions.registerOption(MOUSE_WHEEL_HORIZONTAL_SCROLLING_OPTIONS_NAME, true,
helpLocation,
"Enables horizontal scrolling by holding the Shift key while " +
helpLocation, "Enables horizontal scrolling by holding the Shift key while " +
"using the mouse scroll wheel");
Color color = fieldOptions.getColor(GhidraOptions.OPTION_SELECTION_COLOR,
@ -594,9 +582,8 @@ public abstract class AbstractCodeBrowserPlugin<P extends CodeViewerProvider> ex
selectionMarkers.setMarkerColor(color);
}
color =
fieldOptions.getColor(GhidraOptions.OPTION_HIGHLIGHT_COLOR,
GhidraOptions.DEFAULT_HIGHLIGHT_COLOR);
color = fieldOptions.getColor(GhidraOptions.OPTION_HIGHLIGHT_COLOR,
GhidraOptions.DEFAULT_HIGHLIGHT_COLOR);
MarkerSet highlightMarkers = getHighlightMarkers(currentProgram);
fieldPanel.setHighlightColor(color);
if (highlightMarkers != null) {
@ -622,12 +609,6 @@ public abstract class AbstractCodeBrowserPlugin<P extends CodeViewerProvider> ex
isHighlightCursorLine = fieldOptions.getBoolean(GhidraOptions.HIGHLIGHT_CURSOR_LINE, true);
}
private void initDisplayOptions(Options displayOptions) {
Color color = displayOptions.getColor(OptionsGui.BACKGROUND.getColorOptionName(),
OptionsGui.BACKGROUND.getDefaultColor());
connectedProvider.getListingPanel().setTextBackgroundColor(color);
}
private void initMiscellaneousOptions() {
// make sure the following options are registered
HelpLocation helpLocation =

View file

@ -15,7 +15,8 @@
*/
package ghidra.app.plugin.core.disassembler;
import java.awt.*;
import java.awt.Color;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
@ -24,15 +25,14 @@ import javax.swing.event.ChangeListener;
import docking.WindowPosition;
import docking.widgets.list.GListCellRenderer;
import generic.theme.GColor;
import generic.theme.Gui;
import ghidra.GhidraOptions;
import ghidra.app.CorePluginPackage;
import ghidra.app.plugin.PluginCategoryNames;
import ghidra.app.plugin.ProgramPlugin;
import ghidra.app.util.PseudoDisassembler;
import ghidra.app.util.viewer.field.BrowserCodeUnitFormat;
import ghidra.app.util.viewer.field.FieldFactory;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.field.*;
import ghidra.framework.model.DomainObjectChangedEvent;
import ghidra.framework.model.DomainObjectListener;
import ghidra.framework.options.OptionsChangeListener;
@ -78,6 +78,9 @@ import ghidra.util.exception.UsrException;
)
//@formatter:on
public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjectListener {
private static final Color ADDRESS_COLOR =
new GColor("color.fg.plugin.disassembledview.address");
/**
* The number of addresses that should be disassembled, including the
* address of the current {@link ProgramLocation}.
@ -324,24 +327,6 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
* The component provided for the DisassembledViewPlugin.
*/
private class DisassembledViewComponentProvider extends ComponentProviderAdapter {
/**
* Constant for the selection color setting.
*/
/**
* Constant for the address foreground color setting.
*/
private static final String ADDRESS_COLOR_OPTION = "Address Color";
/**
* Constant for the browser font setting.
*/
private static final String ADDRESS_FONT_OPTION = "BASE FONT";
/**
* Constant for the browser's background setting.
*/
private static final String BACKGROUND_COLOR_OPTION = "Background Color";
/**
* The constant part of the tooltip text for the list cells. This
* string is prepended to the currently selected address in the
@ -363,27 +348,6 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
*/
private JList<DisassembledAddressInfo> contentList;
/**
* The color of the address in the list that represents the current
* selection in the code browser.
*/
private Color selectedAddressColor;
/**
* The color of the preview text.
*/
private Color addressForegroundColor;
/**
* The color for the list background.
*/
private Color backgroundColor;
/**
* The font for the list items.
*/
private Font font;
/**
* The preview style of the addresses being displayed.
*/
@ -438,7 +402,7 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
setFont(font);
setFont(Gui.getFont(FieldFactory.BASE_LISTING_FONT_ID));
setToolTipText(TOOLTIP_TEXT_PREPEND +
HTMLUtilities.escapeHTML(currentLocation.getAddress().toString()));
@ -446,8 +410,8 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
// make sure the first value is highlighted to indicate
// that it is the selected program location
if (index == 0) {
Color foreground = addressForegroundColor;
Color background = selectedAddressColor;
Color foreground = ADDRESS_COLOR;
Color background = GhidraOptions.DEFAULT_SELECTION_COLOR;
if (isSelected) {
foreground = Gui.brighter(foreground);
@ -471,10 +435,6 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
ToolOptions opt = tool.getOptions(GhidraOptions.CATEGORY_BROWSER_FIELDS);
opt.addOptionsChangeListener(optionsChangeListener);
// current address background color
selectedAddressColor = opt.getColor(GhidraOptions.OPTION_SELECTION_COLOR,
GhidraOptions.DEFAULT_SELECTION_COLOR);
// the address preview style
addressPreviewFormat = new BrowserCodeUnitFormat(tool);
addressPreviewFormat.addChangeListener(addressFormatChangeListener);
@ -482,20 +442,9 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
opt = tool.getOptions(GhidraOptions.CATEGORY_BROWSER_DISPLAY);
opt.addOptionsChangeListener(optionsChangeListener);
// the preview text color
addressForegroundColor = opt.getColor(OptionsGui.SEPARATOR.getColorOptionName(),
OptionsGui.SEPARATOR.getDefaultColor());
// background color
backgroundColor = opt.getColor(OptionsGui.BACKGROUND.getColorOptionName(),
OptionsGui.BACKGROUND.getDefaultColor());
// font
font = Gui.getFont(FieldFactory.BASE_LISTING_FONT_ID);
contentList.setForeground(addressForegroundColor);
contentList.setBackground(backgroundColor);
contentList.setFont(font);
contentList.setForeground(ADDRESS_COLOR);
contentList.setBackground(ListingColors.BACKGROUND);
Gui.registerFont(contentList, "font.listing.base");
}
/**
@ -565,25 +514,6 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
@Override
public void optionsChanged(ToolOptions options, String optionName, Object oldValue,
Object newValue) {
if (options.getName().equals(GhidraOptions.CATEGORY_BROWSER_FIELDS)) {
if (optionName.equals(GhidraOptions.OPTION_SELECTION_COLOR)) {
selectedAddressColor = (Color) newValue;
}
}
else if (options.getName().equals(GhidraOptions.CATEGORY_BROWSER_DISPLAY)) {
if (optionName.equals(ADDRESS_COLOR_OPTION)) {
addressForegroundColor = (Color) newValue;
contentList.setForeground(addressForegroundColor);
}
else if (optionName.equals(BACKGROUND_COLOR_OPTION)) {
backgroundColor = (Color) newValue;
contentList.setBackground(backgroundColor);
}
else if (optionName.equals(ADDRESS_FONT_OPTION)) {
font = Gui.getFont(FieldFactory.BASE_LISTING_FONT_ID);
}
}
// update the display
contentList.repaint();
}

View file

@ -28,6 +28,8 @@ import ghidra.app.CorePluginPackage;
import ghidra.app.events.*;
import ghidra.app.plugin.PluginCategoryNames;
import ghidra.app.services.CodeViewerService;
import ghidra.app.util.viewer.field.ListingColors;
import ghidra.app.util.viewer.field.ListingColors.FlowArrowColors;
import ghidra.app.util.viewer.listingpanel.*;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.util.AddressIndexMap;
@ -434,8 +436,7 @@ public class FlowArrowPlugin extends Plugin implements MarginProvider, OptionsCh
List<FlowArrow> results = new ArrayList<>();
ArrowCache arrowCache = new ArrowCache();
CodeUnitIterator it = program.getListing()
.getCodeUnitIterator(
CodeUnit.INSTRUCTION_PROPERTY, screenAddresses, true);
.getCodeUnitIterator(CodeUnit.INSTRUCTION_PROPERTY, screenAddresses, true);
while (it.hasNext()) {
CodeUnit cu = it.next();
@ -545,9 +546,8 @@ public class FlowArrowPlugin extends Plugin implements MarginProvider, OptionsCh
Address bottomAddr = layoutToPixel.getLayoutAddress(n - 1);
if (bottomAddr != null) {
AddressSpace testSpace = bottomAddr.getAddressSpace();
validState = (program.getAddressFactory()
.getAddressSpace(
testSpace.getSpaceID()) == testSpace);
validState =
(program.getAddressFactory().getAddressSpace(testSpace.getSpaceID()) == testSpace);
}
}
@ -652,21 +652,10 @@ public class FlowArrowPlugin extends Plugin implements MarginProvider, OptionsCh
OptionsGui.FLOW_ARROW_SELECTED.getThemeColorId(), null,
"The color for an arrow that has been selected by the user");
Color c = opt.getColor(OptionsGui.BACKGROUND.getColorOptionName(),
OptionsGui.BACKGROUND.getDefaultColor());
flowArrowPanel.setBackground(c);
c = opt.getColor(OptionsGui.FLOW_ARROW_NON_ACTIVE.getColorOptionName(),
OptionsGui.FLOW_ARROW_NON_ACTIVE.getDefaultColor());
flowArrowPanel.setForeground(c);
c = opt.getColor(OptionsGui.FLOW_ARROW_ACTIVE.getColorOptionName(),
OptionsGui.FLOW_ARROW_ACTIVE.getDefaultColor());
flowArrowPanel.setHighlightColor(c);
c = opt.getColor(OptionsGui.FLOW_ARROW_SELECTED.getColorOptionName(),
OptionsGui.FLOW_ARROW_SELECTED.getDefaultColor());
flowArrowPanel.setSelectedColor(c);
flowArrowPanel.setBackground(ListingColors.BACKGROUND);
flowArrowPanel.setForeground(FlowArrowColors.INACTIVE);
flowArrowPanel.setHighlightColor(FlowArrowColors.ACTIVE);
flowArrowPanel.setSelectedColor(FlowArrowColors.SELECTED);
opt.addOptionsChangeListener(this);
}

View file

@ -19,13 +19,12 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.cmd.function.CallDepthChangeInfo;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.*;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
@ -36,6 +35,7 @@ import ghidra.program.util.StackDepthFieldLocation;
public class StackDepthFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Stack Depth";
public static final GColor COLOR = new GColor("color.fg.listing.stack.depth");
private Address lastEntry = null;
private CallDepthChangeInfo depth = null;
private long lastModNumber = -1;
@ -47,9 +47,6 @@ public class StackDepthFieldFactory extends FieldFactory {
private StackDepthFieldFactory(FieldFormatModel model, HighlightProvider hsProvider,
Options displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, hsProvider, displayOptions, fieldOptions);
color = displayOptions.getColor(OptionsGui.BYTES.getColorOptionName(),
OptionsGui.BYTES.getDefaultColor());
}
@Override
@ -88,7 +85,7 @@ public class StackDepthFieldFactory extends FieldFactory {
// This can be used to display the value of any register symbolically flowing over the program.
// depthString = depth.getRegValueRepresentation(cu.getMinAddress(), cu.getProgram().getRegister("ESP"));
AttributedString as = new AttributedString(depthString, Palette.BLUE, getMetrics());
AttributedString as = new AttributedString(depthString, COLOR, getMetrics());
Integer overrideDepth =
CallDepthChangeInfo.getStackDepthChange(cu.getProgram(), cu.getMinAddress());
@ -166,5 +163,4 @@ public class StackDepthFieldFactory extends FieldFactory {
}
return (category == FieldFormatModel.INSTRUCTION_OR_DATA);
}
}

View file

@ -35,7 +35,6 @@ import docking.widgets.checkbox.GCheckBox;
import docking.widgets.combobox.GComboBox;
import docking.widgets.label.GLabel;
import docking.widgets.table.*;
import generic.theme.GColor;
import generic.theme.GIcon;
import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.*;
@ -43,6 +42,7 @@ import generic.util.WindowUtilities;
import ghidra.app.services.DataTypeManagerService;
import ghidra.app.util.ToolTipUtils;
import ghidra.app.util.cparser.C.CParserUtils;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.program.model.address.Address;
import ghidra.program.model.data.DataType;
import ghidra.program.model.listing.Function;
@ -54,8 +54,6 @@ import ghidra.util.layout.VerticalLayout;
import resources.Icons;
public class FunctionEditorDialog extends DialogComponentProvider implements ModelChangeListener {
private static final Color FG_COLOR_THUNK =
new GColor("color.fg.plugin.function.editor.dialog.thunk");
private FunctionEditorModel model;
private DocumentListener nameFieldDocumentListener;
@ -215,7 +213,7 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod
BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Java.BORDER),
BorderFactory.createEmptyBorder(0, 5, 0, 5));
thunkedText.setBorder(border);
thunkedText.setForeground(FG_COLOR_THUNK);
thunkedText.setForeground(FunctionColors.THUNK);
thunkedPanel.add(thunkedText);
return thunkedPanel;
}
@ -304,8 +302,8 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod
signatureTextField.setTabListener(tabListener);
signatureTextField.setChangeListener(
e -> model.setSignatureFieldText(signatureTextField.getText()));
signatureTextField
.setChangeListener(e -> model.setSignatureFieldText(signatureTextField.getText()));
return panel;
}
@ -334,9 +332,8 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod
message += "<BR><BR>";
}
message = HTMLUtilities.wrapAsHTML(
message + "<CENTER><B>Do you want to continue editing or " +
"abort your changes?</B></CENTER>");
message = HTMLUtilities.wrapAsHTML(message +
"<CENTER><B>Do you want to continue editing or " + "abort your changes?</B></CENTER>");
int result = OptionDialog.showOptionNoCancelDialog(rootPanel, "Invalid Function Signature",
message, "Continue Editing", "Abort Changes", OptionDialog.ERROR_MESSAGE);
return result == OptionDialog.OPTION_TWO; // Option 2 is to abort
@ -372,8 +369,8 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod
noReturnCheckBox = new GCheckBox("No Return");
noReturnCheckBox.addItemListener(e -> model.setNoReturn(noReturnCheckBox.isSelected()));
storageCheckBox = new GCheckBox("Use Custom Storage");
storageCheckBox.addItemListener(
e -> model.setUseCustomizeStorage(storageCheckBox.isSelected()));
storageCheckBox
.addItemListener(e -> model.setUseCustomizeStorage(storageCheckBox.isSelected()));
panel.add(noReturnCheckBox);
panel.add(storageCheckBox);
panel.setBorder(BorderFactory.createTitledBorder("Function Attributes:"));
@ -386,8 +383,8 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod
String[] names = new String[callingConventionNames.size()];
callingConventionComboBox = new GComboBox<>(callingConventionNames.toArray(names));
callingConventionComboBox.setSelectedItem(model.getCallingConventionName());
callingConventionComboBox.addItemListener(e -> model.setCallingConventionName(
(String) callingConventionComboBox.getSelectedItem()));
callingConventionComboBox.addItemListener(e -> model
.setCallingConventionName((String) callingConventionComboBox.getSelectedItem()));
return callingConventionComboBox;
}
@ -400,8 +397,8 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod
callFixupComboBox.addItem(FunctionEditorModel.NONE_CHOICE);
if (callFixupNames.length != 0) {
callFixupComboBox.setToolTipText(
"Select call-fixup as defined by compiler specification");
callFixupComboBox
.setToolTipText("Select call-fixup as defined by compiler specification");
for (String element : callFixupNames) {
callFixupComboBox.addItem(element);
}
@ -760,15 +757,13 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod
setToolTipText("Invalid Parameter Storage");
}
else {
setForeground(
isSelected ? table.getSelectionForeground() : Colors.FOREGROUND);
setForeground(isSelected ? table.getSelectionForeground() : Colors.FOREGROUND);
setToolTipText("");
}
setText(storage.toString());
}
else {
setForeground(
isSelected ? table.getSelectionForeground() : Colors.FOREGROUND);
setForeground(isSelected ? table.getSelectionForeground() : Colors.FOREGROUND);
setText("");
setToolTipText(null);
}

View file

@ -59,20 +59,16 @@ public class PcodeFieldFactory extends FieldFactory {
super(name, model, highlightProvider, displayOptions, fieldOptions);
setWidth(300);
color = displayOptions.getColor(OptionsGui.BYTES.getColorOptionName(),
OptionsGui.BYTES.getDefaultColor());
style = displayOptions.getInt(OptionsGui.BYTES.getStyleOptionName(), -1);
formatter = new AttributedStringPcodeFormatter();
setColors(displayOptions);
setOptions(fieldOptions);
}
@Override
public FieldFactory newInstance(FieldFormatModel myModel, HighlightProvider highlightProvider,
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new PcodeFieldFactory(FIELD_NAME, myModel, highlightProvider, displayOptions,
fieldOptions);
ToolOptions options, ToolOptions fieldOptions) {
return new PcodeFieldFactory(FIELD_NAME, myModel, highlightProvider, options, fieldOptions);
}
@Override
@ -150,7 +146,6 @@ public class PcodeFieldFactory extends FieldFactory {
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
formatter.setFontMetrics(getMetrics());
setColors(options);
}
@Override
@ -166,37 +161,6 @@ public class PcodeFieldFactory extends FieldFactory {
}
}
/**
* Called when the fonts are first initialized or when one of the options changes. It looks up
* all the color settings and resets the its values.
*/
private void setColors(Options options) {
formatter.setAddressColor(options.getColor(OptionsGui.ADDRESS.getColorOptionName(),
OptionsGui.ADDRESS.getDefaultColor()));
formatter.setRegisterColor(options.getColor(OptionsGui.REGISTERS.getColorOptionName(),
OptionsGui.REGISTERS.getDefaultColor()));
formatter.setScalarColor(options.getColor(OptionsGui.CONSTANT.getColorOptionName(),
OptionsGui.CONSTANT.getDefaultColor()));
formatter.setLocalColor(options.getColor(OptionsGui.LABELS_LOCAL.getColorOptionName(),
OptionsGui.LABELS_LOCAL.getDefaultColor()));
formatter.setMnemonicColor(options.getColor(OptionsGui.MNEMONIC.getColorOptionName(),
OptionsGui.MNEMONIC.getDefaultColor()));
formatter.setUnimplColor(options.getColor(OptionsGui.UNIMPL.getColorOptionName(),
OptionsGui.UNIMPL.getDefaultColor()));
formatter.setSeparatorColor(options.getColor(OptionsGui.SEPARATOR.getColorOptionName(),
OptionsGui.SEPARATOR.getDefaultColor()));
formatter.setLineLabelColor(
options.getColor(OptionsGui.PCODE_LINE_LABEL.getColorOptionName(),
OptionsGui.PCODE_LINE_LABEL.getDefaultColor()));
formatter.setSpaceColor(options.getColor(OptionsGui.PCODE_ADDR_SPACE.getColorOptionName(),
OptionsGui.PCODE_ADDR_SPACE.getDefaultColor()));
formatter.setRawColor(options.getColor(OptionsGui.PCODE_RAW_VARNODE.getColorOptionName(),
OptionsGui.PCODE_RAW_VARNODE.getDefaultColor()));
formatter.setUseropColor(options.getColor(OptionsGui.PCODE_USEROP.getColorOptionName(),
OptionsGui.PCODE_USEROP.getDefaultColor()));
formatter.setFontMetrics(getMetrics());
}
private void setOptions(Options fieldOptions) {
fieldOptions.registerOption(MAX_DISPLAY_LINES_MSG, MAX_DISPLAY_LINES, null,
"Max number line of pcode to display");
@ -206,5 +170,4 @@ public class PcodeFieldFactory extends FieldFactory {
boolean displayRaw = fieldOptions.getBoolean(DISPLAY_RAW_PCODE, false);
formatter.setOptions(maxDisplayLines, displayRaw);
}
}

View file

@ -434,13 +434,7 @@ public class SymbolInspector implements OptionsChangeListener {
if (se == null) {
return Colors.BACKGROUND;
}
String optionName = se.getColorOptionName();
Color color = (Color) cache.get(optionName);
if (color == null) {
color = optionsObject.getColor(se.getColorOptionName(), se.getDefaultColor());
cache.put(optionName, color);
}
return color;
return se.getDefaultColor();
}
private int getStyle(ScreenElement se) {
@ -450,7 +444,7 @@ public class SymbolInspector implements OptionsChangeListener {
String optionName = se.getStyleOptionName();
Integer style = (Integer) cache.get(optionName);
if (style == null) {
style = Integer.valueOf(optionsObject.getInt(se.getStyleOptionName(), -1));
style = optionsObject.getInt(optionName, -1);
cache.put(optionName, style);
}
return style.intValue();

View file

@ -23,10 +23,9 @@ import java.util.List;
import org.apache.commons.lang3.StringUtils;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.util.html.*;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.program.model.address.Address;
import ghidra.program.model.data.*;
import ghidra.program.model.data.Enum;
@ -44,13 +43,6 @@ import ghidra.util.StringUtilities;
*/
public class ToolTipUtils {
private static final Color FG_FUNCTION_NAME = new GColor("color.fg.function.name");
private static final Color PARAM_NAME_COLOR = new GColor("color.fg.function.params");
private static final Color PARAM_CUSTOM_STORAGE_COLOR =
OptionsGui.PARAMETER_CUSTOM.getDefaultColor();
private static final Color PARAM_DYNAMIC_STORAGE_COLOR =
OptionsGui.PARAMETER_DYNAMIC.getDefaultColor();
private static final String ELLIPSES = "...";
public static final int LINE_LENGTH = 80;
private static final int PARAM_LENGTH_WRAP_THRESHOLD = LINE_LENGTH;
@ -269,11 +261,11 @@ public class ToolTipUtils {
}
Color paramColor =
usesCustomStorage ? PARAM_CUSTOM_STORAGE_COLOR : PARAM_DYNAMIC_STORAGE_COLOR;
usesCustomStorage ? FunctionColors.PARAM_CUSTOM : FunctionColors.PARAM_DYNAMIC;
buf.append(
colorString(paramColor, friendlyEncodeHTML(param.getVariableStorage().toString())));
buf.append("</td><td width=\"1%\">");
buf.append(colorString(PARAM_NAME_COLOR, friendlyEncodeHTML(name)));
buf.append(colorString(FunctionColors.PARAM, friendlyEncodeHTML(name)));
// consume remaining space and compact other columns
buf.append("</td><td width=\"100%\">&nbsp;</td></tr>");
@ -304,7 +296,7 @@ public class ToolTipUtils {
}
String functionName = StringUtilities.trimMiddle(function.getName(), LINE_LENGTH);
buffy.append(colorString(FG_FUNCTION_NAME, friendlyEncodeHTML(functionName)));
buffy.append(colorString(FunctionColors.NAME, friendlyEncodeHTML(functionName)));
buffy.append(HTML_SPACE).append("(");
buildParameterPreview(function, buffy);
@ -405,7 +397,7 @@ public class ToolTipUtils {
pb.append(colorString(Colors.FOREGROUND, friendlyEncodeHTML(type)));
pb.append(HTML_SPACE);
pb.append(colorString(PARAM_NAME_COLOR, friendlyEncodeHTML(name)));
pb.append(colorString(FunctionColors.NAME, friendlyEncodeHTML(name)));
params.add(pb.toString());
return rawTextLength;
}

View file

@ -23,7 +23,8 @@ import java.util.List;
import docking.widgets.fieldpanel.field.AttributedString;
import docking.widgets.fieldpanel.field.CompositeAttributedString;
import ghidra.app.plugin.processors.sleigh.template.OpTpl;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.field.ListingColors;
import ghidra.app.util.viewer.field.ListingColors.*;
import ghidra.program.model.address.AddressSpace;
import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.Register;
@ -37,18 +38,6 @@ public class AttributedStringPcodeFormatter extends
private FontMetrics metrics;
private Color addressColor = OptionsGui.ADDRESS.getDefaultColor();
private Color registerColor = OptionsGui.REGISTERS.getDefaultColor();
private Color scalarColor = OptionsGui.CONSTANT.getDefaultColor();
private Color localColor = OptionsGui.LABELS_LOCAL.getDefaultColor();
private Color mnemonicColor = OptionsGui.MNEMONIC.getDefaultColor();
private Color unimplColor = OptionsGui.UNIMPL.getDefaultColor();
private Color separatorColor = OptionsGui.SEPARATOR.getDefaultColor();
private Color lineLabelColor = OptionsGui.PCODE_LINE_LABEL.getDefaultColor();
private Color spaceColor = OptionsGui.PCODE_ADDR_SPACE.getDefaultColor();
private Color rawColor = OptionsGui.PCODE_RAW_VARNODE.getDefaultColor();
private Color useropColor = OptionsGui.PCODE_USEROP.getDefaultColor();
private AttributedString aSpace;
private AttributedString aEquals;
private AttributedString aComma;
@ -67,110 +56,10 @@ public class AttributedStringPcodeFormatter extends
initPunctuation();
}
/**
* Set the color for addresses
*
* @param addressColor
*/
public void setAddressColor(Color addressColor) {
this.addressColor = addressColor;
}
/**
* Set the color for register names
*
* @param registerColor
*/
public void setRegisterColor(Color registerColor) {
this.registerColor = registerColor;
}
/**
* Set the color for scalars and non-address constants
*
* @param scalarColor
*/
public void setScalarColor(Color scalarColor) {
this.scalarColor = scalarColor;
}
/**
* Set the color for labels referring to addresses
*
* @param localColor
*/
public void setLocalColor(Color localColor) {
this.localColor = localColor;
}
/**
* Set the color for op mnemonics
*
* @param mnemonicColor
*/
public void setMnemonicColor(Color mnemonicColor) {
this.mnemonicColor = mnemonicColor;
}
/**
* Set the color for the {@code unimpl} op mnemonic
*
* @param unimplColor
*/
public void setUnimplColor(Color unimplColor) {
this.unimplColor = unimplColor;
}
/**
* Set the color for punctuation
*
* @param separatorColor
*/
public void setSeparatorColor(Color separatorColor) {
this.separatorColor = separatorColor;
initPunctuation();
}
/**
* Set the color for labels referring to p-code ops
*
* @param lineLabelColor
*/
public void setLineLabelColor(Color lineLabelColor) {
this.lineLabelColor = lineLabelColor;
}
/**
* Set the color for address space names
*
* @param spaceColor
*/
public void setSpaceColor(Color spaceColor) {
this.spaceColor = spaceColor;
}
/**
* Set the color for raw varnodes
*
* @param rawColor
*/
public void setRawColor(Color rawColor) {
this.rawColor = rawColor;
}
/**
* Set the color for userop ({@code CALLOTHER}) names
*
* @param useropColor
*/
public void setUseropColor(Color useropColor) {
this.useropColor = useropColor;
}
/**
* Set font metrics for AttributedString objects
*
* @param metrics
* @param metrics the font metrics
*/
public void setFontMetrics(FontMetrics metrics) {
this.metrics = metrics;
@ -180,8 +69,8 @@ public class AttributedStringPcodeFormatter extends
/**
* Set general formatting options
*
* @param maxDisplayLines
* @param displayRawPcode
* @param maxDisplayLines the maximum number of lines to display
* @param displayRawPcode show raw pcode
*/
public void setOptions(int maxDisplayLines, boolean displayRawPcode) {
this.maxDisplayLines = maxDisplayLines;
@ -189,16 +78,16 @@ public class AttributedStringPcodeFormatter extends
}
private void initPunctuation() {
aSpace = new AttributedString(" ", separatorColor, metrics);
aEquals = new AttributedString(" = ", separatorColor, metrics);
aComma = new AttributedString(",", separatorColor, metrics);
aLeftParen = new AttributedString("(", separatorColor, metrics);
aRightParen = new AttributedString(")", separatorColor, metrics);
aLeftBracket = new AttributedString("[", separatorColor, metrics);
aRightBracket = new AttributedString("]", separatorColor, metrics);
aStar = new AttributedString("*", separatorColor, metrics);
aColon = new AttributedString(":", separatorColor, metrics);
aQuote = new AttributedString("\"", separatorColor, metrics);
aSpace = new AttributedString(" ", ListingColors.SEPARATOR, metrics);
aEquals = new AttributedString(" = ", ListingColors.SEPARATOR, metrics);
aComma = new AttributedString(",", ListingColors.SEPARATOR, metrics);
aLeftParen = new AttributedString("(", ListingColors.SEPARATOR, metrics);
aRightParen = new AttributedString(")", ListingColors.SEPARATOR, metrics);
aLeftBracket = new AttributedString("[", ListingColors.SEPARATOR, metrics);
aRightBracket = new AttributedString("]", ListingColors.SEPARATOR, metrics);
aStar = new AttributedString("*", ListingColors.SEPARATOR, metrics);
aColon = new AttributedString(":", ListingColors.SEPARATOR, metrics);
aQuote = new AttributedString("\"", ListingColors.SEPARATOR, metrics);
}
@Override
@ -244,24 +133,27 @@ public class AttributedStringPcodeFormatter extends
@Override
public void appendLineLabelRef(long label) {
lineList.add(new AttributedString(stringifyLineLabel(label), lineLabelColor, metrics));
lineList.add(
new AttributedString(stringifyLineLabel(label), PcodeColors.LABEL, metrics));
}
@Override
public void appendMnemonic(int opcode) {
Color color = opcode == PcodeOp.UNIMPLEMENTED ? unimplColor : mnemonicColor;
Color color = opcode == PcodeOp.UNIMPLEMENTED ? MnemonicColors.UNIMPLEMENTED
: MnemonicColors.NORMAL;
lineList.add(new AttributedString(stringifyOpMnemonic(opcode), color, metrics));
}
@Override
public void appendUserop(int id) {
lineList.add(new AttributedString(stringifyUserop(language, id), useropColor, metrics));
lineList.add(
new AttributedString(stringifyUserop(language, id), PcodeColors.USEROP, metrics));
}
@Override
public void appendRawVarnode(AddressSpace space, long offset, long size) {
lineList.add(new AttributedString(stringifyRawVarnode(space, offset, size), rawColor,
metrics));
lineList.add(new AttributedString(stringifyRawVarnode(space, offset, size),
PcodeColors.VARNODE, metrics));
}
private AttributedString getAttributedChar(char c) {
@ -298,33 +190,36 @@ public class AttributedStringPcodeFormatter extends
@Override
public void appendAddressWordOffcut(long wordOffset, long offcut) {
lineList.add(new AttributedString(stringifyWordOffcut(wordOffset, offcut), addressColor,
metrics));
lineList.add(new AttributedString(stringifyWordOffcut(wordOffset, offcut),
ListingColors.ADDRESS, metrics));
}
@Override
public void appendLabel(String label) {
lineList.add(new AttributedString(label, localColor, metrics));
lineList.add(new AttributedString(label, LabelColors.LOCAL, metrics));
}
@Override
public void appendRegister(Register register) {
lineList.add(new AttributedString(stringifyRegister(register), registerColor, metrics));
lineList.add(
new AttributedString(stringifyRegister(register), ListingColors.REGISTER, metrics));
}
@Override
public void appendScalar(long value) {
lineList.add(new AttributedString(stringifyScalarValue(value), scalarColor, metrics));
lineList.add(
new AttributedString(stringifyScalarValue(value), ListingColors.CONSTANT, metrics));
}
@Override
public void appendSpace(AddressSpace space) {
lineList.add(new AttributedString(stringifySpace(space), spaceColor, metrics));
lineList.add(
new AttributedString(stringifySpace(space), PcodeColors.ADDRESS_SPACE, metrics));
}
@Override
public void appendUnique(long offset) {
lineList.add(new AttributedString(stringifyUnique(offset), localColor, metrics));
lineList.add(new AttributedString(stringifyUnique(offset), LabelColors.LOCAL, metrics));
}
@Override

View file

@ -18,6 +18,7 @@ package ghidra.app.util.viewer.field;
import java.awt.*;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.options.ScreenElement;
@ -29,27 +30,17 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
private static class ParameterFieldOptions {
private final ScreenElement element;
Color color;
FontMetrics defaultMetrics;
FontMetrics[] fontMetrics = new FontMetrics[4];
int style = -1;
ParameterFieldOptions(ScreenElement element) {
this.element = element;
color = element.getDefaultColor();
}
String getColorOptionName() {
return element.getColorOptionName();
}
String getStyleOptionName() {
return element.getStyleOptionName();
}
Color getDefaultColor() {
return element.getDefaultColor();
}
}
private static final int CUSTOM_PARAM_INDEX = 0;
@ -76,8 +67,6 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
protected AbstractVariableFieldFactory(String name, FieldFormatModel model,
HighlightProvider highlightProvider, Options displayOptions, Options fieldOptions) {
super(name, model, highlightProvider, displayOptions, fieldOptions);
initDisplayOptions(displayOptions);
}
protected void initDisplayOptions(Options displayOptions) {
@ -86,7 +75,7 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
colorOptionName = "Variable Color";
styleOptionName = "Variable Style";
super.initDisplayOptions();
super.initDisplayOptions(displayOptions);
parameterFieldOptions = new ParameterFieldOptions[2];
parameterFieldOptions[CUSTOM_PARAM_INDEX] =
@ -95,9 +84,6 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
new ParameterFieldOptions(OptionsGui.PARAMETER_DYNAMIC);
for (int i = 0; i < 2; i++) {
parameterFieldOptions[i].color =
displayOptions.getColor(parameterFieldOptions[i].getColorOptionName(),
parameterFieldOptions[i].getDefaultColor());
parameterFieldOptions[i].style =
displayOptions.getInt(parameterFieldOptions[i].getStyleOptionName(), -1);
setMetrics(baseFont, parameterFieldOptions[i]);
@ -115,10 +101,7 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
}
else {
for (int i = 0; i < 2; i++) {
if (optionName.equals(parameterFieldOptions[i].getColorOptionName())) {
parameterFieldOptions[i].color = (Color) newValue;
}
else if (optionName.equals(styleOptionName)) {
if (optionName.equals(styleOptionName)) {
parameterFieldOptions[i].style = options.getInt(optionName, -1);
setMetrics(baseFont, parameterFieldOptions[i]);
}
@ -139,11 +122,10 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
protected Color getColor(Variable var) {
if (var instanceof Parameter) {
int index = var.getFunction().hasCustomVariableStorage() ? CUSTOM_PARAM_INDEX
: DYNAMIC_PARAM_INDEX;
return parameterFieldOptions[index].color;
return var.getFunction().hasCustomVariableStorage() ? FunctionColors.PARAM_CUSTOM
: FunctionColors.PARAM_DYNAMIC;
}
return color;
return FunctionColors.PARAM;
}
protected FontMetrics getMetrics(Variable var) {

View file

@ -15,13 +15,11 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.beans.PropertyEditor;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -40,7 +38,6 @@ import ghidra.util.exception.AssertException;
*/
public class AddressFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Address";
public static final Color DEFAULT_COLOR = Colors.FOREGROUND;
private final static String GROUP_TITLE = "Address Field";
public final static String DISPLAY_BLOCK_NAME =
GROUP_TITLE + Options.DELIMITER + "Display Block Name";
@ -96,11 +93,6 @@ public class AddressFieldFactory extends FieldFactory {
fieldOptions.getOptions(GROUP_TITLE).setOptionsHelpLocation(helpLoc);
}
@Override
public Color getDefaultColor() {
return DEFAULT_COLOR;
}
@Override
public void fieldOptionsChanged(Options options, String optionsName, Object oldValue,
Object newValue) {
@ -123,8 +115,8 @@ public class AddressFieldFactory extends FieldFactory {
}
CodeUnit cu = (CodeUnit) obj;
String text = getAddressString(cu);
FieldElement as =
new TextFieldElement(new AttributedString(text, color, getMetrics()), 0, 0);
FieldElement as = new TextFieldElement(
new AttributedString(text, ListingColors.ADDRESS, getMetrics()), 0, 0);
ListingTextField ltf;
if (rightJustify) {
ltf = ListingTextField.createSingleLineTextFieldWithReverseClipping(this, proxy, as,
@ -211,4 +203,5 @@ public class AddressFieldFactory extends FieldFactory {
return new AddressFieldFactory(newModel, highlightStringProvider, toolOptions,
fieldOptions);
}
}

View file

@ -18,23 +18,16 @@ package ghidra.app.util.viewer.field;
import java.beans.PropertyEditor;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.AttributedString;
import docking.widgets.fieldpanel.field.FieldElement;
import docking.widgets.fieldpanel.field.TextFieldElement;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.RowColLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.format.FormatManager;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.CustomOption;
import ghidra.framework.options.OptionType;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
import ghidra.framework.options.*;
import ghidra.program.model.data.DataType;
import ghidra.program.model.listing.CodeUnit;
import ghidra.program.model.listing.Data;
import ghidra.program.model.listing.Program;
import ghidra.program.model.listing.*;
import ghidra.program.util.ProgramLocation;
import ghidra.util.HelpLocation;
import ghidra.util.exception.AssertException;
@ -110,7 +103,8 @@ public class ArrayValuesFieldFactory extends FieldFactory {
Data child = parent.getComponent(index++);
boolean isLastItem = isLastLine && (i == itemCount - 1);
String value = getDisplayValue(child, !isLastItem);
AttributedString as = new AttributedString(value, color, getMetrics());
AttributedString as =
new AttributedString(value, ListingColors.ARRAY_VALUES, getMetrics());
aStrings[i] = new TextFieldElement(as, i, 0);
}
return ListingTextField.createPackedTextField(this, proxy, aStrings, startX + varWidth,

View file

@ -15,14 +15,13 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import java.util.ArrayList;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -36,7 +35,6 @@ import ghidra.program.util.ProgramLocation;
*/
public class AssignedVariableFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Var Assign";
public static final Color DEFAULT_COLOR = Palette.PURPLE;
/**
* Default constructor.
@ -57,12 +55,6 @@ public class AssignedVariableFieldFactory extends FieldFactory {
super(FIELD_NAME, model, hsProvider, displayOptions, fieldOptions);
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
// stub
}
/**
* Returns the FactoryField for the given object at index index.
* @param varWidth the amount of variable width spacing for any fields
@ -95,7 +87,8 @@ public class AssignedVariableFieldFactory extends FieldFactory {
buf.append(var.getVariableStorage().toString());
buf.append(" = ");
buf.append(var.getName());
AttributedString as = new AttributedString(buf.toString(), color, getMetrics());
AttributedString as = new AttributedString(buf.toString(),
FunctionColors.VARIABLE_ASSIGNED, getMetrics());
elemenetList.add(new TextFieldElement(as, 0, 0));
}
}
@ -146,9 +139,4 @@ public class AssignedVariableFieldFactory extends FieldFactory {
return new AssignedVariableFieldFactory(formatModel, hsProvider, displayOptions,
fieldOptions);
}
@Override
public Color getDefaultColor() {
return DEFAULT_COLOR;
}
}

View file

@ -27,7 +27,6 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.RowColLocation;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -47,8 +46,6 @@ import ghidra.util.HelpLocation;
public class BytesFieldFactory extends FieldFactory {
private static final int CHARS_IN_BYTE = 2;
public static final String FIELD_NAME = "Bytes";
public static final Color DEFAULT_COLOR = Palette.BLUE;
public static final Color ALIGNMENT_BYTES_COLOR = Palette.GRAY;
public final static String GROUP_TITLE = "Bytes Field";
public final static String MAX_DISPLAY_LINES_MSG =
GROUP_TITLE + Options.DELIMITER + "Maximum Lines To Display";
@ -211,10 +208,11 @@ public class BytesFieldFactory extends FieldFactory {
FieldElement[] aStrings = new FieldElement[fieldElementLength + extraLen];
buildAttributedByteValues(aStrings, 0, bytes, length, 0, color, extraLen != 0);
buildAttributedByteValues(aStrings, 0, bytes, length, 0, ListingColors.BYTES,
extraLen != 0);
if (extraLen != 0) {
buildAttributedByteValues(aStrings, fieldElementLength, alignmentBytes,
alignmentBytes.length, residual, ALIGNMENT_BYTES_COLOR, false);
alignmentBytes.length, residual, ListingColors.BYTES_ALIGNMENT, false);
}
return ListingTextField.createPackedTextField(this, proxy, aStrings, startX + varWidth,
@ -434,11 +432,6 @@ public class BytesFieldFactory extends FieldFactory {
return null;
}
@Override
public Color getDefaultColor() {
return DEFAULT_COLOR;
}
@Override
public boolean acceptsType(int category, Class<?> proxyObjectClass) {
if (!CodeUnit.class.isAssignableFrom(proxyObjectClass)) {

View file

@ -52,8 +52,8 @@ public class DummyFieldFactory extends FieldFactory {
return null;
}
int x = startX + varWidth;
FieldElement text =
new TextFieldElement(new AttributedString("", color, getMetrics()), 0, 0);
FieldElement text = new TextFieldElement(
new AttributedString("", ListingColors.BACKGROUND, getMetrics()), 0, 0);
return ListingTextField.createSingleLineTextField(this, obj, text, x, width, hlProvider);
}
@ -80,7 +80,7 @@ public class DummyFieldFactory extends FieldFactory {
@Override
public FieldFactory newInstance(FieldFormatModel formatModel, HighlightProvider hlProvdier,
ToolOptions displayOptions, ToolOptions fieldOptions) {
ToolOptions options, ToolOptions fieldOptions) {
return this;
}
}

View file

@ -26,6 +26,7 @@ import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.*;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.*;
import ghidra.app.util.viewer.field.ListingColors.CommentColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -43,25 +44,25 @@ import ghidra.util.bean.field.AnnotatedTextFieldElement;
*/
public class EolCommentFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "EOL Comment";
private final static String GROUP_TITLE = "EOL Comments Field";
private static final String GROUP_TITLE = "EOL Comments Field";
private static final String SEMICOLON_PREFIX = "; ";
public final static String ENABLE_WORD_WRAP_MSG =
public static final String ENABLE_WORD_WRAP_MSG =
GROUP_TITLE + Options.DELIMITER + "Enable Word Wrapping";
public final static String MAX_DISPLAY_LINES_MSG =
public static final String MAX_DISPLAY_LINES_MSG =
GROUP_TITLE + Options.DELIMITER + "Maximum Lines To Display";
public final static String ENABLE_SHOW_SEMICOLON_MSG =
public static final String ENABLE_SHOW_SEMICOLON_MSG =
GROUP_TITLE + Options.DELIMITER + "Show Semicolon at Start of Each Line";
public final static String ENABLE_ALWAYS_SHOW_REPEATABLE_MSG =
public static final String ENABLE_ALWAYS_SHOW_REPEATABLE_MSG =
GROUP_TITLE + Options.DELIMITER + "Always Show the Repeatable Comment";
public final static String ENABLE_ALWAYS_SHOW_REF_REPEATABLE_MSG =
public static final String ENABLE_ALWAYS_SHOW_REF_REPEATABLE_MSG =
GROUP_TITLE + Options.DELIMITER + "Always Show the Referenced Repeatable Comments";
public final static String ENABLE_ALWAYS_SHOW_AUTOMATIC_MSG =
public static final String ENABLE_ALWAYS_SHOW_AUTOMATIC_MSG =
GROUP_TITLE + Options.DELIMITER + "Always Show the Automatic Comment";
public static final String USE_ABBREVIATED_AUTOMITIC_COMMENT_MSG =
GROUP_TITLE + Options.DELIMITER + "Use Abbreviated Automatic Comments";
public static final String SHOW_FUNCTION_AUTOMITIC_COMMENT_MSG =
GROUP_TITLE + Options.DELIMITER + "Show Function Reference Automatic Comments";
public final static String ENABLE_PREPEND_REF_ADDRESS_MSG =
public static final String ENABLE_PREPEND_REF_ADDRESS_MSG =
GROUP_TITLE + Options.DELIMITER + "Prepend the Address to Each Referenced Comment";
public static final Color DEFAULT_COLOR = Palette.BLUE;
@ -74,9 +75,6 @@ public class EolCommentFieldFactory extends FieldFactory {
private boolean useAbbreviatedAutomatic;
private boolean showAutomaticFunctions;
private boolean prependRefAddress;
private Color repeatableCommentColor;
private Color automaticCommentColor;
private Color refRepeatableCommentColor;
private int repeatableCommentStyle;
private int automaticCommentStyle;
private int refRepeatableCommentStyle;
@ -138,19 +136,10 @@ public class EolCommentFieldFactory extends FieldFactory {
maxDisplayLines = fieldOptions.getInt(MAX_DISPLAY_LINES_MSG, 6);
isWordWrap = fieldOptions.getBoolean(ENABLE_WORD_WRAP_MSG, false);
repeatableCommentColor =
displayOptions.getColor(OptionsGui.COMMENT_REPEATABLE.getColorOptionName(),
OptionsGui.COMMENT_REPEATABLE.getDefaultColor());
repeatableCommentStyle =
displayOptions.getInt(OptionsGui.COMMENT_REPEATABLE.getStyleOptionName(), -1);
automaticCommentColor =
displayOptions.getColor(OptionsGui.COMMENT_AUTO.getColorOptionName(),
OptionsGui.COMMENT_AUTO.getDefaultColor());
automaticCommentStyle =
displayOptions.getInt(OptionsGui.COMMENT_AUTO.getStyleOptionName(), -1);
refRepeatableCommentColor =
displayOptions.getColor(OptionsGui.COMMENT_REF_REPEAT.getColorOptionName(),
OptionsGui.COMMENT_REF_REPEAT.getDefaultColor());
refRepeatableCommentStyle =
displayOptions.getInt(OptionsGui.COMMENT_REF_REPEAT.getStyleOptionName(), -1);
showSemicolon = fieldOptions.getBoolean(ENABLE_SHOW_SEMICOLON_MSG, false);
@ -160,8 +149,7 @@ public class EolCommentFieldFactory extends FieldFactory {
alwaysShowAutomatic = fieldOptions.getBoolean(ENABLE_ALWAYS_SHOW_AUTOMATIC_MSG, false);
useAbbreviatedAutomatic =
fieldOptions.getBoolean(USE_ABBREVIATED_AUTOMITIC_COMMENT_MSG, true);
showAutomaticFunctions =
fieldOptions.getBoolean(SHOW_FUNCTION_AUTOMITIC_COMMENT_MSG, true);
showAutomaticFunctions = fieldOptions.getBoolean(SHOW_FUNCTION_AUTOMITIC_COMMENT_MSG, true);
prependRefAddress = fieldOptions.getBoolean(ENABLE_PREPEND_REF_ADDRESS_MSG, false);
@ -225,9 +213,6 @@ public class EolCommentFieldFactory extends FieldFactory {
*/
private void adjustRepeatableDisplayOptions(Options options, String optionName, Object oldValue,
Object newValue) {
if (optionName.equals(OptionsGui.COMMENT_REPEATABLE.getColorOptionName())) {
repeatableCommentColor = (Color) newValue;
}
String repeatableStyleName = OptionsGui.COMMENT_REPEATABLE.getStyleOptionName();
if (optionName.equals(repeatableStyleName)) {
repeatableCommentStyle = options.getInt(repeatableStyleName, -1);
@ -244,9 +229,6 @@ public class EolCommentFieldFactory extends FieldFactory {
*/
private void adjustRefRepeatDisplayOptions(Options options, String optionName, Object oldValue,
Object newValue) {
if (optionName.equals(OptionsGui.COMMENT_REF_REPEAT.getColorOptionName())) {
refRepeatableCommentColor = (Color) newValue;
}
String refRepeatStyleName = OptionsGui.COMMENT_REF_REPEAT.getStyleOptionName();
if (optionName.equals(refRepeatStyleName)) {
refRepeatableCommentStyle = options.getInt(refRepeatStyleName, -1);
@ -262,9 +244,6 @@ public class EolCommentFieldFactory extends FieldFactory {
*/
private void adjustAutomaticCommentDisplayOptions(Options options, String optionName,
Object oldValue, Object newValue) {
if (optionName.equals(OptionsGui.COMMENT_AUTO.getColorOptionName())) {
automaticCommentColor = (Color) newValue;
}
String automaticCommentStyleName = OptionsGui.COMMENT_AUTO.getStyleOptionName();
if (optionName.equals(automaticCommentStyleName)) {
automaticCommentStyle = options.getInt(automaticCommentStyleName, -1);
@ -315,8 +294,8 @@ public class EolCommentFieldFactory extends FieldFactory {
List<FieldElement> elementList = new ArrayList<>();
// This Code Unit's End of Line Comment
AttributedString myEolPrefixString =
new AttributedString(SEMICOLON_PREFIX, color, getMetrics(style), false, null);
AttributedString myEolPrefixString = new AttributedString(SEMICOLON_PREFIX,
CommentColors.EOL, getMetrics(style), false, null);
String[] eolComments = displayableEol.getEOLComments();
List<FieldElement> eolFieldElements = convertToFieldElements(program, eolComments,
myEolPrefixString, showSemicolon, isWordWrap, getNextRow(elementList));
@ -325,7 +304,7 @@ public class EolCommentFieldFactory extends FieldFactory {
// This Code Unit's Repeatable Comment
if (alwaysShowRepeatable || elementList.isEmpty()) {
AttributedString myRepeatablePrefixString = new AttributedString(SEMICOLON_PREFIX,
repeatableCommentColor, getMetrics(repeatableCommentStyle), false, null);
CommentColors.REPEATABLE, getMetrics(repeatableCommentStyle), false, null);
String[] repeatableComments = displayableEol.getRepeatableComments();
List<FieldElement> repeatableFieldElements =
convertToFieldElements(program, repeatableComments, myRepeatablePrefixString,
@ -336,7 +315,7 @@ public class EolCommentFieldFactory extends FieldFactory {
// Referenced Repeatable Comments
if (alwaysShowRefRepeatables || elementList.isEmpty()) {
AttributedString refRepeatPrefixString = new AttributedString(SEMICOLON_PREFIX,
refRepeatableCommentColor, getMetrics(refRepeatableCommentStyle), false, null);
CommentColors.REF_REPEATABLE, getMetrics(refRepeatableCommentStyle), false, null);
int refRepeatCount = displayableEol.getReferencedRepeatableCommentsCount();
for (int subTypeIndex = 0; subTypeIndex < refRepeatCount; subTypeIndex++) {
RefRepeatComment refRepeatComment =
@ -352,7 +331,7 @@ public class EolCommentFieldFactory extends FieldFactory {
// Automatic Comment
if (alwaysShowAutomatic || elementList.isEmpty()) {
AttributedString autoCommentPrefixString = new AttributedString(SEMICOLON_PREFIX,
automaticCommentColor, getMetrics(automaticCommentStyle), false, null);
CommentColors.AUTO, getMetrics(automaticCommentStyle), false, null);
String[] autoComment = displayableEol.getAutomaticComment();
List<FieldElement> autoCommentFieldElements =
convertToFieldElements(program, autoComment, autoCommentPrefixString, showSemicolon,
@ -575,11 +554,6 @@ public class EolCommentFieldFactory extends FieldFactory {
newFieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.COMMENT_EOL.getDefaultColor();
}
/**
* Convert the array of comments to a single string and use the given
* separatorChar as the delimiter.

View file

@ -19,12 +19,9 @@ import java.awt.*;
import java.math.BigInteger;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette;
import generic.theme.Gui;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
@ -48,8 +45,6 @@ public abstract class FieldFactory implements ExtensionPoint {
protected String name;
protected int startX;
protected int width;
protected Color color;
protected Color underlineColor = Palette.BLUE;
private FontMetrics defaultMetrics;
private FontMetrics[] fontMetrics = new FontMetrics[4];
protected Font baseFont;
@ -59,7 +54,6 @@ public abstract class FieldFactory implements ExtensionPoint {
protected String colorOptionName;
protected String styleOptionName;
protected Options displayOptions;
/**
* Base constructor
@ -79,26 +73,23 @@ public abstract class FieldFactory implements ExtensionPoint {
width = 100;
this.displayOptions = displayOptions;
initDisplayOptions();
initDisplayOptions(displayOptions);
initFieldOptions(fieldOptions);
}
protected void initFieldOptions(Options fieldOptions) {
fieldOptions.getOptions(name)
.setOptionsHelpLocation(new HelpLocation("CodeBrowserPlugin", name));
}
protected void initDisplayOptions() {
protected void initDisplayOptions(Options displayOptions) {
baseFont = Gui.getFont(BASE_LISTING_FONT_ID);
// For most fields (defined in optionsGui) these will be set. But "ad hoc" fields won't,
// so register something. A second registration won't change the original
displayOptions.registerThemeColorBinding(colorOptionName, Colors.FOREGROUND.getId(), null,
"Sets the " + colorOptionName);
displayOptions.registerOption(styleOptionName, -1, null, "Sets the " + style);
color = displayOptions.getColor(colorOptionName, getDefaultColor());
style = displayOptions.getInt(styleOptionName, -1);
underlineColor = displayOptions.getColor(OptionsGui.UNDERLINE.getColorOptionName(),
OptionsGui.UNDERLINE.getDefaultColor());
setMetrics(baseFont);
}
@ -110,24 +101,6 @@ public abstract class FieldFactory implements ExtensionPoint {
this.name = name;
}
/**
* Notification that the Options have changed.
* @param options the Options object that changed. Will be either the display
* options or the field options.
* @param optionName the name of the property that changed.
* @param oldValue the old value of the property.
* @param newValue the new value of the property.
*/
public void optionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
if (options == displayOptions) {
displayOptionsChanged(options, optionName, oldValue, newValue);
}
else {
fieldOptionsChanged(options, optionName, oldValue, newValue);
}
}
/**
* Notification the services changed. Subclasses should override this method
* if they care about service changes.
@ -161,16 +134,10 @@ public abstract class FieldFactory implements ExtensionPoint {
baseFont = SystemUtilities.adjustForFontSizeOverride((Font) newValue);
setMetrics(baseFont);
}
else if (optionName.equals(colorOptionName)) {
color = (Color) newValue;
}
else if (optionName.equals(styleOptionName)) {
style = options.getInt(optionName, -1);
setMetrics(baseFont);
}
else if (optionName.equals(OptionsGui.UNDERLINE.getColorOptionName())) {
underlineColor = (Color) newValue;
}
model.update();
}
@ -194,14 +161,6 @@ public abstract class FieldFactory implements ExtensionPoint {
return name;
}
/**
* Returns the default field color.
* @return the color.
*/
public Color getDefaultColor() {
return Colors.FOREGROUND;
}
/**
* Returns the starting x position for the fields generated by this factory.
* @return the start x.

View file

@ -15,7 +15,6 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
@ -24,7 +23,6 @@ import ghidra.GhidraOptions;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.format.FormatManager;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
@ -115,7 +113,8 @@ public class FieldNameFieldFactory extends FieldFactory {
if ((fieldName == null) || (fieldName.length() == 0)) {
return null;
}
AttributedString as = new AttributedString(fieldName, color, getMetrics());
AttributedString as =
new AttributedString(fieldName, ListingColors.FIELD_NAME, getMetrics());
FieldElement text = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, text, startX + varWidth,
@ -160,9 +159,4 @@ public class FieldNameFieldFactory extends FieldFactory {
ToolOptions toolOptions, ToolOptions fieldOptions) {
return new FieldNameFieldFactory(formatModel, provider, toolOptions, fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.FIELD_NAME.getDefaultColor();
}
}

View file

@ -20,6 +20,7 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GColor;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -41,6 +42,7 @@ import ghidra.util.exception.AssertException;
public class FileOffsetFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "File Offset";
public static final GColor COLOR = new GColor("color.fg.listing.file.offset");
public static final String GROUP_TITLE = "File Offset Field";
public final static String FILE_OFFSET_DISPLAY_OPTIONS_NAME =
GROUP_TITLE + Options.DELIMITER + "File Offset Display Options";
@ -141,7 +143,7 @@ public class FileOffsetFieldFactory extends FieldFactory {
}
}
FieldElement fieldElement =
new TextFieldElement(new AttributedString(text, color, getMetrics()), 0, 0);
new TextFieldElement(new AttributedString(text, COLOR, getMetrics()), 0, 0);
ListingTextField listingTextField = ListingTextField.createSingleLineTextField(this, proxy,
fieldElement, startX + varWidth, width, hlProvider);
listingTextField.setPrimary(true);
@ -191,5 +193,4 @@ public class FileOffsetFieldFactory extends FieldFactory {
return (category == FieldFormatModel.INSTRUCTION_OR_DATA ||
category == FieldFormatModel.OPEN_DATA || category == FieldFormatModel.ARRAY);
}
}

View file

@ -15,15 +15,14 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import java.util.ArrayList;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.FunctionProxy;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -38,8 +37,6 @@ import ghidra.program.util.ProgramLocation;
public class FunctionCallFixupFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Function Call-Fixup";
private Color fixupColor;
private Color literalColor;
/**
* Default Constructor
@ -59,20 +56,6 @@ public class FunctionCallFixupFieldFactory extends FieldFactory {
Options displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
literalColor = displayOptions.getColor(OptionsGui.SEPARATOR.getColorOptionName(),
OptionsGui.SEPARATOR.getDefaultColor());
fixupColor = displayOptions.getColor(OptionsGui.FUN_CALL_FIXUP.getColorOptionName(),
OptionsGui.FUN_CALL_FIXUP.getDefaultColor());
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
literalColor = options.getColor(OptionsGui.FUN_CALL_FIXUP.getColorOptionName(),
OptionsGui.FUN_CALL_FIXUP.getDefaultColor());
fixupColor = options.getColor(OptionsGui.FUN_CALL_FIXUP.getColorOptionName(),
OptionsGui.FUN_CALL_FIXUP.getDefaultColor());
}
@Override
@ -91,10 +74,10 @@ public class FunctionCallFixupFieldFactory extends FieldFactory {
AttributedString as;
int elementIndex = 0;
as = new AttributedString("Call-Fixup: ", literalColor, getMetrics());
as = new AttributedString("Call-Fixup: ", ListingColors.SEPARATOR, getMetrics());
textElements.add(new TextFieldElement(as, elementIndex++, 0));
as = new AttributedString(callFixupStr, fixupColor, getMetrics());
as = new AttributedString(callFixupStr, FunctionColors.CALL_FIXUP, getMetrics());
textElements.add(new TextFieldElement(as, elementIndex++, 0));
return ListingTextField.createSingleLineTextField(this, proxy,
@ -141,14 +124,4 @@ public class FunctionCallFixupFieldFactory extends FieldFactory {
fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.FUN_CALL_FIXUP.getDefaultColor();
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
// don't care
}
}

View file

@ -19,10 +19,9 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors.Palette;
import generic.theme.GColor;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
@ -32,6 +31,7 @@ import ghidra.program.util.ProgramLocation;
public class FunctionPurgeFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Function Purge";
public static final GColor COLOR = new GColor("color.fg.listing.function.purge");
public FunctionPurgeFieldFactory() {
super(FIELD_NAME);
@ -40,8 +40,6 @@ public class FunctionPurgeFieldFactory extends FieldFactory {
private FunctionPurgeFieldFactory(FieldFormatModel model, HighlightProvider hlProvider,
Options displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
color = displayOptions.getColor(OptionsGui.BYTES.getColorOptionName(),
OptionsGui.BYTES.getDefaultColor());
}
@ -79,7 +77,7 @@ public class FunctionPurgeFieldFactory extends FieldFactory {
stringDepth = Integer.toHexString(depth);
}
}
AttributedString as = new AttributedString(stringDepth, Palette.BLUE, getMetrics());
AttributedString as = new AttributedString(stringDepth, COLOR, getMetrics());
FieldElement text = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, text, startX + varWidth,
width, hlProvider);
@ -123,5 +121,4 @@ public class FunctionPurgeFieldFactory extends FieldFactory {
}
return (category == FieldFormatModel.FUNCTION);
}
}

View file

@ -15,15 +15,15 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.AttributedString;
import docking.widgets.fieldpanel.field.FieldElement;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GColor;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.CommentColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.FunctionProxy;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -38,6 +38,7 @@ import ghidra.program.util.ProgramLocation;
*/
public class FunctionRepeatableCommentFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Function Repeatable Comment";
public static final GColor COLOR = new GColor("color.fg.listing.comment.repeatable");
/**
* Default constructor
@ -70,7 +71,8 @@ public class FunctionRepeatableCommentFieldFactory extends FieldFactory {
Program program = f.getProgram();
String[] commentArr = f.getRepeatableCommentAsArray();
FieldElement[] fields = new FieldElement[commentArr.length];
AttributedString prototype = new AttributedString("prototype", color, getMetrics());
AttributedString prototype =
new AttributedString("prototype", CommentColors.REPEATABLE, getMetrics());
for (int i = 0; i < commentArr.length; i++) {
fields[i] = CommentUtils.parseTextForAnnotations(commentArr[i], program, prototype, i);
}
@ -125,12 +127,4 @@ public class FunctionRepeatableCommentFieldFactory extends FieldFactory {
return new FunctionRepeatableCommentFieldFactory(formatModel, provider, options,
fieldOptions);
}
/**
* @see ghidra.app.util.viewer.field.FieldFactory#getDefaultColor()
*/
@Override
public Color getDefaultColor() {
return OptionsGui.COMMENT_EOL.getDefaultColor();
}
}

View file

@ -23,12 +23,10 @@ import java.util.List;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.RowColLocation;
import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.GhidraOptions;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.FunctionProxy;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -48,17 +46,7 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
GROUP_TITLE + Options.DELIMITER + GhidraOptions.DISPLAY_NAMESPACE;
private boolean displayFunctionScope;
private Color funNameColor;
private Color unresolvedThunkRefColor;
private Color resolvedThunkRefColor;
private Color funRetColor;
private Color literalColor;
private Color funParamsColor;
private Color autoParamColor;
/**
* Default Constructor
*/
public FunctionSignatureFieldFactory() {
super(FIELD_NAME);
}
@ -78,45 +66,6 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
"Prepends namespaces to labels that are not in the global namespace.");
displayFunctionScope = fieldOptions.getBoolean(DISPLAY_NAMESPACE, false);
funRetColor = displayOptions.getColor(OptionsGui.FUN_RET_TYPE.getColorOptionName(),
OptionsGui.FUN_RET_TYPE.getDefaultColor());
funNameColor = displayOptions.getColor(OptionsGui.FUN_NAME.getColorOptionName(),
OptionsGui.FUN_NAME.getDefaultColor());
unresolvedThunkRefColor =
displayOptions.getColor(OptionsGui.BAD_REF_ADDR.getColorOptionName(),
OptionsGui.BAD_REF_ADDR.getDefaultColor());
resolvedThunkRefColor =
displayOptions.getColor(OptionsGui.EXT_REF_RESOLVED.getColorOptionName(),
OptionsGui.EXT_REF_RESOLVED.getDefaultColor());
funParamsColor = displayOptions.getColor(OptionsGui.FUN_PARAMS.getColorOptionName(),
OptionsGui.FUN_PARAMS.getDefaultColor());
autoParamColor = displayOptions.getColor(OptionsGui.FUN_AUTO_PARAMS.getColorOptionName(),
OptionsGui.FUN_PARAMS.getDefaultColor());
literalColor = displayOptions.getColor(OptionsGui.SEPARATOR.getColorOptionName(),
OptionsGui.SEPARATOR.getDefaultColor());
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
funRetColor =
options.getColor(OptionsGui.FUN_RET_TYPE.getColorOptionName(), Colors.FOREGROUND);
funNameColor =
options.getColor(OptionsGui.FUN_NAME.getColorOptionName(), Colors.FOREGROUND);
unresolvedThunkRefColor =
displayOptions.getColor(OptionsGui.BAD_REF_ADDR.getColorOptionName(),
OptionsGui.BAD_REF_ADDR.getDefaultColor());
resolvedThunkRefColor =
displayOptions.getColor(OptionsGui.EXT_REF_RESOLVED.getColorOptionName(),
OptionsGui.EXT_REF_RESOLVED.getDefaultColor());
funParamsColor =
options.getColor(OptionsGui.FUN_PARAMS.getColorOptionName(), Colors.FOREGROUND);
autoParamColor =
options.getColor(OptionsGui.FUN_AUTO_PARAMS.getColorOptionName(), Palette.GRAY);
literalColor =
options.getColor(OptionsGui.SEPARATOR.getColorOptionName(), Colors.FOREGROUND);
}
@Override
@ -135,7 +84,8 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
// inline
if (function.isInline()) {
as = new AttributedString(Function.INLINE + " ", funRetColor, getMetrics());
as = new AttributedString(Function.INLINE + " ", FunctionColors.RETURN_TYPE,
getMetrics());
textElements.add(new FunctionInlineFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
@ -143,7 +93,8 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
// thunk
if (function.isThunk()) {
as = new AttributedString(Function.THUNK + " ", funRetColor, getMetrics());
as = new AttributedString(Function.THUNK + " ", FunctionColors.RETURN_TYPE,
getMetrics());
textElements.add(new FunctionThunkFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
@ -151,7 +102,8 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
// noreturn
if (function.hasNoReturn()) {
as = new AttributedString(Function.NORETURN + " ", funRetColor, getMetrics());
as = new AttributedString(Function.NORETURN + " ", FunctionColors.RETURN_TYPE,
getMetrics());
textElements.add(new FunctionNoReturnFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
@ -159,7 +111,7 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
// return type
as = new AttributedString(function.getReturn().getFormalDataType().getDisplayName() + " ",
funRetColor, getMetrics());
FunctionColors.RETURN_TYPE, getMetrics());
textElements.add(new FunctionReturnTypeFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
@ -171,9 +123,10 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
}
if (callingConvention != null &&
!callingConvention.equals(Function.UNKNOWN_CALLING_CONVENTION_STRING)) {
as = new AttributedString(callingConvention + " ", funRetColor, getMetrics());
textElements.add(
new FunctionCallingConventionFieldElement(as, elementIndex, 0, startCol));
as = new AttributedString(callingConvention + " ", FunctionColors.RETURN_TYPE,
getMetrics());
textElements
.add(new FunctionCallingConventionFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
}
@ -186,14 +139,15 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
elementIndex++;
// opening parenthesis
as = new AttributedString("(", literalColor, getMetrics());
as = new AttributedString("(", ListingColors.SEPARATOR, getMetrics());
textElements.add(new FunctionStartParametersFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
// parameters
int paramOffset = 0;
AttributedString commaSeparator = new AttributedString(", ", literalColor, getMetrics());
AttributedString commaSeparator =
new AttributedString(", ", ListingColors.SEPARATOR, getMetrics());
int lastParam = params.length - 1;
for (int i = 0; i < params.length; i++) {
@ -202,7 +156,8 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
// continue;
// }
Color pcolor = params[i].isAutoParameter() ? autoParamColor : funParamsColor;
Color pcolor =
params[i].isAutoParameter() ? FunctionColors.PARAM_AUTO : FunctionColors.PARAM;
String text = params[i].getFormalDataType().getDisplayName() + " ";
as = new AttributedString(text, pcolor, getMetrics());
@ -238,23 +193,23 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
paramOffset += commaSeparator.length();
elementIndex++;
}
as = new AttributedString(FunctionSignature.VAR_ARGS_DISPLAY_STRING, funParamsColor,
getMetrics());
as = new AttributedString(FunctionSignature.VAR_ARGS_DISPLAY_STRING,
FunctionColors.PARAM, getMetrics());
textElements.add(new FunctionSignatureFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
}
else if (lastParam < 0 && function.getSignatureSource() != SourceType.DEFAULT) {
// void parameter list
as = new AttributedString(FunctionSignature.VOID_PARAM_DISPLAY_STRING, funParamsColor,
getMetrics());
as = new AttributedString(FunctionSignature.VOID_PARAM_DISPLAY_STRING,
FunctionColors.PARAM, getMetrics());
textElements.add(new FunctionSignatureFieldElement(as, elementIndex, 0, startCol));
startCol += as.length();
elementIndex++;
}
// closing parenthesis
as = new AttributedString(")", literalColor, getMetrics());
as = new AttributedString(")", ListingColors.SEPARATOR, getMetrics());
textElements.add(new FunctionEndParametersFieldElement(as, elementIndex, 0, startCol));
return ListingTextField.createSingleLineTextField(this, proxy,
@ -266,23 +221,23 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
if (function.isThunk()) {
Function thunkedFunction = function.getThunkedFunction(true);
if (thunkedFunction == null) {
return unresolvedThunkRefColor;
return ListingColors.EXT_REF_UNRESOLVED;
}
else if (thunkedFunction.isExternal()) {
ExternalLocation externalLocation = thunkedFunction.getExternalLocation();
String libName = externalLocation.getLibraryName();
if (Library.UNKNOWN.equals(libName)) {
return unresolvedThunkRefColor;
return ListingColors.EXT_REF_UNRESOLVED;
}
ExternalManager externalManager = function.getProgram().getExternalManager();
String path = externalManager.getExternalLibraryPath(libName);
if (path == null || path.length() == 0) {
return unresolvedThunkRefColor;
return ListingColors.EXT_REF_UNRESOLVED;
}
return resolvedThunkRefColor;
return ListingColors.EXT_REF_RESOLVED;
}
}
return funNameColor;
return FunctionColors.NAME;
}
@Override
@ -420,13 +375,7 @@ public class FunctionSignatureFieldFactory extends FieldFactory {
@Override
public FieldFactory newInstance(FieldFormatModel formatModel, HighlightProvider provider,
ToolOptions toolOptions, ToolOptions fieldOptions) {
return new FunctionSignatureFieldFactory(formatModel, provider, toolOptions,
fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.FUN_NAME.getDefaultColor();
return new FunctionSignatureFieldFactory(formatModel, provider, toolOptions, fieldOptions);
}
@Override

View file

@ -15,16 +15,14 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.AttributedString;
import docking.widgets.fieldpanel.field.TextFieldElement;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.FunctionProxy;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -40,8 +38,6 @@ import ghidra.program.util.ProgramLocation;
public class FunctionSignatureSourceFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Signature Source";
// private Color funRetColor;
private Color literalColor;
//private int displayWidth;
@ -62,17 +58,6 @@ public class FunctionSignatureSourceFieldFactory extends FieldFactory {
public FunctionSignatureSourceFieldFactory(FieldFormatModel model, HighlightProvider hlProvider,
Options displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
literalColor = displayOptions.getColor(OptionsGui.SEPARATOR.getColorOptionName(),
OptionsGui.SEPARATOR.getDefaultColor());
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
literalColor =
options.getColor(OptionsGui.SEPARATOR.getColorOptionName(), Colors.FOREGROUND);
}
@Override
@ -85,7 +70,8 @@ public class FunctionSignatureSourceFieldFactory extends FieldFactory {
Function function = functionProxy.getObject();
SourceType source = function.getSignatureSource();
String sourceStr = "<" + source.toString() + ">";
AttributedString as = new AttributedString(sourceStr, literalColor, getMetrics());
AttributedString as =
new AttributedString(sourceStr, FunctionColors.SOURCE, getMetrics());
return ListingTextField.createSingleLineTextField(this, proxy,
new TextFieldElement(as, 0, 0), startX + varWidth, width, hlProvider);
}
@ -131,15 +117,4 @@ public class FunctionSignatureSourceFieldFactory extends FieldFactory {
return new FunctionSignatureSourceFieldFactory(formatModel, provider, toolOptions,
fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.SEPARATOR.getDefaultColor();
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
// don't care
}
}

View file

@ -15,7 +15,6 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;
@ -24,10 +23,9 @@ import org.apache.commons.lang3.StringUtils;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.FunctionProxy;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -45,9 +43,6 @@ import ghidra.program.util.ProgramLocation;
public class FunctionTagFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Function Tags";
public static final Color DEFAULT_COLOR = Palette.MAROON;
private Color literalColor;
/**
* Default Constructor
@ -67,10 +62,6 @@ public class FunctionTagFieldFactory extends FieldFactory {
private FunctionTagFieldFactory(FieldFormatModel model, HighlightProvider hlProvider,
Options displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
color = displayOptions.getColor(OptionsGui.FUN_TAG.getColorOptionName(),
OptionsGui.FUN_TAG.getDefaultColor());
literalColor = displayOptions.getColor(OptionsGui.SEPARATOR.getColorOptionName(),
OptionsGui.SEPARATOR.getDefaultColor());
}
@Override
@ -139,18 +130,6 @@ public class FunctionTagFieldFactory extends FieldFactory {
return new FunctionTagFieldFactory(formatModel, provider, toolOptions, fieldOptions);
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
if (optionName.equals(OptionsGui.FUN_TAG.getColorOptionName())) {
color = (Color) newValue;
}
else if (optionName.equals(OptionsGui.SEPARATOR.getColorOptionName())) {
literalColor = (Color) newValue;
}
super.displayOptionsChanged(options, optionName, oldValue, newValue);
}
/**
* Creates a tags list field to be show at the beginning of each function that shows the tags
* assigned to that function.
@ -169,11 +148,11 @@ public class FunctionTagFieldFactory extends FieldFactory {
AttributedString as;
int elementIndex = 0;
as = new AttributedString("Tags: ", literalColor, getMetrics());
as = new AttributedString("Tags: ", ListingColors.SEPARATOR, getMetrics());
textElements.add(new TextFieldElement(as, elementIndex++, 0));
String tagNamesStr = StringUtils.join(tagNames, ", ");
as = new AttributedString(tagNamesStr, color, getMetrics());
as = new AttributedString(tagNamesStr, FunctionColors.TAG, getMetrics());
textElements.add(new TextFieldElement(as, elementIndex++, 0));
return textElements;

View file

@ -20,9 +20,8 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.MaskColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -38,9 +37,6 @@ import ghidra.util.StringUtilities;
public class InstructionMaskValueFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Instr Mask/Value";
public static final Color MASK_COLOR = Palette.getColor("navy");
public static final Color VALUE_COLOR = Palette.GREEN;
public static final Color LABEL_COLOR = Colors.FOREGROUND;
/**
* Default constructor.
@ -61,12 +57,6 @@ public class InstructionMaskValueFieldFactory extends FieldFactory {
super(FIELD_NAME, model, hsProvider, displayOptions, fieldOptions);
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
// stub
}
/**
* Returns the FactoryField for the given object at index index.
* @param varWidth the amount of variable width spacing for any fields
@ -100,14 +90,15 @@ public class InstructionMaskValueFieldFactory extends FieldFactory {
try {
FieldElement[] fieldElements = new FieldElement[2 * (operandCount + 1)];
fieldElements[0] =
getLine("M[m]: ", instructionMask.getBytes(), MASK_COLOR, proxy, varWidth);
getLine("M[m]: ", instructionMask.getBytes(), MaskColors.BITS, proxy, varWidth);
fieldElements[1] =
getLine("V[m]: ", instructionMask.applyMask(instr), VALUE_COLOR, proxy, varWidth);
getLine("V[m]: ", instructionMask.applyMask(instr), MaskColors.VALUE, proxy,
varWidth);
for (int i = 0; i < operandCount; i++) {
fieldElements[2 * (i + 1)] = getLine("M[" + i + "]: ", operandMasks[i].getBytes(),
MASK_COLOR, proxy, varWidth);
MaskColors.BITS, proxy, varWidth);
fieldElements[2 * (i + 1) + 1] = getLine("V[" + i + "]: ",
operandMasks[i].applyMask(instr), VALUE_COLOR, proxy, varWidth);
operandMasks[i].applyMask(instr), MaskColors.VALUE, proxy, varWidth);
}
return ListingTextField.createMultilineTextField(this, proxy, fieldElements,
@ -123,10 +114,11 @@ public class InstructionMaskValueFieldFactory extends FieldFactory {
FieldElement[] fieldElements = new FieldElement[2];
AttributedString as =
new AttributedString(label, LABEL_COLOR, getMetrics(), false, underlineColor);
new AttributedString(label, MaskColors.LABEL, getMetrics(), false,
ListingColors.UNDERLINE);
fieldElements[0] = new TextFieldElement(as, 0, 0);
as = new AttributedString(getFormattedBytes(value), valueColor, getMetrics(), false,
underlineColor);
ListingColors.UNDERLINE);
fieldElements[1] = new TextFieldElement(as, 0, 0);
return new CompositeFieldElement(fieldElements);
}
@ -178,9 +170,4 @@ public class InstructionMaskValueFieldFactory extends FieldFactory {
return new InstructionMaskValueFieldFactory(formatModel, hsProvider, toolOptions,
fieldOptions);
}
@Override
public Color getDefaultColor() {
return Colors.FOREGROUND;
}
}

View file

@ -454,5 +454,4 @@ public class LabelFieldFactory extends FieldFactory {
ToolOptions pDisplayOptions, ToolOptions fieldOptions) {
return new LabelFieldFactory(formatModel, provider, pDisplayOptions, fieldOptions);
}
}

View file

@ -0,0 +1,110 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.app.util.viewer.field;
import generic.theme.GColor;
public class ListingColors {
// @formatter:off
public static final GColor BACKGROUND = new GColor("color.bg.listing");
public static final GColor ADDRESS = new GColor("color.fg.listing.address");
public static final GColor BYTES = new GColor("color.fg.listing.bytes");
public static final GColor EXT_ENTRY_POINT = new GColor("color.fg.listing.ext.entrypoint");
public static final GColor FIELD_NAME = new GColor("color.fg.listing.fieldname");
public static final GColor SEPARATOR = new GColor("color.fg.listing.separator");
public static final GColor UNDERLINE = new GColor("color.fg.listing.underline");
public static final GColor ARRAY_VALUES = new GColor("color.fg.listing.array.values");
public static final GColor BYTES_ALIGNMENT = new GColor("color.fg.listing.bytes.alignment");
public static final GColor BLOCK_START = new GColor("color.fg.listing.block.start");
public static final GColor CONSTANT = new GColor("color.fg.listing.constant");
public static final GColor REF_BAD = new GColor("color.fg.listing.ref.bad");
public static final GColor EXT_REF_UNRESOLVED = new GColor("color.fg.listing.ext.ref.unresolved");
public static final GColor EXT_REF_RESOLVED = new GColor("color.fg.listing.ext.ref.resolved");
public static final GColor REGISTER = new GColor("color.fg.listing.register");
public static final GColor PARALLEL_INSTRUCTION = new GColor("color.fg.listing.instruction.parallel");
public static class XrefColors {
public static final GColor DEFAULT = new GColor("color.fg.listing.xref");
public static final GColor OFFCUT = new GColor("color.fg.listing.xref.offcut");
public static final GColor READ = new GColor("color.fg.listing.xref.read");
public static final GColor WRITE = new GColor("color.fg.listing.xref.write");
public static final GColor OTHER = new GColor("color.fg.listing.xref.other");
}
public static class PcodeColors {
public static final GColor LABEL = new GColor("color.fg.listing.pcode.label");
public static final GColor ADDRESS_SPACE = new GColor("color.fg.listing.pcode.address.space");
public static final GColor VARNODE = new GColor("color.fg.listing.pcode.varnode");
public static final GColor USEROP = new GColor("color.fg.listing.pcode.userop");
}
public static class MnemonicColors {
public static final GColor NORMAL = new GColor("color.fg.listing.mnemonic");
public static final GColor OVERRIDE = new GColor("color.fg.listing.mnemonic.override");
public static final GColor UNIMPLEMENTED = new GColor("color.fg.listing.mnemonic.unimplemented");
}
public static class CommentColors {
public static final GColor AUTO = new GColor("color.fg.listing.comment.auto");
public static final GColor EOL = new GColor("color.fg.listing.comment.eol");
public static final GColor PLATE= new GColor("color.fg.listing.comment.plate");
public static final GColor POST= new GColor("color.fg.listing.comment.post");
public static final GColor PRE= new GColor("color.fg.listing.comment.pre");
public static final GColor REPEATABLE = new GColor("color.fg.listing.comment.repeatable");
public static final GColor REF_REPEATABLE = new GColor("color.fg.listing.comment.ref.repeatable");
}
public static class LabelColors {
public static final GColor LOCAL = new GColor("color.fg.listing.label.local");
public static final GColor NON_PRIMARY = new GColor("color.fg.listing.label.non.primary");
public static final GColor PRIMARY = new GColor("color.fg.listing.label.primary");
public static final GColor UNREFERENCED = new GColor("color.fg.listing.label.unreferenced");
}
public static class FunctionColors {
public static final GColor CALL_FIXUP = new GColor("color.fg.listing.function.callfixup");
public static final GColor NAME = new GColor("color.fg.listing.function.name");
public static final GColor PARAM = new GColor("color.fg.listing.function.param");
public static final GColor PARAM_AUTO = new GColor("color.fg.listing.function.param.auto");
public static final GColor PARAM_CUSTOM = new GColor("color.fg.listing.function.param.custom");
public static final GColor PARAM_DYNAMIC = new GColor("color.fg.listing.function.param.dynamic");
public static final GColor RETURN_TYPE = new GColor("color.fg.listing.function.return.type");
public static final GColor SOURCE = new GColor("color.fg.listing.function.source");
public static final GColor TAG = new GColor("color.fg.listing.function.tag");
public static final GColor VARIABLE = new GColor("color.fg.listing.function.variable");
public static final GColor VARIABLE_ASSIGNED = new GColor("color.fg.listing.function.variable.assigned");
public static final GColor THUNK = new GColor("color.fg.listing.function.name.thunk");
}
public static class FlowArrowColors {
public static final GColor ACTIVE = new GColor("color.fg.listing.flow.arrow.active");
public static final GColor INACTIVE = new GColor("color.fg.listing.flow.arrow.inactive");
public static final GColor SELECTED = new GColor("color.fg.listing.flow.arrow.selected");
}
public static class MaskColors {
public static final GColor BITS = new GColor("color.fg.listing.mask.bits");
public static final GColor LABEL = new GColor("color.fg.listing.mask.label");
public static final GColor VALUE = new GColor("color.fg.listing.mask.value");
}
// @formatter:on
}

View file

@ -23,7 +23,6 @@ import java.util.List;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.RowColLocation;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -42,14 +41,12 @@ import ghidra.program.util.ProgramLocation;
public class MemoryBlockStartFieldFactory extends FieldFactory {
private static final String FIELD_NAME = "Memory Block Start";
private static final Color BLOCK_COLOR = Palette.getColor("indigo");
/**
* Constructor
*/
public MemoryBlockStartFieldFactory() {
super(FIELD_NAME);
color = BLOCK_COLOR;
}
/**
@ -62,7 +59,6 @@ public class MemoryBlockStartFieldFactory extends FieldFactory {
private MemoryBlockStartFieldFactory(FieldFormatModel model, HighlightProvider hlProvider,
Options displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
color = BLOCK_COLOR;
}
/**
@ -187,15 +183,6 @@ public class MemoryBlockStartFieldFactory extends FieldFactory {
fieldOptions);
}
/**
* Creates a comment to be show at the beginning of each block that shows the following:
* - block name
* - block type
* - block start/end address (size)
* - block comment
*
* @param cu
*/
protected List<AttributedString> createBlockStartText(CodeUnit cu) {
List<AttributedString> lines = new ArrayList<>();
@ -227,7 +214,7 @@ public class MemoryBlockStartFieldFactory extends FieldFactory {
String line1 = block.getName() + " " + type;
String line2 = block.getComment();
String line3 = block.getStart().toString(true) + "-" + block.getEnd().toString(true);
Color color = ListingColors.BLOCK_START;
AttributedString borderAS = new AttributedString("//", color, getMetrics());
lines.add(borderAS);
lines.add(new AttributedString("// " + line1, color, getMetrics()));
@ -240,12 +227,6 @@ public class MemoryBlockStartFieldFactory extends FieldFactory {
return lines;
}
/**
* Creates {@link FieldElement} instances for each given {@link AttributedString}.
*
* @param attributedStrings
* @return
*/
private FieldElement[] createFieldElements(List<AttributedString> attributedStrings) {
List<FieldElement> elements = new ArrayList<>();
int lineNum = 0;
@ -261,23 +242,4 @@ public class MemoryBlockStartFieldFactory extends FieldFactory {
return elementsArray;
}
/**
* Returns the length of the longest string in the given list.
*
* @param lines
* @return
*/
private int getLongestLineSize(String... lines) {
int longest = 0;
for (String line : lines) {
if (line.length() > longest) {
longest = line.length();
}
}
return longest;
}
}

View file

@ -23,11 +23,10 @@ import javax.swing.event.ChangeListener;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors.Messages;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.GhidraOptions;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.MnemonicColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
@ -45,14 +44,11 @@ import ghidra.util.HelpLocation;
*/
public class MnemonicFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Mnemonic";
public static final Color OVERRIDE_COLOR = Palette.PURPLE;
private final static Color BAD_PROTOTYPE_COLOR = Messages.ERROR;
private final static String SHOW_UNDERLINE_FOR_REFERENCES =
GhidraOptions.MNEMONIC_GROUP_TITLE + Options.DELIMITER + "Underline Fields With References";
private static final String OVERRIDE_COLOR_OPTION = "Mnemonic, Override Color";
private Color overrideColor;
private boolean underliningEnabled = true;
protected BrowserCodeUnitFormat codeUnitFormat;
@ -76,8 +72,6 @@ public class MnemonicFieldFactory extends FieldFactory {
Options displayOptions, ToolOptions fieldOptions) {
super(FIELD_NAME, model, hsProvider, displayOptions, fieldOptions);
overrideColor = displayOptions.getColor(OVERRIDE_COLOR_OPTION, OVERRIDE_COLOR);
HelpLocation hl = new HelpLocation("CodeBrowserPlugin", "Mnemonic_Field");
fieldOptions.getOptions("Mnemonic Fields").setOptionsHelpLocation(hl);
@ -90,15 +84,6 @@ public class MnemonicFieldFactory extends FieldFactory {
codeUnitFormat.addChangeListener(codeUnitFormatListener);
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
if (optionName.equals(OVERRIDE_COLOR_OPTION)) {
overrideColor = (Color) newValue;
}
super.displayOptionsChanged(options, optionName, oldValue, newValue);
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
@ -129,14 +114,14 @@ public class MnemonicFieldFactory extends FieldFactory {
boolean underline = underliningEnabled && (cu.getMnemonicReferences().length > 0);
String mnemonic = codeUnitFormat.getMnemonicRepresentation(cu);
Color c = color;
Color c = MnemonicColors.NORMAL;
if (invalidInstrProto) {
c = BAD_PROTOTYPE_COLOR;
}
else if (cu instanceof Instruction) {
Instruction instr = (Instruction) cu;
if (instr.getFlowOverride() != FlowOverride.NONE || instr.isFallThroughOverridden()) {
c = overrideColor;
c = MnemonicColors.OVERRIDE;
}
}
else {
@ -146,7 +131,7 @@ public class MnemonicFieldFactory extends FieldFactory {
}
}
AttributedString as =
new AttributedString(mnemonic, c, getMetrics(), underline, underlineColor);
new AttributedString(mnemonic, c, getMetrics(), underline, ListingColors.UNDERLINE);
FieldElement text = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, text, startX + varWidth,
width, hlProvider);
@ -222,8 +207,4 @@ public class MnemonicFieldFactory extends FieldFactory {
return new MnemonicFieldFactory(formatModel, hsProvider, displayOptions, fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.MNEMONIC.getDefaultColor();
}
}

View file

@ -42,7 +42,7 @@ public class OpenCloseFieldFactory extends FieldFactory {
/**
* Constructor
* @param model the model that the field belongs to.
* @param hsProvider the HightLightStringProvider.
* @param hlProvider the HightLightStringProvider.
* @param displayOptions the Options for display properties.
* @param fieldOptions the Options for field specific properties.
*/
@ -86,13 +86,6 @@ public class OpenCloseFieldFactory extends FieldFactory {
return null;
}
/**
* @see ghidra.app.util.viewer.field.FieldFactory#servicesChanged()
*/
@Override
public void servicesChanged() {
}
/**
* Computes if the given data is the last component at its level.
*/
@ -165,5 +158,4 @@ public class OpenCloseFieldFactory extends FieldFactory {
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new OpenCloseFieldFactory(fieldModel, provider, displayOptions, fieldOptions);
}
}

View file

@ -27,6 +27,7 @@ import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.RowColLocation;
import ghidra.GhidraOptions;
import ghidra.app.util.*;
import ghidra.app.util.viewer.field.ListingColors.FunctionColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -366,7 +367,7 @@ abstract class OperandFieldHelper extends FieldFactory {
: getAttributesForData(data, value);
AttributedString as =
new AttributedString(dataValueRepresentation.toString(), attributes.colorAttribute,
getMetrics(attributes.styleAttribute), underline, underlineColor);
getMetrics(attributes.styleAttribute), underline, ListingColors.UNDERLINE);
FieldElement field = new OperandFieldElement(as, 0, 0, 0);
if (shouldWordWrap(data, dataValueRepresentation)) {
@ -450,7 +451,7 @@ abstract class OperandFieldHelper extends FieldFactory {
AttributedString as =
new AttributedString(opRepList != null ? opRepList.toString() : "<UNSUPPORTED>",
badRefAttributes.colorAttribute, getMetrics(badRefAttributes.styleAttribute),
false, underlineColor);
false, ListingColors.UNDERLINE);
elements.add(new OperandFieldElement(as, opIndex, subOpIndex, characterOffset));
characterOffset += as.length();
}
@ -491,7 +492,7 @@ abstract class OperandFieldHelper extends FieldFactory {
ColorStyleAttributes attributes = getOpAttributes(opElem, inst, opIndex);
AttributedString as = new AttributedString(opElem.toString(), attributes.colorAttribute,
getMetrics(attributes.styleAttribute), underline, underlineColor);
getMetrics(attributes.styleAttribute), underline, ListingColors.UNDERLINE);
elements.add(new OperandFieldElement(as, opIndex, subOpIndex, characterOffset));
return characterOffset + as.length();
}
@ -670,34 +671,27 @@ abstract class OperandFieldHelper extends FieldFactory {
* changes. It looks up all the color settings and resets the its values.
*/
private void setOptions(Options options) {
separatorAttributes.colorAttribute = options.getColor(
OptionsGui.SEPARATOR.getColorOptionName(), OptionsGui.SEPARATOR.getDefaultColor());
separatorAttributes.colorAttribute = ListingColors.SEPARATOR;
scalarAttributes.colorAttribute = ListingColors.CONSTANT;
variableRefAttributes.colorAttribute = FunctionColors.VARIABLE;
addressAttributes.colorAttribute = ListingColors.ADDRESS;
externalRefAttributes.colorAttribute = ListingColors.EXT_REF_RESOLVED;
badRefAttributes.colorAttribute = ListingColors.REF_BAD;
registerAttributes.colorAttribute = ListingColors.REGISTER;
separatorAttributes.styleAttribute =
options.getInt(OptionsGui.SEPARATOR.getStyleOptionName(), -1);
scalarAttributes.colorAttribute = options.getColor(OptionsGui.CONSTANT.getColorOptionName(),
OptionsGui.CONSTANT.getDefaultColor());
scalarAttributes.styleAttribute =
options.getInt(OptionsGui.CONSTANT.getStyleOptionName(), -1);
variableRefAttributes.colorAttribute = options.getColor(
OptionsGui.VARIABLE.getColorOptionName(), OptionsGui.VARIABLE.getDefaultColor());
variableRefAttributes.styleAttribute =
options.getInt(OptionsGui.VARIABLE.getStyleOptionName(), -1);
addressAttributes.colorAttribute = options.getColor(OptionsGui.ADDRESS.getColorOptionName(),
OptionsGui.ADDRESS.getDefaultColor());
addressAttributes.styleAttribute =
options.getInt(OptionsGui.ADDRESS.getStyleOptionName(), -1);
externalRefAttributes.colorAttribute =
options.getColor(OptionsGui.EXT_REF_RESOLVED.getColorOptionName(),
OptionsGui.EXT_REF_RESOLVED.getDefaultColor());
externalRefAttributes.styleAttribute =
options.getInt(OptionsGui.EXT_REF_RESOLVED.getStyleOptionName(), -1);
badRefAttributes.colorAttribute =
options.getColor(OptionsGui.BAD_REF_ADDR.getColorOptionName(),
OptionsGui.BAD_REF_ADDR.getDefaultColor());
badRefAttributes.styleAttribute =
options.getInt(OptionsGui.BAD_REF_ADDR.getStyleOptionName(), -1);
registerAttributes.colorAttribute = options.getColor(
OptionsGui.REGISTERS.getColorOptionName(), OptionsGui.REGISTERS.getDefaultColor());
registerAttributes.styleAttribute =
options.getInt(OptionsGui.REGISTERS.getStyleOptionName(), -1);

View file

@ -15,13 +15,10 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -40,7 +37,6 @@ import ghidra.program.util.ProgramLocation;
public class ParallelInstructionFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Parallel ||";
public static final Color DEFAULT_COLOR = Palette.BLUE;
/**
* Default constructor.
@ -61,12 +57,6 @@ public class ParallelInstructionFieldFactory extends FieldFactory {
super(FIELD_NAME, model, hsProvider, displayOptions, fieldOptions);
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
// don't care
}
/**
* Returns the FactoryField for the given object at index index.
* @param proxy the object whose properties should be displayed.
@ -92,8 +82,8 @@ public class ParallelInstructionFieldFactory extends FieldFactory {
return null;
}
AttributedString as =
new AttributedString(fieldText, color, getMetrics(), false, underlineColor);
AttributedString as = new AttributedString(fieldText, ListingColors.PARALLEL_INSTRUCTION,
getMetrics(), false, ListingColors.UNDERLINE);
FieldElement text = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, text, startX + varWidth,
width, hlProvider);
@ -132,9 +122,4 @@ public class ParallelInstructionFieldFactory extends FieldFactory {
return new ParallelInstructionFieldFactory(formatModel, hsProvider, toolOptinos,
fieldOptions);
}
@Override
public Color getDefaultColor() {
return Colors.FOREGROUND;
}
}

View file

@ -27,9 +27,9 @@ import docking.widgets.fieldpanel.support.*;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.HelpTopics;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.CommentColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.listingpanel.ListingModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.DataProxy;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -227,7 +227,8 @@ public class PlateFieldFactory extends FieldFactory {
return false;
}
AttributedString prototype = new AttributedString(EMPTY_STRING, color, getMetrics());
AttributedString prototype =
new AttributedString(EMPTY_STRING, CommentColors.PLATE, getMetrics());
AttributedString asteriscs = getStarsString();
int row = elements.size();
@ -288,19 +289,19 @@ public class PlateFieldFactory extends FieldFactory {
addPadding(buffy, prePadding);
FieldElement prefix = new TextFieldElement(
new AttributedString(buffy.toString(), color, getMetrics()), row, 0);
new AttributedString(buffy.toString(), CommentColors.PLATE, getMetrics()), row, 0);
FieldElement ellipsis =
new TextFieldElement(new AttributedString(ellipsisText, color, getMetrics()), row,
prefix.length() + element.length());
FieldElement ellipsis = new TextFieldElement(
new AttributedString(ellipsisText, CommentColors.PLATE, getMetrics()), row,
prefix.length() + element.length());
buffy.setLength(0);
addPadding(buffy, postPadding);
buffy.append(' ').append('*');
FieldElement suffix =
new TextFieldElement(new AttributedString(buffy.toString(), color, getMetrics()), row,
prefix.length() + element.length() + ellipsis.length());
FieldElement suffix = new TextFieldElement(
new AttributedString(buffy.toString(), CommentColors.PLATE, getMetrics()), row,
prefix.length() + element.length() + ellipsis.length());
return new FieldElementResult(
new CompositeFieldElement(new FieldElement[] { prefix, element, ellipsis, suffix }),
@ -314,7 +315,8 @@ public class PlateFieldFactory extends FieldFactory {
}
private void addBlankLines(List<FieldElement> elements, int numberBlankLines, CodeUnit cu) {
AttributedString prototype = new AttributedString(EMPTY_STRING, color, getMetrics());
AttributedString prototype =
new AttributedString(EMPTY_STRING, CommentColors.PLATE, getMetrics());
for (int row = 0; row < numberBlankLines; row++) {
elements.add(0, new TextFieldElement(prototype, row, 0));
}
@ -350,7 +352,8 @@ public class PlateFieldFactory extends FieldFactory {
elements.add(new TextFieldElement(asteriscs, row++, 0));
int commentRow = row++;
AttributedString as = new AttributedString(defaultComment, color, getMetrics());
AttributedString as =
new AttributedString(defaultComment, CommentColors.PLATE, getMetrics());
TextFieldElement commentElement = new TextFieldElement(as, commentRow, 0);
FieldElementResult result = addSideBorder(commentElement, commentRow, true);
elements.add(result.getFieldElement());
@ -424,7 +427,7 @@ public class PlateFieldFactory extends FieldFactory {
private AttributedString getStarsString() {
String asteriscs = getStars();
return new AttributedString(asteriscs, color, getMetrics());
return new AttributedString(asteriscs, CommentColors.PLATE, getMetrics());
}
/**
@ -547,8 +550,8 @@ public class PlateFieldFactory extends FieldFactory {
int dataRow = commentRow + numberBlankLines + headerCount;
ListingTextField listingTextField = (ListingTextField) listingField;
RowColLocation location = listingTextField.dataToScreenLocation(dataRow,
commentLocation.getCharOffset());
RowColLocation location =
listingTextField.dataToScreenLocation(dataRow, commentLocation.getCharOffset());
return new FieldLocation(index, fieldNum, location.row(), location.col());
}
@ -569,11 +572,6 @@ public class PlateFieldFactory extends FieldFactory {
return new PlateFieldFactory(formatModel, hsProvider, toolOptions, fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.COMMENT_PLATE.getDefaultColor();
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {

View file

@ -25,6 +25,7 @@ import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.FieldUtils;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.CommentColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -72,7 +73,6 @@ public class PostCommentFieldFactory extends FieldFactory {
private int nLinesAfterBlocks;
private boolean isWordWrap;
private boolean alwaysShowAutomatic;
private Color automaticCommentColor;
private int automaticCommentStyle;
/**
@ -104,9 +104,6 @@ public class PostCommentFieldFactory extends FieldFactory {
flagJMPsRETs = fieldOptions.getBoolean(FLAG_TERMINATOR_OPTION, false);
nLinesAfterBlocks = fieldOptions.getInt(LINES_AFTER_BLOCKS_OPTION, 0);
automaticCommentColor =
displayOptions.getColor(OptionsGui.COMMENT_AUTO.getColorOptionName(),
OptionsGui.COMMENT_AUTO.getDefaultColor());
automaticCommentStyle =
displayOptions.getInt(OptionsGui.COMMENT_AUTO.getStyleOptionName(), -1);
@ -331,11 +328,6 @@ public class PostCommentFieldFactory extends FieldFactory {
return new PostCommentFieldFactory(formatModel, provider, toolOptions, fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.COMMENT_POST.getDefaultColor();
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
@ -379,9 +371,6 @@ public class PostCommentFieldFactory extends FieldFactory {
*/
private void adjustAutomaticCommentDisplayOptions(Options options, String optionName,
Object oldValue, Object newValue) {
if (optionName.equals(OptionsGui.COMMENT_AUTO.getColorOptionName())) {
automaticCommentColor = (Color) newValue;
}
String automaticCommentStyleName = OptionsGui.COMMENT_AUTO.getStyleOptionName();
if (optionName.equals(automaticCommentStyleName)) {
automaticCommentStyle = options.getInt(automaticCommentStyleName, -1);
@ -393,6 +382,7 @@ public class PostCommentFieldFactory extends FieldFactory {
Listing listing = instr.getProgram().getListing();
Address addr = instr.getMinAddress();
FlowType flowType = instr.getFlowType();
Color color = CommentColors.POST;
// Options that affect Post Comments:
// Flag Function Exits (only if post comment does not exist)
@ -456,7 +446,7 @@ public class PostCommentFieldFactory extends FieldFactory {
if (fields.length > 0) {
for (int i = 0; i < nLinesAutoComment; i++) {
AttributedString as = new AttributedString(autoComment[i],
automaticCommentColor, getMetrics(automaticCommentStyle), false, null);
CommentColors.AUTO, getMetrics(automaticCommentStyle), false, null);
fields[i] = new TextFieldElement(as, i, 0);
}
for (int i = 0; i < comments.length; i++) {
@ -497,10 +487,11 @@ public class PostCommentFieldFactory extends FieldFactory {
CodeUnit cu = (CodeUnit) proxy.getObject();
Program program = cu.getProgram();
AttributedString prototypeString = new AttributedString("prototype", color, getMetrics());
AttributedString prototypeString =
new AttributedString("prototype", CommentColors.POST, getMetrics());
List<FieldElement> fields = new ArrayList<>();
for (int i = 0; i < nLinesAutoComment; i++) {
AttributedString as = new AttributedString(autoComment[i], automaticCommentColor,
AttributedString as = new AttributedString(autoComment[i], CommentColors.AUTO,
getMetrics(automaticCommentStyle), false, null);
fields.add(new TextFieldElement(as, i, 0));
}
@ -513,7 +504,7 @@ public class PostCommentFieldFactory extends FieldFactory {
}
if (useLinesAfterBlock) {
for (int i = 0; i < nLinesAfterBlocks; i++) {
AttributedString as = new AttributedString("", color, getMetrics());
AttributedString as = new AttributedString("", CommentColors.POST, getMetrics());
fields.add(new TextFieldElement(as, fields.size(), 0));
}
}
@ -618,12 +609,12 @@ public class PostCommentFieldFactory extends FieldFactory {
hasAppropriatePcodeOp = true;
if (op.getOpcode() == PcodeOp.CALLOTHER) {
if (callOtherName == null) {
callOtherName = inst.getProgram().getLanguage().getUserDefinedOpName(
(int) op.getInput(0).getOffset());
callOtherName = inst.getProgram()
.getLanguage()
.getUserDefinedOpName((int) op.getInput(0).getOffset());
if (op.getOutput() != null) {
outputWarningString =
"WARNING: Output of " + callOtherName +
" destroyed by override!";
"WARNING: Output of " + callOtherName + " destroyed by override!";
}
}
else {

View file

@ -15,7 +15,6 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@ -26,6 +25,7 @@ import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.FieldUtils;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.CommentColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
@ -66,7 +66,6 @@ public class PreCommentFieldFactory extends FieldFactory {
private boolean flagSubroutineEntry;
private boolean isWordWrap;
private boolean alwaysShowAutomatic;
private Color automaticCommentColor;
private int automaticCommentStyle;
/**
@ -95,9 +94,6 @@ public class PreCommentFieldFactory extends FieldFactory {
flagFunctionEntry = fieldOptions.getBoolean(FLAG_FUNCTION_ENTRY_OPTION, false);
flagSubroutineEntry = fieldOptions.getBoolean(FLAG_SUBROUTINE_ENTRY_OPTION, false);
automaticCommentColor =
displayOptions.getColor(OptionsGui.COMMENT_AUTO.getColorOptionName(),
OptionsGui.COMMENT_AUTO.getDefaultColor());
automaticCommentStyle =
displayOptions.getInt(OptionsGui.COMMENT_AUTO.getStyleOptionName(), -1);
@ -188,11 +184,6 @@ public class PreCommentFieldFactory extends FieldFactory {
return new PreCommentFieldFactory(formatModel, provider, toolOptions, fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.COMMENT_PRE.getDefaultColor();
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
@ -266,7 +257,7 @@ public class PreCommentFieldFactory extends FieldFactory {
// NOTE: A zero-length composite has a length of 1 which may cause it to improperly consume
// the address location which actually corresponds to a trailing zero-length
// component.
int levelsToIgnore = 0;
String label = null;
Address prevDataAddr = data.getMinAddress().previous();
@ -314,11 +305,11 @@ public class PreCommentFieldFactory extends FieldFactory {
lastDtc = ddt.getComponent(lastDtcOrdinal, data);
}
}
if (lastDtc == null || lastDtc.getLength() == 0) {
break;
}
Data component = data.getComponent(lastDtc.getOrdinal());
if (component == null) {
return null;
@ -329,11 +320,12 @@ public class PreCommentFieldFactory extends FieldFactory {
if (lastDtc == null || lastDtc.isBitFieldComponent()) {
return null;
}
return buildZeroLengthComponentAutoComment(lastDtc, data, levelsToIgnore, label);
}
private String[] buildZeroLengthComponentAutoComment(DataTypeComponent lastZeroLengthComponent, Data data, int levelsToIgnore, String label) {
private String[] buildZeroLengthComponentAutoComment(DataTypeComponent lastZeroLengthComponent,
Data data, int levelsToIgnore, String label) {
String fieldName = lastZeroLengthComponent.getFieldName();
if (StringUtils.isEmpty(fieldName)) {
@ -356,8 +348,8 @@ public class PreCommentFieldFactory extends FieldFactory {
flexName.insert(0, label + ".");
}
return new String[] { "Zero-length Component: " + lastZeroLengthComponent.getDataType().getName() + " " +
flexName.toString() };
return new String[] { "Zero-length Component: " +
lastZeroLengthComponent.getDataType().getName() + " " + flexName.toString() };
}
private ListingTextField getTextField(String[] comments, String[] autoComment,
@ -378,10 +370,11 @@ public class PreCommentFieldFactory extends FieldFactory {
CodeUnit cu = (CodeUnit) proxy.getObject();
Program program = cu.getProgram();
AttributedString prototypeString = new AttributedString("prototype", color, getMetrics());
AttributedString prototypeString =
new AttributedString("prototype", CommentColors.PRE, getMetrics());
List<FieldElement> fields = new ArrayList<>();
for (int i = 0; i < nLinesAutoComment; i++) {
AttributedString as = new AttributedString(autoComment[i], automaticCommentColor,
AttributedString as = new AttributedString(autoComment[i], CommentColors.AUTO,
getMetrics(automaticCommentStyle), false, null);
fields.add(new TextFieldElement(as, i, 0));
}

View file

@ -15,7 +15,6 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import java.util.*;
@ -23,7 +22,6 @@ import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
@ -47,7 +45,6 @@ public class RegisterFieldFactory extends FieldFactory {
RegisterFieldFactory.REGISTER_GROUP_NAME + Options.DELIMITER +
"Display Default Register Values";
private RegComparator regComp;
private Color regColor;
private boolean showHiddenRegisters;
private boolean showDefaultValues;
@ -59,15 +56,16 @@ public class RegisterFieldFactory extends FieldFactory {
Options displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, highlightProvider, displayOptions, fieldOptions);
regComp = new RegComparator();
initDisplayOptions();
}
@Override
protected void initFieldOptions(Options fieldOptions) {
super.initFieldOptions(fieldOptions);
fieldOptions.registerOption(DISPLAY_HIDDEN_REGISTERS_OPTION_NAME, false, null,
"Shows/hides context registers");
fieldOptions.registerOption(DISPLAY_DEFAULT_REGISTER_VALUES_OPTION_NAME, false, null,
"Shows/hides default register values");
regColor =
displayOptions.getColor(OptionsGui.REGISTERS.getColorOptionName(), getDefaultColor());
showHiddenRegisters = fieldOptions.getBoolean(DISPLAY_HIDDEN_REGISTERS_OPTION_NAME, false);
showDefaultValues =
fieldOptions.getBoolean(DISPLAY_DEFAULT_REGISTER_VALUES_OPTION_NAME, false);
@ -152,11 +150,6 @@ public class RegisterFieldFactory extends FieldFactory {
return (category == FieldFormatModel.FUNCTION);
}
@Override
public Color getDefaultColor() {
return OptionsGui.REGISTERS.getDefaultColor();
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
@ -173,16 +166,6 @@ public class RegisterFieldFactory extends FieldFactory {
}
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
if (optionName.equals(OptionsGui.REGISTERS.getColorOptionName())) {
regColor = (Color) newValue;
model.update();
}
}
private List<Register> getSetRegisters(Function function) {
Program program = function.getProgram();
ProgramContext programContext = program.getProgramContext();
@ -219,7 +202,8 @@ public class RegisterFieldFactory extends FieldFactory {
private FieldElement[] getFieldElements(String[] registerStrings) {
FieldElement[] fieldElements = new FieldElement[registerStrings.length];
for (int i = 0; i < registerStrings.length; i++) {
AttributedString str = new AttributedString(registerStrings[i], regColor, getMetrics());
AttributedString str =
new AttributedString(registerStrings[i], ListingColors.REGISTER, getMetrics());
fieldElements[i] = new TextFieldElement(str, i, 0);
}
return fieldElements;

View file

@ -15,7 +15,6 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@ -25,7 +24,6 @@ import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.cmd.function.CallDepthChangeInfo;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
@ -36,15 +34,11 @@ import ghidra.program.model.listing.*;
import ghidra.program.util.ProgramLocation;
import ghidra.program.util.RegisterTransitionFieldLocation;
/**
* Generates Mnemonic Fields.
*/
public class RegisterTransitionFieldFactory extends FieldFactory {
private static final String FIELD_NAME = "Register Transition";
private static final String DISPLAY_HIDDEN_REGISTERS_OPTION_NAME =
RegisterFieldFactory.DISPLAY_HIDDEN_REGISTERS_OPTION_NAME;
private Color regColor;
private boolean showContextRegisters;
/**
@ -68,9 +62,6 @@ public class RegisterTransitionFieldFactory extends FieldFactory {
}
private void initOptions(Options displayOptions, Options fieldOptions) {
regColor =
displayOptions.getColor(OptionsGui.REGISTERS.getColorOptionName(), getDefaultColor());
showContextRegisters = fieldOptions.getBoolean(DISPLAY_HIDDEN_REGISTERS_OPTION_NAME, false);
}
@ -85,17 +76,6 @@ public class RegisterTransitionFieldFactory extends FieldFactory {
}
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
if (optionName.equals(OptionsGui.REGISTERS.getColorOptionName())) {
regColor = (Color) newValue;
model.update();
}
}
/**
* Returns the FactoryField for the given object at index index.
* @param varWidth the amount of variable width spacing for any fields
@ -141,12 +121,15 @@ public class RegisterTransitionFieldFactory extends FieldFactory {
FieldElement[] fieldElements = new FieldElement[numElements];
for (int i = 0; i < numRegisters; i++) {
Register register = transitionRegisters.get(i);
AttributedString str = new AttributedString("assume " + register.getName() + " = " +
getValueString(register, context, curAddress), regColor, getMetrics());
AttributedString str = new AttributedString(
"assume " + register.getName() + " = " +
getValueString(register, context, curAddress),
ListingColors.REGISTER, getMetrics());
fieldElements[i] = new TextFieldElement(str, i, 0);
}
if (stackDepthStr != null) {
AttributedString str = new AttributedString(stackDepthStr, regColor, getMetrics());
AttributedString str =
new AttributedString(stackDepthStr, ListingColors.REGISTER, getMetrics());
fieldElements[numRegisters] = new TextFieldElement(str, numRegisters, 0);
}
return ListingTextField.createMultilineTextField(this, proxy, fieldElements,
@ -264,9 +247,4 @@ public class RegisterTransitionFieldFactory extends FieldFactory {
return new RegisterTransitionFieldFactory(fieldFormatModel, hsProvider, displayOptions,
fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.MNEMONIC.getDefaultColor();
}
}

View file

@ -48,7 +48,7 @@ public class SeparatorFieldFactory extends FieldFactory {
/**
* Constructor
* @param model the model that the field belongs to.
* @param hsProvider the HightLightStringProvider.
* @param hlProvider the HightLightStringProvider.
* @param displayOptions the Options for display properties.
* @param fieldOptions the Options for field specific properties.
*/
@ -71,7 +71,8 @@ public class SeparatorFieldFactory extends FieldFactory {
sb.append(sepChar);
}
AttributedString as = new AttributedString(sb.toString(), color, getMetrics());
AttributedString as =
new AttributedString(sb.toString(), ListingColors.SEPARATOR, getMetrics());
FieldElement text = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, text, startX + varWidth,
width, hlProvider);
@ -118,5 +119,4 @@ public class SeparatorFieldFactory extends FieldFactory {
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new SeparatorFieldFactory(formatModel, provider, displayOptions, fieldOptions);
}
}

View file

@ -47,7 +47,7 @@ public class SpaceFieldFactory extends FieldFactory {
/**
* Constructor
* @param model the model that the field belongs to.
* @param hsProvider the HightLightStringProvider.
* @param hlProvider the HightLightStringProvider.
* @param displayOptions the Options for display properties.
* @param fieldOptions the Options for field specific properties.
*/
@ -84,8 +84,8 @@ public class SpaceFieldFactory extends FieldFactory {
fes[i] = new TextFieldElement(as, 0, 0);
}
return ListingTextField.createMultilineTextField(this, proxy, fes,
startX + varWidth, width, n + 1, hlProvider);
return ListingTextField.createMultilineTextField(this, proxy, fes, startX + varWidth,
width, n + 1, hlProvider);
}
return null;
@ -153,5 +153,4 @@ public class SpaceFieldFactory extends FieldFactory {
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new SpaceFieldFactory(formatModel, provider, displayOptions, fieldOptions);
}
}

View file

@ -30,12 +30,9 @@ import ghidra.program.model.listing.Data;
import ghidra.program.util.ProgramLocation;
import ghidra.program.util.SpacerFieldLocation;
import ghidra.util.StringUtilities;
import ghidra.util.classfinder.ClassSearcher;
/**
* Generates Spacer Fields.
* <P>
* This field is not meant to be loaded by the {@link ClassSearcher}, hence the X in the name.
*/
public class SpacerFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Spacer";
@ -114,7 +111,7 @@ public class SpacerFieldFactory extends FieldFactory {
@Override
public ListingField getField(ProxyObj<?> proxy, int varWidth) {
if (enabled && (text != null)) {
AttributedString as = new AttributedString(text, color, getMetrics());
AttributedString as = new AttributedString(text, ListingColors.SEPARATOR, getMetrics());
FieldElement field = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, field, startX + varWidth,
width, hlProvider);
@ -186,5 +183,4 @@ public class SpacerFieldFactory extends FieldFactory {
ToolOptions options, ToolOptions fieldOptions) {
return new SpacerFieldFactory(formatModel, provider, options, fieldOptions);
}
}

View file

@ -23,7 +23,6 @@ import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.FunctionProxy;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -41,9 +40,6 @@ import ghidra.program.util.ThunkedFunctionFieldLocation;
public class ThunkedFunctionFieldFactory extends FieldFactory {
public static final String FIELD_NAME = "Thunked-Function";
private Color literalColor;
private Color unresolvedThunkRefColor;
private Color resolvedThunkRefColor;
/**
* Default Constructor
@ -62,46 +58,23 @@ public class ThunkedFunctionFieldFactory extends FieldFactory {
public ThunkedFunctionFieldFactory(FieldFormatModel model, HighlightProvider hlProvider,
ToolOptions displayOptions, Options fieldOptions) {
super(FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
literalColor = displayOptions.getColor(OptionsGui.SEPARATOR.getColorOptionName(),
OptionsGui.SEPARATOR.getDefaultColor());
unresolvedThunkRefColor =
displayOptions.getColor(OptionsGui.BAD_REF_ADDR.getColorOptionName(),
OptionsGui.BAD_REF_ADDR.getDefaultColor());
resolvedThunkRefColor =
displayOptions.getColor(OptionsGui.EXT_REF_RESOLVED.getColorOptionName(),
OptionsGui.EXT_REF_RESOLVED.getDefaultColor());
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
literalColor = options.getColor(OptionsGui.FUN_CALL_FIXUP.getColorOptionName(),
OptionsGui.FUN_CALL_FIXUP.getDefaultColor());
unresolvedThunkRefColor =
displayOptions.getColor(OptionsGui.BAD_REF_ADDR.getColorOptionName(),
OptionsGui.BAD_REF_ADDR.getDefaultColor());
resolvedThunkRefColor =
displayOptions.getColor(OptionsGui.EXT_REF_RESOLVED.getColorOptionName(),
OptionsGui.EXT_REF_RESOLVED.getDefaultColor());
}
private Color getThunkedFunctionNameColor(Function thunkedFunction) {
if (!thunkedFunction.isExternal()) {
return literalColor;
return ListingColors.SEPARATOR;
}
ExternalLocation externalLocation = thunkedFunction.getExternalLocation();
String libName = externalLocation.getLibraryName();
if (Library.UNKNOWN.equals(libName)) {
return unresolvedThunkRefColor;
return ListingColors.EXT_REF_UNRESOLVED;
}
ExternalManager externalManager = thunkedFunction.getProgram().getExternalManager();
String path = externalManager.getExternalLibraryPath(libName);
if (path == null || path.length() == 0) {
return unresolvedThunkRefColor;
return ListingColors.EXT_REF_UNRESOLVED;
}
return resolvedThunkRefColor;
return ListingColors.EXT_REF_RESOLVED;
}
@Override
@ -120,7 +93,7 @@ public class ThunkedFunctionFieldFactory extends FieldFactory {
AttributedString as;
int elementIndex = 0;
as = new AttributedString("Thunked-Function: ", literalColor, getMetrics());
as = new AttributedString("Thunked-Function: ", ListingColors.SEPARATOR, getMetrics());
textElements.add(new TextFieldElement(as, elementIndex++, 0));
as = new AttributedString(thunkedFunction.getName(true),
@ -171,10 +144,4 @@ public class ThunkedFunctionFieldFactory extends FieldFactory {
return new ThunkedFunctionFieldFactory(formatModel, provider, pDisplayOptions,
fieldOptions);
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
// don't care
}
}

View file

@ -15,14 +15,12 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.app.util.viewer.proxy.VariableProxy;
import ghidra.framework.options.Options;
@ -48,7 +46,7 @@ public class VariableCommentFieldFactory extends AbstractVariableFieldFactory {
/**
* Constructor
* @param model the model that the field belongs to.
* @param hsProvider the HightLightStringProvider.
* @param hlProvider the HightLightStringProvider.
* @param displayOptions the Options for display properties.
* @param fieldOptions the Options for field specific properties.
*/
@ -181,12 +179,4 @@ public class VariableCommentFieldFactory extends AbstractVariableFieldFactory {
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new VariableCommentFieldFactory(formatModel, provider, displayOptions, fieldOptions);
}
/**
* @see ghidra.app.util.viewer.field.FieldFactory#getDefaultColor()
*/
@Override
public Color getDefaultColor() {
return OptionsGui.VARIABLE.getDefaultColor();
}
}

View file

@ -15,7 +15,6 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.awt.FontMetrics;
import java.math.BigInteger;
@ -27,7 +26,6 @@ import generic.theme.GIcon;
import generic.theme.GThemeDefaults.Colors.Messages;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.app.util.viewer.proxy.VariableProxy;
import ghidra.framework.options.Options;
@ -151,9 +149,4 @@ public class VariableLocFieldFactory extends AbstractVariableFieldFactory {
ToolOptions toolOptions, ToolOptions fieldOptions) {
return new VariableLocFieldFactory(formatModel, provider, toolOptions, fieldOptions);
}
@Override
public Color getDefaultColor() {
return OptionsGui.VARIABLE.getDefaultColor();
}
}

View file

@ -15,14 +15,12 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.app.util.viewer.proxy.VariableProxy;
import ghidra.framework.options.Options;
@ -129,13 +127,4 @@ public class VariableNameFieldFactory extends AbstractVariableFieldFactory {
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new VariableNameFieldFactory(formatModel, provider, displayOptions, fieldOptions);
}
/**
* @see ghidra.app.util.viewer.field.FieldFactory#getDefaultColor()
*/
@Override
public Color getDefaultColor() {
return OptionsGui.VARIABLE.getDefaultColor();
}
}

View file

@ -15,14 +15,12 @@
*/
package ghidra.app.util.viewer.field;
import java.awt.Color;
import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.app.util.viewer.proxy.VariableProxy;
import ghidra.framework.options.Options;
@ -139,13 +137,4 @@ public class VariableTypeFieldFactory extends AbstractVariableFieldFactory {
ToolOptions displayOptions, ToolOptions fieldOptions) {
return new VariableTypeFieldFactory(formatModel, provider, displayOptions, fieldOptions);
}
/**
* @see ghidra.app.util.viewer.field.FieldFactory#getDefaultColor()
*/
@Override
public Color getDefaultColor() {
return OptionsGui.VARIABLE.getDefaultColor();
}
}

View file

@ -24,6 +24,7 @@ import docking.widgets.fieldpanel.support.RowColLocation;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.XReferenceUtils;
import ghidra.app.util.viewer.field.ListingColors.XrefColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -69,9 +70,13 @@ public class VariableXRefFieldFactory extends XRefFieldFactory {
protected VariableXRefFieldFactory(String name, FieldFormatModel model,
HighlightProvider hlProvider, Options displayOptions, ToolOptions fieldOptions) {
super(name, model, hlProvider, displayOptions, fieldOptions);
}
@Override
protected void initDisplayOptions(Options displayOptions) {
colorOptionName = "XRef Color";
styleOptionName = "XRef Style";
initDisplayOptions();
super.initDisplayOptions(displayOptions);
}
@Override
@ -110,7 +115,7 @@ public class VariableXRefFieldFactory extends XRefFieldFactory {
Reference reference = xrefs.get(count);
String prefix = getPrefix(program, reference, func);
AttributedString as = new AttributedString(reference.getFromAddress().toString(prefix),
color, getMetrics());
XrefColors.DEFAULT, getMetrics());
if (displayRefType) {
as = createRefTypeAttributedString(reference, as);
}
@ -122,7 +127,7 @@ public class VariableXRefFieldFactory extends XRefFieldFactory {
char[] charSpaces = new char[delimiter.length()];
Arrays.fill(charSpaces, ' ');
AttributedString spaces =
new AttributedString(new String(charSpaces), color, getMetrics());
new AttributedString(new String(charSpaces), XrefColors.DEFAULT, getMetrics());
as = new CompositeAttributedString(new AttributedString[] { as, spaces });
}
elements[count] = new TextFieldElement(as, count, 0);
@ -132,7 +137,7 @@ public class VariableXRefFieldFactory extends XRefFieldFactory {
Reference ref = offcuts.get(i);
String prefix = getPrefix(program, ref, func);
AttributedString as = new AttributedString(ref.getFromAddress().toString(prefix),
offcutColor, getMetrics());
XrefColors.OFFCUT, getMetrics());
if (displayRefType) {
as = createRefTypeAttributedString(ref, as);
}
@ -144,14 +149,14 @@ public class VariableXRefFieldFactory extends XRefFieldFactory {
char[] charSpaces = new char[delimiter.length()];
Arrays.fill(charSpaces, ' ');
AttributedString spaces =
new AttributedString(new String(charSpaces), offcutColor, getMetrics());
new AttributedString(new String(charSpaces), XrefColors.OFFCUT, getMetrics());
as = new CompositeAttributedString(new AttributedString[] { as, spaces });
}
elements[count] = new TextFieldElement(as, count, 0);
}
if (tooMany) {
AttributedString as = new AttributedString("[more]", color, getMetrics());
AttributedString as = new AttributedString("[more]", XrefColors.DEFAULT, getMetrics());
elements[count - 1] = new TextFieldElement(as, count - 1, 0);
}

View file

@ -20,6 +20,7 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.field.ListingColors.XrefColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.app.util.viewer.proxy.VariableProxy;
@ -77,7 +78,7 @@ public class VariableXRefHeaderFieldFactory extends VariableXRefFieldFactory {
return null;
}
AttributedString as = new AttributedString(headString, color, getMetrics());
AttributedString as = new AttributedString(headString, XrefColors.DEFAULT, getMetrics());
FieldElement text = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, text, startX + varWidth,
width, hlProvider);

View file

@ -30,8 +30,8 @@ import docking.widgets.fieldpanel.support.*;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.XReferenceUtils;
import ghidra.app.util.viewer.field.ListingColors.XrefColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.*;
import ghidra.program.model.address.Address;
@ -77,10 +77,6 @@ public class XRefFieldFactory extends FieldFactory {
private PropertyEditor namespaceOptionsEditor = new NamespacePropertyEditor();
protected Color offcutColor;
protected Color readColor;
protected Color writeColor;
protected Color otherColor;
protected String delim = DELIMITER;
protected boolean displayBlockName;
protected boolean groupByFunction;
@ -143,15 +139,6 @@ public class XRefFieldFactory extends FieldFactory {
fieldOptions.registerOption(GROUP_BY_FUNCTION_KEY, false, hl,
"True signals to group all xrefs by the containing calling function.");
offcutColor = displayOptions.getColor(OptionsGui.XREF_OFFCUT.getColorOptionName(),
OptionsGui.XREF_OFFCUT.getDefaultColor());
readColor = displayOptions.getColor(OptionsGui.XREF_READ.getColorOptionName(),
OptionsGui.XREF_READ.getDefaultColor());
writeColor = displayOptions.getColor(OptionsGui.XREF_WRITE.getColorOptionName(),
OptionsGui.XREF_WRITE.getDefaultColor());
otherColor = displayOptions.getColor(OptionsGui.XREF_OTHER.getColorOptionName(),
OptionsGui.XREF_OTHER.getDefaultColor());
typeComparator = (r1, r2) -> {
if (r1.getReferenceType().toString().equals(r2.getReferenceType().toString())) {
return r1.compareTo(r2);
@ -183,13 +170,11 @@ public class XRefFieldFactory extends FieldFactory {
namespaceOptionsEditor);
CustomOption customOption = fieldOptions.getCustomOption(NAMESPACE_OPTIONS_KEY, null);
fieldOptions.getOptions(NAMESPACE_OPTIONS_KEY)
.setOptionsHelpLocation(
new HelpLocation("CodeBrowserPlugin", "XREFs_Field"));
.setOptionsHelpLocation(new HelpLocation("CodeBrowserPlugin", "XREFs_Field"));
if (!(customOption instanceof NamespaceWrappedOption)) {
throw new AssertException(
"Someone set an option for " + NAMESPACE_OPTIONS_KEY +
" that is not the expected " +
"ghidra.app.util.viewer.field.NamespaceWrappedOption type.");
throw new AssertException("Someone set an option for " + NAMESPACE_OPTIONS_KEY +
" that is not the expected " +
"ghidra.app.util.viewer.field.NamespaceWrappedOption type.");
}
NamespaceWrappedOption namespaceOption = (NamespaceWrappedOption) customOption;
@ -199,33 +184,6 @@ public class XRefFieldFactory extends FieldFactory {
localPrefixText = namespaceOption.getLocalPrefixText();
}
@Override
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
super.displayOptionsChanged(options, optionName, oldValue, newValue);
if (optionName.equals(OptionsGui.XREF_OFFCUT.getColorOptionName())) {
offcutColor = (Color) newValue;
model.update();
}
else if (optionName.equals(OptionsGui.XREF.getColorOptionName())) {
color = (Color) newValue;
model.update();
}
else if (optionName.equals(OptionsGui.XREF_READ.getColorOptionName())) {
readColor = (Color) newValue;
model.update();
}
else if (optionName.equals(OptionsGui.XREF_WRITE.getColorOptionName())) {
writeColor = (Color) newValue;
model.update();
}
else if (optionName.equals(OptionsGui.XREF_OTHER.getColorOptionName())) {
otherColor = (Color) newValue;
model.update();
}
}
@Override
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
@ -268,11 +226,6 @@ public class XRefFieldFactory extends FieldFactory {
maxXRefs = n;
}
@Override
public Color getDefaultColor() {
return OptionsGui.XREF.getDefaultColor();
}
@Override
public ListingField getField(ProxyObj<?> proxy, int varWidth) {
Object obj = proxy.getObject();
@ -330,8 +283,8 @@ public class XRefFieldFactory extends FieldFactory {
*/
private ListingField getFieldByFunction(ProxyObj<?> proxy, int varWidth,
List<Reference> xrefs, List<Reference> offcuts) {
private ListingField getFieldByFunction(ProxyObj<?> proxy, int varWidth, List<Reference> xrefs,
List<Reference> offcuts) {
int totalXrefs = xrefs.size() + offcuts.size();
if (totalXrefs == 0) {
@ -372,9 +325,8 @@ public class XRefFieldFactory extends FieldFactory {
HighlightFactory hlFactory =
new FieldHighlightFactory(hlProvider, getClass(), proxy.getObject());
Function currentFunction = functionManager.getFunctionContaining(cu.getMinAddress());
List<TextField> functionRows =
createXrefRowsByFunction(program, currentFunction, xrefsByFunction, isOffcut, varWidth,
hlFactory);
List<TextField> functionRows = createXrefRowsByFunction(program, currentFunction,
xrefsByFunction, isOffcut, varWidth, hlFactory);
//
// TODO maxXRefs makes sense when simply displaying xrefs. What does max mean when
@ -398,9 +350,8 @@ public class XRefFieldFactory extends FieldFactory {
// Our screen rows are what we are building to display; a data row we are here
// defining to be a single xref. This is a somewhat arbitrary decision.
int dataRow = totalXrefs - noFunction.size();
TextField noFunctionXrefsField =
createWrappingXrefRow(program, dataRow, noFunction, currentFunction, isOffcut,
availableLines, hlFactory);
TextField noFunctionXrefsField = createWrappingXrefRow(program, dataRow, noFunction,
currentFunction, isOffcut, availableLines, hlFactory);
List<TextField> allFields = new ArrayList<>();
allFields.addAll(functionRows);
@ -412,7 +363,8 @@ public class XRefFieldFactory extends FieldFactory {
if (tooMany) {
// add the [more] element
int lastRow = allFields.size() - 1;
AttributedString as = new AttributedString(MORE_XREFS_STRING, color, metrics);
AttributedString as =
new AttributedString(MORE_XREFS_STRING, XrefColors.DEFAULT, metrics);
TextFieldElement moreElement = new TextFieldElement(as, lastRow, 0);
ClippingTextField ctf = new ClippingTextField(newStartX, width, moreElement, hlFactory);
allFields.add(ctf);
@ -425,8 +377,7 @@ public class XRefFieldFactory extends FieldFactory {
private List<TextField> createXrefRowsByFunction(Program program, Function currentFunction,
TreeMap<Function, List<Reference>> xrefsByFunction, Predicate<Reference> isOffcut,
int varWidth,
HighlightFactory hlFactory) {
int varWidth, HighlightFactory hlFactory) {
FontMetrics metrics = getMetrics();
AttributedString delimiter = new AttributedString(delim, Colors.FOREGROUND, metrics);
@ -449,12 +400,10 @@ public class XRefFieldFactory extends FieldFactory {
sizeText = "[" + refs.size() + "]: ";
}
String text = functionName + sizeText;
AttributedString nameString =
new AttributedString(text, color, metrics);
AttributedString nameString = new AttributedString(text, XrefColors.DEFAULT, metrics);
List<XrefFieldElement> rowElements = new ArrayList<>();
Reference firstRef = refs.get(0);
XrefAttributedString xrefString =
new XrefAttributedString(firstRef, nameString);
XrefAttributedString xrefString = new XrefAttributedString(firstRef, nameString);
rowElements.add(new XrefFieldElement(xrefString, row, 0));
//
@ -466,9 +415,8 @@ public class XRefFieldFactory extends FieldFactory {
boolean isLast = i == n - 1;
Reference ref = refs.get(i);
String prefix = getMergedPrefix(program, ref, currentFunction, fromFunction);
XrefFieldElement element =
createFunctionElement(program, prefix, ref, row, isLast ? null : delimiter,
isOffcut.test(ref));
XrefFieldElement element = createFunctionElement(program, prefix, ref, row,
isLast ? null : delimiter, isOffcut.test(ref));
rowElements.add(element);
}
@ -585,8 +533,7 @@ public class XRefFieldFactory extends FieldFactory {
int n = list.size();
HighlightFactory hlFactory =
new FieldHighlightFactory(hlProvider, getClass(), proxy.getObject());
TextField field =
new FlowLayoutTextField(list, startX + varWidth, width, n, hlFactory);
TextField field = new FlowLayoutTextField(list, startX + varWidth, width, n, hlFactory);
return new XrefListingField(this, proxy, field);
}
@ -596,7 +543,8 @@ public class XRefFieldFactory extends FieldFactory {
if (showEllipses) {
// add the 'more' string
int lastRow = list.size() - 1;
AttributedString as = new AttributedString(MORE_XREFS_STRING, color, getMetrics());
AttributedString as =
new AttributedString(MORE_XREFS_STRING, XrefColors.DEFAULT, getMetrics());
fieldElements.add(new TextFieldElement(as, lastRow, 0));
}
return fieldElements;
@ -607,14 +555,13 @@ public class XRefFieldFactory extends FieldFactory {
FontMetrics metrics = getMetrics();
String addressString = ref.getFromAddress().toString(prefix);
Color refColor = isOffcut ? offcutColor : color;
Color refColor = isOffcut ? XrefColors.OFFCUT : XrefColors.DEFAULT;
AttributedString addressPart = new AttributedString(addressString, refColor, metrics);
if (displayRefType) {
addressPart = createRefTypeAttributedString(ref, addressPart);
}
XrefAttributedString xrefString =
new XrefAttributedString(ref, addressPart, delimiter);
XrefAttributedString xrefString = new XrefAttributedString(ref, addressPart, delimiter);
if (delimiter == null) {
xrefString.hideDelimiter();
}
@ -627,14 +574,13 @@ public class XRefFieldFactory extends FieldFactory {
FontMetrics metrics = getMetrics();
String addressString = ref.getFromAddress().toString(prefix);
Color refColor = isOffcut ? offcutColor : color;
Color refColor = isOffcut ? XrefColors.OFFCUT : XrefColors.DEFAULT;
AttributedString as = new AttributedString(addressString, refColor, metrics);
if (displayRefType) {
as = createRefTypeAttributedString(ref, as);
}
XrefAttributedString xrefString =
new XrefAttributedString(ref, as, delimiter);
XrefAttributedString xrefString = new XrefAttributedString(ref, as, delimiter);
return new XrefFieldElement(xrefString, row, 0);
}
@ -642,23 +588,23 @@ public class XRefFieldFactory extends FieldFactory {
AttributedString referenceString) {
AttributedString fullReferenceString = referenceString;
if (reference.getReferenceType().isRead() && reference.getReferenceType().isWrite()) {
AttributedString typeString = new AttributedString("(R", readColor, getMetrics());
AttributedString typeString = new AttributedString("(R", XrefColors.READ, getMetrics());
fullReferenceString = new CompositeAttributedString(
new AttributedString[] { fullReferenceString, typeString });
typeString = new AttributedString("W)", writeColor, getMetrics());
typeString = new AttributedString("W)", XrefColors.WRITE, getMetrics());
return new CompositeAttributedString(
new AttributedString[] { fullReferenceString, typeString });
}
Color displayColor = color;
Color displayColor = XrefColors.DEFAULT;
if (reference.getReferenceType().isRead() || reference.getReferenceType().isIndirect()) {
displayColor = readColor;
displayColor = XrefColors.READ;
}
else if (reference.getReferenceType().isWrite()) {
displayColor = writeColor;
displayColor = XrefColors.WRITE;
}
else if (reference.getReferenceType().isData()) {
displayColor = otherColor;
displayColor = XrefColors.OTHER;
}
AttributedString typeString =
@ -823,8 +769,7 @@ public class XRefFieldFactory extends FieldFactory {
}
private XRefFieldLocation getXRefLocation(XrefFieldElement xrefElement, CodeUnit cu,
int[] cpath,
RowColLocation loc, int row) {
int[] cpath, RowColLocation loc, int row) {
Reference xref = xrefElement.getXref();
Address refAddr = xref.getFromAddress();
return new XRefFieldLocation(cu.getProgram(), cu.getMinAddress(), cpath, refAddr, row,
@ -912,9 +857,8 @@ public class XRefFieldFactory extends FieldFactory {
// resizing field to a particular size, resulted in layout of references to be strange
char[] charSpaces = new char[length];
Arrays.fill(charSpaces, ' ');
AttributedString spaces =
new AttributedString(new String(charSpaces), source.getColor(0),
source.getFontMetrics(0));
AttributedString spaces = new AttributedString(new String(charSpaces),
source.getColor(0), source.getFontMetrics(0));
attributedStrings[attributedStrings.length - 1] = spaces;
}

View file

@ -22,6 +22,7 @@ import docking.widgets.fieldpanel.field.*;
import docking.widgets.fieldpanel.support.FieldLocation;
import ghidra.app.util.HighlightProvider;
import ghidra.app.util.XReferenceUtils;
import ghidra.app.util.viewer.field.ListingColors.XrefColors;
import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.proxy.ProxyObj;
import ghidra.framework.options.Options;
@ -52,9 +53,13 @@ public class XRefHeaderFieldFactory extends XRefFieldFactory {
public XRefHeaderFieldFactory(FieldFormatModel model, HighlightProvider hlProvider,
Options displayOptions, ToolOptions fieldOptions) {
super(XREF_FIELD_NAME, model, hlProvider, displayOptions, fieldOptions);
}
@Override
protected void initDisplayOptions(Options displayOptions) {
colorOptionName = "XRef Color";
styleOptionName = "XRef Style";
initDisplayOptions();
super.initDisplayOptions(displayOptions);
}
@Override
@ -68,7 +73,7 @@ public class XRefHeaderFieldFactory extends XRefFieldFactory {
if (headString == null || headString.length() == 0) {
return null;
}
AttributedString as = new AttributedString(headString, color, getMetrics());
AttributedString as = new AttributedString(headString, XrefColors.DEFAULT, getMetrics());
FieldElement field = new TextFieldElement(as, 0, 0);
return ListingTextField.createSingleLineTextField(this, proxy, field, startX + varWidth,
width, hlProvider);

View file

@ -430,19 +430,32 @@ public class FieldFormatModel {
}
/**
* Notifies that the options have changed.
* Notifies that the field display options have changed.
* @param options the Options object that changed.
* @param optionName the name of the property that changed.
* @param oldValue the old value of the property.
* @param newValue the new value of the property.
*/
public void optionsChanged(Options options, String optionName, Object oldValue,
public void displayOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
for (Row row : rows) {
row.optionsChanged(options, optionName, oldValue, newValue);
row.displayOptionsChanged(options, optionName, oldValue, newValue);
}
}
/**
* Notifies that the field options have changed.
* @param options the Options object that changed.
* @param optionName the name of the property that changed.
* @param oldValue the old value of the property.
* @param newValue the new value of the property.
*/
public void fieldOptionsChanged(Options options, String optionName, Object oldValue,
Object newValue) {
for (Row row : rows) {
row.fieldOptionsChanged(options, optionName, oldValue, newValue);
}
}
//==================================================================================================
//Inner Classes
//==================================================================================================
@ -465,9 +478,17 @@ class Row {
layoutFields();
}
public void optionsChanged(Options options, String name, Object oldValue, Object newValue) {
public void displayOptionsChanged(Options options, String name, Object oldValue,
Object newValue) {
for (FieldFactory factory : fields) {
factory.optionsChanged(options, name, oldValue, newValue);
factory.displayOptionsChanged(options, name, oldValue, newValue);
}
}
public void fieldOptionsChanged(Options options, String name, Object oldValue,
Object newValue) {
for (FieldFactory factory : fields) {
factory.fieldOptionsChanged(options, name, oldValue, newValue);
}
}

View file

@ -107,9 +107,7 @@ public class FormatManager implements OptionsChangeListener {
}
public FormatManager createClone() {
ToolOptions newDisplayOptions = displayOptions.copy();
ToolOptions newFieldOptions = fieldOptions.copy();
FormatManager newManager = new FormatManager(newDisplayOptions, newFieldOptions);
FormatManager newManager = new FormatManager(displayOptions, fieldOptions);
SaveState saveState = new SaveState();
saveState(saveState);
newManager.readState(saveState);
@ -848,10 +846,17 @@ public class FormatManager implements OptionsChangeListener {
@Override
public void optionsChanged(ToolOptions options, String name, Object oldValue, Object newValue) {
for (int i = 0; i < NUM_MODELS; i++) {
models[i].optionsChanged(options, name, oldValue, newValue);
if (options == displayOptions) {
for (int i = 0; i < NUM_MODELS; i++) {
models[i].displayOptionsChanged(options, name, oldValue, newValue);
}
}
else if (options == fieldOptions) {
for (int i = 0; i < NUM_MODELS; i++) {
models[i].fieldOptionsChanged(options, name, oldValue, newValue);
}
getArrayDisplayOptions(options);
}
getArrayDisplayOptions(options);
modelChanged(null);
}

View file

@ -35,172 +35,81 @@ import docking.widgets.fieldpanel.listener.LayoutModelListener;
import docking.widgets.fieldpanel.support.*;
import docking.widgets.indexedscrollpane.IndexedScrollPane;
import docking.widgets.label.GDLabel;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette;
import generic.theme.GThemeDefaults.Colors.Tables;
import ghidra.GhidraOptions;
import ghidra.app.util.viewer.field.ListingColors;
import ghidra.app.util.viewer.field.ListingColors.*;
import ghidra.util.SystemUtilities;
/**
* Class for displaying and manipulating field colors and fonts.
*/
public class OptionsGui extends JPanel {
private static final long serialVersionUID = 1L;
private static final Highlight[] NO_HIGHLIGHTS = new Highlight[0];
private static final HighlightFactory hlFactory =
(field, text, cursorTextOffset) -> NO_HIGHLIGHTS;
public static final ScreenElement BACKGROUND =
new ScreenElement("Background", new GColor("color.bg.listing"));
public static final ScreenElement COMMENT_AUTO =
new ScreenElement("Comment, Automatic", new GColor("color.fg.listing.comment.auto"));
public static final ScreenElement ADDRESS =
new ScreenElement("Address", new GColor("color.fg.listing.address"));
public static final ScreenElement BAD_REF_ADDR =
new ScreenElement("Bad Reference Address", new GColor("color.fg.listing.ref.bad"));
public static final ScreenElement BYTES =
new ScreenElement("Bytes", new GColor("color.fg.listing.bytes"));
public static final ScreenElement CONSTANT =
new ScreenElement("Constant", new GColor("color.fg.listing.constant"));
public static final ScreenElement LABELS_UNREFD = new ScreenElement("Labels, Unreferenced",
new GColor("color.fg.listing.label.unreferenced"));
public static final ScreenElement ENTRY_POINT =
new ScreenElement("Entry Point", new GColor("color.fg.listing.entrypoint"));
public static final ScreenElement COMMENT_EOL = new ScreenElement("Comment, EOL", "EOL Comment",
new GColor("color.fg.listing.comment.auto"));
public static final ScreenElement EXT_REF_RESOLVED = new ScreenElement(
"External Reference, Resolved", new GColor("color.fg.listing.ref.ext.resolved"));
public static final ScreenElement FIELD_NAME =
new ScreenElement("Field Name", new GColor("color.fg.listing.fieldname"));
public static final ScreenElement FUN_CALL_FIXUP =
new ScreenElement("Function Call-Fixup", new GColor("color.fg.listing.function.callfixup"));
public static final ScreenElement FUN_NAME =
new ScreenElement("Function Name", new GColor("color.fg.listing.function.name"));
public static final ScreenElement FUN_PARAMS =
new ScreenElement("Function Parameters", new GColor("color.fg.listing.function.param"));
public static final ScreenElement FUN_TAG =
new ScreenElement("Function Tag", new GColor("color.fg.listing.function.tag"));
public static final ScreenElement FUN_AUTO_PARAMS = new ScreenElement(
"Function Auto-Parameters", new GColor("color.fg.listing.function.param.auto"));
public static final ScreenElement FUN_RET_TYPE = new ScreenElement("Function Return Type",
new GColor("color.fg.listing.function.return.type"));
public static final ScreenElement COMMENT_REPEATABLE =
new ScreenElement("Comment, Repeatable", new GColor("color.fg.listing.comment.repeatable"));
public static final ScreenElement COMMENT_REF_REPEAT = new ScreenElement(
"Comment, Referenced Repeatable", new GColor("color.fg.listing.comment.ref.repeatable"));
public static final ScreenElement LABELS_LOCAL =
new ScreenElement("Labels, Local", new GColor("color.fg.listing.label.local"));
public static final ScreenElement MNEMONIC_OVERRIDE =
new ScreenElement("Mnemonic, Override", new GColor("color.fg.listing.mnemonic.override"));
public static final ScreenElement MNEMONIC =
new ScreenElement("Mnemonic", new GColor("color.fg.listing.mnemonic"));
public static final ScreenElement UNIMPL = new ScreenElement("Unimplemented Mnemonic",
new GColor("color.fg.listing.mnemonic.unimplemented"));
public static final ScreenElement FLOW_ARROW_NON_ACTIVE = new ScreenElement(
"Flow Arrow, Not Active", new GColor("color.fg.listing.flow.arrow.inactive"));
public static final ScreenElement FLOW_ARROW_ACTIVE =
new ScreenElement("Flow Arrow, Active", new GColor("color.fg.listing.flow.arrow.active"));
public static final ScreenElement FLOW_ARROW_SELECTED = new ScreenElement(
"Flow Arrow, Selected", new GColor("color.fg.listing.flow.arrow.selected"));
public static final ScreenElement LABELS_NON_PRIMARY =
new ScreenElement("Labels, Non-primary", new GColor("color.fg.listing.label.non.primary"));
public static final ScreenElement COMMENT_PLATE = new ScreenElement("Comment, Plate",
"Plate Comment", new GColor("color.fg.listing.comment.plate"));
public static final ScreenElement COMMENT_POST = new ScreenElement("Comment, Post",
"Post-Comment", new GColor("color.fg.listing.comment.post"));
public static final ScreenElement COMMENT_PRE = new ScreenElement("Comment, Pre", "Pre-Comment",
new GColor("color.fg.listing.comment.pre"));
public static final ScreenElement LABELS_PRIMARY =
new ScreenElement("Labels, Primary", new GColor("color.fg.listing.label.primary"));
public static final ScreenElement SEPARATOR =
new ScreenElement("Separator", new GColor("color.fg.listing.separator"));
public static final ScreenElement VARIABLE =
new ScreenElement("Variable", new GColor("color.fg.listing.variable"));
public static final ScreenElement PARAMETER_CUSTOM = new ScreenElement(
"Parameter, Custom Storage", new GColor("color.fg.listing.function.param.custom"));
public static final ScreenElement PARAMETER_DYNAMIC = new ScreenElement(
"Parameter, Dynamic Storage", new GColor("color.fg.listing.function.param.dynamic"));
public static final ScreenElement VERSION_TRAK =
new ScreenElement("Version Track", new GColor("color.fg.listing.version.tracking"));
public static final ScreenElement XREF =
new ScreenElement("XRef", new GColor("color.fg.listing.xref"));
public static final ScreenElement XREF_OFFCUT =
new ScreenElement("XRef, Offcut", new GColor("color.fg.listing.xref.offcut"));
public static final ScreenElement XREF_READ =
new ScreenElement("XRef Read", new GColor("color.fg.listing.xref.read"));
public static final ScreenElement XREF_WRITE =
new ScreenElement("XRef Write", new GColor("color.fg.listing.xref.write"));
public static final ScreenElement XREF_OTHER =
new ScreenElement("XRef Other", new GColor("color.fg.listing.xref.other"));
public static final ScreenElement REGISTERS =
new ScreenElement("Registers", new GColor("color.fg.listing.register"));
public static final ScreenElement UNDERLINE =
new ScreenElement("Underline", new GColor("color.fg.listing.underline"));
public static final ScreenElement PCODE_LINE_LABEL =
new ScreenElement("P-code Line Label", new GColor("color.fg.listing.pcode.label"));
public static final ScreenElement PCODE_ADDR_SPACE =
new ScreenElement("P-code Address Space", new GColor("color.fg.listing.pcode.space"));
public static final ScreenElement PCODE_RAW_VARNODE =
new ScreenElement("P-code Raw Varnode", new GColor("color.fg.listing.pcode.varnode"));
public static final ScreenElement PCODE_USEROP =
new ScreenElement("P-code Userop", new GColor("color.fg.listing.pcode.userop"));
// @formatter:off
public static final ScreenElement BACKGROUND = new ScreenElement("Background", ListingColors.BACKGROUND);
public static final ScreenElement COMMENT_AUTO = new ScreenElement("Comment, Automatic", CommentColors.AUTO);
public static final ScreenElement ADDRESS = new ScreenElement("Address", ListingColors.ADDRESS);
public static final ScreenElement BAD_REF_ADDR = new ScreenElement("Bad Reference Address", ListingColors.REF_BAD);
public static final ScreenElement BYTES = new ScreenElement("Bytes", ListingColors.BYTES);
public static final ScreenElement CONSTANT = new ScreenElement("Constant", ListingColors.CONSTANT);
public static final ScreenElement LABELS_UNREFD = new ScreenElement("Labels, Unreferenced", LabelColors.UNREFERENCED);
public static final ScreenElement ENTRY_POINT = new ScreenElement("Entry Point", ListingColors.EXT_ENTRY_POINT);
public static final ScreenElement COMMENT_EOL = new ScreenElement("Comment, EOL", "EOL Comment", CommentColors.EOL);
public static final ScreenElement EXT_REF_RESOLVED = new ScreenElement("External Reference, Resolved", ListingColors.EXT_REF_RESOLVED);
public static final ScreenElement FIELD_NAME = new ScreenElement("Field Name", ListingColors.FIELD_NAME);
public static final ScreenElement FUN_CALL_FIXUP = new ScreenElement("Function Call-Fixup", FunctionColors.CALL_FIXUP);
public static final ScreenElement FUN_NAME = new ScreenElement("Function Name", FunctionColors.NAME);
public static final ScreenElement FUN_PARAMS = new ScreenElement("Function Parameters", FunctionColors.PARAM);
public static final ScreenElement FUN_TAG = new ScreenElement("Function Tag", FunctionColors.TAG);
public static final ScreenElement FUN_AUTO_PARAMS = new ScreenElement("Function Auto-Parameters", FunctionColors.PARAM_AUTO);
public static final ScreenElement FUN_RET_TYPE = new ScreenElement("Function Return Type", FunctionColors.RETURN_TYPE);
public static final ScreenElement COMMENT_REPEATABLE = new ScreenElement("Comment, Repeatable", CommentColors.REPEATABLE);
public static final ScreenElement COMMENT_REF_REPEAT = new ScreenElement("Comment, Referenced Repeatable", CommentColors.REF_REPEATABLE);
public static final ScreenElement LABELS_LOCAL = new ScreenElement("Labels, Local", LabelColors.LOCAL);
public static final ScreenElement MNEMONIC = new ScreenElement("Mnemonic", MnemonicColors.NORMAL);
public static final ScreenElement MNEMONIC_OVERRIDE = new ScreenElement("Mnemonic, Override", MnemonicColors.OVERRIDE);
public static final ScreenElement MNEMONIC_UNIMPL = new ScreenElement("Unimplemented Mnemonic", MnemonicColors.UNIMPLEMENTED);
public static final ScreenElement FLOW_ARROW_ACTIVE = new ScreenElement("Flow Arrow, Active", FlowArrowColors.ACTIVE);
public static final ScreenElement FLOW_ARROW_NON_ACTIVE = new ScreenElement("Flow Arrow, Not Active", FlowArrowColors.INACTIVE);
public static final ScreenElement FLOW_ARROW_SELECTED = new ScreenElement("Flow Arrow, Selected", FlowArrowColors.SELECTED);
public static final ScreenElement LABELS_PRIMARY = new ScreenElement("Labels, Primary", LabelColors.PRIMARY);
public static final ScreenElement LABELS_NON_PRIMARY = new ScreenElement("Labels, Non-primary", LabelColors.NON_PRIMARY);
public static final ScreenElement COMMENT_PLATE = new ScreenElement("Comment, Plate", "Plate Comment", CommentColors.PLATE);
public static final ScreenElement COMMENT_POST = new ScreenElement("Comment, Post", "Post-Comment", CommentColors.POST);
public static final ScreenElement COMMENT_PRE = new ScreenElement("Comment, Pre", "Pre-Comment", CommentColors.PRE);
public static final ScreenElement SEPARATOR = new ScreenElement("Separator", ListingColors.SEPARATOR);
public static final ScreenElement VARIABLE = new ScreenElement("Variable", FunctionColors.VARIABLE);
public static final ScreenElement PARAMETER_CUSTOM = new ScreenElement("Parameter, Custom Storage", FunctionColors.PARAM_CUSTOM);
public static final ScreenElement PARAMETER_DYNAMIC = new ScreenElement("Parameter, Dynamic Storage", FunctionColors.PARAM_DYNAMIC);
public static final ScreenElement XREF = new ScreenElement("XRef", XrefColors.DEFAULT);
public static final ScreenElement XREF_OFFCUT = new ScreenElement("XRef, Offcut", XrefColors.OFFCUT);
public static final ScreenElement XREF_READ = new ScreenElement("XRef Read", XrefColors.READ);
public static final ScreenElement XREF_WRITE = new ScreenElement("XRef Write", XrefColors.WRITE);
public static final ScreenElement XREF_OTHER = new ScreenElement("XRef Other", XrefColors.OTHER);
public static final ScreenElement REGISTERS = new ScreenElement("Registers", ListingColors.REGISTER);
public static final ScreenElement UNDERLINE = new ScreenElement("Underline", ListingColors.UNDERLINE);
public static final ScreenElement PCODE_LINE_LABEL = new ScreenElement("P-code Line Label", PcodeColors.LABEL);
public static final ScreenElement PCODE_ADDR_SPACE = new ScreenElement("P-code Address Space", PcodeColors.ADDRESS_SPACE);
public static final ScreenElement PCODE_RAW_VARNODE = new ScreenElement("P-code Raw Varnode", PcodeColors.VARNODE);
public static final ScreenElement PCODE_USEROP = new ScreenElement("P-code Userop", PcodeColors.USEROP);
//@formatter:on
static ScreenElement[] elements = { ADDRESS, BACKGROUND, BAD_REF_ADDR, BYTES, COMMENT_AUTO,
COMMENT_EOL, COMMENT_PLATE, COMMENT_POST, COMMENT_PRE, COMMENT_REPEATABLE,
COMMENT_REF_REPEAT, CONSTANT, ENTRY_POINT, EXT_REF_RESOLVED, FIELD_NAME, FLOW_ARROW_ACTIVE,
FLOW_ARROW_NON_ACTIVE, FLOW_ARROW_SELECTED, FUN_CALL_FIXUP, FUN_NAME, FUN_PARAMS,
FUN_AUTO_PARAMS, FUN_RET_TYPE,
FUN_TAG, LABELS_LOCAL, LABELS_NON_PRIMARY, LABELS_PRIMARY, LABELS_UNREFD, MNEMONIC,
MNEMONIC_OVERRIDE, PARAMETER_CUSTOM, PARAMETER_DYNAMIC, PCODE_LINE_LABEL, PCODE_ADDR_SPACE,
PCODE_RAW_VARNODE, PCODE_USEROP, REGISTERS, SEPARATOR, UNDERLINE, UNIMPL, VARIABLE,
VERSION_TRAK, XREF, XREF_OFFCUT, XREF_READ, XREF_WRITE, XREF_OTHER };
static ScreenElement[] elements =
{ ADDRESS, BACKGROUND, BAD_REF_ADDR, BYTES, COMMENT_AUTO, COMMENT_EOL, COMMENT_PLATE,
COMMENT_POST, COMMENT_PRE, COMMENT_REPEATABLE, COMMENT_REF_REPEAT, CONSTANT,
ENTRY_POINT, EXT_REF_RESOLVED, FIELD_NAME, FLOW_ARROW_ACTIVE, FLOW_ARROW_NON_ACTIVE,
FLOW_ARROW_SELECTED, FUN_CALL_FIXUP, FUN_NAME, FUN_PARAMS, FUN_AUTO_PARAMS,
FUN_RET_TYPE, FUN_TAG, LABELS_LOCAL, LABELS_NON_PRIMARY, LABELS_PRIMARY, LABELS_UNREFD,
MNEMONIC, MNEMONIC_OVERRIDE, PARAMETER_CUSTOM, PARAMETER_DYNAMIC, PCODE_LINE_LABEL,
PCODE_ADDR_SPACE, PCODE_RAW_VARNODE, PCODE_USEROP, REGISTERS, SEPARATOR, UNDERLINE,
MNEMONIC_UNIMPL, VARIABLE, XREF, XREF_OFFCUT, XREF_READ, XREF_WRITE, XREF_OTHER };
private Map<Integer, FontMetrics> metricsMap = new HashMap<>();

View file

@ -54,7 +54,7 @@ public class ScreenElement {
return style;
}
public Color getDefaultColor() {
public GColor getDefaultColor() {
return defaultColor;
}

View file

@ -23,6 +23,7 @@ import javax.swing.table.TableModel;
import docking.widgets.table.GTableCellRenderer;
import generic.theme.GColor;
import ghidra.app.util.viewer.field.ListingColors;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.Memory;
@ -31,10 +32,6 @@ import ghidra.program.model.symbol.Symbol;
public class GhidraTableCellRenderer extends GTableCellRenderer {
// Defaults as defined by OptionsGui class - would be nice to use the tool options
private static final Color BAD_REF_ADDR_COLOR = new GColor("color.fg.listing.ref.bad");
private static final Color EXT_REF_RESOLVED_COLOR =
new GColor("color.fg.listing.ref.ext.resolved");
public Color SELECTED_CELL_COLOR = new GColor("color.bg.table.selected.ghidratable");
public Color BAD_EQUATE_COLOR = new GColor("color.fg.table.ghidratable.equate.bad");
public Color EQUATE_COLOR = new GColor("color.fg.table.ghidratable.equate");
@ -67,14 +64,14 @@ public class GhidraTableCellRenderer extends GTableCellRenderer {
protected void setForegroundColor(JTable table, TableModel model, Object value) {
if (isExternalAdress(value)) {
if (isResolvedExternalAddress(model, (Address) value)) {
setForeground(EXT_REF_RESOLVED_COLOR);
setForeground(ListingColors.EXT_REF_RESOLVED);
}
else {
setForeground(BAD_REF_ADDR_COLOR);
setForeground(ListingColors.EXT_REF_UNRESOLVED);
}
}
else if (isValueOutOfMemoryAddress(model, value)) {
setForeground(BAD_REF_ADDR_COLOR);
setForeground(ListingColors.REF_BAD);
}
else {
setForeground(table.getForeground());

View file

@ -351,27 +351,27 @@ public class CodeBrowserOptionsTest extends AbstractGhidraHeadedIntegrationTest
assertEquals("01", btf.getText());
assertEquals(3, btf.getNumCols(0));
FieldElement fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001104"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("05 06 07 08", btf.getText());
assertEquals(12, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 3);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 6);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 9);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001108"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("09", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
}
@Test
@ -393,39 +393,39 @@ public class CodeBrowserOptionsTest extends AbstractGhidraHeadedIntegrationTest
assertEquals("0102 0304", btf.getText());
assertEquals(10, btf.getNumCols(0));
FieldElement fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 2);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 5);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 7);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
cb.goToField(addr("0x1001104"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("0506 0708", btf.getText());
assertEquals(10, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 2);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 5);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 7);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001108"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("090a 0b0c", btf.getText());
assertEquals(10, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 2);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 5);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 7);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
}
@Test
@ -445,39 +445,39 @@ public class CodeBrowserOptionsTest extends AbstractGhidraHeadedIntegrationTest
assertEquals("01 02 03 04", btf.getText());
assertEquals(12, btf.getNumCols(0));
FieldElement fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 3);
assertEquals(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertEquals(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 6);
assertEquals(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertEquals(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 9);
assertEquals(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertEquals(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
cb.goToField(addr("0x1001104"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("05 06 07 08", btf.getText());
assertEquals(12, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 3);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 6);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 9);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001108"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("09 0a 0b 0c", btf.getText());
assertEquals(12, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 3);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 6);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
fe = btf.getFieldElement(0, 9);
assertColorsEqual(BytesFieldFactory.ALIGNMENT_BYTES_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES_ALIGNMENT, fe.getColor(0));
}
@Test
@ -498,69 +498,69 @@ public class CodeBrowserOptionsTest extends AbstractGhidraHeadedIntegrationTest
assertEquals("01", btf.getText());
assertEquals(3, btf.getNumCols(0));
FieldElement fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001201"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("02", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001202"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("03", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001203"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("04", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001204"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("05 06 07 08", btf.getText());
assertEquals(12, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 3);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 6);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
fe = btf.getFieldElement(0, 9);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001208"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("09", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x1001209"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("0a", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x100120a"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("0b", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
cb.goToField(addr("0x100120b"), "Bytes", 0, 0);
btf = (ListingTextField) cb.getCurrentField();
assertEquals("0c", btf.getText());
assertEquals(3, btf.getNumCols(0));
fe = btf.getFieldElement(0, 1);
assertColorsEqual(BytesFieldFactory.DEFAULT_COLOR, fe.getColor(0));
assertColorsEqual(ListingColors.BYTES, fe.getColor(0));
}
@SuppressWarnings("unchecked")

View file

@ -181,18 +181,20 @@ public class ToolOptions extends AbstractOptions {
private void writeWrappedOptions(boolean includeDefaultBindings, Element root) {
for (String optionName : valueMap.keySet()) {
Option option = valueMap.get(optionName);
if (includeDefaultBindings || !option.isDefault()) {
if (option instanceof ThemeColorOption || option instanceof ThemeFontOption) {
// theme values are saved by the theme, no need to save them to the options
continue;
}
if (includeDefaultBindings || !option.isDefault()) {
Object value = option.getCurrentValue();
if (isSupportedBySaveState(value)) {
// handled above
continue;
continue; // handled above
}
WrappedOption wrappedOption = wrapOption(option);
if (wrappedOption == null) {
// cannot write an option without a value to determine its type
continue;
continue; // cannot write an option without a value to determine its type
}
SaveState ss = new SaveState(WRAPPED_OPTION_NAME);