GP-1981 converting option colors to theme colors and font usages to

theme properties
This commit is contained in:
ghidragon 2022-09-29 17:50:58 -04:00
parent 79b95702ba
commit 45395d7575
110 changed files with 888 additions and 1151 deletions

View file

@ -63,6 +63,8 @@ color.debugger.plugin.resources.breakpoint.marker.disabled.ineffective = color.d
icon.debugger.object.populated = object-populated.png icon.debugger.object.populated = object-populated.png
icon.debugger.object.unpopulated = object-unpopulated.png icon.debugger.object.unpopulated = object-unpopulated.png
font.debugger.object.tree.renderer = Tahoma-plain-11
icon.debugger.display.graph = breakpoint-enable.png // TODO this icon was missing 'breakpoints.png' icon.debugger.display.graph = breakpoint-enable.png // TODO this icon was missing 'breakpoints.png'
icon.debugger.display.graph.filtered = icon.debugger.display.graph icon.debugger.display.graph.filtered = icon.debugger.display.graph
icon.debugger.display.xml = text-xml.png icon.debugger.display.xml = text-xml.png

View file

@ -23,21 +23,18 @@ import javax.swing.tree.TreePath;
import docking.widgets.tree.support.GTreeRenderer; import docking.widgets.tree.support.GTreeRenderer;
import generic.theme.GThemeDefaults.Colors.Tables; import generic.theme.GThemeDefaults.Colors.Tables;
import generic.theme.Gui;
import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider;
import ghidra.app.plugin.core.debug.gui.objects.ObjectContainer; import ghidra.app.plugin.core.debug.gui.objects.ObjectContainer;
import ghidra.dbg.target.TargetExecutionStateful; import ghidra.dbg.target.TargetExecutionStateful;
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetObject;
import ghidra.util.SystemUtilities;
// TODO: In the new scheme, I'm not sure this is applicable anymore. // TODO: In the new scheme, I'm not sure this is applicable anymore.
class ObjectTreeCellRenderer extends GTreeRenderer { class ObjectTreeCellRenderer extends GTreeRenderer {
private static final String FONT_ID = "font.debugger.object.tree.renderer";
private final DebuggerObjectsProvider provider; private final DebuggerObjectsProvider provider;
private Font defaultFont =
SystemUtilities.adjustForFontSizeOverride(new Font("Tahoma", Font.PLAIN, 11));
private Font unsubscribedFont =
SystemUtilities.adjustForFontSizeOverride(new Font("Tahoma", Font.ITALIC, 11));
public ObjectTreeCellRenderer(DebuggerObjectsProvider provider) { public ObjectTreeCellRenderer(DebuggerObjectsProvider provider) {
this.provider = provider; this.provider = provider;
@ -102,7 +99,11 @@ class ObjectTreeCellRenderer extends GTreeRenderer {
} }
} }
} }
component.setFont(container.isSubscribed() ? defaultFont : unsubscribedFont); Font font = Gui.getFont(FONT_ID);
if (container.isSubscribed()) {
font = font.deriveFont(Font.ITALIC);
}
component.setFont(font);
} }
return component; return component;
} }

View file

@ -122,7 +122,7 @@ public class HelloWorldComponentProvider extends ComponentProviderAdapter {
panel.setBorder(BorderFactory.createTitledBorder("Example of a Component")); panel.setBorder(BorderFactory.createTitledBorder("Example of a Component"));
activeButtonObj = new MyButton("Hello World"); activeButtonObj = new MyButton("Hello World");
Font f = activeButtonObj.getFont(); Font f = activeButtonObj.getFont();
activeButtonObj.setFont(new Font(f.getFontName(), Font.BOLD, 14)); activeButtonObj.setFont(f.deriveFont(Font.BOLD, 14));
panel.add(activeButtonObj); panel.add(activeButtonObj);
mainPanel.add(panel, BorderLayout.CENTER); mainPanel.add(panel, BorderLayout.CENTER);
} }

View file

@ -76,7 +76,8 @@ color.bg.listing.comparison.operand = chartreuse
color.bg.listing.comparison.code.units.diff = silver color.bg.listing.comparison.code.units.diff = silver
color.bg.listing.comparison.code.units.unmatched = skyblue color.bg.listing.comparison.code.units.unmatched = skyblue
font.listing.base = font.monospaced
font.listing.header = SansSerif-PLAIN-11
[Dark Defaults] [Dark Defaults]

View file

@ -1,7 +1,8 @@
[Defaults] [Defaults]
color.bg.plugin.programgraph.vertex.selection = color.graphdisplay.vertex.selected
color.bg.plugin.programgraph.edge.selection = color.graphdisplay.edge.selected
color.bg.plugin.programgraph.edge.call.callother.override = red color.bg.plugin.programgraph.edge.call.callother.override = red
color.bg.plugin.programgraph.edge.call.computed = cyan color.bg.plugin.programgraph.edge.call.computed = cyan
@ -50,7 +51,7 @@ color.bg.plugin.programgraph.vertex.entry.nexus = wheat
color.bg.plugin.programgraph.vertex.instruction = blue color.bg.plugin.programgraph.vertex.instruction = blue
color.bg.plugin.programgraph.vertex.stack = green color.bg.plugin.programgraph.vertex.stack = green
font.plugin.programgraph = font.graphdisplay.default
[Dark Defaults] [Dark Defaults]

View file

@ -158,8 +158,18 @@ color.bg.plugin.windowlocation.screens = orange
color.bg.plugin.windowlocation.window.selected = rgba(0, 255, 0, 200) color.bg.plugin.windowlocation.window.selected = rgba(0, 255, 0, 200)
color.fg.plugin.windowlocation.window.text = gray color.fg.plugin.windowlocation.window.text = gray
font.print = SansSerif-PLAIN-10
font.plugin.console = font.monospaced
font.plugin.service.text.editor = font.monospaced
font.plugin.scripts.text.editor = font.monospaced
font.plugin.assembly.dual.text.field = font.monospaced
font.plugin.instruction.table.renderer = courier-plain-14
font.plugin.entropy.label.knot = SansSerif-BOLD-12
font.plugin.instruction.info = font.monospaced[14]
font.plugin.tabs = SansSerif-PLAIN-11
font.plugin.tabs.list = SansSerif-BOLD-9
font.plugin.tips = Dialog-PLAIN-12
font.plugin.tips.label = font.plugin.tips[BOLD]
[Dark Defaults] [Dark Defaults]

View file

@ -15,15 +15,8 @@
*/ */
package ghidra.app.merge.tool; package ghidra.app.merge.tool;
import ghidra.app.context.ListingActionContext; import java.awt.Dimension;
import ghidra.app.context.ListingContextAction; import java.awt.Insets;
import ghidra.app.merge.listing.CodeUnitDetails;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.*;
import ghidra.program.util.ProgramLocation;
import ghidra.util.HelpLocation;
import java.awt.*;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
@ -33,6 +26,14 @@ import docking.DialogComponentProvider;
import docking.action.KeyBindingData; import docking.action.KeyBindingData;
import docking.action.MenuData; import docking.action.MenuData;
import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.FieldPanel;
import generic.theme.Gui;
import ghidra.app.context.ListingActionContext;
import ghidra.app.context.ListingContextAction;
import ghidra.app.merge.listing.CodeUnitDetails;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.*;
import ghidra.program.util.ProgramLocation;
import ghidra.util.HelpLocation;
public class ViewInstructionDetailsAction extends ListingContextAction { public class ViewInstructionDetailsAction extends ListingContextAction {
@ -47,8 +48,8 @@ public class ViewInstructionDetailsAction extends ListingContextAction {
setKeyBindingData(new KeyBindingData(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK | setKeyBindingData(new KeyBindingData(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK |
InputEvent.SHIFT_DOWN_MASK)); InputEvent.SHIFT_DOWN_MASK));
setEnabled(true); setEnabled(true);
setDescription("Display a dialog indicating details, such as references, for the " setDescription("Display a dialog indicating details, such as references, for the " +
+ "instruction at the current cursor location."); "instruction at the current cursor location.");
setHelpLocation(HELP_LOCATION); setHelpLocation(HELP_LOCATION);
} }
@ -87,13 +88,11 @@ public class ViewInstructionDetailsAction extends ListingContextAction {
} }
private JScrollPane createDetailsPane(String details) { private JScrollPane createDetailsPane(String details) {
Font font = new Font("Monospaced", Font.PLAIN, 12);
JTextArea textArea = new JTextArea(); JTextArea textArea = new JTextArea();
Gui.registerFont(textArea, "font.monospaced");
textArea.setLineWrap(false); textArea.setLineWrap(false);
textArea.setEditable(false); textArea.setEditable(false);
textArea.setMargin(new Insets(5, 5, 5, 5)); textArea.setMargin(new Insets(5, 5, 5, 5));
textArea.setFont(font);
textArea.setOpaque(true); textArea.setOpaque(true);
textArea.setCaretPosition(0); textArea.setCaretPosition(0);
textArea.setText(details); textArea.setText(details);
@ -102,8 +101,10 @@ public class ViewInstructionDetailsAction extends ListingContextAction {
JViewport vp = scrolledDetails.getViewport(); JViewport vp = scrolledDetails.getViewport();
vp.add(textArea); vp.add(textArea);
scrolledDetails.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrolledDetails
scrolledDetails.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrolledDetails
.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
return scrolledDetails; return scrolledDetails;
} }

View file

@ -75,7 +75,7 @@ class TreeChangePanel extends JPanel {
treeNameLabel = new GDLabel("Tree Name"); treeNameLabel = new GDLabel("Tree Name");
Font font = treeNameLabel.getFont(); Font font = treeNameLabel.getFont();
font = new Font(font.getName(), Font.BOLD, font.getSize()); font = font.deriveFont(Font.BOLD);
treeNameLabel.setFont(font); treeNameLabel.setFont(font);
nameLabel = new GDLabel("Name Changed"); nameLabel = new GDLabel("Name Changed");

View file

@ -94,7 +94,7 @@ public class ArchiveDialog extends DialogComponentProvider {
} }
}); });
Font font = archiveBrowse.getFont(); Font font = archiveBrowse.getFont();
archiveBrowse.setFont(new Font(font.getName(), Font.BOLD, font.getSize())); archiveBrowse.setFont(font.deriveFont(Font.BOLD));
archiveBrowse.setName("archiveBrowse"); archiveBrowse.setName("archiveBrowse");
// Layout the components. // Layout the components.
@ -269,7 +269,9 @@ public class ArchiveDialog extends DialogComponentProvider {
return true; return true;
} }
return file.getAbsolutePath().toLowerCase().endsWith( return file.getAbsolutePath()
.toLowerCase()
.endsWith(
ArchivePlugin.ARCHIVE_EXTENSION); ArchivePlugin.ARCHIVE_EXTENSION);
} }

View file

@ -114,7 +114,7 @@ public class RestoreDialog extends DialogComponentProvider {
} }
}); });
Font font = archiveBrowse.getFont(); Font font = archiveBrowse.getFont();
archiveBrowse.setFont(new Font(font.getName(), Font.BOLD, font.getSize())); archiveBrowse.setFont(font.deriveFont(Font.BOLD));
restoreLabel = new GDLabel(" Restore Directory "); restoreLabel = new GDLabel(" Restore Directory ");
restoreField = new JTextField(); restoreField = new JTextField();
@ -131,7 +131,7 @@ public class RestoreDialog extends DialogComponentProvider {
} }
}); });
font = restoreBrowse.getFont(); font = restoreBrowse.getFont();
restoreBrowse.setFont(new Font(font.getName(), Font.BOLD, font.getSize())); restoreBrowse.setFont(font.deriveFont(Font.BOLD));
projectNameLabel = new GDLabel(" Project Name "); projectNameLabel = new GDLabel(" Project Name ");
projectNameField = new JTextField(); projectNameField = new JTextField();

View file

@ -27,8 +27,7 @@ import docking.EmptyBorderToggleButton;
import docking.widgets.autocomplete.*; import docking.widgets.autocomplete.*;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import docking.widgets.textfield.TextFieldLinker; import docking.widgets.textfield.TextFieldLinker;
import generic.theme.GColor; import generic.theme.*;
import generic.theme.GIcon;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import ghidra.GhidraApplicationLayout; import ghidra.GhidraApplicationLayout;
import ghidra.GhidraLaunchable; import ghidra.GhidraLaunchable;
@ -62,7 +61,7 @@ import ghidra.util.NumericUtilities;
* Otherwise, the usual autocompletion behavior is applied automatically. * Otherwise, the usual autocompletion behavior is applied automatically.
*/ */
public class AssemblyDualTextField { public class AssemblyDualTextField {
private static final String FONT_ID = "font.plugin.assembly.dual.text.field";
private static Color FG_PREFERENCE_MOST = private static Color FG_PREFERENCE_MOST =
new GColor("color.fg.plugin.assembler.completion.most"); new GColor("color.fg.plugin.assembler.completion.most");
private static Color FG_PREFERENCE_MIDDLE = private static Color FG_PREFERENCE_MIDDLE =
@ -659,8 +658,7 @@ public class AssemblyDualTextField {
* @param field the field to configure * @param field the field to configure
*/ */
protected void configureField(JTextField field) { protected void configureField(JTextField field) {
Font mono = new Font(Font.MONOSPACED, Font.PLAIN, 12); // TODO: Font size from options Gui.registerFont(field, FONT_ID);
field.setFont(mono);
} }
/** /**

View file

@ -26,9 +26,10 @@ import javax.swing.text.Document;
import docking.*; import docking.*;
import docking.action.*; import docking.action.*;
import generic.theme.GIcon; import generic.theme.GIcon;
import generic.theme.Gui;
import ghidra.app.services.*; import ghidra.app.services.*;
import ghidra.framework.main.ConsoleTextPane; import ghidra.framework.main.ConsoleTextPane;
import ghidra.framework.options.OptionsChangeListener; import ghidra.framework.options.OptionType;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.ComponentProviderAdapter; import ghidra.framework.plugintool.ComponentProviderAdapter;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
@ -36,21 +37,21 @@ import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.symbol.SymbolIterator; import ghidra.program.model.symbol.SymbolIterator;
import ghidra.program.model.symbol.SymbolTable; import ghidra.program.model.symbol.SymbolTable;
import ghidra.util.*; import ghidra.util.HelpLocation;
import ghidra.util.Msg;
public class ConsoleComponentProvider extends ComponentProviderAdapter public class ConsoleComponentProvider extends ComponentProviderAdapter
implements ConsoleService, OptionsChangeListener { implements ConsoleService {
private static final String OLD_NAME = "ConsolePlugin"; private static final String OLD_NAME = "ConsolePlugin";
private static final String NAME = "Console"; private static final String NAME = "Console";
private static final Font DEFAULT_FONT = new Font("monospaced", Font.PLAIN, 12); private static final String DEFAULT_FONT_ID = "font.plugin.console";
private static final String FONT_OPTION_LABEL = "Font"; private static final String FONT_OPTION_LABEL = "Font";
private static final String FONT_DESCRIPTION = private static final String FONT_DESCRIPTION =
"This is the font that will be used in the Console. " + "This is the font that will be used in the Console. " +
"Double-click the font example to change it."; "Double-click the font example to change it.";
private Font font;
private ConsoleTextPane textPane; private ConsoleTextPane textPane;
private JScrollPane scroller; private JScrollPane scroller;
private JComponent component; private JComponent component;
@ -103,27 +104,16 @@ public class ConsoleComponentProvider extends ComponentProviderAdapter
private void createOptions() { private void createOptions() {
ToolOptions options = tool.getOptions("Console"); ToolOptions options = tool.getOptions("Console");
HelpLocation help = new HelpLocation(getOwner(), getOwner()); HelpLocation help = new HelpLocation(getOwner(), getOwner());
options.registerOption(FONT_OPTION_LABEL, DEFAULT_FONT, help, FONT_DESCRIPTION); options.registerOption(FONT_OPTION_LABEL, OptionType.FONT_TYPE, DEFAULT_FONT_ID, help,
FONT_DESCRIPTION);
options.setOptionsHelpLocation(help); options.setOptionsHelpLocation(help);
font = options.getFont(FONT_OPTION_LABEL, DEFAULT_FONT);
font = SystemUtilities.adjustForFontSizeOverride(font);
options.addOptionsChangeListener(this);
}
@Override
public void optionsChanged(ToolOptions options, String optionName, Object oldValue,
Object newValue) {
if (optionName.equals(FONT_OPTION_LABEL)) {
font = SystemUtilities.adjustForFontSizeOverride((Font) newValue);
textPane.setFont(font);
}
} }
private void build() { private void build() {
textPane = new ConsoleTextPane(tool); textPane = new ConsoleTextPane(tool);
textPane.setName("CONSOLE"); textPane.setName("CONSOLE");
textPane.setFont(font); Gui.registerFont(textPane, DEFAULT_FONT_ID);
textPane.setEditable(false); textPane.setEditable(false);
textPane.addMouseMotionListener(new MouseMotionAdapter() { textPane.addMouseMotionListener(new MouseMotionAdapter() {
@Override @Override

View file

@ -491,7 +491,7 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
OptionsGui.BACKGROUND.getDefaultColor()); OptionsGui.BACKGROUND.getDefaultColor());
// font // font
font = opt.getFont(ADDRESS_FONT_OPTION, FieldFactory.DEFAULT_FIELD_FONT); font = Gui.getFont(FieldFactory.BASE_LISTING_FONT_ID);
contentList.setForeground(addressForegroundColor); contentList.setForeground(addressForegroundColor);
contentList.setBackground(backgroundColor); contentList.setBackground(backgroundColor);
@ -580,7 +580,7 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec
contentList.setBackground(backgroundColor); contentList.setBackground(backgroundColor);
} }
else if (optionName.equals(ADDRESS_FONT_OPTION)) { else if (optionName.equals(ADDRESS_FONT_OPTION)) {
font = (Font) newValue; font = Gui.getFont(FieldFactory.BASE_LISTING_FONT_ID);
} }
} }

View file

@ -19,8 +19,6 @@ import java.awt.Dimension;
import java.awt.Font; import java.awt.Font;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.io.*; import java.io.*;
import java.util.Iterator;
import java.util.List;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
@ -36,7 +34,7 @@ import docking.options.editor.FontEditor;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooser;
import generic.theme.GIcon; import generic.theme.GIcon;
import ghidra.framework.options.SaveState; import generic.theme.Gui;
import ghidra.framework.plugintool.ComponentProviderAdapter; import ghidra.framework.plugintool.ComponentProviderAdapter;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -45,24 +43,9 @@ import resources.Icons;
public class TextEditorComponentProvider extends ComponentProviderAdapter { public class TextEditorComponentProvider extends ComponentProviderAdapter {
private static final String TITLE = "Text Editor"; private static final String TITLE = "Text Editor";
private static final String FONT_ID = "font.plugin.service.text.editor";
private static final int MAX_UNDO_REDO_SIZE = 50; private static final int MAX_UNDO_REDO_SIZE = 50;
static Font defaultFont = new Font("monospaced", Font.PLAIN, 12);
static void restoreState(SaveState saveState) {
String name = saveState.getString("DEFAULT_FONT_NAME", "Monospaced");
int style = saveState.getInt("DEFAULT_FONT_STYLE", Font.PLAIN);
int size = saveState.getInt("DEFAULT_FONT_SIZE", 12);
defaultFont = new Font(name, style, size);
}
static void saveState(SaveState saveState) {
saveState.putString("DEFAULT_FONT_NAME", defaultFont.getName());
saveState.putInt("DEFAULT_FONT_STYLE", defaultFont.getStyle());
saveState.putInt("DEFAULT_FONT_SIZE", defaultFont.getSize());
}
private TextEditorManagerPlugin plugin; private TextEditorManagerPlugin plugin;
private GhidraFileChooser chooser; private GhidraFileChooser chooser;
private File textFile; private File textFile;
@ -289,16 +272,9 @@ public class TextEditorComponentProvider extends ComponentProviderAdapter {
protected void doSelectFont() { protected void doSelectFont() {
FontEditor editor = new FontEditor(); FontEditor editor = new FontEditor();
editor.setValue(defaultFont); editor.setValue(Gui.getFont(FONT_ID));
editor.showDialog(); editor.showDialog();
defaultFont = (Font) editor.getValue(); Gui.setFont(FONT_ID, (Font) editor.getValue());
List<TextEditorComponentProvider> values = plugin.getEditors();
Iterator<TextEditorComponentProvider> iterator = values.iterator();
while (iterator.hasNext()) {
TextEditorComponentProvider editorComponent = iterator.next();
editorComponent.textarea.setFont(defaultFont);
}
} }
private void save() { private void save() {
@ -391,8 +367,7 @@ public class TextEditorComponentProvider extends ComponentProviderAdapter {
private KeyMasterTextArea(String text) { private KeyMasterTextArea(String text) {
super(text); super(text);
Gui.registerFont(this, FONT_ID);
setFont(defaultFont);
setName("EDITOR"); setName("EDITOR");
setWrapStyleWord(false); setWrapStyleWord(false);
Document document = getDocument(); Document document = getDocument();

View file

@ -25,6 +25,7 @@ import javax.swing.event.ChangeListener;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.widgets.button.GRadioButton; import docking.widgets.button.GRadioButton;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.Gui;
import ghidra.app.util.AddressInput; import ghidra.app.util.AddressInput;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
@ -162,8 +163,7 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene
addressLabel = new GDLabel("01001000"); addressLabel = new GDLabel("01001000");
Font font = addressLabel.getFont(); Font monoFont = Gui.getFont("font.monospaced");
Font monoFont = new Font("monospaced", font.getStyle(), font.getSize());
addressLabel.setFont(monoFont); addressLabel.setFont(monoFont);
instLabel = new GDLabel("jmp DAT_01001000"); instLabel = new GDLabel("jmp DAT_01001000");

View file

@ -15,8 +15,6 @@
*/ */
package ghidra.app.plugin.core.instructionsearch.ui; package ghidra.app.plugin.core.instructionsearch.ui;
import java.awt.Font;
import javax.swing.JToolBar; import javax.swing.JToolBar;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
@ -58,8 +56,7 @@ public abstract class AbstractInstructionTable extends GhidraTable {
protected JToolBar toolbar; protected JToolBar toolbar;
protected InstructionTableCellRenderer renderer = protected InstructionTableCellRenderer renderer = new InstructionTableCellRenderer();
new InstructionTableCellRenderer(new Font("Courier", Font.PLAIN, 14));
protected InstructionSearchData searchData; protected InstructionSearchData searchData;

View file

@ -30,9 +30,10 @@ import ghidra.util.table.GhidraTableCellRenderer;
* while adding some custom logic for changing background/foreground attributes. * while adding some custom logic for changing background/foreground attributes.
*/ */
public class InstructionTableCellRenderer extends GhidraTableCellRenderer { public class InstructionTableCellRenderer extends GhidraTableCellRenderer {
private static final String FONT_ID = "font.plugin.instruction.table.renderer";
public InstructionTableCellRenderer(Font font) { public InstructionTableCellRenderer() {
super(font); super(Gui.getFont(FONT_ID));
} }
/** /**

View file

@ -29,20 +29,21 @@ import javax.swing.text.*;
import docking.DockingUtils; import docking.DockingUtils;
import docking.actions.KeyBindingUtils; import docking.actions.KeyBindingUtils;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.app.plugin.core.console.CodeCompletion; import ghidra.app.plugin.core.console.CodeCompletion;
import ghidra.framework.options.OptionsChangeListener; import ghidra.framework.options.*;
import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.util.*; import ghidra.util.HelpLocation;
import ghidra.util.Msg;
public class InterpreterPanel extends JPanel implements OptionsChangeListener { public class InterpreterPanel extends JPanel implements OptionsChangeListener {
private static final String COLOR_ID = "interpreterpanel.color";
private static final String COMPLETION_WINDOW_TRIGGER_LABEL = "Completion Window Trigger"; private static final String COMPLETION_WINDOW_TRIGGER_LABEL = "Completion Window Trigger";
private static final String COMPLETION_WINDOW_TRIGGER_DESCRIPTION = private static final String COMPLETION_WINDOW_TRIGGER_DESCRIPTION =
"The key binding used to show the auto-complete window " + "The key binding used to show the auto-complete window " +
"(for those consoles that have auto-complete)."; "(for those consoles that have auto-complete).";
private static final String FONT_ID = "font.plugin.console";
private static final String FONT_OPTION_LABEL = "Font"; private static final String FONT_OPTION_LABEL = "Font";
private static final String FONT_DESCRIPTION = private static final String FONT_DESCRIPTION =
"This is the font that will be used in the Console. " + "This is the font that will be used in the Console. " +
@ -70,8 +71,6 @@ public class InterpreterPanel extends JPanel implements OptionsChangeListener {
private PrintWriter outWriter; private PrintWriter outWriter;
private PrintWriter errWriter; private PrintWriter errWriter;
private Font basicFont = getBasicFont();
private Font basicBoldFont = getBoldFont(basicFont);
private SimpleAttributeSet STDOUT_SET; private SimpleAttributeSet STDOUT_SET;
private SimpleAttributeSet STDERR_SET; private SimpleAttributeSet STDERR_SET;
private SimpleAttributeSet STDIN_SET; private SimpleAttributeSet STDIN_SET;
@ -83,14 +82,6 @@ public class InterpreterPanel extends JPanel implements OptionsChangeListener {
private boolean caretGuard = true; private boolean caretGuard = true;
private PluginTool tool; private PluginTool tool;
private static Font getBasicFont() {
return new Font(Font.MONOSPACED, Font.PLAIN, 20);
}
private static Font getBoldFont(Font font) {
return font.deriveFont(Font.BOLD);
}
private static SimpleAttributeSet createAttributes(Font font, Color color) { private static SimpleAttributeSet createAttributes(Font font, Color color) {
SimpleAttributeSet attributeSet = new SimpleAttributeSet(); SimpleAttributeSet attributeSet = new SimpleAttributeSet();
attributeSet.addAttribute(StyleConstants.FontFamily, font.getFamily()); attributeSet.addAttribute(StyleConstants.FontFamily, font.getFamily());
@ -370,15 +361,14 @@ public class InterpreterPanel extends JPanel implements OptionsChangeListener {
} }
} }
private void updateFontAttributes(Font newFont) { private void updateFontAttributes(Font font) {
basicFont = newFont; Font boldFont = font.deriveFont(Font.BOLD);
basicBoldFont = getBoldFont(newFont); STDOUT_SET = createAttributes(font, NORMAL_COLOR);
STDOUT_SET = createAttributes(basicFont, NORMAL_COLOR); STDERR_SET = createAttributes(font, ERROR_COLOR);
STDERR_SET = createAttributes(basicFont, ERROR_COLOR); STDIN_SET = createAttributes(boldFont, NORMAL_COLOR);
STDIN_SET = createAttributes(basicBoldFont, NORMAL_COLOR);
setTextPaneFont(inputTextPane, basicBoldFont); setTextPaneFont(inputTextPane, boldFont);
setTextPaneFont(promptTextPane, basicFont); setTextPaneFont(promptTextPane, font);
setPrompt(promptTextPane.getText()); setPrompt(promptTextPane.getText());
} }
@ -389,13 +379,13 @@ public class InterpreterPanel extends JPanel implements OptionsChangeListener {
HelpLocation help = new HelpLocation(getName(), "ConsolePlugin"); HelpLocation help = new HelpLocation(getName(), "ConsolePlugin");
options.setOptionsHelpLocation(help); options.setOptionsHelpLocation(help);
options.registerOption(FONT_OPTION_LABEL, basicFont, help, FONT_DESCRIPTION); options.registerOption(FONT_OPTION_LABEL, OptionType.FONT_TYPE, FONT_ID, help,
FONT_DESCRIPTION);
options.registerOption(COMPLETION_WINDOW_TRIGGER_LABEL, CompletionWindowTrigger.TAB, help, options.registerOption(COMPLETION_WINDOW_TRIGGER_LABEL, CompletionWindowTrigger.TAB, help,
COMPLETION_WINDOW_TRIGGER_DESCRIPTION); COMPLETION_WINDOW_TRIGGER_DESCRIPTION);
basicFont = options.getFont(FONT_OPTION_LABEL, basicFont); Font font = Gui.getFont(FONT_ID);
basicFont = SystemUtilities.adjustForFontSizeOverride(basicFont); updateFontAttributes(font);
updateFontAttributes(basicFont);
completionWindowTrigger = completionWindowTrigger =
options.getEnum(COMPLETION_WINDOW_TRIGGER_LABEL, CompletionWindowTrigger.TAB); options.getEnum(COMPLETION_WINDOW_TRIGGER_LABEL, CompletionWindowTrigger.TAB);
@ -413,8 +403,8 @@ public class InterpreterPanel extends JPanel implements OptionsChangeListener {
public void optionsChanged(ToolOptions options, String optionName, Object oldValue, public void optionsChanged(ToolOptions options, String optionName, Object oldValue,
Object newValue) { Object newValue) {
if (optionName.equals(FONT_OPTION_LABEL)) { if (optionName.equals(FONT_OPTION_LABEL)) {
basicFont = SystemUtilities.adjustForFontSizeOverride((Font) newValue); Font font = Gui.getFont(FONT_ID);
updateFontAttributes(basicFont); updateFontAttributes(font);
} }
else if (optionName.equals(COMPLETION_WINDOW_TRIGGER_LABEL)) { else if (optionName.equals(COMPLETION_WINDOW_TRIGGER_LABEL)) {
completionWindowTrigger = (CompletionWindowTrigger) newValue; completionWindowTrigger = (CompletionWindowTrigger) newValue;

View file

@ -27,6 +27,7 @@ import javax.swing.table.TableColumnModel;
import docking.widgets.GenericDateCellRenderer; import docking.widgets.GenericDateCellRenderer;
import docking.widgets.table.GTableCellRenderer; import docking.widgets.table.GTableCellRenderer;
import docking.widgets.table.GTableCellRenderingData; import docking.widgets.table.GTableCellRenderingData;
import generic.theme.Gui;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.symbol.LabelHistory; import ghidra.program.model.symbol.LabelHistory;
import ghidra.util.table.GhidraTable; import ghidra.util.table.GhidraTable;
@ -126,16 +127,11 @@ class LabelHistoryPanel extends JPanel {
private Font monoFont; private Font monoFont;
LabelCellRenderer() {
Font f = getFont();
monoFont = new Font("monospaced", f.getStyle(), f.getSize());
}
@Override @Override
public Component getTableCellRendererComponent(GTableCellRenderingData data) { public Component getTableCellRendererComponent(GTableCellRenderingData data) {
Component c = super.getTableCellRendererComponent(data); Component c = super.getTableCellRendererComponent(data);
c.setFont(monoFont); c.setFont(Gui.getFont("font.monospaced"));
return c; return c;
} }
} }

View file

@ -39,34 +39,29 @@ public class EntropyOverviewOptionsManager implements OptionsChangeListener {
"Color to use for highlighting a specific range of entropy values"; "Color to use for highlighting a specific range of entropy values";
private static final String KNOT_TYPE_STRING = "Type of range to highlight"; private static final String KNOT_TYPE_STRING = "Type of range to highlight";
private static final String KNOT1_COLOR_STRING = "Range 1 color"; private static final String KNOT1_COLOR_OPTION_NAME = "Range 1 color";
private static final String KNOT1_TYPE_STRING = "Entropy Range 1"; private static final String KNOT1_TYPE_OPTION_NAME = "Entropy Range 1";
private static final Color KNOT1_DEF_COLOR = private static final Color KNOT1_COLOR = new GColor("color.bg.plugin.overview.entropy.knot.1");
new GColor("color.bg.plugin.overview.entropy.knot.1");
private static final EntropyKnot KNOT1_DEF_TYPE = EntropyKnot.COMPRESSED; private static final EntropyKnot KNOT1_DEF_TYPE = EntropyKnot.COMPRESSED;
private static final String KNOT2_COLOR_STRING = "Range 2 color"; private static final String KNOT2_COLOR_OPTION_NAME = "Range 2 color";
private static final String KNOT2_TYPE_STRING = "Entropy Range 2"; private static final String KNOT2_TYPE_OPTION_NAME = "Entropy Range 2";
private static final Color KNOT2_DEF_COLOR = private static final Color KNOT2_COLOR = new GColor("color.bg.plugin.overview.entropy.knot.2");
new GColor("color.bg.plugin.overview.entropy.knot.2");
private static final EntropyKnot KNOT2_DEF_TYPE = EntropyKnot.X86; private static final EntropyKnot KNOT2_DEF_TYPE = EntropyKnot.X86;
private static final String KNOT3_COLOR_STRING = "Range 3 color"; private static final String KNOT3_COLOR_OPTION_NAME = "Range 3 color";
private static final String KNOT3_TYPE_STRING = "Entropy Range 3"; private static final String KNOT3_TYPE_OPTION_NAME = "Entropy Range 3";
private static final Color KNOT3_DEF_COLOR = private static final Color KNOT3_COLOR = new GColor("color.bg.plugin.overview.entropy.knot.3");
new GColor("color.bg.plugin.overview.entropy.knot.3");
private static final EntropyKnot KNOT3_DEF_TYPE = EntropyKnot.ASCII; private static final EntropyKnot KNOT3_DEF_TYPE = EntropyKnot.ASCII;
private static final String KNOT4_COLOR_STRING = "Range 4 color"; private static final String KNOT4_COLOR_OPTION_NAME = "Range 4 color";
private static final String KNOT4_TYPE_STRING = "Entropy Range 4"; private static final String KNOT4_TYPE_OPTION_NAME = "Entropy Range 4";
private static final Color KNOT4_DEF_COLOR = private static final Color KNOT4_COLOR = new GColor("color.bg.plugin.overview.entropy.knot.4");
new GColor("color.bg.plugin.overview.entropy.knot.4");
private static final EntropyKnot KNOT4_DEF_TYPE = EntropyKnot.UTF16; private static final EntropyKnot KNOT4_DEF_TYPE = EntropyKnot.UTF16;
private static final String KNOT5_COLOR_STRING = "Range 5 color"; private static final String KNOT5_COLOR_OPTION_NAME = "Range 5 color";
private static final String KNOT5_TYPE_STRING = "Entropy Range 5"; private static final String KNOT5_TYPE_OPTION_NAME = "Entropy Range 5";
private static final Color KNOT5_DEF_COLOR = private static final Color KNOT5_COLOR = new GColor("color.bg.plugin.overview.entropy.knot.5");
new GColor("color.bg.plugin.overview.entropy.knot.5");
private static final EntropyKnot KNOT5_DEF_TYPE = EntropyKnot.NONE; private static final EntropyKnot KNOT5_DEF_TYPE = EntropyKnot.NONE;
private static final Color PALETTE_COLOR_HIGH = private static final Color PALETTE_COLOR_HIGH =
@ -75,15 +70,10 @@ public class EntropyOverviewOptionsManager implements OptionsChangeListener {
new GColor("color.bg.plugin.overview.entropy.palette.base.low"); new GColor("color.bg.plugin.overview.entropy.palette.base.low");
private EntropyChunkSize chunksize; private EntropyChunkSize chunksize;
private Color knot1color;
private EntropyKnot knot1type; private EntropyKnot knot1type;
private Color knot2color;
private EntropyKnot knot2type; private EntropyKnot knot2type;
private Color knot3color;
private EntropyKnot knot3type; private EntropyKnot knot3type;
private Color knot4color;
private EntropyKnot knot4type; private EntropyKnot knot4type;
private Color knot5color;
private EntropyKnot knot5type; private EntropyKnot knot5type;
private OverviewPalette palette = new OverviewPalette(256, UNINITIALIZED_COLOR); private OverviewPalette palette = new OverviewPalette(256, UNINITIALIZED_COLOR);
private EntropyOverviewColorService service; private EntropyOverviewColorService service;
@ -97,17 +87,22 @@ public class EntropyOverviewOptionsManager implements OptionsChangeListener {
options.setOptionsHelpLocation(help); options.setOptionsHelpLocation(help);
options.registerOption(CHUNKSIZE_STRING, CHUNKSIZE_DEF, help, CHUNKSIZE_DESC_STRING); options.registerOption(CHUNKSIZE_STRING, CHUNKSIZE_DEF, help, CHUNKSIZE_DESC_STRING);
options.registerOption(KNOT1_COLOR_STRING, KNOT1_DEF_COLOR, help, KNOT_COLOR_STRING); options.registerOption(KNOT1_COLOR_OPTION_NAME, KNOT1_COLOR, help,
options.registerOption(KNOT2_COLOR_STRING, KNOT2_DEF_COLOR, help, KNOT_COLOR_STRING); KNOT_COLOR_STRING);
options.registerOption(KNOT3_COLOR_STRING, KNOT3_DEF_COLOR, help, KNOT_COLOR_STRING); options.registerOption(KNOT2_COLOR_OPTION_NAME, KNOT2_COLOR, help,
options.registerOption(KNOT4_COLOR_STRING, KNOT4_DEF_COLOR, help, KNOT_COLOR_STRING); KNOT_COLOR_STRING);
options.registerOption(KNOT5_COLOR_STRING, KNOT5_DEF_COLOR, help, KNOT_COLOR_STRING); options.registerOption(KNOT3_COLOR_OPTION_NAME, KNOT3_COLOR, help,
KNOT_COLOR_STRING);
options.registerOption(KNOT4_COLOR_OPTION_NAME, KNOT4_COLOR, help,
KNOT_COLOR_STRING);
options.registerOption(KNOT5_COLOR_OPTION_NAME, KNOT5_COLOR, help,
KNOT_COLOR_STRING);
options.registerOption(KNOT1_TYPE_STRING, KNOT1_DEF_TYPE, help, KNOT_TYPE_STRING); options.registerOption(KNOT1_TYPE_OPTION_NAME, KNOT1_DEF_TYPE, help, KNOT_TYPE_STRING);
options.registerOption(KNOT2_TYPE_STRING, KNOT2_DEF_TYPE, help, KNOT_TYPE_STRING); options.registerOption(KNOT2_TYPE_OPTION_NAME, KNOT2_DEF_TYPE, help, KNOT_TYPE_STRING);
options.registerOption(KNOT3_TYPE_STRING, KNOT3_DEF_TYPE, help, KNOT_TYPE_STRING); options.registerOption(KNOT3_TYPE_OPTION_NAME, KNOT3_DEF_TYPE, help, KNOT_TYPE_STRING);
options.registerOption(KNOT4_TYPE_STRING, KNOT4_DEF_TYPE, help, KNOT_TYPE_STRING); options.registerOption(KNOT4_TYPE_OPTION_NAME, KNOT4_DEF_TYPE, help, KNOT_TYPE_STRING);
options.registerOption(KNOT5_TYPE_STRING, KNOT5_DEF_TYPE, help, KNOT_TYPE_STRING); options.registerOption(KNOT5_TYPE_OPTION_NAME, KNOT5_DEF_TYPE, help, KNOT_TYPE_STRING);
readOptions(options); readOptions(options);
updatePalettes(); updatePalettes();
@ -124,17 +119,11 @@ public class EntropyOverviewOptionsManager implements OptionsChangeListener {
private void readOptions(ToolOptions options) { private void readOptions(ToolOptions options) {
chunksize = options.getEnum(CHUNKSIZE_STRING, CHUNKSIZE_DEF); chunksize = options.getEnum(CHUNKSIZE_STRING, CHUNKSIZE_DEF);
knot1color = options.getColor(KNOT1_COLOR_STRING, KNOT1_DEF_COLOR); knot1type = options.getEnum(KNOT1_TYPE_OPTION_NAME, KNOT1_DEF_TYPE);
knot2color = options.getColor(KNOT2_COLOR_STRING, KNOT2_DEF_COLOR); knot2type = options.getEnum(KNOT2_TYPE_OPTION_NAME, KNOT2_DEF_TYPE);
knot3color = options.getColor(KNOT3_COLOR_STRING, KNOT3_DEF_COLOR); knot3type = options.getEnum(KNOT3_TYPE_OPTION_NAME, KNOT3_DEF_TYPE);
knot4color = options.getColor(KNOT4_COLOR_STRING, KNOT4_DEF_COLOR); knot4type = options.getEnum(KNOT4_TYPE_OPTION_NAME, KNOT4_DEF_TYPE);
knot5color = options.getColor(KNOT5_COLOR_STRING, KNOT5_DEF_COLOR); knot5type = options.getEnum(KNOT5_TYPE_OPTION_NAME, KNOT5_DEF_TYPE);
knot1type = options.getEnum(KNOT1_TYPE_STRING, KNOT1_DEF_TYPE);
knot2type = options.getEnum(KNOT2_TYPE_STRING, KNOT2_DEF_TYPE);
knot3type = options.getEnum(KNOT3_TYPE_STRING, KNOT3_DEF_TYPE);
knot4type = options.getEnum(KNOT4_TYPE_STRING, KNOT4_DEF_TYPE);
knot5type = options.getEnum(KNOT5_TYPE_STRING, KNOT5_DEF_TYPE);
} }
@ -161,23 +150,23 @@ public class EntropyOverviewOptionsManager implements OptionsChangeListener {
private void addPaletteKnots() { private void addPaletteKnots() {
EntropyRecord rec = knot1type.getRecord(); EntropyRecord rec = knot1type.getRecord();
if (rec != null) { if (rec != null) {
addPaletteKnot(rec.name, knot1color, rec.center, rec.width); addPaletteKnot(rec.name, KNOT1_COLOR, rec.center, rec.width);
} }
rec = knot2type.getRecord(); rec = knot2type.getRecord();
if (rec != null) { if (rec != null) {
addPaletteKnot(rec.name, knot2color, rec.center, rec.width); addPaletteKnot(rec.name, KNOT2_COLOR, rec.center, rec.width);
} }
rec = knot3type.getRecord(); rec = knot3type.getRecord();
if (rec != null) { if (rec != null) {
addPaletteKnot(rec.name, knot3color, rec.center, rec.width); addPaletteKnot(rec.name, KNOT3_COLOR, rec.center, rec.width);
} }
rec = knot4type.getRecord(); rec = knot4type.getRecord();
if (rec != null) { if (rec != null) {
addPaletteKnot(rec.name, knot4color, rec.center, rec.width); addPaletteKnot(rec.name, KNOT4_COLOR, rec.center, rec.width);
} }
rec = knot5type.getRecord(); rec = knot5type.getRecord();
if (rec != null) { if (rec != null) {
addPaletteKnot(rec.name, knot5color, rec.center, rec.width); addPaletteKnot(rec.name, KNOT5_COLOR, rec.center, rec.width);
} }
} }

View file

@ -21,9 +21,10 @@ import java.util.ArrayList;
import javax.swing.JPanel; import javax.swing.JPanel;
import generic.theme.GThemeDefaults.Colors.Java; import generic.theme.GThemeDefaults.Colors.Java;
import generic.theme.Gui;
public class KnotLabelPanel extends JPanel { public class KnotLabelPanel extends JPanel {
private static final Font FONT = new Font("Times New Roman", Font.BOLD, 16); private static final String FONT_ID = "font.plugin.entropy.label.knot";
private int topBottomMargin = 10; private int topBottomMargin = 10;
private OverviewPalette palette; private OverviewPalette palette;
@ -47,7 +48,7 @@ public class KnotLabelPanel extends JPanel {
g.setColor(getBackground()); g.setColor(getBackground());
g.fillRect(0, 0, width, height); g.fillRect(0, 0, width, height);
int paletteSize = palette.getSize(); int paletteSize = palette.getSize();
g.setFont(FONT); g.setFont(Gui.getFont(FONT_ID));
FontMetrics fontMetrics = g.getFontMetrics(); FontMetrics fontMetrics = g.getFontMetrics();
int ascent = fontMetrics.getAscent(); int ascent = fontMetrics.getAscent();
int descent = fontMetrics.getDescent(); int descent = fontMetrics.getDescent();

View file

@ -1,194 +0,0 @@
/* ###
* 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.plugin.core.overview.entropy;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeListener;
import docking.util.GraphicsUtils;
import docking.widgets.label.GLabel;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors.Java;
/**
* Class used by the entropy legend panel to show known entropy ranges.
*/
public class KnotPanel extends JPanel implements ComponentListener {
private static final int SPACING = 5;
private static final Font FONT = new Font("SansSerif", Font.PLAIN, 10);
private static final Color FG_COLOR_TEXT =
new GColor("color.bg.plugin.overview.entropy.palette.text");
private OverviewPalette palette = null;
private FontMetrics metrics;
private ChangeListener paletteListener = e -> buildLabels();
public KnotPanel() {
super();
addComponentListener(this);
metrics = getFontMetrics(FONT);
setPreferredSize(
new Dimension(100, SPACING + metrics.getMaxAscent() + metrics.getMaxDescent()));
}
public void oldPaintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(getBackground());
Rectangle clip = g.getClipBounds();
g.fillRect(clip.x, clip.y, clip.width, clip.height);
if (palette == null) {
return;
}
g.setFont(FONT);
int height = getHeight();
int width = getWidth();
int palsize = palette.getSize();
int fontHeight = metrics.getMaxAscent() + metrics.getMaxDescent();
int baseline = (height - fontHeight - 1) / 2 + metrics.getMaxAscent();
ArrayList<KnotRecord> knots = palette.getKnots();
for (KnotRecord rec : knots) {
g.setColor(Java.BORDER);
int start = (rec.start * width) / palsize;
int end = (rec.end * width) / palsize;
g.drawLine(start, 0, start, height - 1);
g.drawLine(end, 0, end, height - 1);
g.drawLine(start, height - 1, end, height - 1);
FontMetrics currentMetrics = metrics;
int w = currentMetrics.stringWidth(rec.name);
int knotwidth = end - start;
while (w > knotwidth) {
currentMetrics = getSmallerFontMetrics(currentMetrics);
w = currentMetrics.stringWidth(rec.name);
if (currentMetrics.getFont().getSize() <= 4) {
break; // can't go any smaller
}
}
g.setColor(FG_COLOR_TEXT);
if (w < knotwidth) { // we found a suitable font
g.setFont(currentMetrics.getFont());
GraphicsUtils.drawString(this, g, rec.name, start + (knotwidth - 1) / 2 - w / 2,
baseline);
g.setFont(FONT);
}
else { // must be no room to paint the string, even with a small font
String ellipsis = "...";
w = metrics.stringWidth(ellipsis);
GraphicsUtils.drawString(this, g, ellipsis, start + (knotwidth - 1) / 2 - w / 2,
baseline);
}
// reset the font
currentMetrics = metrics;
}
}
private FontMetrics getSmallerFontMetrics(FontMetrics fontMetrics) {
Font currentFont = fontMetrics.getFont();
int size = currentFont.getSize();
Font newFont = currentFont.deriveFont((float) --size);
return getFontMetrics(newFont);
}
public void setPalette(OverviewPalette pal) {
palette = pal;
palette.addPaletteListener(paletteListener);
buildLabels();
repaint();
}
private void buildLabels() {
removeAll();
setLayout(null);
int paletteSize = palette.getSize();
Container parent = getParent();
ArrayList<KnotRecord> knots = palette.getKnots();
for (KnotRecord record : knots) {
JLabel label = new GLabel(record.name);
label.setFont(FONT);
label.setBorder(new ToplessLineBorder(Java.BORDER));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setToolTipText(record.name);
int height = getHeight();
int width = getWidth();
int start = (record.start * width) / paletteSize;
int end = (record.end * width) / paletteSize;
int labelWidth = end - start;
int labelHeight = height - 1;
int x = start + ((end - start >> 1) - (labelWidth >> 1));
int y = 0;
label.setBounds(x, y, labelWidth, labelHeight);
add(label);
}
invalidate();
if (parent != null) {
parent.validate();
}
}
public void refresh() {
buildLabels();
repaint();
}
@Override
public void componentResized(ComponentEvent e) {
refresh();
}
@Override
public void componentHidden(ComponentEvent e) {
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentShown(ComponentEvent e) {
}
private class ToplessLineBorder extends LineBorder {
public ToplessLineBorder(Color color) {
super(color);
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
super.paintBorder(c, g, x, y - 1, width, height + 1);
}
}
}

View file

@ -23,13 +23,12 @@ import javax.swing.*;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.widgets.button.GRadioButton; import docking.widgets.button.GRadioButton;
import docking.widgets.checkbox.GCheckBox; import docking.widgets.checkbox.GCheckBox;
import generic.theme.Gui;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
public class PrintOptionsDialog extends DialogComponentProvider { public class PrintOptionsDialog extends DialogComponentProvider {
private final Font HEADER_FONT = new Font("SansSerif", Font.PLAIN, 10); private static final String FONT_ID = "font.print";
private final FontMetrics HEADER_METRICS = rootPanel.getFontMetrics(HEADER_FONT);
private boolean selectionEnabled; private boolean selectionEnabled;
private boolean cancelled = false; private boolean cancelled = false;
@ -163,11 +162,11 @@ public class PrintOptionsDialog extends DialogComponentProvider {
} }
public Font getHeaderFont() { public Font getHeaderFont() {
return HEADER_FONT; return Gui.getFont(FONT_ID);
} }
public FontMetrics getHeaderMetrics() { public FontMetrics getHeaderMetrics() {
return HEADER_METRICS; return rootPanel.getFontMetrics(getHeaderFont());
} }
public boolean showHeader() { public boolean showHeader() {
@ -183,7 +182,8 @@ public class PrintOptionsDialog extends DialogComponentProvider {
} }
public int getHeaderHeight() { public int getHeaderHeight() {
return HEADER_METRICS.getMaxAscent() + HEADER_METRICS.getMaxDescent(); FontMetrics metrics = getHeaderMetrics();
return metrics.getMaxAscent() + metrics.getMaxDescent();
} }
public void setSelectionEnabled(boolean selectionEnabled) { public void setSelectionEnabled(boolean selectionEnabled) {

View file

@ -21,6 +21,7 @@ import javax.swing.*;
import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
import docking.widgets.checkbox.GCheckBox; import docking.widgets.checkbox.GCheckBox;
import generic.theme.Gui;
import ghidra.app.plugin.processors.sleigh.SleighDebugLogger; import ghidra.app.plugin.processors.sleigh.SleighDebugLogger;
import ghidra.app.plugin.processors.sleigh.SleighDebugLogger.SleighDebugMode; import ghidra.app.plugin.processors.sleigh.SleighDebugLogger.SleighDebugMode;
import ghidra.framework.model.DomainObjectChangedEvent; import ghidra.framework.model.DomainObjectChangedEvent;
@ -38,6 +39,7 @@ import ghidra.util.table.GhidraTable;
* *
*/ */
class InstructionInfoProvider extends ComponentProviderAdapter implements DomainObjectListener { class InstructionInfoProvider extends ComponentProviderAdapter implements DomainObjectListener {
private static final String FONT_ID = "font.plugin.instruction.info";
private JPanel mainPanel; private JPanel mainPanel;
private JSplitPane pane; private JSplitPane pane;
private ShowInstructionInfoPlugin plugin; private ShowInstructionInfoPlugin plugin;
@ -99,14 +101,12 @@ class InstructionInfoProvider extends ComponentProviderAdapter implements Domain
mainPanel = new JPanel(new BorderLayout()); mainPanel = new JPanel(new BorderLayout());
instructionText = new JTextArea(); instructionText = new JTextArea();
Font defaultFont = instructionText.getFont(); Gui.registerFont(instructionText, FONT_ID);
Font fixedWidthFont = new Font("monospaced", defaultFont.getStyle(), 14);
instructionText.setFont(fixedWidthFont);
instructionText.setEditable(false); instructionText.setEditable(false);
operandModel = new OperandModel(); operandModel = new OperandModel();
opTable = new GhidraTable(operandModel); opTable = new GhidraTable(operandModel);
opTable.setFont(fixedWidthFont); Gui.registerFont(opTable, FONT_ID);
opTable.setPreferredScrollableViewportSize(new Dimension(425, 105)); opTable.setPreferredScrollableViewportSize(new Dimension(425, 105));
//opTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); //opTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

View file

@ -27,8 +27,7 @@ import javax.swing.border.*;
import docking.actions.KeyBindingUtils; import docking.actions.KeyBindingUtils;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import docking.widgets.label.GIconLabel; import docking.widgets.label.GIconLabel;
import generic.theme.GColor; import generic.theme.*;
import generic.theme.GIcon;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.framework.model.ProjectLocator; import ghidra.framework.model.ProjectLocator;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
@ -39,7 +38,8 @@ import resources.Icons;
* Panel to show a "tab" for an object. ChangeListeners are notified when a tab is selected. * Panel to show a "tab" for an object. ChangeListeners are notified when a tab is selected.
*/ */
public class MultiTabPanel extends JPanel { public class MultiTabPanel extends JPanel {
private static final String FONT_TABS_ID = "font.plugin.tabs";
private static final String FONT_TABS_LIST_ID = "font.plugin.tabs.list";
//@formatter:off //@formatter:off
private final static Color SELECTED_TAB_COLOR = new GColor("color.bg.listing.tabs.selected"); private final static Color SELECTED_TAB_COLOR = new GColor("color.bg.listing.tabs.selected");
private final static Color HIGHLIGHTED_TAB_BG_COLOR = new GColor("color.bg.listing.tabs.highlighted"); private final static Color HIGHLIGHTED_TAB_BG_COLOR = new GColor("color.bg.listing.tabs.highlighted");
@ -61,8 +61,6 @@ public class MultiTabPanel extends JPanel {
private static final Color BG_COLOR_MORE_TABS_HOVER = private static final Color BG_COLOR_MORE_TABS_HOVER =
new GColor("color.bg.listing.tabs.more.tabs.hover"); new GColor("color.bg.listing.tabs.more.tabs.hover");
private static final Font LABEL_FONT = new Font("Tahoma", Font.PLAIN, 11);
private static final Font LIST_LABEL_FONT = new Font("Tahoma", Font.BOLD, 9);
private static final String DEFAULT_HIDDEN_COUNT_STR = "99"; private static final String DEFAULT_HIDDEN_COUNT_STR = "99";
/** A list of tabs that are hidden from view due to space constraints */ /** A list of tabs that are hidden from view due to space constraints */
@ -220,7 +218,7 @@ public class MultiTabPanel extends JPanel {
JLabel nameLabel = new GDLabel(); JLabel nameLabel = new GDLabel();
nameLabel.setIconTextGap(1); nameLabel.setIconTextGap(1);
nameLabel.setName("objectName"); // junit access nameLabel.setName("objectName"); // junit access
nameLabel.setFont(LABEL_FONT); Gui.registerFont(nameLabel, FONT_TABS_ID);
Color foregroundColor = isSelected ? TEXT_SELECTION_COLOR : TEXT_NON_SELECTION_COLOR; Color foregroundColor = isSelected ? TEXT_SELECTION_COLOR : TEXT_NON_SELECTION_COLOR;
nameLabel.setForeground(foregroundColor); nameLabel.setForeground(foregroundColor);
@ -637,7 +635,7 @@ public class MultiTabPanel extends JPanel {
private JLabel createLabel() { private JLabel createLabel() {
JLabel newLabel = new GDLabel(DEFAULT_HIDDEN_COUNT_STR, LIST_ICON, SwingConstants.LEFT); JLabel newLabel = new GDLabel(DEFAULT_HIDDEN_COUNT_STR, LIST_ICON, SwingConstants.LEFT);
newLabel.setIconTextGap(0); newLabel.setIconTextGap(0);
newLabel.setFont(LIST_LABEL_FONT); Gui.registerFont(newLabel, FONT_TABS_LIST_ID);
newLabel.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 4)); newLabel.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 4));
newLabel.setToolTipText("Show Tab List"); newLabel.setToolTipText("Show Tab List");
newLabel.setName("showList"); newLabel.setName("showList");

View file

@ -1026,8 +1026,7 @@ public class EditReferencesProvider extends ComponentProviderAdapter
RefCellTextRenderer() { RefCellTextRenderer() {
defaultFont = getFont(); defaultFont = getFont();
boldFont = new Font(defaultFont.getName(), defaultFont.getStyle() | Font.BOLD, boldFont = defaultFont.deriveFont(defaultFont.getStyle() | Font.BOLD);
defaultFont.getSize());
setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0)); setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0));
} }

View file

@ -33,6 +33,7 @@ import docking.dnd.DropTgtAdapter;
import docking.dnd.Droppable; import docking.dnd.Droppable;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import generic.theme.Gui;
import ghidra.app.util.*; import ghidra.app.util.*;
import ghidra.app.util.viewer.field.BrowserCodeUnitFormat; import ghidra.app.util.viewer.field.BrowserCodeUnitFormat;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
@ -64,7 +65,6 @@ class InstructionPanel extends JPanel implements ChangeListener {
private JLabel[] operandLabels; private JLabel[] operandLabels;
private DropTarget[] dropTargets; // 0: mnemonic, >= 1: operands private DropTarget[] dropTargets; // 0: mnemonic, >= 1: operands
private JPanel innerPanel; private JPanel innerPanel;
private Font monoFont;
private int activeIndex; private int activeIndex;
private int activeSubIndex; private int activeSubIndex;
private CodeUnit currentCodeUnit; private CodeUnit currentCodeUnit;
@ -207,14 +207,11 @@ class InstructionPanel extends JPanel implements ChangeListener {
setBorder(border); setBorder(border);
addressLabel = new GDLabel("FFFFFFFF"); // use a default addressLabel = new GDLabel("FFFFFFFF"); // use a default
Gui.registerFont(addressLabel, "font.monospaced");
Font font = addressLabel.getFont();
monoFont = new Font("monospaced", font.getStyle(), font.getSize());
addressLabel.setFont(monoFont);
addressLabel.setName("addressLabel"); addressLabel.setName("addressLabel");
mnemonicLabel = new GDLabel("movl"); mnemonicLabel = new GDLabel("movl");
mnemonicLabel.setFont(monoFont); Gui.registerFont(mnemonicLabel, "font.monospaced");
mnemonicLabel.setName("mnemonicLabel"); mnemonicLabel.setName("mnemonicLabel");
mnemonicLabel.addMouseListener(mouseListener); mnemonicLabel.addMouseListener(mouseListener);
@ -222,8 +219,8 @@ class InstructionPanel extends JPanel implements ChangeListener {
for (int i = 0; i < operandLabels.length; i++) { for (int i = 0; i < operandLabels.length; i++) {
operandLabels[i] = new GDLabel("%ebp, "); operandLabels[i] = new GDLabel("%ebp, ");
operandLabels[i].setName("operandLabels[" + i + "]"); operandLabels[i].setName("operandLabels[" + i + "]");
operandLabels[i].setFont(monoFont);
operandLabels[i].addMouseListener(mouseListener); operandLabels[i].addMouseListener(mouseListener);
Gui.registerFont(operandLabels[i], "font.monospaced");
} }
innerPanel = new JPanel(); innerPanel = new JPanel();

View file

@ -28,6 +28,7 @@ import docking.widgets.OptionDialog;
import docking.widgets.table.*; import docking.widgets.table.*;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
import generic.theme.Gui;
import ghidra.app.cmd.register.SetRegisterCmd; import ghidra.app.cmd.register.SetRegisterCmd;
import ghidra.app.events.ProgramSelectionPluginEvent; import ghidra.app.events.ProgramSelectionPluginEvent;
import ghidra.app.services.*; import ghidra.app.services.*;
@ -497,7 +498,7 @@ class RegisterValueRenderer extends GTableCellRenderer {
RegisterValueRenderer(JTable table) { RegisterValueRenderer(JTable table) {
setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
setFont(new Font("monospaced", Font.PLAIN, 12)); Gui.registerFont(this, "font.monospaced");
} }
@Override @Override

View file

@ -28,6 +28,7 @@ import javax.swing.event.ChangeListener;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.widgets.combobox.GComboBox; import docking.widgets.combobox.GComboBox;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import generic.theme.Gui;
import ghidra.app.util.bean.FixedBitSizeValueField; import ghidra.app.util.bean.FixedBitSizeValueField;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Register; import ghidra.program.model.lang.Register;
@ -92,7 +93,7 @@ public class SetRegisterValueDialog extends DialogComponentProvider {
registerChanged(); registerChanged();
} }
}); });
f = new Font("monospaced", Font.PLAIN, 13); f = Gui.getFont("font.monospaced");
addressRangeList = new JList(); addressRangeList = new JList();
addressRangeList.setEnabled(false); addressRangeList.setEnabled(false);

View file

@ -20,8 +20,6 @@ import java.awt.Font;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.io.*; import java.io.*;
import java.util.Collection;
import java.util.Iterator;
import javax.swing.*; import javax.swing.*;
import javax.swing.text.Document; import javax.swing.text.Document;
@ -35,14 +33,15 @@ import docking.widgets.OptionDialog;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import generic.theme.GIcon; import generic.theme.GIcon;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import generic.theme.Gui;
import ghidra.app.script.GhidraScriptUtil; import ghidra.app.script.GhidraScriptUtil;
import ghidra.framework.options.SaveState;
import ghidra.util.*; import ghidra.util.*;
import ghidra.util.datastruct.FixedSizeStack; import ghidra.util.datastruct.FixedSizeStack;
import resources.Icons; import resources.Icons;
public class GhidraScriptEditorComponentProvider extends ComponentProvider { public class GhidraScriptEditorComponentProvider extends ComponentProvider {
static final String EDITOR_COMPONENT_NAME = "EDITOR"; static final String EDITOR_COMPONENT_NAME = "EDITOR";
private static final String FONT_ID = "font.plugin.scripts.text.editor";
static final String CHANGE_DESTINATION_TITLE = "Where Would You Like to Store Your Changes?"; static final String CHANGE_DESTINATION_TITLE = "Where Would You Like to Store Your Changes?";
static final String FILE_ON_DISK_CHANGED_TITLE = "File Changed on Disk"; static final String FILE_ON_DISK_CHANGED_TITLE = "File Changed on Disk";
@ -55,21 +54,6 @@ public class GhidraScriptEditorComponentProvider extends ComponentProvider {
private static final int MAX_UNDO_REDO_SIZE = 50; private static final int MAX_UNDO_REDO_SIZE = 50;
private static Font defaultFont = new Font("monospaced", Font.PLAIN, 12);
static void restoreState(SaveState saveState) {
String name = saveState.getString("DEFAULT_FONT_NAME", "Monospaced");
int style = saveState.getInt("DEFAULT_FONT_STYLE", Font.PLAIN);
int size = saveState.getInt("DEFAULT_FONT_SIZE", 12);
defaultFont = new Font(name, style, size);
}
static void saveState(SaveState saveState) {
saveState.putString("DEFAULT_FONT_NAME", defaultFont.getName());
saveState.putInt("DEFAULT_FONT_STYLE", defaultFont.getStyle());
saveState.putInt("DEFAULT_FONT_SIZE", defaultFont.getSize());
}
private GhidraScriptMgrPlugin plugin; private GhidraScriptMgrPlugin plugin;
private GhidraScriptComponentProvider provider; private GhidraScriptComponentProvider provider;
private String title; private String title;
@ -520,18 +504,11 @@ public class GhidraScriptEditorComponentProvider extends ComponentProvider {
} }
} }
private void doSelectFont() { protected void doSelectFont() {
FontEditor editor = new FontEditor(); FontEditor editor = new FontEditor();
editor.setValue(defaultFont); editor.setValue(Gui.getFont(FONT_ID));
editor.showDialog(); editor.showDialog();
defaultFont = (Font) editor.getValue(); Gui.setFont(FONT_ID, (Font) editor.getValue());
Collection<GhidraScriptEditorComponentProvider> values = provider.getEditorMap().values();
Iterator<GhidraScriptEditorComponentProvider> iterator = values.iterator();
while (iterator.hasNext()) {
GhidraScriptEditorComponentProvider editorComponent = iterator.next();
editorComponent.textArea.setFont(defaultFont);
}
} }
private void save() { private void save() {
@ -681,7 +658,7 @@ public class GhidraScriptEditorComponentProvider extends ComponentProvider {
private KeyMasterTextArea(String text) { private KeyMasterTextArea(String text) {
super(text); super(text);
setFont(defaultFont); Gui.registerFont(this, FONT_ID);
setName(EDITOR_COMPONENT_NAME); setName(EDITOR_COMPONENT_NAME);
setWrapStyleWord(false); setWrapStyleWord(false);
Document document = getDocument(); Document document = getDocument();

View file

@ -78,14 +78,12 @@ public class GhidraScriptMgrPlugin extends ProgramPlugin implements GhidraScript
public void readConfigState(SaveState saveState) { public void readConfigState(SaveState saveState) {
super.readConfigState(saveState); super.readConfigState(saveState);
provider.readConfigState(saveState); provider.readConfigState(saveState);
GhidraScriptEditorComponentProvider.restoreState(saveState);
} }
@Override @Override
public void writeConfigState(SaveState saveState) { public void writeConfigState(SaveState saveState) {
super.writeConfigState(saveState); super.writeConfigState(saveState);
provider.writeConfigState(saveState); provider.writeConfigState(saveState);
GhidraScriptEditorComponentProvider.saveState(saveState);
} }
GhidraState getCurrentState() { GhidraState getCurrentState() {

View file

@ -387,10 +387,10 @@ public class MemSearchPlugin extends Plugin implements OptionsChangeListener,
opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_NAME, true, null, opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_NAME, true, null,
"Toggles highlight search results"); "Toggles highlight search results");
opt.registerThemeColorOption(PluginConstants.SEARCH_HIGHLIGHT_COLOR_OPTION_NAME, opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_COLOR_OPTION_NAME,
PluginConstants.SEARCH_HIGHLIGHT_COLOR_ID, null, "The search result highlight color"); PluginConstants.SEARCH_HIGHLIGHT_COLOR, null, "The search result highlight color");
opt.registerThemeColorOption(PluginConstants.SEARCH_HIGHLIGHT_CURRENT_COLOR_OPTION_NAME, opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_CURRENT_COLOR_OPTION_NAME,
PluginConstants.SEARCH_HIGHLIGHT_CURRENT_COLOR_ID, null, PluginConstants.SEARCH_HIGHLIGHT_CURRENT_ADDR_COLOR, null,
"The search result highlight color for the currently selected match"); "The search result highlight color for the currently selected match");
opt.addOptionsChangeListener(this); opt.addOptionsChangeListener(this);

View file

@ -435,10 +435,10 @@ public class SearchTextPlugin extends ProgramPlugin implements OptionsChangeList
opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_NAME, true, loc, opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_NAME, true, loc,
"Determines whether to highlight the matched string for a search in the listing."); "Determines whether to highlight the matched string for a search in the listing.");
opt.registerThemeColorOption(PluginConstants.SEARCH_HIGHLIGHT_COLOR_OPTION_NAME, opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_COLOR_OPTION_NAME,
PluginConstants.SEARCH_HIGHLIGHT_COLOR_ID, null, "The search result highlight color"); PluginConstants.SEARCH_HIGHLIGHT_COLOR, null, "The search result highlight color");
opt.registerThemeColorOption(PluginConstants.SEARCH_HIGHLIGHT_CURRENT_COLOR_OPTION_NAME, opt.registerOption(PluginConstants.SEARCH_HIGHLIGHT_CURRENT_COLOR_OPTION_NAME,
PluginConstants.SEARCH_HIGHLIGHT_CURRENT_COLOR_ID, null, PluginConstants.SEARCH_HIGHLIGHT_CURRENT_ADDR_COLOR, null,
"The search result highlight color for the currently selected match"); "The search result highlight color for the currently selected match");
searchLimit = searchLimit =

View file

@ -15,7 +15,8 @@
*/ */
package ghidra.app.plugin.core.totd; package ghidra.app.plugin.core.totd;
import java.awt.*; import java.awt.BorderLayout;
import java.awt.Component;
import java.util.List; import java.util.List;
import javax.swing.*; import javax.swing.*;
@ -28,8 +29,11 @@ import docking.widgets.label.GLabel;
import generic.theme.GIcon; import generic.theme.GIcon;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Java; import generic.theme.GThemeDefaults.Colors.Java;
import generic.theme.Gui;
class TipOfTheDayDialog extends DialogComponentProvider { class TipOfTheDayDialog extends DialogComponentProvider {
private static final String FONT_ID = "font.plugin.tips";
private static final String FONT_LABEL_ID = "font.plugin.tips.label";
private static final int _24_HOURS = 86400000; private static final int _24_HOURS = 86400000;
private TipOfTheDayPlugin plugin; private TipOfTheDayPlugin plugin;
private JCheckBox showTipsCheckbox; private JCheckBox showTipsCheckbox;
@ -53,7 +57,7 @@ class TipOfTheDayDialog extends DialogComponentProvider {
tipArea = new JTextArea(4, 30); tipArea = new JTextArea(4, 30);
tipArea.setEditable(false); tipArea.setEditable(false);
tipArea.setFont(new Font("dialog", Font.PLAIN, 12)); tipArea.setFont(Gui.getFont(FONT_ID));
tipArea.setWrapStyleWord(true); tipArea.setWrapStyleWord(true);
tipArea.setLineWrap(true); tipArea.setLineWrap(true);
tipArea.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); tipArea.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
@ -87,7 +91,7 @@ class TipOfTheDayDialog extends DialogComponentProvider {
panel.setBackground(Colors.BACKGROUND); panel.setBackground(Colors.BACKGROUND);
JLabel label = new GLabel("Did you know...", tipIcon, SwingConstants.LEFT); JLabel label = new GLabel("Did you know...", tipIcon, SwingConstants.LEFT);
label.setFont(new Font("dialog", Font.BOLD, 12)); Gui.registerFont(label, FONT_LABEL_ID);
panel.add(label, BorderLayout.NORTH); panel.add(label, BorderLayout.NORTH);
panel.add(tipScroll, BorderLayout.CENTER); panel.add(tipScroll, BorderLayout.CENTER);

View file

@ -1,145 +0,0 @@
/* ###
* 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;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.*;
import docking.widgets.label.GDLabel;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.util.viewer.util.AddressPixelMap;
import ghidra.program.model.mem.MemoryBlock;
public class BlockPanel extends JPanel implements ComponentListener {
private static final long serialVersionUID = 1L;
private static final int SPACING = 5;
private static final Font FONT = new Font("SansSerif", Font.PLAIN, 10);
private AddressPixelMap map;
private FontMetrics metrics;
public BlockPanel() {
super();
setBackground(Colors.BACKGROUND);
addComponentListener(this);
metrics = getFontMetrics(FONT);
setPreferredSize(
new Dimension(100, SPACING + metrics.getMaxAscent() + metrics.getMaxDescent()));
}
@Override
public void paintComponent(Graphics g) {
g.setColor(Colors.FOREGROUND);
g.setFont(FONT);
int height = getHeight();
MemoryBlock[] blocks = map.getBlocks();
if (blocks == null) {
return;
}
for (MemoryBlock block : blocks) {
Rectangle rect = map.getBlockPosition(block);
g.drawLine(rect.x, 0, rect.x, height - 1);
}
g.drawLine(getWidth() - 1, 0, getWidth() - 1, height - 1);
g.drawLine(0, height - 1, getWidth() - 1, height - 1);
}
@Override
protected void paintChildren(Graphics g) {
//
// clear the background; paint our labels; paint our divider lines
//
Color oldColor = g.getColor();
g.setColor(getBackground());
Rectangle clip = g.getClipBounds();
g.fillRect(clip.x, clip.y, clip.width, clip.height);
g.setColor(oldColor);
super.paintChildren(g);
paintComponent(g);
}
public void setMemoryBlockMap(AddressPixelMap map) {
this.map = map;
repaint();
}
/** Creates labels for the block names */
private void buildLabels() {
removeAll();
setLayout(null);
Container parent = getParent();
MemoryBlock[] blocks = map.getBlocks();
if (blocks == null) {
return;
}
for (MemoryBlock block : blocks) {
JLabel label = new GDLabel(block.getName());
label.setFont(FONT);
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setToolTipText(block.getName());
Rectangle rect = map.getBlockPosition(block);
int height = getHeight();
int width = metrics.stringWidth(block.getName());
if (rect.width < width) {
label.setText("...");
}
int labelWidth = Math.min(rect.width, width);
labelWidth = Math.max(labelWidth, 3);
int labelHeight = height - 1;
int x = rect.x + (rect.width - 1) / 2 - labelWidth / 2;
int y = 0;
label.setBounds(x, y, labelWidth, labelHeight);
add(label);
}
invalidate();
if (parent != null) {
parent.validate();
}
}
public void refresh() {
buildLabels();
repaint();
}
@Override
public void componentResized(ComponentEvent e) {
refresh();
}
@Override
public void componentHidden(ComponentEvent e) {
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentShown(ComponentEvent e) {
}
}

View file

@ -90,8 +90,7 @@ public interface PluginConstants {
* Color for highlighting for searches. * Color for highlighting for searches.
*/ */
public static final String SEARCH_HIGHLIGHT_COLOR_OPTION_NAME = " Highlight Color"; public static final String SEARCH_HIGHLIGHT_COLOR_OPTION_NAME = " Highlight Color";
public static final String SEARCH_HIGHLIGHT_COLOR_ID = "color.bg.search.highlight"; public static final Color SEARCH_HIGHLIGHT_COLOR = new GColor("color.bg.search.highlight");
public static final Color SEARCH_HIGHLIGHT_COLOR = new GColor(SEARCH_HIGHLIGHT_COLOR_ID);
/** /**
* Default highlight color used when something to highlight is at the current * Default highlight color used when something to highlight is at the current
@ -99,9 +98,7 @@ public interface PluginConstants {
*/ */
public static final String SEARCH_HIGHLIGHT_CURRENT_COLOR_OPTION_NAME = public static final String SEARCH_HIGHLIGHT_CURRENT_COLOR_OPTION_NAME =
"Highlight Color for Current Match"; "Highlight Color for Current Match";
public static final String SEARCH_HIGHLIGHT_CURRENT_COLOR_ID =
"color.bg.search.current.line.highlight";
public static final Color SEARCH_HIGHLIGHT_CURRENT_ADDR_COLOR = public static final Color SEARCH_HIGHLIGHT_CURRENT_ADDR_COLOR =
new GColor(SEARCH_HIGHLIGHT_CURRENT_COLOR_ID); new GColor("color.bg.search.current.line.highlight");
} }

View file

@ -28,6 +28,7 @@ import javax.swing.text.*;
import docking.widgets.SmallBorderButton; import docking.widgets.SmallBorderButton;
import generic.theme.GIcon; import generic.theme.GIcon;
import generic.theme.Gui;
public class FixedBitSizeValueField extends JPanel { public class FixedBitSizeValueField extends JPanel {
@ -64,7 +65,7 @@ public class FixedBitSizeValueField extends JPanel {
} }
add(valueField, BorderLayout.CENTER); add(valueField, BorderLayout.CENTER);
Font f2 = new Font("monospaced", Font.PLAIN, 14); Font f2 = Gui.getFont("font.monospaced");
valueField.setFont(f2); valueField.setFont(f2);
valueField.setMargin(new Insets(0, 2, 0, 2)); valueField.setMargin(new Insets(0, 2, 0, 2));

View file

@ -24,7 +24,6 @@ import ghidra.app.util.viewer.options.ScreenElement;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.program.model.listing.Parameter; import ghidra.program.model.listing.Parameter;
import ghidra.program.model.listing.Variable; import ghidra.program.model.listing.Variable;
import ghidra.util.SystemUtilities;
public abstract class AbstractVariableFieldFactory extends FieldFactory { public abstract class AbstractVariableFieldFactory extends FieldFactory {
@ -110,7 +109,7 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
Object newValue) { Object newValue) {
if (optionName.equals(FONT_OPTION_NAME)) { if (optionName.equals(FONT_OPTION_NAME)) {
baseFont = SystemUtilities.adjustForFontSizeOverride((Font) newValue); baseFont = (Font) newValue;
setMetrics(baseFont, parameterFieldOptions[CUSTOM_PARAM_INDEX]); setMetrics(baseFont, parameterFieldOptions[CUSTOM_PARAM_INDEX]);
setMetrics(baseFont, parameterFieldOptions[DYNAMIC_PARAM_INDEX]); setMetrics(baseFont, parameterFieldOptions[DYNAMIC_PARAM_INDEX]);
} }
@ -133,7 +132,7 @@ public abstract class AbstractVariableFieldFactory extends FieldFactory {
private void setMetrics(Font newFont, ParameterFieldOptions paramFieldOptions) { private void setMetrics(Font newFont, ParameterFieldOptions paramFieldOptions) {
paramFieldOptions.defaultMetrics = Toolkit.getDefaultToolkit().getFontMetrics(newFont); paramFieldOptions.defaultMetrics = Toolkit.getDefaultToolkit().getFontMetrics(newFont);
for (int i = 0; i < paramFieldOptions.fontMetrics.length; i++) { for (int i = 0; i < paramFieldOptions.fontMetrics.length; i++) {
Font font = new Font(newFont.getFamily(), i, newFont.getSize()); Font font = newFont.deriveFont(i); // i is looping over the 4 font styles PLAIN, BOLD, ITALIC, and BOLDITALIC
paramFieldOptions.fontMetrics[i] = Toolkit.getDefaultToolkit().getFontMetrics(font); paramFieldOptions.fontMetrics[i] = Toolkit.getDefaultToolkit().getFontMetrics(font);
} }
} }

View file

@ -27,6 +27,7 @@ import org.apache.commons.lang3.StringUtils;
import docking.widgets.fieldpanel.field.*; import docking.widgets.fieldpanel.field.*;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import generic.theme.Gui;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.util.StringUtilities; import ghidra.util.StringUtilities;
import ghidra.util.WordLocation; import ghidra.util.WordLocation;
@ -94,7 +95,7 @@ public class CommentUtils {
} }
private static AttributedString createPrototype() { private static AttributedString createPrototype() {
Font dummyFont = new Font("monospaced", Font.PLAIN, 12); Font dummyFont = Gui.getFont("font.monospaced");
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(dummyFont); FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(dummyFont);
return new AttributedString("", Colors.FOREGROUND, fontMetrics); return new AttributedString("", Colors.FOREGROUND, fontMetrics);

View file

@ -21,6 +21,7 @@ import java.math.BigInteger;
import docking.widgets.fieldpanel.support.FieldLocation; import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
import generic.theme.Gui;
import ghidra.app.util.HighlightProvider; import ghidra.app.util.HighlightProvider;
import ghidra.app.util.viewer.format.FieldFormatModel; import ghidra.app.util.viewer.format.FieldFormatModel;
import ghidra.app.util.viewer.options.OptionsGui; import ghidra.app.util.viewer.options.OptionsGui;
@ -41,7 +42,7 @@ import ghidra.util.classfinder.ExtensionPoint;
*/ */
public abstract class FieldFactory implements ExtensionPoint { public abstract class FieldFactory implements ExtensionPoint {
public static final String FONT_OPTION_NAME = "BASE FONT"; public static final String FONT_OPTION_NAME = "BASE FONT";
public static final Font DEFAULT_FIELD_FONT = new Font("monospaced", Font.PLAIN, 12); public static final String BASE_LISTING_FONT_ID = "font.listing.base";
protected FieldFormatModel model; protected FieldFormatModel model;
protected String name; protected String name;
@ -86,8 +87,7 @@ public abstract class FieldFactory implements ExtensionPoint {
} }
protected void initDisplayOptions() { protected void initDisplayOptions() {
baseFont = SystemUtilities.adjustForFontSizeOverride( baseFont = Gui.getFont(BASE_LISTING_FONT_ID);
displayOptions.getFont(FONT_OPTION_NAME, DEFAULT_FIELD_FONT));
// For most fields (defined in optionsGui) these will be set. But "ad hoc" fields won't, // 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 // so register something. A second registration won't change the original
@ -351,7 +351,7 @@ public abstract class FieldFactory implements ExtensionPoint {
private void setMetrics(Font newFont) { private void setMetrics(Font newFont) {
defaultMetrics = Toolkit.getDefaultToolkit().getFontMetrics(newFont); defaultMetrics = Toolkit.getDefaultToolkit().getFontMetrics(newFont);
for (int i = 0; i < fontMetrics.length; i++) { for (int i = 0; i < fontMetrics.length; i++) {
Font font = new Font(newFont.getFamily(), i, newFont.getSize()); Font font = newFont.deriveFont(i); // i is looping over the 4 font styles PLAIN, BOLD, ITALIC, and BOLDITALIC
fontMetrics[i] = Toolkit.getDefaultToolkit().getFontMetrics(font); fontMetrics[i] = Toolkit.getDefaultToolkit().getFontMetrics(font);
} }
} }

View file

@ -23,6 +23,7 @@ import javax.swing.border.Border;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui;
import ghidra.app.util.viewer.field.FieldFactory; import ghidra.app.util.viewer.field.FieldFactory;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.Swing; import ghidra.util.Swing;
@ -33,6 +34,8 @@ import help.HelpService;
* Class manage a header for the FieldViewer. * Class manage a header for the FieldViewer.
*/ */
public class FieldHeaderComp extends JPanel { public class FieldHeaderComp extends JPanel {
private static final String FONT_ID = "font.listing.header";
private enum CursorState { private enum CursorState {
NOWHERE, NEAR_EDGE, OVER_FIELD NOWHERE, NEAR_EDGE, OVER_FIELD
} }
@ -87,7 +90,7 @@ public class FieldHeaderComp extends JPanel {
defaultButtonBgColor = label.getBackground(); defaultButtonBgColor = label.getBackground();
defaultButtonFgColor = label.getForeground(); defaultButtonFgColor = label.getForeground();
label.setBorder(BorderFactory.createCompoundBorder(border2, border1)); label.setBorder(BorderFactory.createCompoundBorder(border2, border1));
label.setFont(new Font("Tahoma", Font.PLAIN, 11)); label.setFont(Gui.getFont(FONT_ID));
Dimension d = label.getPreferredSize(); Dimension d = label.getPreferredSize();
rowHeight = d.height; rowHeight = d.height;
this.setMinimumSize(new Dimension(0, 2 * rowHeight)); this.setMinimumSize(new Dimension(0, 2 * rowHeight));

View file

@ -21,6 +21,7 @@ import java.beans.PropertyChangeListener;
import javax.swing.JComponent; import javax.swing.JComponent;
import generic.theme.Gui;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.framework.options.*; import ghidra.framework.options.*;
@ -28,7 +29,7 @@ import ghidra.framework.options.*;
* Class for editing Listing display properties. * Class for editing Listing display properties.
*/ */
public class ListingDisplayOptionsEditor implements OptionsEditor { public class ListingDisplayOptionsEditor implements OptionsEditor {
public static final Font DEFAULT_FONT = new Font("Monospaced", Font.PLAIN, 12); public static final String DEFAULT_FONT_ID = "font.listing.base";
private OptionsGui optionsGui; private OptionsGui optionsGui;
private Options options; private Options options;
@ -53,8 +54,8 @@ public class ListingDisplayOptionsEditor implements OptionsEditor {
private void registerOptions() { private void registerOptions() {
String prefix = "Sets the "; String prefix = "Sets the ";
options.registerOption(GhidraOptions.OPTION_BASE_FONT, DEFAULT_FONT, null, options.registerOption(GhidraOptions.OPTION_BASE_FONT, OptionType.FONT_TYPE,
prefix + GhidraOptions.OPTION_BASE_FONT); DEFAULT_FONT_ID, null, prefix + GhidraOptions.OPTION_BASE_FONT);
for (ScreenElement element : OptionsGui.elements) { for (ScreenElement element : OptionsGui.elements) {
String colorOptionName = element.getColorOptionName(); String colorOptionName = element.getColorOptionName();
options.registerOption(colorOptionName, element.getDefaultColor(), null, options.registerOption(colorOptionName, element.getDefaultColor(), null,
@ -68,7 +69,7 @@ public class ListingDisplayOptionsEditor implements OptionsEditor {
public void apply() { public void apply() {
if (optionsGui != null) { if (optionsGui != null) {
Font font = options.getFont(GhidraOptions.OPTION_BASE_FONT, DEFAULT_FONT); Font font = Gui.getFont(DEFAULT_FONT_ID);
Font newFont = optionsGui.getBaseFont(); Font newFont = optionsGui.getBaseFont();
if (!newFont.equals(font)) { if (!newFont.equals(font)) {
options.setFont(GhidraOptions.OPTION_BASE_FONT, newFont); options.setFont(GhidraOptions.OPTION_BASE_FONT, newFont);
@ -123,7 +124,7 @@ public class ListingDisplayOptionsEditor implements OptionsEditor {
@Override @Override
public JComponent getEditorComponent(Options editableOptions, public JComponent getEditorComponent(Options editableOptions,
EditorStateFactory editorStateFactory) { EditorStateFactory editorStateFactory) {
Font font = options.getFont(GhidraOptions.OPTION_BASE_FONT, DEFAULT_FONT); Font font = Gui.getFont(DEFAULT_FONT_ID);
for (ScreenElement element : OptionsGui.elements) { for (ScreenElement element : OptionsGui.elements) {
Color c = options.getColor(element.getColorOptionName(), element.getDefaultColor()); Color c = options.getColor(element.getColorOptionName(), element.getDefaultColor());
int style = options.getInt(element.getStyleOptionName(), -1); int style = options.getInt(element.getStyleOptionName(), -1);

View file

@ -22,6 +22,7 @@ import javax.swing.JTextPane;
import javax.swing.text.*; import javax.swing.text.*;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui;
import ghidra.framework.options.*; import ghidra.framework.options.*;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -202,7 +203,7 @@ public class ConsoleTextPane extends JTextPane implements OptionsChangeListener
} }
private void createAttribtues() { private void createAttribtues() {
createAttributes(new Font("monospaced", Font.PLAIN, 12)); createAttributes(Gui.getFont("font.monospaced"));
} }
private void createAttributes(Font font) { private void createAttributes(Font font) {

View file

@ -18,7 +18,6 @@ package ghidra.graph;
import static ghidra.graph.ProgramGraphType.*; import static ghidra.graph.ProgramGraphType.*;
import static ghidra.service.graph.VertexShape.*; import static ghidra.service.graph.VertexShape.*;
import generic.theme.GColor;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.service.graph.GraphDisplayOptions; import ghidra.service.graph.GraphDisplayOptions;
import ghidra.service.graph.VertexShape; import ghidra.service.graph.VertexShape;
@ -40,60 +39,64 @@ public class ProgramGraphDisplayOptions extends GraphDisplayOptions {
@Override @Override
protected void initializeDefaults() { protected void initializeDefaults() {
setDefaultVertexShape(ELLIPSE); setDefaultVertexShape(ELLIPSE);
setDefaultVertexColor(new GColor("color.bg.plugin.programgraph.vertex.default")); setDefaultVertexColor("color.bg.plugin.programgraph.vertex.default");
setDefaultEdgeColor(new GColor("color.bg.plugin.programgraph.edge.default")); setDefaultEdgeColor("color.bg.plugin.programgraph.edge.default");
setVertexSelectionColor("color.bg.plugin.programgraph.vertex.selection");
setEdgeSelectionColor("color.bg.plugin.programgraph.edge.selection");
setFavoredEdgeType(FALL_THROUGH); setFavoredEdgeType(FALL_THROUGH);
//@formatter:off //@formatter:off
configureVertexType(BODY, RECTANGLE, new GColor("color.bg.plugin.programgraph.vertex.body")); configureVertexType(BODY, RECTANGLE, "color.bg.plugin.programgraph.vertex.body");
configureVertexType(ENTRY, TRIANGLE_DOWN, new GColor("color.bg.plugin.programgraph.vertex.entry")); configureVertexType(ENTRY, TRIANGLE_DOWN, "color.bg.plugin.programgraph.vertex.entry");
configureVertexType(EXIT, TRIANGLE_UP, new GColor("color.bg.plugin.programgraph.vertex.exit")); configureVertexType(EXIT, TRIANGLE_UP, "color.bg.plugin.programgraph.vertex.exit");
configureVertexType(SWITCH, DIAMOND, new GColor("color.bg.plugin.programgraph.vertex.switch")); configureVertexType(SWITCH, DIAMOND, "color.bg.plugin.programgraph.vertex.switch");
configureVertexType(EXTERNAL, RECTANGLE, new GColor("color.bg.plugin.programgraph.vertex.external")); configureVertexType(EXTERNAL, RECTANGLE, "color.bg.plugin.programgraph.vertex.external");
configureVertexType(BAD, ELLIPSE, new GColor("color.bg.plugin.programgraph.vertex.bad")); configureVertexType(BAD, ELLIPSE, "color.bg.plugin.programgraph.vertex.bad");
configureVertexType(DATA, ELLIPSE, new GColor("color.bg.plugin.programgraph.vertex.data")); configureVertexType(DATA, ELLIPSE, "color.bg.plugin.programgraph.vertex.data");
configureVertexType(ENTRY_NEXUS, ELLIPSE, new GColor("color.bg.plugin.programgraph.vertex.entry.nexus")); configureVertexType(ENTRY_NEXUS, ELLIPSE, "color.bg.plugin.programgraph.vertex.entry.nexus");
configureVertexType(INSTRUCTION, VertexShape.HEXAGON, new GColor("color.bg.plugin.programgraph.vertex.instruction")); configureVertexType(INSTRUCTION, VertexShape.HEXAGON, "color.bg.plugin.programgraph.vertex.instruction");
configureVertexType(STACK, RECTANGLE, new GColor("color.bg.plugin.programgraph.vertex.stack")); configureVertexType(STACK, RECTANGLE, "color.bg.plugin.programgraph.vertex.stack");
configureEdgeType(ENTRY_EDGE, new GColor("color.bg.plugin.programgraph.edge.entry")); configureEdgeType(ENTRY_EDGE, "color.bg.plugin.programgraph.edge.entry");
configureEdgeType(FALL_THROUGH, new GColor("color.bg.plugin.programgraph.edge.fall.through")); configureEdgeType(FALL_THROUGH, "color.bg.plugin.programgraph.edge.fall.through");
configureEdgeType(UNCONDITIONAL_JUMP, new GColor("color.bg.plugin.programgraph.edge.jump.unconditional")); configureEdgeType(UNCONDITIONAL_JUMP, "color.bg.plugin.programgraph.edge.jump.unconditional");
configureEdgeType(UNCONDITIONAL_CALL, new GColor("color.bg.plugin.programgraph.edge.call.unconditional")); configureEdgeType(UNCONDITIONAL_CALL, "color.bg.plugin.programgraph.edge.call.unconditional");
configureEdgeType(TERMINATOR, new GColor("color.bg.plugin.programgraph.edge.terminator")); configureEdgeType(TERMINATOR, "color.bg.plugin.programgraph.edge.terminator");
configureEdgeType(JUMP_TERMINATOR, new GColor("color.bg.plugin.programgraph.edge.jump.terminator")); configureEdgeType(JUMP_TERMINATOR, "color.bg.plugin.programgraph.edge.jump.terminator");
configureEdgeType(INDIRECTION, new GColor("color.bg.plugin.programgraph.edge.indirection")); configureEdgeType(INDIRECTION, "color.bg.plugin.programgraph.edge.indirection");
configureEdgeType(CONDITIONAL_JUMP, new GColor("color.bg.plugin.programgraph.edge.jump.conditional")); configureEdgeType(CONDITIONAL_JUMP, "color.bg.plugin.programgraph.edge.jump.conditional");
configureEdgeType(CONDITIONAL_CALL, new GColor("color.bg.plugin.programgraph.edge.call.conditional")); configureEdgeType(CONDITIONAL_CALL, "color.bg.plugin.programgraph.edge.call.conditional");
configureEdgeType(CONDITIONAL_TERMINATOR, new GColor("color.bg.plugin.programgraph.edge.conditional.terminator")); configureEdgeType(CONDITIONAL_TERMINATOR, "color.bg.plugin.programgraph.edge.conditional.terminator");
configureEdgeType(CONDITIONAL_CALL_TERMINATOR, new GColor("color.bg.plugin.programgraph.edge.call.conditional.terminator")); configureEdgeType(CONDITIONAL_CALL_TERMINATOR, "color.bg.plugin.programgraph.edge.call.conditional.terminator");
configureEdgeType(COMPUTED_JUMP, new GColor("color.bg.plugin.programgraph.edge.jump.computed")); configureEdgeType(COMPUTED_JUMP, "color.bg.plugin.programgraph.edge.jump.computed");
configureEdgeType(COMPUTED_CALL, new GColor("color.bg.plugin.programgraph.edge.call.computed")); configureEdgeType(COMPUTED_CALL, "color.bg.plugin.programgraph.edge.call.computed");
configureEdgeType(COMPUTED_CALL_TERMINATOR, new GColor("color.bg.plugin.programgraph.edge.call.computed.terminator")); configureEdgeType(COMPUTED_CALL_TERMINATOR, "color.bg.plugin.programgraph.edge.call.computed.terminator");
configureEdgeType(CONDITIONAL_COMPUTED_CALL, new GColor("color.bg.plugin.programgraph.edge.call.conditional.computed")); configureEdgeType(CONDITIONAL_COMPUTED_CALL, "color.bg.plugin.programgraph.edge.call.conditional.computed");
configureEdgeType(CONDITIONAL_COMPUTED_JUMP, new GColor("color.bg.plugin.programgraph.edge.jump.conitional.computed")); configureEdgeType(CONDITIONAL_COMPUTED_JUMP, "color.bg.plugin.programgraph.edge.jump.conitional.computed");
configureEdgeType(CALL_OVERRIDE_UNCONDITIONAL, new GColor("color.bg.plugin.programgraph.edge.call.unconditional.override")); configureEdgeType(CALL_OVERRIDE_UNCONDITIONAL, "color.bg.plugin.programgraph.edge.call.unconditional.override");
configureEdgeType(JUMP_OVERRIDE_UNCONDITIONAL, new GColor("color.bg.plugin.programgraph.edge.jump.unconditional.override")); configureEdgeType(JUMP_OVERRIDE_UNCONDITIONAL, "color.bg.plugin.programgraph.edge.jump.unconditional.override");
configureEdgeType(CALLOTHER_OVERRIDE_CALL, new GColor("color.bg.plugin.programgraph.edge.call.callother.override")); configureEdgeType(CALLOTHER_OVERRIDE_CALL, "color.bg.plugin.programgraph.edge.call.callother.override");
configureEdgeType(CALLOTHER_OVERRIDE_JUMP, new GColor("color.bg.plugin.programgraph.edge.jump.callother.override")); configureEdgeType(CALLOTHER_OVERRIDE_JUMP, "color.bg.plugin.programgraph.edge.jump.callother.override");
configureEdgeType(READ, new GColor("color.bg.plugin.programgraph.edge.read")); configureEdgeType(READ, "color.bg.plugin.programgraph.edge.read");
configureEdgeType(WRITE, new GColor("color.bg.plugin.programgraph.edge.write")); configureEdgeType(WRITE, "color.bg.plugin.programgraph.edge.write");
configureEdgeType(READ_WRITE, new GColor("color.bg.plugin.programgraph.edge.read.write")); configureEdgeType(READ_WRITE, "color.bg.plugin.programgraph.edge.read.write");
configureEdgeType(UNKNOWN_DATA, new GColor("color.bg.plugin.programgraph.edge.data.unknown")); configureEdgeType(UNKNOWN_DATA, "color.bg.plugin.programgraph.edge.data.unknown");
configureEdgeType(EXTERNAL_REF, new GColor("color.bg.plugin.programgraph.edge.external.ref")); configureEdgeType(EXTERNAL_REF, "color.bg.plugin.programgraph.edge.external.ref");
configureEdgeType(READ_INDIRECT, new GColor("color.bg.plugin.programgraph.edge.read.indirect")); configureEdgeType(READ_INDIRECT, "color.bg.plugin.programgraph.edge.read.indirect");
configureEdgeType(WRITE_INDIRECT, new GColor("color.bg.plugin.programgraph.edge.write.indirect")); configureEdgeType(WRITE_INDIRECT, "color.bg.plugin.programgraph.edge.write.indirect");
configureEdgeType(READ_WRITE_INDIRECT, new GColor("color.bg.plugin.programgraph.edge.read.write.indirect")); configureEdgeType(READ_WRITE_INDIRECT, "color.bg.plugin.programgraph.edge.read.write.indirect");
configureEdgeType(DATA_INDIRECT, new GColor("color.bg.plugin.programgraph.edge.data.indirect")); configureEdgeType(DATA_INDIRECT, "color.bg.plugin.programgraph.edge.data.indirect");
configureEdgeType(PARAM, new GColor("color.bg.plugin.programgraph.edge.param")); configureEdgeType(PARAM, "color.bg.plugin.programgraph.edge.param");
configureEdgeType(THUNK, new GColor("color.bg.plugin.programgraph.edge.thunk")); configureEdgeType(THUNK, "color.bg.plugin.programgraph.edge.thunk");
setFont("font.plugin.programgraph");
//@formatter:on //@formatter:on
} }
} }

View file

@ -243,7 +243,7 @@ public class ImporterDialog extends DialogComponentProvider {
}); });
Font font = languageButton.getFont(); Font font = languageButton.getFont();
languageButton.setFont(new Font(font.getName(), Font.BOLD, font.getSize())); languageButton.setFont(font.deriveFont(Font.BOLD));
JPanel panel = new JPanel(new BorderLayout()); JPanel panel = new JPanel(new BorderLayout());
panel.add(languageTextField, BorderLayout.CENTER); panel.add(languageTextField, BorderLayout.CENTER);

View file

@ -309,7 +309,6 @@ public class OptionsDBTest extends AbstractGenericTest {
assertEquals(Palette.BLUE, options.getColor("Foo", null)); assertEquals(Palette.BLUE, options.getColor("Foo", null));
options.restoreDefaultValue("Foo"); options.restoreDefaultValue("Foo");
assertEquals(Palette.RED, options.getColor("Foo", null)); assertEquals(Palette.RED, options.getColor("Foo", null));
} }
@Test @Test

View file

@ -12,6 +12,7 @@ icon.bytepatterns.pattern.mining.analyzer = magnifier.png
icon.bytepatterns.function.bit.patterns.disabled = ledred.png icon.bytepatterns.function.bit.patterns.disabled = ledred.png
icon.bytepatterns.function.bit.patterns.enabled = ledgreen.png icon.bytepatterns.function.bit.patterns.enabled = ledgreen.png
font.bytepatterns.table = monospaced-PLAIN-16
[Dark Defaults] [Dark Defaults]

View file

@ -18,15 +18,13 @@
*/ */
package ghidra.bitpatterns.gui; package ghidra.bitpatterns.gui;
import java.awt.Font; import java.awt.Component;
import java.util.List; import java.util.List;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import docking.widgets.table.AbstractDynamicTableColumn; import docking.widgets.table.AbstractDynamicTableColumn;
import docking.widgets.table.TableColumnDescriptor; import docking.widgets.table.TableColumnDescriptor;
import docking.widgets.table.threaded.ThreadedTableModelStub; import docking.widgets.table.threaded.ThreadedTableModelStub;
import generic.theme.Gui;
import ghidra.bitpatterns.info.ByteSequenceRowObject; import ghidra.bitpatterns.info.ByteSequenceRowObject;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
@ -38,7 +36,7 @@ import ghidra.util.table.column.GColumnRenderer;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
public class ByteSequenceTableModel extends ThreadedTableModelStub<ByteSequenceRowObject> { public class ByteSequenceTableModel extends ThreadedTableModelStub<ByteSequenceRowObject> {
private static final int MONOSPACE_FONT_SIZE = 16; private static final String FONT_ID = "font.bytepatterns.table";
List<ByteSequenceRowObject> rowObjects; List<ByteSequenceRowObject> rowObjects;
public ByteSequenceTableModel(FunctionBitPatternsExplorerPlugin plugin, public ByteSequenceTableModel(FunctionBitPatternsExplorerPlugin plugin,
@ -51,10 +49,13 @@ public class ByteSequenceTableModel extends ThreadedTableModelStub<ByteSequenceR
* Displays the byte sequences in monospace font * Displays the byte sequences in monospace font
*/ */
protected GColumnRenderer<String> monospacedRenderer = new AbstractGColumnRenderer<String>() { protected GColumnRenderer<String> monospacedRenderer = new AbstractGColumnRenderer<String>() {
@Override @Override
protected void configureFont(JTable table, TableModel model, int column) { public Component getTableCellRendererComponent(
Font f = new Font("monospaced", getFixedWidthFont().getStyle(), MONOSPACE_FONT_SIZE); docking.widgets.table.GTableCellRenderingData data) {
setFont(f); Component component = super.getTableCellRendererComponent(data);
component.setFont(Gui.getFont(FONT_ID));
return component;
} }
@Override @Override

View file

@ -15,15 +15,13 @@
*/ */
package ghidra.bitpatterns.gui; package ghidra.bitpatterns.gui;
import java.awt.Font; import java.awt.Component;
import java.util.List; import java.util.List;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import docking.widgets.table.AbstractDynamicTableColumn; import docking.widgets.table.AbstractDynamicTableColumn;
import docking.widgets.table.TableColumnDescriptor; import docking.widgets.table.TableColumnDescriptor;
import docking.widgets.table.threaded.ThreadedTableModelStub; import docking.widgets.table.threaded.ThreadedTableModelStub;
import generic.theme.Gui;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.util.datastruct.Accumulator; import ghidra.util.datastruct.Accumulator;
@ -42,12 +40,13 @@ public class ClosedPatternTableModel extends ThreadedTableModelStub<ClosedPatter
private List<ClosedPatternRowObject> rowObjects; private List<ClosedPatternRowObject> rowObjects;
private static final String MODEL_NAME = "Closed Patterns"; private static final String MODEL_NAME = "Closed Patterns";
private static final int MONOSPACE_FONT_SIZE = 16;
protected static final String FONT_ID = "font.bytepatterns.table";
/** /**
* Creates a table model for closed patterns mined from byte sequences * Creates a table model for closed patterns mined from byte sequences
* @param rowObjects * @param rowObjects the row objects
* @param serviceProvider * @param serviceProvider the service provider
*/ */
public ClosedPatternTableModel(List<ClosedPatternRowObject> rowObjects, public ClosedPatternTableModel(List<ClosedPatternRowObject> rowObjects,
ServiceProvider serviceProvider) { ServiceProvider serviceProvider) {
@ -57,11 +56,12 @@ public class ClosedPatternTableModel extends ThreadedTableModelStub<ClosedPatter
} }
protected GColumnRenderer<String> monospacedRenderer = new AbstractGColumnRenderer<String>() { protected GColumnRenderer<String> monospacedRenderer = new AbstractGColumnRenderer<String>() {
@Override public java.awt.Component getTableCellRendererComponent(
protected void configureFont(JTable table, TableModel model, int column) { docking.widgets.table.GTableCellRenderingData data) {
Font f = new Font("monospaced", getFixedWidthFont().getStyle(), MONOSPACE_FONT_SIZE); Component component = super.getTableCellRendererComponent(data);
setFont(f); component.setFont(Gui.getFont(FONT_ID));
} return component;
};
@Override @Override
public String getFilterString(String t, Settings settings) { public String getFilterString(String t, Settings settings) {

View file

@ -15,14 +15,12 @@
*/ */
package ghidra.bitpatterns.gui; package ghidra.bitpatterns.gui;
import java.awt.Font; import java.awt.Component;
import java.util.List; import java.util.List;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import docking.widgets.table.AbstractDynamicTableColumn; import docking.widgets.table.AbstractDynamicTableColumn;
import docking.widgets.table.TableColumnDescriptor; import docking.widgets.table.TableColumnDescriptor;
import generic.theme.Gui;
import ghidra.bitpatterns.info.PatternEvalRowObject; import ghidra.bitpatterns.info.PatternEvalRowObject;
import ghidra.bitpatterns.info.PatternMatchType; import ghidra.bitpatterns.info.PatternMatchType;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
@ -37,7 +35,7 @@ import ghidra.util.table.column.GColumnRenderer;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
public class PatternEvalTabelModel extends AddressBasedTableModel<PatternEvalRowObject> { public class PatternEvalTabelModel extends AddressBasedTableModel<PatternEvalRowObject> {
private static final int MONOSPACE_FONT_SIZE = 14; protected static final String FONT_ID = "font.bytepatterns.table";
private List<PatternEvalRowObject> rowObjects; private List<PatternEvalRowObject> rowObjects;
/** /**
@ -62,10 +60,11 @@ public class PatternEvalTabelModel extends AddressBasedTableModel<PatternEvalRow
protected final GColumnRenderer<String> monospacedRenderer = protected final GColumnRenderer<String> monospacedRenderer =
new AbstractGColumnRenderer<String>() { new AbstractGColumnRenderer<String>() {
@Override @Override
protected void configureFont(JTable table, TableModel model, int column) { public java.awt.Component getTableCellRendererComponent(
Font f = docking.widgets.table.GTableCellRenderingData data) {
new Font("monospaced", getFixedWidthFont().getStyle(), MONOSPACE_FONT_SIZE); Component component = super.getTableCellRendererComponent(data);
setFont(f); component.setFont(Gui.getFont(FONT_ID));
return component;
} }
@Override @Override

View file

@ -15,14 +15,12 @@
*/ */
package ghidra.bitpatterns.gui; package ghidra.bitpatterns.gui;
import java.awt.Font; import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import docking.widgets.table.AbstractDynamicTableColumn; import docking.widgets.table.AbstractDynamicTableColumn;
import docking.widgets.table.TableColumnDescriptor; import docking.widgets.table.TableColumnDescriptor;
import docking.widgets.table.threaded.ThreadedTableModelStub; import docking.widgets.table.threaded.ThreadedTableModelStub;
import generic.theme.Gui;
import ghidra.bitpatterns.info.PatternType; import ghidra.bitpatterns.info.PatternType;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
@ -42,7 +40,7 @@ public class PatternInfoTableModel extends ThreadedTableModelStub<PatternInfoRow
private FunctionBitPatternsExplorerPlugin plugin; private FunctionBitPatternsExplorerPlugin plugin;
private static final int NOTE_COLUMN = 2; private static final int NOTE_COLUMN = 2;
private static final int ALIGNMENT_COLUMN = 5; private static final int ALIGNMENT_COLUMN = 5;
private static final int MONOSPACE_FONT_SIZE = 14; protected static final String FONT_ID = "font.bytepatterns.table";
public PatternInfoTableModel(FunctionBitPatternsExplorerPlugin plugin) { public PatternInfoTableModel(FunctionBitPatternsExplorerPlugin plugin) {
super(MODEL_NAME, plugin.getTool()); super(MODEL_NAME, plugin.getTool());
@ -56,10 +54,11 @@ public class PatternInfoTableModel extends ThreadedTableModelStub<PatternInfoRow
} }
protected GColumnRenderer<String> monospacedRenderer = new AbstractGColumnRenderer<String>() { protected GColumnRenderer<String> monospacedRenderer = new AbstractGColumnRenderer<String>() {
@Override public Component getTableCellRendererComponent(
protected void configureFont(JTable table, TableModel model, int column) { docking.widgets.table.GTableCellRenderingData data) {
Font f = new Font("monospaced", getFixedWidthFont().getStyle(), MONOSPACE_FONT_SIZE); Component component = super.getTableCellRendererComponent(data);
setFont(f); component.setFont(Gui.getFont(FONT_ID));
return component;
} }
@Override @Override

View file

@ -3,15 +3,17 @@
color.bg.byteviewer = color.bg color.bg.byteviewer = color.bg
color.bg.byteviewer.highlight = yellow color.bg.byteviewer.highlight = yellow
color.fg.byteviewer.novalue = blue color.fg.byteviewer.separator = blue
color.fg.byteviewer.changed = red color.fg.byteviewer.changed = red
color.cursor.focused.byteviewer.current = color.cursor.focused color.cursor.byteviewer.focused.active = color.cursor.focused
color.cursor.focused.byteviewer.noncurrent = black color.cursor.byteviewer.focused.not.active = black
color.cursor.unfocused.byteviewer = color.cursor.unfocused color.cursor.byteviewer.unfocused = color.cursor.unfocused
icon.plugin.byteviewer.provider = binaryData.gif icon.plugin.byteviewer.provider = binaryData.gif
icon.plugin.byteviewer.options = wrench.png icon.plugin.byteviewer.options = wrench.png
font.byteviewer = font.monospaced
font.byteviewer.header = SansSerif-PLAIN-11
font.byteviewer.status = SansSerif-PLAIN-11
[Dark Defaults] [Dark Defaults]

View file

@ -730,9 +730,9 @@ public class ByteViewerComponent extends FieldPanel implements FieldMouseListene
createFields(); createFields();
setCursorOn(true); setCursorOn(true);
editColor = ByteViewerComponentProvider.DEFAULT_EDIT_COLOR; editColor = ByteViewerComponentProvider.CHANGED_VALUE_COLOR;
currentCursorColor = ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR; currentCursorColor = ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR;
setNonFocusCursorColor(ByteViewerComponentProvider.DEFAULT_NONFOCUS_CURSOR_COLOR); setNonFocusCursorColor(ByteViewerComponentProvider.CURSOR_NOT_FOCUSED_COLOR);
setFocusedCursorColor(currentCursorColor); setFocusedCursorColor(currentCursorColor);
updateColorRunner = () -> updateColor(); updateColorRunner = () -> updateColor();

View file

@ -25,8 +25,7 @@ import java.util.List;
import javax.swing.JComponent; import javax.swing.JComponent;
import docking.action.ToggleDockingAction; import docking.action.ToggleDockingAction;
import generic.theme.GColor; import generic.theme.*;
import generic.theme.GIcon;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES; import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES;
import ghidra.app.plugin.core.format.*; import ghidra.app.plugin.core.format.*;
@ -54,42 +53,40 @@ public abstract class ByteViewerComponentProvider extends ComponentProviderAdapt
private static final String OFFSET_NAME = "Offset"; private static final String OFFSET_NAME = "Offset";
static final int DEFAULT_NUMBER_OF_CHARS = 8; static final int DEFAULT_NUMBER_OF_CHARS = 8;
static final Font DEFAULT_FONT = new Font("Monospaced", Font.PLAIN, 12); static final String DEFAULT_FONT_ID = "font.byteviewer";
static final int DEFAULT_BYTES_PER_LINE = 16; static final int DEFAULT_BYTES_PER_LINE = 16;
//@formatter:off //@formatter:off
static final String FG = "byteviewer.color.fg"; static final String FG = "byteviewer.color.fg";
static final String CURSOR = "byteviewer.color.cursor"; static final String CURSOR = "byteviewer.color.cursor";
static final Color DEFAULT_MISSING_VALUE_COLOR = new GColor("color.fg.byteviewer.novalue");
static final Color DEFAULT_EDIT_COLOR = new GColor("color.fg.byteviewer.changed");
static final Color DEFAULT_CURRENT_CURSOR_COLOR = new GColor("color.cursor.focused.byteviewer.current");
static final Color DEFAULT_CURSOR_COLOR = new GColor("color.cursor.focused.byteviewer.noncurrent");
static final Color DEFAULT_NONFOCUS_CURSOR_COLOR = new GColor("color.cursor.unfocused.byteviewer");
//@formatter:on
private static final Color DEFAULT_CURSOR_LINE_COLOR = GhidraOptions.DEFAULT_CURSOR_LINE_COLOR; static final Color SEPARATOR_COLOR = new GColor("color.fg.byteviewer.separator");
static final Color CHANGED_VALUE_COLOR = new GColor("color.fg.byteviewer.changed");
static final Color CURSOR_ACTIVE_COLOR = new GColor("color.cursor.byteviewer.focused.active");
static final Color CURSOR_NON_ACTIVE_COLOR = new GColor("color.cursor.byteviewer.focused.not.active");
static final Color CURSOR_NOT_FOCUSED_COLOR = new GColor("color.cursor.byteviewer.unfocused");
static final Color CURRENT_LINE_COLOR = GhidraOptions.DEFAULT_CURSOR_LINE_COLOR;
//@formatter:on
static final String DEFAULT_INDEX_NAME = "Addresses"; static final String DEFAULT_INDEX_NAME = "Addresses";
static final String OPTION_EDIT_COLOR = "Edit Cursor Color"; static final String SEPARATOR_COLOR_OPTION_NAME = "Block Separator Color";
static final String OPTION_SEPARATOR_COLOR = "Block Separator Color"; static final String CHANGED_VALUE_COLOR_OPTION_NAME = "Changed Values Color";
static final String OPTION_CURRENT_VIEW_CURSOR_COLOR = "Current View Cursor Color"; static final String CURSOR_ACTIVE_COLOR_OPTION_NAME = "Active Cursor Color";
static final String OPTION_CURSOR_COLOR = "Cursor Color"; static final String CURSOR_NON_ACTIVE_COLOR_OPTION_NAME = "Non-Active Cursor Color";
static final String CURSOR_NOT_FOCUSED_COLOR_OPTION_NAME = "Non-Focused Cursor Color";
static final String OPTION_FONT = "Font"; static final String OPTION_FONT = "Font";
static final String OPTION_NONFOCUS_CURSOR_COLOR = "Non-Focus Cursor Color";
private static final String DEFAULT_VIEW = "Hex"; private static final String DEFAULT_VIEW = "Hex";
private static final String OPTION_CURRENT_LINE_COLOR = private static final String CURRENT_LINE_COLOR_OPTION_NAME =
GhidraOptions.HIGHLIGHT_CURSOR_LINE_COLOR_OPTION_NAME; GhidraOptions.HIGHLIGHT_CURSOR_LINE_COLOR_OPTION_NAME;
private static final String OPTION_HIGHLIGHT_CURSOR_LINE = private static final String OPTION_HIGHLIGHT_CURSOR_LINE =
GhidraOptions.HIGHLIGHT_CURSOR_LINE_OPTION_NAME; GhidraOptions.HIGHLIGHT_CURSOR_LINE_OPTION_NAME;
protected ByteViewerPanel panel; protected ByteViewerPanel panel;
private Color editColor;
private Color currentCursorColor;
private Color defaultCursorColor;
private int bytesPerLine; private int bytesPerLine;
private int offset; private int offset;
private int hexGroupSize = 1; private int hexGroupSize = 1;
@ -174,26 +171,7 @@ public abstract class ByteViewerComponentProvider extends ComponentProviderAdapt
public void optionsChanged(ToolOptions options, String optionName, Object oldValue, public void optionsChanged(ToolOptions options, String optionName, Object oldValue,
Object newValue) { Object newValue) {
if (options.getName().equals("ByteViewer")) { if (options.getName().equals("ByteViewer")) {
if (optionName.equals(OPTION_FONT)) {
if (optionName.equals(OPTION_CURRENT_VIEW_CURSOR_COLOR)) {
panel.setCurrentCursorColor((Color) newValue);
}
else if (optionName.equals(OPTION_CURSOR_COLOR)) {
panel.setCursorColor((Color) newValue);
}
else if (optionName.equals(OPTION_CURRENT_LINE_COLOR)) {
panel.setCurrentCursorLineColor((Color) newValue);
}
else if (optionName.equals(OPTION_EDIT_COLOR)) {
panel.setEditColor((Color) newValue);
}
else if (optionName.equals(OPTION_SEPARATOR_COLOR)) {
panel.setSeparatorColor((Color) newValue);
}
else if (optionName.equals(OPTION_NONFOCUS_CURSOR_COLOR)) {
panel.setNonFocusCursorColor((Color) newValue);
}
else if (optionName.equals(OPTION_FONT)) {
setFont(SystemUtilities.adjustForFontSizeOverride((Font) newValue)); setFont(SystemUtilities.adjustForFontSizeOverride((Font) newValue));
} }
} }
@ -220,48 +198,45 @@ public abstract class ByteViewerComponentProvider extends ComponentProviderAdapt
HelpLocation help = new HelpLocation("ByteViewerPlugin", "Option"); HelpLocation help = new HelpLocation("ByteViewerPlugin", "Option");
opt.setOptionsHelpLocation(help); opt.setOptionsHelpLocation(help);
opt.registerOption(OPTION_SEPARATOR_COLOR, DEFAULT_MISSING_VALUE_COLOR, help, opt.registerOption(SEPARATOR_COLOR_OPTION_NAME, SEPARATOR_COLOR, help,
"Color used for separator shown between memory blocks."); "Color used for separator shown between memory blocks.");
opt.registerOption(OPTION_SEPARATOR_COLOR, DEFAULT_MISSING_VALUE_COLOR, help,
"Color used for separator shown between memory blocks."); opt.registerOption(CHANGED_VALUE_COLOR_OPTION_NAME, CHANGED_VALUE_COLOR,
opt.registerOption(OPTION_EDIT_COLOR, DEFAULT_EDIT_COLOR,
new HelpLocation("ByteViewerPlugin", "EditColor"), new HelpLocation("ByteViewerPlugin", "EditColor"),
"Color of cursor when the current view is in edit mode and can support editing."); "Color of changed bytes when editing.");
opt.registerOption(OPTION_CURRENT_VIEW_CURSOR_COLOR, DEFAULT_CURRENT_CURSOR_COLOR, help,
"Color of cursor when it is in the current view."); opt.registerOption(CURSOR_ACTIVE_COLOR_OPTION_NAME, CURSOR_ACTIVE_COLOR,
opt.registerOption(OPTION_NONFOCUS_CURSOR_COLOR, DEFAULT_NONFOCUS_CURSOR_COLOR, help, help, "Color of cursor in the active view.");
"Color of cursor when it is not the current view.");
opt.registerOption(OPTION_CURSOR_COLOR, DEFAULT_CURSOR_COLOR, help, opt.registerOption(CURSOR_NON_ACTIVE_COLOR_OPTION_NAME,
"Color of cursor for other views other than the current view."); CURSOR_NON_ACTIVE_COLOR,
opt.registerOption(OPTION_FONT, DEFAULT_FONT, help, "Font used in the views."); help, "Color of cursor in the non-active views.");
opt.registerOption(OPTION_CURRENT_LINE_COLOR, DEFAULT_CURSOR_LINE_COLOR, help,
opt.registerOption(CURSOR_NOT_FOCUSED_COLOR_OPTION_NAME,
CURSOR_NOT_FOCUSED_COLOR,
help, "Color of cursor when the byteview does not have focus.");
opt.registerOption(CURRENT_LINE_COLOR_OPTION_NAME,
GhidraOptions.DEFAULT_CURSOR_LINE_COLOR, help,
"Color of the line containing the cursor"); "Color of the line containing the cursor");
opt.registerOption(OPTION_FONT, OptionType.FONT_TYPE, DEFAULT_FONT_ID, help,
"Font used in the views.");
opt.registerOption(OPTION_HIGHLIGHT_CURSOR_LINE, true, help, opt.registerOption(OPTION_HIGHLIGHT_CURSOR_LINE, true, help,
"Toggles highlighting background color of line containing the cursor"); "Toggles highlighting background color of line containing the cursor");
Color missingValueColor = opt.getColor(OPTION_SEPARATOR_COLOR, DEFAULT_MISSING_VALUE_COLOR); Color missingValueColor = opt.getColor(SEPARATOR_COLOR_OPTION_NAME, SEPARATOR_COLOR);
panel.setSeparatorColor(missingValueColor); panel.setSeparatorColor(missingValueColor);
editColor = opt.getColor(OPTION_EDIT_COLOR, DEFAULT_EDIT_COLOR); panel.setCurrentCursorColor(CURSOR_ACTIVE_COLOR);
currentCursorColor = panel.setNonFocusCursorColor(CURSOR_NOT_FOCUSED_COLOR);
opt.getColor(OPTION_CURRENT_VIEW_CURSOR_COLOR, DEFAULT_CURRENT_CURSOR_COLOR); panel.setCursorColor(CURSOR_NON_ACTIVE_COLOR);
panel.setCurrentCursorColor(currentCursorColor); panel.setCurrentCursorLineColor(CURRENT_LINE_COLOR);
Color nonFocusCursorColor = Font font = Gui.getFont(DEFAULT_FONT_ID);
opt.getColor(OPTION_NONFOCUS_CURSOR_COLOR, DEFAULT_NONFOCUS_CURSOR_COLOR);
panel.setNonFocusCursorColor(nonFocusCursorColor);
defaultCursorColor = opt.getColor(OPTION_CURSOR_COLOR, DEFAULT_CURSOR_COLOR);
panel.setCursorColor(defaultCursorColor);
Color cursorLineColor = opt.getColor(OPTION_CURRENT_LINE_COLOR, DEFAULT_CURSOR_LINE_COLOR);
panel.setCurrentCursorLineColor(cursorLineColor);
Font font =
SystemUtilities.adjustForFontSizeOverride(opt.getFont(OPTION_FONT, DEFAULT_FONT));
FontMetrics fm = panel.getFontMetrics(font); FontMetrics fm = panel.getFontMetrics(font);
panel.restoreConfigState(fm, editColor); panel.restoreConfigState(fm, CHANGED_VALUE_COLOR);
opt.addOptionsChangeListener(this); opt.addOptionsChangeListener(this);
@ -279,6 +254,7 @@ public abstract class ByteViewerComponentProvider extends ComponentProviderAdapt
/** /**
* Set the offset that is applied to each block. * Set the offset that is applied to each block.
* @param blockOffset the new block offset
*/ */
void setBlockOffset(int blockOffset) { void setBlockOffset(int blockOffset) {
if (blockOffset == offset) { if (blockOffset == offset) {
@ -311,6 +287,7 @@ public abstract class ByteViewerComponentProvider extends ComponentProviderAdapt
/** /**
* Get the number of bytes displayed in a line. * Get the number of bytes displayed in a line.
* @return the number of bytes displayed in a line
*/ */
int getBytesPerLine() { int getBytesPerLine() {
return bytesPerLine; return bytesPerLine;
@ -318,13 +295,14 @@ public abstract class ByteViewerComponentProvider extends ComponentProviderAdapt
/** /**
* Get the offset that should be applied to each byte block. * Get the offset that should be applied to each byte block.
* @return the offset that should be applied to each byte block
*/ */
int getOffset() { int getOffset() {
return offset; return offset;
} }
Color getCursorColor() { Color getCursorColor() {
return defaultCursorColor; return CURSOR_NON_ACTIVE_COLOR;
} }
int getGroupSize() { int getGroupSize() {

View file

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,8 +15,6 @@
*/ */
package ghidra.app.plugin.core.byteviewer; package ghidra.app.plugin.core.byteviewer;
import ghidra.util.table.GhidraTable;
import java.awt.*; import java.awt.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
@ -26,6 +23,9 @@ import javax.swing.*;
import javax.swing.event.TableColumnModelListener; import javax.swing.event.TableColumnModelListener;
import javax.swing.table.*; import javax.swing.table.*;
import generic.theme.Gui;
import ghidra.util.table.GhidraTable;
/** /**
* JTableHeader that uses the default table column model to manage * JTableHeader that uses the default table column model to manage
* TableColumns. Sizes the column according to its corresponding viewer * TableColumns. Sizes the column according to its corresponding viewer
@ -33,6 +33,7 @@ import javax.swing.table.*;
*/ */
class ByteViewerHeader extends JTableHeader implements Scrollable { class ByteViewerHeader extends JTableHeader implements Scrollable {
private static final String FONT_ID = "font.byteviewer.header";
private TableColumnModel columnModel; private TableColumnModel columnModel;
private Component container; private Component container;
@ -50,8 +51,7 @@ class ByteViewerHeader extends JTableHeader implements Scrollable {
this.container = container; this.container = container;
components = new HashMap<Component, TableColumn>(); components = new HashMap<Component, TableColumn>();
Font font = new Font("Tahoma", Font.PLAIN, 11); Gui.registerFont(this, FONT_ID);
setFont(font);
setResizingAllowed(false); setResizingAllowed(false);
table = new GhidraTable(); table = new GhidraTable();
setTable(table); setTable(table);

View file

@ -32,6 +32,7 @@ import docking.widgets.indexedscrollpane.*;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui;
import ghidra.app.plugin.core.format.*; import ghidra.app.plugin.core.format.*;
import ghidra.app.util.viewer.listingpanel.AddressSetDisplayListener; import ghidra.app.util.viewer.listingpanel.AddressSetDisplayListener;
import ghidra.program.model.address.AddressSet; import ghidra.program.model.address.AddressSet;
@ -45,11 +46,12 @@ import help.Help;
import help.HelpService; import help.HelpService;
/** /**
* Top level component that contains has a scrolled pane for the panel of components that show the * Top level component that has a scrolled pane for the panel of components that show the
* view for each format. * view for each format.
*/ */
public class ByteViewerPanel extends JPanel public class ByteViewerPanel extends JPanel
implements TableColumnModelListener, LayoutModel, LayoutListener { implements TableColumnModelListener, LayoutModel, LayoutListener {
private static final String FONT_STATUS_ID = "font.byteviewer.status";
// private ByteViewerPlugin plugin; // private ByteViewerPlugin plugin;
private List<ByteViewerComponent> viewList; // list of field viewers private List<ByteViewerComponent> viewList; // list of field viewers
private FieldPanel indexPanel; // panel for showing indexes private FieldPanel indexPanel; // panel for showing indexes
@ -94,7 +96,7 @@ public class ByteViewerPanel extends JPanel
viewList = new ArrayList<>(); viewList = new ArrayList<>();
indexMap = new IndexMap(); indexMap = new IndexMap();
create(); create();
editColor = ByteViewerComponentProvider.DEFAULT_EDIT_COLOR; editColor = ByteViewerComponentProvider.CHANGED_VALUE_COLOR;
} }
/** /**
@ -812,7 +814,7 @@ public class ByteViewerPanel extends JPanel
columnHeader = new ByteViewerHeader(this); columnHeader = new ByteViewerHeader(this);
fm = getFontMetrics(ByteViewerComponentProvider.DEFAULT_FONT); fm = getFontMetrics(Gui.getFont(ByteViewerComponentProvider.DEFAULT_FONT_ID));
fontHeight = fm.getHeight(); fontHeight = fm.getHeight();
// for the index/address column // for the index/address column
@ -864,15 +866,14 @@ public class ByteViewerPanel extends JPanel
insertionField = new GDLabel("00000000"); insertionField = new GDLabel("00000000");
insertionField.setName("Insertion"); insertionField.setName("Insertion");
Font f = new Font("SansSerif", Font.PLAIN, 11); Gui.registerFont(startLabel, FONT_STATUS_ID);
startLabel.setFont(f); Gui.registerFont(endLabel, FONT_STATUS_ID);
endLabel.setFont(f); Gui.registerFont(offsetLabel, FONT_STATUS_ID);
offsetLabel.setFont(f); Gui.registerFont(insertionLabel, FONT_STATUS_ID);
insertionLabel.setFont(f); Gui.registerFont(startField, FONT_STATUS_ID);
startField.setFont(f); Gui.registerFont(endField, FONT_STATUS_ID);
endField.setFont(f); Gui.registerFont(offsetField, FONT_STATUS_ID);
offsetField.setFont(f); Gui.registerFont(insertionField, FONT_STATUS_ID);
insertionField.setFont(f);
// make a panel for each label/value pair // make a panel for each label/value pair
JPanel p1 = new JPanel(new PairLayout(0, 5)); JPanel p1 = new JPanel(new PairLayout(0, 5));

View file

@ -61,8 +61,8 @@ class FieldFactory {
this.highlightFactory = new SimpleHighlightFactory(highlightProvider); this.highlightFactory = new SimpleHighlightFactory(highlightProvider);
charWidth = fm.charWidth('W'); charWidth = fm.charWidth('W');
width = charWidth * model.getDataUnitSymbolSize(); width = charWidth * model.getDataUnitSymbolSize();
editColor = ByteViewerComponentProvider.DEFAULT_EDIT_COLOR; editColor = ByteViewerComponentProvider.CHANGED_VALUE_COLOR;
separatorColor = ByteViewerComponentProvider.DEFAULT_MISSING_VALUE_COLOR; separatorColor = ByteViewerComponentProvider.SEPARATOR_COLOR;
unitByteSize = model.getUnitByteSize(); unitByteSize = model.getUnitByteSize();
} }

View file

@ -48,7 +48,7 @@ class IndexFieldFactory {
charWidth = fm.charWidth('W'); charWidth = fm.charWidth('W');
width = ByteViewerComponentProvider.DEFAULT_NUMBER_OF_CHARS * charWidth; width = ByteViewerComponentProvider.DEFAULT_NUMBER_OF_CHARS * charWidth;
missingValueColor = ByteViewerComponentProvider.DEFAULT_MISSING_VALUE_COLOR; missingValueColor = ByteViewerComponentProvider.SEPARATOR_COLOR;
} }
/** /**

View file

@ -157,7 +157,8 @@ public class ByteViewerConnectedToolBehaviorTest extends AbstractGhidraHeadedInt
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
final ByteViewerComponent c = panelOne.getCurrentComponent(); final ByteViewerComponent c = panelOne.getCurrentComponent();
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR,
c.getFocusedCursorColor());
runSwing(() -> { runSwing(() -> {
KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_1, '1'); KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_1, '1');
c.keyPressed(ev, loc.getIndex(), loc.getFieldNum(), loc.getRow(), loc.getCol(), c.keyPressed(ev, loc.getIndex(), loc.getFieldNum(), loc.getRow(), loc.getCol(),
@ -167,7 +168,7 @@ public class ByteViewerConnectedToolBehaviorTest extends AbstractGhidraHeadedInt
ByteViewerComponent c2 = panel2.getCurrentComponent(); ByteViewerComponent c2 = panel2.getCurrentComponent();
ByteField f2 = c2.getField(BigInteger.ZERO, 0); ByteField f2 = c2.getField(BigInteger.ZERO, 0);
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, f2.getForeground()); assertEquals(ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR, f2.getForeground());
} }
@Test @Test
@ -188,7 +189,8 @@ public class ByteViewerConnectedToolBehaviorTest extends AbstractGhidraHeadedInt
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
final ByteViewerComponent c = panelOne.getCurrentComponent(); final ByteViewerComponent c = panelOne.getCurrentComponent();
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR,
c.getFocusedCursorColor());
runSwing(() -> { runSwing(() -> {
KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_1, '1'); KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_1, '1');
c.keyPressed(ev, loc.getIndex(), loc.getFieldNum(), loc.getRow(), loc.getCol(), c.keyPressed(ev, loc.getIndex(), loc.getFieldNum(), loc.getRow(), loc.getCol(),
@ -198,7 +200,7 @@ public class ByteViewerConnectedToolBehaviorTest extends AbstractGhidraHeadedInt
ByteViewerComponent c2 = panel2.getCurrentComponent(); ByteViewerComponent c2 = panel2.getCurrentComponent();
ByteField f2 = c2.getField(BigInteger.ZERO, 0); ByteField f2 = c2.getField(BigInteger.ZERO, 0);
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, f2.getForeground()); assertEquals(ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR, f2.getForeground());
undo(program); undo(program);

View file

@ -148,7 +148,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
final ByteViewerComponent c = panel.getCurrentComponent(); final ByteViewerComponent c = panel.getCurrentComponent();
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, c.getFocusedCursorColor());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_A, 'a'); KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_A, 'a');
@ -157,7 +157,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
}); });
program.flushEvents(); program.flushEvents();
assertEquals((byte) 0xa0, program.getMemory().getByte(getAddr(0x01001000))); assertEquals((byte) 0xa0, program.getMemory().getByte(getAddr(0x01001000)));
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR,
((ByteField) c.getCurrentField()).getForeground()); ((ByteField) c.getCurrentField()).getForeground());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
@ -165,7 +165,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
action.actionPerformed(new ActionContext()); action.actionPerformed(new ActionContext());
}); });
assertTrue(!action.isSelected()); assertTrue(!action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR, assertEquals(ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR,
c.getFocusedCursorColor()); c.getFocusedCursorColor());
} }
@ -192,7 +192,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
final ByteViewerComponent c = panel.getCurrentComponent(); final ByteViewerComponent c = panel.getCurrentComponent();
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, c.getFocusedCursorColor());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_A, 'a'); KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_A, 'a');
@ -205,7 +205,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
assertEquals(b, program.getMemory().getByte(addr)); assertEquals(b, program.getMemory().getByte(addr));
Color fg = ((ByteField) c.getCurrentField()).getForeground(); Color fg = ((ByteField) c.getCurrentField()).getForeground();
if (fg != null) { if (fg != null) {
assertEquals(ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR, fg); assertEquals(ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR, fg);
} }
Window w = windowForComponent(plugin.getProvider().getComponent()); Window w = windowForComponent(plugin.getProvider().getComponent());
String str = findLabelStr(w, "Tool Status"); String str = findLabelStr(w, "Tool Status");
@ -251,7 +251,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
assertEquals((byte) 0xa0, program.getMemory().getByte(addr)); assertEquals((byte) 0xa0, program.getMemory().getByte(addr));
FieldLocation loc = getFieldLocation(addr); FieldLocation loc = getFieldLocation(addr);
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
} }
@ -296,21 +296,21 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
assertEquals((byte) 0xa0, program.getMemory().getByte(addr)); assertEquals((byte) 0xa0, program.getMemory().getByte(addr));
FieldLocation loc = getFieldLocation(addr); FieldLocation loc = getFieldLocation(addr);
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
final ByteViewerComponent asciiC = findComponent(panel, "Ascii"); final ByteViewerComponent asciiC = findComponent(panel, "Ascii");
SwingUtilities.invokeAndWait(() -> panel.setCurrentView(asciiC)); SwingUtilities.invokeAndWait(() -> panel.setCurrentView(asciiC));
loc = getFieldLocation(addr); loc = getFieldLocation(addr);
field = asciiC.getField(loc.getIndex(), loc.getFieldNum()); field = asciiC.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
final ByteViewerComponent hexIntC = findComponent(panel, "HexInteger"); final ByteViewerComponent hexIntC = findComponent(panel, "HexInteger");
SwingUtilities.invokeAndWait(() -> panel.setCurrentView(hexIntC)); SwingUtilities.invokeAndWait(() -> panel.setCurrentView(hexIntC));
loc = getFieldLocation(addr); loc = getFieldLocation(addr);
field = asciiC.getField(loc.getIndex(), loc.getFieldNum()); field = asciiC.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
} }
@Test @Test
@ -346,7 +346,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
Color fg = field.getForeground(); Color fg = field.getForeground();
assertTrue(fg == null || assertTrue(fg == null ||
ByteViewerComponentProvider.DEFAULT_CURSOR_COLOR == field.getForeground()); ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR == field.getForeground());
redo(program); redo(program);
program.flushEvents(); program.flushEvents();
@ -354,7 +354,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
// field color should show edit color // field color should show edit color
loc = getFieldLocation(addr); loc = getFieldLocation(addr);
field = c.getField(loc.getIndex(), loc.getFieldNum()); field = c.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
} }
@ -404,19 +404,19 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
FieldLocation loc2 = new FieldLocation(0, 1, 0, 0); // second byte on first line FieldLocation loc2 = new FieldLocation(0, 1, 0, 0); // second byte on first line
undo(program); undo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc2, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
undo(program); undo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc2, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
undo(program); undo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, null); testFieldColor(loc2, null);
undo(program); undo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, null); testFieldColor(loc2, null);
undo(program); undo(program);
@ -425,24 +425,24 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
assertTrue(!program.canUndo()); assertTrue(!program.canUndo());
redo(program); redo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, null); testFieldColor(loc2, null);
redo(program); redo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, null); testFieldColor(loc2, null);
redo(program); redo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc2, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
redo(program); redo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc2, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
redo(program); redo(program);
testFieldColor(loc1, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc1, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
testFieldColor(loc2, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); testFieldColor(loc2, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
assertTrue(program.canUndo()); assertTrue(program.canUndo());
} }
@ -493,14 +493,14 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
Color fg = field.getForeground(); Color fg = field.getForeground();
assertTrue(fg == null || assertTrue(fg == null ||
ByteViewerComponentProvider.DEFAULT_CURSOR_COLOR == field.getForeground()); ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR == field.getForeground());
redo(program); redo(program);
// field color should show edit color // field color should show edit color
loc = getFieldLocation(addr); loc = getFieldLocation(addr);
field = c.getField(loc.getIndex(), loc.getFieldNum()); field = c.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
} }
@ -558,10 +558,10 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
Color fg = field.getForeground(); Color fg = field.getForeground();
if (i == 4) { if (i == 4) {
assertTrue(fg == null || assertTrue(fg == null ||
ByteViewerComponentProvider.DEFAULT_CURSOR_COLOR == field.getForeground()); ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR == field.getForeground());
} }
else { else {
assertEquals(fg, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); assertEquals(fg, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
} }
} }
assertTrue(!program.canUndo()); assertTrue(!program.canUndo());
@ -573,7 +573,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
FieldLocation loc = c.getCursorLocation(); FieldLocation loc = c.getCursorLocation();
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
Color fg = field.getForeground(); Color fg = field.getForeground();
assertEquals(fg, ByteViewerComponentProvider.DEFAULT_EDIT_COLOR); assertEquals(fg, ByteViewerComponentProvider.CHANGED_VALUE_COLOR);
} }
assertTrue(program.canUndo()); assertTrue(program.canUndo());
@ -593,7 +593,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
final ByteViewerComponent c = panel.getCurrentComponent(); final ByteViewerComponent c = panel.getCurrentComponent();
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, c.getFocusedCursorColor());
byte value = program.getMemory().getByte(getAddr(0x01001000)); byte value = program.getMemory().getByte(getAddr(0x01001000));
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_P, 'p'); KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_P, 'p');
@ -623,7 +623,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
}); });
waitForPostedSwingRunnables(); waitForPostedSwingRunnables();
assertTrue(action.isSelected()); assertTrue(action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, c.getFocusedCursorColor());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_Z, 'z'); KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_Z, 'z');
@ -634,14 +634,14 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
Address addr = getAddr(0x01001000); Address addr = getAddr(0x01001000);
assertEquals((byte) 0x7a, program.getMemory().getByte(addr)); assertEquals((byte) 0x7a, program.getMemory().getByte(addr));
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
action.setSelected(false); action.setSelected(false);
action.actionPerformed(new ActionContext()); action.actionPerformed(new ActionContext());
}); });
assertTrue(!action.isSelected()); assertTrue(!action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR, assertEquals(ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR,
c.getFocusedCursorColor()); c.getFocusedCursorColor());
} }
@ -663,7 +663,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
action.actionPerformed(new ActionContext()); action.actionPerformed(new ActionContext());
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, c.getFocusedCursorColor());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
FieldLocation loc = getFieldLocation(addr); FieldLocation loc = getFieldLocation(addr);
@ -676,14 +676,14 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
assertEquals((byte) 0x40, program.getMemory().getByte(addr)); assertEquals((byte) 0x40, program.getMemory().getByte(addr));
FieldLocation loc = getFieldLocation(addr); FieldLocation loc = getFieldLocation(addr);
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
action.setSelected(false); action.setSelected(false);
action.actionPerformed(new ActionContext()); action.actionPerformed(new ActionContext());
}); });
assertTrue(!action.isSelected()); assertTrue(!action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR, assertEquals(ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR,
c.getFocusedCursorColor()); c.getFocusedCursorColor());
} }
@ -705,7 +705,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
action.actionPerformed(new ActionContext()); action.actionPerformed(new ActionContext());
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, c.getFocusedCursorColor());
byte value = program.getMemory().getByte(getAddr(0x01001000)); byte value = program.getMemory().getByte(getAddr(0x01001000));
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
@ -735,7 +735,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
action.actionPerformed(new ActionContext()); action.actionPerformed(new ActionContext());
}); });
assertTrue(action.isSelected()); assertTrue(action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, c.getFocusedCursorColor()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, c.getFocusedCursorColor());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_1, '1'); KeyEvent ev = new KeyEvent(c, 0, new Date().getTime(), 0, KeyEvent.VK_1, '1');
@ -744,7 +744,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
}); });
program.flushEvents(); program.flushEvents();
assertEquals((byte) 0x10, program.getMemory().getByte(getAddr(0x01001003))); assertEquals((byte) 0x10, program.getMemory().getByte(getAddr(0x01001003)));
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR,
((ByteField) c.getCurrentField()).getForeground()); ((ByteField) c.getCurrentField()).getForeground());
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
@ -752,7 +752,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
action.actionPerformed(new ActionContext()); action.actionPerformed(new ActionContext());
}); });
assertTrue(!action.isSelected()); assertTrue(!action.isSelected());
assertEquals(ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR, assertEquals(ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR,
c.getFocusedCursorColor()); c.getFocusedCursorColor());
} }
@ -802,7 +802,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
// verify that the bytes are rendered in red // verify that the bytes are rendered in red
FieldLocation loc = getFieldLocation(addr); FieldLocation loc = getFieldLocation(addr);
ByteField field = c.getField(loc.getIndex(), loc.getFieldNum()); ByteField field = c.getField(loc.getIndex(), loc.getFieldNum());
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, field.getForeground()); assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR, field.getForeground());
addr = addr.add(i); addr = addr.add(i);
} }
} }
@ -1216,7 +1216,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
Options opt = tool.getOptions("ByteViewer"); Options opt = tool.getOptions("ByteViewer");
// change the color for Current View Cursor Color // change the color for Current View Cursor Color
putColor(opt, ByteViewerComponentProvider.OPTION_CURRENT_VIEW_CURSOR_COLOR, Palette.GREEN); putColor(opt, ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR_OPTION_NAME, Palette.GREEN);
ByteViewerComponent c = panel.getCurrentComponent(); ByteViewerComponent c = panel.getCurrentComponent();
assertEquals(Palette.GREEN, c.getFocusedCursorColor()); assertEquals(Palette.GREEN, c.getFocusedCursorColor());
@ -1236,7 +1236,8 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
Options opt = tool.getOptions("ByteViewer"); Options opt = tool.getOptions("ByteViewer");
// change the color for Current View Cursor Color // change the color for Current View Cursor Color
putColor(opt, ByteViewerComponentProvider.OPTION_CURSOR_COLOR, Palette.GREEN); putColor(opt, ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR_OPTION_NAME,
Palette.GREEN);
ByteViewerComponent c = findComponent(panel, "Octal"); ByteViewerComponent c = findComponent(panel, "Octal");
assertEquals(Palette.GREEN, c.getNonFocusCursorColor()); assertEquals(Palette.GREEN, c.getNonFocusCursorColor());
@ -1255,7 +1256,8 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
Options opt = tool.getOptions("ByteViewer"); Options opt = tool.getOptions("ByteViewer");
// change the color for Current View Cursor Color // change the color for Current View Cursor Color
putColor(opt, ByteViewerComponentProvider.OPTION_NONFOCUS_CURSOR_COLOR, Palette.CYAN); putColor(opt, ByteViewerComponentProvider.CURSOR_NOT_FOCUSED_COLOR_OPTION_NAME,
Palette.CYAN);
ByteViewerComponent c = findComponent(panel, "Octal"); ByteViewerComponent c = findComponent(panel, "Octal");
assertEquals(Palette.CYAN, c.getNonFocusCursorColor()); assertEquals(Palette.CYAN, c.getNonFocusCursorColor());
@ -1283,7 +1285,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
Options opt = tool.getOptions("ByteViewer"); Options opt = tool.getOptions("ByteViewer");
// change the color for Edit Color // change the color for Edit Color
putColor(opt, ByteViewerComponentProvider.OPTION_EDIT_COLOR, Palette.GREEN); putColor(opt, ByteViewerComponentProvider.CHANGED_VALUE_COLOR_OPTION_NAME, Palette.GREEN);
final FieldLocation loc = getFieldLocation(getAddr(0x01001000)); final FieldLocation loc = getFieldLocation(getAddr(0x01001000));
SwingUtilities.invokeAndWait(() -> { SwingUtilities.invokeAndWait(() -> {
@ -1341,7 +1343,7 @@ public class ByteViewerPlugin2Test extends AbstractGhidraHeadedIntegrationTest {
Options opt = tool.getOptions("ByteViewer"); Options opt = tool.getOptions("ByteViewer");
// change the color for block separator // change the color for block separator
putColor(opt, ByteViewerComponentProvider.OPTION_SEPARATOR_COLOR, Palette.GREEN); putColor(opt, ByteViewerComponentProvider.SEPARATOR_COLOR_OPTION_NAME, Palette.GREEN);
ByteViewerComponent c = panel.getCurrentComponent(); ByteViewerComponent c = panel.getCurrentComponent();
FieldLocation loc = getFieldLocation(getAddr(0x0f001000)); FieldLocation loc = getFieldLocation(getAddr(0x0f001000));

View file

@ -292,7 +292,7 @@ public class ByteViewerPluginFormatsTest extends AbstractGhidraHeadedIntegration
hexComp.setCursorPosition(l.getIndex(), l.getFieldNum(), 0, 0); hexComp.setCursorPosition(l.getIndex(), l.getFieldNum(), 0, 0);
}); });
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, assertEquals(ByteViewerComponentProvider.CHANGED_VALUE_COLOR,
((ByteField) hexComp.getCurrentField()).getForeground()); ((ByteField) hexComp.getCurrentField()).getForeground());
} }
@ -342,7 +342,7 @@ public class ByteViewerPluginFormatsTest extends AbstractGhidraHeadedIntegration
// does not support editing // does not support editing
Color fg = ((ByteField) c.getCurrentField()).getForeground(); Color fg = ((ByteField) c.getCurrentField()).getForeground();
if (fg != null) { if (fg != null) {
assertEquals(ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR, fg); assertEquals(ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR, fg);
} }
} }
@ -391,7 +391,7 @@ public class ByteViewerPluginFormatsTest extends AbstractGhidraHeadedIntegration
// does not support editing // does not support editing
Color fg = ((ByteField) c.getCurrentField()).getForeground(); Color fg = ((ByteField) c.getCurrentField()).getForeground();
if (fg != null) { if (fg != null) {
assertEquals(ByteViewerComponentProvider.DEFAULT_CURRENT_CURSOR_COLOR, fg); assertEquals(ByteViewerComponentProvider.CURSOR_ACTIVE_COLOR, fg);
} }
} }
@ -436,7 +436,7 @@ public class ByteViewerPluginFormatsTest extends AbstractGhidraHeadedIntegration
intComp.setCursorPosition(l.getIndex(), l.getFieldNum(), 0, 0); intComp.setCursorPosition(l.getIndex(), l.getFieldNum(), 0, 0);
}); });
// color should indicate the edit // color should indicate the edit
assertEquals(ByteViewerComponentProvider.DEFAULT_EDIT_COLOR, assertEquals(ByteViewerComponentProvider.CURSOR_NON_ACTIVE_COLOR,
((ByteField) intComp.getCurrentField()).getForeground()); ((ByteField) intComp.getCurrentField()).getForeground());
} }

View file

@ -13,7 +13,6 @@ color.fg.decompiler.type = mediumBlue
color.fg.decompiler.parameter = darkMagenta color.fg.decompiler.parameter = darkMagenta
color.fg.decompiler.global = darkCyan color.fg.decompiler.global = darkCyan
color.bg.decompiler.middle.mouse = rgba(255,255,0,.5)
color.bg.decompiler.current.variable = rgba(255,255,0,0.5) color.bg.decompiler.current.variable = rgba(255,255,0,0.5)
color.fg.line.numbers = gray color.fg.line.numbers = gray
@ -33,13 +32,13 @@ color.bg.decompiler.pcode.dfg.edge.default = navy
color.bg.decompiler.pcode.dfg.edge.selected = deeppink color.bg.decompiler.pcode.dfg.edge.selected = deeppink
color.bg.decompiler.pcode.dfg.edge.within.block = black color.bg.decompiler.pcode.dfg.edge.within.block = black
color.bg.decompiler.pcode.dfg.edge.between.blocks = red color.bg.decompiler.pcode.dfg.edge.between.blocks = red
font.decompiler.pcode.dfg = font.graphdisplay.default
icon.decompiler.action.provider = decompileFunction.gif icon.decompiler.action.provider = decompileFunction.gif
icon.decompiler.action.provider.clone = icon.provider.clone icon.decompiler.action.provider.clone = icon.provider.clone
icon.decompiler.action.export = page_edit.png icon.decompiler.action.export = page_edit.png
font.decompiler = font.monospaced
[Dark Defaults] [Dark Defaults]
color.fg.decompiler.keyword = peru color.fg.decompiler.keyword = peru

View file

@ -25,10 +25,11 @@ import java.awt.event.MouseEvent;
import java.io.IOException; import java.io.IOException;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui;
import ghidra.GhidraOptions;
import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES; import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES;
import ghidra.app.util.HelpTopics; import ghidra.app.util.HelpTopics;
import ghidra.framework.options.Options; import ghidra.framework.options.*;
import ghidra.framework.options.ToolOptions;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.program.database.ProgramCompilerSpec; import ghidra.program.database.ProgramCompilerSpec;
@ -38,7 +39,6 @@ import ghidra.program.model.listing.Program;
import ghidra.program.model.pcode.ElementId; import ghidra.program.model.pcode.ElementId;
import ghidra.program.model.pcode.Encoder; import ghidra.program.model.pcode.Encoder;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.SystemUtilities;
/** /**
* Configuration options for the decompiler * Configuration options for the decompiler
@ -303,62 +303,57 @@ public class DecompileOptions {
private final static IntegerFormatEnum INTEGERFORMAT_OPTIONDEFAULT = IntegerFormatEnum.BestFit; // Must match PrintLanguage::resetDefaultsInternal private final static IntegerFormatEnum INTEGERFORMAT_OPTIONDEFAULT = IntegerFormatEnum.BestFit; // Must match PrintLanguage::resetDefaultsInternal
private IntegerFormatEnum integerFormat; private IntegerFormatEnum integerFormat;
private final static Color HIGHLIGHT_MIDDLE_MOUSE_DEF = new GColor("color.bg.decompiler.middle.mouse");
private Color middleMouseHighlightColor;
private int middleMouseHighlightButton = MouseEvent.BUTTON2; private int middleMouseHighlightButton = MouseEvent.BUTTON2;
private final static String HIGHLIGHT_CURRENT_VARIABLE_MSG ="Display.Color for Current Variable Highlight"; private final static String HIGHLIGHT_CURRENT_VARIABLE_MSG ="Display.Color for Current Variable Highlight";
private final static Color HIGHLIGHT_CURRENT_VARIABLE_DEF = new GColor("color.bg.decompiler.current.variable"); private final static Color HIGHLIGHT_CURRENT_VARIABLE_COLOR = new GColor("color.bg.decompiler.current.variable");
private Color currentVariableHighlightColor;
private final static String HIGHLIGHT_KEYWORD_MSG = "Display.Color for Keywords"; private final static String HIGHLIGHT_KEYWORD_MSG = "Display.Color for Keywords";
private final static Color HIGHLIGHT_KEYWORD_DEF = new GColor("color.fg.decompiler.keyword"); private final static Color HIGHLIGHT_KEYWORD_COLOR = new GColor("color.fg.decompiler.keyword");
private Color keywordColor;
private final static String HIGHLIGHT_FUNCTION_MSG = "Display.Color for Function names"; private final static String HIGHLIGHT_FUNCTION_MSG = "Display.Color for Function names";
private final static Color HIGHLIGHT_FUNCTION_DEF = new GColor("color.fg.decompiler.keyword"); private final static Color HIGHLIGHT_FUNCTION_COLOR = new GColor("color.fg.decompiler.function.name");
private Color functionColor;
private final static String HIGHLIGHT_COMMENT_MSG = "Display.Color for Comments"; private final static String HIGHLIGHT_COMMENT_MSG = "Display.Color for Comments";
private final static Color HIGHLIGHT_COMMENT_DEF = new GColor("color.fg.decompiler.comment"); private final static Color HIGHLIGHT_COMMENT_COLOR = new GColor( "color.fg.decompiler.comment");
private Color commentColor;
private final static String HIGHLIGHT_VARIABLE_MSG = "Display.Color for Variables"; private final static String HIGHLIGHT_VARIABLE_MSG = "Display.Color for Variables";
private final static Color HIGHLIGHT_VARIABLE_DEF = new GColor( "color.fg.decompiler.variable"); private final static Color HIGHLIGHT_VARIABLE_COLOR = new GColor("color.fg.decompiler.variable");
private Color variableColor;
private final static String HIGHLIGHT_CONST_MSG = "Display.Color for Constants"; private final static String HIGHLIGHT_CONST_MSG = "Display.Color for Constants";
private final static Color HIGHLIGHT_CONST_DEF = new GColor( "color.fg.decompiler.constant"); private final static Color HIGHLIGHT_CONST_COLOR = new GColor("color.fg.decompiler.constant");
private Color constantColor;
private final static String HIGHLIGHT_TYPE_MSG = "Display.Color for Types"; private final static String HIGHLIGHT_TYPE_MSG = "Display.Color for Types";
private final static Color HIGHLIGHT_TYPE_DEF = new GColor( "color.fg.decompiler.type"); private final static Color HIGHLIGHT_TYPE_COLOR = new GColor("color.fg.decompiler.type");
private Color typeColor;
private final static String HIGHLIGHT_PARAMETER_MSG = "Display.Color for Parameters"; private final static String HIGHLIGHT_PARAMETER_MSG = "Display.Color for Parameters";
private final static Color HIGHLIGHT_PARAMETER_DEF = new GColor( "color.fg.decompiler.parameter"); private final static Color HIGHLIGHT_PARAMETER_COLOR = new GColor("color.fg.decompiler.parameter");
private Color parameterColor;
private final static String HIGHLIGHT_GLOBAL_MSG = "Display.Color for Globals"; private final static String HIGHLIGHT_GLOBAL_MSG = "Display.Color for Globals";
private final static Color HIGHLIGHT_GLOBAL_DEF = new GColor( "color.fg.decompiler.global");
private Color globalColor; private Color globalColor;
private final static String HIGHLIGHT_SPECIAL_MSG = "Display.Color for Special"; private final static String HIGHLIGHT_SPECIAL_MSG = "Display.Color for Special";
private final static Color HIGHLIGHT_SPECIAL_DEF = Color.decode("0xCC0033"); private final static Color HIGHLIGHT_SPECIAL_DEF = Color.decode("0xCC0033");
private Color specialColor; private Color specialColor;
private final static Color HIGHLIGHT_GLOBAL_COLOR = new GColor("color.fg.decompiler.global");
private final static String HIGHLIGHT_DEFAULT_MSG = "Display.Color Default"; private final static String HIGHLIGHT_DEFAULT_MSG = "Display.Color Default";
private final static Color HIGHLIGHT_DEFAULT_DEF = new GColor("color.fg.decompiler"); private final static Color HIGHLIGHT_DEFAULT_COLOR = new GColor("color.fg.decompiler");
private Color defaultColor;
private static final String SEARCH_HIGHLIGHT_MSG = "Display.Color for Highlighting Find Matches";
private static final Color SEARCH_HIGHLIGHT_COLOR = new GColor("color.bg.decompiler.highlights.search");
//@formatter:on //@formatter:on
private static final String CODE_VIEWER_BACKGROUND_COLOR_MSG = "Display.Background Color"; private static final String BACKGROUND_COLOR_MSG = "Display.Background Color";
private static final Color CODE_VIEWER_BACKGROUND_COLOR = new GColor("color.bg.decompiler"); private static final String BACKGROUND_COLOR_ID = "color.bg.decompiler";
private Color codeViewerBackgroundColor; private static final Color BACKGROUND_COLOR = new GColor(BACKGROUND_COLOR_ID);
private static final String SEARCH_HIGHLIGHT_MSG =
"Display.Color for Highlighting Find Matches";
private static final Color SEARCH_HIGHLIGHT_DEF =
new GColor("color.bg.decompiler.highlights.search");
private Color defaultSearchHighlightColor = SEARCH_HIGHLIGHT_DEF;
// Color applied to a token to indicate warning/error // Color applied to a token to indicate warning/error
private final static Color ERROR_COLOR = new GColor("color.fg.decompiler.comment"); private final static Color ERROR_COLOR = new GColor("color.fg.decompiler.comment");
final static String FONT_MSG = "Display.Font"; final static String FONT_MSG = "Display.Font";
final static Font DEFAULT_FONT = new Font(Font.MONOSPACED, Font.PLAIN, 12); final static String DEFAULT_FONT_ID = "font.decompiler";
private Font defaultFont; private Font font;
private final static String CACHED_RESULTS_SIZE_MSG = "Cache Size (Functions)"; private final static String CACHED_RESULTS_SIZE_MSG = "Cache Size (Functions)";
private final static int SUGGESTED_CACHED_RESULTS_SIZE = 10; private final static int SUGGESTED_CACHED_RESULTS_SIZE = 10;
@ -405,6 +400,7 @@ public class DecompileOptions {
commentHeadInclude = COMMENTHEAD_OPTIONDEFAULT; commentHeadInclude = COMMENTHEAD_OPTIONDEFAULT;
namespaceStrategy = NAMESPACE_OPTIONDEFAULT; namespaceStrategy = NAMESPACE_OPTIONDEFAULT;
integerFormat = INTEGERFORMAT_OPTIONDEFAULT; integerFormat = INTEGERFORMAT_OPTIONDEFAULT;
<<<<<<< Upstream, based on origin/master
keywordColor = HIGHLIGHT_KEYWORD_DEF; keywordColor = HIGHLIGHT_KEYWORD_DEF;
functionColor = HIGHLIGHT_FUNCTION_DEF; functionColor = HIGHLIGHT_FUNCTION_DEF;
commentColor = HIGHLIGHT_COMMENT_DEF; commentColor = HIGHLIGHT_COMMENT_DEF;
@ -417,6 +413,8 @@ public class DecompileOptions {
defaultColor = HIGHLIGHT_DEFAULT_DEF; defaultColor = HIGHLIGHT_DEFAULT_DEF;
codeViewerBackgroundColor = CODE_VIEWER_BACKGROUND_COLOR; codeViewerBackgroundColor = CODE_VIEWER_BACKGROUND_COLOR;
defaultFont = DEFAULT_FONT; defaultFont = DEFAULT_FONT;
=======
>>>>>>> 47fa38a GP-1981 converting option colors to theme colors and font usages to theme properties
displayLineNumbers = LINE_NUMBER_DEF; displayLineNumbers = LINE_NUMBER_DEF;
displayLanguage = ProgramCompilerSpec.DECOMPILER_OUTPUT_DEF; displayLanguage = ProgramCompilerSpec.DECOMPILER_OUTPUT_DEF;
protoEvalModel = "default"; protoEvalModel = "default";
@ -469,6 +467,7 @@ public class DecompileOptions {
commentHeadInclude = opt.getBoolean(COMMENTHEAD_OPTIONSTRING, COMMENTHEAD_OPTIONDEFAULT); commentHeadInclude = opt.getBoolean(COMMENTHEAD_OPTIONSTRING, COMMENTHEAD_OPTIONDEFAULT);
namespaceStrategy = opt.getEnum(NAMESPACE_OPTIONSTRING, NAMESPACE_OPTIONDEFAULT); namespaceStrategy = opt.getEnum(NAMESPACE_OPTIONSTRING, NAMESPACE_OPTIONDEFAULT);
integerFormat = opt.getEnum(INTEGERFORMAT_OPTIONSTRING, INTEGERFORMAT_OPTIONDEFAULT); integerFormat = opt.getEnum(INTEGERFORMAT_OPTIONSTRING, INTEGERFORMAT_OPTIONDEFAULT);
<<<<<<< Upstream, based on origin/master
keywordColor = opt.getColor(HIGHLIGHT_KEYWORD_MSG, HIGHLIGHT_KEYWORD_DEF); keywordColor = opt.getColor(HIGHLIGHT_KEYWORD_MSG, HIGHLIGHT_KEYWORD_DEF);
typeColor = opt.getColor(HIGHLIGHT_TYPE_MSG, HIGHLIGHT_TYPE_DEF); typeColor = opt.getColor(HIGHLIGHT_TYPE_MSG, HIGHLIGHT_TYPE_DEF);
functionColor = opt.getColor(HIGHLIGHT_FUNCTION_MSG, HIGHLIGHT_FUNCTION_DEF); functionColor = opt.getColor(HIGHLIGHT_FUNCTION_MSG, HIGHLIGHT_FUNCTION_DEF);
@ -486,6 +485,8 @@ public class DecompileOptions {
defaultFont = opt.getFont(FONT_MSG, DEFAULT_FONT); defaultFont = opt.getFont(FONT_MSG, DEFAULT_FONT);
defaultFont = SystemUtilities.adjustForFontSizeOverride(defaultFont); defaultFont = SystemUtilities.adjustForFontSizeOverride(defaultFont);
defaultSearchHighlightColor = opt.getColor(SEARCH_HIGHLIGHT_MSG, SEARCH_HIGHLIGHT_DEF); defaultSearchHighlightColor = opt.getColor(SEARCH_HIGHLIGHT_MSG, SEARCH_HIGHLIGHT_DEF);
=======
>>>>>>> 47fa38a GP-1981 converting option colors to theme colors and font usages to theme properties
displayLineNumbers = opt.getBoolean(LINE_NUMBER_MSG, LINE_NUMBER_DEF); displayLineNumbers = opt.getBoolean(LINE_NUMBER_MSG, LINE_NUMBER_DEF);
decompileTimeoutSeconds = opt.getInt(DECOMPILE_TIMEOUT, SUGGESTED_DECOMPILE_TIMEOUT_SECS); decompileTimeoutSeconds = opt.getInt(DECOMPILE_TIMEOUT, SUGGESTED_DECOMPILE_TIMEOUT_SECS);
payloadLimitMBytes = opt.getInt(PAYLOAD_LIMIT, SUGGESTED_MAX_PAYLOAD_BYTES); payloadLimitMBytes = opt.getInt(PAYLOAD_LIMIT, SUGGESTED_MAX_PAYLOAD_BYTES);
@ -503,9 +504,6 @@ public class DecompileOptions {
PluginTool tool = ownerPlugin.getTool(); PluginTool tool = ownerPlugin.getTool();
Options toolOptions = tool.getOptions(CATEGORY_BROWSER_FIELDS); Options toolOptions = tool.getOptions(CATEGORY_BROWSER_FIELDS);
middleMouseHighlightColor =
toolOptions.getColor(HIGHLIGHT_COLOR_NAME, HIGHLIGHT_MIDDLE_MOUSE_DEF);
CURSOR_MOUSE_BUTTON_NAMES mouseEvent = CURSOR_MOUSE_BUTTON_NAMES mouseEvent =
toolOptions.getEnum(CURSOR_HIGHLIGHT_BUTTON_NAME, CURSOR_MOUSE_BUTTON_NAMES.MIDDLE); toolOptions.getEnum(CURSOR_HIGHLIGHT_BUTTON_NAME, CURSOR_MOUSE_BUTTON_NAMES.MIDDLE);
middleMouseHighlightButton = mouseEvent.getMouseEventID(); middleMouseHighlightButton = mouseEvent.getMouseEventID();
@ -622,43 +620,47 @@ public class DecompileOptions {
opt.registerOption(INTEGERFORMAT_OPTIONSTRING, INTEGERFORMAT_OPTIONDEFAULT, opt.registerOption(INTEGERFORMAT_OPTIONSTRING, INTEGERFORMAT_OPTIONDEFAULT,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayIntegerFormat"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayIntegerFormat"),
INTEGERFORMAT_OPTIONDESCRIPTION); INTEGERFORMAT_OPTIONDESCRIPTION);
opt.registerOption(HIGHLIGHT_KEYWORD_MSG, HIGHLIGHT_KEYWORD_DEF, opt.registerOption(HIGHLIGHT_KEYWORD_MSG, HIGHLIGHT_KEYWORD_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting keywords."); "Color used for highlighting keywords.");
opt.registerOption(HIGHLIGHT_TYPE_MSG, HIGHLIGHT_TYPE_DEF, opt.registerOption(HIGHLIGHT_TYPE_MSG, HIGHLIGHT_TYPE_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting types."); "Color used for highlighting types.");
opt.registerOption(HIGHLIGHT_FUNCTION_MSG, HIGHLIGHT_FUNCTION_DEF, opt.registerOption(HIGHLIGHT_FUNCTION_MSG, HIGHLIGHT_FUNCTION_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting function names."); "Color used for highlighting function names.");
opt.registerOption(HIGHLIGHT_COMMENT_MSG, HIGHLIGHT_COMMENT_DEF, opt.registerOption(HIGHLIGHT_COMMENT_MSG, HIGHLIGHT_COMMENT_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting comments."); "Color used for highlighting comments.");
opt.registerOption(HIGHLIGHT_VARIABLE_MSG, HIGHLIGHT_VARIABLE_DEF, opt.registerOption(HIGHLIGHT_VARIABLE_MSG, HIGHLIGHT_VARIABLE_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting variables."); "Color used for highlighting variables.");
opt.registerOption(HIGHLIGHT_CONST_MSG, HIGHLIGHT_CONST_DEF, opt.registerOption(HIGHLIGHT_CONST_MSG, HIGHLIGHT_CONST_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting constants."); "Color used for highlighting constants.");
opt.registerOption(HIGHLIGHT_PARAMETER_MSG, HIGHLIGHT_PARAMETER_DEF, opt.registerOption(HIGHLIGHT_PARAMETER_MSG, HIGHLIGHT_PARAMETER_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting parameters."); "Color used for highlighting parameters.");
opt.registerOption(HIGHLIGHT_GLOBAL_MSG, HIGHLIGHT_GLOBAL_DEF, opt.registerOption(HIGHLIGHT_GLOBAL_MSG, HIGHLIGHT_GLOBAL_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for highlighting global variables."); "Color used for highlighting global variables.");
<<<<<<< Upstream, based on origin/master
opt.registerOption(HIGHLIGHT_SPECIAL_MSG, HIGHLIGHT_SPECIAL_DEF, opt.registerOption(HIGHLIGHT_SPECIAL_MSG, HIGHLIGHT_SPECIAL_DEF,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayTokenColor"),
"Color used for volatile or other exceptional variables."); "Color used for volatile or other exceptional variables.");
opt.registerOption(HIGHLIGHT_DEFAULT_MSG, HIGHLIGHT_DEFAULT_DEF, opt.registerOption(HIGHLIGHT_DEFAULT_MSG, HIGHLIGHT_DEFAULT_DEF,
=======
opt.registerOption(HIGHLIGHT_DEFAULT_MSG, HIGHLIGHT_DEFAULT_COLOR,
>>>>>>> 47fa38a GP-1981 converting option colors to theme colors and font usages to theme properties
new HelpLocation(HelpTopics.DECOMPILER, "DisplayColorDefault"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayColorDefault"),
"The color used when a specific color is not specified."); "The color used when a specific color is not specified.");
opt.registerOption(CODE_VIEWER_BACKGROUND_COLOR_MSG, CODE_VIEWER_BACKGROUND_COLOR, opt.registerOption(BACKGROUND_COLOR_MSG, BACKGROUND_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayBackgroundColor"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayBackgroundColor"),
"The background color of the decompiler window."); "The background color of the decompiler window.");
opt.registerOption(FONT_MSG, DEFAULT_FONT, opt.registerOption(FONT_MSG, OptionType.FONT_TYPE, DEFAULT_FONT_ID,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayFont"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayFont"),
"The font used to render text in the decompiler."); "The font used to render text in the decompiler.");
opt.registerOption(SEARCH_HIGHLIGHT_MSG, SEARCH_HIGHLIGHT_DEF, opt.registerOption(SEARCH_HIGHLIGHT_MSG, SEARCH_HIGHLIGHT_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayFindHighlight"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayFindHighlight"),
"The color used to highlight matches using the Find Dialog."); "The color used to highlight matches using the Find Dialog.");
opt.registerOption(LINE_NUMBER_MSG, LINE_NUMBER_DEF, opt.registerOption(LINE_NUMBER_MSG, LINE_NUMBER_DEF,
@ -675,7 +677,8 @@ public class DecompileOptions {
opt.registerOption(MAX_INSTRUCTIONS, SUGGESTED_MAX_INSTRUCTIONS, opt.registerOption(MAX_INSTRUCTIONS, SUGGESTED_MAX_INSTRUCTIONS,
new HelpLocation(HelpTopics.DECOMPILER, "GeneralMaxInstruction"), new HelpLocation(HelpTopics.DECOMPILER, "GeneralMaxInstruction"),
"The maximum number of instructions decompiled in a single function"); "The maximum number of instructions decompiled in a single function");
opt.registerOption(HIGHLIGHT_CURRENT_VARIABLE_MSG, HIGHLIGHT_CURRENT_VARIABLE_DEF, opt.registerOption(HIGHLIGHT_CURRENT_VARIABLE_MSG,
HIGHLIGHT_CURRENT_VARIABLE_COLOR,
new HelpLocation(HelpTopics.DECOMPILER, "DisplayCurrentHighlight"), new HelpLocation(HelpTopics.DECOMPILER, "DisplayCurrentHighlight"),
"Current variable highlight"); "Current variable highlight");
opt.registerOption(CACHED_RESULTS_SIZE_MSG, SUGGESTED_CACHED_RESULTS_SIZE, opt.registerOption(CACHED_RESULTS_SIZE_MSG, SUGGESTED_CACHED_RESULTS_SIZE,
@ -816,56 +819,56 @@ public class DecompileOptions {
* @return color associated with keyword tokens * @return color associated with keyword tokens
*/ */
public Color getKeywordColor() { public Color getKeywordColor() {
return keywordColor; return HIGHLIGHT_KEYWORD_COLOR;
} }
/** /**
* @return color associated with data-type tokens * @return color associated with data-type tokens
*/ */
public Color getTypeColor() { public Color getTypeColor() {
return typeColor; return HIGHLIGHT_TYPE_COLOR;
} }
/** /**
* @return color associated with a function name token * @return color associated with a function name token
*/ */
public Color getFunctionColor() { public Color getFunctionColor() {
return functionColor; return HIGHLIGHT_FUNCTION_COLOR;
} }
/** /**
* @return color used to display comments * @return color used to display comments
*/ */
public Color getCommentColor() { public Color getCommentColor() {
return commentColor; return HIGHLIGHT_COMMENT_COLOR;
} }
/** /**
* @return color associated with constant tokens * @return color associated with constant tokens
*/ */
public Color getConstantColor() { public Color getConstantColor() {
return constantColor; return HIGHLIGHT_CONST_COLOR;
} }
/** /**
* @return color associated with (local) variable tokens * @return color associated with (local) variable tokens
*/ */
public Color getVariableColor() { public Color getVariableColor() {
return variableColor; return HIGHLIGHT_VARIABLE_COLOR;
} }
/** /**
* @return color associated with parameter tokens * @return color associated with parameter tokens
*/ */
public Color getParameterColor() { public Color getParameterColor() {
return parameterColor; return HIGHLIGHT_PARAMETER_COLOR;
} }
/** /**
* @return color associated with global variable tokens * @return color associated with global variable tokens
*/ */
public Color getGlobalColor() { public Color getGlobalColor() {
return globalColor; return HIGHLIGHT_GLOBAL_COLOR;
} }
/** /**
@ -879,7 +882,7 @@ public class DecompileOptions {
* @return color for generic syntax or other unspecified tokens * @return color for generic syntax or other unspecified tokens
*/ */
public Color getDefaultColor() { public Color getDefaultColor() {
return defaultColor; return HIGHLIGHT_DEFAULT_COLOR;
} }
/** /**
@ -892,29 +895,29 @@ public class DecompileOptions {
/** /**
* @return the background color for the decompiler window * @return the background color for the decompiler window
*/ */
public Color getCodeViewerBackgroundColor() { public Color getBackgroundColor() {
return codeViewerBackgroundColor; return BACKGROUND_COLOR;
} }
/** /**
* @return the color used display the current highlighted variable * @return the color used display the current highlighted variable
*/ */
public Color getCurrentVariableHighlightColor() { public Color getCurrentVariableHighlightColor() {
return currentVariableHighlightColor; return HIGHLIGHT_CURRENT_VARIABLE_COLOR;
} }
/** /**
* @return color used to highlight token(s) selected with a middle button clock * @return color used to highlight token(s) selected with a middle button clock
*/ */
public Color getMiddleMouseHighlightColor() { public Color getMiddleMouseHighlightColor() {
return middleMouseHighlightColor; return GhidraOptions.DEFAULT_HIGHLIGHT_COLOR;
} }
/** /**
* @return color used to highlight search results * @return color used to highlight search results
*/ */
public Color getSearchHighlightColor() { public Color getSearchHighlightColor() {
return defaultSearchHighlightColor; return SEARCH_HIGHLIGHT_COLOR;
} }
public int getMiddleMouseHighlightButton() { public int getMiddleMouseHighlightButton() {
@ -1014,7 +1017,7 @@ public class DecompileOptions {
} }
public Font getDefaultFont() { public Font getDefaultFont() {
return defaultFont; return Gui.getFont(DEFAULT_FONT_ID);
} }
public int getDefaultTimeout() { public int getDefaultTimeout() {

View file

@ -118,7 +118,7 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
layoutController = new ClangLayoutController(options, this, metrics, hlFactory); layoutController = new ClangLayoutController(options, this, metrics, hlFactory);
fieldPanel = new DecompilerFieldPanel(layoutController); fieldPanel = new DecompilerFieldPanel(layoutController);
setBackground(options.getCodeViewerBackgroundColor()); setBackground(options.getBackgroundColor());
scroller = new IndexedScrollPane(fieldPanel); scroller = new IndexedScrollPane(fieldPanel);
fieldPanel.addFieldSelectionListener(this); fieldPanel.addFieldSelectionListener(this);
@ -522,7 +522,8 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
return; return;
} }
List<ClangToken> tokens = DecompilerUtils.getTokensFromView(layoutController.getFields(), address); List<ClangToken> tokens =
DecompilerUtils.getTokensFromView(layoutController.getFields(), address);
goToBeginningOfLine(tokens); goToBeginningOfLine(tokens);
} }
@ -572,7 +573,8 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
return; return;
} }
int firstLineNumber = DecompilerUtils.findIndexOfFirstField(tokens, layoutController.getFields()); int firstLineNumber =
DecompilerUtils.findIndexOfFirstField(tokens, layoutController.getFields());
if (firstLineNumber != -1) { if (firstLineNumber != -1) {
fieldPanel.goTo(BigInteger.valueOf(firstLineNumber), 0, 0, 0, false); fieldPanel.goTo(BigInteger.valueOf(firstLineNumber), 0, 0, 0, false);
} }
@ -631,7 +633,8 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
fieldSelection = new FieldSelection(); fieldSelection = new FieldSelection();
} }
else { else {
List<ClangToken> tokens = DecompilerUtils.getTokens(layoutController.getRoot(), selection); List<ClangToken> tokens =
DecompilerUtils.getTokens(layoutController.getRoot(), selection);
fieldSelection = DecompilerUtils.getFieldSelection(tokens); fieldSelection = DecompilerUtils.getFieldSelection(tokens);
} }
fieldPanel.setSelection(fieldSelection); fieldPanel.setSelection(fieldSelection);
@ -1161,7 +1164,7 @@ public class DecompilerPanel extends JPanel implements FieldMouseListener, Field
} }
public void optionsChanged(DecompileOptions decompilerOptions) { public void optionsChanged(DecompileOptions decompilerOptions) {
setBackground(decompilerOptions.getCodeViewerBackgroundColor()); setBackground(decompilerOptions.getBackgroundColor());
currentVariableHighlightColor = options.getCurrentVariableHighlightColor(); currentVariableHighlightColor = options.getCurrentVariableHighlightColor();
middleMouseHighlightColor = decompilerOptions.getMiddleMouseHighlightColor(); middleMouseHighlightColor = decompilerOptions.getMiddleMouseHighlightColor();
middleMouseHighlightButton = decompilerOptions.getMiddleMouseHighlightButton(); middleMouseHighlightButton = decompilerOptions.getMiddleMouseHighlightButton();

View file

@ -18,9 +18,6 @@ package ghidra.app.plugin.core.decompile.actions;
import static ghidra.app.plugin.core.decompile.actions.PCodeDfgGraphType.*; import static ghidra.app.plugin.core.decompile.actions.PCodeDfgGraphType.*;
import static ghidra.service.graph.VertexShape.*; import static ghidra.service.graph.VertexShape.*;
import java.awt.Color;
import generic.theme.GColor;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.service.graph.*; import ghidra.service.graph.*;
@ -30,31 +27,21 @@ import ghidra.service.graph.*;
public class PCodeDfgDisplayOptions extends GraphDisplayOptions { public class PCodeDfgDisplayOptions extends GraphDisplayOptions {
public static final String SHAPE_ATTRIBUTE = "Shape"; public static final String SHAPE_ATTRIBUTE = "Shape";
private static final Color BG_VERTEX_DEFAULT = // @formatter:off
new GColor("color.bg.decompiler.pcode.dfg.vertex.default"); private static final String BG_VERTEX_DEFAULT = "color.bg.decompiler.pcode.dfg.vertex.default";
private static final Color BG_VERTEX_SELECTED = private static final String BG_VERTEX_SELECTED ="color.bg.decompiler.pcode.dfg.vertex.selected";
new GColor("color.bg.decompiler.pcode.dfg.vertex.selected"); private static final String BG_VERTEX_CONSTANT ="color.bg.decompiler.pcode.dfg.vertex.constant";
private static final Color BG_VERTEX_CONSTANT = private static final String BG_VERTEX_REGISTER ="color.bg.decompiler.pcode.dfg.vertex.register";
new GColor("color.bg.decompiler.pcode.dfg.vertex.constant"); private static final String BG_VERTEX_UNIQUE ="color.bg.decompiler.pcode.dfg.vertex.unique";
private static final Color BG_VERTEX_REGISTER = private static final String BG_VERTEX_PERSISTENT ="color.bg.decompiler.pcode.dfg.vertex.persistent";
new GColor("color.bg.decompiler.pcode.dfg.vertex.register"); private static final String BG_VERTEX_ADDRESS_TIED ="color.bg.decompiler.pcode.dfg.vertex.address.tied";
private static final Color BG_VERTEX_UNIQUE = private static final String BG_VERTEX_OP ="color.bg.decompiler.pcode.dfg.vertex.op";
new GColor("color.bg.decompiler.pcode.dfg.vertex.unique");
private static final Color BG_VERTEX_PERSISTENT =
new GColor("color.bg.decompiler.pcode.dfg.vertex.persistent");
private static final Color BG_VERTEX_ADDRESS_TIED =
new GColor("color.bg.decompiler.pcode.dfg.vertex.address.tied");
private static final Color BG_VERTEX_OP =
new GColor("color.bg.decompiler.pcode.dfg.vertex.op");
private static final Color BG_EDGE_DEFAULT = private static final String BG_EDGE_DEFAULT ="color.bg.decompiler.pcode.dfg.edge.default";
new GColor("color.bg.decompiler.pcode.dfg.edge.default"); private static final String BG_EDGE_SELECTED ="color.bg.decompiler.pcode.dfg.edge.selected";
private static final Color BG_EDGE_SELECTED = private static final String BG_EDGE_WITHIN_BLOCK ="color.bg.decompiler.pcode.dfg.edge.within.block";
new GColor("color.bg.decompiler.pcode.dfg.edge.selected"); private static final String BG_EDGE_BETWEEN_BLOCKS ="color.bg.decompiler.pcode.dfg.edge.between.blocks";
private static final Color BG_EDGE_WITHIN_BLOCK = // @formatter:on
new GColor("color.bg.decompiler.pcode.dfg.edge.within.block");
private static final Color BG_EDGE_BETWEEN_BLOCKS =
new GColor("color.bg.decompiler.pcode.dfg.edge.between.blocks");
/** /**
* constructor * constructor
@ -89,5 +76,7 @@ public class PCodeDfgDisplayOptions extends GraphDisplayOptions {
configureEdgeType(DEFAULT_EDGE, BG_EDGE_DEFAULT); configureEdgeType(DEFAULT_EDGE, BG_EDGE_DEFAULT);
configureEdgeType(WITHIN_BLOCK, BG_EDGE_WITHIN_BLOCK); configureEdgeType(WITHIN_BLOCK, BG_EDGE_WITHIN_BLOCK);
configureEdgeType(BETWEEN_BLOCKS, BG_EDGE_BETWEEN_BLOCKS); configureEdgeType(BETWEEN_BLOCKS, BG_EDGE_BETWEEN_BLOCKS);
setFont("font.decompiler.pcode.dfg");
} }
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.feature.fid.debug; package ghidra.feature.fid.debug;
import java.awt.Font;
import java.util.*; import java.util.*;
import javax.swing.*; import javax.swing.*;
@ -29,7 +28,6 @@ import ghidra.util.NumericUtilities;
* Utility class to handle some debug functions for the FID database. * Utility class to handle some debug functions for the FID database.
*/ */
public class FidDebugUtils { public class FidDebugUtils {
public static final Font MONOSPACED_FONT = new Font("monospaced", Font.PLAIN, 12);
/** /**
* Search the FID system for function records by name substring. * Search the FID system for function records by name substring.

View file

@ -21,6 +21,7 @@ import java.awt.event.ActionListener;
import javax.swing.*; import javax.swing.*;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.Gui;
import ghidra.feature.fid.db.*; import ghidra.feature.fid.db.*;
import ghidra.feature.fid.service.FidService; import ghidra.feature.fid.service.FidService;
import ghidra.program.model.lang.LanguageID; import ghidra.program.model.lang.LanguageID;
@ -55,7 +56,7 @@ public class FidFunctionDebugPanel extends JPanel {
JButton button = new JButton(text); JButton button = new JButton(text);
button.addActionListener(listener); button.addActionListener(listener);
button.setHorizontalAlignment(SwingConstants.LEFT); button.setHorizontalAlignment(SwingConstants.LEFT);
button.setFont(FidDebugUtils.MONOSPACED_FONT); button.setFont(Gui.getFont("font.monospaced"));
add(button); add(button);
} }
@ -66,7 +67,7 @@ public class FidFunctionDebugPanel extends JPanel {
private void addLabel(String text) { private void addLabel(String text) {
JLabel label = new GDLabel(text); JLabel label = new GDLabel(text);
label.setHorizontalAlignment(SwingConstants.LEFT); label.setHorizontalAlignment(SwingConstants.LEFT);
label.setFont(FidDebugUtils.MONOSPACED_FONT); label.setFont(Gui.getFont("font.monospaced"));
add(label); add(label);
} }

View file

@ -21,6 +21,7 @@ import javax.swing.*;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.Gui;
import ghidra.feature.fid.db.FidFileManager; import ghidra.feature.fid.db.FidFileManager;
import ghidra.feature.fid.db.FidQueryService; import ghidra.feature.fid.db.FidQueryService;
import ghidra.feature.fid.plugin.FidPlugin; import ghidra.feature.fid.plugin.FidPlugin;
@ -75,13 +76,13 @@ public class FidSearchDebugDialog extends DialogComponentProvider {
private JLabel getPreparedLabel(String text) { private JLabel getPreparedLabel(String text) {
JLabel label = new GDLabel(text, SwingConstants.RIGHT); JLabel label = new GDLabel(text, SwingConstants.RIGHT);
label.setFont(FidDebugUtils.MONOSPACED_FONT); label.setFont(Gui.getFont("font.monospaced"));
return label; return label;
} }
private JTextField getPreparedTextField() { private JTextField getPreparedTextField() {
JTextField textField = new JTextField(25); JTextField textField = new JTextField(25);
textField.setFont(FidDebugUtils.MONOSPACED_FONT); textField.setFont(Gui.getFont("font.monospaced"));
return textField; return textField;
} }

View file

@ -26,6 +26,7 @@ import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import docking.widgets.table.*; import docking.widgets.table.*;
import generic.theme.Gui;
import ghidra.feature.fid.db.*; import ghidra.feature.fid.db.*;
import ghidra.feature.fid.service.FidService; import ghidra.feature.fid.service.FidService;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -64,7 +65,7 @@ public class FidSearchResultFrame extends JFrame implements FidQueryCloseListene
private void buildFrame() { private void buildFrame() {
GTableCellRenderer renderer = new GTableCellRenderer(); GTableCellRenderer renderer = new GTableCellRenderer();
renderer.setFont(FidDebugUtils.MONOSPACED_FONT); renderer.setFont(Gui.getFont("font.monospaced"));
int columnCount = table.getColumnCount(); int columnCount = table.getColumnCount();
for (int ii = 0; ii < columnCount; ++ii) { for (int ii = 0; ii < columnCount; ++ii) {
Class<?> columnClass = table.getColumnClass(ii); Class<?> columnClass = table.getColumnClass(ii);

View file

@ -15,7 +15,8 @@
*/ */
package ghidra.feature.fid.plugin; package ghidra.feature.fid.plugin;
import java.awt.*; import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -279,10 +280,7 @@ public class PopulateFidDialog extends DialogComponentProvider {
} }
private JButton createBrowseButton() { private JButton createBrowseButton() {
JButton browseButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE); return ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE);
Font font = browseButton.getFont();
browseButton.setFont(new Font(font.getName(), Font.BOLD, font.getSize()));
return browseButton;
} }
private static class LibraryChoice { private static class LibraryChoice {

View file

@ -30,6 +30,7 @@ import docking.action.DockingAction;
import docking.action.ToolBarData; import docking.action.ToolBarData;
import docking.widgets.checkbox.GCheckBox; import docking.widgets.checkbox.GCheckBox;
import generic.theme.GIcon; import generic.theme.GIcon;
import generic.theme.Gui;
import ghidra.app.util.HelpTopics; import ghidra.app.util.HelpTopics;
import ghidra.framework.plugintool.ComponentProviderAdapter; import ghidra.framework.plugintool.ComponentProviderAdapter;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
@ -288,13 +289,12 @@ public class DiffDetailsProvider extends ComponentProviderAdapter {
} }
private JScrollPane createDetailsPane() { private JScrollPane createDetailsPane() {
Font font = new Font("Monospaced", Font.PLAIN, 12);
textPane = new JTextPane(); textPane = new JTextPane();
doc = textPane.getStyledDocument(); doc = textPane.getStyledDocument();
textPane.setName(DIFF_DETAILS_TEXT_AREA); textPane.setName(DIFF_DETAILS_TEXT_AREA);
textPane.setEditable(false); textPane.setEditable(false);
textPane.setMargin(new Insets(5, 5, 5, 5)); textPane.setMargin(new Insets(5, 5, 5, 5));
textPane.setFont(font); Gui.registerFont(textPane, "font.monospaced");
textPane.setOpaque(true); textPane.setOpaque(true);
textPane.setCaretPosition(0); textPane.setCaretPosition(0);
JScrollPane scrolledDetails = new JScrollPane(textPane); JScrollPane scrolledDetails = new JScrollPane(textPane);

View file

@ -79,8 +79,6 @@ public class NewSessionPanel extends AbstractMageJPanel<VTWizardStateKey> {
JButton browseFolderButton = JButton browseFolderButton =
ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE); ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE);
browseFolderButton.addActionListener(e -> browseDataTreeFolders()); browseFolderButton.addActionListener(e -> browseDataTreeFolders());
Font font = browseFolderButton.getFont();
browseFolderButton.setFont(new Font(font.getName(), Font.BOLD, font.getSize()));
JLabel newSessionLabel = new GDLabel("New Session Name: "); JLabel newSessionLabel = new GDLabel("New Session Name: ");
newSessionLabel.setToolTipText("The name for the new Version Tracking Session"); newSessionLabel.setToolTipText("The name for the new Version Tracking Session");

View file

@ -221,9 +221,10 @@ icon.task.progress.hourglass.11 = hourglass24_11.png
// Fonts // Fonts
font.splash.header.default = Serif-BOLD-35
font.splash.status = Serif-BOLD-12
font.table.header.number = arial-BOLD-12
font.input.hint = monospaced-PLAIN-10
[Dark Defaults] [Dark Defaults]

View file

@ -23,8 +23,7 @@ import javax.swing.*;
import docking.widgets.label.GIconLabel; import docking.widgets.label.GIconLabel;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import generic.theme.GColor; import generic.theme.*;
import generic.theme.GIcon;
import generic.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.framework.PluggableServiceRegistry; import ghidra.framework.PluggableServiceRegistry;
@ -126,7 +125,7 @@ public class ApplicationInformationDisplayFactory {
JLabel nameLabel = new GLabel(Application.getName()); JLabel nameLabel = new GLabel(Application.getName());
nameLabel.setForeground(Palette.GRAY); nameLabel.setForeground(Palette.GRAY);
Font newFont = new Font("Garamond", Font.BOLD, 35); Font newFont = Gui.getFont("font.splash.header.default");
nameLabel.setFont(newFont); nameLabel.setFont(newFont);
nameLabel.setHorizontalAlignment(SwingConstants.CENTER); nameLabel.setHorizontalAlignment(SwingConstants.CENTER);
nameLabel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); nameLabel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

View file

@ -25,6 +25,7 @@ import javax.swing.border.BevelBorder;
import docking.*; import docking.*;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.util.Msg; import ghidra.util.Msg;
@ -39,6 +40,8 @@ public class SplashScreen extends JWindow {
private static final Color BG_COLOR = new GColor("color.bg.splashscreen"); private static final Color BG_COLOR = new GColor("color.bg.splashscreen");
private static final String FONT_ID = "font.splash.status";
private static SplashScreen splashWindow; // splash window displayed while ghidra is coming up private static SplashScreen splashWindow; // splash window displayed while ghidra is coming up
private static DockingFrame hiddenFrame; private static DockingFrame hiddenFrame;
private static JLabel statusLabel; private static JLabel statusLabel;
@ -300,9 +303,9 @@ public class SplashScreen extends JWindow {
} }
private Component createStatusComponent() { private Component createStatusComponent() {
Font f = new Font("serif", Font.BOLD, 12);
statusLabel = new GDLabel(" Loading..."); statusLabel = new GDLabel(" Loading...");
statusLabel.setFont(f); Gui.registerFont(statusLabel, FONT_ID);
statusLabel.setFont(Gui.getFont(FONT_ID));
statusLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 2, 10)); statusLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 2, 10));
statusLabel.setOpaque(true); statusLabel.setOpaque(true);

View file

@ -116,10 +116,6 @@ public class ButtonPanelFactory {
return 10; return 10;
} }
}; };
/**
* Font for the browse button label.
*/
public final static Font BROWSE_FONT = new Font("Dialog", Font.BOLD, 12);
/** /**
* internal values used when creating the panels and buttons * internal values used when creating the panels and buttons

View file

@ -16,7 +16,6 @@
package docking.options.editor; package docking.options.editor;
import java.awt.Component; import java.awt.Component;
import java.awt.Font;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
import java.beans.PropertyEditorSupport; import java.beans.PropertyEditorSupport;
import java.io.File; import java.io.File;
@ -107,9 +106,6 @@ public class FileChooserEditor extends PropertyEditorSupport {
textField.setText(currentFileValue != null ? currentFileValue.getAbsolutePath() : ""); textField.setText(currentFileValue != null ? currentFileValue.getAbsolutePath() : "");
browseButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE); browseButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE);
Font f = browseButton.getFont();
f = new Font(f.getName(), Font.BOLD, f.getSize());
browseButton.setFont(f);
add(textField); add(textField);
add(Box.createHorizontalStrut(5)); add(Box.createHorizontalStrut(5));

View file

@ -77,7 +77,7 @@ public class ThemeColorTableModel extends GDynamicColumnTableModel<ColorValue, O
private void load() { private void load() {
currentValues = Gui.getAllValues(); currentValues = Gui.getAllValues();
colors = currentValues.getColors(); colors = currentValues.getColors();
themeValues = new GThemeValueMap(currentValues); themeValues = Gui.getThemeValues();
defaultValues = Gui.getDefaults(); defaultValues = Gui.getDefaults();
lightDefaultValues = Gui.getApplicationLightDefaults(); lightDefaultValues = Gui.getApplicationLightDefaults();
darkDefaultValues = Gui.getApplicationDarkDefaults(); darkDefaultValues = Gui.getApplicationDarkDefaults();
@ -189,7 +189,7 @@ public class ThemeColorTableModel extends GDynamicColumnTableModel<ColorValue, O
private class ThemeColorRenderer extends AbstractGColumnRenderer<ResolvedColor> { private class ThemeColorRenderer extends AbstractGColumnRenderer<ResolvedColor> {
public ThemeColorRenderer() { public ThemeColorRenderer() {
setFont(new Font("Monospaced", Font.PLAIN, 12)); setFont(Gui.getFont("font.monospaced"));
} }
@Override @Override

View file

@ -106,6 +106,9 @@ public class ThemeFontTable extends JPanel implements ActionContextProvider {
@Override @Override
public ActionContext getActionContext(MouseEvent e) { public ActionContext getActionContext(MouseEvent e) {
if (e == null) {
return null;
}
if (e.getSource() == table) { if (e.getSource() == table) {
FontValue currentValue = filterTable.getSelectedRowObject(); FontValue currentValue = filterTable.getSelectedRowObject();
if (currentValue == null) { if (currentValue == null) {

View file

@ -66,7 +66,7 @@ public class ThemeFontTableModel extends GDynamicColumnTableModel<FontValue, Obj
private void load() { private void load() {
currentValues = Gui.getAllValues(); currentValues = Gui.getAllValues();
fonts = currentValues.getFonts(); fonts = currentValues.getFonts();
themeValues = new GThemeValueMap(currentValues); themeValues = Gui.getThemeValues();
defaultValues = Gui.getDefaults(); defaultValues = Gui.getDefaults();
} }

View file

@ -16,7 +16,6 @@
package docking.theme.gui; package docking.theme.gui;
import java.awt.Component; import java.awt.Component;
import java.awt.Font;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -67,7 +66,7 @@ public class ThemeIconTableModel extends GDynamicColumnTableModel<IconValue, Obj
private void load() { private void load() {
currentValues = Gui.getAllValues(); currentValues = Gui.getAllValues();
icons = currentValues.getIcons(); icons = currentValues.getIcons();
themeValues = new GThemeValueMap(currentValues); themeValues = Gui.getThemeValues();
defaultValues = Gui.getDefaults(); defaultValues = Gui.getDefaults();
} }
@ -175,7 +174,7 @@ public class ThemeIconTableModel extends GDynamicColumnTableModel<IconValue, Obj
private class ThemeIconRenderer extends AbstractGColumnRenderer<ResolvedIcon> { private class ThemeIconRenderer extends AbstractGColumnRenderer<ResolvedIcon> {
public ThemeIconRenderer() { public ThemeIconRenderer() {
setFont(new Font("Monospaced", Font.PLAIN, 12)); setFont(Gui.getFont("font.monospaced"));
} }
@Override @Override

View file

@ -120,7 +120,7 @@ public abstract class AbstractGCellRenderer extends GDHtmlLabel {
super.setFont(f); super.setFont(f);
defaultFont = f; defaultFont = f;
fixedWidthFont = new Font("monospaced", defaultFont.getStyle(), defaultFont.getSize()); fixedWidthFont = new Font("monospaced", defaultFont.getStyle(), defaultFont.getSize());
boldFont = new Font(defaultFont.getName(), Font.BOLD, defaultFont.getSize()); boldFont = f.deriveFont(Font.BOLD);
} }
protected void superSetFont(Font font) { protected void superSetFont(Font font) {

View file

@ -20,9 +20,10 @@ import java.awt.event.*;
import javax.swing.*; import javax.swing.*;
import docking.CloseIcon;
import docking.widgets.EmptyBorderButton; import docking.widgets.EmptyBorderButton;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import resources.ResourceManager; import generic.theme.GColor;
/** /**
* A widget that can be used to render an icon, title and close button for JTabbedPane. You would * A widget that can be used to render an icon, title and close button for JTabbedPane. You would
@ -31,10 +32,9 @@ import resources.ResourceManager;
public class DockingTabRenderer extends JPanel { public class DockingTabRenderer extends JPanel {
private static final int MAX_TITLE_LENGTH = 25; private static final int MAX_TITLE_LENGTH = 25;
private Icon EMPTY_ICON = private Icon CLOSE_ICON = new CloseIcon(8, 1, new GColor("color.fg.button"));
ResourceManager.getScaledIcon(ResourceManager.loadImage("images/close16.gif"), 8, 8); private Icon EMPTY_ICON = CLOSE_ICON;
private Icon CLOSE_ICON = //TODO if we don't want the close icon to come and go, then this class can be greatly simplified
ResourceManager.getScaledIcon(ResourceManager.loadImage("images/close16.gif"), 8, 8);
private JLabel titleLabel; private JLabel titleLabel;
private JLabel iconLabel; private JLabel iconLabel;

View file

@ -23,8 +23,7 @@ import javax.swing.*;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.table.*; import javax.swing.table.*;
import generic.theme.GColor; import generic.theme.*;
import generic.theme.GIcon;
import resources.*; import resources.*;
import resources.icons.EmptyIcon; import resources.icons.EmptyIcon;
import resources.icons.TranslateIcon; import resources.icons.TranslateIcon;
@ -314,6 +313,7 @@ public class GTableHeaderRenderer extends DefaultTableCellRenderer {
private class NumberPainterIcon implements Icon { private class NumberPainterIcon implements Icon {
private static final String FONT_ID = "font.table.header.number";
private final int iconWidth; private final int iconWidth;
private int numberWidth; private int numberWidth;
private final int iconHeight; private final int iconHeight;
@ -324,9 +324,7 @@ public class GTableHeaderRenderer extends DefaultTableCellRenderer {
this.iconHeight = height; this.iconHeight = height;
this.numberText = numberText; this.numberText = numberText;
int fontSize = 12; Font font = Gui.getFont(FONT_ID);
String fontFamily = "arial";
Font font = new Font(fontFamily, Font.BOLD, fontSize);
FontMetrics fontMetrics = getFontMetrics(font); FontMetrics fontMetrics = getFontMetrics(font);
numberWidth = fontMetrics.stringWidth(numberText); numberWidth = fontMetrics.stringWidth(numberText);
} }
@ -344,9 +342,7 @@ public class GTableHeaderRenderer extends DefaultTableCellRenderer {
@Override @Override
public void paintIcon(Component c, Graphics g, int x, int y) { public void paintIcon(Component c, Graphics g, int x, int y) {
int fontSize = 12; Font font = Gui.getFont(FONT_ID);
String fontFamily = "arial";
Font font = new Font(fontFamily, Font.BOLD, fontSize);
g.setFont(font); g.setFont(font);
FontMetrics fontMetrics = g.getFontMetrics(); FontMetrics fontMetrics = g.getFontMetrics();
int numberHeight = fontMetrics.getAscent(); int numberHeight = fontMetrics.getAscent();
@ -363,8 +359,8 @@ public class GTableHeaderRenderer extends DefaultTableCellRenderer {
AttributedString as = new AttributedString(numberText); AttributedString as = new AttributedString(numberText);
as.addAttribute(TextAttribute.FOREGROUND, SORT_NUMBER_FG_COLOR); as.addAttribute(TextAttribute.FOREGROUND, SORT_NUMBER_FG_COLOR);
as.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD); as.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
as.addAttribute(TextAttribute.FAMILY, fontFamily); as.addAttribute(TextAttribute.FAMILY, font.getFamily());
as.addAttribute(TextAttribute.SIZE, (float) fontSize); as.addAttribute(TextAttribute.SIZE, font.getSize2D());
g.drawString(as.getIterator(), startX, textBaseline); g.drawString(as.getIterator(), startX, textBaseline);

View file

@ -24,8 +24,10 @@ import javax.swing.text.*;
import docking.util.GraphicsUtils; import docking.util.GraphicsUtils;
import generic.theme.GThemeDefaults.Colors.Messages; import generic.theme.GThemeDefaults.Colors.Messages;
import generic.theme.Gui;
public class HexOrDecimalInput extends JTextField { public class HexOrDecimalInput extends JTextField {
private static final String FONT_ID = "font.input.hint";
private boolean isHexMode = false; private boolean isHexMode = false;
private boolean allowsNegative = true; private boolean allowsNegative = true;
private Long currentValue; private Long currentValue;
@ -128,7 +130,7 @@ public class HexOrDecimalInput extends JTextField {
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
super.paintComponent(g); super.paintComponent(g);
Font font = new Font("Monospaced", Font.PLAIN, 10); Font font = Gui.getFont(FONT_ID);
Font savedFont = g.getFont(); Font savedFont = g.getFont();
g.setFont(font); g.setFont(font);
g.setColor(Messages.HINT); g.setColor(Messages.HINT);

View file

@ -28,6 +28,7 @@ import javax.swing.text.*;
import docking.DockingUtils; import docking.DockingUtils;
import docking.util.GraphicsUtils; import docking.util.GraphicsUtils;
import generic.theme.GThemeDefaults.Colors.Messages; import generic.theme.GThemeDefaults.Colors.Messages;
import generic.theme.Gui;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;
/** /**
@ -635,13 +636,13 @@ public class IntegerTextField {
*/ */
private class MyTextField extends JTextField { private class MyTextField extends JTextField {
private Font hintFont = new Font("Monospaced", Font.PLAIN, 10); private static final String FONT_ID = "font.input.hint";
private int hintWidth; private int hintWidth;
public MyTextField(int columns) { public MyTextField(int columns) {
super(columns); super(columns);
FontMetrics fontMetrics = getFontMetrics(hintFont); FontMetrics fontMetrics = getFontMetrics(Gui.getFont(FONT_ID));
String mode = isHexMode ? "Hex" : "Dec"; String mode = isHexMode ? "Hex" : "Dec";
hintWidth = fontMetrics.stringWidth(mode); hintWidth = fontMetrics.stringWidth(mode);
@ -682,7 +683,7 @@ public class IntegerTextField {
} }
Font savedFont = g.getFont(); Font savedFont = g.getFont();
g.setFont(hintFont); g.setFont(Gui.getFont(FONT_ID));
g.setColor(Messages.HINT); g.setColor(Messages.HINT);
Dimension size = getSize(); Dimension size = getSize();

View file

@ -32,6 +32,7 @@ import javax.swing.event.*;
import docking.util.GraphicsUtils; import docking.util.GraphicsUtils;
import generic.theme.GThemeDefaults.Colors.Messages; import generic.theme.GThemeDefaults.Colors.Messages;
import generic.theme.Gui;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;
/** /**
@ -227,12 +228,14 @@ public class LocalDateTextField {
private class MyTextField extends JTextField { private class MyTextField extends JTextField {
private static final String FONT_ID = "font.input.hint";
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
super.paintComponent(g); super.paintComponent(g);
if (showFieldDecoration) { if (showFieldDecoration) {
Font font = new Font("Monospaced", Font.PLAIN, 10); Font font = Gui.getFont(FONT_ID);
Font savedFont = g.getFont(); Font savedFont = g.getFont();
g.setFont(font); g.setFont(font);
g.setColor(Messages.HINT); g.setColor(Messages.HINT);

View file

@ -142,7 +142,7 @@ public class GTreeRenderer extends DefaultTreeCellRenderer implements GComponent
// Bug Alert!: // Bug Alert!:
// We must create a new font here and not use deriveFont(). Using derive font has // We must create a new font here and not use deriveFont(). Using derive font has
// bugs when calculating the string width for a bold derived font. // bugs when calculating the string width for a bold derived font.
cachedBoldFont = new Font(font.getFamily(), Font.BOLD, font.getSize()); cachedBoldFont = font.deriveFont(Font.BOLD);
} }
return bold ? cachedBoldFont : cachedDefaultFont; return bold ? cachedBoldFont : cachedDefaultFont;
} }

View file

@ -2,10 +2,10 @@
// Fonts // Fonts
font.standard = [font]panel.font font.standard = [font]panel.font
font.monospaced = font.standard[monospaced]
font.bold = font.standard[bold] font.bold = font.standard[bold]
font.italics = font.standard[italic] font.italics = font.standard[italic]
font.bold.italic = font.standard[bold][italic] font.bold.italic = font.standard[bold][italic]
font.monospaced = monospaced-PLAIN-12
[Dark Defaults] [Dark Defaults]

View file

@ -45,6 +45,7 @@ import org.junit.runner.Description;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import generic.test.rule.Repeated; import generic.test.rule.Repeated;
import generic.test.rule.RepeatedTestRule; import generic.test.rule.RepeatedTestRule;
import generic.theme.Gui;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.GhidraTestApplicationLayout; import ghidra.GhidraTestApplicationLayout;
import ghidra.framework.Application; import ghidra.framework.Application;
@ -1584,7 +1585,7 @@ public abstract class AbstractGenericTest extends AbstractGTest {
} }
}); });
// Fix up the default fonts that Java 1.5.0 changed to Courier, which looked terrible. // Fix up the default fonts that Java 1.5.0 changed to Courier, which looked terrible.
Font f = new Font("Monospaced", Font.PLAIN, 12); Font f = Gui.getFont("font.monospaced");
UIManager.put("PasswordField.font", f); UIManager.put("PasswordField.font", f);
UIManager.put("TextArea.font", f); UIManager.put("TextArea.font", f);
} }

View file

@ -78,14 +78,19 @@ public abstract class AbstractThemeReader {
String value = section.getValue(key); String value = section.getValue(key);
int lineNumber = section.getLineNumber(key); int lineNumber = section.getLineNumber(key);
if (ColorValue.isColorKey(key)) { if (ColorValue.isColorKey(key)) {
valueMap.addColor(parseColorProperty(key, value, lineNumber)); ColorValue colorValue = parseColorProperty(key, value, lineNumber);
ColorValue oldValue = valueMap.addColor(colorValue);
reportDuplicateKey(oldValue, lineNumber);
} }
else if (FontValue.isFontKey(key)) { else if (FontValue.isFontKey(key)) {
valueMap.addFont(parseFontProperty(key, value, lineNumber)); FontValue oldValue = valueMap.addFont(parseFontProperty(key, value, lineNumber));
reportDuplicateKey(oldValue, lineNumber);
} }
else if (IconValue.isIconKey(key)) { else if (IconValue.isIconKey(key)) {
if (!GTheme.JAVA_ICON.equals(value)) { if (!GTheme.JAVA_ICON.equals(value)) {
IconValue oldValue =
valueMap.addIcon(parseIconProperty(key, value, lineNumber)); valueMap.addIcon(parseIconProperty(key, value, lineNumber));
reportDuplicateKey(oldValue, lineNumber);
} }
} }
else { else {
@ -94,6 +99,12 @@ public abstract class AbstractThemeReader {
} }
} }
private void reportDuplicateKey(ThemeValue<?> oldValue, int lineNumber) {
if (oldValue != null) {
error(lineNumber, "Duplicate id found: \"" + oldValue.getId() + "\"");
}
}
private IconValue parseIconProperty(String key, String value, int lineNumber) { private IconValue parseIconProperty(String key, String value, int lineNumber) {
try { try {
return IconValue.parse(key, value); return IconValue.parse(key, value);
@ -280,6 +291,10 @@ public abstract class AbstractThemeReader {
error(lineNumber, "Missing value for propery line: \"" + line + "\""); error(lineNumber, "Missing value for propery line: \"" + line + "\"");
return; return;
} }
if (properties.containsKey(key)) {
error(lineNumber, "Duplicate key found in this file!: " + key + "\"");
return;
}
properties.put(key, value); properties.put(key, value);
lineNumbers.put(key, lineNumber); lineNumbers.put(key, lineNumber);

View file

@ -51,33 +51,39 @@ public class GThemeValueMap {
* Adds the {@link ColorValue} to the map. If a ColorValue already exists in the map with * Adds the {@link ColorValue} to the map. If a ColorValue already exists in the map with
* the same id, it will be replaced * the same id, it will be replaced
* @param value the {@link ColorValue} to store in the map. * @param value the {@link ColorValue} to store in the map.
* @return the previous value for the color key or null if no previous value existed
*/ */
public void addColor(ColorValue value) { public ColorValue addColor(ColorValue value) {
if (value != null) { if (value != null) {
colorMap.put(value.getId(), value); return colorMap.put(value.getId(), value);
} }
return null;
} }
/** /**
* Adds the {@link FontValue} to the map. If a FontValue already exists in the map with * Adds the {@link FontValue} to the map. If a FontValue already exists in the map with
* the same id, it will be replaced * the same id, it will be replaced
* @param value the {@link FontValue} to store in the map. * @param value the {@link FontValue} to store in the map.
* @return the previous value for the font key or null if no previous value existed
*/ */
public void addFont(FontValue value) { public FontValue addFont(FontValue value) {
if (value != null) { if (value != null) {
fontMap.put(value.getId(), value); return fontMap.put(value.getId(), value);
} }
return null;
} }
/** /**
* Adds the {@link IconValue} to the map. If a IconValue already exists in the map with * Adds the {@link IconValue} to the map. If a IconValue already exists in the map with
* the same id, it will be replaced * the same id, it will be replaced
* @param value the {@link IconValue} to store in the map. * @param value the {@link IconValue} to store in the map.
* @return the previous value for the icon key or null if no previous value existed
*/ */
public void addIcon(IconValue value) { public IconValue addIcon(IconValue value) {
if (value != null) { if (value != null) {
iconMap.put(value.getId(), value); return iconMap.put(value.getId(), value);
} }
return null;
} }
/** /**

View file

@ -286,6 +286,24 @@ public class Gui {
return new GThemeValueMap(currentValues); return new GThemeValueMap(currentValues);
} }
/**
* Returns the theme values as defined by the current theme, ignoring any unsaved changes that
* are currently applied to the application.
* @return the theme values as defined by the current theme, ignoring any unsaved changes that
* are currently applied to the application.
*/
public static GThemeValueMap getThemeValues() {
GThemeValueMap map = new GThemeValueMap();
map.load(javaDefaults);
map.load(systemValues);
map.load(applicationDefaults);
if (activeTheme.useDarkDefaults()) {
map.load(applicationDarkDefaults);
}
map.load(activeTheme);
return map;
}
/** /**
* Returns a {@link GThemeValueMap} contains all values that differ from the default * Returns a {@link GThemeValueMap} contains all values that differ from the default
* values (values defined by the {@link LookAndFeel} or in the theme.properties files. * values (values defined by the {@link LookAndFeel} or in the theme.properties files.

View file

@ -193,8 +193,8 @@ public class IconValue extends ThemeValue<Icon> {
@Override @Override
protected Icon getUnresolvedReferenceValue(String unresolvedId) { protected Icon getUnresolvedReferenceValue(String unresolvedId) {
Msg.warn(this, Msg.warn(this,
"Could not resolve indirect icon path for" + unresolvedId + "Could not resolve indirect icon path for \"" + unresolvedId +
", using last resort default"); "\", using last resort default");
return LAST_RESORT_DEFAULT; return LAST_RESORT_DEFAULT;
} }

View file

@ -25,8 +25,8 @@ import java.util.*;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import ghidra.util.HelpLocation; import generic.theme.*;
import ghidra.util.Msg; import ghidra.util.*;
import ghidra.util.datastruct.WeakDataStructureFactory; import ghidra.util.datastruct.WeakDataStructureFactory;
import ghidra.util.datastruct.WeakSet; import ghidra.util.datastruct.WeakSet;
import ghidra.util.exception.AssertException; import ghidra.util.exception.AssertException;
@ -59,6 +59,8 @@ public abstract class AbstractOptions implements Options {
protected Map<String, OptionsEditor> optionsEditorMap; protected Map<String, OptionsEditor> optionsEditorMap;
protected Map<String, HelpLocation> categoryHelpMap; protected Map<String, HelpLocation> categoryHelpMap;
protected Map<String, AliasBinding> aliasMap; protected Map<String, AliasBinding> aliasMap;
protected ThemeListener themeListener;
protected Map<String, String> themeToOptionMap = new HashMap<>();
protected AbstractOptions(String name) { protected AbstractOptions(String name) {
this.name = name; this.name = name;
@ -67,7 +69,8 @@ public abstract class AbstractOptions implements Options {
optionsEditorMap = new HashMap<>(); optionsEditorMap = new HashMap<>();
categoryHelpMap = new HashMap<>(); categoryHelpMap = new HashMap<>();
aliasMap = new HashMap<>(); aliasMap = new HashMap<>();
themeListener = this::themeChanged;
Gui.addThemeListener(themeListener);
} }
protected abstract Option createRegisteredOption(String optionName, OptionType type, protected abstract Option createRegisteredOption(String optionName, OptionType type,
@ -131,15 +134,32 @@ public abstract class AbstractOptions implements Options {
public synchronized void registerOption(String optionName, OptionType type, Object defaultValue, public synchronized void registerOption(String optionName, OptionType type, Object defaultValue,
HelpLocation help, String description, PropertyEditor editor) { HelpLocation help, String description, PropertyEditor editor) {
if (type == OptionType.COLOR_TYPE) {
// Msg.warn(this, "Registering color: " + optionName,
// ReflectionUtilities.createJavaFilteredThrowable());
}
if (type == OptionType.NO_TYPE) { if (type == OptionType.NO_TYPE) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Can't register an option of type: " + OptionType.NO_TYPE); "Can't register an option of type: " + OptionType.NO_TYPE);
} }
if (type == OptionType.COLOR_TYPE) {
if (defaultValue instanceof GColor gColor) {
registerThemeColor(optionName, gColor.getId(), help, description);
return;
}
warnNonThemeValue("Registering non theme color: " + optionName);
}
if (type == OptionType.FONT_TYPE) {
if (defaultValue instanceof String fontId) {
registerThemeFont(optionName, fontId, help, description);
return;
}
String message = "Registering non theme font: " + optionName;
if (SystemUtilities.isInDevelopmentMode()) {
Msg.warn(this, message, ReflectionUtilities.createJavaFilteredThrowable());
}
else {
Msg.warn(this, message);
}
}
if (!type.isCompatible(defaultValue)) { if (!type.isCompatible(defaultValue)) {
throw new IllegalStateException( throw new IllegalStateException(
"Given default value does not match the given OptionType! OptionType = " + type + "Given default value does not match the given OptionType! OptionType = " + type +
@ -167,27 +187,40 @@ public abstract class AbstractOptions implements Options {
valueMap.put(optionName, option); valueMap.put(optionName, option);
} }
@Override protected void warnNonThemeValue(String message) {
public void registerThemeColorOption(String optionName, String colorId, HelpLocation help, if (SystemUtilities.isInDevelopmentMode()) {
Msg.warn(this, message, ReflectionUtilities.createJavaFilteredThrowable());
}
else {
Msg.warn(this, message);
}
}
private void registerThemeColor(String optionName, String colorId, HelpLocation help,
String description) { String description) {
Option currentOption = getExistingComptibleOption(optionName, OptionType.COLOR_TYPE); Option currentOption = getExistingComptibleOption(optionName, OptionType.COLOR_TYPE);
if (currentOption != null && currentOption instanceof ThemeColorOption) { if (currentOption != null && currentOption instanceof ThemeColorOption) {
currentOption.updateRegistration(description, help, null, null); currentOption.updateRegistration(description, help, null, null);
return; return;
} }
description += " (Theme Color: " + colorId + ")";
Option option = new ThemeColorOption(optionName, colorId, description, help); Option option = new ThemeColorOption(optionName, colorId, description, help);
valueMap.put(optionName, option); valueMap.put(optionName, option);
} }
@Override private void registerThemeFont(String optionName, String fontId, HelpLocation help,
public void registerThemeFontOption(String optionName, String fontId, HelpLocation help,
String description) { String description) {
if (Gui.getFont(fontId) == null) {
throw new IllegalArgumentException("Invalid theme font id: \"" + fontId + "\"");
}
Option currentOption = getExistingComptibleOption(optionName, OptionType.FONT_TYPE); Option currentOption = getExistingComptibleOption(optionName, OptionType.FONT_TYPE);
if (currentOption != null && currentOption instanceof ThemeFontOption) { if (currentOption != null && currentOption instanceof ThemeFontOption) {
currentOption.updateRegistration(description, help, null, null); currentOption.updateRegistration(description, help, null, null);
return; return;
} }
description += " (Theme Font: " + fontId + ")";
Option option = new ThemeFontOption(optionName, fontId, description, help); Option option = new ThemeFontOption(optionName, fontId, description, help);
themeToOptionMap.put(fontId, optionName);
valueMap.put(optionName, option); valueMap.put(optionName, option);
} }
@ -831,6 +864,18 @@ public abstract class AbstractOptions implements Options {
return new ArrayList<>(leafNames); return new ArrayList<>(leafNames);
} }
private void themeChanged(ThemeEvent e) {
if (!e.hasAnyFontChanged()) {
return;
}
for (String fontId : themeToOptionMap.keySet()) {
if (e.isFontChanged(fontId)) {
String optionName = themeToOptionMap.get(fontId);
notifyOptionChanged(optionName, null, Gui.getFont(fontId));
}
}
}
//================================================================================================== //==================================================================================================
// Inner Classes // Inner Classes
//================================================================================================== //==================================================================================================

View file

@ -149,32 +149,6 @@ public interface Options {
public void registerOption(String optionName, OptionType type, Object defaultValue, public void registerOption(String optionName, OptionType type, Object defaultValue,
HelpLocation help, String description, PropertyEditor editor); HelpLocation help, String description, PropertyEditor editor);
/**
* Registers a theme color as an option. Doing this allows the color to be edited in the
* options Gui, but all changes result in a theme change and not an options change. In other
* words, changes to this option causes a theme change and is saved to a theme instead of in
* the tool with normal options
* @param optionName the option name to bind to a theme color id
* @param colorId the theme color id to be affected if a users changes this color option
* @param help the {@link HelpLocation} for more information on how this color is used
* @param description a short description of how this color is used
*/
public void registerThemeColorOption(String optionName, String colorId, HelpLocation help,
String description);
/**
* Registers a theme font as an option. Doing this allows the font to be edited in the
* options Gui, but all changes result in a theme change and not an options change. In other
* words, changes to this option causes a theme change and is saved to a theme instead of in
* the tool with normal options
* @param optionName the option name to bind to a theme font id
* @param fontId the theme font id to be affected if a users changes this font option
* @param help the {@link HelpLocation} for more information on how this font is used
* @param description a short description of how this font is used
*/
public void registerThemeFontOption(String optionName, String fontId, HelpLocation help,
String description);
/** /**
* Register the options editor that will handle the editing for all the options or a sub group of options. * Register the options editor that will handle the editing for all the options or a sub group of options.
* @param editor the custom editor panel to be used to edit the options or sub group of options. * @param editor the custom editor panel to be used to edit the options or sub group of options.

View file

@ -92,18 +92,6 @@ public class SubOptions implements Options {
options.registerOption(prefix + optionName, type, defaultValue, help, description, editor); options.registerOption(prefix + optionName, type, defaultValue, help, description, editor);
} }
@Override
public void registerThemeColorOption(String optionName, String colorId, HelpLocation help,
String description) {
options.registerThemeColorOption(prefix + optionName, colorId, help, description);
}
@Override
public void registerThemeFontOption(String optionName, String fontId, HelpLocation help,
String description) {
options.registerThemeFontOption(prefix + optionName, fontId, help, description);
}
@Override @Override
public void putObject(String optionName, Object obj) { public void putObject(String optionName, Object obj) {
options.putObject(prefix + optionName, obj); options.putObject(prefix + optionName, obj);

View file

@ -28,8 +28,8 @@ color.visualgraph.view.satellite.edge.hovered = color.palette.lime
# graph display # graph display
color.graphdisplay.vertex = green color.graphdisplay.vertex.default = green
color.graphdisplay.edge = green color.graphdisplay.edge.default = green
color.graphdisplay.vertex.selected = blue color.graphdisplay.vertex.selected = blue
color.graphdisplay.edge.selected = blue color.graphdisplay.edge.selected = blue
@ -37,6 +37,8 @@ icon.graph.satellite = network-wireless-16.png
icon.graph.satellite.large = network-wireless.png icon.graph.satellite.large = network-wireless.png
icon.graph.layout.default = color_swatch.png icon.graph.layout.default = color_swatch.png
font.graphdisplay.default = dialog-bold-18
font.graph.component.message = SansSerif-BOLDITALIC-18
[Dark Defaults] [Dark Defaults]

View file

@ -43,8 +43,7 @@ import edu.uci.ics.jung.visualization.renderers.BasicEdgeRenderer;
import edu.uci.ics.jung.visualization.renderers.Renderer; import edu.uci.ics.jung.visualization.renderers.Renderer;
import edu.uci.ics.jung.visualization.renderers.Renderer.Vertex; import edu.uci.ics.jung.visualization.renderers.Renderer.Vertex;
import edu.uci.ics.jung.visualization.util.Caching; import edu.uci.ics.jung.visualization.util.Caching;
import generic.theme.GColor; import generic.theme.*;
import generic.theme.GIcon;
import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import generic.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.graph.VisualGraph; import ghidra.graph.VisualGraph;
@ -1002,6 +1001,7 @@ public class GraphComponent<V extends VisualVertex, E extends VisualEdge<V>, G e
private class MessagePaintable implements Paintable { private class MessagePaintable implements Paintable {
private static final String FONT_ID = "font.graph.component.message";
private final Color backgroundColor = new GColor("color.bg.visualgraph.message"); private final Color backgroundColor = new GColor("color.bg.visualgraph.message");
private String message = null; private String message = null;
@ -1017,7 +1017,7 @@ public class GraphComponent<V extends VisualVertex, E extends VisualEdge<V>, G e
// this composite softens the text and color of the message // this composite softens the text and color of the message
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SrcOver.getRule(), .60f)); g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SrcOver.getRule(), .60f));
Font font = new Font("Sanf Serif", Font.BOLD | Font.ITALIC, 18); Font font = Gui.getFont(FONT_ID);
g.setFont(font); g.setFont(font);
Rectangle stringBounds = Rectangle stringBounds =

View file

@ -26,6 +26,7 @@ import javax.swing.event.ChangeListener;
import docking.Tool; import docking.Tool;
import docking.options.editor.*; import docking.options.editor.*;
import generic.theme.GColor; import generic.theme.GColor;
import generic.theme.Gui;
import ghidra.framework.options.*; import ghidra.framework.options.*;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.WebColors; import ghidra.util.WebColors;
@ -66,8 +67,8 @@ public class GraphDisplayOptions implements OptionsChangeListener {
private Color vertexSelectionColor = new GColor("color.graphdisplay.vertex.selected"); private Color vertexSelectionColor = new GColor("color.graphdisplay.vertex.selected");
private Color edgeSelectionColor = new GColor("color.graphdisplay.edge.selected"); private Color edgeSelectionColor = new GColor("color.graphdisplay.edge.selected");
private Color defaultVertexColor = new GColor("color.graphdisplay.vertex"); private Color defaultVertexColor = new GColor("color.graphdisplay.vertex.default");
private Color defaultEdgeColor = new GColor("color.graphdisplay.edge"); private Color defaultEdgeColor = new GColor("color.graphdisplay.edge.default");
private String favoredEdgeType; private String favoredEdgeType;
private VertexShape defaultVertexShape = VertexShape.RECTANGLE; private VertexShape defaultVertexShape = VertexShape.RECTANGLE;
@ -80,11 +81,16 @@ public class GraphDisplayOptions implements OptionsChangeListener {
private String defaultLayoutAlgorithmName = LayoutAlgorithmNames.MIN_CROSS_COFFMAN_GRAHAM; private String defaultLayoutAlgorithmName = LayoutAlgorithmNames.MIN_CROSS_COFFMAN_GRAHAM;
private boolean useIcons = true; private boolean useIcons = true;
private GraphLabelPosition labelPosition = GraphLabelPosition.SOUTH; private GraphLabelPosition labelPosition = GraphLabelPosition.SOUTH;
private Font font = new Font("Dialog", Font.BOLD, 18); private Font font = Gui.getFont("font.graphdisplay.default");
private String themeFontId = null;
private int arrowLength = 15; private int arrowLength = 15;
private int maxNodeCount = 500; // graph display struggles with too many nodes private int maxNodeCount = 500; // graph display struggles with too many nodes
private Set<String> vertexRegistrations = new HashSet<>();
private Set<String> edgeRegistrations = new HashSet<>();
private Set<String> defaultRegistrations = new HashSet<>();
/** /**
* Constructs a new GraphTypeDisplayOptions for the given {@link GraphType} * Constructs a new GraphTypeDisplayOptions for the given {@link GraphType}
* @param graphType The {@link GraphType} for which to define display options * @param graphType The {@link GraphType} for which to define display options
@ -155,6 +161,16 @@ public class GraphDisplayOptions implements OptionsChangeListener {
this.defaultVertexColor = Objects.requireNonNull(color); this.defaultVertexColor = Objects.requireNonNull(color);
} }
/**
* Sets the default color to be used by vertices that don't have a vertex type set. The
* color is set via a themeColorId, which means the client defined a theme color for this.
* @param themeColorId the theme color id to use for the default vertex color
*/
public void setDefaultVertexColor(String themeColorId) {
this.defaultVertexColor = new GColor(themeColorId);
defaultRegistrations.add(DEFAULT_VERTEX_COLOR);
}
/** /**
* Sets the default color to be used by edges that don't have a edge type set * Sets the default color to be used by edges that don't have a edge type set
* @param color the default edge shape * @param color the default edge shape
@ -163,6 +179,16 @@ public class GraphDisplayOptions implements OptionsChangeListener {
this.defaultEdgeColor = Objects.requireNonNull(color); this.defaultEdgeColor = Objects.requireNonNull(color);
} }
/**
* Sets the default color to be used by vertices that don't have a vertex type set. The
* color is set via a themeColorId, which means the client defined a theme color for this.
* @param themeColorId the theme color id to use for the default vertex color
*/
public void setDefaultEdgeColor(String themeColorId) {
this.defaultEdgeColor = new GColor(themeColorId);
defaultRegistrations.add(DEFAULT_EDGE_COLOR);
}
/** /**
* Returns the default color for edges that don't have an edge type set * Returns the default color for edges that don't have an edge type set
* @return the default color for edges that don't have an edge type set * @return the default color for edges that don't have an edge type set
@ -353,7 +379,9 @@ public class GraphDisplayOptions implements OptionsChangeListener {
} }
/** /**
* Sets the color for vertices with the given vertex type * Sets the color for vertices with the given vertex type. Note that this method does not
* allow the vertex color to be registered in tool options.
* See {@link #setVertexColor(String, String)}.
* @param vertexType the vertex type for which to set its color * @param vertexType the vertex type for which to set its color
* @param color the color to use for vertices with the given vertex type * @param color the color to use for vertices with the given vertex type
*/ */
@ -362,6 +390,18 @@ public class GraphDisplayOptions implements OptionsChangeListener {
vertexColorMap.put(vertexType, Objects.requireNonNull(color)); vertexColorMap.put(vertexType, Objects.requireNonNull(color));
} }
/**
* Sets the vertex color using a theme color id. By using a theme color id, this property
* is eligible to be registered as a tool option.
* @param vertexType the vertex type for which to set its color
* @param themeColorId the theme color id of the color for this vertex type
*/
public void setVertexColor(String vertexType, String themeColorId) {
checkVertexType(vertexType);
vertexColorMap.put(vertexType, new GColor(Objects.requireNonNull(themeColorId)));
vertexRegistrations.add(vertexType);
}
private String getVertexShapeName(String vertexType) { private String getVertexShapeName(String vertexType) {
VertexShape vertexShape = vertexShapeMap.getOrDefault(vertexType, defaultVertexShape); VertexShape vertexShape = vertexShapeMap.getOrDefault(vertexType, defaultVertexShape);
return vertexShape.getName(); return vertexShape.getName();
@ -386,6 +426,18 @@ public class GraphDisplayOptions implements OptionsChangeListener {
return edgeColorMap.getOrDefault(edgeType, defaultEdgeColor); return edgeColorMap.getOrDefault(edgeType, defaultEdgeColor);
} }
/**
* Sets the edge color using a theme color id. By using a theme color id, this property
* is eligible to be registered as a tool option.
* @param edgeType the edge type for which to set its color
* @param themeColorId the theme color id of the color for this edge type
*/
public void setEdgeColor(String edgeType, String themeColorId) {
checkEdgeType(edgeType);
edgeColorMap.put(edgeType, new GColor(Objects.requireNonNull(themeColorId)));
edgeRegistrations.add(edgeType);
}
/** /**
* Sets the color for edges with the given edge type * Sets the color for edges with the given edge type
* @param edgeType the edge type for which to set its color * @param edgeType the edge type for which to set its color
@ -459,13 +511,24 @@ public class GraphDisplayOptions implements OptionsChangeListener {
} }
/** /**
* Sets the vertex selection color * Sets the vertex selection color. Use this method only if this color does not appear in
* the tool options.
* @param vertexSelectionColor the color to use for highlighting selected vertices * @param vertexSelectionColor the color to use for highlighting selected vertices
*/ */
public void setVertexSelectionColor(Color vertexSelectionColor) { public void setVertexSelectionColor(Color vertexSelectionColor) {
this.vertexSelectionColor = vertexSelectionColor; this.vertexSelectionColor = vertexSelectionColor;
} }
/**
* Sets the vertex selection color using the theme color defined by the given color id. This
* method will allow the property to be registered to the tool options.
* @param themeColorId the color id to use for highlighting vertices.
*/
public void setVertexSelectionColor(String themeColorId) {
this.vertexSelectionColor = new GColor(themeColorId);
defaultRegistrations.add(VERTEX_SELECTION_COLOR);
}
/** /**
* Returns the color for edge selections * Returns the color for edge selections
* @return the color fore edge selections * @return the color fore edge selections
@ -475,13 +538,24 @@ public class GraphDisplayOptions implements OptionsChangeListener {
} }
/** /**
* Sets the edge selection color * Sets the edge selection color. Using the method means the color will not appear in the
* tool options.
* @param edgeSelectionColor color to use for highlighting selected edges * @param edgeSelectionColor color to use for highlighting selected edges
*/ */
public void setEdgeSelectionColor(Color edgeSelectionColor) { public void setEdgeSelectionColor(Color edgeSelectionColor) {
this.edgeSelectionColor = edgeSelectionColor; this.edgeSelectionColor = edgeSelectionColor;
} }
/**
* Sets the edge selection color using the theme color defined by the given color id. This
* method will allow the property to be registered to the tool options.
* @param themeColorId the color id to use for highlighting edges.
*/
public void setEdgeSelectionColor(String themeColorId) {
this.edgeSelectionColor = new GColor(themeColorId);
defaultRegistrations.add(EDGE_SELECTION_COLOR);
}
/** /**
* Returns the name of the default graph layout algorithm * Returns the name of the default graph layout algorithm
* @return the name of the default graph layout algorithms * @return the name of the default graph layout algorithms
@ -543,6 +617,11 @@ public class GraphDisplayOptions implements OptionsChangeListener {
this.font = font; this.font = font;
} }
public void setFont(String themeFontId) {
this.themeFontId = themeFontId;
this.font = Gui.getFont(themeFontId);
}
/** /**
* Returns the font being used to render vertex labels * Returns the font being used to render vertex labels
* @return the font being used to render vertex labels * @return the font being used to render vertex labels
@ -617,25 +696,48 @@ public class GraphDisplayOptions implements OptionsChangeListener {
} }
/** /**
* Sets default values for vertex types * Sets default values for vertex types. This method does not allow the vertexType color to
* be eligible to be registered as a tool option.
* @param vertexType the vertex type whose default color and shape are being defined * @param vertexType the vertex type whose default color and shape are being defined
* @param vertexShape the default vertex shape for the given vertex type * @param vertexShape the default vertex shape for the given vertex type
* @param color the default color for the given vertex type * @param color the default color for the given vertex type
*/ */
protected void configureVertexType(String vertexType, VertexShape vertexShape, Color color) { protected void configureVertexType(String vertexType, VertexShape vertexShape, Color color) {
checkVertexType(vertexType); setVertexColor(vertexType, color);
vertexShapeMap.put(vertexType, vertexShape); setVertexShape(vertexType, vertexShape);
vertexColorMap.put(vertexType, color);
} }
/** /**
* Sets default values for edge types * Sets default values for vertex types using theme color ids. This makes them eligible to be
* registered as tool options.
* @param vertexType the vertex type whose default color and shape are being defined
* @param vertexShape the default vertex shape for the given vertex type
* @param themeColorId the color id for the theme color to be used as the color.
*/
protected void configureVertexType(String vertexType, VertexShape vertexShape,
String themeColorId) {
setVertexColor(vertexType, themeColorId);
setVertexShape(vertexType, vertexShape);
}
/**
* Sets default values for edge types. This method does not allow the vertexType color to
* be eligible to be registered as a tool option.
* @param edgeType the edge type whose default color and shape are being defined * @param edgeType the edge type whose default color and shape are being defined
* @param color the default color for the given edge type * @param color the default color for the given edge type
*/ */
protected void configureEdgeType(String edgeType, Color color) { protected void configureEdgeType(String edgeType, Color color) {
checkEdgeType(edgeType); setEdgeColor(edgeType, color);
edgeColorMap.put(edgeType, color); }
/**
* Sets default values for edge types using theme color ids. This makes them eligible to be
* registered as tool options.
* @param edgeType the edge type whose default color and shape are being defined
* @param themeColorId the color id for the theme color to be used as the color.
*/
protected void configureEdgeType(String edgeType, String themeColorId) {
setEdgeColor(edgeType, themeColorId);
} }
/** /**
@ -727,8 +829,10 @@ public class GraphDisplayOptions implements OptionsChangeListener {
Options options = rootOptions.getOptions(VERTEX_COLORS); Options options = rootOptions.getOptions(VERTEX_COLORS);
for (String vertexType : graphType.getVertexTypes()) { for (String vertexType : graphType.getVertexTypes()) {
options.registerOption(vertexType, OptionType.COLOR_TYPE, getVertexColor(vertexType), if (vertexRegistrations.contains(vertexType)) {
help, "Choose the color for this vertex type"); options.registerOption(vertexType, OptionType.COLOR_TYPE,
getVertexColor(vertexType), help, "Choose the color for this vertex type");
}
} }
List<String> list = new ArrayList<>(graphType.getVertexTypes()); List<String> list = new ArrayList<>(graphType.getVertexTypes());
OptionsEditor editor = new ScrollableOptionsEditor(VERTEX_COLORS, list); OptionsEditor editor = new ScrollableOptionsEditor(VERTEX_COLORS, list);
@ -755,8 +859,10 @@ public class GraphDisplayOptions implements OptionsChangeListener {
Options options = rootOptions.getOptions(EDGE_COLORS); Options options = rootOptions.getOptions(EDGE_COLORS);
for (String edgeType : graphType.getEdgeTypes()) { for (String edgeType : graphType.getEdgeTypes()) {
options.registerOption(edgeType, OptionType.COLOR_TYPE, getEdgeColor(edgeType), help, if (edgeRegistrations.contains(edgeType)) {
"Choose the color for this edge type"); options.registerOption(edgeType, OptionType.COLOR_TYPE, getEdgeColor(edgeType),
help, "Choose the color for this edge type");
}
} }
List<String> list = new ArrayList<>(graphType.getEdgeTypes()); List<String> list = new ArrayList<>(graphType.getEdgeTypes());
OptionsEditor editor = new ScrollableOptionsEditor(EDGE_COLORS, list); OptionsEditor editor = new ScrollableOptionsEditor(EDGE_COLORS, list);
@ -764,29 +870,45 @@ public class GraphDisplayOptions implements OptionsChangeListener {
} }
private void registerMiscellaneousOptions(Options rootOptions, HelpLocation help) { private void registerMiscellaneousOptions(Options rootOptions, HelpLocation help) {
List<String> optionNamesInDisplayOrder = new ArrayList<>();
Options options = rootOptions.getOptions(MISCELLANEOUS_OPTIONS); Options options = rootOptions.getOptions(MISCELLANEOUS_OPTIONS);
optionNamesInDisplayOrder.add(MAX_NODES_SIZE);
options.registerOption(MAX_NODES_SIZE, OptionType.INT_TYPE, maxNodeCount, help, options.registerOption(MAX_NODES_SIZE, OptionType.INT_TYPE, maxNodeCount, help,
"Graphs with more than this number of nodes will not be displayed. (Large graphs can cause Ghidra to become unstable/sluggish)"); "Graphs with more than this number of nodes will not be displayed. (Large graphs can cause Ghidra to become unstable/sluggish)");
StringWithChoicesEditor editor = new StringWithChoicesEditor(VertexShape.getShapeNames()); StringWithChoicesEditor editor = new StringWithChoicesEditor(VertexShape.getShapeNames());
options.registerOption(VERTEX_SELECTION_COLOR, OptionType.COLOR_TYPE, vertexSelectionColor, if (defaultRegistrations.contains(VERTEX_SELECTION_COLOR)) {
help, "Color for highlighting selected vertices"); optionNamesInDisplayOrder.add(VERTEX_SELECTION_COLOR);
options.registerOption(VERTEX_SELECTION_COLOR, OptionType.COLOR_TYPE,
vertexSelectionColor, help, "Color for highlighting selected vertices");
}
if (defaultRegistrations.contains(EDGE_SELECTION_COLOR)) {
optionNamesInDisplayOrder.add(EDGE_SELECTION_COLOR);
options.registerOption(EDGE_SELECTION_COLOR, OptionType.COLOR_TYPE, edgeSelectionColor, options.registerOption(EDGE_SELECTION_COLOR, OptionType.COLOR_TYPE, edgeSelectionColor,
help, "Color for highlighting selected edge"); help, "Color for highlighting selected edge");
}
if (defaultRegistrations.contains(DEFAULT_VERTEX_COLOR)) {
optionNamesInDisplayOrder.add(DEFAULT_VERTEX_COLOR);
options.registerOption(DEFAULT_VERTEX_COLOR, OptionType.COLOR_TYPE, defaultVertexColor,
help, "Color for vertices that have no vertex type defined");
}
if (defaultRegistrations.contains(DEFAULT_EDGE_COLOR)) {
optionNamesInDisplayOrder.add(DEFAULT_EDGE_COLOR);
options.registerOption(DEFAULT_EDGE_COLOR, OptionType.COLOR_TYPE, defaultEdgeColor,
help, "Color for edge that have no edge type defined");
}
optionNamesInDisplayOrder.add(DEFAULT_VERTEX_SHAPE);
options.registerOption(DEFAULT_VERTEX_SHAPE, OptionType.STRING_TYPE, options.registerOption(DEFAULT_VERTEX_SHAPE, OptionType.STRING_TYPE,
defaultVertexShape.getName(), help, defaultVertexShape.getName(), help,
"Shape for vertices that have no vertex type defined", editor); "Shape for vertices that have no vertex type defined", editor);
options.registerOption(DEFAULT_VERTEX_COLOR, OptionType.COLOR_TYPE, defaultVertexColor, optionNamesInDisplayOrder.add(FAVORED_EDGE_TYPE);
help, "Color for vertices that have no vertex type defined");
options.registerOption(DEFAULT_EDGE_COLOR, OptionType.COLOR_TYPE, defaultEdgeColor, help,
"Color for edge that have no edge type defined");
List<String> edgeTypes = graphType.getEdgeTypes(); List<String> edgeTypes = graphType.getEdgeTypes();
if (!edgeTypes.isEmpty()) { if (!edgeTypes.isEmpty()) {
editor = new StringWithChoicesEditor(edgeTypes); editor = new StringWithChoicesEditor(edgeTypes);
@ -794,32 +916,24 @@ public class GraphDisplayOptions implements OptionsChangeListener {
"Favored edge is used to influence layout algorithms", editor); "Favored edge is used to influence layout algorithms", editor);
} }
optionNamesInDisplayOrder.add(DEFAULT_LAYOUT_ALGORITHM);
editor = new StringWithChoicesEditor(LayoutAlgorithmNames.getLayoutAlgorithmNames()); editor = new StringWithChoicesEditor(LayoutAlgorithmNames.getLayoutAlgorithmNames());
options.registerOption(DEFAULT_LAYOUT_ALGORITHM, OptionType.STRING_TYPE, options.registerOption(DEFAULT_LAYOUT_ALGORITHM, OptionType.STRING_TYPE,
defaultLayoutAlgorithmName, help, "Initial layout algorithm", editor); defaultLayoutAlgorithmName, help, "Initial layout algorithm", editor);
options.registerOption(USE_ICONS, OptionType.BOOLEAN_TYPE, useIcons, help, optionNamesInDisplayOrder.add(LABEL_POSITION);
"If true, vertices are drawn using pre-rendered images versus compact shapes");
options.registerOption(LABEL_POSITION, OptionType.ENUM_TYPE, labelPosition, help, options.registerOption(LABEL_POSITION, OptionType.ENUM_TYPE, labelPosition, help,
"Relative postion of labels to vertex shape (Only applicable if \"Use Icons\" is true"); "Relative postion of labels to vertex shape (Only applicable if \"Use Icons\" is true");
options.registerOption(FONT, OptionType.FONT_TYPE, font, help, if (themeFontId != null) {
"Font to use for vertex labels");
List<String> optionNamesInDisplayOrder = new ArrayList<>();
optionNamesInDisplayOrder.add(MAX_NODES_SIZE);
optionNamesInDisplayOrder.add(VERTEX_SELECTION_COLOR);
optionNamesInDisplayOrder.add(EDGE_SELECTION_COLOR);
optionNamesInDisplayOrder.add(DEFAULT_VERTEX_COLOR);
optionNamesInDisplayOrder.add(DEFAULT_EDGE_COLOR);
optionNamesInDisplayOrder.add(DEFAULT_VERTEX_SHAPE);
optionNamesInDisplayOrder.add(FAVORED_EDGE_TYPE);
optionNamesInDisplayOrder.add(DEFAULT_LAYOUT_ALGORITHM);
optionNamesInDisplayOrder.add(LABEL_POSITION);
optionNamesInDisplayOrder.add(FONT); optionNamesInDisplayOrder.add(FONT);
options.registerOption(FONT, OptionType.FONT_TYPE, themeFontId, help,
"Font to use for vertex labels");
}
optionNamesInDisplayOrder.add(USE_ICONS); optionNamesInDisplayOrder.add(USE_ICONS);
options.registerOption(USE_ICONS, OptionType.BOOLEAN_TYPE, useIcons, help,
"If true, vertices are drawn using pre-rendered images versus compact shapes");
OptionsEditor optionsEditor = OptionsEditor optionsEditor =
new ScrollableOptionsEditor(MISCELLANEOUS_OPTIONS, optionNamesInDisplayOrder); new ScrollableOptionsEditor(MISCELLANEOUS_OPTIONS, optionNamesInDisplayOrder);

Some files were not shown because too many files have changed in this diff Show more