GP-1981 - Checkpoint - Conversions for FilterTextField, GenericHeader,

and OptionsGui; Moves some resources to Docking from Base; Moved the
theme plugin so it is available to generic applications
This commit is contained in:
dragonmacher
2022-08-05 17:40:13 -04:00
committed by ghidragon
parent 703a7beb8d
commit d588daaca6
17 changed files with 99 additions and 62 deletions
@@ -18,7 +18,7 @@ color.fg.listing.entrypoint = magenta
color.fg.listing.comment.auto = lightGray color.fg.listing.comment.auto = lightGray
color.fg.listing.comment.eol = blue color.fg.listing.comment.eol = blue
color.fg.listing.comment.repeatable = darkOrange color.fg.listing.comment.repeatable = darkOrange
color.fg.listing.comment.ref-repeatable = comflowerBlue color.fg.listing.comment.ref-repeatable = cornflowerBlue
color.fg.listing.comment.plate = gray color.fg.listing.comment.plate = gray
color.fg.listing.comment.post = blue color.fg.listing.comment.post = blue
color.fg.listing.comment.pre = indigo color.fg.listing.comment.pre = indigo
@@ -38,6 +38,8 @@ color.fg.listing.label.primary = darkBlue
color.fg.listing.mnemonic.override = deepPink color.fg.listing.mnemonic.override = deepPink
color.fg.listing.mnemonic = navy color.fg.listing.mnemonic = navy
color.fg.listing.mnemonic.unimplemented = navy color.fg.listing.mnemonic.unimplemented = navy
// TODO
color.fg.listing.flow-arrow.inactive = lightGray color.fg.listing.flow-arrow.inactive = lightGray
color.fg.listing.flow-arrow.active = color.fg color.fg.listing.flow-arrow.active = color.fg
color.fg.listing.flow-arrow.selected = limeGreen color.fg.listing.flow-arrow.selected = limeGreen
@@ -50,7 +52,7 @@ color.fg.listing.xref.read = blue
color.fg.listing.xref.write = darkOrange color.fg.listing.xref.write = darkOrange
color.fg.listing.xref.other = color.fg color.fg.listing.xref.other = color.fg
color.fg.listing.register = olive color.fg.listing.register = olive
color.fg.listing.underline = comflowerBlue color.fg.listing.underline = cornflowerBlue
color.fg.listing.pcode.label = blue color.fg.listing.pcode.label = blue
color.fg.listing.pcode.space = blue color.fg.listing.pcode.space = blue
color.fg.listing.pcode.varnode = blue color.fg.listing.pcode.varnode = blue
@@ -69,7 +71,7 @@ color.fg.listing.pcode.userop = blue
#color.fg.listing.comment.auto = rgb(95,129,157) #color.fg.listing.comment.auto = rgb(95,129,157)
#color.fg.listing.comment.eol = blue #color.fg.listing.comment.eol = blue
#color.fg.listing.comment.repeatable = darkOrange #color.fg.listing.comment.repeatable = darkOrange
#color.fg.listing.comment.ref-repeatable = comflowerBlue #color.fg.listing.comment.ref-repeatable = cornflowerBlue
#color.fg.listing.comment.plate = gray #color.fg.listing.comment.plate = gray
#color.fg.listing.comment.post = blue #color.fg.listing.comment.post = blue
#color.fg.listing.comment.pre = indigo #color.fg.listing.comment.pre = indigo
@@ -101,7 +103,7 @@ color.fg.listing.pcode.userop = blue
#color.fg.listing.xref.write = darkOrange #color.fg.listing.xref.write = darkOrange
#color.fg.listing.xref.other = color.fg #color.fg.listing.xref.other = color.fg
#color.fg.listing.register = olive #color.fg.listing.register = olive
#color.fg.listing.underline = comflowerBlue #color.fg.listing.underline = cornflowerBlue
#color.fg.listing.pcode.label = blue #color.fg.listing.pcode.label = blue
#color.fg.listing.pcode.space = blue #color.fg.listing.pcode.space = blue
#color.fg.listing.pcode.varnode = blue #color.fg.listing.pcode.varnode = blue
@@ -192,7 +192,8 @@ public class OptionsGui extends JPanel {
static ScreenElement[] elements = { ADDRESS, BACKGROUND, BAD_REF_ADDR, BYTES, COMMENT_AUTO, static ScreenElement[] elements = { ADDRESS, BACKGROUND, BAD_REF_ADDR, BYTES, COMMENT_AUTO,
COMMENT_EOL, COMMENT_PLATE, COMMENT_POST, COMMENT_PRE, COMMENT_REPEATABLE, COMMENT_EOL, COMMENT_PLATE, COMMENT_POST, COMMENT_PRE, COMMENT_REPEATABLE,
COMMENT_REF_REPEAT, CONSTANT, ENTRY_POINT, EXT_REF_RESOLVED, FIELD_NAME, FLOW_ARROW_ACTIVE, COMMENT_REF_REPEAT, CONSTANT, ENTRY_POINT, EXT_REF_RESOLVED, FIELD_NAME, FLOW_ARROW_ACTIVE,
FLOW_ARROW_NON_ACTIVE, FUN_CALL_FIXUP, FUN_NAME, FUN_PARAMS, FUN_AUTO_PARAMS, FUN_RET_TYPE, FLOW_ARROW_NON_ACTIVE, FLOW_ARROW_SELECTED, FUN_CALL_FIXUP, FUN_NAME, FUN_PARAMS,
FUN_AUTO_PARAMS, FUN_RET_TYPE,
FUN_TAG, LABELS_LOCAL, LABELS_NON_PRIMARY, LABELS_PRIMARY, LABELS_UNREFD, MNEMONIC, FUN_TAG, LABELS_LOCAL, LABELS_NON_PRIMARY, LABELS_PRIMARY, LABELS_UNREFD, MNEMONIC,
MNEMONIC_OVERRIDE, PARAMETER_CUSTOM, PARAMETER_DYNAMIC, PCODE_LINE_LABEL, PCODE_ADDR_SPACE, MNEMONIC_OVERRIDE, PARAMETER_CUSTOM, PARAMETER_DYNAMIC, PCODE_LINE_LABEL, PCODE_ADDR_SPACE,
PCODE_RAW_VARNODE, PCODE_USEROP, REGISTERS, SEPARATOR, UNDERLINE, UNIMPL, VARIABLE, PCODE_RAW_VARNODE, PCODE_USEROP, REGISTERS, SEPARATOR, UNDERLINE, UNIMPL, VARIABLE,
@@ -42,6 +42,7 @@ src/main/resources/images/bullet_delete.png||FAMFAMFAM Icons - CC 2.5||||END|
src/main/resources/images/checkmark_green.gif||GHIDRA||reviewed||END| src/main/resources/images/checkmark_green.gif||GHIDRA||reviewed||END|
src/main/resources/images/close16.gif||GHIDRA||reviewed||END| src/main/resources/images/close16.gif||GHIDRA||reviewed||END|
src/main/resources/images/closedFolder.png||Modified Nuvola Icons - LGPL 2.1||||END| src/main/resources/images/closedFolder.png||Modified Nuvola Icons - LGPL 2.1||||END|
src/main/resources/images/collapse_all.png||GHIDRA||||END|
src/main/resources/images/computer.png||Tango Icons - Public Domain|||tango|END| src/main/resources/images/computer.png||Tango Icons - Public Domain|||tango|END|
src/main/resources/images/desktop.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END| src/main/resources/images/desktop.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END|
src/main/resources/images/dialog-cancel.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| src/main/resources/images/dialog-cancel.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END|
@@ -84,6 +85,8 @@ src/main/resources/images/information.png||FAMFAMFAM Icons - CC 2.5|||famfamfam
src/main/resources/images/inode-directory.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| src/main/resources/images/inode-directory.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END|
src/main/resources/images/left.alternate.png||GHIDRA||||END| src/main/resources/images/left.alternate.png||GHIDRA||||END|
src/main/resources/images/left.png||GHIDRA||reviewed||END| src/main/resources/images/left.png||GHIDRA||reviewed||END|
src/main/resources/images/locationIn.gif||GHIDRA||||END|
src/main/resources/images/locationOut.gif||GHIDRA||||END|
src/main/resources/images/magnifier.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| src/main/resources/images/magnifier.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END|
src/main/resources/images/media-playback-start.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| src/main/resources/images/media-playback-start.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END|
src/main/resources/images/menu16.gif||GHIDRA||reviewed||END| src/main/resources/images/menu16.gif||GHIDRA||reviewed||END|
@@ -111,6 +114,7 @@ src/main/resources/images/undo.png||GHIDRA||||END|
src/main/resources/images/up.png||GHIDRA||reviewed||END| src/main/resources/images/up.png||GHIDRA||reviewed||END|
src/main/resources/images/user-home.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| src/main/resources/images/user-home.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END|
src/main/resources/images/view-filter.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| src/main/resources/images/view-filter.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END|
src/main/resources/images/viewmagfit.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END|
src/main/resources/images/warning.help.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| src/main/resources/images/warning.help.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END|
src/main/resources/images/warning.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| src/main/resources/images/warning.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END|
src/main/resources/images/weather-clear.png||Tango Icons - Public Domain|||tango icon set|END| src/main/resources/images/weather-clear.png||Tango Icons - Public Domain|||tango icon set|END|
@@ -4,6 +4,7 @@
color.palette.material.primary = #6200EE color.palette.material.primary = #6200EE
color.palette.material.primary.variant = #3700B3
color.palette.material.secondary = #03DAC6 color.palette.material.secondary = #03DAC6
color.palette.material.secondary.variant = #018786 color.palette.material.secondary.variant = #018786
@@ -36,4 +36,5 @@ color.palette.white = white
[Dark Defaults] [Dark Defaults]
// TODO replace values above with dark values // TODO replace values above with dark values
color.palette.black = lightgray #color.palette.black = lightgray
#color.palette.yellow = rgb(191, 191, 64) // olive
@@ -5,6 +5,11 @@ color.fg = black
color.fg.error = red color.fg.error = red
color.fg.disabled = lightGray color.fg.disabled = lightGray
color.bg.header.active = steelblue
color.bg.header.inactive = rgb(150, 150, 150)
color.fg.header.active = ivory
color.fg.header.inactive = black
color.bg.selection = rgb(180, 255, 180) // pale green color.bg.selection = rgb(180, 255, 180) // pale green
color.bg.highlight = rgb(255,255,150) // pale yellow color.bg.highlight = rgb(255,255,150) // pale yellow
color.bg.tooltip = rgb(255, 255, 230) color.bg.tooltip = rgb(255, 255, 230)
@@ -25,6 +30,9 @@ color.bg.textfield.hint.valid = color.bg
color.bg.textfield.hint.invalid = rgb(255,225,225) color.bg.textfield.hint.invalid = rgb(255,225,225)
color.fg.textfield.hint = color.fg color.fg.textfield.hint = color.fg
color.bg.filterfield = yellow
color.fg.filterfield = black
color.bg.selection.help = lightSteelBlue color.bg.selection.help = lightSteelBlue
// generic component items // generic component items
@@ -58,7 +66,7 @@ icon.notallowed = images/dialog-cancel.png
icon.folder.open = images/openSmallFolder.png icon.folder.open = images/openSmallFolder.png
icon.refresh = images/reload3.png icon.refresh = images/reload3.png
icon.sort.ascending = images/sortascending.png icon.sort.ascending = images/sortascending.png
icon.sort.descending = images/process-stop.png icon.sort.descending = images/sortdescending.png
icon.stop = images/process-stop.png icon.stop = images/process-stop.png
icon.warning.strong = images/software-update-urgent.png icon.warning.strong = images/software-update-urgent.png
icon.left = images/left.png icon.left = images/left.png
@@ -77,6 +85,11 @@ icon.checkmark.green = images/checkmark_green.gif
color.bg = rgb(40, 42, 46) color.bg = rgb(40, 42, 46)
color.fg = lightgray color.fg = lightgray
color.bg.header.active = steelblue // color.palette.material.primary // lightcoral
color.bg.header.inactive = dimGray
color.fg.header.active = lightGray
color.fg.header.inactive = black
color.bg.currentline = rgb(60,60,70) // dark gray color.bg.currentline = rgb(60,60,70) // dark gray
color.cursor.focused = indianRed color.cursor.focused = indianRed
@@ -84,8 +97,11 @@ color.cursor.unfocussed = darkGray
color.bg.textfield.hint.invalid = maroon color.bg.textfield.hint.invalid = maroon
color.bg.filterfield = beige
color.fg.filterfield = darkSlateGray
color.bg.selection = teal color.bg.selection = teal
color.bg.highlight = rgb(110,110,0) color.bg.highlight = olive
color.bg.fieldpanel.selection-highlight = darkGreen color.bg.fieldpanel.selection-highlight = darkGreen
@@ -26,6 +26,7 @@ import org.jdesktop.animation.timing.TimingTargetAdapter;
import org.jdesktop.animation.timing.interpolation.PropertySetter; import org.jdesktop.animation.timing.interpolation.PropertySetter;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.theme.GColor;
import docking.util.AnimationUtils; import docking.util.AnimationUtils;
import docking.widgets.VariableHeightPanel; import docking.widgets.VariableHeightPanel;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
@@ -33,12 +34,14 @@ import docking.widgets.label.GDLabel;
// TODO: should this be put into generic? // TODO: should this be put into generic?
public class GenericHeader extends JPanel { public class GenericHeader extends JPanel {
private static final Color NON_FOCUS_START_COLOR = new Color(150, 150, 150); private static final Color NON_FOCUS_START_COLOR = new GColor("color.bg.header.inactive");
private static final Color FOCUS_START_COLOR = new Color(30, 30, 150); private static final Color FOCUS_START_COLOR = new GColor("color.bg.header.active");
private static final int MINIMUM_TITLE_SIZE = 80; private static final int MINIMUM_TITLE_SIZE = 80;
private Color nonFocusColor = NON_FOCUS_START_COLOR; private Color nonFocusColor = NON_FOCUS_START_COLOR;
private Color focusColor = FOCUS_START_COLOR; private Color focusColor = FOCUS_START_COLOR;
private Color activeForeground = new GColor("color.fg.header.active");
private Color inactiveForeground = new GColor("color.fg.header.inactive");
protected Component component; protected Component component;
protected DockableToolBarManager toolBarMgr; protected DockableToolBarManager toolBarMgr;
@@ -419,7 +422,7 @@ public class GenericHeader extends JPanel {
*/ */
void setSelected(boolean state) { void setSelected(boolean state) {
isSelected = state; isSelected = state;
titleLabel.setForeground(state ? Color.WHITE : Color.BLACK); titleLabel.setForeground(state ? activeForeground : inactiveForeground);
repaint(); repaint();
} }
@@ -21,7 +21,6 @@ import java.util.*;
import java.util.List; import java.util.List;
import javax.swing.*; import javax.swing.*;
import javax.swing.plaf.UIResource;
import com.formdev.flatlaf.*; import com.formdev.flatlaf.*;
@@ -54,6 +53,7 @@ public class Gui {
private static Map<String, GColorUIResource> gColorMap = new HashMap<>(); private static Map<String, GColorUIResource> gColorMap = new HashMap<>();
private static Map<String, GIconUIResource> gIconMap = new HashMap<>(); private static Map<String, GIconUIResource> gIconMap = new HashMap<>();
private static boolean isInitialzed;
static void setPropertiesLoader(ThemePropertiesLoader loader) { static void setPropertiesLoader(ThemePropertiesLoader loader) {
themePropertiesLoader = loader; themePropertiesLoader = loader;
@@ -64,8 +64,9 @@ public class Gui {
} }
public static void initialize() { public static void initialize() {
isInitialzed = true;
installFlatLookAndFeels(); installFlatLookAndFeels();
loadGhidraDefaults(); loadThemeDefaults();
setTheme(getThemeFromPreferences()); setTheme(getThemeFromPreferences());
// LookAndFeelUtils.installGlobalOverrides(); // LookAndFeelUtils.installGlobalOverrides();
platformSpecificFixups(); platformSpecificFixups();
@@ -78,14 +79,14 @@ public class Gui {
FlatDarculaLaf.class.getName()); FlatDarculaLaf.class.getName());
} }
private static void loadGhidraDefaults() { private static void loadThemeDefaults() {
themePropertiesLoader.load(); themePropertiesLoader.load();
ghidraLightDefaults = themePropertiesLoader.getDefaults(); ghidraLightDefaults = themePropertiesLoader.getDefaults();
ghidraDarkDefaults = themePropertiesLoader.getDarkDefaults(); ghidraDarkDefaults = themePropertiesLoader.getDarkDefaults();
} }
public static void reloadGhidraDefaults() { public static void reloadGhidraDefaults() {
loadGhidraDefaults(); loadThemeDefaults();
buildCurrentValues(); buildCurrentValues();
} }
@@ -220,7 +221,7 @@ public class Gui {
ColorValue color = currentValues.getColor(id); ColorValue color = currentValues.getColor(id);
if (color == null) { if (color == null) {
if (validate) { if (validate && isInitialzed) {
// Throwable t = getFilteredTrace(); // Throwable t = getFilteredTrace();
Msg.error(Gui.class, "No color value registered for: " + id); Msg.error(Gui.class, "No color value registered for: " + id);
} }
@@ -232,9 +233,9 @@ public class Gui {
public static Icon getRawIcon(String id, boolean validate) { public static Icon getRawIcon(String id, boolean validate) {
IconValue icon = currentValues.getIcon(id); IconValue icon = currentValues.getIcon(id);
if (icon == null) { if (icon == null) {
if (validate) { if (validate && isInitialzed) {
Throwable t = getFilteredTrace(); Throwable t = getFilteredTrace();
Msg.error(Gui.class, "No color value registered for: " + id, t); Msg.error(Gui.class, "No icon value registered for: " + id, t);
} }
return ResourceManager.getDefaultIcon(); return ResourceManager.getDefaultIcon();
} }
@@ -265,15 +266,6 @@ public class Gui {
repaintAll(); repaintAll();
} }
private static Color getUIColor(String id) {
// Not sure, but for now, make sure colors are not UIResource
Color color = UIManager.getColor(id);
if (color instanceof UIResource) {
return new Color(color.getRGB(), true);
}
return color;
}
private static Set<GTheme> findThemes() { private static Set<GTheme> findThemes() {
Set<GTheme> set = new HashSet<>(); Set<GTheme> set = new HashSet<>();
set.addAll(findDiscoverableThemes()); set.addAll(findDiscoverableThemes());
@@ -135,8 +135,6 @@ public class LookAndFeelInstaller {
ids = LookAndFeelUtils.getLookAndFeelIdsForType(defaults, Icon.class); ids = LookAndFeelUtils.getLookAndFeelIdsForType(defaults, Icon.class);
for (String id : ids) { for (String id : ids) {
Icon icon = UIManager.getIcon(id); Icon icon = UIManager.getIcon(id);
Msg.debug(LookAndFeelInstaller.class,
"adding " + id + " icon class = " + icon.getClass().getName());
values.addIcon(new IconValue(id, icon)); values.addIcon(new IconValue(id, icon));
} }
@@ -23,6 +23,8 @@ import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import docking.DockingUtils; import docking.DockingUtils;
import docking.theme.GColor;
import docking.theme.GThemeDefaults.Colors.Palette;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;
import ghidra.util.datastruct.WeakDataStructureFactory; import ghidra.util.datastruct.WeakDataStructureFactory;
import ghidra.util.datastruct.WeakSet; import ghidra.util.datastruct.WeakSet;
@@ -42,11 +44,14 @@ public class FilterTextField extends JPanel {
private static final long MINIMUM_TIME_BETWEEN_FLASHES_MS = 5000; private static final long MINIMUM_TIME_BETWEEN_FLASHES_MS = 5000;
private static final int FLASH_FREQUENCY_MS = 250; private static final int FLASH_FREQUENCY_MS = 250;
private static Color FLASH_BACKGROUND_COLOR = Color.WHITE; private static Color FLASH_FOREGROUND_COLOR = new GColor("color.fg");
private static Color FILTERED_BACKGROUND_COLOR = Color.YELLOW; private static Color FILTERED_BACKGROUND_COLOR = new GColor("color.bg.filterfield");
/*package*/ static Color UNEDITABLE_BACKGROUND_COLOR = Color.LIGHT_GRAY; private static Color FILTERED_FOREGROUND_COLOR = new GColor("color.fg.filterfield");
private Color noFlashColor; /*package*/ static Color UNEDITABLE_BACKGROUND_COLOR = Palette.LIGHT_GRAY;
private Color noFlashBgColor;
private Color noFlashFgColor;
/** Signals the last flash time (used to prevent excessive flashing) */ /** Signals the last flash time (used to prevent excessive flashing) */
private long lastFlashTime = 0; private long lastFlashTime = 0;
@@ -153,11 +158,18 @@ public class FilterTextField extends JPanel {
flashTimer.restart(); flashTimer.restart();
} }
private Color getDefaultBackgroundColor() { private Color getDefaultBgColor() {
if (noFlashColor == null) { if (noFlashBgColor == null) {
noFlashColor = textField.getBackground(); // lazy init to default bg color noFlashBgColor = textField.getBackground(); // lazy init to default bg color
} }
return noFlashColor; return noFlashBgColor;
}
private Color getDefaultFgColor() {
if (noFlashFgColor == null) {
noFlashFgColor = textField.getForeground(); // lazy init to default fg color
}
return noFlashFgColor;
} }
/** /**
@@ -209,28 +221,36 @@ public class FilterTextField extends JPanel {
public void setEditable(boolean b) { public void setEditable(boolean b) {
textField.setEditable(b); textField.setEditable(b);
updateBackgroundColor(); updateColor();
} }
private void updateBackgroundColor() { private void updateColor() {
// this is purposely done here (before the isEditable() check below) in order to make // this is purposely done here (before the isEditable() check below) in order to make
// sure that the default color has been properly initialized // sure that the default color has been properly initialized
Color defaultBackgroundColor = getDefaultBackgroundColor(); Color defaultBackgroundColor = getDefaultBgColor();
Color defaultFgColor = getDefaultFgColor();
Color bgColor = UNEDITABLE_BACKGROUND_COLOR; Color bgColor = UNEDITABLE_BACKGROUND_COLOR;
Color fgColor = getDefaultFgColor();
if (isEditable() && isEnabled()) { if (isEditable() && isEnabled()) {
bgColor = hasText ? FILTERED_BACKGROUND_COLOR : defaultBackgroundColor; bgColor = hasText ? FILTERED_BACKGROUND_COLOR : defaultBackgroundColor;
fgColor = hasText ? FILTERED_FOREGROUND_COLOR : defaultFgColor;
} }
doSetBackground(bgColor); doSetBackground(bgColor);
doSetForeground(fgColor);
} }
private void contrastBackground() { private void contrastColors() {
Color contrastColor = FLASH_BACKGROUND_COLOR; Color contrastBg = noFlashBgColor;
if (textField.getBackground() == FLASH_BACKGROUND_COLOR) { Color contrastFg = FLASH_FOREGROUND_COLOR;
contrastColor = FILTERED_BACKGROUND_COLOR; if (textField.getBackground() == noFlashBgColor) {
contrastBg = FILTERED_BACKGROUND_COLOR;
contrastFg = FILTERED_FOREGROUND_COLOR;
} }
doSetBackground(contrastColor);
doSetBackground(contrastBg);
doSetForeground(contrastFg);
} }
public String getText() { public String getText() {
@@ -307,6 +327,10 @@ public class FilterTextField extends JPanel {
textField.setBackground(c); textField.setBackground(c);
} }
/*package*/ void doSetForeground(Color c) {
textField.setForeground(c);
}
/*package*/ JLabel getClearLabel() { /*package*/ JLabel getClearLabel() {
return clearLabel; return clearLabel;
} }
@@ -333,7 +357,7 @@ public class FilterTextField extends JPanel {
updateFocusFlashing(); updateFocusFlashing();
updateBackgroundColor(); updateColor();
if (fireEvent) { if (fireEvent) {
fireFilterChanged(text); fireFilterChanged(text);
@@ -434,7 +458,7 @@ public class FilterTextField extends JPanel {
@Override @Override
public void actionPerformed(ActionEvent event) { public void actionPerformed(ActionEvent event) {
if (flashCount < MAX_FLASH_COUNT) { if (flashCount < MAX_FLASH_COUNT) {
contrastBackground(); contrastColors();
flashCount++; flashCount++;
} }
else { else {
@@ -452,7 +476,7 @@ public class FilterTextField extends JPanel {
@Override @Override
public void stop() { public void stop() {
super.stop(); super.stop();
updateBackgroundColor(); // set to the proper non-flashing color updateColor(); // set to the proper non-flashing color
flashCount = 0; flashCount = 0;
} }
} }

Before

Width:  |  Height:  |  Size: 771 B

After

Width:  |  Height:  |  Size: 771 B

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 219 B

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 220 B

Before

Width:  |  Height:  |  Size: 975 B

After

Width:  |  Height:  |  Size: 975 B

@@ -15,10 +15,9 @@
*/ */
package docking.widgets.filter; package docking.widgets.filter;
import static docking.test.AbstractDockingTest.triggerEnter; import static docking.test.AbstractDockingTest.*;
import static docking.test.AbstractDockingTest.triggerKey; import static generic.test.AbstractGTest.*;
import static generic.test.AbstractGTest.sleep; import static generic.test.AbstractGenericTest.*;
import static generic.test.AbstractGenericTest.runSwing;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.awt.BorderLayout; import java.awt.BorderLayout;
@@ -32,6 +31,7 @@ import javax.swing.*;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import generic.test.AbstractGTest;
import generic.test.AbstractGenericTest; import generic.test.AbstractGenericTest;
import utility.function.Callback; import utility.function.Callback;
@@ -291,7 +291,7 @@ public class FilterTextFieldTest {
private void waitForTimer() { private void waitForTimer() {
Timer timer = filter.getFlashTimer(); Timer timer = filter.getFlashTimer();
AbstractGenericTest.waitForCondition(() -> { AbstractGTest.waitForCondition(() -> {
boolean running = runSwing(() -> timer.isRunning()); boolean running = runSwing(() -> timer.isRunning());
return !running; return !running;
}, "Timed-out waiting for flash timer to finish"); }, "Timed-out waiting for flash timer to finish");
@@ -170,7 +170,7 @@ public abstract class WebColors {
public static final Color MEDUM_AQUA_MARINE = registerColor("MediumAquaMarine", Color.decode("0x66CDAA")); public static final Color MEDUM_AQUA_MARINE = registerColor("MediumAquaMarine", Color.decode("0x66CDAA"));
public static final Color MEDIUM_TURQOISE = registerColor("MediumTurquoise", Color.decode("0x48D1CC")); public static final Color MEDIUM_TURQOISE = registerColor("MediumTurquoise", Color.decode("0x48D1CC"));
public static final Color DARK_OLIVE_GREEN = registerColor("DarkOliveGreen", Color.decode("0x556B2F")); public static final Color DARK_OLIVE_GREEN = registerColor("DarkOliveGreen", Color.decode("0x556B2F"));
public static final Color COMFLOWER_BLUE = registerColor("ComflowerBlue", Color.decode("0x6495ED")); public static final Color CORNFLOWER_BLUE = registerColor("CornflowerBlue", Color.decode("0x6495ED"));
//@formatter:on //@formatter:on
// cannot instantiate nor extend // cannot instantiate nor extend
@@ -17,18 +17,16 @@ package ghidra.app.plugin.gui;
import docking.action.builder.ActionBuilder; import docking.action.builder.ActionBuilder;
import docking.theme.gui.ThemeDialog; import docking.theme.gui.ThemeDialog;
import ghidra.app.CorePluginPackage;
import ghidra.app.plugin.PluginCategoryNames; import ghidra.app.plugin.PluginCategoryNames;
import ghidra.framework.main.ApplicationLevelOnlyPlugin; import ghidra.framework.main.ApplicationLevelOnlyPlugin;
import ghidra.framework.main.FrontEndTool; import ghidra.framework.main.UtilityPluginPackage;
import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.*;
import ghidra.framework.plugintool.util.PluginStatus; import ghidra.framework.plugintool.util.PluginStatus;
import ghidra.util.SystemUtilities;
//@formatter:off //@formatter:off
@PluginInfo( @PluginInfo(
status = PluginStatus.RELEASED, status = PluginStatus.RELEASED,
packageName = CorePluginPackage.NAME, packageName = UtilityPluginPackage.NAME,
category = PluginCategoryNames.SUPPORT, category = PluginCategoryNames.SUPPORT,
shortDescription = "Manages themes for the Ghdira GUI", shortDescription = "Manages themes for the Ghdira GUI",
description = "Adds actions and options to manage Themes within Ghidra. " + description = "Adds actions and options to manage Themes within Ghidra. " +
@@ -39,9 +37,6 @@ public class ThemeManagerPlugin extends Plugin implements ApplicationLevelOnlyPl
public ThemeManagerPlugin(PluginTool tool) { public ThemeManagerPlugin(PluginTool tool) {
super(tool); super(tool);
SystemUtilities.assertTrue(tool instanceof FrontEndTool,
"Plugin added to the wrong type of tool");
} }
@Override @Override