GP-1981 Moved Most Theming classes from Docking to Generic module

This commit is contained in:
ghidragon 2022-08-08 12:53:34 -04:00
parent d588daaca6
commit b4d2271474
153 changed files with 466 additions and 333 deletions

View file

@ -18,7 +18,7 @@ package ghidra;
import java.awt.Color; import java.awt.Color;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import docking.theme.GColor; import generic.theme.GColor;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
/** /**

View file

@ -26,11 +26,11 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.theme.GColor;
import docking.widgets.fieldpanel.*; import docking.widgets.fieldpanel.*;
import docking.widgets.fieldpanel.field.Field; import docking.widgets.fieldpanel.field.Field;
import docking.widgets.fieldpanel.support.FieldLocation; import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.FieldSelection; import docking.widgets.fieldpanel.support.FieldSelection;
import generic.theme.GColor;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.app.events.ProgramHighlightPluginEvent; import ghidra.app.events.ProgramHighlightPluginEvent;
import ghidra.app.events.ProgramSelectionPluginEvent; import ghidra.app.events.ProgramSelectionPluginEvent;

View file

@ -26,10 +26,10 @@ import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import docking.theme.GColor;
import docking.widgets.fieldpanel.field.FieldElement; import docking.widgets.fieldpanel.field.FieldElement;
import docking.widgets.fieldpanel.support.FieldLocation; import docking.widgets.fieldpanel.support.FieldLocation;
import docking.widgets.fieldpanel.support.Highlight; import docking.widgets.fieldpanel.support.Highlight;
import generic.theme.GColor;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES; import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES;
import ghidra.app.plugin.processors.generic.PcodeFieldFactory; import ghidra.app.plugin.processors.generic.PcodeFieldFactory;

View file

@ -18,8 +18,8 @@ package ghidra.app.plugin.core.codebrowser;
import java.awt.Color; import java.awt.Color;
import java.math.BigInteger; import java.math.BigInteger;
import docking.theme.GColor;
import docking.widgets.fieldpanel.support.BackgroundColorModel; import docking.widgets.fieldpanel.support.BackgroundColorModel;
import generic.theme.GColor;
import ghidra.app.services.MarkerService; import ghidra.app.services.MarkerService;
import ghidra.app.util.viewer.listingpanel.ListingBackgroundColorModel; import ghidra.app.util.viewer.listingpanel.ListingBackgroundColorModel;
import ghidra.app.util.viewer.listingpanel.ListingPanel; import ghidra.app.util.viewer.listingpanel.ListingPanel;

View file

@ -19,8 +19,8 @@ import java.awt.*;
import javax.swing.Icon; import javax.swing.Icon;
import docking.theme.GColor; import generic.theme.GColor;
import docking.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
class BackgroundIcon implements Icon { class BackgroundIcon implements Icon {

View file

@ -28,7 +28,7 @@ import javax.swing.text.*;
import docking.DockingUtils; import docking.DockingUtils;
import docking.actions.KeyBindingUtils; import docking.actions.KeyBindingUtils;
import docking.theme.GColor; import generic.theme.GColor;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.app.plugin.core.console.CodeCompletion; import ghidra.app.plugin.core.console.CodeCompletion;
import ghidra.framework.options.OptionsChangeListener; import ghidra.framework.options.OptionsChangeListener;

View file

@ -26,12 +26,12 @@ import javax.swing.*;
import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelEvent;
import docking.action.builder.ActionBuilder; import docking.action.builder.ActionBuilder;
import docking.theme.GColor;
import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooser;
import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.filechooser.GhidraFileChooserMode;
import docking.widgets.table.GTable; import docking.widgets.table.GTable;
import docking.widgets.table.GTableFilterPanel; import docking.widgets.table.GTableFilterPanel;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import generic.theme.GColor;
import generic.util.Path; import generic.util.Path;
import ghidra.app.services.ConsoleService; import ghidra.app.services.ConsoleService;
import ghidra.framework.plugintool.ComponentProviderAdapter; import ghidra.framework.plugintool.ComponentProviderAdapter;

View file

@ -27,9 +27,9 @@ import javax.swing.event.TableModelEvent;
import org.osgi.framework.Bundle; import org.osgi.framework.Bundle;
import docking.theme.GColor;
import docking.widgets.table.*; import docking.widgets.table.*;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import generic.theme.GColor;
import generic.util.Path; import generic.util.Path;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;

View file

@ -22,8 +22,8 @@ import java.util.*;
import javax.swing.*; import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeCellRenderer;
import docking.theme.GColor;
import docking.widgets.GComponent; import docking.widgets.GComponent;
import generic.theme.GColor;
import ghidra.program.model.listing.Group; import ghidra.program.model.listing.Group;
import resources.ResourceManager; import resources.ResourceManager;

View file

@ -22,9 +22,9 @@ import javax.swing.*;
import docking.*; import docking.*;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import generic.util.action.ReservedKeyBindings;
import ghidra.framework.plugintool.Plugin; import ghidra.framework.plugintool.Plugin;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.ReservedKeyBindings;
class KeyBindingInputDialog extends DialogComponentProvider implements KeyEntryListener { class KeyBindingInputDialog extends DialogComponentProvider implements KeyEntryListener {
private KeyEntryTextField kbField; private KeyEntryTextField kbField;

View file

@ -17,7 +17,7 @@ package ghidra.app.util;
import java.awt.Color; import java.awt.Color;
import docking.theme.GColor; import generic.theme.GColor;
/** /**
* Miscellaneous defined constants * Miscellaneous defined constants

View file

@ -20,8 +20,8 @@ import java.math.BigInteger;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import docking.theme.GColor;
import docking.widgets.fieldpanel.support.BackgroundColorModel; import docking.widgets.fieldpanel.support.BackgroundColorModel;
import generic.theme.GColor;
import ghidra.app.util.viewer.util.AddressIndexMap; import ghidra.app.util.viewer.util.AddressIndexMap;
import ghidra.framework.model.DomainObjectChangedEvent; import ghidra.framework.model.DomainObjectChangedEvent;
import ghidra.framework.model.DomainObjectListener; import ghidra.framework.model.DomainObjectListener;

View file

@ -27,7 +27,6 @@ import java.util.stream.IntStream;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.Border; import javax.swing.border.Border;
import docking.theme.GColor;
import docking.widgets.checkbox.GCheckBox; import docking.widgets.checkbox.GCheckBox;
import docking.widgets.combobox.GComboBox; import docking.widgets.combobox.GComboBox;
import docking.widgets.fieldpanel.*; import docking.widgets.fieldpanel.*;
@ -36,6 +35,7 @@ import docking.widgets.fieldpanel.listener.LayoutModelListener;
import docking.widgets.fieldpanel.support.*; import docking.widgets.fieldpanel.support.*;
import docking.widgets.indexedscrollpane.IndexedScrollPane; import docking.widgets.indexedscrollpane.IndexedScrollPane;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.GColor;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;

View file

@ -24,6 +24,8 @@ import javax.help.HelpSetException;
import docking.help.*; import docking.help.*;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import generic.theme.Gui;
import generic.theme.ThemeListener;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.util.Msg; import ghidra.util.Msg;
import help.HelpService; import help.HelpService;
@ -36,6 +38,7 @@ import resources.ResourceManager;
public class GhidraHelpService extends HelpManager { public class GhidraHelpService extends HelpManager {
private static final String MASTER_HELP_SET_HS = "Base_HelpSet.hs"; private static final String MASTER_HELP_SET_HS = "Base_HelpSet.hs";
private ThemeListener listener = t -> reload();
public static void install() { public static void install() {
try { try {
@ -50,6 +53,7 @@ public class GhidraHelpService extends HelpManager {
super(findMasterHelpSetUrl()); super(findMasterHelpSetUrl());
loadHelpSets(); loadHelpSets();
registerHelp(); registerHelp();
Gui.addThemeListener(listener);
} }
private static URL findMasterHelpSetUrl() { private static URL findMasterHelpSetUrl() {

View file

@ -19,8 +19,9 @@ import docking.DockingErrorDisplay;
import docking.DockingWindowManager; import docking.DockingWindowManager;
import docking.framework.ApplicationInformationDisplayFactory; import docking.framework.ApplicationInformationDisplayFactory;
import docking.framework.SplashScreen; import docking.framework.SplashScreen;
import docking.theme.Gui;
import docking.widgets.PopupKeyStorePasswordProvider; import docking.widgets.PopupKeyStorePasswordProvider;
import generic.theme.Gui;
import ghidra.docking.util.LookAndFeelUtils;
import ghidra.formats.gfilesystem.crypto.CryptoProviders; import ghidra.formats.gfilesystem.crypto.CryptoProviders;
import ghidra.formats.gfilesystem.crypto.PopupGUIPasswordProvider; import ghidra.formats.gfilesystem.crypto.PopupGUIPasswordProvider;
import ghidra.framework.main.GhidraApplicationInformationDisplayFactory; import ghidra.framework.main.GhidraApplicationInformationDisplayFactory;
@ -43,6 +44,7 @@ public class GhidraApplicationConfiguration extends HeadlessGhidraApplicationCon
@Override @Override
protected void initializeApplication() { protected void initializeApplication() {
Gui.initialize(); Gui.initialize();
LookAndFeelUtils.platformSpecificFixups();
if (showSplashScreen) { if (showSplashScreen) {
showUserAgreement(); showUserAgreement();
@ -51,8 +53,8 @@ public class GhidraApplicationConfiguration extends HeadlessGhidraApplicationCon
super.initializeApplication(); super.initializeApplication();
ApplicationKeyManagerFactory.setKeyStorePasswordProvider( ApplicationKeyManagerFactory
new PopupKeyStorePasswordProvider()); .setKeyStorePasswordProvider(new PopupKeyStorePasswordProvider());
CryptoProviders.getInstance().registerCryptoProvider(new PopupGUIPasswordProvider()); CryptoProviders.getInstance().registerCryptoProvider(new PopupGUIPasswordProvider());
} }

View file

@ -21,7 +21,7 @@ import java.util.LinkedList;
import javax.swing.JTextPane; import javax.swing.JTextPane;
import javax.swing.text.*; import javax.swing.text.*;
import docking.theme.GColor; import generic.theme.GColor;
import ghidra.framework.options.*; import ghidra.framework.options.*;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.util.Msg; import ghidra.util.Msg;

View file

@ -25,9 +25,9 @@ import javax.swing.event.HyperlinkEvent;
import javax.swing.text.View; import javax.swing.text.View;
import docking.DockingUtils; import docking.DockingUtils;
import docking.theme.GColor;
import docking.widgets.*; import docking.widgets.*;
import docking.widgets.label.*; import docking.widgets.label.*;
import generic.theme.GColor;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.framework.ApplicationProperties; import ghidra.framework.ApplicationProperties;

View file

@ -21,8 +21,8 @@ import java.awt.Font;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.table.TableModel; import javax.swing.table.TableModel;
import docking.theme.GColor;
import docking.widgets.table.GTableCellRenderer; import docking.widgets.table.GTableCellRenderer;
import generic.theme.GColor;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.mem.Memory; import ghidra.program.model.mem.Memory;

View file

@ -25,7 +25,7 @@ import java.util.List;
import javax.swing.JComponent; import javax.swing.JComponent;
import docking.action.ToggleDockingAction; import docking.action.ToggleDockingAction;
import docking.theme.GColor; import generic.theme.GColor;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES; import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES;
import ghidra.app.plugin.core.format.*; import ghidra.app.plugin.core.format.*;

View file

@ -23,7 +23,7 @@ import java.util.List;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.*; import javax.swing.event.*;
import docking.theme.GColor; import docking.help.HelpService;
import docking.widgets.fieldpanel.*; import docking.widgets.fieldpanel.*;
import docking.widgets.fieldpanel.field.EmptyTextField; import docking.widgets.fieldpanel.field.EmptyTextField;
import docking.widgets.fieldpanel.field.Field; import docking.widgets.fieldpanel.field.Field;
@ -32,6 +32,7 @@ import docking.widgets.fieldpanel.support.*;
import docking.widgets.indexedscrollpane.*; import docking.widgets.indexedscrollpane.*;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import generic.theme.GColor;
import ghidra.app.plugin.core.format.*; import ghidra.app.plugin.core.format.*;
import ghidra.app.util.viewer.listingpanel.AddressSetDisplayListener; import ghidra.app.util.viewer.listingpanel.AddressSetDisplayListener;
import ghidra.program.model.address.AddressSet; import ghidra.program.model.address.AddressSet;
@ -42,7 +43,6 @@ import ghidra.util.exception.InvalidInputException;
import ghidra.util.layout.HorizontalLayout; import ghidra.util.layout.HorizontalLayout;
import ghidra.util.layout.PairLayout; import ghidra.util.layout.PairLayout;
import help.Help; import help.Help;
import help.HelpService;
/** /**
* Top level component that contains has a scrolled pane for the panel of components that show the * Top level component that contains has a scrolled pane for the panel of components that show the

View file

@ -24,7 +24,7 @@ import java.awt.Font;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.io.IOException; import java.io.IOException;
import docking.theme.GColor; import generic.theme.GColor;
import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES; import ghidra.GhidraOptions.CURSOR_MOUSE_BUTTON_NAMES;
import ghidra.app.util.HelpTopics; import ghidra.app.util.HelpTopics;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;

View file

@ -24,7 +24,7 @@ import org.jdom.Element;
import docking.ComponentPlaceholder; import docking.ComponentPlaceholder;
import docking.DockingWindowManager; import docking.DockingWindowManager;
import docking.options.editor.GhidraColorChooser; import docking.options.editor.GhidraColorChooser;
import docking.theme.GColor; import generic.theme.GColor;
import ghidra.app.plugin.core.functiongraph.graph.vertex.FGVertex; import ghidra.app.plugin.core.functiongraph.graph.vertex.FGVertex;
import ghidra.app.plugin.core.functiongraph.mvc.FunctionGraphVertexAttributes; import ghidra.app.plugin.core.functiongraph.mvc.FunctionGraphVertexAttributes;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;

View file

@ -21,12 +21,12 @@ import java.util.Map.Entry;
import org.jdom.Element; import org.jdom.Element;
import docking.theme.GColor;
import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.visualization.RenderContext; import edu.uci.ics.jung.visualization.RenderContext;
import edu.uci.ics.jung.visualization.picking.PickedState; import edu.uci.ics.jung.visualization.picking.PickedState;
import edu.uci.ics.jung.visualization.renderers.Renderer; import edu.uci.ics.jung.visualization.renderers.Renderer;
import edu.uci.ics.jung.visualization.util.Caching; import edu.uci.ics.jung.visualization.util.Caching;
import generic.theme.GColor;
import ghidra.app.plugin.core.functiongraph.graph.jung.renderer.FGVertexRenderer; import ghidra.app.plugin.core.functiongraph.graph.jung.renderer.FGVertexRenderer;
import ghidra.app.plugin.core.functiongraph.graph.jung.transformer.FGVertexPickableBackgroundPaintTransformer; import ghidra.app.plugin.core.functiongraph.graph.jung.transformer.FGVertexPickableBackgroundPaintTransformer;
import ghidra.app.plugin.core.functiongraph.graph.layout.FGLayout; import ghidra.app.plugin.core.functiongraph.graph.layout.FGLayout;

View file

@ -21,8 +21,8 @@ import java.util.Objects;
import com.google.common.base.Function; import com.google.common.base.Function;
import docking.theme.Gui;
import edu.uci.ics.jung.visualization.picking.PickedInfo; import edu.uci.ics.jung.visualization.picking.PickedInfo;
import generic.theme.Gui;
import ghidra.app.plugin.core.functiongraph.graph.FGVertexType; import ghidra.app.plugin.core.functiongraph.graph.FGVertexType;
import ghidra.app.plugin.core.functiongraph.graph.vertex.FGVertex; import ghidra.app.plugin.core.functiongraph.graph.vertex.FGVertex;
import ghidra.program.util.ProgramSelection; import ghidra.program.util.ProgramSelection;

View file

@ -21,8 +21,8 @@ import java.awt.geom.Point2D;
import javax.swing.*; import javax.swing.*;
import docking.theme.GThemeDefaults.Colors;
import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.VisualizationViewer;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.plugin.core.functiongraph.graph.FGEdge; import ghidra.app.plugin.core.functiongraph.graph.FGEdge;
import ghidra.app.plugin.core.functiongraph.mvc.FGController; import ghidra.app.plugin.core.functiongraph.mvc.FGController;
import ghidra.app.plugin.core.functiongraph.mvc.FGView; import ghidra.app.plugin.core.functiongraph.mvc.FGView;

View file

@ -20,7 +20,7 @@ import java.awt.event.MouseEvent;
import javax.swing.JComponent; import javax.swing.JComponent;
import docking.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors;
import ghidra.app.plugin.core.functiongraph.graph.FGEdge; import ghidra.app.plugin.core.functiongraph.graph.FGEdge;
import ghidra.app.plugin.core.functiongraph.graph.FGVertexType; import ghidra.app.plugin.core.functiongraph.graph.FGVertexType;
import ghidra.app.plugin.core.functiongraph.mvc.FGController; import ghidra.app.plugin.core.functiongraph.mvc.FGController;

View file

@ -27,7 +27,7 @@ import docking.ActionContext;
import docking.GenericHeader; import docking.GenericHeader;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.action.ToolBarData; import docking.action.ToolBarData;
import docking.theme.GColor; import generic.theme.GColor;
import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin; import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin;
import ghidra.app.plugin.core.functiongraph.graph.FGEdge; import ghidra.app.plugin.core.functiongraph.graph.FGEdge;
import ghidra.app.plugin.core.functiongraph.mvc.FGController; import ghidra.app.plugin.core.functiongraph.mvc.FGController;

View file

@ -32,13 +32,13 @@ import docking.ActionContext;
import docking.GenericHeader; import docking.GenericHeader;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.action.ToolBarData; import docking.action.ToolBarData;
import docking.theme.GColor;
import docking.theme.GThemeDefaults.Colors;
import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.FieldPanel;
import docking.widgets.fieldpanel.Layout; import docking.widgets.fieldpanel.Layout;
import docking.widgets.fieldpanel.field.Field; import docking.widgets.fieldpanel.field.Field;
import docking.widgets.fieldpanel.support.BackgroundColorModel; import docking.widgets.fieldpanel.support.BackgroundColorModel;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors;
import ghidra.app.plugin.core.codebrowser.hover.ListingHoverService; import ghidra.app.plugin.core.codebrowser.hover.ListingHoverService;
import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin; import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin;
import ghidra.app.plugin.core.functiongraph.graph.FGEdge; import ghidra.app.plugin.core.functiongraph.graph.FGEdge;

View file

@ -25,7 +25,7 @@ import docking.ActionContext;
import docking.action.*; import docking.action.*;
import docking.menu.MultiActionDockingAction; import docking.menu.MultiActionDockingAction;
import docking.menu.MultipleActionDockingToolbarButton; import docking.menu.MultipleActionDockingToolbarButton;
import docking.theme.GColor; import generic.theme.GColor;
import ghidra.app.plugin.core.functiongraph.FGColorProvider; import ghidra.app.plugin.core.functiongraph.FGColorProvider;
import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin; import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin;
import ghidra.app.plugin.core.functiongraph.mvc.FGController; import ghidra.app.plugin.core.functiongraph.mvc.FGController;

View file

@ -19,8 +19,8 @@ import java.awt.Color;
import java.util.*; import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import docking.theme.GColor; import generic.theme.GColor;
import docking.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin; import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin;
import ghidra.app.plugin.core.functiongraph.graph.layout.FGLayoutOptions; import ghidra.app.plugin.core.functiongraph.graph.layout.FGLayoutOptions;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;

View file

@ -26,8 +26,8 @@ import org.junit.*;
import docking.ActionContext; import docking.ActionContext;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.theme.GThemeDefaults.Colors.Palette;
import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.Graph;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.plugin.core.clear.ClearPlugin; import ghidra.app.plugin.core.clear.ClearPlugin;
import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin; import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.plugin.core.functiongraph.graph.FGEdge; import ghidra.app.plugin.core.functiongraph.graph.FGEdge;

View file

@ -32,12 +32,12 @@ import docking.ActionContext;
import docking.ComponentProvider; import docking.ComponentProvider;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.dnd.GClipboard; import docking.dnd.GClipboard;
import docking.theme.GThemeDefaults.Colors.Palette;
import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.visualization.VisualizationModel; import edu.uci.ics.jung.visualization.VisualizationModel;
import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.util.Caching; import edu.uci.ics.jung.visualization.util.Caching;
import generic.test.TestUtils; import generic.test.TestUtils;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.cmd.label.AddLabelCmd; import ghidra.app.cmd.label.AddLabelCmd;
import ghidra.app.events.ProgramSelectionPluginEvent; import ghidra.app.events.ProgramSelectionPluginEvent;
import ghidra.app.nav.LocationMemento; import ghidra.app.nav.LocationMemento;

View file

@ -27,9 +27,9 @@ import javax.swing.JComponent;
import org.junit.*; import org.junit.*;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.theme.GThemeDefaults.Colors.Palette;
import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.Graph;
import generic.test.TestUtils; import generic.test.TestUtils;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.app.cmd.label.AddLabelCmd; import ghidra.app.cmd.label.AddLabelCmd;
import ghidra.app.cmd.label.DeleteLabelCmd; import ghidra.app.cmd.label.DeleteLabelCmd;
import ghidra.app.cmd.refs.AddMemRefCmd; import ghidra.app.cmd.refs.AddMemRefCmd;

View file

@ -23,8 +23,8 @@ import java.util.List;
import javax.swing.*; import javax.swing.*;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.theme.GThemeDefaults;
import docking.widgets.checkbox.GCheckBox; import docking.widgets.checkbox.GCheckBox;
import generic.theme.GThemeDefaults;
import ghidra.feature.fid.db.FidFile; import ghidra.feature.fid.db.FidFile;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.layout.VerticalLayout; import ghidra.util.layout.VerticalLayout;

View file

@ -26,11 +26,11 @@ import javax.swing.*;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.border.LineBorder; import javax.swing.border.LineBorder;
import docking.theme.GColor;
import docking.theme.GThemeDefaults.Colors.Palette;
import docking.theme.Gui;
import docking.widgets.EmptyBorderButton; import docking.widgets.EmptyBorderButton;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.GColor;
import generic.theme.Gui;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.graph.viewer.vertex.AbstractVisualVertex; import ghidra.graph.viewer.vertex.AbstractVisualVertex;
import ghidra.graph.viewer.vertex.VertexShapeProvider; import ghidra.graph.viewer.vertex.VertexShapeProvider;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;

View file

@ -15,12 +15,12 @@
*/ */
package functioncalls.graph.view; package functioncalls.graph.view;
import docking.theme.GColor;
import edu.uci.ics.jung.visualization.renderers.Renderer; import edu.uci.ics.jung.visualization.renderers.Renderer;
import functioncalls.graph.*; import functioncalls.graph.*;
import functioncalls.graph.renderer.FcgEdgePaintTransformer; import functioncalls.graph.renderer.FcgEdgePaintTransformer;
import functioncalls.graph.renderer.FcgVertexPaintTransformer; import functioncalls.graph.renderer.FcgVertexPaintTransformer;
import functioncalls.plugin.FunctionCallGraphPlugin; import functioncalls.plugin.FunctionCallGraphPlugin;
import generic.theme.GColor;
import ghidra.graph.viewer.*; import ghidra.graph.viewer.*;
import ghidra.graph.viewer.edge.VisualEdgeRenderer; import ghidra.graph.viewer.edge.VisualEdgeRenderer;
import ghidra.graph.viewer.layout.VisualGraphLayout; import ghidra.graph.viewer.layout.VisualGraphLayout;

View file

@ -50,9 +50,9 @@ import docking.action.builder.*;
import docking.menu.ActionState; import docking.menu.ActionState;
import docking.menu.MultiStateDockingAction; import docking.menu.MultiStateDockingAction;
import docking.options.editor.OptionsDialog; import docking.options.editor.OptionsDialog;
import docking.theme.GColor;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import generic.theme.GColor;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.framework.options.ToolOptions; import ghidra.framework.options.ToolOptions;

View file

@ -26,13 +26,14 @@ import javax.swing.text.*;
import javax.swing.tree.TreeSelectionModel; import javax.swing.tree.TreeSelectionModel;
import docking.DockingUtils; import docking.DockingUtils;
import docking.theme.GColor; import docking.help.HelpService;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
import docking.widgets.OptionDialog; import docking.widgets.OptionDialog;
import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.FieldPanel;
import docking.widgets.fieldpanel.field.Field; import docking.widgets.fieldpanel.field.Field;
import docking.widgets.fieldpanel.listener.FieldMouseListener; import docking.widgets.fieldpanel.listener.FieldMouseListener;
import docking.widgets.fieldpanel.support.FieldLocation; import docking.widgets.fieldpanel.support.FieldLocation;
import generic.theme.GColor;
import ghidra.GhidraOptions; import ghidra.GhidraOptions;
import ghidra.app.CorePluginPackage; import ghidra.app.CorePluginPackage;
import ghidra.app.events.*; import ghidra.app.events.*;
@ -62,7 +63,6 @@ import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.*; import ghidra.util.task.*;
import help.Help; import help.Help;
import help.HelpService;
import resources.ResourceManager; import resources.ResourceManager;
/** /**

View file

@ -37,7 +37,7 @@ import docking.widgets.list.GList;
import docking.widgets.list.GListCellRenderer; import docking.widgets.list.GListCellRenderer;
import docking.widgets.table.GTableCellRenderer; import docking.widgets.table.GTableCellRenderer;
import docking.widgets.tree.support.GTreeRenderer; import docking.widgets.tree.support.GTreeRenderer;
import ghidra.docking.util.LookAndFeelUtils; import generic.theme.Gui;
import ghidra.util.HTMLUtilities; import ghidra.util.HTMLUtilities;
import resources.ResourceManager; import resources.ResourceManager;
@ -125,7 +125,7 @@ public class DockingUtils {
public static JSeparator createToolbarSeparator() { public static JSeparator createToolbarSeparator() {
Dimension sepDim = new Dimension(2, ICON_SIZE + 2); Dimension sepDim = new Dimension(2, ICON_SIZE + 2);
JSeparator separator = new JSeparator(SwingConstants.VERTICAL); JSeparator separator = new JSeparator(SwingConstants.VERTICAL);
if (LookAndFeelUtils.isUsingAquaUI(separator.getUI())) { if (Gui.isUsingAquaUI(separator.getUI())) {
separator.setUI(new BasicSeparatorUI()); separator.setUI(new BasicSeparatorUI());
} }
separator.setPreferredSize(sepDim); // ugly work around to force height of separator separator.setPreferredSize(sepDim); // ugly work around to force height of separator

View file

@ -26,10 +26,10 @@ import org.jdesktop.animation.timing.TimingTargetAdapter;
import org.jdesktop.animation.timing.interpolation.PropertySetter; import org.jdesktop.animation.timing.interpolation.PropertySetter;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.theme.GColor;
import docking.util.AnimationUtils; import docking.util.AnimationUtils;
import docking.widgets.VariableHeightPanel; import docking.widgets.VariableHeightPanel;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import generic.theme.GColor;
// TODO: should this be put into generic? // TODO: should this be put into generic?
public class GenericHeader extends JPanel { public class GenericHeader extends JPanel {

View file

@ -29,8 +29,8 @@ import org.apache.commons.lang3.StringUtils;
import docking.ActionContext; import docking.ActionContext;
import docking.DockingWindowManager; import docking.DockingWindowManager;
import generic.util.action.ReservedKeyBindings;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.ReservedKeyBindings;
public class ComponentThemeInspectorAction extends DockingAction { public class ComponentThemeInspectorAction extends DockingAction {

View file

@ -24,7 +24,7 @@ import javax.swing.Action;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import docking.*; import docking.*;
import ghidra.util.ReservedKeyBindings; import generic.util.action.ReservedKeyBindings;
import ghidra.util.exception.AssertException; import ghidra.util.exception.AssertException;
/** /**

View file

@ -24,7 +24,7 @@ import org.apache.logging.log4j.Logger;
import docking.ActionContext; import docking.ActionContext;
import docking.DockingWindowManager; import docking.DockingWindowManager;
import ghidra.util.ReservedKeyBindings; import generic.util.action.ReservedKeyBindings;
public class ShowFocusCycleAction extends DockingAction { public class ShowFocusCycleAction extends DockingAction {
static final Logger log = LogManager.getLogger(ShowFocusCycleAction.class); static final Logger log = LogManager.getLogger(ShowFocusCycleAction.class);

View file

@ -25,7 +25,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import docking.*; import docking.*;
import ghidra.util.ReservedKeyBindings; import generic.util.action.ReservedKeyBindings;
public class ShowFocusInfoAction extends DockingAction { public class ShowFocusInfoAction extends DockingAction {
static final Logger log = LogManager.getLogger(ShowFocusInfoAction.class); static final Logger log = LogManager.getLogger(ShowFocusInfoAction.class);

View file

@ -27,8 +27,8 @@ import docking.KeyEntryTextField;
import docking.action.*; import docking.action.*;
import docking.tool.ToolConstants; import docking.tool.ToolConstants;
import docking.widgets.label.GIconLabel; import docking.widgets.label.GIconLabel;
import generic.util.action.ReservedKeyBindings;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.ReservedKeyBindings;
import resources.ResourceManager; import resources.ResourceManager;
/** /**

View file

@ -32,6 +32,7 @@ import org.apache.commons.collections4.map.LazyMap;
import docking.*; import docking.*;
import docking.action.*; import docking.action.*;
import docking.tool.util.DockingToolConstants; import docking.tool.util.DockingToolConstants;
import generic.util.action.ReservedKeyBindings;
import ghidra.framework.options.*; import ghidra.framework.options.*;
import ghidra.util.*; import ghidra.util.*;
import ghidra.util.exception.AssertException; import ghidra.util.exception.AssertException;

View file

@ -16,8 +16,9 @@
package docking.framework; package docking.framework;
import docking.DockingErrorDisplay; import docking.DockingErrorDisplay;
import docking.theme.Gui;
import docking.widgets.PopupKeyStorePasswordProvider; import docking.widgets.PopupKeyStorePasswordProvider;
import generic.theme.Gui;
import ghidra.docking.util.LookAndFeelUtils;
import ghidra.framework.ApplicationConfiguration; import ghidra.framework.ApplicationConfiguration;
import ghidra.net.ApplicationKeyManagerFactory; import ghidra.net.ApplicationKeyManagerFactory;
import ghidra.util.ErrorDisplay; import ghidra.util.ErrorDisplay;
@ -49,13 +50,14 @@ public class DockingApplicationConfiguration extends ApplicationConfiguration {
super.initializeApplication(); super.initializeApplication();
Gui.initialize(); Gui.initialize();
LookAndFeelUtils.platformSpecificFixups();
if (showSplashScreen) { if (showSplashScreen) {
SplashScreen.showSplashScreen(); SplashScreen.showSplashScreen();
} }
ApplicationKeyManagerFactory.setKeyStorePasswordProvider( ApplicationKeyManagerFactory
new PopupKeyStorePasswordProvider()); .setKeyStorePasswordProvider(new PopupKeyStorePasswordProvider());
} }

View file

@ -23,9 +23,9 @@ import javax.swing.*;
import javax.swing.border.BevelBorder; import javax.swing.border.BevelBorder;
import docking.*; import docking.*;
import docking.theme.GColor;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import generic.theme.GColor;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.util.Msg; import ghidra.util.Msg;

View file

@ -24,7 +24,7 @@ import javax.swing.KeyStroke;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import ghidra.docking.util.LookAndFeelUtils; import generic.theme.Gui;
import ghidra.util.StringUtilities; import ghidra.util.StringUtilities;
class DockingToolBarUtils { class DockingToolBarUtils {
@ -96,7 +96,7 @@ class DockingToolBarUtils {
builder.append(InputEvent.getModifiersExText(modifiers)); builder.append(InputEvent.getModifiersExText(modifiers));
// The Aqua LaF does not use the '+' symbol between modifiers // The Aqua LaF does not use the '+' symbol between modifiers
if (!LookAndFeelUtils.isUsingAquaUI(button.getUI())) { if (!Gui.isUsingAquaUI(button.getUI())) {
builder.append('+'); builder.append('+');
} }
} }

View file

@ -17,15 +17,24 @@ package docking.options.editor;
import java.awt.*; import java.awt.*;
import java.beans.PropertyEditorSupport; import java.beans.PropertyEditorSupport;
import java.io.File;
import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.List; import java.util.List;
import javax.swing.*; import javax.swing.*;
import org.apache.commons.io.FileUtils;
import docking.theme.gui.ProtectedIcon; import docking.theme.gui.ProtectedIcon;
import docking.widgets.*; import docking.widgets.*;
import docking.widgets.filechooser.GhidraFileChooser;
import docking.widgets.filechooser.GhidraFileChooserMode;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import docking.widgets.list.GListCellRenderer; import docking.widgets.list.GListCellRenderer;
import ghidra.framework.Application;
import ghidra.util.Msg;
import ghidra.util.filechooser.ExtensionFileFilter;
import resources.ResourceManager; import resources.ResourceManager;
import resources.icons.ScaledImageIcon; import resources.icons.ScaledImageIcon;
import resources.icons.UrlImageIcon; import resources.icons.UrlImageIcon;
@ -86,8 +95,6 @@ public class IconPropertyEditor extends PropertyEditorSupport {
updateDropDownDataModel(icon); updateDropDownDataModel(icon);
updatePreviewLabel(icon); updatePreviewLabel(icon);
// iconTextField.addActionListener(listener);
} }
private void updateDropDownDataModel(Icon icon) { private void updateDropDownDataModel(Icon icon) {
@ -114,27 +121,11 @@ public class IconPropertyEditor extends PropertyEditorSupport {
return super.getMatchingData(searchText); return super.getMatchingData(searchText);
} }
}; };
// dropDown.setConsumeEnterKeyPress(false);
// dropDown.addActionListener(e -> iconChanged());
dropDown.addDropDownSelectionChoiceListener(choiceListener); dropDown.addDropDownSelectionChoiceListener(choiceListener);
// dropDown.addCellEditorListener(new CellEditorListener() {
//
// @Override
// public void editingStopped(ChangeEvent e) {
// Msg.debug(this, "Stopped");
// }
//
// @Override
// public void editingCanceled(ChangeEvent e) {
// Msg.debug(this, "Cancelled");
//
// }
// });
panel.add(dropDown, BorderLayout.CENTER); panel.add(dropDown, BorderLayout.CENTER);
// JButton browseButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE); JButton browseButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE);
// panel.add(browseButton, BorderLayout.EAST); panel.add(browseButton, BorderLayout.EAST);
// browseButton.addActionListener(e -> browse()); browseButton.addActionListener(e -> browse());
// iconTextField.addActionListener(listener);
return panel; return panel;
} }
@ -154,7 +145,59 @@ public class IconPropertyEditor extends PropertyEditorSupport {
} }
private void browse() { private void browse() {
//TODO GhidraFileChooser chooser = new GhidraFileChooser(iconChooserPanel);
chooser.setTitle("Import Icon");
chooser.setApproveButtonToolTipText("Import Icon");
chooser.setFileSelectionMode(GhidraFileChooserMode.FILES_ONLY);
chooser.setSelectedFileFilter(
ExtensionFileFilter.forExtensions("Icon Files", ".png", "gif"));
File file = chooser.getSelectedFile();
if (file != null) {
importIconFile(file);
}
}
private void importIconFile(File file) {
if (!isValidIcon(file)) {
Msg.error(this, "File is not a valid icon: " + file.getAbsolutePath());
return;
}
File dir = Application.getUserSettingsDirectory();
File destinationDir = new File(dir, "themes/images");
File destinationFile = new File(destinationDir, file.getName());
if (destinationFile.exists()) {
int result = OptionDialog.showYesNoDialog(dropDown, "Overwrite?",
"An icon with that name already exists.\n Do you want to overwrite it?");
if (result == OptionDialog.NO_OPTION) {
return;
}
}
try {
FileUtils.copyFile(file, destinationFile);
ImageIcon icon = ResourceManager.loadImage("themes/images/" + file.getName());
setValue(icon);
}
catch (IOException e) {
Msg.showError(this, dropDown, "Error importing file", e);
}
}
private boolean isValidIcon(File file) {
if (!file.exists()) {
return false;
}
try {
UrlImageIcon icon = new UrlImageIcon(file.getAbsolutePath(), file.toURI().toURL());
icon.getIconWidth();
return true;
}
catch (Exception e) {
Msg.showError(this, dropDown, "Invalid Icon File",
"The file is not a valid icon: " + file.getAbsolutePath());
return false;
}
} }
private Component buildPreviewLabel() { private Component buildPreviewLabel() {

View file

@ -20,6 +20,7 @@ import java.beans.PropertyChangeListener;
import docking.options.editor.ColorPropertyEditor; import docking.options.editor.ColorPropertyEditor;
import docking.theme.*; import docking.theme.*;
import generic.theme.*;
/** /**
* Editor for Theme colors * Editor for Theme colors

View file

@ -29,6 +29,7 @@ import docking.widgets.checkbox.GCheckBox;
import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooser;
import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.filechooser.GhidraFileChooserMode;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import generic.theme.*;
import ghidra.util.MessageType; import ghidra.util.MessageType;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.filechooser.GhidraFileFilter; import ghidra.util.filechooser.GhidraFileFilter;
@ -51,13 +52,20 @@ public class ExportThemeDialog extends DialogComponentProvider {
@Override @Override
protected void okCallback() { protected void okCallback() {
if (exportTheme()) {
close();
}
}
private boolean exportTheme() {
File file = new File(fileTextField.getText()); File file = new File(fileTextField.getText());
String themeName = nameField.getText(); String themeName = nameField.getText();
if (themeName.isBlank()) { if (themeName.isBlank()) {
setStatusText("Missing Theme Name", MessageType.ERROR, true); setStatusText("Missing Theme Name", MessageType.ERROR, true);
return; return false;
} }
boolean includeDefaults = includeDefaultsCheckbox.isSelected(); boolean includeDefaults = includeDefaultsCheckbox.isSelected();
GTheme activeTheme = Gui.getActiveTheme(); GTheme activeTheme = Gui.getActiveTheme();
FileGTheme fileTheme = new FileGTheme(file, themeName, activeTheme.getLookAndFeelType(), FileGTheme fileTheme = new FileGTheme(file, themeName, activeTheme.getLookAndFeelType(),
activeTheme.useDarkDefaults()); activeTheme.useDarkDefaults());
@ -68,12 +76,14 @@ public class ExportThemeDialog extends DialogComponentProvider {
else { else {
fileTheme.load(Gui.getNonDefaultValues()); fileTheme.load(Gui.getNonDefaultValues());
} }
try { try {
fileTheme.save(); fileTheme.save();
close(); return true;
} }
catch (IOException e) { catch (IOException e) {
Msg.error("Error Exporting Theme", "I/O Error encountered trying to export theme!", e); Msg.error("Error Exporting Theme", "I/O Error encountered trying to export theme!", e);
return false;
} }
} }

View file

@ -23,6 +23,7 @@ import javax.swing.plaf.UIResource;
import docking.options.editor.FontPropertyEditor; import docking.options.editor.FontPropertyEditor;
import docking.theme.*; import docking.theme.*;
import generic.theme.*;
/** /**
* Editor for Theme fonts * Editor for Theme fonts

View file

@ -21,6 +21,7 @@ import javax.swing.Icon;
import docking.options.editor.IconPropertyEditor; import docking.options.editor.IconPropertyEditor;
import docking.theme.*; import docking.theme.*;
import generic.theme.*;
/** /**
* Editor for Theme fonts * Editor for Theme fonts

View file

@ -25,6 +25,7 @@ import javax.swing.JLabel;
import docking.theme.*; import docking.theme.*;
import docking.widgets.table.*; import docking.widgets.table.*;
import generic.theme.*;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.framework.plugintool.ServiceProviderStub; import ghidra.framework.plugintool.ServiceProviderStub;

View file

@ -39,6 +39,7 @@ import docking.widgets.filechooser.GhidraFileChooser;
import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.filechooser.GhidraFileChooserMode;
import docking.widgets.table.GFilterTable; import docking.widgets.table.GFilterTable;
import docking.widgets.table.GTable; import docking.widgets.table.GTable;
import generic.theme.*;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.util.*; import ghidra.util.*;
import ghidra.util.filechooser.ExtensionFileFilter; import ghidra.util.filechooser.ExtensionFileFilter;

View file

@ -25,6 +25,7 @@ import javax.swing.JLabel;
import docking.theme.*; import docking.theme.*;
import docking.widgets.table.*; import docking.widgets.table.*;
import generic.theme.*;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.framework.plugintool.ServiceProviderStub; import ghidra.framework.plugintool.ServiceProviderStub;

View file

@ -25,6 +25,7 @@ import javax.swing.*;
import docking.theme.*; import docking.theme.*;
import docking.widgets.table.*; import docking.widgets.table.*;
import generic.theme.*;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.framework.plugintool.ServiceProviderStub; import ghidra.framework.plugintool.ServiceProviderStub;

View file

@ -22,7 +22,7 @@ import javax.swing.*;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.DockingWindowManager; import docking.DockingWindowManager;
import docking.theme.ThemeValue; import generic.theme.ThemeValue;
/** /**
* Base class for Theme properties (Colors, Fonts, and Icons) * Base class for Theme properties (Colors, Fonts, and Icons)

View file

@ -21,8 +21,8 @@ import javax.swing.BorderFactory;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.border.Border; import javax.swing.border.Border;
import docking.theme.GColor;
import docking.widgets.label.GDHtmlLabel; import docking.widgets.label.GDHtmlLabel;
import generic.theme.GColor;
/** /**
* A common base class for list and table renderer objects, unifying the Ghidra look and feel. * A common base class for list and table renderer objects, unifying the Ghidra look and feel.

View file

@ -26,9 +26,9 @@ import javax.swing.event.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import docking.theme.GColor;
import docking.widgets.label.GDHtmlLabel; import docking.widgets.label.GDHtmlLabel;
import docking.widgets.list.GList; import docking.widgets.list.GList;
import generic.theme.GColor;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.util.StringUtilities; import ghidra.util.StringUtilities;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;

View file

@ -24,7 +24,7 @@ import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import ghidra.docking.util.LookAndFeelUtils; import generic.theme.Gui;
import resources.ResourceManager; import resources.ResourceManager;
/** /**
@ -45,8 +45,8 @@ public class EmptyBorderButton extends JButton {
/** /**
* An empty border. * An empty border.
*/ */
public static final Border NO_BUTTON_BORDER = new EmptyBorder( public static final Border NO_BUTTON_BORDER =
RAISED_BUTTON_BORDER.getBorderInsets(new JButton())); new EmptyBorder(RAISED_BUTTON_BORDER.getBorderInsets(new JButton()));
/** /**
* A lowered border beveled border. * A lowered border beveled border.
@ -123,7 +123,7 @@ public class EmptyBorderButton extends JButton {
// Mac OSX LNF doesn't give us rollover callbacks, so we have to add a mouse listener to // Mac OSX LNF doesn't give us rollover callbacks, so we have to add a mouse listener to
// do the work // do the work
if (LookAndFeelUtils.isUsingAquaUI(getUI())) { if (Gui.isUsingAquaUI(getUI())) {
addMouseListener(new MouseAdapter() { addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseEntered(MouseEvent e) { public void mouseEntered(MouseEvent e) {

View file

@ -30,8 +30,8 @@ import javax.swing.text.Caret;
import docking.DockingUtils; import docking.DockingUtils;
import docking.DockingUtils.TreeTraversalResult; import docking.DockingUtils.TreeTraversalResult;
import docking.theme.GColor;
import docking.widgets.textfield.TextFieldLinker; import docking.widgets.textfield.TextFieldLinker;
import generic.theme.GColor;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.util.task.SwingUpdateManager; import ghidra.util.task.SwingUpdateManager;

View file

@ -29,7 +29,6 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import docking.DockingUtils; import docking.DockingUtils;
import docking.theme.GColor;
import docking.util.GraphicsUtils; import docking.util.GraphicsUtils;
import docking.widgets.EventTrigger; import docking.widgets.EventTrigger;
import docking.widgets.fieldpanel.field.Field; import docking.widgets.fieldpanel.field.Field;
@ -39,6 +38,7 @@ import docking.widgets.fieldpanel.listener.*;
import docking.widgets.fieldpanel.support.*; import docking.widgets.fieldpanel.support.*;
import docking.widgets.indexedscrollpane.IndexScrollListener; import docking.widgets.indexedscrollpane.IndexScrollListener;
import docking.widgets.indexedscrollpane.IndexedScrollable; import docking.widgets.indexedscrollpane.IndexedScrollable;
import generic.theme.GColor;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;

View file

@ -17,7 +17,7 @@ package docking.widgets.fieldpanel.internal;
import java.awt.Color; import java.awt.Color;
import docking.theme.GColor; import generic.theme.GColor;
/** /**
* Miscellaneous information needed by fields to paint. * Miscellaneous information needed by fields to paint.

View file

@ -31,12 +31,12 @@ import javax.swing.event.ChangeEvent;
import javax.swing.filechooser.FileSystemView; import javax.swing.filechooser.FileSystemView;
import docking.*; import docking.*;
import docking.theme.GColor;
import docking.widgets.*; import docking.widgets.*;
import docking.widgets.combobox.GComboBox; import docking.widgets.combobox.GComboBox;
import docking.widgets.label.GDLabel; import docking.widgets.label.GDLabel;
import docking.widgets.label.GLabel; import docking.widgets.label.GLabel;
import docking.widgets.list.GListCellRenderer; import docking.widgets.list.GListCellRenderer;
import generic.theme.GColor;
import ghidra.framework.OperatingSystem; import ghidra.framework.OperatingSystem;
import ghidra.framework.Platform; import ghidra.framework.Platform;
import ghidra.framework.preferences.Preferences; import ghidra.framework.preferences.Preferences;

View file

@ -23,8 +23,8 @@ import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import docking.DockingUtils; import docking.DockingUtils;
import docking.theme.GColor; import generic.theme.GColor;
import docking.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.util.SystemUtilities; import ghidra.util.SystemUtilities;
import ghidra.util.datastruct.WeakDataStructureFactory; import ghidra.util.datastruct.WeakDataStructureFactory;
import ghidra.util.datastruct.WeakSet; import ghidra.util.datastruct.WeakSet;

View file

@ -23,7 +23,7 @@ import javax.swing.*;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.table.*; import javax.swing.table.*;
import docking.theme.GColor; import generic.theme.GColor;
import resources.*; import resources.*;
import resources.icons.EmptyIcon; import resources.icons.EmptyIcon;
import resources.icons.TranslateIcon; import resources.icons.TranslateIcon;

View file

@ -20,11 +20,11 @@ import java.util.stream.Collectors;
import org.jdom.Element; import org.jdom.Element;
import docking.theme.GColor;
import docking.theme.GThemeDefaults.Colors.Palette;
import docking.widgets.table.*; import docking.widgets.table.*;
import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.ColumnConstraint;
import docking.widgets.table.constraint.TableFilterContext; import docking.widgets.table.constraint.TableFilterContext;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;
/** /**

View file

@ -19,11 +19,11 @@ import java.util.*;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import docking.theme.GColor;
import docking.theme.GThemeDefaults.Colors.Palette;
import docking.widgets.table.DiscoverableTableUtils; import docking.widgets.table.DiscoverableTableUtils;
import docking.widgets.table.RowObjectTableModel; import docking.widgets.table.RowObjectTableModel;
import docking.widgets.table.constraint.*; import docking.widgets.table.constraint.*;
import generic.theme.GColor;
import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;
/** /**

View file

@ -22,7 +22,7 @@ import javax.swing.JTextField;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import docking.theme.GColor; import generic.theme.GColor;
/** /**
* Simple text field that shows a text hint when the field is empty. * Simple text field that shows a text hint when the field is empty.

View file

@ -22,10 +22,10 @@ import javax.swing.JTree;
import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.ColorUIResource;
import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeCellRenderer;
import docking.theme.GColor;
import docking.widgets.GComponent; import docking.widgets.GComponent;
import docking.widgets.tree.GTree; import docking.widgets.tree.GTree;
import docking.widgets.tree.GTreeNode; import docking.widgets.tree.GTreeNode;
import generic.theme.GColor;
public class GTreeRenderer extends DefaultTreeCellRenderer implements GComponent { public class GTreeRenderer extends DefaultTreeCellRenderer implements GComponent {

View file

@ -15,15 +15,18 @@
*/ */
package ghidra.docking.util; package ghidra.docking.util;
import java.util.ArrayList; import java.awt.Font;
import java.util.List; import java.awt.Taskbar;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import javax.swing.*; import javax.swing.UIDefaults;
import javax.swing.plaf.ComponentUI; import javax.swing.UIManager;
import org.apache.commons.collections4.IteratorUtils; import docking.framework.ApplicationInformationDisplayFactory;
import ghidra.framework.preferences.Preferences;
import docking.theme.LafType; import ghidra.util.SystemUtilities;
/** /**
* A utility class to manage LookAndFeel (LaF) settings. * A utility class to manage LookAndFeel (LaF) settings.
@ -34,53 +37,48 @@ public class LookAndFeelUtils {
// utils class, cannot create // utils class, cannot create
} }
// /**
// * Loads settings from {@link Preferences}.
// */
// public static void installGlobalOverrides() {
//
// //
// // Users can change this via the SystemUtilities.FONT_SIZE_OVERRIDE_PROPERTY_NAME
// // system property.
// //
// Integer fontOverride = SystemUtilities.getFontSizeOverrideValue();
// if (fontOverride != null) {
// setGlobalFontSizeOverride(fontOverride);
// }
// }
public static List<String> getLookAndFeelIdsForType(UIDefaults defaults, Class<?> clazz) {
List<String> colorKeys = new ArrayList<>();
List<Object> keyList = IteratorUtils.toList(defaults.keys().asIterator());
for (Object key : keyList) {
if (key instanceof String) {
Object value = defaults.get(key);
if (clazz.isInstance(value)) {
colorKeys.add((String) key);
}
}
}
return colorKeys;
}
/** /**
* Returns true if the given UI object is using the Aqua Look and Feel. * Loads settings from {@link Preferences}.
* @param UI the UI to examine.
* @return true if the UI is using Aqua
*/ */
public static boolean isUsingAquaUI(ComponentUI UI) { public static void installGlobalOverrides() {
Class<? extends ComponentUI> clazz = UI.getClass();
String name = clazz.getSimpleName(); //
return name.startsWith("Aqua"); // Users can change this via the SystemUtilities.FONT_SIZE_OVERRIDE_PROPERTY_NAME
// system property.
//
Integer fontOverride = SystemUtilities.getFontSizeOverrideValue();
if (fontOverride != null) {
setGlobalFontSizeOverride(fontOverride);
}
} }
/** /** Allows you to globally set the font size (don't use this method!) */
* Returns true if 'Nimbus' is the current Look and Feel private static void setGlobalFontSizeOverride(int fontSize) {
* @return true if 'Nimbus' is the current Look and Feel UIDefaults defaults = UIManager.getDefaults();
*/
public static boolean isUsingNimbusUI() { Set<Entry<Object, Object>> set = defaults.entrySet();
LookAndFeel lookAndFeel = UIManager.getLookAndFeel(); Iterator<Entry<Object, Object>> iterator = set.iterator();
return LafType.NIMBUS.equals(lookAndFeel.getName()); while (iterator.hasNext()) {
Entry<Object, Object> entry = iterator.next();
Object key = entry.getKey();
if (key.toString().toLowerCase().indexOf("font") != -1) {
Font currentFont = defaults.getFont(key);
if (currentFont != null) {
Font newFont = currentFont.deriveFont((float) fontSize);
UIManager.put(key, newFont);
}
}
}
} }
public static void platformSpecificFixups() {
// Set the dock icon for macOS
if (Taskbar.isTaskbarSupported()) {
Taskbar taskbar = Taskbar.getTaskbar();
if (taskbar.isSupported(Taskbar.Feature.ICON_IMAGE)) {
taskbar.setIconImage(ApplicationInformationDisplayFactory.getLargestWindowIcon());
}
}
}
} }

View file

@ -23,7 +23,7 @@ import java.net.URL;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import docking.theme.GIcon; import generic.theme.GIcon;
import ghidra.util.Msg; import ghidra.util.Msg;
import resources.icons.RotateIcon; import resources.icons.RotateIcon;
import resources.icons.TranslateIcon; import resources.icons.TranslateIcon;

View file

@ -22,6 +22,7 @@ import org.apache.commons.collections4.map.HashedMap;
import org.junit.Before; import org.junit.Before;
import docking.test.AbstractDockingTest; import docking.test.AbstractDockingTest;
import generic.theme.*;
public class GuiTest extends AbstractDockingTest { public class GuiTest extends AbstractDockingTest {

View file

@ -38,6 +38,8 @@ dependencies {
api 'org.bouncycastle:bcpkix-jdk15on:1.69' // requires bcutil and bcprov api 'org.bouncycastle:bcpkix-jdk15on:1.69' // requires bcutil and bcprov
api 'org.bouncycastle:bcprov-jdk15on:1.69' api 'org.bouncycastle:bcprov-jdk15on:1.69'
api 'org.bouncycastle:bcutil-jdk15on:1.69' api 'org.bouncycastle:bcutil-jdk15on:1.69'
api 'com.formdev:flatlaf:2.2'
compileOnly "junit:junit:4.12" compileOnly "junit:junit:4.12"
} }

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.Color; import java.awt.Color;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
public class DefaultTheme extends DiscoverableGTheme { public class DefaultTheme extends DiscoverableGTheme {

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import ghidra.util.classfinder.ExtensionPoint; import ghidra.util.classfinder.ExtensionPoint;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.Font; import java.awt.Font;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.*; import java.awt.*;
import java.awt.color.ColorSpace; import java.awt.color.ColorSpace;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import javax.swing.plaf.UIResource; import javax.swing.plaf.UIResource;

View file

@ -13,14 +13,14 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.Component; import java.awt.Component;
import java.awt.Graphics; import java.awt.Graphics;
import javax.swing.Icon; import javax.swing.Icon;
import docking.theme.Refreshable; import generic.theme.Refreshable;
import ghidra.util.datastruct.WeakStore; import ghidra.util.datastruct.WeakStore;
public class GIcon implements Icon, Refreshable { public class GIcon implements Icon, Refreshable {

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import javax.swing.plaf.UIResource; import javax.swing.plaf.UIResource;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.Color; import java.awt.Color;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.util.*; import java.util.*;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.*; import java.awt.*;
import java.io.*; import java.io.*;
@ -21,16 +21,17 @@ import java.util.*;
import java.util.List; import java.util.List;
import javax.swing.*; import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import com.formdev.flatlaf.*; import com.formdev.flatlaf.*;
import docking.framework.ApplicationInformationDisplayFactory; import generic.theme.builtin.JavaColorMapping;
import docking.help.Help;
import docking.theme.builtin.JavaColorMapping;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.framework.preferences.Preferences; import ghidra.framework.preferences.Preferences;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.classfinder.ClassSearcher; import ghidra.util.classfinder.ClassSearcher;
import ghidra.util.datastruct.WeakDataStructureFactory;
import ghidra.util.datastruct.WeakSet;
import resources.ResourceManager; import resources.ResourceManager;
import utilities.util.reflection.ReflectionUtilities; import utilities.util.reflection.ReflectionUtilities;
@ -52,24 +53,21 @@ public class Gui {
private static ThemePropertiesLoader themePropertiesLoader = new ThemePropertiesLoader(); private static ThemePropertiesLoader themePropertiesLoader = new ThemePropertiesLoader();
private static Map<String, GColorUIResource> gColorMap = new HashMap<>(); private static Map<String, GColorUIResource> gColorMap = new HashMap<>();
private static boolean isInitialized;
private static Map<String, GIconUIResource> gIconMap = new HashMap<>(); private static Map<String, GIconUIResource> gIconMap = new HashMap<>();
private static boolean isInitialzed; private static WeakSet<ThemeListener> themeListeners =
WeakDataStructureFactory.createCopyOnWriteWeakSet();
static void setPropertiesLoader(ThemePropertiesLoader loader) {
themePropertiesLoader = loader;
}
private Gui() { private Gui() {
// static utils class, can't construct // static utils class, can't construct
} }
public static void initialize() { public static void initialize() {
isInitialzed = true; isInitialized = true;
installFlatLookAndFeels(); installFlatLookAndFeels();
loadThemeDefaults(); loadThemeDefaults();
setTheme(getThemeFromPreferences()); setTheme(getThemeFromPreferences());
// LookAndFeelUtils.installGlobalOverrides(); // LookAndFeelUtils.installGlobalOverrides();
platformSpecificFixups();
} }
private static void installFlatLookAndFeels() { private static void installFlatLookAndFeels() {
@ -102,12 +100,9 @@ public class Gui {
lookAndFeel.install(); lookAndFeel.install();
saveThemeToPreferences(theme); saveThemeToPreferences(theme);
fixupJavaDefaults(); fixupJavaDefaults();
// The help may produce errors when switching the theme, such as if there is an
// active search in the help. We have added this call to allow the help system
// to cleanup some internal state.
Help.getHelpService().reload();
buildCurrentValues(); buildCurrentValues();
updateUIs(); updateUIs();
notifyThemeListeners();
} }
catch (Exception e) { catch (Exception e) {
Msg.error(Gui.class, "Error setting LookAndFeel: " + lookAndFeel.getName(), e); Msg.error(Gui.class, "Error setting LookAndFeel: " + lookAndFeel.getName(), e);
@ -115,6 +110,12 @@ public class Gui {
} }
} }
private static void notifyThemeListeners() {
for (ThemeListener listener : themeListeners) {
listener.themeChanged(activeTheme);
}
}
public static void addTheme(GTheme newTheme) { public static void addTheme(GTheme newTheme) {
allThemes.remove(newTheme); allThemes.remove(newTheme);
allThemes.add(newTheme); allThemes.add(newTheme);
@ -202,17 +203,6 @@ public class Gui {
return activeTheme.getLookAndFeelType(); return activeTheme.getLookAndFeelType();
} }
private static void platformSpecificFixups() {
// Set the dock icon for macOS
if (Taskbar.isTaskbarSupported()) {
Taskbar taskbar = Taskbar.getTaskbar();
if (taskbar.isSupported(Taskbar.Feature.ICON_IMAGE)) {
taskbar.setIconImage(ApplicationInformationDisplayFactory.getLargestWindowIcon());
}
}
}
public static Color getRawColor(String id) { public static Color getRawColor(String id) {
return getRawColor(id, true); return getRawColor(id, true);
} }
@ -221,7 +211,7 @@ public class Gui {
ColorValue color = currentValues.getColor(id); ColorValue color = currentValues.getColor(id);
if (color == null) { if (color == null) {
if (validate && isInitialzed) { if (validate && isInitialized) {
// Throwable t = getFilteredTrace(); // Throwable t = getFilteredTrace();
Msg.error(Gui.class, "No color value registered for: " + id); Msg.error(Gui.class, "No color value registered for: " + id);
} }
@ -233,7 +223,7 @@ public class Gui {
public static Icon getRawIcon(String id, boolean validate) { public static Icon getRawIcon(String id, boolean validate) {
IconValue icon = currentValues.getIcon(id); IconValue icon = currentValues.getIcon(id);
if (icon == null) { if (icon == null) {
if (validate && isInitialzed) { if (validate && isInitialized) {
Throwable t = getFilteredTrace(); Throwable t = getFilteredTrace();
Msg.error(Gui.class, "No icon value registered for: " + id, t); Msg.error(Gui.class, "No icon value registered for: " + id, t);
} }
@ -456,4 +446,34 @@ public class Gui {
return currentDefaults; return currentDefaults;
} }
/**
* Returns true if the given UI object is using the Aqua Look and Feel.
* @param UI the UI to examine.
* @return true if the UI is using Aqua
*/
public static boolean isUsingAquaUI(ComponentUI UI) {
return activeTheme.getLookAndFeelType() == LafType.MAC;
}
/**
* Returns true if 'Nimbus' is the current Look and Feel
* @return true if 'Nimbus' is the current Look and Feel
*/
public static boolean isUsingNimbusUI() {
return activeTheme.getLookAndFeelType() == LafType.NIMBUS;
}
public static void addThemeListener(ThemeListener listener) {
themeListeners.add(listener);
}
public static void removeThemeListener(ThemeListener listener) {
themeListeners.add(listener);
}
// for testing
public static void setPropertiesLoader(ThemePropertiesLoader loader) {
themePropertiesLoader = loader;
}
} }

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import javax.swing.Icon; import javax.swing.Icon;

View file

@ -13,12 +13,12 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo; import javax.swing.UIManager.LookAndFeelInfo;
import docking.theme.laf.*; import generic.theme.laf.*;
import ghidra.framework.OperatingSystem; import ghidra.framework.OperatingSystem;
import ghidra.framework.Platform; import ghidra.framework.Platform;
import ghidra.util.exception.AssertException; import ghidra.util.exception.AssertException;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
public interface Refreshable { public interface Refreshable {
public void refresh(); public void refresh();

View file

@ -0,0 +1,20 @@
/* ###
* 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 generic.theme;
public interface ThemeListener {
public void themeChanged(GTheme newTheme);
}

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
@ -26,7 +26,7 @@ public class ThemePropertiesLoader {
GThemeValueMap defaults = new GThemeValueMap(); GThemeValueMap defaults = new GThemeValueMap();
GThemeValueMap darkDefaults = new GThemeValueMap(); GThemeValueMap darkDefaults = new GThemeValueMap();
ThemePropertiesLoader() { public ThemePropertiesLoader() {
} }
public void load() { public void load() {

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme; package generic.theme;
import java.util.*; import java.util.*;

View file

@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme.builtin; package generic.theme.builtin;
import docking.theme.DiscoverableGTheme; import generic.theme.DiscoverableGTheme;
import docking.theme.LafType; import generic.theme.LafType;
public class CDEMotifTheme extends DiscoverableGTheme { public class CDEMotifTheme extends DiscoverableGTheme {

View file

@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme.builtin; package generic.theme.builtin;
import docking.theme.DiscoverableGTheme; import generic.theme.DiscoverableGTheme;
import docking.theme.LafType; import generic.theme.LafType;
public class FlatDarculaTheme extends DiscoverableGTheme { public class FlatDarculaTheme extends DiscoverableGTheme {
public FlatDarculaTheme() { public FlatDarculaTheme() {

View file

@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package docking.theme.builtin; package generic.theme.builtin;
import docking.theme.DiscoverableGTheme; import generic.theme.DiscoverableGTheme;
import docking.theme.LafType; import generic.theme.LafType;
public class FlatDarkTheme extends DiscoverableGTheme { public class FlatDarkTheme extends DiscoverableGTheme {
public FlatDarkTheme() { public FlatDarkTheme() {

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