moduleDirs = Application.getModuleRootDirectories();
- for (ResourceFile dir : moduleDirs) {
- ResourceFile file = new ResourceFile(dir, relativePath);
- if (file.exists()) {
- try {
- return file.toURL();
- }
- catch (MalformedURLException e) {
- Msg.showError(this, null, "Unexpected Error",
- "Unexpected error parsing file to URL: " + file);
- return null;
- }
- }
- }
- return null;
- }
-
- public static void zoomOut() {
- fontSizeModifier -= 2;
- saveZoomFactor();
- }
-
- public static void zoomIn() {
- fontSizeModifier += 2;
- saveZoomFactor();
- }
-
- private static void saveZoomFactor() {
- Preferences.setProperty(HELP_WINDOW_ZOOM_FACTOR, Integer.toString(fontSizeModifier));
- Preferences.store();
- }
-
-//==================================================================================================
-// Inner Classes
-//==================================================================================================
-
- private class GHelpHTMLFactory extends HTMLFactory {
- @Override
- public View create(Element e) {
-
- AttributeSet attributes = e.getAttributes();
- Object elementName = attributes.getAttribute(AbstractDocument.ElementNameAttribute);
- if (elementName != null) {
- // not an HTML element
- return super.create(e);
- }
-
- Object html = attributes.getAttribute(StyleConstants.NameAttribute);
- if (html instanceof HTML.Tag) {
- HTML.Tag tag = (Tag) html;
- if (tag == HTML.Tag.IMG) {
- return new GHelpImageView(e);
- }
- }
-
- return super.create(e);
- }
-
- }
-
- /**
- * Overridden to allow us to find images that are defined as constants in places like
- * {@link Icons}
- */
- private class GHelpImageView extends ImageView {
-
- /*
- * Unusual Code Alert!
- * This class exists to enable our help system to find custom icons defined in source
- * code. The default behavior herein is to supply a URL to the base class to load. This
- * works fine.
- *
- * There is another use case where we wish to have the base class load an image of our
- * choosing. Why? Well, we modify, in memory, some icons we use. We do this for things
- * like overlays and rotations.
- *
- * In order to have our base class use the image that we want (and not the one
- * it loads via a URL), we have to play a small game. We have to allow the base class
- * to load the image it wants, which is done asynchronously. If we install our custom
- * image during that process, the loading will throw away the image and not render
- * anything.
- *
- * To get the base class to use our image, we override getImage(). However, we should
- * only return our image when the base class is finished loading. (See the base class'
- * paint() method for why we need to do this.)
- *
- * Note: if we start seeing unusual behavior, like images not rendering, or any size
- * issues, then we can revert this code.
- */
- private Image image;
- private float spanX;
- private float spanY;
-
- public GHelpImageView(Element elem) {
- super(elem);
- }
-
- @Override
- public Image getImage() {
- Image superImage = super.getImage();
- if (image == null) {
- // no custom image
- return superImage;
- }
-
- if (isLoading()) {
- return superImage;
- }
-
- return image;
- }
-
- private boolean isLoading() {
- return spanX < 1 || spanY < 1;
- }
-
- @Override
- public float getPreferredSpan(int axis) {
- float span = super.getPreferredSpan(axis);
- if (axis == View.X_AXIS) {
- spanX = span;
- }
- else {
- spanY = span;
- }
- return span;
- }
-
- @Override
- public URL getImageURL() {
-
- AttributeSet attributes = getElement().getAttributes();
- Object src = attributes.getAttribute(HTML.Attribute.SRC);
- if (src == null) {
- return null;
- }
-
- String srcString = src.toString();
- if (isJavaCode(srcString)) {
- return installImageFromJavaCode(srcString);
- }
-
- URL url = doGetImageURL(srcString);
- return url;
- }
-
- private URL installImageFromJavaCode(String srcString) {
-
- IconProvider iconProvider = getIconFromJavaCode(srcString);
- if (iconProvider == null || iconProvider.isInvalid()) {
- return null;
- }
-
- this.image = iconProvider.getImage();
-
- URL url = iconProvider.getOrCreateUrl();
- return url;
- }
-
- private URL doGetImageURL(String srcString) {
-
- HTMLDocument htmlDocument = (HTMLDocument) getDocument();
- URL context = htmlDocument.getBase();
- try {
- URL url = new URL(context, srcString);
- if (FileUtilities.exists(url.toURI())) {
- // it's a good one, let it through
- return url;
- }
- }
- catch (MalformedURLException | URISyntaxException e) {
- // check below
- }
-
- // Try the ResourceManager. This will work for images that start with GHelp
- // relative link syntax such as 'help/', 'help/topics/' and 'images/'
- URL resource = ResourceManager.getResource(srcString);
- return resource;
- }
-
- private boolean isJavaCode(String src) {
- // not sure of the best way to handle this--be exact for now
- return Icons.isIconsReference(src);
- }
-
- private IconProvider getIconFromJavaCode(String src) {
- return Icons.getIconForIconsReference(src);
- }
-
- }
-
-}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpService.java b/Ghidra/Framework/Docking/src/main/java/docking/help/HelpService.java
deleted file mode 100644
index 699d12a995..0000000000
--- a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpService.java
+++ /dev/null
@@ -1,121 +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.help;
-
-import java.awt.Component;
-import java.net.URL;
-
-import ghidra.util.HelpLocation;
-
-/**
- * HelpService
defines a service for displaying Help content by an ID or URL.
- */
-public interface HelpService {
-
- public static final String DUMMY_HELP_SET_NAME = "Dummy_HelpSet.hs";
-
- /**
- * Display the Help content identified by the help object.
- *
- * @param helpObject the object to which help was previously registered
- * @param infoOnly display {@link HelpLocation} information only, not the help UI
- * @param parent requesting component
- *
- * @see #registerHelp(Object, HelpLocation)
- */
- public void showHelp(Object helpObject, boolean infoOnly, Component parent);
-
- /**
- * Display the help page for the given URL. This is a specialty method for displaying
- * help when a specific file is desired, like an introduction page. Showing help for
- * objects within the system is accomplished by calling
- * {@link #showHelp(Object, boolean, Component)}.
- *
- * @param url the URL to display
- * @see #showHelp(Object, boolean, Component)
- */
- public void showHelp(URL url);
-
- /**
- * Display the help page for the given help location.
- *
- * @param location the location to display.
- * @see #showHelp(Object, boolean, Component)
- */
- public void showHelp(HelpLocation location);
-
- /**
- * Signals to the help system to ignore the given object when searching for and validating
- * help. Once this method has been called, no help can be registered for the given object.
- *
- * @param helpObject the object to exclude from the help system.
- */
- public void excludeFromHelp(Object helpObject);
-
- /**
- * Returns true if the given object is meant to be ignored by the help system
- *
- * @param helpObject the object to check
- * @return true if ignored
- * @see #excludeFromHelp(Object)
- */
- public boolean isExcludedFromHelp(Object helpObject);
-
- /**
- * Register help for a specific object.
- *
- * Do not call this method will a null
help location. Instead, to signal that
- * an item has no help, call {@link #excludeFromHelp(Object)}.
- *
- * @param helpObject the object to associate the specified help location with
- * @param helpLocation help content location
- */
- public void registerHelp(Object helpObject, HelpLocation helpLocation);
-
- /**
- * Removes this object from the help system. This method is useful, for example,
- * when a single Java {@link Component} will have different help locations
- * assigned over its lifecycle.
- *
- * @param helpObject the object for which to clear help
- */
- public void clearHelp(Object helpObject);
-
- /**
- * Returns the registered (via {@link #registerHelp(Object, HelpLocation)} help
- * location for the given object; null if there is no registered
- * help.
- *
- * @param object The object for which to find a registered HelpLocation.
- * @return the registered HelpLocation
- * @see #registerHelp(Object, HelpLocation)
- */
- public HelpLocation getHelpLocation(Object object);
-
- /**
- * Returns true if the help system has been initialized properly; false if help does not
- * exist or is not working.
- *
- * @return true if the help system has found the applications help content and has finished
- * initializing
- */
- public boolean helpExists();
-
- /**
- * Called when a major system even happens, such as changing the system theme.
- */
- public void reload();
-}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTable.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTable.java
new file mode 100644
index 0000000000..fa27f8e86a
--- /dev/null
+++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTable.java
@@ -0,0 +1,121 @@
+/* ###
+ * 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.theme.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.event.*;
+import java.beans.PropertyChangeEvent;
+
+import javax.swing.JPanel;
+import javax.swing.ListSelectionModel;
+import javax.swing.table.TableColumn;
+
+import docking.ActionContext;
+import docking.action.ActionContextProvider;
+import docking.widgets.table.GFilterTable;
+import docking.widgets.table.GTable;
+import generic.theme.ColorValue;
+import generic.theme.Gui;
+import ghidra.util.Swing;
+
+/**
+ * Color Table for Theme Dialog
+ */
+public class ThemeColorTable extends JPanel implements ActionContextProvider {
+
+ private ThemeColorTableModel colorTableModel;
+ private ColorValueEditor colorEditor = new ColorValueEditor(this::colorValueChanged);
+ private GTable table;
+ private GFilterTable filterTable;
+
+ public ThemeColorTable() {
+ super(new BorderLayout());
+ colorTableModel = new ThemeColorTableModel();
+
+ filterTable = new GFilterTable<>(colorTableModel);
+ table = filterTable.getTable();
+ table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+ table.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+ ColorValue colorValue = filterTable.getSelectedRowObject();
+ if (colorValue != null) {
+ colorEditor.editValue(colorValue);
+ }
+ e.consume();
+ }
+ }
+ });
+
+ table.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ ColorValue value = filterTable.getItemAt(e.getPoint());
+
+ int col = filterTable.getColumn(e.getPoint());
+ TableColumn column = table.getColumnModel().getColumn(col);
+ Object identifier = column.getIdentifier();
+ if ("Current Color".equals(identifier) || "Id".equals(identifier)) {
+ colorEditor.editValue(value);
+ }
+ }
+ }
+ });
+
+ add(filterTable, BorderLayout.CENTER);
+
+ }
+
+ void colorValueChanged(PropertyChangeEvent event) {
+ // run later - don't rock the boat in the middle of a listener callback
+ Swing.runLater(() -> {
+ ColorValue newValue = (ColorValue) event.getNewValue();
+ Gui.setColor(newValue);
+ });
+ }
+
+ /**
+ * Returns the current values displayed in the table
+ */
+ public void reloadCurrent() {
+ colorTableModel.reloadCurrent();
+ }
+
+ /**
+ * Reloads all the values displayed in the table
+ */
+ public void reloadAll() {
+ colorTableModel.reloadAll();
+ }
+
+ @Override
+ public ActionContext getActionContext(MouseEvent e) {
+ if (e.getSource() == table) {
+ ColorValue currentValue = filterTable.getSelectedRowObject();
+ if (currentValue == null) {
+ return null;
+ }
+ String id = currentValue.getId();
+ ColorValue themeValue = colorTableModel.getThemeValue(id);
+ return new ThemeTableContext(currentValue, themeValue);
+ }
+ return null;
+ }
+}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTableModel.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTableModel.java
index 0b95e002e8..e65591431f 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTableModel.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTableModel.java
@@ -66,6 +66,13 @@ public class ThemeColorTableModel extends GDynamicColumnTableModel";
}
Color color = resolvedColor.color();
- String text = WebColors.toString(color, false);
String name = WebColors.toWebColorName(color);
if (resolvedColor.refId() != null) {
- return "[" + resolvedColor.refId() + "] " + text;
+ return "[" + resolvedColor.refId() + "] ";
}
+ String text = WebColors.toString(color, false);
if (name != null) {
text += " (" + name + ")";
}
@@ -250,4 +257,5 @@ public class ThemeColorTableModel extends GDynamicColumnTableModel combo;
private ItemListener comboListener = this::themeComboChanged;
private ThemeListener listener = new DialogThemeListener();
+ private JTabbedPane tabbedPane;
+
+ private ThemeColorTable colorTable;
+ private ThemeFontTable fontTable;
+ private ThemeIconTable iconTable;
public ThemeDialog() {
super("Theme Dialog", false);
@@ -69,14 +62,26 @@ public class ThemeDialog extends DialogComponentProvider {
updateButtons();
createActions();
Gui.addThemeListener(listener);
+ setHelpLocation(new HelpLocation("Theming", "Edit_Theme"));
}
private void createActions() {
DockingAction reloadDefaultsAction = new ActionBuilder("Reload Ghidra Defaults", getTitle())
.toolBarIcon(new GIcon("icon.refresh"))
+ .helpLocation(new HelpLocation("Theming", "Reload_Ghidra_Defaults"))
.onAction(e -> reloadDefaultsCallback())
.build();
addAction(reloadDefaultsAction);
+
+ DockingAction resetValueAction = new ActionBuilder("Restore Value", getTitle())
+ .popupMenuPath("Restore Value")
+ .withContext(ThemeTableContext.class)
+ .enabledWhen(c -> c.isChanged())
+ .popupWhen(c -> true)
+ .helpLocation(new HelpLocation("Theming", "Restore_Value"))
+ .onAction(c -> c.getThemeValue().makeCurrentValue())
+ .build();
+ addAction(resetValueAction);
}
@Override
@@ -129,9 +134,9 @@ public class ThemeDialog extends DialogComponentProvider {
}
private void reset() {
- colorTableModel.reloadAll();
- fontTableModel.reloadAll();
- iconTableModel.reloadAll();
+ colorTable.reloadAll();
+ fontTable.reloadAll();
+ iconTable.reloadAll();
updateButtons();
updateCombo();
}
@@ -159,45 +164,9 @@ public class ThemeDialog extends DialogComponentProvider {
else {
setStatusText("");
}
- colorTableModel.reloadAll();
- fontTableModel.reloadAll();
- iconTableModel.reloadAll();
- });
- }
-
- protected void editColor(ColorValue value) {
- colorEditor.editValue(value);
- }
-
- protected void editFont(FontValue value) {
- fontEditor.editValue(value);
- }
-
- protected void editIcon(IconValue value) {
- iconEditor.editValue(value);
- }
-
- void colorValueChanged(PropertyChangeEvent event) {
- // run later - don't rock the boat in the middle of a listener callback
- Swing.runLater(() -> {
- ColorValue newValue = (ColorValue) event.getNewValue();
- Gui.setColor(newValue);
- });
- }
-
- void fontValueChanged(PropertyChangeEvent event) {
- // run later - don't rock the boat in the middle of a listener callback
- Swing.runLater(() -> {
- FontValue newValue = (FontValue) event.getNewValue();
- Gui.setFont(newValue);
- });
- }
-
- void iconValueChanged(PropertyChangeEvent event) {
- // run later - don't rock the boat in the middle of a listener callback
- Swing.runLater(() -> {
- IconValue newValue = (IconValue) event.getNewValue();
- Gui.setIcon(newValue);
+ colorTable.reloadAll();
+ fontTable.reloadAll();
+ iconTable.reloadAll();
});
}
@@ -253,130 +222,16 @@ public class ThemeDialog extends DialogComponentProvider {
}
private Component buildTabedTables() {
- JTabbedPane tabbedPane = new JTabbedPane();
- tabbedPane.add("Colors", buildColorTable());
- tabbedPane.add("Fonts", buildFontTable());
- tabbedPane.add("Icons", buildIconTable());
+ tabbedPane = new JTabbedPane();
+ colorTable = new ThemeColorTable();
+ fontTable = new ThemeFontTable();
+ iconTable = new ThemeIconTable();
+ tabbedPane.add("Colors", colorTable);
+ tabbedPane.add("Fonts", fontTable);
+ tabbedPane.add("Icons", iconTable);
return tabbedPane;
}
- private JComponent buildFontTable() {
- fontTableModel = new ThemeFontTableModel();
- GFilterTable filterTable = new GFilterTable<>(fontTableModel);
- GTable table = filterTable.getTable();
- table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-
- table.addKeyListener(new KeyAdapter() {
- @Override
- public void keyPressed(KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ENTER) {
- FontValue fontValue = filterTable.getSelectedRowObject();
- if (fontValue != null) {
- editFont(fontValue);
- }
- e.consume();
- }
- }
- });
-
- table.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() == 2) {
- FontValue value = filterTable.getItemAt(e.getPoint());
-
- int col = filterTable.getColumn(e.getPoint());
- TableColumn column = table.getColumnModel().getColumn(col);
- Object identifier = column.getIdentifier();
- if ("Current Font".equals(identifier) || "Id".equals(identifier)) {
- editFont(value);
- }
- }
- }
- });
-
- return filterTable;
-
- }
-
- private JComponent buildIconTable() {
- iconTableModel = new ThemeIconTableModel();
- GFilterTable filterTable = new GFilterTable<>(iconTableModel);
- GTable table = filterTable.getTable();
- table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-
- table.addKeyListener(new KeyAdapter() {
- @Override
- public void keyPressed(KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ENTER) {
- IconValue iconValue = filterTable.getSelectedRowObject();
- if (iconValue != null) {
- editIcon(iconValue);
- }
- e.consume();
- }
- }
- });
-
- table.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() == 2) {
- IconValue value = filterTable.getItemAt(e.getPoint());
-
- int col = filterTable.getColumn(e.getPoint());
- TableColumn column = table.getColumnModel().getColumn(col);
- Object identifier = column.getIdentifier();
- if ("Current Icon".equals(identifier) || "Id".equals(identifier)) {
- editIcon(value);
- }
- }
- }
- });
-
- return filterTable;
-
- }
-
- private JComponent buildColorTable() {
- colorTableModel = new ThemeColorTableModel();
-
- GFilterTable filterTable = new GFilterTable<>(colorTableModel);
- GTable table = filterTable.getTable();
- table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-
- table.addKeyListener(new KeyAdapter() {
- @Override
- public void keyPressed(KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ENTER) {
- ColorValue colorValue = filterTable.getSelectedRowObject();
- if (colorValue != null) {
- editColor(colorValue);
- }
- e.consume();
- }
- }
- });
-
- table.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() == 2) {
- ColorValue value = filterTable.getItemAt(e.getPoint());
-
- int col = filterTable.getColumn(e.getPoint());
- TableColumn column = table.getColumnModel().getColumn(col);
- Object identifier = column.getIdentifier();
- if ("Current Color".equals(identifier) || "Id".equals(identifier)) {
- editColor(value);
- }
- }
- }
- });
-
- return filterTable;
- }
-
private JButton createRestoreButton() {
restoreButton = new JButton("Restore");
restoreButton.setMnemonic('R');
@@ -411,6 +266,13 @@ public class ThemeDialog extends DialogComponentProvider {
super.close();
}
+ @Override
+ public ActionContext getActionContext(MouseEvent event) {
+ ActionContextProvider contextProvider =
+ (ActionContextProvider) tabbedPane.getSelectedComponent();
+ return contextProvider.getActionContext(event);
+ }
+
class DialogThemeListener implements ThemeListener {
@Override
public void themeChanged(ThemeEvent event) {
@@ -419,13 +281,13 @@ public class ThemeDialog extends DialogComponentProvider {
return;
}
if (event.hasAnyColorChanged()) {
- colorTableModel.reloadCurrent();
+ colorTable.reloadCurrent();
}
if (event.hasAnyFontChanged()) {
- fontTableModel.reloadCurrent();
+ fontTable.reloadCurrent();
}
if (event.hasAnyIconChanged()) {
- iconTableModel.reloadCurrent();
+ iconTable.reloadCurrent();
}
updateButtons();
}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTable.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTable.java
new file mode 100644
index 0000000000..6f9293e8f9
--- /dev/null
+++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTable.java
@@ -0,0 +1,120 @@
+/* ###
+ * 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.theme.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.event.*;
+import java.beans.PropertyChangeEvent;
+
+import javax.swing.JPanel;
+import javax.swing.ListSelectionModel;
+import javax.swing.table.TableColumn;
+
+import docking.ActionContext;
+import docking.action.ActionContextProvider;
+import docking.widgets.table.GFilterTable;
+import docking.widgets.table.GTable;
+import generic.theme.FontValue;
+import generic.theme.Gui;
+import ghidra.util.Swing;
+
+/**
+ * Font Table for Theme Dialog
+ */
+public class ThemeFontTable extends JPanel implements ActionContextProvider {
+
+ private ThemeFontTableModel fontTableModel;
+ private FontValueEditor fontEditor = new FontValueEditor(this::fontValueChanged);
+ private GTable table;
+ private GFilterTable filterTable;
+
+ public ThemeFontTable() {
+ super(new BorderLayout());
+
+ fontTableModel = new ThemeFontTableModel();
+ filterTable = new GFilterTable<>(fontTableModel);
+ table = filterTable.getTable();
+ table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+ table.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+ FontValue fontValue = filterTable.getSelectedRowObject();
+ if (fontValue != null) {
+ fontEditor.editValue(fontValue);
+ }
+ e.consume();
+ }
+ }
+ });
+
+ table.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ FontValue value = filterTable.getItemAt(e.getPoint());
+
+ int col = filterTable.getColumn(e.getPoint());
+ TableColumn column = table.getColumnModel().getColumn(col);
+ Object identifier = column.getIdentifier();
+ if ("Current Font".equals(identifier) || "Id".equals(identifier)) {
+ fontEditor.editValue(value);
+ }
+ }
+ }
+ });
+ add(filterTable, BorderLayout.CENTER);
+
+ }
+
+ void fontValueChanged(PropertyChangeEvent event) {
+ // run later - don't rock the boat in the middle of a listener callback
+ Swing.runLater(() -> {
+ FontValue newValue = (FontValue) event.getNewValue();
+ Gui.setFont(newValue);
+ });
+ }
+
+ /**
+ * Reloads all the values displayed in the table
+ */
+ public void reloadAll() {
+ fontTableModel.reloadAll();
+ }
+
+ /**
+ * Returns the current values displayed in the table
+ */
+ public void reloadCurrent() {
+ fontTableModel.reloadCurrent();
+ }
+
+ @Override
+ public ActionContext getActionContext(MouseEvent e) {
+ if (e.getSource() == table) {
+ FontValue currentValue = filterTable.getSelectedRowObject();
+ if (currentValue == null) {
+ return null;
+ }
+ String id = currentValue.getId();
+ FontValue themeValue = fontTableModel.getThemeValue(id);
+ return new ThemeTableContext(currentValue, themeValue);
+ }
+ return null;
+ }
+}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTableModel.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTableModel.java
index c01b8ebff7..05e229dc90 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTableModel.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTableModel.java
@@ -100,7 +100,7 @@ public class ThemeFontTableModel extends GDynamicColumnTableModel";
}
if (fontValue.getReferenceId() != null) {
- return fontValue.getReferenceId();
+ return "[" + fontValue.getReferenceId() + "]";
}
Font font = fontValue.getRawValue();
@@ -178,8 +178,6 @@ public class ThemeFontTableModel extends GDynamicColumnTableModel {
- private Font regularFont = new Font("Monospaced", Font.BOLD, 12);
- private Font indirectFont = new Font("Monospaced", Font.ITALIC, 12);
@Override
public Component getTableCellRendererComponent(GTableCellRenderingData data) {
@@ -187,12 +185,6 @@ public class ThemeFontTableModel extends GDynamicColumnTableModel filterTable;
+
+ public ThemeIconTable() {
+ super(new BorderLayout());
+ iconTableModel = new ThemeIconTableModel();
+ filterTable = new GFilterTable<>(iconTableModel);
+ table = filterTable.getTable();
+ table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+ table.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+ IconValue iconValue = filterTable.getSelectedRowObject();
+ if (iconValue != null) {
+ iconEditor.editValue(iconValue);
+ }
+ e.consume();
+ }
+ }
+ });
+
+ table.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ IconValue value = filterTable.getItemAt(e.getPoint());
+
+ int col = filterTable.getColumn(e.getPoint());
+ TableColumn column = table.getColumnModel().getColumn(col);
+ Object identifier = column.getIdentifier();
+ if ("Current Icon".equals(identifier) || "Id".equals(identifier)) {
+ iconEditor.editValue(value);
+ }
+ }
+ }
+ });
+ add(filterTable, BorderLayout.CENTER);
+ }
+
+ void iconValueChanged(PropertyChangeEvent event) {
+ // run later - don't rock the boat in the middle of a listener callback
+ Swing.runLater(() -> {
+ IconValue newValue = (IconValue) event.getNewValue();
+ Gui.setIcon(newValue);
+ });
+ }
+
+ /**
+ * Reloads all the values displayed in the table
+ */
+ public void reloadAll() {
+ iconTableModel.reloadAll();
+ }
+
+ /**
+ * Returns the current values displayed in the table
+ */
+ public void reloadCurrent() {
+ iconTableModel.reloadCurrent();
+ }
+
+ @Override
+ public ActionContext getActionContext(MouseEvent e) {
+ if (e.getSource() == table) {
+ IconValue currentValue = filterTable.getSelectedRowObject();
+ if (currentValue == null) {
+ return null;
+ }
+ String id = currentValue.getId();
+ IconValue themeValue = iconTableModel.getThemeValue(id);
+ return new ThemeTableContext(currentValue, themeValue);
+ }
+ return null;
+ }
+}
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeIconTableModel.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeIconTableModel.java
index 5deb69a4b6..e4888b8368 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeIconTableModel.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeIconTableModel.java
@@ -229,8 +229,16 @@ public class ThemeIconTableModel extends GDynamicColumnTableModel the resource type (Color, Font, or Icon)
+ */
+public class ThemeTableContext extends ActionContext {
+
+ private ThemeValue currentValue;
+ private ThemeValue themeValue;
+
+ public ThemeTableContext(ThemeValue currentValue, ThemeValue themeValue) {
+ this.currentValue = currentValue;
+ this.themeValue = themeValue;
+ }
+
+ /**
+ * Returns the currentValue of the selected table row
+ * @return the currentValue of the selected table row
+ */
+ public ThemeValue getCurrentValue() {
+ return currentValue;
+ }
+
+ /**
+ * Returns the original theme value of the selected table row
+ * @return the original theme value of the selected table row
+ */
+ public ThemeValue getThemeValue() {
+ return themeValue;
+ }
+
+ /**
+ * Returns true if the current value is not the same as the original theme value for the
+ * selected table row
+ * @return true if the current value is not the same as the original theme value for the
+ * selected table row
+ */
+ public boolean isChanged() {
+ return !currentValue.equals(themeValue);
+ }
+}
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 0f11262225..6942ae9c87 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
@@ -365,7 +365,7 @@ public class ConditionTestPanel extends JPanel {
public TestPanel(ConditionTester conditionTest) {
super(new PairLayout());
backgroundColor = getBackground();
- selectedColor = Color.LIGHT_GRAY;
+ selectedColor = Palette.LIGHT_GRAY;
this.test = conditionTest;
checkbox = new GCheckBox();
checkbox.setSelected(true);
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/MultiLineInputDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/MultiLineInputDialog.java
index da402f4c5d..b7bfb1848e 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/MultiLineInputDialog.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/MultiLineInputDialog.java
@@ -25,6 +25,7 @@ import docking.DialogComponentProvider;
import docking.DockingUtils;
import docking.widgets.label.GDLabel;
import docking.widgets.label.GLabel;
+import generic.theme.GThemeDefaults.Colors.Messages;
import ghidra.framework.OperatingSystem;
import ghidra.framework.Platform;
@@ -87,7 +88,7 @@ public class MultiLineInputDialog extends DialogComponentProvider {
Font smallerFont = font.deriveFont(12F);
Font smallItalicFont = smallerFont.deriveFont(Font.ITALIC);
hintLabel.setFont(smallItalicFont);
- hintLabel.setForeground(Color.LIGHT_GRAY);
+ hintLabel.setForeground(Messages.HINT);
dataPanel.add(messageLabel, BorderLayout.NORTH);
dataPanel.add(new JScrollPane(inputTextArea), BorderLayout.CENTER);
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/HexOrDecimalInput.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/HexOrDecimalInput.java
index 9614fa62ad..224fbf091d 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/HexOrDecimalInput.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/HexOrDecimalInput.java
@@ -23,6 +23,7 @@ import javax.swing.JTextField;
import javax.swing.text.*;
import docking.util.GraphicsUtils;
+import generic.theme.GThemeDefaults.Colors.Messages;
public class HexOrDecimalInput extends JTextField {
private boolean isHexMode = false;
@@ -130,7 +131,7 @@ public class HexOrDecimalInput extends JTextField {
Font font = new Font("Monospaced", Font.PLAIN, 10);
Font savedFont = g.getFont();
g.setFont(font);
- g.setColor(Color.LIGHT_GRAY);
+ g.setColor(Messages.HINT);
FontMetrics fontMetrics = getFontMetrics(font);
String mode = isHexMode ? "Hex" : "Dec";
int stringWidth = fontMetrics.stringWidth(mode);
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java
index 80cd18942a..6a22570d44 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java
@@ -15,35 +15,19 @@
*/
package docking.widgets.textfield;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Insets;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
+import java.awt.*;
+import java.awt.event.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
-import javax.swing.JComponent;
-import javax.swing.JTextField;
-import javax.swing.ToolTipManager;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.AbstractDocument;
-import javax.swing.text.AttributeSet;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
-import javax.swing.text.DocumentFilter;
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
import docking.DockingUtils;
import docking.util.GraphicsUtils;
+import generic.theme.GThemeDefaults.Colors.Messages;
import ghidra.util.SystemUtilities;
/**
@@ -699,7 +683,7 @@ public class IntegerTextField {
Font savedFont = g.getFont();
g.setFont(hintFont);
- g.setColor(Color.LIGHT_GRAY);
+ g.setColor(Messages.HINT);
Dimension size = getSize();
Insets insets = getInsets();
diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/LocalDateTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/LocalDateTextField.java
index 9b0d8a96f6..bdf9e96a16 100644
--- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/LocalDateTextField.java
+++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/LocalDateTextField.java
@@ -31,6 +31,7 @@ import javax.swing.JTextField;
import javax.swing.event.*;
import docking.util.GraphicsUtils;
+import generic.theme.GThemeDefaults.Colors.Messages;
import ghidra.util.SystemUtilities;
/**
@@ -234,7 +235,7 @@ public class LocalDateTextField {
Font font = new Font("Monospaced", Font.PLAIN, 10);
Font savedFont = g.getFont();
g.setFont(font);
- g.setColor(Color.LIGHT_GRAY);
+ g.setColor(Messages.HINT);
FontMetrics fontMetrics = getFontMetrics(font);
String label = isMonthMode ? MONTH_LABEL : DAY_LABEL;
int stringWidth = fontMetrics.stringWidth(label);
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 b796e24a7a..79948be124 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
@@ -32,12 +32,13 @@ import docking.widgets.OptionDialog;
import docking.widgets.SelectFromListDialog;
import docking.widgets.dialogs.InputDialog;
import generic.theme.*;
+import generic.theme.GThemeDefaults.Colors.Palette;
import generic.theme.builtin.MetalTheme;
import generic.theme.builtin.NimbusTheme;
public class ThemeUtilsTest extends AbstractDockingTest {
- private Color testColor = Color.RED;
+ private Color testColor = Palette.RED;
@Before
public void setup() {
diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/ColorValue.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/ColorValue.java
index 764b740305..7b869230d2 100644
--- a/Ghidra/Framework/Generic/src/main/java/generic/theme/ColorValue.java
+++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/ColorValue.java
@@ -149,4 +149,9 @@ public class ColorValue extends ThemeValue {
return outputString;
}
+ @Override
+ public void makeCurrentValue() {
+ Gui.setColor(this);
+ }
+
}
diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/FontValue.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/FontValue.java
index 51ce630368..89f514a580 100644
--- a/Ghidra/Framework/Generic/src/main/java/generic/theme/FontValue.java
+++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/FontValue.java
@@ -223,4 +223,9 @@ public class FontValue extends ThemeValue {
return "PLAIN";
}
+ @Override
+ public void makeCurrentValue() {
+ Gui.setFont(this);
+ }
+
}
diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/IconValue.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/IconValue.java
index ffdf7220a6..92fe807611 100644
--- a/Ghidra/Framework/Generic/src/main/java/generic/theme/IconValue.java
+++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/IconValue.java
@@ -146,4 +146,9 @@ public class IconValue extends ThemeValue {
return iconToString(value);
}
+ @Override
+ public void makeCurrentValue() {
+ Gui.setIcon(this);
+ }
+
}
diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/ThemeValue.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/ThemeValue.java
index c1fa9c9ed8..85dd49b9b3 100644
--- a/Ghidra/Framework/Generic/src/main/java/generic/theme/ThemeValue.java
+++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/ThemeValue.java
@@ -202,4 +202,9 @@ public abstract class ThemeValue implements Comparable> {
return name + " (" + id + ", " + referenceId + ")";
}
+ /**
+ * Makes this value the current value for the application
+ */
+ public abstract void makeCurrentValue();
+
}
diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/ComponentFontRegistry.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/ComponentFontRegistry.java
index 4a58430d43..9ddc2dca6d 100644
--- a/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/ComponentFontRegistry.java
+++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/ComponentFontRegistry.java
@@ -17,6 +17,7 @@ package generic.theme.laf;
import java.awt.Component;
import java.awt.Font;
+import java.util.Objects;
import generic.theme.Gui;
import ghidra.util.datastruct.WeakDataStructureFactory;
@@ -54,7 +55,10 @@ public class ComponentFontRegistry {
public void updateComponentFonts() {
Font font = Gui.getFont(fontId);
for (Component component : components) {
- component.setFont(font);
+ Font existingFont = component.getFont();
+ if (!Objects.equals(existingFont, font)) {
+ component.setFont(font);
+ }
}
}
}
diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/LookAndFeelManager.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/LookAndFeelManager.java
index 12ece6a4e4..6b2afa1b26 100644
--- a/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/LookAndFeelManager.java
+++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/LookAndFeelManager.java
@@ -105,7 +105,7 @@ public abstract class LookAndFeelManager {
updateComponentUis();
}
- private void updateAllRegisteredComponentFonts() {
+ protected void updateAllRegisteredComponentFonts() {
for (ComponentFontRegistry register : fontRegistryMap.values()) {
register.updateComponentFonts();
}
@@ -178,21 +178,12 @@ public abstract class LookAndFeelManager {
Font font = Gui.getFont(javaFontId);
defaults.put(javaFontId, new FontUIResource(font));
}
- updateComponentFonts(changedJavaFontIds);
updateComponentUis();
}
+ updateAllRegisteredComponentFonts();
repaintAll();
}
- protected void updateComponentFonts(Set changedFontIds) {
- for (String javaFontId : changedFontIds) {
- ComponentFontRegistry register = fontRegistryMap.get(javaFontId);
- if (register != null) {
- register.updateComponentFonts();
- }
- }
- }
-
protected void updateComponentUis() {
for (Window window : Window.getWindows()) {
SwingUtilities.updateComponentTreeUI(window);
diff --git a/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java b/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java
index 7f17b9bdeb..da432acb63 100644
--- a/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java
+++ b/Ghidra/Framework/Generic/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java
@@ -48,8 +48,8 @@ public class NimbusLookAndFeelManager extends LookAndFeelManager {
public void fontsChanged(Set affectedJavaIds) {
if (!affectedJavaIds.isEmpty()) {
reinstallNimubus();
- updateComponentFonts(affectedJavaIds);
}
+ updateAllRegisteredComponentFonts();
repaintAll();
}
diff --git a/Ghidra/Framework/Generic/src/main/java/resources/IconProvider.java b/Ghidra/Framework/Generic/src/main/java/resources/IconProvider.java
index e47046c6b9..1ea123f154 100644
--- a/Ghidra/Framework/Generic/src/main/java/resources/IconProvider.java
+++ b/Ghidra/Framework/Generic/src/main/java/resources/IconProvider.java
@@ -21,10 +21,10 @@ import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
+import javax.swing.Icon;
import javax.swing.ImageIcon;
import generic.Images;
-import generic.theme.GIcon;
import generic.util.image.ImageUtils;
import ghidra.util.Msg;
@@ -37,18 +37,19 @@ import ghidra.util.Msg;
*/
public class IconProvider {
- private GIcon icon;
+ private Icon icon;
private URL url;
private URL tempUrl;
private boolean tempFileFailed;
- public IconProvider(GIcon icon, URL url) {
+ public IconProvider(Icon icon, URL url) {
this.icon = icon;
this.url = url;
}
public Image getImage() {
- return icon.getImageIcon().getImage();
+ ImageIcon imageIcon = ResourceManager.getImageIcon(icon);
+ return imageIcon.getImage();
}
public boolean isInvalid() {
@@ -96,7 +97,7 @@ public class IconProvider {
try {
File imageFile = File.createTempFile("temp.help.icon", null);
imageFile.deleteOnExit(); // don't let this linger
- ImageIcon imageIcon = icon.getImageIcon();
+ ImageIcon imageIcon = ResourceManager.getImageIcon(icon);
ImageUtils.writeFile(imageIcon.getImage(), imageFile);
return imageFile.toURI().toURL();
}
diff --git a/Ghidra/Framework/Docking/src/main/java/resources/Icons.java b/Ghidra/Framework/Generic/src/main/java/resources/Icons.java
similarity index 95%
rename from Ghidra/Framework/Docking/src/main/java/resources/Icons.java
rename to Ghidra/Framework/Generic/src/main/java/resources/Icons.java
index 478311eb67..87aac38ca0 100644
--- a/Ghidra/Framework/Docking/src/main/java/resources/Icons.java
+++ b/Ghidra/Framework/Generic/src/main/java/resources/Icons.java
@@ -113,7 +113,7 @@ public class Icons {
return null;
}
- GIcon icon = getIconByFieldName(fieldName);
+ Icon icon = getIconByFieldName(fieldName);
if (icon == null) {
return null;
}
@@ -165,12 +165,12 @@ public class Icons {
return fieldName;
}
- private static GIcon getIconByFieldName(String fieldName) {
+ private static Icon getIconByFieldName(String fieldName) {
try {
Field field = Icons.class.getField(fieldName);
Object object = field.get(Icons.class);
- GIcon icon = (GIcon) object;
+ Icon icon = (Icon) object;
return icon;
}
catch (Exception e) {
@@ -180,16 +180,14 @@ public class Icons {
}
}
- private static URL getUrlFromIcon(GIcon icon) {
- if (icon == null) {
- return null;
+ private static URL getUrlFromIcon(Icon icon) {
+ if (icon instanceof GIcon gIcon) {
+ URL url = gIcon.getUrl();
+ if (url != null) {
+ return url;
+ }
+ Msg.debug(Icons.class, "Unable to get URL for icon");
}
-
- URL url = icon.getUrl();
- if (url != null) {
- return url;
- }
- Msg.debug(Icons.class, "Unable to get URL for icon");
return null;
}
diff --git a/Ghidra/Framework/Generic/src/test/java/generic/theme/GuiTest.java b/Ghidra/Framework/Generic/src/test/java/generic/theme/GuiTest.java
index 535860d49b..5a7ec20ae4 100644
--- a/Ghidra/Framework/Generic/src/test/java/generic/theme/GuiTest.java
+++ b/Ghidra/Framework/Generic/src/test/java/generic/theme/GuiTest.java
@@ -24,6 +24,7 @@ import java.net.URL;
import java.util.*;
import javax.swing.Icon;
+import javax.swing.JLabel;
import javax.swing.plaf.UIResource;
import org.junit.Before;
@@ -343,6 +344,17 @@ public class GuiTest {
assertEquals(expected, Gui.getApplicationDarkDefaults());
}
+ @Test
+ public void testRegisterFont() {
+ Gui.setFont(new FontValue("font.test", SMALL_FONT));
+ JLabel label = new JLabel("Test");
+ assertNotEquals(SMALL_FONT, label.getFont());
+ Gui.registerFont(label, "font.test");
+ assertEquals(SMALL_FONT, label.getFont());
+ Gui.setFont(new FontValue("font.test", FONT));
+ assertEquals(FONT, label.getFont());
+ }
+
private void assertColor(Color color, GColor gColor) {
if (color.getRGB() != gColor.getRGB()) {
fail("RGB values don't match! Expected " + color + " but got " + gColor);
diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java
index 199541898d..169c2e6656 100644
--- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java
+++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java
@@ -27,7 +27,6 @@ import com.google.common.base.Function;
import docking.DockingUtils;
import docking.DockingWindowManager;
import docking.actions.KeyBindingUtils;
-import docking.help.HelpService;
import docking.widgets.EmptyBorderButton;
import docking.widgets.PopupWindow;
import docking.widgets.label.GIconLabel;
diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java
index 557e7d2b53..407a2933ec 100644
--- a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java
+++ b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java
@@ -88,7 +88,7 @@ public class AlgorithmTestSteppingVertex extends AbstractTestVertex
private void buildShapes() {
- defaultShape = buildCircleShape(Color.LIGHT_GRAY, "default");
+ defaultShape = buildCircleShape(Palette.LIGHT_GRAY, "default");
defaultWithPathShape =
buildCircleShape(new GColor("color.palette.yellowgreen"), "default; was in path");
scheduledShape = buildCircleShape(new GColor("color.palette.khaki"), "scheduled");
diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java b/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java
index 17f33d0678..193033bc38 100644
--- a/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java
+++ b/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java
@@ -28,7 +28,6 @@ import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions;
import ghidra.util.HelpLocation;
-import ghidra.util.WebColors;
public class GraphDisplayOptionsTest {
@@ -154,9 +153,9 @@ public class GraphDisplayOptionsTest {
vertex.setVertexType("V1");
assertEquals(Palette.RED, options.getVertexColor(vertex));
- vertex.setAttribute("Color", WebColors.toString(Palette.BLUE));
+ vertex.setAttribute("Color", Palette.BLUE.toString());
- assertEquals(Palette.BLUE, options.getVertexColor(vertex));
+ assertEquals(Palette.BLUE.getRGB(), options.getVertexColor(vertex).getRGB());
}
@Test
@@ -184,9 +183,9 @@ public class GraphDisplayOptionsTest {
edge.setEdgeType("E1");
assertEquals(Palette.RED, options.getEdgeColor(edge));
- edge.setAttribute("Color", WebColors.toString(Palette.BLUE));
+ edge.setAttribute("Color", Palette.BLUE.toString());
- assertEquals(Palette.BLUE, options.getEdgeColor(edge));
+ assertEquals(Palette.BLUE.getRGB(), options.getEdgeColor(edge).getRGB());
}
@Test
@@ -269,7 +268,7 @@ public class GraphDisplayOptionsTest {
AttributedVertex vertex = new AttributedVertex("Foo");
vertex.setVertexType("V1");
- assertEquals(Palette.BLUE, options.getVertexColor(vertex));
+ assertEquals(Palette.BLUE.getRGB(), options.getVertexColor(vertex).getRGB());
Options graphDisplayOptions = toolOptions.getOptions(options.getRootOptionsName());
Options vertexColorOptions = graphDisplayOptions.getOptions("Vertex Colors");
diff --git a/Ghidra/Framework/Help/src/main/java/docking/DefaultHelpService.java b/Ghidra/Framework/Help/src/main/java/docking/DefaultHelpService.java
index 42ff57ade0..b103ee06d0 100644
--- a/Ghidra/Framework/Help/src/main/java/docking/DefaultHelpService.java
+++ b/Ghidra/Framework/Help/src/main/java/docking/DefaultHelpService.java
@@ -74,6 +74,11 @@ public class DefaultHelpService implements HelpService {
return false;
}
+ @Override
+ public void reload() {
+ // no-op
+ }
+
private void displayHelpInfo(Object helpObj) {
String msg = getHelpInfo(helpObj);
Msg.showInfo(this, null, "Help Info", msg);
diff --git a/Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java b/Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java
index 2912226ba5..54484b9c1d 100644
--- a/Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java
+++ b/Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java
@@ -46,6 +46,7 @@ public class GHelpBroker extends DefaultHelpBroker {
protected JEditorPane htmlEditorPane;
private Window activationWindow;
+ private boolean initialized;
/**
* Construct a new GhidraHelpBroker.
@@ -89,6 +90,22 @@ public class GHelpBroker extends DefaultHelpBroker {
}
}
+ public void reload() {
+ clearHighlights();
+ initialized = false;
+ if (isDisplayed()) {
+ setDisplayed(false);
+ setDisplayed(true);
+ }
+ }
+
+ private void clearHighlights() {
+ TextHelpModel helpModel = (TextHelpModel) getCustomHelpModel();
+ if (helpModel != null) {
+ helpModel.removeAllHighlights();
+ }
+ }
+
protected void showNavigationAid(URL url) {
// this base class does not have a navigation aid
}
@@ -134,7 +151,7 @@ public class GHelpBroker extends DefaultHelpBroker {
}
private void initializeScreenDevice() {
- if (isInitialized()) {
+ if (initialized) {
return;
}
@@ -179,20 +196,21 @@ public class GHelpBroker extends DefaultHelpBroker {
initializeUIComponents(contentPane);
}
- private boolean isInitialized() {
- return htmlEditorPane != null;
- }
-
private void initializeUIComponents(Container contentPane) {
- if (isInitialized()) {
+ if (initialized) {
return;// already initialized
}
Component[] components = contentPane.getComponents();
JHelp jHelp = (JHelp) components[0];
- addCustomToolbarItems(jHelp);
JHelpContentViewer contentViewer = jHelp.getContentViewer();
+ JEditorPane activeHtmlPane = getHTMLEditorPane(contentViewer);
+ if (activeHtmlPane == htmlEditorPane && initialized) {
+ return; // already initialized
+ }
+
+ addCustomToolbarItems(jHelp);
htmlEditorPane = getHTMLEditorPane(contentViewer);
// just creating the search wires everything together
@@ -203,6 +221,7 @@ public class GHelpBroker extends DefaultHelpBroker {
}
installActions(jHelp);
+ initialized = true;
}
protected void installHelpSearcher(JHelp jHelp, HelpModel helpModel) {
diff --git a/Ghidra/Framework/Help/src/main/java/help/GHelpHTMLEditorKit.java b/Ghidra/Framework/Help/src/main/java/help/GHelpHTMLEditorKit.java
index 9598c6100a..59b58ebec9 100644
--- a/Ghidra/Framework/Help/src/main/java/help/GHelpHTMLEditorKit.java
+++ b/Ghidra/Framework/Help/src/main/java/help/GHelpHTMLEditorKit.java
@@ -26,7 +26,6 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.swing.ImageIcon;
import javax.swing.JEditorPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
@@ -496,8 +495,7 @@ public class GHelpHTMLEditorKit extends HTMLEditorKit {
return null;
}
- ImageIcon imageIcon = iconProvider.getIcon();
- this.image = imageIcon.getImage();
+ this.image = iconProvider.getImage();
URL url = iconProvider.getOrCreateUrl();
return url;
diff --git a/Ghidra/Framework/Help/src/main/java/help/HelpService.java b/Ghidra/Framework/Help/src/main/java/help/HelpService.java
index bdf2e643be..969c97730a 100644
--- a/Ghidra/Framework/Help/src/main/java/help/HelpService.java
+++ b/Ghidra/Framework/Help/src/main/java/help/HelpService.java
@@ -113,4 +113,9 @@ public interface HelpService {
* initializing
*/
public boolean helpExists();
+
+ /**
+ * Called when a major system even happens, such as changing the system theme.
+ */
+ public void reload();
}
diff --git a/Ghidra/Framework/Project/build.gradle b/Ghidra/Framework/Project/build.gradle
index 0805a5b938..d13ff51ca6 100644
--- a/Ghidra/Framework/Project/build.gradle
+++ b/Ghidra/Framework/Project/build.gradle
@@ -18,6 +18,7 @@ apply from: "$rootProject.projectDir/gradle/javaProject.gradle"
apply from: "$rootProject.projectDir/gradle/jacocoProject.gradle"
apply from: "$rootProject.projectDir/gradle/javaTestProject.gradle"
apply from: "$rootProject.projectDir/gradle/javadoc.gradle"
+
apply plugin: 'eclipse'
eclipse.project.name = 'Framework Project'
diff --git a/Ghidra/Framework/Project/certification.manifest b/Ghidra/Framework/Project/certification.manifest
index 642d3e7b64..87a4a528ff 100644
--- a/Ghidra/Framework/Project/certification.manifest
+++ b/Ghidra/Framework/Project/certification.manifest
@@ -9,6 +9,12 @@
Module.manifest||GHIDRA||||END|
data/ExtensionPoint.manifest||GHIDRA||||END|
data/project.theme.properties||GHIDRA||||END|
+src/main/help/help/TOC_Source.xml||GHIDRA||||END|
+src/main/help/help/topics/Theming/Theming.htm||GHIDRA||||END|
+src/main/help/help/topics/Theming/images/ColorEditor.png||GHIDRA||||END|
+src/main/help/help/topics/Theming/images/FontEditor.png||GHIDRA||||END|
+src/main/help/help/topics/Theming/images/IconEditor.png||GHIDRA||||END|
+src/main/help/help/topics/Theming/images/ThemeDialog.png||GHIDRA||||END|
src/main/java/ghidra/framework/cmd/package.html||GHIDRA||reviewed||END|
src/main/java/ghidra/framework/data/package.html||GHIDRA||reviewed||END|
src/main/java/ghidra/framework/model/package.html||GHIDRA||||END|
diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/gui/ThemeManagerPlugin.java b/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/gui/ThemeManagerPlugin.java
index c71d9ed133..764974e0e3 100644
--- a/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/gui/ThemeManagerPlugin.java
+++ b/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/gui/ThemeManagerPlugin.java
@@ -23,6 +23,7 @@ import ghidra.framework.main.ApplicationLevelOnlyPlugin;
import ghidra.framework.main.UtilityPluginPackage;
import ghidra.framework.plugintool.*;
import ghidra.framework.plugintool.util.PluginStatus;
+import ghidra.util.HelpLocation;
//@formatter:off
@PluginInfo(
@@ -49,31 +50,35 @@ public class ThemeManagerPlugin extends Plugin implements ApplicationLevelOnlyPl
new ActionBuilder("Edit Theme", owner)
.menuPath("Edit", "Theme")
.menuGroup(group, "1")
+ .helpLocation(new HelpLocation("Theming", "Edit_Theme"))
.onAction(e -> ThemeDialog.editTheme())
.buildAndInstall(tool);
- new ActionBuilder("Reset To Default", owner)
- .menuPath("Edit", themeSubMenu, "Reset To Default")
+ new ActionBuilder("Reset", owner)
+ .menuPath("Edit", themeSubMenu, "Reset Theme Values")
.menuGroup(group, "2")
+ .helpLocation(new HelpLocation("Theming", "Reset_Theme_Values"))
.onAction(e -> ThemeUtils.resetThemeToDefault())
.buildAndInstall(tool);
new ActionBuilder("Import Theme", owner)
.menuPath("Edit", themeSubMenu, "Import...")
.menuGroup(group, "3")
+ .helpLocation(new HelpLocation("Theming", "Import_Theme"))
.onAction(e -> ThemeUtils.importTheme())
.buildAndInstall(tool);
new ActionBuilder("Export Theme", owner)
.menuPath("Edit", themeSubMenu, "Export...")
.menuGroup(group, "4")
+ .helpLocation(new HelpLocation("Theming", "Export_Theme"))
.onAction(e -> ThemeUtils.exportTheme())
.buildAndInstall(tool);
new ActionBuilder("Delete Theme", owner)
.menuPath("Edit", themeSubMenu, "Delete...")
.menuGroup(group, "5")
-// .enabledWhen(e -> Gui.getActiveTheme() instanceof FileGTheme)
+ .helpLocation(new HelpLocation("Theming", "Delete_Theme"))
.onAction(e -> ThemeUtils.deleteTheme())
.buildAndInstall(tool);
diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ImportGhidraToolsDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ImportGhidraToolsDialog.java
index 58b05bc612..235f27074f 100644
--- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ImportGhidraToolsDialog.java
+++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ImportGhidraToolsDialog.java
@@ -31,6 +31,7 @@ import docking.tool.ToolConstants;
import docking.widgets.checkbox.GCheckBox;
import docking.widgets.list.ListPanel;
import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.ToolUtils;
import ghidra.framework.model.ToolTemplate;
import ghidra.util.HelpLocation;
@@ -183,7 +184,7 @@ class ImportGhidraToolsDialog extends DialogComponentProvider {
while (itr.hasNext()) {
tools[count] = itr.next();
checkboxes[count] = new GCheckBox(tools[count], false);
- checkboxes[count].setBackground(Color.LIGHT_GRAY);
+ checkboxes[count].setBackground(Palette.LIGHT_GRAY);
count++;
}
diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SetToolAssociationsDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SetToolAssociationsDialog.java
index f706036933..0ffa03142a 100644
--- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SetToolAssociationsDialog.java
+++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SetToolAssociationsDialog.java
@@ -15,15 +15,16 @@
*/
package ghidra.framework.main;
-import java.awt.*;
+import java.awt.BorderLayout;
+import java.awt.Component;
import java.util.*;
-import java.util.List;
import javax.swing.*;
import docking.DialogComponentProvider;
import docking.tool.ToolConstants;
import docking.widgets.table.*;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.data.ContentHandler;
import ghidra.framework.model.*;
import ghidra.framework.project.tool.GhidraToolTemplate;
@@ -239,8 +240,10 @@ class SetToolAssociationsDialog extends DialogComponentProvider {
private class ContentHandlerComparator implements Comparator {
@Override
public int compare(ToolAssociationInfo o1, ToolAssociationInfo o2) {
- return o1.getContentHandler().getContentType().compareTo(
- o2.getContentHandler().getContentType());
+ return o1.getContentHandler()
+ .getContentType()
+ .compareTo(
+ o2.getContentHandler().getContentType());
}
}
@@ -298,7 +301,7 @@ class SetToolAssociationsDialog extends DialogComponentProvider {
return;
}
- renderer.setForeground(Color.LIGHT_GRAY);
+ renderer.setForeground(Palette.LIGHT_GRAY);
Icon icon = null;
if (template.getName().equals(info.getAssociatedToolName())) {
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AbstractSearchScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AbstractSearchScreenShots.java
index 3e0d03cbdc..eec2c8d5c8 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AbstractSearchScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AbstractSearchScreenShots.java
@@ -19,12 +19,14 @@ import java.awt.Color;
import javax.swing.JFrame;
+import generic.theme.GThemeDefaults.Colors.Palette;
+
/*package*/ abstract class AbstractSearchScreenShots extends GhidraScreenShotGenerator {
- protected static final Color YELLOW_ORANGE = new Color(155, 150, 50);
- protected static final Color BLUE_GREEN = new Color(0, 128, 64);
- protected static final Color DARK_BLUE = new Color(0, 0, 128);
- protected static final Color DARK_GREEN = new Color(0, 128, 0);
+ protected static final Color YELLOW_ORANGE = Palette.getColor("darkkhaki");
+ protected static final Color BLUE_GREEN = Palette.GREEN;
+ protected static final Color DARK_BLUE = Palette.getColor("navy");
+ protected static final Color DARK_GREEN = Palette.getColor("darkgreen");
@Override
protected String getHelpTopicName() {
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AutoAnalysisPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AutoAnalysisPluginScreenShots.java
index e7512c51e6..0817d08c90 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AutoAnalysisPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/AutoAnalysisPluginScreenShots.java
@@ -22,6 +22,8 @@ import java.util.concurrent.CountDownLatch;
import org.junit.Test;
import docking.DialogComponentProvider;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.cmd.BackgroundCommand;
import ghidra.framework.model.DomainObject;
import ghidra.util.task.TaskMonitor;
@@ -37,29 +39,29 @@ public class AutoAnalysisPluginScreenShots extends GhidraScreenShotGenerator {
// not tool for this test
}
-@Test
- public void testAutoAnalysis() {
- Color darkGreen = new Color(20, 154, 65);
- Color darkBlue = new Color(10, 62, 149);
+ @Test
+ public void testAutoAnalysis() {
+ Color darkGreen = Palette.GREEN;
+ Color darkBlue = Palette.getColor("darkblue");
image = new BufferedImage(700, 400, BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
- g.setColor(Color.WHITE);
+ g.setColor(Colors.BACKGROUND);
g.fillRect(0, 0, 700, 400);
- drawText("(1) User Disassembles Code", Color.BLACK, new Point(160, 30), 24);
+ drawText("(1) User Disassembles Code", Colors.FOREGROUND, new Point(160, 30), 24);
drawArrow(darkBlue, new Point(325, 35), new Point(325, 70));
drawText("(new code)", darkGreen, new Point(270, 90), 24);
- drawText("(2) Function Analyzer", Color.BLACK, new Point(0, 150), 24);
+ drawText("(2) Function Analyzer", Colors.FOREGROUND, new Point(0, 150), 24);
drawArrow(darkBlue, new Point(265, 82), new Point(180, 120));
drawText("(new function)", darkGreen, new Point(100, 190), 24);
- drawText("(3) Stack Analyzer", Color.BLACK, new Point(10, 230), 24);
+ drawText("(3) Stack Analyzer", Colors.FOREGROUND, new Point(10, 230), 24);
drawArrow(darkBlue, new Point(50, 155), new Point(50, 205));
- drawText("(4) Operand Analyzer", Color.BLACK, new Point(180, 290), 24);
+ drawText("(4) Operand Analyzer", Colors.FOREGROUND, new Point(180, 290), 24);
drawArrow(darkBlue, new Point(300, 94), new Point(300, 260));
- drawText("(5) Data Reference Analyzer", Color.BLACK, new Point(280, 350), 24);
+ drawText("(5) Data Reference Analyzer", Colors.FOREGROUND, new Point(280, 350), 24);
drawArrow(darkBlue, new Point(350, 94), new Point(490, 325));
Point p1 = new Point(447, 355);
@@ -71,14 +73,14 @@ public class AutoAnalysisPluginScreenShots extends GhidraScreenShotGenerator {
drawArrow(darkBlue, p3, new Point(404, 88));
}
-@Test
- public void testCaptureAutoAnalysisOptions() {
+ @Test
+ public void testCaptureAutoAnalysisOptions() {
showAnalysisOptions("Data Reference");
captureDialog(800, 400);
}
-@Test
- public void testCaptureBackgroundAnalysisTasks() throws InterruptedException {
+ @Test
+ public void testCaptureBackgroundAnalysisTasks() throws InterruptedException {
CountDownLatch start = new CountDownLatch(1);
CountDownLatch end = new CountDownLatch(1);
TestBackgroundCommand cmd = new TestBackgroundCommand(start, end);
@@ -92,8 +94,8 @@ public class AutoAnalysisPluginScreenShots extends GhidraScreenShotGenerator {
crop(new Rectangle(width - 400, height - 120, 400, 120));
}
-@Test
- public void testCaptureProgramOptions() {
+ @Test
+ public void testCaptureProgramOptions() {
showProgramOptions("Analyzers");
DialogComponentProvider dialog = getDialog();
Component comp = findComponentByName(dialog.getComponent(), "Analysis Panel");
@@ -122,12 +124,7 @@ public class AutoAnalysisPluginScreenShots extends GhidraScreenShotGenerator {
monitor.initialize(100);
monitor.setProgress(65);
monitor.setMessage("Applying Function Signatures");
- runSwing(new Runnable() {
- @Override
- public void run() {
- invokeInstanceMethod("update", monitor);
- }
- });
+ runSwing(() -> invokeInstanceMethod("update", monitor));
start.countDown();
try {
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/BlockModelScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/BlockModelScreenShots.java
index a2be1190e3..d111e8c4b1 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/BlockModelScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/BlockModelScreenShots.java
@@ -21,6 +21,7 @@ import java.util.List;
import org.junit.Test;
+import generic.theme.TempColorUtils;
import ghidra.GhidraOptions;
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.plugin.core.colorizer.ColorizingService;
@@ -38,7 +39,7 @@ import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSet;
import ghidra.program.model.block.*;
import ghidra.util.exception.CancelledException;
-import ghidra.util.task.TaskMonitorAdapter;
+import ghidra.util.task.TaskMonitor;
public class BlockModelScreenShots extends GhidraScreenShotGenerator {
@@ -95,16 +96,16 @@ public class BlockModelScreenShots extends GhidraScreenShotGenerator {
ColorizingService colorizer = tool.getService(ColorizingService.class);
- Color c1 = new Color(0xE8F2FE);
-
- Color c2 = new Color(170, 204, 245);
+ // note: 2 colors that look good together and are just used for this example
+ Color c1 = TempColorUtils.fromRgb(232, 242, 254); // alice blue;
+ Color c2 = TempColorUtils.fromRgb(170, 204, 245); // light sky blue
Color color = c1;
BasicBlockModel basicBlockModel = new BasicBlockModel(program);
CodeBlockIterator iterator;
try {
iterator = basicBlockModel.getCodeBlocksContaining(addressSet,
- TaskMonitorAdapter.DUMMY_MONITOR);
+ TaskMonitor.DUMMY);
while (iterator.hasNext()) {
CodeBlock block = iterator.next();
@@ -176,8 +177,9 @@ public class BlockModelScreenShots extends GhidraScreenShotGenerator {
if (fieldFactory.getFieldName().indexOf("XRef") != -1) {
formatModel.removeFactory(row, col);
}
- else if (fieldFactory.getFieldName().equals(
- EolCommentFieldFactory.FIELD_NAME)) {
+ else if (fieldFactory.getFieldName()
+ .equals(
+ EolCommentFieldFactory.FIELD_NAME)) {
formatModel.removeFactory(row, col);
}
else if (fieldFactory.getFieldName().equals(AddressFieldFactory.FIELD_NAME)) {
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ClipboardPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ClipboardPluginScreenShots.java
index 12cf132b93..676a77304a 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ClipboardPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ClipboardPluginScreenShots.java
@@ -28,6 +28,7 @@ import docking.DialogComponentProvider;
import docking.action.DockingAction;
import docking.action.DockingActionIf;
import docking.widgets.fieldpanel.FieldPanel;
+import generic.theme.GThemeDefaults.Colors.Java;
import ghidra.app.plugin.core.clipboard.*;
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
@@ -74,7 +75,7 @@ public class ClipboardPluginScreenShots extends GhidraScreenShotGenerator {
captureListingCallMnemonic(start, end);
placeImagesSideBySide(image, menuImage);
- drawBorder(Color.BLACK);
+ drawBorder(Java.BORDER);
}
private void cropCopyMenu() {
@@ -149,21 +150,18 @@ public class ClipboardPluginScreenShots extends GhidraScreenShotGenerator {
Object listPanel = getInstanceField("listPanel", copySpecialDialog);
final JList> list = (JList>) getInstanceField("list", listPanel);
- runSwing(new Runnable() {
- @Override
- public void run() {
- ListModel> model = list.getModel();
- int size = model.getSize();
- for (int i = 0; i < size; i++) {
- Object value = model.getElementAt(i);
- if ("Labels and Comments".equals(value.toString())) {
- list.setSelectedIndex(i);
- return;
- }
+ runSwing(() -> {
+ ListModel> model = list.getModel();
+ int size = model.getSize();
+ for (int i = 0; i < size; i++) {
+ Object value = model.getElementAt(i);
+ if ("Labels and Comments".equals(value.toString())) {
+ list.setSelectedIndex(i);
+ return;
}
-
- throw new RuntimeException("Could not find 'Labels and Comments' copy action");
}
+
+ throw new RuntimeException("Could not find 'Labels and Comments' copy action");
});
waitForSwing();
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java
index 758592eec5..6bac7e2829 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java
@@ -28,6 +28,9 @@ import org.junit.Test;
import docking.DockableComponent;
import docking.widgets.fieldpanel.FieldPanel;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Java;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.GhidraOptions;
import ghidra.app.cmd.comments.SetCommentCmd;
import ghidra.app.cmd.data.CreateDataCmd;
@@ -71,7 +74,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator {
Rectangle cursor = getCursorBounds();
captureListingRange(0x0040be40, 0x0040be56, 600);
- drawBorder(Color.BLACK);
+ drawBorder(Java.BORDER);
drawTextWithArrowNearOpenStructureIcon("Closed", cursor);
@@ -92,7 +95,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator {
Rectangle cursor = getCursorBounds();
captureListingRange(0x0040be40, 0x0040be56, 600);
- drawBorder(Color.BLACK);
+ drawBorder(Java.BORDER);
drawTextWithArrowNearOpenStructureIcon("Open", cursor);
}
@@ -102,7 +105,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator {
// Make some room to draw our annotations (text and an arrow)
//
Dimension whitespace = new Dimension(150, 10);
- padImage(Color.WHITE, whitespace.height, whitespace.width, 10, 10);
+ padImage(Colors.BACKGROUND, whitespace.height, whitespace.width, 10, 10);
//
// Draw text inside of the newly padded space
@@ -112,14 +115,14 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator {
int textStartY = arrowStartY - 4;// up just a bit
Point textPoint = new Point(textStartX, textStartY);
int size = 24;
- Color textColor = Color.MAGENTA.darker();
+ Color textColor = Palette.PURPLE;
drawText(text, textColor, textPoint, size);
//
// Draw an arrow from the text above to the 'open structure' icon
//
int arrowStartX = 60;
- Color arrowColor = Color.GREEN.darker();
+ Color arrowColor = Palette.GREEN;
Point arrowStart = new Point(arrowStartX, arrowStartY);
int addressFieldStartX = 40;
int listingOffsetX = whitespace.width;
@@ -205,14 +208,14 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator {
captureListingRange(topAddr, bottomAddr, 600);
int padX = 100;
- padImage(Color.LIGHT_GRAY, 0, padX, 0, 0);
+ padImage(Palette.LIGHT_GRAY, 0, padX, 0, 0);
int y = conditional.y + 10;
- drawText("Conditional", Color.BLACK, new Point(10, y), 12);
- drawText(" Jump", Color.BLACK, new Point(10, y + 15), 12);
+ drawText("Conditional", Colors.FOREGROUND, new Point(10, y), 12);
+ drawText(" Jump", Colors.FOREGROUND, new Point(10, y + 15), 12);
y = unconditional.y + 10;
- drawText("Unconditional", Color.BLACK, new Point(10, y), 12);
- drawText(" Jump", Color.BLACK, new Point(10, y + 15), 12);
+ drawText("Unconditional", Colors.FOREGROUND, new Point(10, y), 12);
+ drawText(" Jump", Colors.FOREGROUND, new Point(10, y + 15), 12);
}
@@ -288,7 +291,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator {
int width = image.getWidth(null);
crop(new Rectangle(0, 0, width, 30));
- drawOval(new Color(107, 47, 109),
+ drawOval(Palette.PURPLE,
new Rectangle(p.x - 13, p.y - 1, bounds.width + 26, bounds.height + 2), 4);
}
@@ -318,7 +321,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator {
int y = p.y - 2;
int height = bounds.height + 12;
int width = bounds.width + 34;
- Color color = new Color(120, 0, 64);
+ Color color = Palette.PURPLE;
drawOval(color, new Rectangle(x, y, width, height), 5);
int arrowHeadX = x + (width / 4);
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DecompilePluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DecompilePluginScreenShots.java
index 86e3c8a3b2..b068e7fb28 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DecompilePluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DecompilePluginScreenShots.java
@@ -24,15 +24,16 @@ import org.junit.Test;
import docking.ComponentProvider;
import docking.DockableComponent;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.plugin.core.datamgr.DataTypesProvider;
import ghidra.app.plugin.core.programtree.ViewManagerComponentProvider;
public class DecompilePluginScreenShots extends GhidraScreenShotGenerator {
- private static final Color DARK_BLUE = new Color(0, 0, 128);
- private static final Color DARK_GREEN = new Color(0, 128, 0);
- private static final Color YELLOW_ORANGE = new Color(155, 150, 50);
- private static final Color PURPLE = new Color(155, 50, 155);
+ private static final Color DARK_BLUE = Palette.getColor("navy");
+ private static final Color DARK_GREEN = Palette.GREEN;
+ private static final Color YELLOW_ORANGE = Palette.getColor("darkkhaki");
+ private static final Color PURPLE = Palette.PURPLE;
public DecompilePluginScreenShots() {
super();
@@ -57,12 +58,12 @@ public class DecompilePluginScreenShots extends GhidraScreenShotGenerator {
@Test
public void testDefuse() {
TextFormatter tf = new TextFormatter(17, 400, 4, 5, 0);
- TextFormatterContext hl = new TextFormatterContext(Color.BLACK, Color.YELLOW);
- TextFormatterContext red = new TextFormatterContext(Color.RED, Color.WHITE);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE, Color.WHITE);
- TextFormatterContext green = new TextFormatterContext(Color.GREEN, Color.WHITE);
+ TextFormatterContext hl = new TextFormatterContext(Palette.BLACK, Palette.YELLOW);
+ TextFormatterContext red = new TextFormatterContext(Palette.RED, Palette.WHITE);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE, Palette.WHITE);
+ TextFormatterContext green = new TextFormatterContext(Palette.GREEN, Palette.WHITE);
TextFormatterContext cursorhl =
- new TextFormatterContext(Color.BLACK, Color.YELLOW, Color.RED);
+ new TextFormatterContext(Palette.BLACK, Palette.YELLOW, Palette.RED);
tf.writeln("|void| |max_retry|(node *ptr)", blue, red);
tf.writeln("");
@@ -87,12 +88,12 @@ public class DecompilePluginScreenShots extends GhidraScreenShotGenerator {
@Test
public void testForwardSlice() {
TextFormatter tf = new TextFormatter(16, 500, 4, 5, 0);
- TextFormatterContext hl = new TextFormatterContext(Color.BLACK, Color.YELLOW);
- TextFormatterContext red = new TextFormatterContext(Color.RED);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE);
- TextFormatterContext green = new TextFormatterContext(Color.GREEN);
+ TextFormatterContext hl = new TextFormatterContext(Palette.BLACK, Palette.YELLOW);
+ TextFormatterContext red = new TextFormatterContext(Palette.RED);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE);
+ TextFormatterContext green = new TextFormatterContext(Palette.GREEN);
TextFormatterContext cursorhl =
- new TextFormatterContext(Color.BLACK, Color.YELLOW, Color.RED);
+ new TextFormatterContext(Palette.BLACK, Palette.YELLOW, Palette.RED);
tf.writeln(" a = psParm2->id;");
tf.writeln(" |b| = |max_alpha|(psParm1->next,psParm1->id);", cursorhl, red);
@@ -117,13 +118,13 @@ public class DecompilePluginScreenShots extends GhidraScreenShotGenerator {
@Test
public void testBackwardSlice() {
TextFormatter tf = new TextFormatter(16, 500, 4, 5, 0);
- TextFormatterContext hl = new TextFormatterContext(Color.BLACK, Color.YELLOW);
- TextFormatterContext red = new TextFormatterContext(Color.RED, Color.WHITE);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE, Color.WHITE);
- TextFormatterContext green = new TextFormatterContext(Color.GREEN, Color.WHITE);
- TextFormatterContext greenhl = new TextFormatterContext(Color.GREEN, Color.YELLOW);
+ TextFormatterContext hl = new TextFormatterContext(Palette.BLACK, Palette.YELLOW);
+ TextFormatterContext red = new TextFormatterContext(Palette.RED, Palette.WHITE);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE, Palette.WHITE);
+ TextFormatterContext green = new TextFormatterContext(Palette.GREEN, Palette.WHITE);
+ TextFormatterContext greenhl = new TextFormatterContext(Palette.GREEN, Palette.YELLOW);
TextFormatterContext cursorhl =
- new TextFormatterContext(Color.BLACK, Color.YELLOW, Color.RED);
+ new TextFormatterContext(Palette.BLACK, Palette.YELLOW, Palette.RED);
tf.writeln(" |a| = |psParm2|->id;", hl, hl);
tf.writeln(" b = |max_alpha|(|psParm1|->next,|psParm1|->id);", red, hl, hl);
@@ -188,12 +189,12 @@ public class DecompilePluginScreenShots extends GhidraScreenShotGenerator {
Font font = new Font("Monospaced", Font.PLAIN, 12);
TextFormatter tf = new TextFormatter(font, 15, 400, 4, 14, 1);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE);
TextFormatterContext darkBlue = new TextFormatterContext(DARK_BLUE);
TextFormatterContext darkGreen = new TextFormatterContext(DARK_GREEN);
TextFormatterContext orange = new TextFormatterContext(YELLOW_ORANGE);
TextFormatterContext purple = new TextFormatterContext(PURPLE);
- tf.colorLines(new Color(180, 255, 180), 9, 1);
+ tf.colorLines(Palette.getColor("palegreen"), 9, 1);
// @formatter:off
tf.writeln("|8b 40 0c| |MOV| |EAX|,|Oxc|[|EAX|]", blue, darkBlue, orange, darkGreen, orange );
@@ -220,11 +221,12 @@ public class DecompilePluginScreenShots extends GhidraScreenShotGenerator {
Font font = new Font("Monospaced", Font.PLAIN, 13);
TextFormatter tf = new TextFormatter(font, 15, 400, 4, 2, 0);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE);
- TextFormatterContext green = new TextFormatterContext(Color.GREEN);
- TextFormatterContext hl = new TextFormatterContext(Color.BLACK, Color.YELLOW);
- TextFormatterContext greenhl = new TextFormatterContext(Color.GREEN, Color.YELLOW);
- TextFormatterContext cursor = new TextFormatterContext(Color.WHITE, Color.WHITE, Color.RED);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE);
+ TextFormatterContext green = new TextFormatterContext(Palette.GREEN);
+ TextFormatterContext hl = new TextFormatterContext(Palette.BLACK, Palette.YELLOW);
+ TextFormatterContext greenhl = new TextFormatterContext(Palette.GREEN, Palette.YELLOW);
+ TextFormatterContext cursor =
+ new TextFormatterContext(Palette.WHITE, Palette.WHITE, Palette.RED);
// @formatter:off
tf.writeln(" dword dVar1:");
@@ -252,10 +254,11 @@ public class DecompilePluginScreenShots extends GhidraScreenShotGenerator {
Font font = new Font("Monospaced", Font.PLAIN, 13);
TextFormatter tf = new TextFormatter(font, 15, 400, 4, 2, 0);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE);
- TextFormatterContext green = new TextFormatterContext(Color.GREEN);
- TextFormatterContext hl = new TextFormatterContext(Color.BLACK, Color.YELLOW);
- TextFormatterContext cursor = new TextFormatterContext(Color.WHITE, Color.WHITE, Color.RED);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE);
+ TextFormatterContext green = new TextFormatterContext(Palette.GREEN);
+ TextFormatterContext hl = new TextFormatterContext(Palette.BLACK, Palette.YELLOW);
+ TextFormatterContext cursor =
+ new TextFormatterContext(Palette.WHITE, Palette.WHITE, Palette.RED);
// @formatter:off
tf.writeln(" dword dVar1:");
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DiffScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DiffScreenShots.java
index f7d35e946c..bbcbab9d2e 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DiffScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DiffScreenShots.java
@@ -15,7 +15,6 @@
*/
package help.screenshot;
-import java.awt.Color;
import java.awt.Font;
import javax.swing.*;
@@ -24,6 +23,8 @@ import org.junit.Test;
import docking.ComponentProvider;
import docking.DialogComponentProvider;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.nav.ListingPanelContainer;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.services.ProgramManager;
@@ -135,8 +136,8 @@ public class DiffScreenShots extends GhidraScreenShotGenerator {
JMenu jMenu = new JMenu();
Font font = jMenu.getFont().deriveFont(11f);
TextFormatter tf = new TextFormatter(font, 3, 220, 0, 20, 3);
- TextFormatterContext white = new TextFormatterContext(Color.WHITE);
- tf.colorLines(new Color(60, 115, 200), 2, 1);
+ TextFormatterContext white = new TextFormatterContext(Colors.BACKGROUND);
+ tf.colorLines(Palette.getColor("cornflowerblue"), 2, 1);
tf.writeln("Set Ignore for All Apply Settings");
tf.writeln("Set Replace for All Apply Settings");
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DisassembledViewPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DisassembledViewPluginScreenShots.java
index 12b044b152..33724166b0 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DisassembledViewPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DisassembledViewPluginScreenShots.java
@@ -22,6 +22,7 @@ import javax.swing.SwingUtilities;
import org.junit.Test;
import docking.ComponentProvider;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.datamgr.DataTypesProvider;
import ghidra.app.plugin.core.programtree.ViewManagerComponentProvider;
@@ -60,7 +61,7 @@ public class DisassembledViewPluginScreenShots extends GhidraScreenShotGenerator
size.height -= (2 * offset);// up
r.setSize(size);
- drawRectangle(Color.YELLOW, r, 10);
+ drawRectangle(Palette.YELLOW, r, 10);
}
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FrontEndPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FrontEndPluginScreenShots.java
index 34622e93ec..d26eb3a9b2 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FrontEndPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FrontEndPluginScreenShots.java
@@ -33,6 +33,7 @@ import docking.widgets.filechooser.GhidraFileChooser;
import docking.widgets.table.GTable;
import docking.wizard.WizardManager;
import docking.wizard.WizardPanel;
+import generic.theme.GThemeDefaults.Colors;
import ghidra.app.plugin.core.archive.RestoreDialog;
import ghidra.framework.data.GhidraFileData;
import ghidra.framework.main.*;
@@ -712,7 +713,7 @@ public class FrontEndPluginScreenShots extends GhidraScreenShotGenerator {
private void captureIconAndText(Icon labelImage, String text) {
final JLabel label = new JLabel(text);
- label.setBackground(Color.WHITE);
+ label.setBackground(Colors.BACKGROUND);
label.setOpaque(true);
label.setIcon(labelImage);
label.setHorizontalAlignment(SwingConstants.CENTER);
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FunctionGraphPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FunctionGraphPluginScreenShots.java
index 811e2cd876..5d8ef59385 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FunctionGraphPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/FunctionGraphPluginScreenShots.java
@@ -41,6 +41,7 @@ import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationServer;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import generic.test.TestUtils;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.cmd.function.DeleteFunctionCmd;
import ghidra.app.cmd.label.AddLabelCmd;
import ghidra.app.plugin.core.functiongraph.AbstractFunctionGraphTest;
@@ -318,7 +319,7 @@ public class FunctionGraphPluginScreenShots extends AbstractFunctionGraphTest {
int h = (graphImage1.getHeight(null) - 10) - y1;
- g.setColor(Color.BLACK);
+ g.setColor(Palette.BLACK);
g.fillRect(x1, y1, w, h);
screen.image = fullImage;
@@ -530,13 +531,13 @@ public class FunctionGraphPluginScreenShots extends AbstractFunctionGraphTest {
Rectangle rect = new Rectangle(x, y, w, h);
// drop shadow
- Color color = Color.GRAY;
+ Color color = Palette.GRAY;
screen.drawRectangle(color, rect, boxThickness);
// box
x -= 1;
y -= 2;
- color = new Color(0xB5, 0xDE, 0x2F);
+ color = Palette.getColor("greenyellow");
rect.x = x;
rect.y = y;
screen.drawRectangle(color, rect, boxThickness);
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GlossaryScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GlossaryScreenShots.java
index 4140205f7d..7c6ed8a43f 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GlossaryScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/GlossaryScreenShots.java
@@ -15,24 +15,28 @@
*/
package help.screenshot;
-import java.awt.*;
+import java.awt.Graphics;
+import java.awt.Point;
import java.awt.image.BufferedImage;
import org.junit.Test;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
+
public class GlossaryScreenShots extends GhidraScreenShotGenerator {
public GlossaryScreenShots() {
super();
}
-@Test
- public void testBigEndian() {
+ @Test
+ public void testBigEndian() {
//Draw empty white rectangle
image = new BufferedImage(450, 100, BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
- g.setColor(Color.WHITE);
+ g.setColor(Colors.BACKGROUND);
g.fillRect(0, 0, 450, 125);
//Draw box with line in the middle
@@ -44,16 +48,16 @@ public class GlossaryScreenShots extends GhidraScreenShotGenerator {
Point p5 = new Point(225, 10);
Point p6 = new Point(225, 50);
- drawLine(Color.BLACK, 1, p1, p2);
- drawLine(Color.BLACK, 1, p2, p3);
- drawLine(Color.BLACK, 1, p3, p4);
- drawLine(Color.BLACK, 1, p4, p1);
+ drawLine(Palette.BLACK, 1, p1, p2);
+ drawLine(Palette.BLACK, 1, p2, p3);
+ drawLine(Palette.BLACK, 1, p3, p4);
+ drawLine(Palette.BLACK, 1, p4, p1);
- drawLine(Color.BLACK, 1, p5, p6);
+ drawLine(Palette.BLACK, 1, p5, p6);
//Draw Text in boxes
- drawText("high-order byte", Color.BLACK, new Point(80, 35), 12);
- drawText("low-order byte", Color.BLACK, new Point(285, 35), 12);
+ drawText("high-order byte", Colors.FOREGROUND, new Point(80, 35), 12);
+ drawText("low-order byte", Colors.FOREGROUND, new Point(285, 35), 12);
//Draw arrows
Point p7 = new Point(30, 50);
@@ -61,22 +65,22 @@ public class GlossaryScreenShots extends GhidraScreenShotGenerator {
Point p9 = new Point(225, 50);
Point p10 = new Point(225, 80);
- drawArrow(Color.BLACK, 1, p8, p7, 6);
- drawArrow(Color.BLACK, 1, p10, p9, 6);
+ drawArrow(Palette.BLACK, 1, p8, p7, 6);
+ drawArrow(Palette.BLACK, 1, p10, p9, 6);
//Draw arrow text
- drawText("addr A", Color.BLACK, new Point(15, 93), 12);
- drawText("addr A+1", Color.BLACK, new Point(200, 93), 12);
+ drawText("addr A", Colors.FOREGROUND, new Point(15, 93), 12);
+ drawText("addr A+1", Colors.FOREGROUND, new Point(200, 93), 12);
}
-@Test
- public void testLittleEndian() {
+ @Test
+ public void testLittleEndian() {
//Draw empty white rectangle
image = new BufferedImage(450, 100, BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
- g.setColor(Color.WHITE);
+ g.setColor(Palette.WHITE);
g.fillRect(0, 0, 450, 125);
//Draw box with line in the middle
@@ -88,16 +92,16 @@ public class GlossaryScreenShots extends GhidraScreenShotGenerator {
Point p5 = new Point(225, 10);
Point p6 = new Point(225, 50);
- drawLine(Color.BLACK, 1, p1, p2);
- drawLine(Color.BLACK, 1, p2, p3);
- drawLine(Color.BLACK, 1, p3, p4);
- drawLine(Color.BLACK, 1, p4, p1);
+ drawLine(Palette.BLACK, 1, p1, p2);
+ drawLine(Palette.BLACK, 1, p2, p3);
+ drawLine(Palette.BLACK, 1, p3, p4);
+ drawLine(Palette.BLACK, 1, p4, p1);
- drawLine(Color.BLACK, 1, p5, p6);
+ drawLine(Palette.BLACK, 1, p5, p6);
//Draw Text in boxes
- drawText("high-order byte", Color.BLACK, new Point(80, 35), 12);
- drawText("low-order byte", Color.BLACK, new Point(285, 35), 12);
+ drawText("high-order byte", Colors.FOREGROUND, new Point(80, 35), 12);
+ drawText("low-order byte", Colors.FOREGROUND, new Point(285, 35), 12);
//Draw arrows
Point p7 = new Point(430, 50);
@@ -105,12 +109,12 @@ public class GlossaryScreenShots extends GhidraScreenShotGenerator {
Point p9 = new Point(225, 50);
Point p10 = new Point(225, 80);
- drawArrow(Color.BLACK, 1, p8, p7, 6);
- drawArrow(Color.BLACK, 1, p10, p9, 6);
+ drawArrow(Palette.BLACK, 1, p8, p7, 6);
+ drawArrow(Palette.BLACK, 1, p10, p9, 6);
//Draw arrow text
- drawText("addr A+1", Color.BLACK, new Point(200, 93), 12);
- drawText("addr A", Color.BLACK, new Point(413, 93), 12);
+ drawText("addr A+1", Colors.FOREGROUND, new Point(200, 93), 12);
+ drawText("addr A", Colors.FOREGROUND, new Point(413, 93), 12);
}
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemoryMapPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemoryMapPluginScreenShots.java
index 646804c486..f6f89d1991 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemoryMapPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemoryMapPluginScreenShots.java
@@ -15,7 +15,8 @@
*/
package help.screenshot;
-import java.awt.*;
+import java.awt.Graphics;
+import java.awt.Point;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
@@ -27,6 +28,8 @@ import docking.ComponentProvider;
import docking.DialogComponentProvider;
import docking.action.DockingAction;
import docking.widgets.combobox.GhidraComboBox;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.util.exception.AssertException;
import ghidra.util.table.GhidraTable;
@@ -36,8 +39,8 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
super();
}
-@Test
- public void testMemoryMap() {
+ @Test
+ public void testMemoryMap() {
performAction("Memory Map", "DockingWindows", true);
@@ -48,52 +51,52 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
captureIsolatedComponent(component, 800, 225);
}
-@Test
- public void testAddMemoryBlock() {
+ @Test
+ public void testAddMemoryBlock() {
performAction("Add Block", "MemoryMapPlugin", false);
captureDialog();
}
-@Test
- public void testBitOverlayAddresses() {
+ @Test
+ public void testBitOverlayAddresses() {
//Draw empty white rectangle
image = new BufferedImage(450, 175, BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
- g.setColor(Color.WHITE);
+ g.setColor(Colors.BACKGROUND);
g.fillRect(0, 0, 450, 175);
//Draw Title and subtitle
- drawText("Bit Overlay Addresses", Color.BLACK, new Point(160, 30), 18);
- drawText("Byte Memory", Color.BLACK, new Point(15, 30), 10);
- drawText("Addresses", Color.BLACK, new Point(20, 40), 10);
+ drawText("Bit Overlay Addresses", Colors.FOREGROUND, new Point(160, 30), 18);
+ drawText("Byte Memory", Colors.FOREGROUND, new Point(15, 30), 10);
+ drawText("Addresses", Colors.FOREGROUND, new Point(20, 40), 10);
//Draw text inside and next to boxes
- drawText("00008100", Color.BLACK, new Point(15, 80), 12);
- drawText("00008100", Color.BLACK, new Point(15, 130), 12);
+ drawText("00008100", Colors.FOREGROUND, new Point(15, 80), 12);
+ drawText("00008100", Colors.FOREGROUND, new Point(15, 130), 12);
- drawText("MSB", Color.BLACK, new Point(90, 60), 10);
- drawText("LSB", Color.BLACK, new Point(370, 60), 10);
+ drawText("MSB", Colors.FOREGROUND, new Point(90, 60), 10);
+ drawText("LSB", Colors.FOREGROUND, new Point(370, 60), 10);
- drawText("0007", Color.BLACK, new Point(90, 80), 10);
- drawText("0006", Color.BLACK, new Point(130, 80), 10);
- drawText("0005", Color.BLACK, new Point(170, 80), 10);
- drawText("0004", Color.BLACK, new Point(210, 80), 10);
- drawText("0003", Color.BLACK, new Point(250, 80), 10);
- drawText("0002", Color.BLACK, new Point(290, 80), 10);
- drawText("0001", Color.BLACK, new Point(330, 80), 10);
- drawText("0000", Color.BLACK, new Point(370, 80), 10);
+ drawText("0007", Colors.FOREGROUND, new Point(90, 80), 10);
+ drawText("0006", Colors.FOREGROUND, new Point(130, 80), 10);
+ drawText("0005", Colors.FOREGROUND, new Point(170, 80), 10);
+ drawText("0004", Colors.FOREGROUND, new Point(210, 80), 10);
+ drawText("0003", Colors.FOREGROUND, new Point(250, 80), 10);
+ drawText("0002", Colors.FOREGROUND, new Point(290, 80), 10);
+ drawText("0001", Colors.FOREGROUND, new Point(330, 80), 10);
+ drawText("0000", Colors.FOREGROUND, new Point(370, 80), 10);
- drawText("000f", Color.BLACK, new Point(90, 130), 10);
- drawText("000e", Color.BLACK, new Point(130, 130), 10);
- drawText("000d", Color.BLACK, new Point(170, 130), 10);
- drawText("000c", Color.BLACK, new Point(210, 130), 10);
- drawText("000b", Color.BLACK, new Point(250, 130), 10);
- drawText("000a", Color.BLACK, new Point(290, 130), 10);
- drawText("0009", Color.BLACK, new Point(330, 130), 10);
- drawText("0008", Color.BLACK, new Point(370, 130), 10);
+ drawText("000f", Colors.FOREGROUND, new Point(90, 130), 10);
+ drawText("000e", Colors.FOREGROUND, new Point(130, 130), 10);
+ drawText("000d", Colors.FOREGROUND, new Point(170, 130), 10);
+ drawText("000c", Colors.FOREGROUND, new Point(210, 130), 10);
+ drawText("000b", Colors.FOREGROUND, new Point(250, 130), 10);
+ drawText("000a", Colors.FOREGROUND, new Point(290, 130), 10);
+ drawText("0009", Colors.FOREGROUND, new Point(330, 130), 10);
+ drawText("0008", Colors.FOREGROUND, new Point(370, 130), 10);
//Draw boxes
Point p1 = new Point(80, 65);
@@ -106,24 +109,24 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
Point p7 = new Point(400, 140);
Point p8 = new Point(80, 140);
- drawLine(Color.BLACK, 1, p1, p2);
- drawLine(Color.BLACK, 1, p2, p3);
- drawLine(Color.BLACK, 1, p3, p4);
- drawLine(Color.BLACK, 1, p4, p1);
+ drawLine(Palette.BLACK, 1, p1, p2);
+ drawLine(Palette.BLACK, 1, p2, p3);
+ drawLine(Palette.BLACK, 1, p3, p4);
+ drawLine(Palette.BLACK, 1, p4, p1);
- drawLine(Color.BLACK, 1, p5, p6);
- drawLine(Color.BLACK, 1, p6, p7);
- drawLine(Color.BLACK, 1, p7, p8);
- drawLine(Color.BLACK, 1, p8, p5);
+ drawLine(Palette.BLACK, 1, p5, p6);
+ drawLine(Palette.BLACK, 1, p6, p7);
+ drawLine(Palette.BLACK, 1, p7, p8);
+ drawLine(Palette.BLACK, 1, p8, p5);
for (int i = 1; i < 8; i++) {
- drawLine(Color.BLACK, 1, new Point(80 + i * 40, 65), new Point(80 + i * 40, 90));
- drawLine(Color.BLACK, 1, new Point(80 + i * 40, 115), new Point(80 + i * 40, 140));
+ drawLine(Palette.BLACK, 1, new Point(80 + i * 40, 65), new Point(80 + i * 40, 90));
+ drawLine(Palette.BLACK, 1, new Point(80 + i * 40, 115), new Point(80 + i * 40, 140));
}
}
-@Test
- public void testAddMappedBlock() {
+ @Test
+ public void testAddMappedBlock() {
performAction("Add Block", "MemoryMapPlugin", false);
@@ -133,11 +136,11 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
captureDialog();
- drawRectangleAround(comboBox, Color.GREEN, 10);
+ drawRectangleAround(comboBox, Palette.GREEN, 10);
}
-@Test
- public void testMoveMemory() {
+ @Test
+ public void testMoveMemory() {
performAction("Memory Map", "DockingWindows", true);
@@ -155,8 +158,8 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
captureDialog();
}
-@Test
- public void testSplitMemoryBlock() {
+ @Test
+ public void testSplitMemoryBlock() {
performAction("Memory Map", "DockingWindows", true);
@@ -174,8 +177,8 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
captureDialog();
}
-@Test
- public void testMemoryExpandUp() {
+ @Test
+ public void testMemoryExpandUp() {
performAction("Memory Map", "DockingWindows", true);
@@ -193,8 +196,8 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
captureDialog();
}
-@Test
- public void testMemoryExpandDown() {
+ @Test
+ public void testMemoryExpandDown() {
performAction("Memory Map", "DockingWindows", true);
@@ -212,8 +215,8 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
captureDialog();
}
-@Test
- public void testSetImageBaseDialog() {
+ @Test
+ public void testSetImageBaseDialog() {
performAction("Memory Map", "DockingWindows", true);
@@ -234,55 +237,48 @@ public class MemoryMapPluginScreenShots extends GhidraScreenShotGenerator {
private void selectRow(final GhidraTable table, final String text) {
final TableModel model = table.getModel();
- runSwing(new Runnable() {
-
- @Override
- public void run() {
- int columnCount = model.getColumnCount();
- int columnIndex = -1;
- int rowIndex = -1;
- for (int i = 0; i < columnCount; i++) {
- if (model.getColumnName(i).equals("Name")) {
- columnIndex = i;
+ runSwing(() -> {
+ int columnCount = model.getColumnCount();
+ int columnIndex = -1;
+ int rowIndex = -1;
+ for (int i = 0; i < columnCount; i++) {
+ if (model.getColumnName(i).equals("Name")) {
+ columnIndex = i;
+ break;
+ }
+ }
+ if (columnIndex != -1) {
+ int rowCount = model.getRowCount();
+ for (int i = 0; i < rowCount; i++) {
+ if (model.getValueAt(i, columnIndex).equals(text)) {
+ rowIndex = i;
break;
}
}
- if (columnIndex != -1) {
- int rowCount = model.getRowCount();
- for (int i = 0; i < rowCount; i++) {
- if (model.getValueAt(i, columnIndex).equals(text)) {
- rowIndex = i;
- break;
- }
- }
- }
- if (rowIndex == -1) {
- throw new AssertException();
- }
- table.selectRow(rowIndex);
-
}
+ if (rowIndex == -1) {
+ throw new AssertException();
+ }
+ table.selectRow(rowIndex);
+
});
}
private void selectItem(final GhidraComboBox> comboBox, final String text) {
- runSwing(new Runnable() {
- @Override
- public void run() {
- int itemCount = comboBox.getItemCount();
- Object item = null;
- for (int i = 0; i < itemCount; i++) {
- Object itemAt = comboBox.getItemAt(i);
- if (itemAt.toString().equals(text)) {
- item = itemAt;
- break;
- }
+ runSwing(() -> {
+ int itemCount = comboBox.getItemCount();
+ Object item = null;
+ for (int i = 0; i < itemCount; i++) {
+ Object itemAt = comboBox.getItemAt(i);
+ if (itemAt.toString().equals(text)) {
+ item = itemAt;
+ break;
}
- if (item == null) {
- throw new AssertException();
- }
- comboBox.setSelectedItem(item);
}
+ if (item == null) {
+ throw new AssertException();
+ }
+ comboBox.setSelectedItem(item);
});
}
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemorySearchScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemorySearchScreenShots.java
index 5911fefa89..800d162147 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemorySearchScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/MemorySearchScreenShots.java
@@ -24,6 +24,7 @@ import org.junit.Test;
import docking.DialogComponentProvider;
import docking.action.DockingActionIf;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.plugin.core.searchmem.mask.MnemonicSearchPlugin;
@@ -168,9 +169,9 @@ public class MemorySearchScreenShots extends AbstractSearchScreenShots {
@Test
public void testSearchInstructions() {
Font font = new Font("Monospaced", Font.PLAIN, 14);
- Color selectionColor = new Color(180, 255, 180);
+ Color selectionColor = Palette.getColor("palegreen");
TextFormatter tf = new TextFormatter(font, 8, 500, 4, 5, 2);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE);
TextFormatterContext darkBlue = new TextFormatterContext(DARK_BLUE);
TextFormatterContext darkGreen = new TextFormatterContext(DARK_GREEN);
TextFormatterContext orange = new TextFormatterContext(YELLOW_ORANGE);
@@ -194,7 +195,7 @@ public class MemorySearchScreenShots extends AbstractSearchScreenShots {
public void testSearchInstructionsIncludeOperands() {
Font font = new Font("Monospaced", Font.PLAIN, 14);
TextFormatter tf = new TextFormatter(font, 4, 300, 4, 5, 2);
- TextFormatterContext blue = new TextFormatterContext(Color.BLUE);
+ TextFormatterContext blue = new TextFormatterContext(Palette.BLUE);
TextFormatterContext darkBlue = new TextFormatterContext(DARK_BLUE);
TextFormatterContext darkGreen = new TextFormatterContext(DARK_GREEN);
TextFormatterContext orange = new TextFormatterContext(YELLOW_ORANGE);
@@ -258,7 +259,7 @@ public class MemorySearchScreenShots extends AbstractSearchScreenShots {
performAction(action, provider, false);
// And capture the error dialog.
- Window errorDialog = waitForWindow("Mnemonic Search Error", 2000);
+ Window errorDialog = waitForWindow("Mnemonic Search Error");
captureWindow(errorDialog);
}
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java
index 6503c9df64..7b03cd72bd 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/OverviewPluginScreenShots.java
@@ -19,6 +19,8 @@ import java.awt.*;
import org.junit.Test;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.plugin.core.overview.OverviewColorLegendDialog;
import ghidra.app.plugin.core.overview.OverviewColorPlugin;
@@ -54,9 +56,9 @@ public class OverviewPluginScreenShots extends GhidraScreenShotGenerator {
});
captureIsolatedProvider(CodeViewerProvider.class, 700, 400);
- padImage(new Color(0, 0, 0, 0), 10, 0, 50, 0);
- drawOval(Color.RED, new Rectangle(630, 2, 40, 40), 3);
- drawOval(Color.RED, new Rectangle(668, 55, 40, 240), 3);
+ padImage(Palette.NO_COLOR, 10, 0, 50, 0);
+ drawOval(Palette.RED, new Rectangle(630, 2, 40, 40), 3);
+ drawOval(Palette.RED, new Rectangle(668, 55, 40, 240), 3);
}
@Test
@@ -126,18 +128,18 @@ public class OverviewPluginScreenShots extends GhidraScreenShotGenerator {
image = createEmptyImage(width + margin * 2, height + margin * 2);
Point p = new Point(margin, margin + smallFontHeight);
- drawText(sumTop, Color.BLACK, p, smallFont);
+ drawText(sumTop, Colors.FOREGROUND, p, smallFont);
p.y += bigMetrics.getAscent() - bigMetrics.getDescent() / 2;
- drawText(sum, Color.BLACK, p, bigFont);
+ drawText(sum, Colors.FOREGROUND, p, bigFont);
p.y += smallFontHeight;
- drawText(sumBottom, Color.BLACK, p, smallFont);
+ drawText(sumBottom, Colors.FOREGROUND, p, smallFont);
p.x += bigMetrics.stringWidth(sum);
p.y = margin + smallFontHeight + bigFontHeight / 2 + metrics.getHeight() / 2 -
bigMetrics.getDescent() / 2;
- drawText(equation, Color.BLACK, p, mediumFont);
+ drawText(equation, Colors.FOREGROUND, p, mediumFont);
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramGraphPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramGraphPluginScreenShots.java
index f05807334b..ab457a9702 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramGraphPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramGraphPluginScreenShots.java
@@ -15,11 +15,14 @@
*/
package help.screenshot;
-import java.awt.*;
+import java.awt.Point;
+import java.awt.Rectangle;
import org.junit.Test;
import docking.action.DockingActionIf;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.util.viewer.field.*;
import ghidra.graph.visualization.DefaultGraphDisplayComponentProvider;
@@ -110,9 +113,10 @@ public class ProgramGraphPluginScreenShots extends GhidraScreenShotGenerator {
Point p2 = new Point(STARTX + WIDTH, startY);
Point p3 = new Point(STARTX, endY);
Point p4 = new Point(STARTX + WIDTH, endY);
- drawLine(Color.BLACK, 3, p1, p2);
- drawLine(Color.BLACK, 3, p2, p4);
- drawLine(Color.BLACK, 3, p3, p4);
- drawText(string, Color.BLACK, new Point(STARTX + WIDTH + 10, (startY + endY) / 2), 12);
+ drawLine(Palette.BLACK, 3, p1, p2);
+ drawLine(Palette.BLACK, 3, p2, p4);
+ drawLine(Palette.BLACK, 3, p3, p4);
+ drawText(string, Colors.FOREGROUND, new Point(STARTX + WIDTH + 10, (startY + endY) / 2),
+ 12);
}
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java
index 26dd3b18f9..0593c26f14 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java
@@ -34,6 +34,7 @@ import docking.options.editor.OptionsDialog;
import docking.widgets.OptionDialog;
import docking.widgets.tree.GTree;
import docking.widgets.tree.GTreeNode;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.plugin.core.datamgr.DataTypesProvider;
import ghidra.app.plugin.core.progmgr.MultiTabPlugin;
@@ -49,7 +50,7 @@ import ghidra.program.model.listing.Program;
import ghidra.program.model.symbol.SourceType;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.TaskLauncher;
-import ghidra.util.task.TaskMonitorAdapter;
+import ghidra.util.task.TaskMonitor;
public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
implements CheckinHandler {
@@ -65,7 +66,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
createAndOpenPrograms(2, 1);
closeProvider(DataTypesProvider.class);
captureToolWindow(900, 400);
- drawOval(new Color(108, 0, 0), new Rectangle(280, 92, 190, 60), 8);
+ drawOval(Palette.PURPLE, new Rectangle(280, 92, 190, 60), 8);
}
@@ -113,7 +114,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
ProjectData projectData = project.getProjectData();
projectData.getRootFolder()
.createFile("WinHelloCpp.exe", program,
- TaskMonitorAdapter.DUMMY_MONITOR);
+ TaskMonitor.DUMMY);
DomainFile df = program.getDomainFile();
@@ -146,7 +147,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
runSwing(() -> invokeInstanceMethod("advancedButtonCallback", dialog));
captureDialog(850, 400);
- closeAllWindowsAndFrames();
+ closeAllWindows();
}
@Test
@@ -156,7 +157,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
performAction("Open File", "ProgramManagerPlugin", false);
captureDialog(500, 400);
- closeAllWindowsAndFrames();
+ closeAllWindows();
}
@@ -176,7 +177,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
rightClick(jTree, rowBounds.x + 25, rowBounds.y + 10);
waitForSwing();
captureDialog();
- closeAllWindowsAndFrames();
+ closeAllWindows();
}
@Test
@@ -231,7 +232,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
waitForSwing();
createAndOpenPrograms(6, 3);
captureProvider(CodeViewerProvider.class);
- drawOval(new Color(108, 0, 0), new Rectangle(440, 16, 70, 50), 8);
+ drawOval(Palette.PURPLE, new Rectangle(440, 16, 70, 50), 8);
}
@Test
@@ -273,7 +274,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
});
captureProvider(CodeViewerProvider.class);
- drawOval(new Color(108, 0, 0), new Rectangle(221, 16, 140, 50), 8);
+ drawOval(Palette.PURPLE, new Rectangle(221, 16, 140, 50), 8);
}
@Test
@@ -310,7 +311,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
String programName = "Program" + (i + 1) + ".exe";
list.add(projectData.getRootFolder()
.createFile(programName, program,
- TaskMonitorAdapter.DUMMY_MONITOR));
+ TaskMonitor.DUMMY));
}
program.flushEvents();
@@ -350,7 +351,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
TaskLauncher.launchModal(comment, () -> {
try {
domainFile.addToVersionControl(comment, keepItCheckedOut,
- TaskMonitorAdapter.DUMMY_MONITOR);
+ TaskMonitor.DUMMY);
}
catch (CancelledException | IOException e) {
throw new RuntimeException(e);
@@ -365,17 +366,11 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator
return space.getAddress(offset);
}
- /*
- * @see ghidra.framework.data.CheckinHandler#getComment()
- */
@Override
public String getComment() {
return checkinComment;
}
- /*
- * @see ghidra.framework.data.CheckinHandler#keepCheckedOut()
- */
@Override
public boolean keepCheckedOut() {
return keepCheckedOut;
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java
index d351aeb5a7..41d1476bfd 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ReferencesPluginScreenShots.java
@@ -25,6 +25,8 @@ import javax.swing.*;
import org.junit.Test;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.plugin.core.references.*;
import ghidra.app.util.importer.*;
@@ -84,19 +86,19 @@ public class ReferencesPluginScreenShots extends GhidraScreenShotGenerator {
captureProvider(provider);
int topMargin = 60;
int leftMargin = 10;
- padImage(Color.WHITE, topMargin, leftMargin, 10, 10);
+ padImage(Colors.BACKGROUND, topMargin, leftMargin, 10, 10);
JComponent rootComp = getDockableComponent(EditReferencesProvider.class);
JComponent comp =
(JComponent) findComponentByName(provider.getComponent(), "operandLabels[0]");
Point origin = new Point(leftMargin, topMargin);
- explainComponent(rootComp, comp, Color.GREEN, origin, new Point(250, 20),
+ explainComponent(rootComp, comp, Palette.GREEN, origin, new Point(250, 20),
"Operand-specific Drop Zones");
comp = (JComponent) findComponentByName(provider.getComponent(), "mnemonicLabel");
- explainComponent(rootComp, comp, Color.GREEN, origin, new Point(250, 20),
+ explainComponent(rootComp, comp, Palette.GREEN, origin, new Point(250, 20),
"Operand-specific Drop Zones");
comp = (JComponent) findComponentByName(provider.getComponent(), "RefsTable");
- explainComponent(rootComp, comp, Color.GREEN, origin, new Point(450, 40),
+ explainComponent(rootComp, comp, Palette.GREEN, origin, new Point(450, 40),
"Active-operand Drop Zones");
}
@@ -113,7 +115,7 @@ public class ReferencesPluginScreenShots extends GhidraScreenShotGenerator {
Point p2 = new Point(point.x + 20, point.y);
drawLine(color, 2, point, p2);
Point p3 = new Point(p2.x + 4, p2.y + 5);
- drawText(text, Color.BLACK, p3, 12f);
+ drawText(text, Colors.FOREGROUND, p3, 12f);
}
@Test
@@ -270,7 +272,7 @@ public class ReferencesPluginScreenShots extends GhidraScreenShotGenerator {
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2.drawImage(image1, 0, 0, null);
g2.drawImage(image2, 0, height + gap, null);
- g2.setColor(Color.BLACK);
+ g2.setColor(Colors.FOREGROUND);
String label = "Address History";
int x = 150;
int y = height + gap / 2;
@@ -293,8 +295,11 @@ public class ReferencesPluginScreenShots extends GhidraScreenShotGenerator {
programNameOverride, OptionChooser.DEFAULT_OPTIONS,
MultipleProgramsStrategy.ALL_PROGRAMS);
Program p = programs.get(0);
- env.getProject().getProjectData().getRootFolder().createFile(p.getName(), p,
- TaskMonitor.DUMMY);
+ env.getProject()
+ .getProjectData()
+ .getRootFolder()
+ .createFile(p.getName(), p,
+ TaskMonitor.DUMMY);
}
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryCustomScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryCustomScreenShots.java
index 8ff6735d58..f198fbac9a 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryCustomScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryCustomScreenShots.java
@@ -15,7 +15,7 @@
*/
package help.screenshot;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
import java.awt.*;
import java.awt.image.BufferedImage;
@@ -25,6 +25,7 @@ import javax.swing.*;
import org.junit.Test;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.merge.MergeProgressPanel;
import ghidra.util.layout.VerticalLayout;
import resources.ResourceManager;
@@ -38,8 +39,8 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
@Test
public void testMultiUser() {
image = createEmptyImage(800, 600);
- Color purple = new Color(255, 0, 255);
- Color green = new Color(100, 255, 100);
+ Color purple = Palette.getColor("fuchsia");
+ Color green = Palette.LIME;
int y = 50;
int x = 450;
int spacing = 100;
@@ -69,12 +70,12 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
Point p_leg3_text = new Point(p_leg3.x + indent, p_leg3.y);
drawLine(purple, p_v0, p_v3, false);
- drawLine(Color.BLACK, p_v1, p_co_v1, true);
- drawLine(Color.BLACK, p_v1, p_co_v2, true);
+ drawLine(Palette.BLACK, p_v1, p_co_v1, true);
+ drawLine(Palette.BLACK, p_v1, p_co_v2, true);
drawLine(green, p_co_v1, p_box1, false);
drawLine(green, p_box1, p_box2, false);
- drawLine(Color.BLUE, p_co_v2, p_v2, false);
- drawLine(Color.BLUE, p_box2, p_v3, false);
+ drawLine(Palette.BLUE, p_co_v2, p_v2, false);
+ drawLine(Palette.BLUE, p_box2, p_v3, false);
drawBubble("Version 0", null, p_v0);
drawBubble("Version 1", null, p_v1);
@@ -98,9 +99,9 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
drawText(p_leg1_text, -1, " Check Out");
drawText(p_leg2_text, -1, " Make changes and merge");
drawText(p_leg3_text, -1, " Create new version");
- drawLine(Color.BLACK, p_leg1, p_leg1_text, true);
+ drawLine(Palette.BLACK, p_leg1, p_leg1_text, true);
drawLine(green, p_leg2, p_leg2_text, false);
- drawLine(Color.BLUE, p_leg3, p_leg3_text, false);
+ drawLine(Palette.BLUE, p_leg3, p_leg3_text, false);
}
private void drawLine(Color color, Point p1, Point p2, boolean dashed) {
@@ -130,7 +131,7 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
g.setFont(f);
FontMetrics metrics = g.getFontMetrics();
int height = metrics.getHeight();
- g.setColor(Color.BLACK);
+ g.setColor(Palette.BLACK);
g.drawOval(x, y, radius * 2, radius * 2);
if (text2 == null) {
@@ -168,7 +169,7 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
int y = p.y - height / 2;
g.fillRect(x, y, width, height);
- g.setColor(Color.BLACK);
+ g.setColor(Palette.BLACK);
g.drawRect(x, y, width, height);
y += margin;
@@ -203,7 +204,7 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
// int y = p.y - height / 2;
// g.fillRect(x, y, width, height);
- g.setColor(Color.BLACK);
+ g.setColor(Palette.BLACK);
int y = p.y - height / 2;
int x = p.x;
@@ -221,7 +222,7 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
@Test
public void testAutoMergeCodeUnits() {
- closeAllWindowsAndFrames();
+ closeAllWindows();
final MergeProgressPanel panel = new MergeProgressPanel();
final String[] MEMORY = new String[] { "Memory" };
@@ -249,18 +250,14 @@ public class RepositoryCustomScreenShots extends GhidraScreenShotGenerator {
panel.addInfo(EXTERNAL_PROGRAM);
panel.addInfo(PROPERTY_LIST);
- runSwing(new Runnable() {
-
- @Override
- public void run() {
- panel.setCompleted(MEMORY);
- panel.setCompleted(PROGRAM_TREE);
- panel.setCompleted(DATA_TYPES);
- panel.setCompleted(PROGRAM_CONTEXT);
- panel.setCompleted(LISTING);
- panel.setCompleted(BYTES);
- panel.setInProgress(FUNCTIONS);
- }
+ runSwing(() -> {
+ panel.setCompleted(MEMORY);
+ panel.setCompleted(PROGRAM_TREE);
+ panel.setCompleted(DATA_TYPES);
+ panel.setCompleted(PROGRAM_CONTEXT);
+ panel.setCompleted(LISTING);
+ panel.setCompleted(BYTES);
+ panel.setInProgress(FUNCTIONS);
});
JPanel mainPanel = new JPanel(new VerticalLayout(20));
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryScreenShots.java
index b818842fc7..e0ae764585 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/RepositoryScreenShots.java
@@ -28,6 +28,7 @@ import org.junit.*;
import docking.widgets.indexedscrollpane.IndexedScrollPane;
import generic.test.TestUtils;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.cmd.function.AddRegisterParameterCommand;
import ghidra.app.merge.*;
import ghidra.app.merge.listing.*;
@@ -71,7 +72,8 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
public void setUp() throws Exception {
super.setUp();
String testFilename = getClass().getSimpleName().replace(".class", "");
- mtfGenerator = new MergeScreenShotGenerator(testFilename, testName.getMethodName(), mtf, testName);
+ mtfGenerator =
+ new MergeScreenShotGenerator(testFilename, testName.getMethodName(), mtf, testName);
env = mtf.getTestEnvironment();
}
@@ -150,7 +152,7 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
Container namePanel = (Container) TestUtils.getInstanceField("namePanel", memoryMergePanel);
setToolSize(600, 450);
Window window = mergeTool.getActiveWindow();
-
+
mtfGenerator.captureComponent(window);
// chooseRadioButton(MergeConstants.MY_TITLE, namePanel.getClass(), false);
@@ -642,13 +644,13 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int arrowHead2Y = lock3Y;
int description1Y = arrowTailY - 10;
int description2Y = arrowTailY + 10;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowTailY),
new Point(arrowHeadX, arrowHead1Y), 8);
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowTailY),
new Point(arrowHeadX, arrowHead2Y), 8);
- mtfGenerator.drawText(description1, Color.RED, new Point(descriptionX, description1Y),
+ mtfGenerator.drawText(description1, Palette.RED, new Point(descriptionX, description1Y),
DESCRIPTION_FONT_SIZE);
- mtfGenerator.drawText(description2, Color.RED, new Point(descriptionX, description2Y),
+ mtfGenerator.drawText(description2, Palette.RED, new Point(descriptionX, description2Y),
DESCRIPTION_FONT_SIZE);
}
@@ -661,7 +663,7 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
Dimension size = listingPanels[0].getSize();
int descriptionX = listingX + (size.width / 3);
int descriptionY = listingY + size.height - 20;
- mtfGenerator.drawText(greyListingDescription, Color.RED,
+ mtfGenerator.drawText(greyListingDescription, Palette.RED,
new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
}
@@ -690,9 +692,9 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int arrowHeadY = buttonY;
int arrowTailY = buttonY;
int descriptionY = buttonY + 5;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowTailY),
new Point(arrowHeadX, arrowHeadY), 8);
- mtfGenerator.drawText(adjustFieldsDescription, Color.RED,
+ mtfGenerator.drawText(adjustFieldsDescription, Palette.RED,
new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
}
@@ -711,11 +713,11 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int arrowHeadY = westLabelBottomY;
int arrowTailY = westLabelBottomY + 15;
int descriptionY = westLabelBottomY + 20;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowTailY),
new Point(arrowHeadX, arrowTailY), 0);
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowHeadX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowHeadX, arrowTailY),
new Point(arrowHeadX, arrowHeadY), 8);
- mtfGenerator.drawText("Indicates which conflict you are resolving.", Color.RED,
+ mtfGenerator.drawText("Indicates which conflict you are resolving.", Palette.RED,
new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
}
@@ -734,9 +736,9 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int arrowHeadY = eastLabelY - 10;
int arrowTailY = arrowHeadY - 30;
int descriptionY = arrowTailY - 5;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowHeadX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowHeadX, arrowTailY),
new Point(arrowHeadX, arrowHeadY), 8);
- mtfGenerator.drawText(addressRangeDescription, Color.RED,
+ mtfGenerator.drawText(addressRangeDescription, Palette.RED,
new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
}
@@ -744,7 +746,7 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
Graphics g = image.getGraphics();
Font font = g.getFont();
g.setFont(font.deriveFont(DESCRIPTION_FONT_SIZE));
- g.setColor(Color.RED);
+ g.setColor(Palette.RED);
FontMetrics fontMetrics = g.getFontMetrics(font.deriveFont(DESCRIPTION_FONT_SIZE));
int descriptionWidth = fontMetrics.stringWidth(description);
return descriptionWidth;
@@ -763,9 +765,9 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int westLabelY = westLabelLocation.y - windowLocationOnScreen.y;
int arrowY = westLabelY + 5;
int descriptionY = arrowY;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowY),
new Point(arrowHeadX, arrowY), 8);
- mtfGenerator.drawText("Indicates the address(es) in conflict.", Color.RED,
+ mtfGenerator.drawText("Indicates the address(es) in conflict.", Palette.RED,
new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
}
@@ -783,9 +785,9 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int arrowTailY = endTitleTextY - 5;
int arrowHeadY = endTitleTextY + 5;
int descriptionY = endTitleTextY;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowTailY),
new Point(arrowHeadX, arrowHeadY), 8);
- mtfGenerator.drawText("Type of conflict to resolve.", Color.RED,
+ mtfGenerator.drawText("Type of conflict to resolve.", Palette.RED,
new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
}
@@ -794,9 +796,9 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
Point variousChoicesLocation = variousChoicesPanel.getLocationOnScreen();
int conflictAreaX = variousChoicesLocation.x - windowLocationOnScreen.x;
int conflictAreaY = variousChoicesLocation.y - windowLocationOnScreen.y;
- mtfGenerator.drawText("Area indicating the specific information", Color.RED,
+ mtfGenerator.drawText("Area indicating the specific information", Palette.RED,
new Point(conflictAreaX + 20, conflictAreaY + 40), DESCRIPTION_FONT_SIZE);
- mtfGenerator.drawText("for the current conflict(s) being resolved.", Color.RED,
+ mtfGenerator.drawText("for the current conflict(s) being resolved.", Palette.RED,
new Point(conflictAreaX + 20, conflictAreaY + 60), DESCRIPTION_FONT_SIZE);
}
@@ -816,11 +818,11 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int arrowTailY = radioButtonY - 10;
int description1Y = radioButtonY - 20;
int description2Y = radioButtonY;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowTailY),
new Point(arrowHeadX, arrowHeadY), 8);
- mtfGenerator.drawText("Radio buttons or check boxes to", Color.RED,
+ mtfGenerator.drawText("Radio buttons or check boxes to", Palette.RED,
new Point(descriptionX, description1Y), DESCRIPTION_FONT_SIZE);
- mtfGenerator.drawText("select for resolving the conflict(s).", Color.RED,
+ mtfGenerator.drawText("select for resolving the conflict(s).", Palette.RED,
new Point(descriptionX, description2Y), DESCRIPTION_FONT_SIZE);
}
@@ -838,11 +840,11 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int checkBoxHeight = useForAllCB.getSize().height;
int arrowY = useForAllY + (checkBoxHeight / 2);
int descriptionY = useForAllY + 15;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowY),
new Point(arrowHeadX, arrowY), 8);
mtfGenerator.drawText(
"Check this box to automatically make the same choice for all remaining conflicts like this one.",
- Color.RED, new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
+ Palette.RED, new Point(descriptionX, descriptionY), DESCRIPTION_FONT_SIZE);
}
private void addApplyDescription(Image image, Point windowLocationOnScreen,
@@ -863,11 +865,11 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int arrowHeadY = applyButtonY + 10;
int description1Y = applyButtonY + 5;
int description2Y = description1Y + 20;
- mtfGenerator.drawArrow(Color.RED, 2, new Point(arrowTailX, arrowTailY),
+ mtfGenerator.drawArrow(Palette.RED, 2, new Point(arrowTailX, arrowTailY),
new Point(arrowHeadX, arrowHeadY), 8);
- mtfGenerator.drawText(description1, Color.RED, new Point(descriptionX, description1Y),
+ mtfGenerator.drawText(description1, Palette.RED, new Point(descriptionX, description1Y),
DESCRIPTION_FONT_SIZE);
- mtfGenerator.drawText(description2, Color.RED, new Point(descriptionX, description2Y),
+ mtfGenerator.drawText(description2, Palette.RED, new Point(descriptionX, description2Y),
DESCRIPTION_FONT_SIZE);
}
@@ -2409,8 +2411,9 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int txId = program.startTransaction("Modify Original Program");
boolean commit = false;
try {
- program.getExternalManager().setExternalPath("ADVAPI32.DLL", "//advapi32.dll",
- true);
+ program.getExternalManager()
+ .setExternalPath("ADVAPI32.DLL", "//advapi32.dll",
+ true);
commit = true;
}
finally {
@@ -2465,8 +2468,9 @@ public class RepositoryScreenShots extends AbstractListingMergeManagerTest {
int txId = program.startTransaction("Modify Original Program");
boolean commit = false;
try {
- program.getExternalManager().setExternalPath("ADVAPI32.DLL", "//advapi32.dll",
- true);
+ program.getExternalManager()
+ .setExternalPath("ADVAPI32.DLL", "//advapi32.dll",
+ true);
commit = true;
}
finally {
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ShowInstructionInfoPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ShowInstructionInfoPluginScreenShots.java
index e6a485404f..ed26a0326e 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ShowInstructionInfoPluginScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ShowInstructionInfoPluginScreenShots.java
@@ -27,6 +27,7 @@ import docking.*;
import docking.widgets.fieldpanel.FieldPanel;
import docking.widgets.fieldpanel.Layout;
import docking.widgets.fieldpanel.field.Field;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.plugin.core.codebrowser.CodeViewerProvider;
import ghidra.app.plugin.core.datamgr.DataTypesProvider;
@@ -93,11 +94,11 @@ public class ShowInstructionInfoPluginScreenShots extends GhidraScreenShotGenera
Rectangle shapeBounds = new Rectangle(location, labelSize);
int thickness = 5;
- drawRectangle(Color.RED, shapeBounds, thickness);
+ drawRectangle(Palette.RED, shapeBounds, thickness);
Point start = getEndOfRow(cb, listingPanel, window);
Point end = new Point(location.x, location.y);
- drawLine(Color.RED, thickness, start, end);
+ drawLine(Palette.RED, thickness, start, end);
cropListingWithStatusArea();
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TextFormatter.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TextFormatter.java
index 2faf062de3..8a74630ae3 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TextFormatter.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TextFormatter.java
@@ -20,6 +20,9 @@ import java.awt.image.BufferedImage;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Palette;
+
/**
* Each line is sized based on the font height and line padding on the top and bottom of the line.
* The y coordinate tracks the top of the line, so a lines baseline (position to draw the text)
@@ -37,7 +40,7 @@ public class TextFormatter {
private int y;
private int leftMargin;
private int baselineOffset;
- private TextFormatterContext defaultContext = new TextFormatterContext(Color.BLACK);
+ private TextFormatterContext defaultContext = new TextFormatterContext(Colors.FOREGROUND);
private int width;
@@ -65,9 +68,9 @@ public class TextFormatter {
int height = lineCount * (lineHeight) + topMargin * 2;
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
- g.setColor(Color.WHITE);
+ g.setColor(Colors.BACKGROUND);
g.fillRect(0, 0, width, height);
- g.setColor(Color.black);
+ g.setColor(Palette.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
g.dispose();
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ThemingScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ThemingScreenShots.java
new file mode 100644
index 0000000000..8900ad526e
--- /dev/null
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ThemingScreenShots.java
@@ -0,0 +1,68 @@
+/* ###
+ * 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 help.screenshot;
+
+import java.awt.Font;
+
+import org.junit.Test;
+
+import docking.theme.gui.*;
+import generic.theme.*;
+import generic.theme.GThemeDefaults.Colors.Palette;
+import resources.ResourceManager;
+
+public class ThemingScreenShots extends GhidraScreenShotGenerator {
+
+ public ThemingScreenShots() {
+ super();
+ }
+
+ @Test
+ public void testThemeDialog() {
+ showDialogWithoutBlocking(tool, new ThemeDialog());
+ captureDialog(1000, 500);
+ }
+
+ @Test
+ public void testColorEditor() {
+ ColorValueEditor editor = new ColorValueEditor(e -> {
+ /**/});
+ ColorValue value = new ColorValue("color.bg.test", Palette.BLUE);
+ Gui.setColor(value);
+ editor.editValue(value);
+ captureDialog();
+ }
+
+ @Test
+ public void testFontEditor() {
+ FontValueEditor editor = new FontValueEditor(e -> {
+ /**/});
+ FontValue value = new FontValue("font.xyz", new Font("Monospaced", Font.BOLD, 14));
+ Gui.setFont(value);
+ editor.editValue(value);
+ captureDialog();
+ }
+
+ @Test
+ public void testIconEditor() {
+ IconValueEditor editor = new IconValueEditor(e -> {
+ /**/});
+ IconValue value = new IconValue("icon.bomb", ResourceManager.getDefaultIcon());
+ Gui.setIcon(value);
+ editor.editValue(value);
+ captureDialog();
+ }
+}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ToolScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ToolScreenShots.java
index 5d7ae7c6d0..7f82a95cb2 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ToolScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ToolScreenShots.java
@@ -36,6 +36,9 @@ import docking.tool.ToolConstants;
import docking.widgets.OptionDialog;
import docking.widgets.table.GTable;
import generic.jar.ResourceFile;
+import generic.theme.GThemeDefaults.Colors;
+import generic.theme.GThemeDefaults.Colors.Java;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.Application;
import ghidra.framework.LoggingInitialization;
import ghidra.framework.cmd.BackgroundCommand;
@@ -135,11 +138,12 @@ public class ToolScreenShots extends GhidraScreenShotGenerator {
tool.executeBackgroundCommand(new DummyBackgroundCommand(), program);
Border inner = BorderFactory.createRaisedBevelBorder();
- Border outer = BorderFactory.createLineBorder(Color.BLACK);
+ Border outer = BorderFactory.createLineBorder(Java.BORDER);
statusBar.setBorder(BorderFactory.createCompoundBorder(outer, inner));
captureComponent(statusBar);
program.endTransaction(id, false);
- padImage(Color.WHITE, topBottomMargin, leftRightMargin, leftRightMargin, topBottomMargin);
+ padImage(Colors.FOREGROUND, topBottomMargin, leftRightMargin, leftRightMargin,
+ topBottomMargin);
JComponent statusLabel = (JComponent) getInstanceField("statusLabel", statusBar);
Font font = new Font("Ariel", Font.PLAIN, 12);
@@ -184,8 +188,9 @@ public class ToolScreenShots extends GhidraScreenShotGenerator {
int arrowX = bounds.x + bounds.width / 2 + leftMargin;
int arrowStartY = textY - metrics.getHeight() - 5;
int arrowEndY = height - topMargin;
- drawText(label, Color.BLACK, new Point(textX, textY), font);
- drawArrow(Color.BLACK, 1, new Point(arrowX, arrowStartY), new Point(arrowX, arrowEndY), 9);
+ drawText(label, Colors.FOREGROUND, new Point(textX, textY), font);
+ drawArrow(Palette.BLACK, 1, new Point(arrowX, arrowStartY), new Point(arrowX, arrowEndY),
+ 9);
}
private void labelTop(String label, Rectangle bounds, Font font, FontMetrics metrics,
@@ -195,8 +200,9 @@ public class ToolScreenShots extends GhidraScreenShotGenerator {
int arrowX = bounds.x + bounds.width / 2 + leftMargin;
int arrowStartY = textY + 5;
int arrowEndY = topMargin;
- drawText(label, Color.BLACK, new Point(textX, textY), font);
- drawArrow(Color.BLACK, 1, new Point(arrowX, arrowStartY), new Point(arrowX, arrowEndY), 9);
+ drawText(label, Colors.FOREGROUND, new Point(textX, textY), font);
+ drawArrow(Palette.BLACK, 1, new Point(arrowX, arrowStartY), new Point(arrowX, arrowEndY),
+ 9);
}
private int getTextStart(Rectangle bounds, FontMetrics metrics, String string) {
@@ -261,7 +267,7 @@ public class ToolScreenShots extends GhidraScreenShotGenerator {
captureDialog();
JButton button = findButtonByText(window, "Restore Defaults");
- drawRectangleWithDropShadowAround(button, Color.GREEN, 2);
+ drawRectangleWithDropShadowAround(button, Palette.GREEN, 2);
crop(new Rectangle(0, 200, 700, 150));
}
diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TreesScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TreesScreenShots.java
index fa7898a400..951b02b580 100644
--- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TreesScreenShots.java
+++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/TreesScreenShots.java
@@ -15,7 +15,8 @@
*/
package help.screenshot;
-import java.awt.*;
+import java.awt.Component;
+import java.awt.Rectangle;
import java.util.Arrays;
import javax.swing.*;
@@ -38,6 +39,7 @@ import docking.widgets.table.constrainteditor.ColumnConstraintEditor;
import docking.widgets.table.constrainteditor.IntegerConstraintEditor;
import docking.widgets.table.threaded.ThreadedTableModel;
import docking.widgets.tree.*;
+import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.datamgr.DataTypesProvider;
import ghidra.app.plugin.core.datamgr.tree.DataTypeArchiveGTree;
import ghidra.app.plugin.core.functionwindow.FunctionWindowProvider;
@@ -182,7 +184,7 @@ public class TreesScreenShots extends GhidraScreenShotGenerator {
int x = rectangle.x + rectangle.width - (width - padding) - iconPadding;
int y = rectangle.y - padding;
Rectangle shapeBounds = new Rectangle(x, y, width, height);
- drawOval(Color.GREEN.darker(), shapeBounds, thickness);
+ drawOval(Palette.GREEN, shapeBounds, thickness);
}
diff --git a/gradle/helpProject.gradle b/gradle/helpProject.gradle
index 7f1794b400..a75989f6d7 100644
--- a/gradle/helpProject.gradle
+++ b/gradle/helpProject.gradle
@@ -132,6 +132,8 @@ task buildHelp(type: JavaExec, dependsOn: indexHelp) {
group rootProject.GHIDRA_GROUP
description " Builds the help for this module. [gradle/helpProject.gradle]\n"
+ outputs.upToDateWhen {false}
+
File helpRootDir = file('src/main/help/help')
File outputDir = file('build/help/main/help')