From a99841e6d4c846e08f24a1d7931d5c8dc006d02f Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 2 Sep 2022 16:22:34 -0400 Subject: [PATCH] GP-1981 - Theming - PDB and Code Compare Modules --- .../InstructionSearchPlugin.java | 8 ++-- .../ui/InsertBytesWidget.java | 6 +-- .../ui/InstructionSearchDialog.java | 4 +- .../ui/InstructionTable.java | 4 +- .../ui/SearchInstructionsTask.java | 4 +- .../entropy/EntropyOverviewColorService.java | 2 +- .../EntropyOverviewOptionsManager.java | 4 +- .../core/overview/entropy/KnotLabelPanel.java | 4 +- .../core/overview/entropy/KnotPanel.java | 4 +- .../core/overview/entropy/LegendPanel.java | 2 +- .../{Palette.java => OverviewPalette.java} | 4 +- .../core/overview/entropy/PalettePanel.java | 4 +- .../pdb/symbolserver/ui/LoadPdbDialog.java | 22 ++++----- .../pdb/symbolserver/ui/SymbolFilePanel.java | 5 +- .../symbolserver/ui/SymbolServerPanel.java | 8 ++-- .../java/generic/theme/GThemeDefaults.java | 48 ++++++++++++------- .../java/generic/theme/TempColorUtils.java | 8 ++++ .../Graph/data/graph.theme.properties | 9 ++-- .../framework/main/EditPluginPathDialog.java | 4 +- .../java/ghidra/framework/main/LogPanel.java | 4 +- .../screenshot/OverviewPluginScreenShots.java | 2 +- 21 files changed, 93 insertions(+), 67 deletions(-) rename Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/{Palette.java => OverviewPalette.java} (97%) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java index eadaab870d..c9c16fc75a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java @@ -21,7 +21,7 @@ import java.util.Set; import docking.action.DockingAction; import docking.action.MenuData; import docking.tool.ToolConstants; -import generic.theme.GThemeDefaults.Colors.Dialogs; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.app.CorePluginPackage; import ghidra.app.context.NavigatableActionContext; import ghidra.app.context.NavigatableContextAction; @@ -135,12 +135,12 @@ public class InstructionSearchPlugin extends ProgramPlugin { if (selection.getNumAddresses() == 0) { dialog.displayMessage( "Select instructions from the listing (and hit reload) to populate the table.", - Dialogs.FG_MESSAGE_NORMAL); + Messages.FG_MESSAGE_NORMAL); return false; } if (!isSelectionSizeValid(selection)) { dialog.displayMessage("Invalid selection. Cannot select more than " + - MAX_SELECTION_SIZE + " instructions and/or data items.", Dialogs.FG_MESSAGE_ERROR); + MAX_SELECTION_SIZE + " instructions and/or data items.", Messages.FG_MESSAGE_ERROR); return false; } @@ -150,7 +150,7 @@ public class InstructionSearchPlugin extends ProgramPlugin { } } catch (InvalidInputException e) { - dialog.displayMessage(e.getMessage(), Dialogs.FG_MESSAGE_ERROR); + dialog.displayMessage(e.getMessage(), Messages.FG_MESSAGE_ERROR); return false; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InsertBytesWidget.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InsertBytesWidget.java index 5814423a2c..5545227022 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InsertBytesWidget.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InsertBytesWidget.java @@ -26,7 +26,7 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import docking.DialogComponentProvider; -import generic.theme.GThemeDefaults.Colors.Dialogs; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.app.plugin.core.instructionsearch.model.*; import ghidra.app.plugin.core.instructionsearch.ui.SelectionModeWidget.InputMode; import ghidra.app.plugin.core.instructionsearch.util.InstructionSearchUtils; @@ -293,7 +293,7 @@ public class InsertBytesWidget extends DialogComponentProvider implements KeyLis // exit. if (allBytes.size() < instruction.getLength()) { msgPanel.setMessageText("Input invalid: unknown disassembly error.", - Dialogs.FG_MESSAGE_ERROR); + Messages.FG_MESSAGE_ERROR); return; } allBytes.subList(0, instruction.getLength()).clear(); @@ -304,7 +304,7 @@ public class InsertBytesWidget extends DialogComponentProvider implements KeyLis // If there's an exception, just stop and let the user figure out what went // wrong - no need to continue. msgPanel.setMessageText("Input invalid: unknown disassembly error.", - Dialogs.FG_MESSAGE_ERROR); + Messages.FG_MESSAGE_ERROR); Msg.debug(this, "Error disassembling instruction", e); return; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java index b546e8889b..c0f94d85f8 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java @@ -24,7 +24,7 @@ import javax.swing.*; import docking.ComponentProvider; import docking.DialogComponentProvider; import generic.theme.GColor; -import generic.theme.GThemeDefaults.Colors.Dialogs; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.app.events.ProgramSelectionPluginEvent; import ghidra.app.plugin.core.instructionsearch.InstructionSearchPlugin; import ghidra.app.plugin.core.instructionsearch.model.InstructionMetadata; @@ -141,7 +141,7 @@ public class InstructionSearchDialog extends DialogComponentProvider implements if (selection == null && getMessagePanel() != null) { getMessagePanel().setMessageText( "Select instructions from the listing (and hit reload) to populate the table.", - Dialogs.FG_MESSAGE_NORMAL); + Messages.FG_MESSAGE_NORMAL); } if (selection != null && plugin.isSelectionValid(selection, this)) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java index 0e3b33cf66..88fa5917f7 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java @@ -22,7 +22,7 @@ import javax.swing.*; import docking.DockingWindowManager; import docking.widgets.EmptyBorderButton; -import generic.theme.GThemeDefaults.Colors.Dialogs; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.app.plugin.core.instructionsearch.InstructionSearchPlugin; import ghidra.app.plugin.core.instructionsearch.model.*; import ghidra.app.services.GoToService; @@ -521,7 +521,7 @@ public class InstructionTable extends AbstractInstructionTable { dialog.getMessagePanel() .setMessageText( "Instruction was loaded manually, no address in the listing to navigate to.", - Dialogs.FG_MESSAGE_NORMAL); + Messages.FG_MESSAGE_NORMAL); } } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SearchInstructionsTask.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SearchInstructionsTask.java index 69bd7f6ec5..b765423463 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SearchInstructionsTask.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SearchInstructionsTask.java @@ -17,7 +17,7 @@ package ghidra.app.plugin.core.instructionsearch.ui; import java.util.*; -import generic.theme.GThemeDefaults.Colors.Dialogs; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.app.plugin.core.instructionsearch.InstructionSearchPlugin; import ghidra.app.plugin.core.instructionsearch.model.InstructionMetadata; import ghidra.app.plugin.core.instructionsearch.ui.SearchDirectionWidget.Direction; @@ -137,7 +137,7 @@ class SearchInstructionsTask extends Task { // If we've gone through all the ranges and there are still no results, show an // error message. searchDialog.getMessagePanel() - .setMessageText("No results found", Dialogs.FG_MESSAGE_NORMAL); + .setMessageText("No results found", Messages.FG_MESSAGE_NORMAL); return; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java index 16d2b5d6f8..ff26592b01 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java @@ -42,7 +42,7 @@ public class EntropyOverviewColorService implements OverviewColorService { private byte[] chunkBuffer; private double[] logtable; private int[] histogram = new int[256]; - private Palette palette; + private OverviewPalette palette; private EntropyOverviewOptionsManager entropyOptionsManager; private OverviewColorComponent overviewComponent; private OverviewColorLegendDialog legendDialog; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewOptionsManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewOptionsManager.java index 489d043ed6..8d9c464fd6 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewOptionsManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewOptionsManager.java @@ -85,7 +85,7 @@ public class EntropyOverviewOptionsManager implements OptionsChangeListener { private EntropyKnot knot4type; private Color knot5color; private EntropyKnot knot5type; - private Palette palette = new Palette(256, UNINITIALIZED_COLOR); + private OverviewPalette palette = new OverviewPalette(256, UNINITIALIZED_COLOR); private EntropyOverviewColorService service; public EntropyOverviewOptionsManager(PluginTool tool, EntropyOverviewColorService service) { @@ -193,7 +193,7 @@ public class EntropyOverviewOptionsManager implements OptionsChangeListener { * Returns the palette computed after reading the options. * @return the color palette for the {@link EntropyOverviewColorService} */ - public Palette getPalette() { + public OverviewPalette getPalette() { return palette; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotLabelPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotLabelPanel.java index f2781bdf68..5074b55d98 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotLabelPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotLabelPanel.java @@ -25,13 +25,13 @@ import generic.theme.GThemeDefaults.Colors.Java; public class KnotLabelPanel extends JPanel { private static final Font FONT = new Font("Times New Roman", Font.BOLD, 16); private int topBottomMargin = 10; - private Palette palette; + private OverviewPalette palette; public KnotLabelPanel(int topBottomMargin) { this.topBottomMargin = topBottomMargin; } - public void setPalette(Palette palette) { + public void setPalette(OverviewPalette palette) { this.palette = palette; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java index 8d0bed8688..344c1e25f7 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java @@ -39,7 +39,7 @@ public class KnotPanel extends JPanel implements ComponentListener { private static final Color FG_COLOR_TEXT = new GColor("color.bg.plugin.overview.entropy.palette.text"); - private Palette palette = null; + private OverviewPalette palette = null; private FontMetrics metrics; private ChangeListener paletteListener = e -> buildLabels(); @@ -117,7 +117,7 @@ public class KnotPanel extends JPanel implements ComponentListener { return getFontMetrics(newFont); } - public void setPalette(Palette pal) { + public void setPalette(OverviewPalette pal) { palette = pal; palette.addPaletteListener(paletteListener); buildLabels(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java index e466589ab4..d06dfe1ee5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java @@ -48,7 +48,7 @@ public class LegendPanel extends JPanel { return new Dimension(210, 300); } - public void setPalette(Palette pal) { + public void setPalette(OverviewPalette pal) { palettePanel.setPalette(pal); knotPanel.setPalette(pal); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/Palette.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/OverviewPalette.java similarity index 97% rename from Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/Palette.java rename to Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/OverviewPalette.java index 7d36745fe4..c65526317e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/Palette.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/OverviewPalette.java @@ -28,7 +28,7 @@ import ghidra.util.datastruct.WeakSet; /** * Manages the colors used by the entropy overview bar. */ -public class Palette { +public class OverviewPalette { private Color uninitializedColor; private Color[] colors; private ArrayList knots; @@ -36,7 +36,7 @@ public class Palette { private WeakSet listeners = WeakDataStructureFactory.createSingleThreadAccessWeakSet(); - public Palette(int sz, Color uninit) { + public OverviewPalette(int sz, Color uninit) { uninitializedColor = uninit; colors = new Color[sz]; knots = new ArrayList<>(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java index 1bbe5022ff..3ab95ed958 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java @@ -23,7 +23,7 @@ import generic.theme.GThemeDefaults.Colors.Java; public class PalettePanel extends JPanel { - private Palette palette; + private OverviewPalette palette; private final int topBottomMargin; PalettePanel(int topBottomMargin) { @@ -35,7 +35,7 @@ public class PalettePanel extends JPanel { return new Dimension(20, 10); } - public void setPalette(Palette palette) { + public void setPalette(OverviewPalette palette) { this.palette = palette; } diff --git a/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/LoadPdbDialog.java b/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/LoadPdbDialog.java index 92db3e6e08..4ce9f5d536 100644 --- a/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/LoadPdbDialog.java +++ b/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/LoadPdbDialog.java @@ -41,6 +41,8 @@ import docking.widgets.label.GIconLabel; import docking.widgets.label.GLabel; import docking.widgets.textfield.HexOrDecimalInput; import docking.widgets.textfield.HintTextField; +import generic.theme.GThemeDefaults.Colors; +import generic.theme.TempColorUtils; import ghidra.app.util.bin.format.pdb.PdbParser; import ghidra.app.util.bin.format.pdb2.pdbreader.PdbIdentifiers; import ghidra.app.util.pdb.pdbapplicator.PdbApplicatorControl; @@ -172,7 +174,7 @@ public class LoadPdbDialog extends DialogComponentProvider { protected void dialogShown() { cancelButton.requestFocusInWindow(); - if ( getCurrentSymbolFileInfo() != null ) { + if (getCurrentSymbolFileInfo() != null) { searchForPdbs(false); } } @@ -377,7 +379,7 @@ public class LoadPdbDialog extends DialogComponentProvider { programNameTextField.setEditable(false); programNameTextField.setText(program.getName()); - pdbPathTextField = new BetterNonEditableTextField(20, "Missing", Color.red); + pdbPathTextField = new BetterNonEditableTextField(20, "Missing", Colors.ERROR); pdbPathTextField.setEditable(false); pdbPathTextField.setText(programSymbolFileInfo.getPath()); pdbPathTextField.getDocument().addDocumentListener(docListener); @@ -399,7 +401,7 @@ public class LoadPdbDialog extends DialogComponentProvider { new HelpLocation(PdbPlugin.PDB_PLUGIN_HELP_TOPIC, SymbolFilePanel.SEARCH_OPTIONS_HELP_ANCHOR)); - pdbUniqueIdTextField = new BetterNonEditableTextField(36, "Missing", Color.red); + pdbUniqueIdTextField = new BetterNonEditableTextField(36, "Missing", Colors.ERROR); pdbUniqueIdTextField.setEditable(false); pdbUniqueIdTextField.setText(programSymbolFileInfo.getUniqifierString()); pdbUniqueIdTextField.setToolTipText( @@ -889,10 +891,9 @@ public class LoadPdbDialog extends DialogComponentProvider { Container parent = getParent(); if (parent != null && !isEditable()) { Color bg = parent.getBackground(); - // mint a new Color object to avoid it being - // ignored because the parent handed us a DerivedColor - // instance - return new Color(bg.getRGB()); + // mint a new Color object to avoid it being ignored because the parent handed us a + // DerivedColor instance + return TempColorUtils.fromRgb(bg.getRGB()); } return super.getBackground(); } @@ -931,10 +932,9 @@ public class LoadPdbDialog extends DialogComponentProvider { Container parent = getParent(); if (parent != null && !isEditable()) { Color bg = parent.getBackground(); - // mint a new Color object to avoid it being - // ignored because the parent handed us a DerivedColor - // instance - return new Color(bg.getRGB()); + // mint a new Color object to avoid it being ignored because the parent handed us a + // DerivedColor instance + return TempColorUtils.fromRgb(bg.getRGB()); } return super.getBackground(); } diff --git a/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolFilePanel.java b/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolFilePanel.java index c060524041..559065001e 100644 --- a/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolFilePanel.java +++ b/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolFilePanel.java @@ -27,6 +27,7 @@ import docking.DockingWindowManager; import docking.widgets.checkbox.GCheckBox; import docking.widgets.label.GHtmlLabel; import docking.widgets.label.GLabel; +import generic.theme.GThemeDefaults.Colors; import ghidra.util.HelpLocation; import ghidra.util.table.GhidraTable; import pdb.PdbPlugin; @@ -40,6 +41,7 @@ class SymbolFilePanel extends JPanel { interface SearchCallback { void searchForPdbs(boolean allowRemote); } + static final String SEARCH_OPTIONS_HELP_ANCHOR = "PDB_Search_Search_Options"; private SymbolFileTableModel tableModel; private GhidraTable table; @@ -117,7 +119,8 @@ class SymbolFilePanel extends JPanel { private JPanel buildWelcomePanel() { welcomePanel = new JPanel(); welcomePanel.add(new GHtmlLabel( - "
Configuration must be set first!")); + "
Configuration must be set first!")); welcomePanel.setPreferredSize(tablePanel.getPreferredSize()); return welcomePanel; diff --git a/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolServerPanel.java b/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolServerPanel.java index dc862ff49d..712a6340e1 100644 --- a/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolServerPanel.java +++ b/Ghidra/Features/PDB/src/main/java/pdb/symbolserver/ui/SymbolServerPanel.java @@ -36,6 +36,7 @@ import docking.widgets.label.GHtmlLabel; import docking.widgets.label.GLabel; import docking.widgets.table.GTable; import docking.widgets.textfield.HintTextField; +import generic.theme.GThemeDefaults.Colors; import ghidra.framework.preferences.Preferences; import ghidra.util.*; import ghidra.util.layout.PairLayout; @@ -108,7 +109,8 @@ class SymbolServerPanel extends JPanel { JScrollPane tableScrollPane = buildTable(); defaultConfigNotice = new JPanel(); defaultConfigNotice.add(new GHtmlLabel( - "

" + "Missing / invalid configuration.

" + + "

" + "Missing / invalid configuration.

" + "Using default search location:
" + "Program's Import Location
", SwingConstants.CENTER)); defaultConfigNotice.setPreferredSize(tableScrollPane.getPreferredSize()); @@ -395,8 +397,8 @@ class SymbolServerPanel extends JPanel { String[] envParts = envString.split("[*;]"); List results = new ArrayList<>(); Set locationStringDeduplicationSet = new HashSet<>(); - for (int i = 0; i < envParts.length; i++) { - String locationString = envParts[i].trim(); + for (String envPart : envParts) { + String locationString = envPart.trim(); if (!locationString.isBlank() && !locationString.equalsIgnoreCase("srv") && !locationStringDeduplicationSet.contains(locationString)) { results.add(locationString); diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/GThemeDefaults.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/GThemeDefaults.java index 13e5ccebd3..a0b1ba7134 100644 --- a/Ghidra/Framework/Generic/src/main/java/generic/theme/GThemeDefaults.java +++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/GThemeDefaults.java @@ -65,7 +65,7 @@ public class GThemeDefaults { //@formatter:on } - public static class Dialogs { + public static class Messages { //@formatter:off public static final GColor FG_MESSAGE_NORMAL = new GColor("color.fg.dialog.status.normal"); public static final GColor FG_MESSAGE_ERROR = new GColor("color.fg.dialog.status.error"); @@ -79,24 +79,38 @@ public class GThemeDefaults { public static class Palette { /** Transparent color */ - public static final Color NO_COLOR = palette("nocolor"); + public static final Color NO_COLOR = getColor("nocolor"); - public static final GColor BLACK = palette("black"); - public static final GColor BLUE = palette("blue"); - public static final GColor CYAN = palette("cyan"); - public static final GColor GOLD = palette("gold"); - public static final GColor GRAY = palette("gray"); - public static final GColor GREEN = palette("green"); - public static final GColor LIGHT_GRAY = palette("lightgray"); - public static final GColor LIME = palette("lime"); - public static final GColor MAGENTA = palette("magenta"); - public static final GColor ORANGE = palette("orange"); - public static final GColor PINK = palette("pink"); - public static final GColor RED = palette("red"); - public static final GColor WHITE = palette("white"); - public static final GColor YELLOW = palette("yellow"); + public static final GColor BLACK = getColor("black"); + public static final GColor BLUE = getColor("blue"); + public static final GColor CYAN = getColor("cyan"); + public static final GColor GOLD = getColor("gold"); + public static final GColor GRAY = getColor("gray"); + public static final GColor GREEN = getColor("green"); + public static final GColor LAVENDER = getColor("lavander"); + public static final GColor LIGHT_GRAY = getColor("lightgray"); + public static final GColor LIME = getColor("lime"); + public static final GColor MAGENTA = getColor("magenta"); + public static final GColor ORANGE = getColor("orange"); + public static final GColor PINK = getColor("pink"); + public static final GColor RED = getColor("red"); + public static final GColor WHITE = getColor("white"); + public static final GColor YELLOW = getColor("yellow"); - private static GColor palette(String name) { + /** + * Returns a new {@link GColor} for the given palette name. + *

+ * For a list of supported palette IDs, see {@code docking.palette.theme.properties}. + *

+ * It is preferred to use the static colors defined in {@link Palette} when possible, as + * it prevents excess object creation. This method should be used when the desired + * palette color is not in that list. Further, this method should only be called once + * per use, such as when initializing a constant value. + * + * @param name the palette entry name + * @return the GColor + */ + public static GColor getColor(String name) { return new GColor("color.palette." + name); } } diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/TempColorUtils.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/TempColorUtils.java index 3f4a88e323..c2cad37702 100644 --- a/Ghidra/Framework/Generic/src/main/java/generic/theme/TempColorUtils.java +++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/TempColorUtils.java @@ -35,6 +35,14 @@ public class TempColorUtils { return new Color(r, g, b); } + public static Color fromRgba(int r, int g, int b, int a) { + return new Color(r, g, b, a); + } + + public static Color fromRgba(float r, float g, float b, float a) { + return new Color(r, g, b, a); + } + public static Color withAlpha(Color c, int a) { return new Color(c.getRed(), c.getGreen(), c.getBlue(), a); } diff --git a/Ghidra/Framework/Graph/data/graph.theme.properties b/Ghidra/Framework/Graph/data/graph.theme.properties index 1fd525d29c..51f39570e8 100644 --- a/Ghidra/Framework/Graph/data/graph.theme.properties +++ b/Ghidra/Framework/Graph/data/graph.theme.properties @@ -9,11 +9,10 @@ color.bg.visualgraph.message = rgb(138, 185, 241) // jordy blue color.bg.visualgraph.drop.shadow.dark = black color.bg.visualgraph.drop.shadow.light = gray -color.bg.visualgraph.satellite.vertex = color.palette.material.secondary.variant +color.bg.visualgraph.satellite.vertex = #018786 color.fg.visualgraph.message = color.palette.black -// TODO maybe make this darker for light mode; it is bright against a bright background -color.bg.visualgraph.dockingvertex = color.palette.material.secondary +color.bg.visualgraph.dockingvertex = #03DAC6 color.fg.visualgraph.dockingvertex = black color.visualgraph.dockingvertex.cursor = red @@ -45,9 +44,9 @@ color.fg.visualgraph.message = color.palette.lightgray color.bg.visualgraph.drop.shadow.dark = black color.bg.visualgraph.drop.shadow.light = gray -color.bg.visualgraph.satellite.vertex = color.palette.material.secondary.variant +color.bg.visualgraph.satellite.vertex = #018786 -color.bg.visualgraph.dockingvertex = color.palette.material.secondary.variant +color.bg.visualgraph.dockingvertex = #018786 color.fg.visualgraph.dockingvertex = black // unchanged color.visualgraph.dockingvertex.cursor = pink // arbitrary diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java index 8278fa8f96..ccae6e41f1 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java @@ -35,7 +35,7 @@ import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.label.GDLabel; import docking.widgets.list.GListCellRenderer; -import generic.theme.GThemeDefaults.Colors.Dialogs; +import generic.theme.GThemeDefaults.Colors.Messages; import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.preferences.Preferences; @@ -61,7 +61,7 @@ class EditPluginPathDialog extends DialogComponentProvider { private final static int SIDE_MARGIN = 5; private final static Color INVALID_PATH_COLOR = Tables.FG_ERROR_UNSELECTED; private final static Color INVALID_SELECTED_PATH_COLOR = Tables.FG_ERROR_SELECTED; - private final static Color STATUS_MESSAGE_COLOR = Dialogs.FG_MESSAGE_NORMAL; + private final static Color STATUS_MESSAGE_COLOR = Messages.FG_MESSAGE_NORMAL; final static String EMPTY_STATUS = " "; private ExtensionFileFilter JAR_FILTER = diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java index 4a9ca5ab8c..967be78706 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java @@ -27,7 +27,7 @@ import org.apache.logging.log4j.core.config.Configuration; import docking.StatusBarSpacer; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GDLabel; -import generic.theme.GThemeDefaults.Colors.Dialogs; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.util.HelpLocation; import ghidra.util.Msg; import ghidra.util.layout.HorizontalLayout; @@ -96,7 +96,7 @@ public class LogPanel extends JPanel implements LogListener { public void messageLogged(String message, boolean isError) { messageUpdater.run(() -> { - label.setForeground(isError ? Dialogs.FG_MESSAGE_ERROR : defaultColor); + label.setForeground(isError ? Messages.FG_MESSAGE_ERROR : defaultColor); String text = message.replace("\n", " "); label.setText(text); label.setToolTipText(text); diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java index 2ba60e43b7..6503c9df64 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java @@ -74,7 +74,7 @@ public class OverviewPluginScreenShots extends GhidraScreenShotGenerator { public void testEntropyLegend() { EntropyOverviewOptionsManager options = new EntropyOverviewOptionsManager(tool, entropyService); - Palette palette = options.getPalette(); + OverviewPalette palette = options.getPalette(); LegendPanel legendPanel = new LegendPanel(); legendPanel.setPalette(palette); OverviewColorLegendDialog legendDialog =