diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java index 9942dbab4e..a7b641bd93 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java @@ -46,8 +46,8 @@ import ghidra.util.bean.opteditor.OptionsVetoException; public abstract class AbstractReferenceHover extends AbstractConfigurableHover { private static final int WINDOW_OFFSET = 50; - private static final Color BACKGROUND_COLOR = Colors.TOOLTIP_BACKGROUND; - private static final Color FG_COLOR_NOT_IN_MEMORY = new GColor("color.fg.disabled"); + private static final Color BACKGROUND_COLOR = Colors.BACKGROUND_TOOLTIP; + private static final Color FG_COLOR_NOT_IN_MEMORY = new GColor("color.fg.hint"); private CodeFormatService codeFormatService; private ListingPanel panel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java index 12c9e8501d..299cd4734b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java @@ -38,7 +38,7 @@ import ghidra.app.plugin.core.console.CodeCompletion; public class CodeCompletionWindow extends JDialog { private static final long serialVersionUID = 1L; /* from ReferenceHoverPlugin */ - private static final Color BACKGROUND_COLOR = Colors.TOOLTIP_BACKGROUND; + private static final Color BACKGROUND_COLOR = Colors.BACKGROUND_TOOLTIP; protected final InterpreterPanel console; protected final JTextPane outputTextField; diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/FGVertex.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/FGVertex.java index 75c8a733a7..afe41332a8 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/FGVertex.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/FGVertex.java @@ -40,7 +40,7 @@ import ghidra.program.util.ProgramSelection; */ public interface FGVertex extends VisualVertex { - static final Color TOOLTIP_BACKGROUND_COLOR = Colors.TOOLTIP_BACKGROUND; + static final Color TOOLTIP_BACKGROUND_COLOR = Colors.BACKGROUND_TOOLTIP; public FGVertex cloneVertex(FGController newController); diff --git a/Ghidra/Framework/Docking/data/docking.palette.theme.properties b/Ghidra/Framework/Docking/data/docking.palette.theme.properties index a6f116d7c2..8ba50f2732 100644 --- a/Ghidra/Framework/Docking/data/docking.palette.theme.properties +++ b/Ghidra/Framework/Docking/data/docking.palette.theme.properties @@ -8,6 +8,7 @@ color.palette.blue = blue color.palette.crimson = crimson color.palette.cyan = cyan color.palette.darkblue = DarkBlue +color.palette.darkgray = DarkGray color.palette.darkkhaki = DarkKhaki color.palette.darkred = DarkRed color.palette.dodgerblue = DodgerBlue @@ -20,6 +21,8 @@ color.palette.lime = lime color.palette.lightgray = rgb(192, 192, 192) color.palette.lightgreen = rgb(127, 255, 127) color.palette.lightred = rgb(255, 127, 127) +color.palette.lightskyblue = lightskyblue +color.palette.lightsteelblue = lightsteelblue color.palette.magenta = magenta color.palette.mistyrose = mistyrose color.palette.olive = olive diff --git a/Ghidra/Framework/Docking/data/docking.theme.properties b/Ghidra/Framework/Docking/data/docking.theme.properties index 4aeda93f67..62504ade69 100644 --- a/Ghidra/Framework/Docking/data/docking.theme.properties +++ b/Ghidra/Framework/Docking/data/docking.theme.properties @@ -6,8 +6,9 @@ color.fg.error = red color.fg.disabled = lightGray color.bg.uneditable = system.color.bg.application // TODO see if there exists an LaF setting for this color.bg.filtered = yellow -color.fg.hint = lightgray +color.fg.hint = gray +color.bg.help.hint = rgba(100, 100, 255, 100) color.fg.help.selector.h1 = #000080 color.fg.help.selector.h2 = #984C4C color.fg.help.selector.h3 = #0000FF @@ -17,7 +18,9 @@ color.fg.help.selector.th = #EDF3FE color.fg.help.selector.code = black color.fg.help.selector.code.path = #4682B4 -color.bg.header.active = steelblue +color.bg.splashscreen = black + +color.bg.header.active = mintcream color.bg.header.inactive = rgb(150, 150, 150) color.fg.header.active = black color.fg.header.inactive = black @@ -37,6 +40,7 @@ color.cursor.focused = red color.cursor.unfocused = pink color.bg.table.grid = gray +color.bg.table.row.drag = color.palette.lavender color.bg.table.row = color.bg color.bg.table.row.alt = rgb(237,243,254) color.fg.table.uneditable.selected = yellow @@ -55,6 +59,7 @@ color.bg.textfield.hint.valid = color.bg color.bg.textfield.hint.invalid = rgb(255,225,225) color.fg.textfield.hint = color.fg.hint +color.bg.tree.drag = color.palette.lavender color.bg.tree.drag.no.selection = rgb(204, 204, 255) color.bg.filterfield = color.bg.filtered @@ -66,9 +71,6 @@ color.bg.selection.help = lightSteelBlue color.border.bevel.highlight = lightGray color.border.bevel.shadow = gray -// extensions - -color.bg.splash = color.bg color.bg.filechooser = color.bg color.fg.filechooser = color.fg @@ -131,6 +133,8 @@ color.fg.help.selector.th = #EDF3FE color.fg.help.selector.code = gray color.fg.help.selector.code.path = #5BA5E3 +color.bg.splashscreen = black + color.bg.header.active = #788CBD color.bg.header.inactive = dimGray color.fg.header.active = lightGray diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java b/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java index 95e974f915..8d47d68f05 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java @@ -33,6 +33,7 @@ import docking.menu.DialogToolbarButton; import docking.util.AnimationUtils; import docking.widgets.label.GDHtmlLabel; import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.util.*; import ghidra.util.exception.AssertException; import ghidra.util.task.*; @@ -918,7 +919,7 @@ public class DialogComponentProvider statusLabel = new GDHtmlLabel(" "); statusLabel.setName("statusLabel"); statusLabel.setHorizontalAlignment(SwingConstants.CENTER); - statusLabel.setForeground(Color.blue); + statusLabel.setForeground(Messages.NORMAL); statusLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); statusLabel.addComponentListener(new ComponentAdapter() { @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java b/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java index 3ad420264f..e25e5687e6 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java @@ -31,6 +31,7 @@ import org.jdesktop.animation.timing.TimingTargetAdapter; import org.jdesktop.animation.timing.interpolation.PropertySetter; import docking.util.AnimationUtils; +import generic.theme.GThemeDefaults.Colors.Palette; import generic.util.WindowUtilities; import generic.util.image.ImageUtils; import ghidra.framework.OperatingSystem; @@ -538,7 +539,7 @@ public class DockableHeader extends GenericHeader g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - Color background = new Color(218, 232, 250); + Color background = Palette.getColor("aliceblue"); g.setColor(background); Rectangle othersBounds = null; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingUtils.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingUtils.java index 38c802bfb8..9bdcf706eb 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingUtils.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingUtils.java @@ -37,6 +37,7 @@ import docking.widgets.list.GList; import docking.widgets.list.GListCellRenderer; import docking.widgets.table.GTableCellRenderer; import docking.widgets.tree.support.GTreeRenderer; +import generic.theme.GThemeDefaults.Colors.Palette; import generic.theme.Gui; import ghidra.util.HTMLUtilities; import resources.ResourceManager; @@ -349,7 +350,7 @@ public class DockingUtils { c.setBorder(BorderFactory.createEmptyBorder()); } - c.setBackground(new Color(0, 0, 0, 0)); + c.setBackground(Palette.NO_COLOR); } /** Hides any open tooltip window */ diff --git a/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java b/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java index bc1e21c2e1..9512e3eb65 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +22,8 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import generic.theme.GThemeDefaults.Colors; + /** * A re-usable floating text edit window. */ @@ -34,7 +35,7 @@ public class EditWindow extends JWindow { private Component comp; private Rectangle rect; private EditListener listener; - + private AssociatedComponentListener compListener = new AssociatedComponentListener(); /** @@ -46,7 +47,7 @@ public class EditWindow extends JWindow { this.mgr = mgr; create(); } - + Component getAssociatedComponent() { return comp; } @@ -55,7 +56,7 @@ public class EditWindow extends JWindow { * @see java.awt.Window#isActive() */ @Override - public boolean isActive() { + public boolean isActive() { return active; } @@ -63,16 +64,16 @@ public class EditWindow extends JWindow { * @see java.awt.Component#setVisible(boolean) */ @Override - public void setVisible(boolean state) { - + public void setVisible(boolean state) { + active = state; super.setVisible(state); - + if (!state) { if (comp != null) { comp.removeComponentListener(compListener); if (comp instanceof JTabbedPane) { - ((JTabbedPane)comp).removeChangeListener(compListener); + ((JTabbedPane) comp).removeChangeListener(compListener); } Frame frame = mgr.getRootFrame(); frame.removeComponentListener(compListener); @@ -81,7 +82,7 @@ public class EditWindow extends JWindow { } } } - + void close() { setVisible(false); dispose(); @@ -90,55 +91,55 @@ public class EditWindow extends JWindow { void show(String defaultText, Component c, Rectangle r, EditListener editListener) { if (comp != null) { - setVisible(false); + setVisible(false); } - + if (c == null || !c.isVisible()) { return; } - + this.comp = c; this.rect = r; this.listener = editListener; - + comp.addComponentListener(compListener); - + if (comp instanceof JTabbedPane) { - ((JTabbedPane)comp).addChangeListener(compListener); + ((JTabbedPane) comp).addChangeListener(compListener); } - + Frame frame = mgr.getRootFrame(); frame.addComponentListener(compListener); setLocation(); - + textField.setText(defaultText != null ? defaultText : ""); Dimension d = textField.getPreferredSize(); textField.setPreferredSize(new Dimension(rect.width, d.height)); pack(); - + setVisible(true); - + toFront(); - textField.requestFocus(); - textField.selectAll(); + textField.requestFocus(); + textField.selectAll(); } - + private void setLocation() { Point p = comp.getLocationOnScreen(); - setLocation(p.x+rect.x+3, p.y+rect.y); + setLocation(p.x + rect.x + 3, p.y + rect.y); } - + private void create() { textField = new JTextField(" "); JPanel panel = new JPanel(new BorderLayout()); - Color bgColor = new Color(255, 255, 195); + Color bgColor = Colors.BACKGROUND_TOOLTIP; panel.setBackground(bgColor); - panel.add(textField, BorderLayout.CENTER); + panel.add(textField, BorderLayout.CENTER); textField.addKeyListener(new KeyAdapter() { @Override - public void keyPressed(KeyEvent e) { + public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { close(); } @@ -146,51 +147,53 @@ public class EditWindow extends JWindow { }); textField.addFocusListener(new FocusAdapter() { @Override - public void focusLost(FocusEvent e) { - if ( !e.isTemporary() ) { - close(); - } + public void focusLost(FocusEvent e) { + if (!e.isTemporary()) { + close(); + } } }); - textField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (listener != null) { - String text = textField.getText(); - EditListener l = listener; - close(); - l.editCompleted(text); - } + textField.addActionListener(e -> { + if (listener != null) { + String text = textField.getText(); + EditListener l = listener; + close(); + l.editCompleted(text); } }); getContentPane().add(panel, BorderLayout.CENTER); } - + private class AssociatedComponentListener implements ComponentListener, ChangeListener { - + /* * @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent) */ + @Override public void componentHidden(ComponentEvent e) { close(); } - + /* * @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent) */ + @Override public void componentResized(ComponentEvent e) { close(); } - + /* * @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent) */ + @Override public void componentShown(ComponentEvent e) { } - + /* * @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent) */ + @Override public void componentMoved(ComponentEvent e) { if (comp != null && comp.isVisible()) { setLocation(); @@ -200,6 +203,7 @@ public class EditWindow extends JWindow { /* * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) */ + @Override public void stateChanged(ChangeEvent e) { close(); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java b/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java index 9ed580d821..8252b8598a 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java @@ -30,6 +30,9 @@ import docking.util.AnimationUtils; import docking.widgets.VariableHeightPanel; import docking.widgets.label.GDLabel; import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors; +import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors.Palette; // TODO: should this be put into generic? public class GenericHeader extends JPanel { @@ -71,7 +74,7 @@ public class GenericHeader extends JPanel { BorderLayout layout = new BorderLayout(); layout.setVgap(1); setLayout(layout); - setBorder(BorderFactory.createLineBorder(Color.GRAY)); + setBorder(BorderFactory.createLineBorder(Palette.GRAY)); setFocusable(false); titlePanel = new TitlePanel(); @@ -209,7 +212,7 @@ public class GenericHeader extends JPanel { private void constructMultiLinePanel() { removeAll(); - toolbar.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.BLACK)); + toolbar.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Java.BORDER)); add(toolbar, BorderLayout.SOUTH); add(titlePanel, BorderLayout.CENTER); add(menuCloseToolbar, BorderLayout.EAST); @@ -297,11 +300,7 @@ public class GenericHeader extends JPanel { TitleFlasher() { animator = PropertySetter.createAnimator(1000, this, "color", NON_FOCUS_START_COLOR, - NON_FOCUS_START_COLOR, Color.YELLOW, FOCUS_START_COLOR); - -// animator = -// PropertySetter.createAnimator(1000, this, "color", NON_FOCUS_START_COLOR, -// NON_FOCUS_START_COLOR, Color.YELLOW, FOCUS_START_COLOR); + NON_FOCUS_START_COLOR, Palette.YELLOW, FOCUS_START_COLOR); animator.setAcceleration(0.2f); animator.setDeceleration(0.8f); @@ -350,7 +349,7 @@ public class GenericHeader extends JPanel { setFocusable(false); titleLabel = new GDLabel(); titleLabel.setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 0)); - titleLabel.setForeground(Color.BLACK); + titleLabel.setForeground(Colors.FOREGROUND); titleLabel.setFocusable(false); add(titleLabel, BorderLayout.CENTER); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/StatusBar.java b/Ghidra/Framework/Docking/src/main/java/docking/StatusBar.java index 0576a65e2e..e2a8f9d1ba 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/StatusBar.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/StatusBar.java @@ -30,6 +30,9 @@ import org.jdesktop.animation.timing.Animator; import docking.util.AnimationUtils; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GDLabel; +import generic.theme.GThemeDefaults.Colors; +import generic.theme.Gui; +import generic.theme.TempColorUtils; import generic.util.WindowUtilities; import ghidra.util.*; import ghidra.util.layout.HorizontalLayout; @@ -196,7 +199,7 @@ public class StatusBar extends JPanel { String updatedText = fixupMultilineText(text); statusLabel.setText(updatedText); statusLabel.setToolTipText(getToolTipText()); - statusLabel.setForeground(Color.BLACK); + statusLabel.setForeground(Colors.FOREGROUND); if (StringUtils.isBlank(updatedText)) { return; @@ -304,24 +307,40 @@ public class StatusBar extends JPanel { private FadeTimer() { super(5000, null); addActionListener(this); - initFadeColors(); } private void initFadeColors() { - fadeColorMap.put(Color.BLACK, new Color(16, 16, 16)); - fadeColorMap.put(new Color(16, 16, 16), new Color(32, 32, 32)); - fadeColorMap.put(new Color(32, 32, 32), new Color(64, 64, 64)); - fadeColorMap.put(new Color(64, 64, 64), new Color(80, 80, 80)); - fadeColorMap.put(new Color(80, 80, 80), new Color(96, 96, 96)); - fadeColorMap.put(new Color(96, 96, 96), new Color(112, 112, 112)); - fadeColorMap.put(new Color(112, 112, 112), new Color(128, 128, 128)); + + int value = 0; + int delta = 16; + if (Gui.getActiveTheme().useDarkDefaults()) { + value = 128; + delta = -16; + } + + Color start = TempColorUtils.fromRgb(value, value, value); + fadeColorMap.put(statusLabel.getForeground(), start); + + for (int i = 0; i < 8; i++) { + + Color from = TempColorUtils.fromRgb(value, value, value); + value += delta; + Color to = TempColorUtils.fromRgb(value, value, value); + fadeColorMap.put(from, to); + } + } + + @Override + public void restart() { + initFadeColors(); + super.restart(); } @Override public void actionPerformed(ActionEvent event) { Color nextFadeColor = fadeColorMap.get(statusLabel.getForeground()); - if (nextFadeColor != null) { + statusLabel.setForeground(nextFadeColor); } else { @@ -385,7 +404,7 @@ public class StatusBar extends JPanel { int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); - return new Color((255 - red), (255 - green), (255 - blue)); + return TempColorUtils.fromRgb((255 - red), (255 - green), (255 - blue)); } private void contrastStatusLabelColors() { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/actions/KeyEntryDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/actions/KeyEntryDialog.java index e1c7673fe1..6643362fb9 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/actions/KeyEntryDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/actions/KeyEntryDialog.java @@ -27,6 +27,7 @@ import docking.KeyEntryTextField; import docking.action.*; import docking.tool.ToolConstants; import docking.widgets.label.GIconLabel; +import generic.theme.GThemeDefaults.Colors.Messages; import generic.util.action.ReservedKeyBindings; import ghidra.util.HelpLocation; import resources.ResourceManager; @@ -172,7 +173,7 @@ public class KeyEntryDialog extends DialogComponentProvider { textAttrSet = new SimpleAttributeSet(); textAttrSet.addAttribute(StyleConstants.FontFamily, "Tahoma"); textAttrSet.addAttribute(StyleConstants.FontSize, Integer.valueOf(11)); - textAttrSet.addAttribute(StyleConstants.Foreground, Color.BLUE); + textAttrSet.addAttribute(StyleConstants.Foreground, Messages.NORMAL); tabAttrSet = new SimpleAttributeSet(); TabStop tabs = new TabStop(20, StyleConstants.ALIGN_LEFT, TabStop.LEAD_NONE); @@ -206,9 +207,7 @@ public class KeyEntryDialog extends DialogComponentProvider { String ksName = KeyBindingUtils.parseKeyStroke(ks); try { doc.insertString(0, "Actions mapped to " + ksName + "\n\n", textAttrSet); - for (int i = 0; i < list.size(); i++) { - DockingActionIf a = list.get(i); - + for (DockingActionIf a : list) { String collisionStr = "\t" + a.getName() + " (" + a.getOwnerDescription() + ")\n"; int offset = doc.getLength(); doc.insertString(offset, collisionStr, textAttrSet); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/framework/AboutDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/framework/AboutDialog.java index 14599e1452..58a7c14c2f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/framework/AboutDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/framework/AboutDialog.java @@ -16,12 +16,14 @@ package docking.framework; import java.awt.BorderLayout; -import java.awt.Color; import javax.swing.*; import docking.DialogComponentProvider; import docking.DockingWindowManager; +import generic.theme.GThemeDefaults.Colors; +import ghidra.framework.Application; +import utility.application.ApplicationLayout; /** * Splash screen window to display version information about the current release of @@ -29,7 +31,6 @@ import docking.DockingWindowManager; * initialization is complete, the splash screen is dismissed. */ public class AboutDialog extends DialogComponentProvider { - private static final Color DEFAULT_BACKGROUND_COLOR = new Color(243, 250, 255); public AboutDialog() { super(ApplicationInformationDisplayFactory.createAboutTitle(), true, false, true, false); @@ -57,7 +58,7 @@ public class AboutDialog extends DialogComponentProvider { private JPanel createMainPanel() { JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.setBorder(BorderFactory.createRaisedBevelBorder()); - mainPanel.setBackground(DEFAULT_BACKGROUND_COLOR); + mainPanel.setBackground(Colors.BACKGROUND); mainPanel.add(createInfoComponent(), BorderLayout.CENTER); return mainPanel; } @@ -67,6 +68,10 @@ public class AboutDialog extends DialogComponentProvider { } public static void main(String[] args) throws Exception { + ApplicationLayout layout = new DockingApplicationLayout("About Dialog", "1.0"); + DockingApplicationConfiguration config = new DockingApplicationConfiguration(); + config.setShowSplashScreen(false); + Application.initializeApplication(layout, config); DockingWindowManager.showDialog(null, new AboutDialog()); } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/framework/ApplicationInformationDisplayFactory.java b/Ghidra/Framework/Docking/src/main/java/docking/framework/ApplicationInformationDisplayFactory.java index 74e41a53f1..c1b892a09b 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/framework/ApplicationInformationDisplayFactory.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/framework/ApplicationInformationDisplayFactory.java @@ -23,6 +23,8 @@ import javax.swing.*; import docking.widgets.label.GIconLabel; import docking.widgets.label.GLabel; +import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors.Palette; import ghidra.framework.Application; import ghidra.framework.PluggableServiceRegistry; import ghidra.util.HelpLocation; @@ -115,12 +117,11 @@ public class ApplicationInformationDisplayFactory { final JPanel panel = new JPanel(new BorderLayout()); panel.setPreferredSize(new Dimension(400, 400)); - Color background = Color.BLACK; - + Color background = new GColor("color.bg.splashscreen"); panel.setBackground(background); JLabel nameLabel = new GLabel(Application.getName()); - nameLabel.setForeground(new Color(155, 155, 155)); + nameLabel.setForeground(Palette.GRAY); Font newFont = new Font("Garamond", Font.BOLD, 35); nameLabel.setFont(newFont); nameLabel.setHorizontalAlignment(SwingConstants.CENTER); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/framework/SplashScreen.java b/Ghidra/Framework/Docking/src/main/java/docking/framework/SplashScreen.java index 200af73188..d8d9466b74 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/framework/SplashScreen.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/framework/SplashScreen.java @@ -24,7 +24,6 @@ import javax.swing.border.BevelBorder; import docking.*; import docking.widgets.label.GDLabel; -import docking.widgets.label.GLabel; import generic.theme.GColor; import generic.util.WindowUtilities; import ghidra.framework.Application; @@ -38,6 +37,8 @@ import utility.application.ApplicationLayout; */ public class SplashScreen extends JWindow { + private static final Color BG_COLOR = new GColor("color.bg.splashscreen"); + private static SplashScreen splashWindow; // splash window displayed while ghidra is coming up private static DockingFrame hiddenFrame; private static JLabel statusLabel; @@ -285,8 +286,7 @@ public class SplashScreen extends JWindow { private JPanel createMainPanel() { JPanel mainPanel = new JPanel(new BorderLayout()); - mainPanel.setBackground(new GColor("color.bg.splash")); - mainPanel.add(createTitlePanel(), BorderLayout.NORTH); + mainPanel.setBackground(BG_COLOR); mainPanel.add(createContentPanel(), BorderLayout.CENTER); return mainPanel; } @@ -299,38 +299,12 @@ public class SplashScreen extends JWindow { return contentPanel; } - private Component createTitlePanel() { - Color backgroundColor = UIManager.getColor("InternalFrame.activeTitleBackground"); - Color foregroundColor = UIManager.getColor("InternalFrame.activeTitleForeground"); - - JPanel titlePanel = new JPanel(); - if (backgroundColor == null) { - backgroundColor = new Color(0, 0, 255); - } - titlePanel.setBackground(backgroundColor); - titlePanel.setLayout(new BorderLayout()); - - JLabel titleLabel = - new GLabel(ApplicationInformationDisplayFactory.createSplashScreenTitle()); - Font font = titleLabel.getFont(); - font = new Font(font.getName(), Font.BOLD, 11); - titleLabel.setFont(font); - if (foregroundColor == null) { - foregroundColor = Color.white; - } - titleLabel.setForeground(foregroundColor); - titlePanel.add(titleLabel, BorderLayout.CENTER); - titlePanel.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 10)); - return titlePanel; - } - private Component createStatusComponent() { Font f = new Font("serif", Font.BOLD, 12); statusLabel = new GDLabel(" Loading..."); statusLabel.setFont(f); statusLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 2, 10)); - statusLabel.setBackground(new GColor("color.bg.splash")); statusLabel.setOpaque(true); return statusLabel; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpBroker.java b/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpBroker.java index b6e09edbeb..38d7deb8f6 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpBroker.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpBroker.java @@ -37,8 +37,10 @@ import org.jdesktop.animation.timing.TimingTargetAdapter; import docking.framework.ApplicationInformationDisplayFactory; import docking.util.AnimationPainter; import docking.util.AnimationUtils; +import generic.theme.GColor; import ghidra.framework.preferences.Preferences; import ghidra.util.Msg; +import ghidra.util.Swing; import ghidra.util.bean.GGlassPane; import resources.ResourceManager; @@ -498,7 +500,7 @@ public class GHelpBroker extends DefaultHelpBroker { // // Unusual Code: Not yet rendered! Try again. // - SwingUtilities.invokeLater(() -> doCalloutReference(area, numberOfCalls)); + Swing.runLater(() -> doCalloutReference(area, numberOfCalls)); return; } @@ -653,7 +655,7 @@ public class GHelpBroker extends DefaultHelpBroker { private class LocationHintPainter implements AnimationPainter { - private Color color = new Color(100, 100, 255, 100); + private Color color = new GColor("color.bg.help.hint"); private Shape paintShape; LocationHintPainter(Shape paintShape) { @@ -705,11 +707,11 @@ public class GHelpBroker extends DefaultHelpBroker { /* // Debug Shape box = scaler.createTransformedShape(b); - g2d.setColor(Color.GREEN); + g2d.setColor(Palette.GREEN); g2d.fill(box); box = transform.createTransformedShape(box); - g2d.setColor(Color.YELLOW); + g2d.setColor(Palette.YELLOW); g2d.fill(box); */ diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java index 8a68fcbd11..3e216bc6a3 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/MultipleActionDockingToolbarButton.java @@ -30,6 +30,7 @@ import docking.*; import docking.action.*; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GDHtmlLabel; +import generic.theme.GThemeDefaults.Colors; import ghidra.util.Swing; import resources.ResourceManager; @@ -251,7 +252,7 @@ public class MultipleActionDockingToolbarButton extends EmptyBorderButton { return; // shouldn't happen } - g.setColor(Color.BLACK); + g.setColor(Colors.FOREGROUND); int iconWidth = baseIcon.getIconWidth(); int iconHeight = baseIcon.getIconHeight(); int insetsPadding = insets.left + insets.right; // the insets of the left icon and the arrow (between the two) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ButtonPanelFactory.java b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ButtonPanelFactory.java index 09c79c7a62..96c8b122e9 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ButtonPanelFactory.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ButtonPanelFactory.java @@ -20,6 +20,7 @@ import java.awt.*; import javax.swing.*; import javax.swing.border.Border; +import generic.theme.GThemeDefaults.Colors; import resources.ResourceManager; /** @@ -99,7 +100,7 @@ public class ButtonPanelFactory { public final static Icon BROWSE_ICON = new Icon() { @Override public void paintIcon(Component c, Graphics g, int x, int y) { - g.setColor(Color.BLACK); + g.setColor(Colors.FOREGROUND); g.fillRect(x, y + 5, 2, 2); g.fillRect(x + 4, y + 5, 2, 2); g.fillRect(x + 8, y + 5, 2, 2); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ColorEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ColorEditor.java index c1ce747088..eb01d23e39 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ColorEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/ColorEditor.java @@ -21,12 +21,13 @@ import java.awt.event.MouseEvent; import java.beans.PropertyEditorSupport; import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import docking.DialogComponentProvider; import docking.DockingWindowManager; import docking.widgets.label.GDHtmlLabel; +import generic.theme.GThemeDefaults.Colors.Palette; +import generic.theme.TempColorUtils; +import ghidra.util.ColorUtils; /** * Color editor that is a bit unusual in that its custom component is a button that when pushed, @@ -35,9 +36,6 @@ import docking.widgets.label.GDHtmlLabel; */ public class ColorEditor extends PropertyEditorSupport { - private static final String LIGHT_COLOR = "SILVER"; - private static final String DARK_COLOR = "BLACK"; - private static GhidraColorChooser colorChooser; private JLabel previewLabel = new GDHtmlLabel(); @@ -88,14 +86,9 @@ public class ColorEditor extends PropertyEditorSupport { } private void updateColor(Color newColor) { - String colorString = LIGHT_COLOR; // change the color to a darker value if the color being set is light - int colorValue = newColor.getRed() + newColor.getGreen() + newColor.getBlue(); - if (colorValue > 400) { // arbitrary threshold determined by trial-and-error - colorString = DARK_COLOR; - } - + String colorString = TempColorUtils.toString(ColorUtils.contrastForegroundColor(newColor)); previewLabel.setText( "
click
"); @@ -118,14 +111,12 @@ public class ColorEditor extends PropertyEditorSupport { gfx.setColor(color); } else { - gfx.setColor(Color.black); + gfx.setColor(Palette.BLACK); } gfx.fillRect(box.x, box.y, box.width, box.height); } - ///////////////////////////////////////////////////////////////////////// - - class EditorProvider extends DialogComponentProvider { + private class EditorProvider extends DialogComponentProvider { EditorProvider(JPanel contentPanel) { super("Color Editor", true); @@ -141,7 +132,7 @@ public class ColorEditor extends PropertyEditorSupport { } } - class ColorEditorPanel extends JPanel { + private class ColorEditorPanel extends JPanel { ColorEditorPanel() { @@ -152,15 +143,13 @@ public class ColorEditor extends PropertyEditorSupport { } add(colorChooser, BorderLayout.CENTER); - colorChooser.getSelectionModel().addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - lastUserSelectedColor = colorChooser.getColor(); - // This could be a ColorUIResource, but Options only support storing Color. - lastUserSelectedColor = - new Color(lastUserSelectedColor.getRed(), lastUserSelectedColor.getGreen(), - lastUserSelectedColor.getBlue(), lastUserSelectedColor.getAlpha()); - } + colorChooser.getSelectionModel().addChangeListener(e -> { + + // This could be a ColorUIResource, but Options only support storing Color. So, + // manually create a new Color object to avoid saving a ColorUIResource. + Color c = colorChooser.getColor(); + lastUserSelectedColor = TempColorUtils.fromRgba(c.getRed(), c.getGreen(), + c.getBlue(), c.getAlpha()); }); colorChooser.setColor(color); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsDialog.java index 0a89d0330a..824ba792ec 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsDialog.java @@ -15,7 +15,6 @@ */ package docking.options.editor; -import java.awt.Color; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -55,7 +54,6 @@ public class OptionsDialog extends DialogComponentProvider { new OptionsPropertyChangeListener()); setTitle(title); - setBackground(Color.lightGray); addWorkPanel(panel); addOKButton(); @@ -67,6 +65,7 @@ public class OptionsDialog extends DialogComponentProvider { setFocusComponent(panel.getFocusComponent()); } + @Override public void dispose() { panel.dispose(); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java index 6585e6352e..ef27b184c5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java @@ -21,11 +21,14 @@ import java.io.Serializable; import java.util.List; import javax.swing.*; -import javax.swing.border.*; +import javax.swing.border.LineBorder; import javax.swing.colorchooser.AbstractColorChooserPanel; import docking.widgets.label.GHtmlLabel; import docking.widgets.label.GLabel; +import generic.theme.GThemeDefaults.Colors; +import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.TempColorUtils; import ghidra.util.layout.VerticalLayout; public class SettableColorSwatchChooserPanel extends AbstractColorChooserPanel { @@ -66,6 +69,7 @@ public class SettableColorSwatchChooserPanel extends AbstractColorChooserPanel { return Integer.parseInt((String) value); } catch (NumberFormatException nfe) { + // return default value } } return defaultValue; @@ -118,8 +122,7 @@ public class SettableColorSwatchChooserPanel extends AbstractColorChooserPanel { recentSwatchListener = new RecentSwatchListener(); recentSwatchPanel.addMouseListener(recentSwatchListener); - Border border = - new CompoundBorder(new LineBorder(Color.black), new LineBorder(Color.white)); + LineBorder border = new LineBorder(Java.BORDER); swatchPanel.setBorder(border); gbc.weightx = 1.0; gbc.gridwidth = 2; @@ -182,6 +185,7 @@ public class SettableColorSwatchChooserPanel extends AbstractColorChooserPanel { @Override public void updateChooser() { + // stub } class HistorySwatchListener extends MouseAdapter { @@ -222,7 +226,7 @@ class SwatchPanel extends JPanel { initColors(); setToolTipText(""); // register for events setOpaque(true); - setBackground(Color.white); + setBackground(Colors.BACKGROUND); setRequestFocusEnabled(false); } @@ -232,6 +236,7 @@ class SwatchPanel extends JPanel { } protected void initValues() { + // stub } @Override @@ -251,7 +256,7 @@ class SwatchPanel extends JPanel { } int y = row * (swatchSize.height + gap.height); g.fillRect(x, y, swatchSize.width, swatchSize.height); - g.setColor(Color.black); + g.setColor(Java.BORDER); g.drawLine(x + swatchSize.width - 1, y, x + swatchSize.width - 1, y + swatchSize.height - 1); g.drawLine(x, y + swatchSize.height - 1, x + swatchSize.width - 1, @@ -268,7 +273,7 @@ class SwatchPanel extends JPanel { } protected void initColors() { - + // stub } @Override @@ -384,7 +389,8 @@ class MainSwatchPanel extends SwatchPanel { colors = new Color[numColors]; for (int i = 0; i < numColors; i++) { colors[i] = - new Color(rawValues[(i * 3)], rawValues[(i * 3) + 1], rawValues[(i * 3) + 2]); + TempColorUtils.fromRgb(rawValues[(i * 3)], rawValues[(i * 3) + 1], + rawValues[(i * 3) + 2]); } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/resources/icons/NumberIcon.java b/Ghidra/Framework/Docking/src/main/java/docking/resources/icons/NumberIcon.java index d219d6e16a..403882d31e 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/resources/icons/NumberIcon.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/resources/icons/NumberIcon.java @@ -22,12 +22,15 @@ import javax.swing.Icon; import javax.swing.JComponent; import docking.util.GraphicsUtils; +import generic.theme.GThemeDefaults.Colors; +import generic.theme.GThemeDefaults.Colors.Palette; /** * An icon that paints the given number */ public class NumberIcon implements Icon { + private static final Color BORDER_COLOR = Palette.getColor("lightskyblue"); private String number; private float bestFontSize = -1; @@ -42,9 +45,9 @@ public class NumberIcon implements Icon { @Override public void paintIcon(Component c, Graphics g, int x, int y) { - g.setColor(Color.WHITE); + g.setColor(Colors.BACKGROUND); g.fillRect(x, y, getIconWidth(), getIconHeight()); - g.setColor(new Color(0xb5d5ff)); + g.setColor(BORDER_COLOR); g.drawRect(x, y, getIconWidth(), getIconHeight()); float fontSize = getMaxFontSize(g, getIconWidth() - 1, getIconHeight()); @@ -66,7 +69,7 @@ public class NumberIcon implements Icon { int halfTextWidth = textWidth >> 1; int baselineX = x + (halfWidth - halfTextWidth); - g.setColor(Color.BLACK); + g.setColor(Colors.FOREGROUND); JComponent jc = null; if (c instanceof JComponent) { jc = (JComponent) c; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java b/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java index db1a2d9f79..b999e1747e 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java @@ -25,6 +25,8 @@ import org.jdesktop.animation.timing.Animator.RepeatBehavior; import org.jdesktop.animation.timing.TimingTargetAdapter; import org.jdesktop.animation.timing.interpolation.PropertySetter; +import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors.Palette; import generic.util.WindowUtilities; import generic.util.image.ImageUtils; import ghidra.util.Msg; @@ -392,12 +394,11 @@ public class AnimationUtils { @Override public void paint(GGlassPane glassPane, Graphics g) { - Color gray = Color.GRAY; + Color gray = Palette.GRAY; // double darknessFudge = .95; // double progress = percentComplete * darknessFudge; // emphasis starts at 1 // int alpha = Math.min(255, (int) (255 * progress)); -// gray = new Color(gray.getRed(), gray.getGreen(), gray.getBlue(), alpha); - gray = new Color(gray.getRed(), gray.getGreen(), gray.getBlue()); +// gray = ColorUtils.fromRgba(gray.getRed(), gray.getGreen(), gray.getBlue(), alpha); Graphics2D g2d = (Graphics2D) g; Composite originaComposite = g2d.getComposite(); @@ -819,7 +820,7 @@ public class AnimationUtils { @Override public void paint(GGlassPane glassPane, Graphics g) { - Color background = new Color(218, 232, 250); + Color background = Palette.getColor("lightsteelblue"); g.setColor(background); Rectangle defaultBounds = component.getBounds(); @@ -877,7 +878,7 @@ public class AnimationUtils { double cx = emphasizedBounds.getCenterX(); double cy = emphasizedBounds.getCenterY(); g2d.rotate(rad, cx, cy); - g.setColor(Color.BLACK); + g.setColor(Java.BORDER); int iw = emphasizedBounds.width; int ih = emphasizedBounds.height; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/util/BadgedIcon.java b/Ghidra/Framework/Docking/src/main/java/docking/util/BadgedIcon.java deleted file mode 100644 index c48cc0151e..0000000000 --- a/Ghidra/Framework/Docking/src/main/java/docking/util/BadgedIcon.java +++ /dev/null @@ -1,371 +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 docking.util; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.*; - -import javax.swing.Icon; -import javax.swing.ImageIcon; - -import resources.MultiIcon; -import resources.ResourceManager; -import resources.icons.EmptyIcon; -import resources.icons.ScaledImageIcon; - -/** - * An icon that allows sub-icons to be added at key perimeter locations. Each position can - * be manipulated independently, adding and removing icons as desired. Additionally, - * each position can be toggled enabled or disabled, or visible or invisible. - */ -public class BadgedIcon implements Icon { - - /* - * The top-edge horizontal positions move up 20% from origin - * The middle horizontal positions are at origin+30% - * The bottom-edge horizontal positions are at origin+60% - * - * The left-edge vertical positions move left 20% from origin - * The middle vertical positions are at origin+30% - * The right-edge vertical positions are at origin+60% - * - */ - public enum BadgePosition { - TopLeft(-.2, -.2), - TopMiddle(.3, -.2), - TopRight(.6, -.2), - - LeftMiddle(-.2, .3), - Center(.3, .3), - RightMiddle(.6, .3), - - BottomLeft(-.2, .6), - BottomMiddle(.3, .6), - BottomRight(.6, .6); - - private final double horizontalDisplacementFactor; - private final double verticalDisplacementFactor; - - private BadgePosition(double hdf, double vdf) { - horizontalDisplacementFactor = hdf; - verticalDisplacementFactor = vdf; - } - - public double getHorizontalDisplacementFactor() { - return horizontalDisplacementFactor; - } - - public double getVerticalDisplacementFactor() { - return verticalDisplacementFactor; - } - - } - - private Map badgeMap = new EnumMap<>(BadgePosition.class); - private Map badgeEnablement = new EnumMap<>(BadgePosition.class); - private Map badgeVisibility = new EnumMap<>(BadgePosition.class); - - private static double BADGE_HSCALE_FACTOR = .75; - private static double BADGE_VSCALE_FACTOR = .75; - - // if the icon hasn't changed, this will help in painting... - private Icon cachedThis = null; - - private Icon base; - - private int height; - private int width; - private boolean enabled; - - public BadgedIcon(Icon baseIcon) { - this(baseIcon, true); - } - - public BadgedIcon(Icon baseIcon, boolean enabled) { - this(baseIcon, enabled, baseIcon.getIconWidth(), baseIcon.getIconHeight()); - } - - public BadgedIcon(Icon baseIcon, boolean enabled, int width, int height) { - - Objects.requireNonNull(baseIcon, "Base Icon must not be null"); - - this.base = baseIcon; - this.width = width; - this.height = height; - this.enabled = enabled; - - initDefaultBadges(); - - cachedThis = null; - } - - private static MultiIcon getEmptyIcon(int width, int height, boolean enabled) { - return new MultiIcon(new EmptyIcon(width, height), !enabled); - } - - private void initDefaultBadges() { - for (BadgePosition pos : BadgePosition.values()) { - - badgeMap.put(pos, getEmptyIcon(width, height, enabled)); - badgeEnablement.put(pos, true); - badgeVisibility.put(pos, true); - } - } - - /** - * Add an icon at the specified location - * @param badge The icon - * @param position Where to place the image - * @return a reference to this object - */ - public BadgedIcon addBadge(Icon badge, BadgePosition position) { - - badgeMap.get(position).addIcon(badge); - - height = Math.max(height, badge.getIconHeight()); - width = Math.max(width, badge.getIconWidth()); - - cachedThis = null; - - return this; - } - - public BadgedIcon addScaledBadge(Icon icon, int newWidth, int newHeight, - BadgePosition position) { - - Icon badge = ResourceManager.getScaledIcon(icon, width, height); - - badgeMap.get(position).addIcon(badge); - - height = Math.max(height, badge.getIconHeight()); - width = Math.max(width, badge.getIconWidth()); - - cachedThis = null; - - return this; - } - - /** - * Replace the existing icon with the provided icon at the specified location - * @param badge The icon - * @param position Where to place the image - * @return a reference to this object - */ - public BadgedIcon setBadge(Icon badge, BadgePosition position) { - MultiIcon multi = null; - if (badge == null) { - badge = getEmptyIcon(width, height, enabled); - } - multi = new MultiIcon(badge, enabled, width, height); - badgeMap.put(position, multi); - - cachedThis = null; - - return this; - } - - /** - * Remove the badge from the specified location - * @param position Where to place the image - * @return a reference to this object - */ - public BadgedIcon removeBadge(BadgePosition position) { - setBadge(null, position); - return this; - } - - /** - * Set the enablement of the badge at the specified location - * @param position Which icon to modify - * @param enabled True if the image should be shown 'enabled', false otherwise - * @see BadgedIcon#isBadgeEnabled(BadgePosition) - */ - public void setBadgeEnabled(BadgePosition position, boolean enabled) { - if (isBadgeEnabled(position) == enabled) { - return; - } - badgeEnablement.put(position, enabled); - cachedThis = null; - } - - /** - * Get the enablement status of the badge at the specified location - * @param position Which icon to enquire about - * @return True if the badge is enabled, false otherwise - * @see BadgedIcon#setBadgeEnabled(BadgePosition, boolean) - */ - public boolean isBadgeEnabled(BadgePosition position) { - return badgeEnablement.get(position); - } - - /** - * Set the visibility status of the badge at the specified location - * @param position Which icon to modify - * @param visible True if the badge should be visible, false otherwise - * @see #isBadgeVisible(BadgePosition) - */ - public void setBadgeVisisble(BadgePosition position, boolean visible) { - if (isBadgeVisible(position) == visible) { - return; - } - badgeVisibility.put(position, visible); - - cachedThis = null; - } - - /** - * Get the visibility status of the badge at the specified location - * @param position Which icon to enquire about - * @return True if the badge is visible, false otherwise - * @see #setBadgeVisisble(BadgePosition, boolean) - */ - public boolean isBadgeVisible(BadgePosition position) { - return badgeVisibility.get(position); - } - - /** - * @see javax.swing.Icon#getIconHeight() - */ - @Override - public int getIconHeight() { - return height; - } - - /** - * @see javax.swing.Icon#getIconWidth() - */ - @Override - public int getIconWidth() { - return width; - } - - /** - * Determine the overall enablement appearance state. - * @return true if the if the entire icon is rendered as 'enabled'; false otherwise. - */ - public boolean isEnabled() { - return enabled; - } - - /** - * Set the 'enabled' appearance of the entire icon. - * Preserves the underlying enablement state of badges, though the entire icon - * looks disabled if setEnabled(true) is called. - * @param enabled - */ - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - /** - * Return array of Icons that were added to this BadgedIcon. - */ - public Icon[] getBadges(BadgePosition pos) { - MultiIcon badge = badgeMap.get(pos); - return badge.getIcons(); - } - - private Dimension getBadgeDimension() { - return new Dimension((int) (width * BADGE_HSCALE_FACTOR), - (int) (height * BADGE_VSCALE_FACTOR)); - } - - @Override - public void paintIcon(Component c, Graphics g, int x, int y) { - - if (cachedThis != null) { - cachedThis.paintIcon(c, g, x, y); - } - else { - Dimension badgeSize = getBadgeDimension(); - doPaintIcon(c, g, x, y, badgeSize); - } - - if (!enabled) { - // Alpha blend to background - Color bgColor = c.getBackground(); - g.setColor(new Color(bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue(), 128)); - g.fillRect(x, y, width, height); - } - - } - - private void doPaintIcon(Component c, Graphics g, int x, int y, Dimension badgeSize) { - BufferedImage cached = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics gc = cached.getGraphics(); - - base.paintIcon(c, gc, x, y); - - for (BadgePosition pos : BadgePosition.values()) { - if (!isBadgeVisible(pos)) { - continue; - } - - MultiIcon icon = badgeMap.get(pos); - - Icon scaled = new ScaledImageIcon(icon, badgeSize.width, badgeSize.height); - - Point badgePaintLoc = getBadgePaintLocation(pos, badgeSize); - - int badgeX = x + badgePaintLoc.x; - int badgeY = y + badgePaintLoc.y; - - scaled.paintIcon(c, gc, badgeX, badgeY); - - if (!isBadgeEnabled(pos)) { - // Alpha blend to background - Color bgColor = c.getBackground(); - gc.setColor( - new Color(bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue(), 128)); - gc.fillRect(badgeX, badgeY, badgeSize.width, badgeSize.height); - } - } - - cachedThis = new ImageIcon(cached); - - cachedThis.paintIcon(c, g, x, y); - } - - private static Point getBadgePaintLocation(BadgePosition pos, Dimension badgeSize) { - - double dx = pos.getHorizontalDisplacementFactor(); - double dy = pos.getVerticalDisplacementFactor(); - - Point p = new Point((int) (dx * badgeSize.width), (int) (dy * badgeSize.height)); - - return p; - } - - @Override - public String toString() { - return getClass().getSimpleName() + "[" + getIconNames() + "]"; - } - - private String getIconNames() { - - StringBuffer buffy = new StringBuffer(); - - for (BadgePosition pos : BadgePosition.values()) { - MultiIcon mi = badgeMap.get(pos); - buffy.append(pos).append("[").append(mi.toString()).append("]"); - buffy.append(", "); - } - - return buffy.toString(); - } - -} diff --git a/Ghidra/Framework/Docking/src/main/java/docking/util/image/Callout.java b/Ghidra/Framework/Docking/src/main/java/docking/util/image/Callout.java index db51026361..5ee71aeda1 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/util/image/Callout.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/util/image/Callout.java @@ -21,11 +21,12 @@ import java.awt.geom.RectangularShape; import java.awt.image.BufferedImage; import java.awt.image.VolatileImage; +import generic.theme.GThemeDefaults.Colors.Palette; import generic.util.image.ImageUtils; public class Callout { - private static final Color CALLOUT_SHAPE_COLOR = new Color(0xB5, 0xDE, 0x2F); + private static final Color CALLOUT_SHAPE_COLOR = Palette.getColor("color.palette.palegreen"); private static final int CALLOUT_BORDER_PADDING = 20; public Image createCallout(CalloutComponentInfo calloutInfo) { @@ -111,13 +112,13 @@ public class Callout { // // Debug // -// g2d.setColor(Color.RED); +// g2d.setColor(Palette.RED); // g2d.draw(fullBounds); // -// g2d.setColor(Color.CYAN); +// g2d.setColor(Palette.CYAN); // g2d.draw(calloutBounds); // -// g2d.setColor(Color.BLUE); +// g2d.setColor(Palette.BLUE); // g2d.draw(cBounds); // return image; @@ -189,7 +190,7 @@ public class Callout { createCalloutImage(calloutInfo, componentLocation, calloutBounds, calloutDrawingArea); DropShadow dropShadow = new DropShadow(); - Image shadow = dropShadow.createDrowShadow(calloutImage, 40); + Image shadow = dropShadow.createDropShadow(calloutImage, 40); // // Create our final image and draw into it the callout image and its shadow @@ -214,7 +215,8 @@ public class Callout { bottomPadding = overlap; } - image = ImageUtils.padImage(image, Color.WHITE, topPadding, 0, rightPadding, bottomPadding); + image = + ImageUtils.padImage(image, Palette.WHITE, topPadding, 0, rightPadding, bottomPadding); Graphics g = image.getGraphics(); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); @@ -228,30 +230,30 @@ public class Callout { // // Debug // -// g2d.setColor(Color.RED); +// g2d.setColor(Palette.RED); // g2d.draw(fullBounds); // -// g2d.setColor(Color.CYAN); +// g2d.setColor(Palette.CYAN); // g2d.draw(calloutBounds); // -// g2d.setColor(Color.BLUE); +// g2d.setColor(Palette.BLUE); // g2d.draw(componentBounds); // -// g2d.setColor(Color.MAGENTA); +// g2d.setColor(Palette.MAGENTA); // g2d.draw(completeBounds); // -// g2d.setColor(Color.GRAY); +// g2d.setColor(Palette.GRAY); // g2d.draw(dropShadowBounds); // // Point cLocation = componentBounds.getLocation(); // Point convertedCLocation = calloutInfo.convertPointToParent(cLocation); -// g2d.setColor(Color.PINK); +// g2d.setColor(Palette.PINK); // componentBounds.setLocation(convertedCLocation); // g2d.draw(componentBounds); // // Point convertedFBLocation = calloutInfo.convertPointToParent(fullBounds.getLocation()); // fullBounds.setLocation(convertedFBLocation); -// g2d.setColor(Color.ORANGE); +// g2d.setColor(Palette.ORANGE); // g2d.draw(fullBounds); return image; @@ -404,7 +406,7 @@ public class Callout { // render the clip shape into the image g.setComposite(AlphaComposite.Src); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setColor(Color.WHITE); + g.setColor(Palette.WHITE); g.fill(imageShape); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/util/image/DropShadow.java b/Ghidra/Framework/Docking/src/main/java/docking/util/image/DropShadow.java index 8d1a2da847..cc9831507c 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/util/image/DropShadow.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/util/image/DropShadow.java @@ -23,9 +23,11 @@ import java.awt.image.*; import javax.swing.JFrame; import javax.swing.JPanel; +import generic.theme.GThemeDefaults.Colors.Palette; + public class DropShadow { - private Color shadowColor = new Color(0x000000); + private Color shadowColor = Palette.BLACK; private float shadowOpacity = 0.85f; public static void main(String[] args) { @@ -40,7 +42,7 @@ public class DropShadow { @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; - Color background = Color.WHITE; + Color background = Palette.WHITE; g.setColor(background); Dimension size = getSize(); g.fillRect(0, 0, size.width, size.height); @@ -59,14 +61,14 @@ public class DropShadow { g2d.setComposite(AlphaComposite.Src); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setColor(Color.WHITE); + g2d.setColor(Palette.WHITE); g2d.fillOval(size.width / 4, size.height / 4, size.width / 2, size.height / 2); // Using ScrAtop uses the alpha value as a coverage for each pixel stored in // the destination. For the areas outside the clip shape, the destination alpha will // be zero, so nothing is rendered in those areas. g2d.setComposite(AlphaComposite.SrcAtop); - g2d.setPaint(new GradientPaint(0, 0, Color.RED, 0, size.height, Color.YELLOW)); + g2d.setPaint(new GradientPaint(0, 0, Palette.RED, 0, size.height, Palette.YELLOW)); g2d.fillRect(0, 0, size.width, size.height); g2d.dispose(); @@ -77,7 +79,7 @@ public class DropShadow { graphics.dispose(); image = bufferedImage; - shadow = ds.createDrowShadow(bufferedImage, 5); + shadow = ds.createDropShadow(bufferedImage, 5); // } @@ -206,7 +208,7 @@ public class DropShadow { return subject; } - public Image createDrowShadow(BufferedImage image, int shadowSize) { + public Image createDropShadow(BufferedImage image, int shadowSize) { BufferedImage subject = prepareImage(image, shadowSize); // BufferedImage shadow = diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java index 987079dced..3af1c238de 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java @@ -23,6 +23,7 @@ import javax.swing.border.Border; import docking.widgets.label.GDHtmlLabel; import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors.Palette; /** * A common base class for list and table renderer objects, unifying the Ghidra look and feel. @@ -57,7 +58,7 @@ public abstract class AbstractGCellRenderer extends GDHtmlLabel { public AbstractGCellRenderer() { noFocusBorder = BorderFactory.createEmptyBorder(0, 5, 0, 5); Border innerBorder = BorderFactory.createEmptyBorder(0, 4, 0, 4); - Border outerBorder = BorderFactory.createLineBorder(Color.YELLOW, 1); + Border outerBorder = BorderFactory.createLineBorder(Palette.YELLOW, 1); focusBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder); setBorder(noFocusBorder); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java index 332a22d177..b97b8a329c 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java @@ -100,7 +100,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie previewList = new JList<>(); } previewList.setOpaque(true); - previewList.setBackground(TOOLTIP_WINDOW_BGCOLOR); + previewList.setBackground(PREVIEW_WINDOW_BGCOLOR); previewList.setFocusable(false); previewList.setModel(new DefaultListModel()); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java index 71bf7e832c..d4db3281a9 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java @@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils; import docking.widgets.label.GDHtmlLabel; import docking.widgets.list.GList; import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors; import generic.util.WindowUtilities; import ghidra.util.StringUtilities; import ghidra.util.SystemUtilities; @@ -62,7 +63,7 @@ public class DropDownTextField extends JTextField implements GComponent { private static final int DEFAULT_MAX_UPDATE_DELAY = 2000; private static final int MIN_HEIGHT = 300; private static final int MIN_WIDTH = 200; - protected static final Color TOOLTIP_WINDOW_BGCOLOR = new Color(255, 255, 225); + protected static final Color PREVIEW_WINDOW_BGCOLOR = Colors.BACKGROUND; private JWindow toolTipWindow; // delayed initialization for parenting private JWindow matchingWindow; // delayed initialization for parenting @@ -155,7 +156,7 @@ public class DropDownTextField extends JTextField implements GComponent { protected void setPreviewPaneAttributes() { previewLabel = new GDHtmlLabel(); previewLabel.setOpaque(true); - previewLabel.setBackground(TOOLTIP_WINDOW_BGCOLOR); + previewLabel.setBackground(PREVIEW_WINDOW_BGCOLOR); previewLabel.setVerticalAlignment(SwingConstants.TOP); previewLabel.setFocusable(false); } @@ -342,7 +343,7 @@ public class DropDownTextField extends JTextField implements GComponent { updateWindowLocation(); showMatchingWindow(); - getPreviewPaneComponent().setBackground(TOOLTIP_WINDOW_BGCOLOR); + getPreviewPaneComponent().setBackground(PREVIEW_WINDOW_BGCOLOR); toolTipWindow.setVisible(hasPreview()); } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/PopupWindow.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/PopupWindow.java index 48a911fe3d..e81bd263d4 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/PopupWindow.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/PopupWindow.java @@ -26,6 +26,7 @@ import javax.swing.*; import javax.swing.Timer; import docking.widgets.shapes.*; +import generic.theme.GThemeDefaults.Colors.Palette; import generic.util.WindowUtilities; import ghidra.util.bean.GGlassPane; import ghidra.util.bean.GGlassPanePainter; @@ -337,7 +338,7 @@ public class PopupWindow { Point p = new Point(r.getLocation()); SwingUtilities.convertPointFromScreen(p, glassPane); - Color c = new Color(50, 50, 200, 125); + Color c = Palette.LAVENDER; g.setColor(c); g.fillRect(p.x, p.y, r.width, r.height); } @@ -346,7 +347,7 @@ public class PopupWindow { if (sourceEvent != null) { Point p = sourceEvent.getPoint(); p = SwingUtilities.convertPoint(sourceEvent.getComponent(), p.x, p.y, glassPane); - g.setColor(Color.RED); + g.setColor(Palette.RED); int offset = 10; g.fillRect(p.x - offset, p.y - offset, (offset * 2), (offset * 2)); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/conditiontestpanel/ConditionTestPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/conditiontestpanel/ConditionTestPanel.java index b3d0966fc9..0f11262225 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/conditiontestpanel/ConditionTestPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/conditiontestpanel/ConditionTestPanel.java @@ -30,6 +30,7 @@ import docking.widgets.EmptyBorderButton; import docking.widgets.checkbox.GCheckBox; import docking.widgets.label.GDHtmlLabel; import docking.widgets.label.GDLabel; +import generic.theme.GThemeDefaults.Colors.Palette; import ghidra.util.HTMLUtilities; import ghidra.util.exception.CancelledException; import ghidra.util.layout.PairLayout; @@ -121,12 +122,12 @@ public class ConditionTestPanel extends JPanel { private void updateOverallProgress() { overallProgressBar.setMaxProgress(conditionTestModel.getTestCount()); overallProgressBar.setProgress(conditionTestModel.getCompletedTestCount()); - Color color = Color.GREEN; + Color color = Palette.GREEN; if (conditionTestModel.getErrorCount() > 0) { - color = Color.RED; + color = Palette.RED; } else if (conditionTestModel.getWarningCount() > 0) { - color = Color.YELLOW; + color = Palette.YELLOW; } overallProgressBar.setColor(color); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/FieldPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/FieldPanel.java index e877eccaa8..93462d00b7 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/FieldPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/FieldPanel.java @@ -39,6 +39,8 @@ import docking.widgets.fieldpanel.support.*; import docking.widgets.indexedscrollpane.IndexScrollListener; import docking.widgets.indexedscrollpane.IndexedScrollable; import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors.Messages; +import generic.theme.TempColorUtils; import ghidra.util.Msg; import ghidra.util.SystemUtilities; @@ -1152,10 +1154,7 @@ public class FieldPanel extends JPanel } private Color blend(Color primary, Color secondary) { - int red = (primary.getRed() * 3 + secondary.getRed()) / 4; - int green = (primary.getGreen() * 3 + secondary.getGreen()) / 4; - int blue = (primary.getBlue() * 3 + secondary.getBlue()) / 4; - return new Color(red, green, blue); + return TempColorUtils.blend4(primary, secondary); } private void paintLayoutBackground(Graphics g, Rectangle rect, AnchoredLayout layout, @@ -1185,7 +1184,7 @@ public class FieldPanel extends JPanel Color defaultBackgroundColor = backgroundColorModel.getDefaultBackgroundColor(); g.setColor(defaultBackgroundColor); g.fillRect(r.x, layout.getYPos() - layout.getHeight(), r.width, layout.getHeight()); - g.setColor(Color.RED); + g.setColor(Messages.ERROR); GraphicsUtils.drawString(this, g, "Error Painting Field", r.x, layout.getYPos()); Msg.error(this, "Unexpected Exception: " + e.getMessage(), e); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/EmptyTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/EmptyTextField.java index 0cbd444a36..a0d7006016 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/EmptyTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/EmptyTextField.java @@ -23,6 +23,7 @@ import docking.widgets.fieldpanel.internal.FieldBackgroundColorManager; import docking.widgets.fieldpanel.internal.PaintContext; import docking.widgets.fieldpanel.support.DefaultRowColLocation; import docking.widgets.fieldpanel.support.RowColLocation; +import generic.theme.GThemeDefaults.Colors.Palette; /** * A Text field that is blank. @@ -55,6 +56,7 @@ public class EmptyTextField implements Field { /** * Returns true if the cursor is allowed past the last character. This * field always returns false since there is no text. + * @returns true if the cursor is allowed past the last character */ public boolean isAllowCursorAtEnd() { return false; @@ -168,6 +170,7 @@ public class EmptyTextField implements Field { * @param color the new foreground color. */ public void setForeground(Color color) { + // cannot change foreground } /** @@ -178,7 +181,7 @@ public class EmptyTextField implements Field { * was called. */ public Color getForeground() { - return Color.WHITE; + return Palette.NO_COLOR; } @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/StrutFieldElement.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/StrutFieldElement.java index 9cc3ad8838..b99aa51978 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/StrutFieldElement.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/field/StrutFieldElement.java @@ -21,6 +21,7 @@ import java.awt.Graphics; import javax.swing.JComponent; import docking.widgets.fieldpanel.support.RowColLocation; +import generic.theme.GThemeDefaults.Colors; /** * Used to force a clip to happen by using this field with space characters and size that far @@ -68,7 +69,7 @@ public class StrutFieldElement implements FieldElement { @Override public Color getColor(int charIndex) { - return Color.BLACK; + return Colors.FOREGROUND; } @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/ColorRangeMap.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/ColorRangeMap.java index f3ffe7b8f9..be09c6506e 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/ColorRangeMap.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/ColorRangeMap.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +15,10 @@ */ package docking.widgets.fieldpanel.internal; -import ghidra.util.datastruct.*; - import java.awt.Color; +import generic.theme.TempColorUtils; +import ghidra.util.datastruct.*; public class ColorRangeMap { private RangeMap map; @@ -30,7 +29,7 @@ public class ColorRangeMap { public ColorRangeMap() { map = new RangeMap(); valueRange = map.getValueRange(0); - + } public void color(long start, long end, Color c) { @@ -38,14 +37,17 @@ public class ColorRangeMap { map.paintRange(start, end, colorValue); valueRange = map.getValueRange(0); } + public void clear(long start, long end) { map.paintRange(start, end, 0); valueRange = map.getValueRange(0); } + public void clear() { map.clear(); valueRange = map.getValueRange(0); } + public Color getColor(long index, Color defaultColor) { if (!valueRange.contains(index)) { valueRange = map.getValueRange(index); @@ -56,18 +58,20 @@ public class ColorRangeMap { } return getColor(valueRange.getValue()); } + private Color getColor(int colorValue) { if (lastColorValue == colorValue) { return lastColor; } lastColorValue = colorValue; - lastColor = new Color(colorValue); + lastColor = TempColorUtils.fromRgb(colorValue); return lastColor; } + public ColorRangeMap copy() { ColorRangeMap newMap = new ColorRangeMap(); IndexRangeIterator it = map.getIndexRangeIterator(-1); - while(it.hasNext()) { + while (it.hasNext()) { IndexRange ir = it.next(); int colorValue = map.getValue(ir.getStart()); newMap.map.paintRange(ir.getStart(), ir.getEnd(), colorValue); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/PaintContext.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/PaintContext.java index 951ac107e1..737b180cc2 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/PaintContext.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/PaintContext.java @@ -18,6 +18,8 @@ package docking.widgets.fieldpanel.internal; import java.awt.Color; import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors.Palette; +import generic.theme.TempColorUtils; /** * Miscellaneous information needed by fields to paint. @@ -50,7 +52,7 @@ public class PaintContext { focusedCursorColor = new GColor("color.cursor.focused"); notFocusedCursorColor = new GColor("color.cursor.unfocused"); cursorColor = focusedCursorColor; - invisibleCursorColor = new Color(255, 0, 0, 1); + invisibleCursorColor = Palette.NO_COLOR; } public PaintContext(PaintContext other) { @@ -128,10 +130,7 @@ public class PaintContext { } private void adjustSelectedHighlightColor() { - int red = (selectionColor.getRed() + highlightColor.getRed()) / 2; - int green = (selectionColor.getGreen() + highlightColor.getGreen()) / 2; - int blue = (selectionColor.getBlue() + highlightColor.getBlue()) / 2; - selectedHighlightColor = new Color(red, green, blue); + selectedHighlightColor = TempColorUtils.blend3(selectionColor, highlightColor); } public void setBackgroundColor(Color c) { @@ -144,7 +143,7 @@ public class PaintContext { public void setCursorColor(Color c) { cursorColor = c; - invisibleCursorColor = new Color(c.getRed(), c.getGreen(), c.getBlue(), 1); + invisibleCursorColor = Palette.NO_COLOR; } public boolean cursorHidden() { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/TestBigLayoutModel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/TestBigLayoutModel.java index c2655a40eb..07c8b8bb92 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/TestBigLayoutModel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/fieldpanel/internal/TestBigLayoutModel.java @@ -28,12 +28,13 @@ import docking.widgets.fieldpanel.listener.IndexMapper; import docking.widgets.fieldpanel.listener.LayoutModelListener; import docking.widgets.fieldpanel.support.*; import docking.widgets.indexedscrollpane.IndexedScrollPane; +import generic.theme.GThemeDefaults.Colors; public class TestBigLayoutModel implements LayoutModel { private static final Highlight[] NO_HIGHLIGHTS = new Highlight[0]; private static final HighlightFactory hlFactory = (field, text, cursorTextOffset) -> NO_HIGHLIGHTS; - ArrayList listeners = new ArrayList(); + ArrayList listeners = new ArrayList<>(); FontMetrics fm; // BigInteger numIndexes = BigInteger.valueOf(1000000000000000L); @@ -83,9 +84,10 @@ public class TestBigLayoutModel implements LayoutModel { } String text = name + ": This is line " + index + " More text to make line longer abcdefghijklmnopqrstuvwxyzabcdefghijk"; - FieldElement fe1 = new TextFieldElement(new AttributedString(text, Color.BLACK, fm), 0, 0); + FieldElement fe1 = + new TextFieldElement(new AttributedString(text, Colors.FOREGROUND, fm), 0, 0); FieldElement fe2 = - new TextFieldElement(new AttributedString("More text", Color.BLACK, fm), 0, 0); + new TextFieldElement(new AttributedString("More text", Colors.FOREGROUND, fm), 0, 0); SingleRowLayout layout = new SingleRowLayout(new ClippingTextField(20, 300, fe1, hlFactory), new ClippingTextField(330, 100, fe2, hlFactory)); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java index 31023aa684..470b915ebb 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java @@ -31,6 +31,8 @@ import docking.widgets.AutoLookup; import docking.widgets.label.GDLabel; import docking.widgets.list.GList; import docking.widgets.list.GListAutoLookup; +import generic.theme.GThemeDefaults.Colors; +import generic.theme.GThemeDefaults.Colors.Java; import ghidra.util.exception.AssertException; class DirectoryList extends GList implements GhidraFileChooserDirectoryModelIf { @@ -184,12 +186,12 @@ class DirectoryList extends GList implements GhidraFileChooserDirectoryMod }); listEditor = new JPanel(new BorderLayout()); - listEditor.setBorder(BorderFactory.createLineBorder(Color.GRAY)); + listEditor.setBorder(BorderFactory.createLineBorder(Java.BORDER)); listEditor.add(listEditorLabel, BorderLayout.WEST); listEditor.add(listEditorField, BorderLayout.CENTER); - listEditor.setBackground(Color.WHITE); + listEditor.setBackground(Colors.BACKGROUND); listEditorField.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); add(listEditor); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileChooserToggleButton.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileChooserToggleButton.java index f6ffbd1f08..243b6a1d34 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileChooserToggleButton.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileChooserToggleButton.java @@ -15,7 +15,6 @@ */ package docking.widgets.filechooser; -import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; @@ -23,58 +22,56 @@ import java.io.File; import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; + +import generic.theme.GThemeDefaults.Colors; public class FileChooserToggleButton extends JToggleButton { private static final long serialVersionUID = 1L; - static final Border RAISED_BORDER = BorderFactory.createCompoundBorder( - BorderFactory.createRaisedBevelBorder(), - BorderFactory.createEmptyBorder(1,1,1,1)); + static final Border RAISED_BORDER = BorderFactory.createCompoundBorder( + BorderFactory.createRaisedBevelBorder(), + BorderFactory.createEmptyBorder(1, 1, 1, 1)); - static final Border NO_BORDER = new EmptyBorder(RAISED_BORDER.getBorderInsets(new JButton())); + static final Border NO_BORDER = new EmptyBorder(RAISED_BORDER.getBorderInsets(new JButton())); - static final Border LOWERED_BORDER = BorderFactory.createCompoundBorder( - BorderFactory.createLoweredBevelBorder(), - BorderFactory.createEmptyBorder(1,1,1,1)); + static final Border LOWERED_BORDER = BorderFactory.createCompoundBorder( + BorderFactory.createLoweredBevelBorder(), + BorderFactory.createEmptyBorder(1, 1, 1, 1)); public FileChooserToggleButton(String text) { super(text); initBorder(); } - + public FileChooserToggleButton(Action action) { super(action); initBorder(); } private void initBorder() { - setForeground(Color.WHITE); - setOpaque(true); + setForeground(Colors.BACKGROUND); + setOpaque(true); setHorizontalTextPosition(SwingConstants.CENTER); setVerticalTextPosition(SwingConstants.BOTTOM); - clearBorder(); - + clearBorder(); + // prevents the WinXP LNF from painting its awkward borders - setContentAreaFilled( false ); - + setContentAreaFilled(false); + // changes the border on hover and click addMouseListener(new ButtonMouseListener()); - + // works in conjunction with the mouse listener to properly set the border - addChangeListener( new ChangeListener() { - public void stateChanged( ChangeEvent e ) { - if ( isSelected() ) { - setBorder( LOWERED_BORDER ); - } - else { - setBorder( NO_BORDER ); - } - } - } ); - - setFocusable( false ); // this prevents the focus box from being drawn over the button + addChangeListener(e -> { + if (isSelected()) { + setBorder(LOWERED_BORDER); + } + else { + setBorder(NO_BORDER); + } + }); + + setFocusable(false); // this prevents the focus box from being drawn over the button } void clearBorder() { @@ -83,52 +80,52 @@ public class FileChooserToggleButton extends JToggleButton { /** Returns the directory with which this button is associated. */ File getFile() { - return null; + return null; } private class ButtonMouseListener extends MouseAdapter { private boolean inside = false; private Border defaultBorder; - + @Override - public void mouseEntered(MouseEvent me) { - if ( isSelected() ) { - return; - } - - defaultBorder = getBorder(); + public void mouseEntered(MouseEvent me) { + if (isSelected()) { + return; + } + + defaultBorder = getBorder(); setBorder(RAISED_BORDER); inside = true; } @Override - public void mouseExited(MouseEvent me) { - if ( isSelected() ) { - return; - } - + public void mouseExited(MouseEvent me) { + if (isSelected()) { + return; + } + inside = false; restoreBorder(); } @Override - public void mousePressed(MouseEvent e) { - if ( isSelected() ) { - return; - } - + public void mousePressed(MouseEvent e) { + if (isSelected()) { + return; + } + if (e.getButton() == MouseEvent.BUTTON1) { setBorder(LOWERED_BORDER); } } @Override - public void mouseReleased(MouseEvent e) { - if ( isSelected() ) { - return; - } - + public void mouseReleased(MouseEvent e) { + if (isSelected()) { + return; + } + if (inside) { setBorder(RAISED_BORDER); } @@ -136,14 +133,14 @@ public class FileChooserToggleButton extends JToggleButton { restoreBorder(); } } - - private void restoreBorder() { - if ( defaultBorder != null ) { - setBorder(defaultBorder); - } - else { - setBorder( NO_BORDER ); - } - } - } + + private void restoreBorder() { + if (defaultBorder != null) { + setBorder(defaultBorder); + } + else { + setBorder(NO_BORDER); + } + } + } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java index 7675176475..4914f6594b 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java @@ -24,6 +24,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; import docking.widgets.label.GDLabel; +import generic.theme.GThemeDefaults.Colors.Java; import ghidra.util.Msg; import ghidra.util.filechooser.GhidraFileChooserModel; @@ -100,12 +101,7 @@ class FileEditor extends AbstractCellEditor implements TableCellEditor { // make sure the name field gets the focus, not the container @Override public void requestFocus() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - nameField.requestFocus(); - } - }); + SwingUtilities.invokeLater(() -> nameField.requestFocus()); } }; @@ -115,7 +111,7 @@ class FileEditor extends AbstractCellEditor implements TableCellEditor { // match the spacing of non-editing cells editor.setBorder( BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0), - BorderFactory.createLineBorder(Color.GRAY))); + BorderFactory.createLineBorder(Java.BORDER))); } private void handleDoubleClick(Point p) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java index 822419cbc9..79c2b19687 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java @@ -37,6 +37,7 @@ import docking.widgets.label.GDLabel; import docking.widgets.label.GLabel; import docking.widgets.list.GListCellRenderer; import generic.theme.GColor; +import generic.theme.GThemeDefaults.Colors.Palette; import ghidra.framework.OperatingSystem; import ghidra.framework.Platform; import ghidra.framework.preferences.Preferences; @@ -366,7 +367,7 @@ public class GhidraFileChooser extends DialogComponentProvider implements FileFi JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createLoweredBevelBorder()); - panel.setBackground(BACKGROUND_COLOR.darker()); + panel.setBackground(Palette.DARK_GRAY); panel.add(shortCutPanel, BorderLayout.NORTH); return panel; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java index 5b62739d92..3052b152d6 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java @@ -22,6 +22,7 @@ import java.util.function.Function; import javax.swing.*; import docking.widgets.AbstractGCellRenderer; +import generic.theme.GThemeDefaults.Colors.Palette; /** * Provides a common implementation of a list renderer, for use in both JList and JComboBox. @@ -94,7 +95,7 @@ public class GListCellRenderer extends AbstractGCellRenderer implements ListC dropLocation.getIndex() == index); // @formatter:on if (isDropRow) { - setBackground(Color.CYAN); + setBackground(Palette.CYAN); } else { setBackground(getOSDependentBackgroundColor(list, index)); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java index 08761ababf..046e21c105 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java @@ -29,6 +29,7 @@ import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.table.*; import generic.jar.ResourceFile; +import generic.theme.GThemeDefaults.Colors.Tables; import generic.util.Path; import ghidra.framework.options.SaveState; import ghidra.framework.preferences.Preferences; @@ -52,7 +53,6 @@ public class PathManager { private JButton downButton; private JButton addButton; private JButton removeButton; - private Color selectionColor; private GhidraFileChooser fileChooser; private String preferenceForLastSelectedDir = Preferences.LAST_IMPORT_DIRECTORY; private String title = "Select File"; @@ -102,8 +102,8 @@ public class PathManager { /** * Add a new file path and set its enablement - * @param file - * @param enabled + * @param file the file whose path to use + * @param enabled true if enabled * @return true if the enabled path did not already exist */ public boolean addPath(ResourceFile file, boolean enabled) { @@ -127,9 +127,6 @@ public class PathManager { return true; } - /** - * Set the paths. - */ public void setPaths(List paths) { pathModel.setPaths(paths); } @@ -164,8 +161,6 @@ public class PathManager { private void create(List paths) { panel = new JPanel(new BorderLayout(5, 5)); - selectionColor = new Color(204, 204, 255); - if (allowOrdering) { upButton = new JButton(ResourceManager.loadImage("images/up.png")); upButton.setName("UpArrow"); @@ -215,8 +210,6 @@ public class PathManager { pathTable = new GTable(pathModel); pathTable.setName("PATH_TABLE"); - pathTable.setSelectionBackground(selectionColor); - pathTable.setSelectionForeground(Color.BLACK); pathTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); //make the 'enabled' column very skinny... @@ -240,7 +233,8 @@ public class PathManager { if (column == PathManagerModel.COLUMN_PATH) { Path path = (Path) value; if (!isValidPath(path)) { - renderer.setForeground(Color.RED); + renderer.setForeground(data.isSelected() ? Tables.FG_ERROR_SELECTED + : Tables.FG_ERROR_UNSELECTED); } } return renderer; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java index 97ad8a24f5..e05b76a055 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java @@ -27,6 +27,7 @@ import docking.widgets.OptionDialog; import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.table.*; +import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.framework.preferences.Preferences; import ghidra.util.filechooser.GhidraFileChooserModel; import ghidra.util.filechooser.GhidraFileFilter; @@ -54,7 +55,6 @@ public class PathnameTablePanel extends JPanel { private JButton addButton; private JButton removeButton; private JButton resetButton; - private Color selectionColor; private GhidraFileChooser fileChooser; private String preferenceForLastSelectedDir = Preferences.LAST_IMPORT_DIRECTORY; private String title = "Select File"; @@ -134,9 +134,6 @@ public class PathnameTablePanel extends JPanel { this.addToTop = addToTop; } - /** - * Return paths in the table. - */ public String[] getPaths() { String[] paths = new String[tableModel.getRowCount()]; for (int i = 0; i < paths.length; i++) { @@ -145,16 +142,10 @@ public class PathnameTablePanel extends JPanel { return paths; } - /** - * Set the paths. - */ public void setPaths(String[] paths) { tableModel.setPaths(paths); } - /** - * Get the table in this path name panel. - */ public JTable getTable() { return pathnameTable; } @@ -168,7 +159,6 @@ public class PathnameTablePanel extends JPanel { } private void create() { - selectionColor = new Color(204, 204, 255); upButton = new JButton(ResourceManager.loadImage("images/up.png")); upButton.setName("UpArrow"); @@ -222,8 +212,6 @@ public class PathnameTablePanel extends JPanel { pathnameTable.setShowGrid(false); pathnameTable.setPreferredScrollableViewportSize(new Dimension(330, 200)); - pathnameTable.setSelectionBackground(selectionColor); - pathnameTable.setSelectionForeground(Color.BLACK); pathnameTable.setTableHeader(null); pathnameTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); JScrollPane scrollPane = new JScrollPane(pathnameTable); @@ -265,10 +253,7 @@ public class PathnameTablePanel extends JPanel { public Component getTableCellRendererComponent(GTableCellRenderingData data) { JLabel label = (JLabel) super.getTableCellRendererComponent(data); - - JTable table = data.getTable(); Object value = data.getValue(); - boolean isSelected = data.isSelected(); String pathName = (String) value; @@ -282,8 +267,10 @@ public class PathnameTablePanel extends JPanel { } label.setText(pathName.toString()); - Color fg = isSelected ? table.getSelectionForeground() : table.getForeground(); - label.setForeground(!fileExists ? Color.RED : fg); + if (!fileExists) { + label.setForeground(data.isSelected() ? Tables.FG_ERROR_SELECTED + : Tables.FG_ERROR_UNSELECTED); + } return label; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java index 7a048e7e74..ea37f6b6da 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java @@ -27,6 +27,7 @@ import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; import docking.widgets.AbstractGCellRenderer; +import generic.theme.GColor; import ghidra.docking.settings.*; import ghidra.util.*; import ghidra.util.exception.AssertException; @@ -46,6 +47,8 @@ public class GTableCellRenderer extends AbstractGCellRenderer implements TableCe protected static final FloatingPointPrecisionSettingsDefinition FLOATING_POINT_PRECISION_SETTING = FloatingPointPrecisionSettingsDefinition.DEF; + private static final Color BG_DRAG = new GColor("color.bg.table.row.drag"); + private static DecimalFormat decimalFormat; private static Map decimalFormatCache; @@ -157,7 +160,7 @@ public class GTableCellRenderer extends AbstractGCellRenderer implements TableCe setForegroundColor(table, model, value); if (row == dropRow) { - setBackground(Color.CYAN); + setBackground(BG_DRAG); } else { setBackground(getOSDependentBackgroundColor(table, row)); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/SelectColumnsDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/SelectColumnsDialog.java index 81fdb60f37..0e971b22ad 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/SelectColumnsDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/SelectColumnsDialog.java @@ -23,9 +23,12 @@ import javax.swing.*; import javax.swing.table.*; import docking.DialogComponentProvider; +import generic.theme.GColor; import ghidra.util.HelpLocation; public class SelectColumnsDialog extends DialogComponentProvider { + + private static final Color BG_NON_DEFAULT = new GColor("color.fg.disabled"); private static final String DISCOVERED_TABLE_COLUMN_NAME = "Non-default"; private GTable ghidraTable; @@ -150,6 +153,7 @@ public class SelectColumnsDialog extends DialogComponentProvider { //================================================================================================== private class ColumnSelectorStringRenderer extends GTableCellRenderer { + @Override public Component getTableCellRendererComponent(GTableCellRenderingData data) { @@ -164,7 +168,7 @@ public class SelectColumnsDialog extends DialogComponentProvider { TableColumnWrapper tableColumnWrapper = columnList.get(row); if (!tableColumnWrapper.isDefault()) { - c.setBackground(c.getBackground().darker()); + c.setBackground(BG_NON_DEFAULT); c.setOpaque(true); } @@ -188,7 +192,7 @@ public class SelectColumnsDialog extends DialogComponentProvider { TableColumnWrapper tableColumnWrapper = columnList.get(row); if (!tableColumnWrapper.isDefault()) { - c.setBackground(c.getBackground().darker()); + c.setBackground(BG_NON_DEFAULT); c.setOpaque(true); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java index ec0d57c24e..224b4408f8 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java @@ -33,6 +33,8 @@ import docking.widgets.table.GTableFilterPanel; import docking.widgets.table.RowObjectFilterModel; import docking.widgets.table.columnfilter.*; import docking.widgets.table.constrainteditor.ColumnConstraintEditor; +import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors.Messages; import generic.util.WindowUtilities; import ghidra.util.HelpLocation; import ghidra.util.Msg; @@ -369,7 +371,7 @@ public class ColumnFilterDialog extends DialogComponentProvider private GLabel createLogicalOperationLabel(LogicOperation op) { GLabel label = new GLabel("<" + op + ">", SwingConstants.CENTER); - label.setForeground(Color.GRAY); + label.setForeground(Messages.HINT); return label; } @@ -381,7 +383,7 @@ public class ColumnFilterDialog extends DialogComponentProvider headerPanel.add(new GLabel("Filter Value", SwingConstants.CENTER)); headerPanel.setBorder(new CompoundBorder( - BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY.brighter().brighter()), + BorderFactory.createMatteBorder(0, 0, 1, 0, Java.BORDER), BorderFactory.createEmptyBorder(4, 0, 4, 0))); return headerPanel; } @@ -475,5 +477,4 @@ public class ColumnFilterDialog extends DialogComponentProvider } - } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java index 77369b4673..0abe113e1c 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java @@ -15,10 +15,9 @@ */ package docking.widgets.table.constraint.dialog; -import java.awt.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.*; import javax.swing.*; import javax.swing.border.BevelBorder; @@ -27,6 +26,7 @@ import docking.widgets.EmptyBorderButton; import docking.widgets.combobox.GhidraComboBox; import docking.widgets.label.GDLabel; import docking.widgets.list.GListCellRenderer; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.util.layout.VerticalLayout; import resources.ResourceManager; @@ -116,7 +116,7 @@ class ColumnFilterPanel extends JPanel { private Component createOrLabel() { JLabel jLabel = new GDLabel("", SwingConstants.CENTER); - jLabel.setForeground(Color.GRAY); + jLabel.setForeground(Messages.HINT); return jLabel; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AbstractColumnConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AbstractColumnConstraintEditor.java index b1d5991de4..3edcdd670c 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AbstractColumnConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AbstractColumnConstraintEditor.java @@ -18,11 +18,11 @@ package docking.widgets.table.constrainteditor; import java.awt.Color; import java.awt.Component; -import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import docking.widgets.table.constraint.ColumnConstraint; +import generic.theme.GColor; import generic.theme.GThemeDefaults.Colors; import ghidra.util.HTMLUtilities; import ghidra.util.datastruct.WeakDataStructureFactory; @@ -44,9 +44,9 @@ public abstract class AbstractColumnConstraintEditor implements ColumnConstra private boolean validEditorValue = false; /** Color indicating a valid value is defined by the editor widget(s) */ - protected static final Color VALID_INPUT_COLOR = UIManager.getColor("TextField.background"); + protected static final Color VALID_INPUT_COLOR = Colors.BACKGROUND; /** Color indicating a invalid value is defined by the editor widget(s) */ - protected static final Color INVALID_INPUT_COLOR = new Color(255, 0, 51, 40); + protected static final Color INVALID_INPUT_COLOR = new GColor("docking.palette.mistyrose"); /** * Constructor. diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java index 16ecd266be..fdf607b482 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java @@ -31,6 +31,7 @@ import docking.widgets.DropDownTextField; import docking.widgets.DropDownTextFieldDataModel; import docking.widgets.list.GListCellRenderer; import docking.widgets.table.constraint.*; +import generic.theme.GThemeDefaults.Colors.Palette; import ghidra.util.HTMLUtilities; /** @@ -214,7 +215,7 @@ public class AutocompletingStringConstraintEditor extends DataLoadingConstraintE private String formatListValue(String value, boolean isSelected) { Matcher matcher = model.lastConstraint.getHighlightMatcher(value); - Color color = isSelected ? Color.YELLOW : Color.MAGENTA; + Color color = isSelected ? Palette.YELLOW : Palette.MAGENTA; StringBuilder sb = new StringBuilder(""); // find and highlight all instances of the user-defined pattern while (matcher.find()) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java index 2273c4495f..26d29c74fa 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java @@ -15,7 +15,8 @@ */ package docking.widgets.table.constrainteditor; -import java.awt.*; +import java.awt.Component; +import java.awt.GridLayout; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; @@ -28,6 +29,7 @@ import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.RangeColumnConstraint; import docking.widgets.table.constraint.provider.DateColumnConstraintProvider; import docking.widgets.textfield.LocalDateTextField; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.util.layout.VerticalLayout; /** @@ -109,7 +111,7 @@ public class DateRangeConstraintEditor extends AbstractColumnConstraintEditor implements ColumnConstraintEditor JPanel panel = new JPanel(); JLabel errorLabel = new GDHtmlLabel( - "" + HTMLUtilities.bold(HTMLUtilities.colorString(Color.RED, message))); + "" + HTMLUtilities.bold(HTMLUtilities.colorString(Messages.ERROR, message))); panel.add(errorLabel); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java index 580f51a3fc..8855b7f3b7 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java @@ -25,6 +25,7 @@ import docking.widgets.checkbox.GCheckBox; import docking.widgets.label.GDHtmlLabel; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.EnumColumnConstraint; +import generic.theme.GThemeDefaults.Colors.Messages; /** * A constraint editor for enumerated-type values; @@ -79,7 +80,7 @@ public class EnumConstraintEditor> extends AbstractColumnConst outerPanel.add(panel, BorderLayout.CENTER); infoLabel = new GDHtmlLabel(""); - infoLabel.setForeground(Color.GRAY); + infoLabel.setForeground(Messages.HINT); infoLabel.setHorizontalAlignment(SwingConstants.CENTER); outerPanel.add(infoLabel, BorderLayout.SOUTH); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java index 764e420392..095869bce4 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java @@ -15,7 +15,8 @@ */ package docking.widgets.table.constrainteditor; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; import javax.swing.*; @@ -26,6 +27,7 @@ import docking.widgets.spinner.IntegerSpinner; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.SingleValueColumnConstraint; import docking.widgets.textfield.IntegerTextField; +import generic.theme.GThemeDefaults.Colors.Messages; /** * A constraint editor for specifying comparison with a single integer-type value (Byte, Short, @@ -73,7 +75,7 @@ public class IntegerConstraintEditor extends AbstractColumnCon panel.add(spinner.getSpinner(), BorderLayout.CENTER); statusLabel = new GDHtmlLabel(); panel.add(statusLabel, BorderLayout.SOUTH); - statusLabel.setForeground(Color.RED); + statusLabel.setForeground(Messages.ERROR); statusLabel.setHorizontalAlignment(SwingConstants.CENTER); return panel; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java index a8fb1d2826..7a326a4d46 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java @@ -15,7 +15,8 @@ */ package docking.widgets.table.constrainteditor; -import java.awt.*; +import java.awt.Component; +import java.awt.GridLayout; import java.math.BigInteger; import javax.swing.*; @@ -24,6 +25,7 @@ import docking.widgets.label.GDHtmlLabel; import docking.widgets.spinner.IntegerSpinner; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.RangeColumnConstraint; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.util.layout.VerticalLayout; /** @@ -105,7 +107,7 @@ public class IntegerRangeConstraintEditor panel.add(rangeControlPanel); infoLabel = new GDHtmlLabel(); - infoLabel.setForeground(Color.GRAY); + infoLabel.setForeground(Messages.HINT); infoLabel.setHorizontalAlignment(SwingConstants.CENTER); panel.add(infoLabel); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java index d3d048dc6a..a0a493e94a 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java @@ -15,7 +15,8 @@ */ package docking.widgets.table.constrainteditor; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; import javax.swing.*; @@ -23,6 +24,7 @@ import docking.DockingUtils; import docking.widgets.label.GDHtmlLabel; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.StringColumnConstraint; +import generic.theme.GThemeDefaults.Colors.Messages; /** * A constraint editor for String-type values. @@ -56,7 +58,7 @@ public class StringConstraintEditor extends AbstractColumnConstraintEditor> 1, new Color(1.0f, - 1.0f, 1.0f, 0.0f)); + new GradientPaint(0, 0, transparentTreeBackground, 0, size.height >> 1, + Palette.NO_COLOR); g2.setPaint(mask); // Sets the alpha composite @@ -214,14 +214,14 @@ public class GTreeDragNDropAdapter implements DragSourceListener, DragGestureLis private List createSelectionList(TreePath[] selectionPaths) { - List list = new ArrayList(); + List list = new ArrayList<>(); if (selectionPaths == null) { return list; } - for (int i = 0; i < selectionPaths.length; i++) { - list.add((GTreeNode) selectionPaths[i].getLastPathComponent()); + for (TreePath selectionPath : selectionPaths) { + list.add((GTreeNode) selectionPath.getLastPathComponent()); } return list; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java index b31d2af290..57537ed5a1 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java @@ -29,7 +29,7 @@ import generic.theme.GColor; public class GTreeRenderer extends DefaultTreeCellRenderer implements GComponent { - private static final Color VALID_DROP_TARGET_COLOR = new Color(200, 200, 255); + private static final Color VALID_DROP_TARGET_COLOR = new GColor("color.bg.tree.drag"); private static final int DEFAULT_MIN_ICON_WIDTH = 22; private Object dropTarget; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java b/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java index 3e8d1ba78a..dae4a1e9ce 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java @@ -27,6 +27,7 @@ import docking.DialogComponentProvider; import docking.DockingWindowManager; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GDLabel; +import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.util.*; import help.Help; import help.HelpService; @@ -81,6 +82,7 @@ public class WizardManager extends DialogComponentProvider implements WizardPane /** * @see java.awt.Window#dispose() */ + @Override public void dispose() { if (currWizPanel != null) { currWizPanel.removeWizardPanelListener(this); @@ -471,7 +473,7 @@ if (!visitedMap.containsKey(currWizPanel)) { } titledBorder.setTitleFont(font.deriveFont(10f)); - titledBorder.setTitleColor(Color.BLUE); + titledBorder.setTitleColor(Messages.NORMAL); titledBorder.setTitlePosition(TitledBorder.BOTTOM); titledBorder.setTitleJustification(TitledBorder.TRAILING); diff --git a/Ghidra/Framework/Docking/src/main/java/ghidra/docking/util/painting/GRepaintManager.java b/Ghidra/Framework/Docking/src/main/java/ghidra/docking/util/painting/GRepaintManager.java deleted file mode 100644 index a1e554fd09..0000000000 --- a/Ghidra/Framework/Docking/src/main/java/ghidra/docking/util/painting/GRepaintManager.java +++ /dev/null @@ -1,173 +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.docking.util.painting; - -import java.awt.*; -import java.awt.image.*; - -import javax.swing.RepaintManager; - -import ghidra.util.Msg; -import sun.awt.image.SurfaceManager; - -/** - * A repaint manager that can be plugged-in to Java's {@link RepaintManager} in order to - * change how we paint colors. - * - * @see Graphics2D - */ -public class GRepaintManager extends RepaintManager { - - private VolatileImageWrapper imageWrapper = new VolatileImageWrapper(); - - @Override - public Image getVolatileOffscreenBuffer(Component c, int proposedWidth, int proposedHeight) { - Image image = super.getVolatileOffscreenBuffer(c, proposedWidth, proposedHeight); - - if (!(image instanceof VolatileImage)) { - Msg.debug(this, - "Cannot install Graphics2D color inverter. Non-volatile image found: " + - image.getClass().getName()); - return image; - } - - imageWrapper.setImage((VolatileImage) image); - return imageWrapper; - } - - private class VolatileImageWrapper extends VolatileImage { - - private Graphics2DWrapper wrapper = new Graphics2DWrapper(); - private VolatileImage image = this; - - void setImage(VolatileImage image) { - this.image = image; - SurfaceManager manager = SurfaceManager.getManager(image); - SurfaceManager.setManager(this, manager); - } - - @Override - public Graphics getGraphics() { - Graphics g = image.getGraphics(); - wrapper.setDelegate((Graphics2D) g); - return wrapper; - } - - @Override - public BufferedImage getSnapshot() { - return image.getSnapshot(); - } - - @Override - public int getWidth() { - return image.getWidth(); - } - - @Override - public int getHeight() { - return image.getHeight(); - } - - @Override - public Graphics2D createGraphics() { - return image.createGraphics(); - } - - @Override - public int validate(GraphicsConfiguration gc) { - return image.validate(gc); - } - - @Override - public boolean contentsLost() { - return image.contentsLost(); - } - - @Override - public ImageCapabilities getCapabilities() { - return image.getCapabilities(); - } - - @Override - public int getTransparency() { - if (image == null) { - return super.getTransparency(); - } - return image.getTransparency(); - } - - @Override - public int getWidth(ImageObserver observer) { - return image.getWidth(observer); - } - - @Override - public int hashCode() { - return image.hashCode(); - } - - @Override - public int getHeight(ImageObserver observer) { - return image.getHeight(observer); - } - - @Override - public ImageProducer getSource() { - return image.getSource(); - } - - @Override - public boolean equals(Object obj) { - return image.equals(obj); - } - - @Override - public Object getProperty(String name, ImageObserver observer) { - return image.getProperty(name, observer); - } - - @Override - public Image getScaledInstance(int width, int height, int hints) { - return image.getScaledInstance(width, height, hints); - } - - @Override - public void flush() { - image.flush(); - } - - @Override - public String toString() { - return image.toString(); - } - - @Override - public ImageCapabilities getCapabilities(GraphicsConfiguration gc) { - return image.getCapabilities(gc); - } - - @Override - public void setAccelerationPriority(float priority) { - image.setAccelerationPriority(priority); - } - - @Override - public float getAccelerationPriority() { - return image.getAccelerationPriority(); - } - - } -} diff --git a/Ghidra/Framework/Docking/src/main/java/ghidra/docking/util/painting/Graphics2DWrapper.java b/Ghidra/Framework/Docking/src/main/java/ghidra/docking/util/painting/Graphics2DWrapper.java deleted file mode 100644 index 1d6a69b601..0000000000 --- a/Ghidra/Framework/Docking/src/main/java/ghidra/docking/util/painting/Graphics2DWrapper.java +++ /dev/null @@ -1,573 +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.docking.util.painting; - -import java.awt.*; -import java.awt.MultipleGradientPaint.CycleMethod; -import java.awt.RenderingHints.Key; -import java.awt.font.FontRenderContext; -import java.awt.font.GlyphVector; -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.awt.image.*; -import java.awt.image.renderable.RenderableImage; -import java.text.AttributedCharacterIterator; -import java.util.Map; - -/** - * A simple wrapper object that changes colors passed to {@link Graphics2D}. - */ -public class Graphics2DWrapper extends Graphics2D { - - private Graphics2D delegate; - - public Graphics2DWrapper() { - // delegate set later - } - - private Graphics2DWrapper(Graphics2D delegate) { - setDelegate(delegate); - } - - public void setDelegate(Graphics2D delegate) { - this.delegate = delegate; - - setColor(delegate.getColor()); - setBackground(delegate.getBackground()); - setPaint(delegate.getPaint()); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - public boolean equals(Object obj) { - return delegate.equals(obj); - } - - @Override - public Graphics create() { - return new Graphics2DWrapper((Graphics2D) delegate.create()); - } - - @Override - public Graphics create(int x, int y, int width, int height) { - return new Graphics2DWrapper((Graphics2D) delegate.create(x, y, width, height)); - } - - @Override - public Color getColor() { - // - // Clients will call this method to later restore this Graphic's color. So, we must - // revert the color or it will get restored incorrectly. - // - Color alt = delegate.getColor(); - Color orig = getComplementaryColor(alt); - return orig; - } - - private static Color getComplementaryColor(Color c) { - - if (c == null) { - return null; - } - - Color alt = new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue()); - return alt; - } - - @Override - public void setBackground(Color c) { - Color alt = getComplementaryColor(c); - delegate.setBackground(alt); - } - - @Override - public Color getBackground() { - // - // Clients will call this method to later restore this Graphic's color. So, we must - // revert the color or it will get restored incorrectly. - // - Color alt = delegate.getBackground(); - Color orig = getComplementaryColor(alt); - return orig; - } - - @Override - public void setColor(Color c) { - Color alt = getComplementaryColor(c); - delegate.setColor(alt); - } - - @Override - public Paint getPaint() { - Paint alt = delegate.getPaint(); - - if (alt instanceof Color) { - Color c = (Color) alt; - Color orig = getComplementaryColor(c); - return orig; - } - else if (alt instanceof GradientPaint) { - GradientPaint gp = (GradientPaint) alt; - Color alt1 = getComplementaryColor(gp.getColor1()); - Color alt2 = getComplementaryColor(gp.getColor2()); - GradientPaint orig = - new GradientPaint(gp.getPoint1(), alt1, gp.getPoint2(), alt2, gp.isCyclic()); - return orig; - } - else if (alt instanceof LinearGradientPaint) { - - LinearGradientPaint gp = (LinearGradientPaint) alt; - Color[] colors = gp.getColors(); - float[] fractions = gp.getFractions(); - Point2D start = gp.getStartPoint(); - Point2D end = gp.getEndPoint(); - CycleMethod cycleMethod = gp.getCycleMethod(); - LinearGradientPaint orig = - new LinearGradientPaint(start, end, fractions, colors, cycleMethod); - return orig; - } - else { - // Else case from setPaint() - } - - return alt; - } - - @Override - public void setPaint(Paint paint) { - - if (paint instanceof Color) { - Color c = (Color) paint; - Color alt = getComplementaryColor(c); - delegate.setPaint(alt); - } - else if (paint instanceof GradientPaint) { - GradientPaint gp = (GradientPaint) paint; - Color alt1 = getComplementaryColor(gp.getColor1()); - Color alt2 = getComplementaryColor(gp.getColor2()); - GradientPaint alt = - new GradientPaint(gp.getPoint1(), alt1, gp.getPoint2(), alt2, gp.isCyclic()); - delegate.setPaint(alt); - } - else if (paint instanceof LinearGradientPaint) { - - LinearGradientPaint gp = (LinearGradientPaint) paint; - Color[] colors = gp.getColors(); - float[] fractions = gp.getFractions(); - Point2D start = gp.getStartPoint(); - Point2D end = gp.getEndPoint(); - CycleMethod cycleMethod = gp.getCycleMethod(); - LinearGradientPaint alt = - new LinearGradientPaint(start, end, fractions, colors, cycleMethod); - delegate.setPaint(alt); - } - else { - - System.err.println("G2DWrapper - non-Color Paint: " + paint.getClass().getSimpleName()); - delegate.setPaint(paint); - } - } - - @Override - public void setPaintMode() { - delegate.setPaintMode(); - } - - @Override - public void setXORMode(Color c1) { - delegate.setXORMode(c1); - } - - @Override - public Font getFont() { - return delegate.getFont(); - } - - @Override - public void setFont(Font font) { - delegate.setFont(font); - } - - @Override - public FontMetrics getFontMetrics() { - return delegate.getFontMetrics(); - } - - @Override - public FontMetrics getFontMetrics(Font f) { - return delegate.getFontMetrics(f); - } - - @Override - public Rectangle getClipBounds() { - return delegate.getClipBounds(); - } - - @Override - public void clipRect(int x, int y, int width, int height) { - delegate.clipRect(x, y, width, height); - } - - @Override - public void setClip(int x, int y, int width, int height) { - delegate.setClip(x, y, width, height); - } - - @Override - public Shape getClip() { - return delegate.getClip(); - } - - @Override - public void setClip(Shape clip) { - delegate.setClip(clip); - } - - @Override - public void copyArea(int x, int y, int width, int height, int dx, int dy) { - delegate.copyArea(x, y, width, height, dx, dy); - } - - @Override - public void drawLine(int x1, int y1, int x2, int y2) { - delegate.drawLine(x1, y1, x2, y2); - } - - @Override - public void fillRect(int x, int y, int width, int height) { - delegate.fillRect(x, y, width, height); - } - - @Override - public void drawRect(int x, int y, int width, int height) { - delegate.drawRect(x, y, width, height); - } - - @Override - public void draw3DRect(int x, int y, int width, int height, boolean raised) { - delegate.draw3DRect(x, y, width, height, raised); - } - - @Override - public void clearRect(int x, int y, int width, int height) { - delegate.clearRect(x, y, width, height); - } - - @Override - public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - delegate.drawRoundRect(x, y, width, height, arcWidth, arcHeight); - } - - @Override - public void fill3DRect(int x, int y, int width, int height, boolean raised) { - delegate.fill3DRect(x, y, width, height, raised); - } - - @Override - public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - delegate.fillRoundRect(x, y, width, height, arcWidth, arcHeight); - } - - @Override - public void draw(Shape s) { - delegate.draw(s); - } - - @Override - public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { - return delegate.drawImage(img, xform, obs); - } - - @Override - public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { - delegate.drawImage(img, op, x, y); - } - - @Override - public void drawOval(int x, int y, int width, int height) { - delegate.drawOval(x, y, width, height); - } - - @Override - public void drawRenderedImage(RenderedImage img, AffineTransform xform) { - delegate.drawRenderedImage(img, xform); - } - - @Override - public void fillOval(int x, int y, int width, int height) { - delegate.fillOval(x, y, width, height); - } - - @Override - public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - delegate.drawArc(x, y, width, height, startAngle, arcAngle); - } - - @Override - public void drawRenderableImage(RenderableImage img, AffineTransform xform) { - delegate.drawRenderableImage(img, xform); - } - - @Override - public void drawString(String str, int x, int y) { - delegate.drawString(str, x, y); - } - - @Override - public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - delegate.fillArc(x, y, width, height, startAngle, arcAngle); - } - - @Override - public void drawString(String str, float x, float y) { - delegate.drawString(str, x, y); - } - - @Override - public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) { - delegate.drawPolyline(xPoints, yPoints, nPoints); - } - - @Override - public void drawString(AttributedCharacterIterator iterator, int x, int y) { - delegate.drawString(iterator, x, y); - } - - @Override - public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) { - delegate.drawPolygon(xPoints, yPoints, nPoints); - } - - @Override - public void drawString(AttributedCharacterIterator iterator, float x, float y) { - delegate.drawString(iterator, x, y); - } - - @Override - public void drawPolygon(Polygon p) { - delegate.drawPolygon(p); - } - - @Override - public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) { - delegate.fillPolygon(xPoints, yPoints, nPoints); - } - - @Override - public void drawGlyphVector(GlyphVector g, float x, float y) { - delegate.drawGlyphVector(g, x, y); - } - - @Override - public void fillPolygon(Polygon p) { - delegate.fillPolygon(p); - } - - @Override - public void fill(Shape s) { - delegate.fill(s); - } - - @Override - public boolean hit(Rectangle rect, Shape s, boolean onStroke) { - return delegate.hit(rect, s, onStroke); - } - - @Override - public void drawChars(char[] data, int offset, int length, int x, int y) { - delegate.drawChars(data, offset, length, x, y); - } - - @Override - public GraphicsConfiguration getDeviceConfiguration() { - return delegate.getDeviceConfiguration(); - } - - @Override - public void setComposite(Composite comp) { - delegate.setComposite(comp); - } - - @Override - public void drawBytes(byte[] data, int offset, int length, int x, int y) { - delegate.drawBytes(data, offset, length, x, y); - } - - @Override - public boolean drawImage(Image img, int x, int y, ImageObserver observer) { - - return delegate.drawImage(img, x, y, observer); - } - - @Override - public void setStroke(Stroke s) { - delegate.setStroke(s); - } - - @Override - public void setRenderingHint(Key hintKey, Object hintValue) { - delegate.setRenderingHint(hintKey, hintValue); - } - - @Override - public Object getRenderingHint(Key hintKey) { - return delegate.getRenderingHint(hintKey); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, - ImageObserver observer) { - return delegate.drawImage(img, x, y, width, height, observer); - } - - @Override - public void setRenderingHints(Map hints) { - delegate.setRenderingHints(hints); - } - - @Override - public void addRenderingHints(Map hints) { - delegate.addRenderingHints(hints); - } - - @Override - public RenderingHints getRenderingHints() { - return delegate.getRenderingHints(); - } - - @Override - public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) { - return delegate.drawImage(img, x, y, bgcolor, observer); - } - - @Override - public void translate(int x, int y) { - delegate.translate(x, y); - } - - @Override - public void translate(double tx, double ty) { - delegate.translate(tx, ty); - } - - @Override - public void rotate(double theta) { - delegate.rotate(theta); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, - ImageObserver observer) { - return delegate.drawImage(img, x, y, width, height, bgcolor, observer); - } - - @Override - public void rotate(double theta, double x, double y) { - delegate.rotate(theta, x, y); - } - - @Override - public void scale(double sx, double sy) { - delegate.scale(sx, sy); - } - - @Override - public void shear(double shx, double shy) { - delegate.shear(shx, shy); - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, - int sx2, int sy2, ImageObserver observer) { - return delegate.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); - } - - @Override - public void transform(AffineTransform Tx) { - delegate.transform(Tx); - } - - @Override - public void setTransform(AffineTransform Tx) { - delegate.setTransform(Tx); - } - - @Override - public AffineTransform getTransform() { - return delegate.getTransform(); - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, - int sx2, int sy2, Color bgcolor, ImageObserver observer) { - return delegate.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer); - } - - @Override - public Composite getComposite() { - return delegate.getComposite(); - } - - @Override - public Stroke getStroke() { - return delegate.getStroke(); - } - - @Override - public void clip(Shape s) { - delegate.clip(s); - } - - @Override - public FontRenderContext getFontRenderContext() { - return delegate.getFontRenderContext(); - } - - @Override - public void dispose() { - delegate.dispose(); - } - - @Override - public void finalize() { - delegate.finalize(); - } - - @Override - public String toString() { - return delegate.toString(); - } - - @Override - public Rectangle getClipRect() { - return delegate.getClipBounds(); - } - - @Override - public boolean hitClip(int x, int y, int width, int height) { - return delegate.hitClip(x, y, width, height); - } - - @Override - public Rectangle getClipBounds(Rectangle r) { - return delegate.getClipBounds(r); - } - -} diff --git a/Ghidra/Framework/Docking/src/main/java/resources/Icons.java b/Ghidra/Framework/Docking/src/main/java/resources/Icons.java index 3aee5c6f0a..478311eb67 100644 --- a/Ghidra/Framework/Docking/src/main/java/resources/Icons.java +++ b/Ghidra/Framework/Docking/src/main/java/resources/Icons.java @@ -15,7 +15,8 @@ */ package resources; -import java.awt.*; +import java.awt.Component; +import java.awt.Graphics; import java.lang.reflect.Field; import java.net.URL; @@ -23,6 +24,7 @@ import javax.swing.Icon; import javax.swing.ImageIcon; import generic.theme.GIcon; +import generic.theme.GThemeDefaults.Colors; import ghidra.util.Msg; import resources.icons.RotateIcon; import resources.icons.TranslateIcon; @@ -202,7 +204,7 @@ public class Icons { @Override public void paintIcon(Component c, Graphics g, int x, int y) { base.paintIcon(c, g, x, y); - g.setColor(new Color(50, 50, 50)); + g.setColor(Colors.BACKGROUND); g.fillRect(x + 6, y + 14, 2, 2); g.fillRect(x + 9, y + 14, 2, 2); g.fillRect(x + 12, y + 14, 2, 2); diff --git a/Ghidra/Framework/Docking/src/test/java/docking/theme/gui/ThemeUtilsTest.java b/Ghidra/Framework/Docking/src/test/java/docking/theme/gui/ThemeUtilsTest.java index e50222d1f8..b796e24a7a 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/theme/gui/ThemeUtilsTest.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/theme/gui/ThemeUtilsTest.java @@ -37,6 +37,8 @@ import generic.theme.builtin.NimbusTheme; public class ThemeUtilsTest extends AbstractDockingTest { + private Color testColor = Color.RED; + @Before public void setup() { GTheme nimbusTheme = new NimbusTheme(); @@ -74,7 +76,7 @@ public class ThemeUtilsTest extends AbstractDockingTest { @Test public void testImportThemeWithCurrentChangesCancelled() throws IOException { assertEquals("Nimbus Theme", Gui.getActiveTheme().getName()); - Gui.setColor("Panel.background", Color.RED); + Gui.setColor("Panel.background", testColor); assertTrue(Gui.hasThemeChanges()); File themeFile = createThemeFile("Bob"); @@ -92,7 +94,7 @@ public class ThemeUtilsTest extends AbstractDockingTest { assertEquals("Nimbus Theme", Gui.getActiveTheme().getName()); // make a change in the current theme, so you get asked to save - Gui.setColor("Panel.background", Color.RED); + Gui.setColor("Panel.background", testColor); assertTrue(Gui.hasThemeChanges()); File themeFile = createThemeFile("Bob"); @@ -115,7 +117,7 @@ public class ThemeUtilsTest extends AbstractDockingTest { assertEquals("Nimbus Theme", Gui.getActiveTheme().getName()); // make a change in the current theme, so you get asked to save - Gui.setColor("Panel.background", Color.RED); + Gui.setColor("Panel.background", testColor); assertTrue(Gui.hasThemeChanges()); File bobThemeFile = createThemeFile("Bob"); @@ -191,7 +193,7 @@ public class ThemeUtilsTest extends AbstractDockingTest { private File createZipThemeFile(String themeName) throws IOException { File file = createTempFile("Test_Theme", ".theme.zip"); GTheme outputTheme = new GTheme(file, themeName, LafType.METAL, false); - outputTheme.addColor(new ColorValue("Panel.Background", Color.RED)); + outputTheme.addColor(new ColorValue("Panel.Background", testColor)); outputTheme.saveToZip(file, false); return file; } diff --git a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/AttributedStringTest.java b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/AttributedStringTest.java index 139f71623e..682abf7006 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/AttributedStringTest.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/AttributedStringTest.java @@ -15,7 +15,7 @@ */ package docking.widgets.fieldpanel; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import java.awt.*; @@ -24,6 +24,7 @@ import org.junit.Test; import docking.widgets.fieldpanel.field.*; import generic.test.AbstractGenericTest; +import generic.theme.GThemeDefaults.Colors.Palette; public class AttributedStringTest extends AbstractGenericTest { FontMetrics fm; @@ -45,14 +46,16 @@ public class AttributedStringTest extends AbstractGenericTest { public void testSubstring() { FieldElement[] strings = new FieldElement[] { - new TextFieldElement(new AttributedString("This is string", Color.BLACK, fm), 0, 0), // 14 chars - new TextFieldElement(new AttributedString("to test", Color.RED, fm), 0, 0), // 7 chars - new TextFieldElement(new AttributedString("the substring of ", Color.BLACK, fm), 0, + new TextFieldElement(new AttributedString("This is string", Palette.BLACK, fm), 0, + 0), // 14 chars + new TextFieldElement(new AttributedString("to test", Palette.RED, fm), 0, 0), // 7 chars + new TextFieldElement(new AttributedString("the substring of ", Palette.BLACK, fm), + 0, 0), // 17 chars - new TextFieldElement(new AttributedString(" .... ", Color.BLACK, fm), 0, 0), // 8 chars + new TextFieldElement(new AttributedString(" .... ", Palette.BLACK, fm), 0, 0), // 8 chars new TextFieldElement( - new AttributedString("the CompositeAttributedString", Color.BLUE, fm), 0, 0), // 29 chars - new TextFieldElement(new AttributedString("class.", Color.BLACK, fm), 0, 0) }; + new AttributedString("the CompositeAttributedString", Palette.BLUE, fm), 0, 0), // 29 chars + new TextFieldElement(new AttributedString("class.", Palette.BLACK, fm), 0, 0) }; FieldElement compositeString = new CompositeFieldElement(strings); FieldElement substring = compositeString.substring(0); @@ -83,18 +86,21 @@ public class AttributedStringTest extends AbstractGenericTest { // runtime ArrayIndexOutOfBoundsException 7/11/06 strings = new FieldElement[] { new TextFieldElement( - new AttributedString("This is an annotated comment: ", Color.BLUE, fm), 0, 0), - new TextFieldElement(new AttributedString("RegSetValueExW", Color.BLUE, fm), 0, 0), + new AttributedString("This is an annotated comment: ", Palette.BLUE, fm), 0, 0), + new TextFieldElement(new AttributedString("RegSetValueExW", Palette.BLUE, fm), 0, 0), new TextFieldElement(new AttributedString( - " This is an annotated comment with symbol name: ", Color.RED, fm), 0, 0), - new TextFieldElement(new AttributedString("No symbol: RegSetValueExW", Color.RED, fm), + " This is an annotated comment with symbol name: ", Palette.RED, fm), 0, 0), + new TextFieldElement(new AttributedString("No symbol: RegSetValueExW", Palette.RED, fm), 0, 0), - new TextFieldElement(new AttributedString(" Bad annotation: ", Color.BLUE, fm), 0, 0), + new TextFieldElement(new AttributedString(" Bad annotation: ", Palette.BLUE, fm), 0, + 0), new TextFieldElement( - new AttributedString("Invalid Annotation: {@cowhide smile}:", Color.RED, fm), 0, 0), - new TextFieldElement(new AttributedString(" ", Color.BLUE, fm), 0, 0), - new TextFieldElement(new AttributedString("{@cowhide smile}", Color.BLUE, fm), 0, 0), - new TextFieldElement(new AttributedString("Invalid Annotation: {@sym}", Color.BLUE, fm), + new AttributedString("Invalid Annotation: {@cowhide smile}:", Palette.RED, fm), 0, + 0), + new TextFieldElement(new AttributedString(" ", Palette.BLUE, fm), 0, 0), + new TextFieldElement(new AttributedString("{@cowhide smile}", Palette.BLUE, fm), 0, 0), + new TextFieldElement( + new AttributedString("Invalid Annotation: {@sym}", Palette.BLUE, fm), 0, 0) }; FieldElement compositeString2 = new CompositeFieldElement(strings); diff --git a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/ColorRangeMapTest.java b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/ColorRangeMapTest.java index 625d8bdd47..8281eaad15 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/ColorRangeMapTest.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/ColorRangeMapTest.java @@ -15,7 +15,7 @@ */ package docking.widgets.fieldpanel; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import java.awt.Color; @@ -23,6 +23,7 @@ import org.junit.Test; import docking.widgets.fieldpanel.internal.ColorRangeMap; import generic.test.AbstractGenericTest; +import generic.theme.GThemeDefaults.Colors.Palette; public class ColorRangeMapTest extends AbstractGenericTest { public ColorRangeMapTest() { @@ -32,31 +33,35 @@ public class ColorRangeMapTest extends AbstractGenericTest { @Test public void testPaint1() { ColorRangeMap map = new ColorRangeMap(); - map.color(10, 10, Color.BLUE); - assertEquals(Color.WHITE, map.getColor(0, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(9, Color.WHITE)); - assertEquals(Color.BLUE, map.getColor(10, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(11, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(100, Color.WHITE)); + map.color(10, 10, Palette.BLUE); + assertColorsEqual(Palette.WHITE, map.getColor(0, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(9, Palette.WHITE)); + assertColorsEqual(Palette.BLUE, map.getColor(10, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(11, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(100, Palette.WHITE)); } @Test public void testCopy() { ColorRangeMap map = new ColorRangeMap(); - map.color(10, 10, Color.BLUE); - assertEquals(Color.WHITE, map.getColor(0, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(9, Color.WHITE)); - assertEquals(Color.BLUE, map.getColor(10, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(11, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(100, Color.WHITE)); + map.color(10, 10, Palette.BLUE); + assertColorsEqual(Palette.WHITE, map.getColor(0, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(9, Palette.WHITE)); + assertColorsEqual(Palette.BLUE, map.getColor(10, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(11, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(100, Palette.WHITE)); map = map.copy(); - assertEquals(Color.WHITE, map.getColor(0, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(9, Color.WHITE)); - assertEquals(Color.BLUE, map.getColor(10, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(11, Color.WHITE)); - assertEquals(Color.WHITE, map.getColor(100, Color.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(0, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(9, Palette.WHITE)); + assertColorsEqual(Palette.BLUE, map.getColor(10, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(11, Palette.WHITE)); + assertColorsEqual(Palette.WHITE, map.getColor(100, Palette.WHITE)); + } + + private void assertColorsEqual(Color c1, Color c2) { + assertEquals(c1.getRGB(), c2.getRGB()); } } diff --git a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/FlowLayoutTextFieldTest.java b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/FlowLayoutTextFieldTest.java index bdd3486d6a..cb594d1302 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/FlowLayoutTextFieldTest.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/FlowLayoutTextFieldTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import docking.widgets.fieldpanel.field.*; import docking.widgets.fieldpanel.support.*; import generic.test.AbstractGenericTest; +import generic.theme.GThemeDefaults.Colors.Palette; public class FlowLayoutTextFieldTest extends AbstractGenericTest { @@ -39,7 +40,7 @@ public class FlowLayoutTextFieldTest extends AbstractGenericTest { public void setUp() throws Exception { HighlightFactory factory = (field, text, cursorTextOffset) -> { - return new Highlight[] { new Highlight(4, 4, Color.YELLOW) }; + return new Highlight[] { new Highlight(4, 4, Palette.YELLOW) }; }; Font font = new Font("Times New Roman", 0, 14); @@ -63,12 +64,12 @@ public class FlowLayoutTextFieldTest extends AbstractGenericTest { Wow */ - elements.add(new TextFieldElement(new AttributedString("Hello ", Color.BLUE, fm), 0, 0)); + elements.add(new TextFieldElement(new AttributedString("Hello ", Palette.BLUE, fm), 0, 0)); elements.add(new TextFieldElement( - new AttributedString("World ", Color.RED, fm, true, Color.BLUE), 1, 0)); + new AttributedString("World ", Palette.RED, fm, true, Palette.BLUE), 1, 0)); elements.add( - new TextFieldElement(new AttributedString(CLIPPED_STRING, Color.GREEN, fm), 2, 0)); - elements.add(new TextFieldElement(new AttributedString("Wow! ", Color.GRAY, fm), 3, 0)); + new TextFieldElement(new AttributedString(CLIPPED_STRING, Palette.GREEN, fm), 2, 0)); + elements.add(new TextFieldElement(new AttributedString("Wow! ", Palette.GRAY, fm), 3, 0)); textField = new FlowLayoutTextField(elements, 100, 100, 3, factory); } diff --git a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/VerticalLayoutTextFieldTest.java b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/VerticalLayoutTextFieldTest.java index 018e27d818..269b56ff9d 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/VerticalLayoutTextFieldTest.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/VerticalLayoutTextFieldTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import docking.widgets.fieldpanel.field.*; import docking.widgets.fieldpanel.support.*; import generic.test.AbstractGenericTest; +import generic.theme.GThemeDefaults.Colors.Palette; public class VerticalLayoutTextFieldTest extends AbstractGenericTest { @@ -39,7 +40,7 @@ public class VerticalLayoutTextFieldTest extends AbstractGenericTest { public void setUp() throws Exception { HighlightFactory factory = (f, text, cursorTextOffset) -> { - return new Highlight[] { new Highlight(4, 4, Color.YELLOW) }; + return new Highlight[] { new Highlight(4, 4, Palette.YELLOW) }; }; Font font = new Font("Times New Roman", 0, 14); @@ -48,12 +49,12 @@ public class VerticalLayoutTextFieldTest extends AbstractGenericTest { List elements = new ArrayList<>(); - elements.add(new TextFieldElement(new AttributedString("Hello", Color.BLUE, fm), 0, 0)); + elements.add(new TextFieldElement(new AttributedString("Hello", Palette.BLUE, fm), 0, 0)); elements.add(new TextFieldElement( - new AttributedString("World", Color.RED, fm, true, Color.BLUE), 1, 0)); + new AttributedString("World", Palette.RED, fm, true, Palette.BLUE), 1, 0)); elements.add( - new TextFieldElement(new AttributedString(CLIPPED_STRING, Color.GREEN, fm), 2, 0)); - elements.add(new TextFieldElement(new AttributedString("Wow!", Color.GRAY, fm), 3, 0)); + new TextFieldElement(new AttributedString(CLIPPED_STRING, Palette.GREEN, fm), 2, 0)); + elements.add(new TextFieldElement(new AttributedString("Wow!", Palette.GRAY, fm), 3, 0)); field = new VerticalLayoutTextField(elements, 100, 100, 5, factory); } diff --git a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/field/CompositeVerticalLayoutTextFieldTest.java b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/field/CompositeVerticalLayoutTextFieldTest.java index a010350c23..9f74f137e3 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/field/CompositeVerticalLayoutTextFieldTest.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/widgets/fieldpanel/field/CompositeVerticalLayoutTextFieldTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import docking.widgets.fieldpanel.support.*; import generic.test.AbstractGenericTest; +import generic.theme.GThemeDefaults.Colors.Palette; public class CompositeVerticalLayoutTextFieldTest extends AbstractGenericTest { @@ -65,7 +66,7 @@ public class CompositeVerticalLayoutTextFieldTest extends AbstractGenericTest { List elements = new ArrayList<>(); int row = 0; for (String line : lines) { - elements.add(createRow(row++, line, Color.BLUE)); + elements.add(createRow(row++, line, Palette.BLUE)); } List fields = new ArrayList<>(); @@ -83,7 +84,7 @@ public class CompositeVerticalLayoutTextFieldTest extends AbstractGenericTest { List elements = new ArrayList<>(); int row = 0; for (String line : lines) { - elements.add(createRow(row++, line, Color.BLUE)); + elements.add(createRow(row++, line, Palette.BLUE)); } List fields = new ArrayList<>(); @@ -114,12 +115,12 @@ public class CompositeVerticalLayoutTextFieldTest extends AbstractGenericTest { } private TextField wrappedField(int row, String text) { - FieldElement element = createRow(row, text, Color.BLUE); + FieldElement element = createRow(row, text, Palette.BLUE); return new WrappingVerticalLayoutTextField(element, startX, width, maxLines, hlFactory); } private TextField clippedField(int row, String text) { - FieldElement element = createRow(row, text, Color.BLUE); + FieldElement element = createRow(row, text, Palette.BLUE); return new ClippingTextField(startX, width, element, hlFactory); } 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 310a3a0da8..dd645e1a73 100644 --- a/Ghidra/Framework/Generic/src/main/java/generic/theme/GThemeDefaults.java +++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/GThemeDefaults.java @@ -42,12 +42,12 @@ public class GThemeDefaults { // generic color concepts //@formatter:off public static final GColor BACKGROUND = new GColor("color.bg"); + public static final GColor BACKGROUND_TOOLTIP = new GColor("color.bg.tooltip"); public static final GColor CURSOR = new GColor("color.cursor.focused"); public static final GColor DISABLED = new GColor("color.palette.disabled"); public static final GColor ERROR = new GColor("color.fg.error"); // TODO replace most uses of this with Messages.ERROR public static final GColor FOREGROUND = new GColor("color.fg"); - public static final GColor FOREGROUND_DISABLED = new GColor("color.fg.disabled"); - public static final GColor TOOLTIP_BACKGROUND = new GColor("color.bg.tooltip"); + public static final GColor FOREGROUND_DISABLED = new GColor("color.fg.disabled"); //@formatter:on public static class Java { @@ -94,7 +94,7 @@ public class GThemeDefaults { 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 LAVENDER = getColor("lavender"); public static final GColor LIGHT_GRAY = getColor("lightgray"); public static final GColor LIME = getColor("lime"); public static final GColor MAGENTA = getColor("magenta"); 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 c2cad37702..aa6a6ed9f8 100644 --- a/Ghidra/Framework/Generic/src/main/java/generic/theme/TempColorUtils.java +++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/TempColorUtils.java @@ -17,6 +17,8 @@ package generic.theme; import java.awt.Color; +import ghidra.util.WebColors; + /** * A class to serve as a placeholder for migrating code. After the migration is complete, uses * of this class can be removed, with the original code being restored in the process. @@ -47,10 +49,10 @@ public class TempColorUtils { return new Color(c.getRed(), c.getGreen(), c.getBlue(), a); } - public static Color blend1(Color primary, Color secondary) { - int red = (primary.getRed() * 2 + secondary.getRed()) / 3; - int green = (primary.getGreen() * 2 + secondary.getGreen()) / 3; - int blue = (primary.getBlue() * 2 + secondary.getBlue()) / 3; + public static Color blend1(Color c1, Color c2) { + int red = (c1.getRed() * 2 + c2.getRed()) / 3; + int green = (c1.getGreen() * 2 + c2.getGreen()) / 3; + int blue = (c1.getBlue() * 2 + c2.getBlue()) / 3; return new Color(red, green, blue); } @@ -60,4 +62,22 @@ public class TempColorUtils { int blue = (c.getBlue() + 3 * value) / 4; return new Color(red, green, blue); } + + public static Color blend3(Color c1, Color c2) { + int red = (c1.getRed() + c2.getRed()) / 2; + int green = (c1.getGreen() + c2.getGreen()) / 2; + int blue = (c1.getBlue() + c2.getBlue()) / 2; + return new Color(red, green, blue); + } + + public static Color blend4(Color c1, Color c2) { + int red = (c1.getRed() * 3 + c2.getRed()) / 4; + int green = (c1.getGreen() * 3 + c2.getGreen()) / 4; + int blue = (c1.getBlue() * 3 + c2.getBlue()) / 4; + return new Color(red, green, blue); + } + + public static String toString(Color c) { + return WebColors.toString(c, false); + } }