diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java index b1865930d9..bb29c66e42 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemoryBox.java @@ -20,7 +20,7 @@ import java.awt.Graphics; import java.util.HashMap; import java.util.Map; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.program.model.address.AddressRange; import ghidra.trace.model.Lifespan; @@ -137,7 +137,7 @@ public class MemoryBox { int w = vertical ? getTimePixelWidth() : getAddressPixelWidth(); int y = vertical ? getAddressPixelStart() : getTimePixelStart(); int h = vertical ? getAddressPixelWidth() : getTimePixelWidth(); - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.fillRect(x - 1, y - 1, w + 2, h + 2); g.setColor(color); g.fillRect(x, y, w, h); @@ -148,7 +148,7 @@ public class MemoryBox { int w = vertical ? sz : getAddressPixelWidth(); int y = vertical ? getAddressPixelStart() : 0; int h = vertical ? getAddressPixelWidth() : sz; - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.fillRect(x - 1, y - 1, w + 2, h + 2); g.setColor(color); g.fillRect(x, y, w, h); @@ -159,7 +159,7 @@ public class MemoryBox { int w = vertical ? 1 : sz; int y = vertical ? 0 : getTimePixelStart(); int h = vertical ? sz : 1; - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.fillRect(x - 1, y - 1, w + 2, h + 2); g.setColor(color); g.fillRect(x, y, w, h); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java index a141efafe2..341289f903 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/memview/MemviewPanel.java @@ -23,7 +23,7 @@ import java.util.List; import javax.swing.*; import generic.theme.GColor; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressRange; @@ -64,7 +64,7 @@ public class MemviewPanel extends JPanel implements MouseListener, MouseMotionLi this.provider = provider; setPreferredSize(new Dimension(barWidth, barHeight)); setSize(getPreferredSize()); - setBorder(BorderFactory.createLineBorder(Java.BORDER, 1)); + setBorder(BorderFactory.createLineBorder(Colors.BORDER, 1)); setFocusable(true); addMouseListener(this); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java index db28e89df4..1349d0c742 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java @@ -29,7 +29,7 @@ import docking.widgets.button.GRadioButton; import docking.widgets.checkbox.GCheckBox; import docking.widgets.label.GDHtmlLabel; import docking.widgets.label.GLabel; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.app.merge.util.ConflictUtility; import ghidra.util.HTMLUtilities; import ghidra.util.layout.MaximizeSpecificColumnGridLayout; @@ -46,7 +46,7 @@ public class VariousChoicesPanel extends ConflictPanel { private final static long serialVersionUID = 1; private static final Border UNDERLINE_BORDER = - BorderFactory.createMatteBorder(0, 0, 1, 0, Java.BORDER); + BorderFactory.createMatteBorder(0, 0, 1, 0, Colors.BORDER); private JPanel rowPanel; private GDHtmlLabel headerLabel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java index b131ab07e7..d37221dc91 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java @@ -29,7 +29,7 @@ import docking.widgets.button.GRadioButton; import docking.widgets.checkbox.GCheckBox; import docking.widgets.label.GDHtmlLabel; import docking.widgets.label.GDLabel; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.app.merge.util.ConflictUtility; import ghidra.util.HTMLUtilities; import ghidra.util.datastruct.LongArrayList; @@ -190,7 +190,7 @@ public class VerticalChoicesPanel extends ConflictPanel { headerComps[i] = new MyLabel(items[i]); headerComps[i].setName(getComponentName(0, i)); setRowComponent(headerComps[i], 0, i, defaultInsets); - headerComps[i].setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Java.BORDER)); + headerComps[i].setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Colors.BORDER)); } } rowPanel.validate(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimesPropertyEditor.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimesPropertyEditor.java index 44296a8617..96fb94982e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimesPropertyEditor.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimesPropertyEditor.java @@ -21,7 +21,7 @@ import java.beans.PropertyEditorSupport; import javax.swing.*; import docking.widgets.label.GDLabel; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.framework.options.CustomOptionsEditor; import ghidra.util.layout.PairLayout; @@ -116,7 +116,7 @@ public class StoredAnalyzerTimesPropertyEditor extends PropertyEditorSupport new JTextField(StoredAnalyzerTimes.formatTimeMS(times.getTotalTime())); valueField.setEditable(false); valueField.setHorizontalAlignment(SwingConstants.RIGHT); - valueField.setBorder(BorderFactory.createLineBorder(Java.BORDER, 2)); + valueField.setBorder(BorderFactory.createLineBorder(Colors.BORDER, 2)); panel.add(valueField); return panel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java index 3b13c69e75..298463fff2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java @@ -26,8 +26,6 @@ import javax.swing.*; import javax.swing.event.*; import javax.swing.table.TableModel; -import org.apache.commons.lang3.ObjectUtils; - import docking.*; import docking.action.*; import docking.widgets.OptionDialog; @@ -41,11 +39,8 @@ import docking.widgets.pathmanager.PathnameTablePanel; import docking.widgets.table.GTableCellRenderer; import docking.widgets.table.GTableCellRenderingData; import generic.jar.ResourceFile; -import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.app.plugin.core.processors.SetLanguageDialog; -import ghidra.app.util.Option; import ghidra.app.util.cparser.C.CParserUtils; -import ghidra.app.util.exporter.Exporter; import ghidra.framework.Application; import ghidra.framework.options.SaveState; import ghidra.framework.preferences.Preferences; @@ -59,17 +54,17 @@ import ghidra.util.filechooser.ExtensionFileFilter; import resources.Icons; /** - * Dialog that shows files used for parsing C header files. The profile has a list of - * source header files to parse, followed by parse options (compiler directives). - * Ghidra supplies a Windows profile by default in core/parserprofiles. The user can do - * "save as" on this default profile to create new profiles that will be written to the - * user's /userprofiles directory. The CParserPlugin creates this directory if it + * Dialog that shows files used for parsing C header files. The profile has a list of + * source header files to parse, followed by parse options (compiler directives). + * Ghidra supplies a Windows profile by default in core/parserprofiles. The user can do + * "save as" on this default profile to create new profiles that will be written to the + * user's /userprofiles directory. The CParserPlugin creates this directory if it * doesn't exist. - * + * * The data types resulting from the parse operation can either be added to the data type * manager in the current program, or written to an archive data file. - * - * + * + * * */ class ParseDialog extends ReusableDialogComponentProvider { @@ -88,13 +83,13 @@ class ParseDialog extends ReusableDialogComponentProvider { private PathnameTablePanel pathPanel; private JTextArea parseOptionsField; - + protected JComponent languagePanel; protected JTextField languageTextField; protected JButton languageButton; protected String languageIDString = null; protected String compilerIDString = null; - + private GhidraComboBox comboBox; private DefaultComboBoxModel comboModel; private DockingAction saveAction; @@ -106,7 +101,7 @@ class ParseDialog extends ReusableDialogComponentProvider { private TableModelListener tableListener; private ItemListener comboItemListener; private TableModel tableModel; - + private PathnameTablePanel includePathPanel; private TableModel parsePathTableModel; private TableModelListener parsePathTableListener; @@ -116,7 +111,7 @@ class ParseDialog extends ReusableDialogComponentProvider { private ResourceFile parentUserFile; private boolean saveAsInProgress; private boolean initialBuild = true; - + private boolean userDefined = false; private String currentProfileName = null; @@ -134,27 +129,29 @@ class ParseDialog extends ReusableDialogComponentProvider { addDismissButton(); createActions(); setActionsEnabled(); - + // setup based on save state if (currentProfileName != null) { for (int i = 0; i < itemList.size(); i++) { ComboBoxItem item = itemList.get(i); - if (userDefined == item.isUserDefined && currentProfileName.equals(item.file.getName())) { + if (userDefined == item.isUserDefined && + currentProfileName.equals(item.file.getName())) { comboBox.setSelectedIndex(i); break; } } } - } else { + } + else { toFront(); } } - + void writeState(SaveState saveState) { // Get the current state if the dialog has been displayed if (!initialBuild) { ComboBoxItem item = (ComboBoxItem) comboBox.getSelectedItem(); - + currentProfileName = item.file.getName(); userDefined = item.isUserDefined; @@ -188,7 +185,7 @@ class ParseDialog extends ReusableDialogComponentProvider { protected JPanel buildMainPanel() { initialBuild = true; - + mainPanel = new JPanel(new BorderLayout(10, 5)); comboModel = new DefaultComboBoxModel<>(); @@ -217,7 +214,7 @@ class ParseDialog extends ReusableDialogComponentProvider { pathPanel.setFileChooserProperties("Choose Source Files", LAST_IMPORT_C_DIRECTORY, GhidraFileChooserMode.FILES_AND_DIRECTORIES, true, new ExtensionFileFilter(new String[] { "h" }, "C Header Files")); - + // Set default render to display red if file would not we found // Using include paths pathPanel.getTable().setDefaultRenderer(String.class, new GTableCellRenderer() { @@ -229,7 +226,7 @@ class ParseDialog extends ReusableDialogComponentProvider { String pathName = (String) value; pathName = (pathName == null ? "" : pathName.trim()); - + if (pathName.length() == 0 || pathName.startsWith("#")) { return label; } @@ -237,7 +234,7 @@ class ParseDialog extends ReusableDialogComponentProvider { boolean fileExists = true; File file = new File(pathName); fileExists = file.exists(); - + // file not found directly, see if one of the include paths will find the file if (!fileExists) { fileExists = doesFileExist(pathName, fileExists); @@ -245,14 +242,13 @@ class ParseDialog extends ReusableDialogComponentProvider { label.setText(pathName.toString()); if (!fileExists) { - label.setForeground(data.isSelected() ? Tables.FG_ERROR_SELECTED - : Tables.FG_ERROR_UNSELECTED); + label.setForeground(getErrorForegroundColor(data.isSelected())); } return label; } }); - + tableListener = e -> { ComboBoxItem item = (ComboBoxItem) comboBox.getSelectedItem(); item.isChanged = !initialBuild; @@ -260,7 +256,7 @@ class ParseDialog extends ReusableDialogComponentProvider { }; tableModel = pathPanel.getTable().getModel(); tableModel.addTableModelListener(tableListener); - + includePathPanel = new PathnameTablePanel(null, true, false); includePathPanel.setBorder(BorderFactory.createTitledBorder("Include paths")); includePathPanel.setFileChooserProperties("Choose Source Files", LAST_IMPORT_C_DIRECTORY, @@ -285,13 +281,13 @@ class ParseDialog extends ReusableDialogComponentProvider { JScrollPane pane = new JScrollPane(parseOptionsField); pane.getViewport().setPreferredSize(new Dimension(300, 200)); optionsPanel.add(pane, BorderLayout.CENTER); - + JPanel archPanel = new JPanel(new BorderLayout()); archPanel.setBorder(BorderFactory.createTitledBorder("Program Architecture:")); archPanel.add(new GLabel(" ", SwingConstants.RIGHT)); languagePanel = buildLanguagePanel(); archPanel.add(languagePanel); - + // create Parse Button parseButton = new JButton("Parse to Program"); @@ -304,19 +300,19 @@ class ParseDialog extends ReusableDialogComponentProvider { parseToFileButton.setToolTipText("Parse files and output to archive file"); addButton(parseToFileButton); - mainPanel.add(comboPanel, BorderLayout.NORTH); - + includePathPanel.setPreferredSize(new Dimension(pathPanel.getPreferredSize().width, 200)); - JSplitPane optionsPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, includePathPanel, optionsPanel); + JSplitPane optionsPane = + new JSplitPane(JSplitPane.VERTICAL_SPLIT, includePathPanel, optionsPanel); optionsPane.setResizeWeight(0.50); - + pathPanel.setPreferredSize(new Dimension(pathPanel.getPreferredSize().width, 200)); JSplitPane outerPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, pathPanel, optionsPane); outerPane.setResizeWeight(0.50); - + mainPanel.add(outerPane, BorderLayout.CENTER); - + mainPanel.add(archPanel, BorderLayout.SOUTH); setHelpLocation(new HelpLocation(plugin.getName(), "Parse_C_Source")); @@ -340,8 +336,8 @@ class ParseDialog extends ReusableDialogComponentProvider { } } return fileExists; - } - + } + private JComponent buildLanguagePanel() { languageTextField = new JTextField(); languageTextField.setEditable(false); @@ -349,31 +345,31 @@ class ParseDialog extends ReusableDialogComponentProvider { languageButton = new BrowseButton(); languageButton.addActionListener(e -> { - SetLanguageDialog dialog = new SetLanguageDialog(plugin.getTool(), languageIDString, compilerIDString, - "Select Program Architecture for File DataType Archive"); - LanguageID languageId = dialog.getLanguageDescriptionID(); - CompilerSpecID compilerSpecId = dialog.getCompilerSpecDescriptionID(); - if ((languageId == null) || (compilerSpecId == null)) { - return; - } - - String newLanguageIDString = languageId.getIdAsString(); - String newCompilerIDString = compilerSpecId.getIdAsString(); - - if (!Objects.equals(newLanguageIDString, languageIDString) || - !Objects.equals(newCompilerIDString, compilerIDString)) { - itemChanged(); - } - - languageIDString = newLanguageIDString; + SetLanguageDialog dialog = new SetLanguageDialog(plugin.getTool(), languageIDString, + compilerIDString, "Select Program Architecture for File DataType Archive"); + LanguageID languageId = dialog.getLanguageDescriptionID(); + CompilerSpecID compilerSpecId = dialog.getCompilerSpecDescriptionID(); + if ((languageId == null) || (compilerSpecId == null)) { + return; + } + + String newLanguageIDString = languageId.getIdAsString(); + String newCompilerIDString = compilerSpecId.getIdAsString(); + + if (!Objects.equals(newLanguageIDString, languageIDString) || + !Objects.equals(newCompilerIDString, compilerIDString)) { + itemChanged(); + } + + languageIDString = newLanguageIDString; compilerIDString = newCompilerIDString; - updateArchitectureDescription(); + updateArchitectureDescription(); }); - - updateArchitectureDescription(); - languageButton.setName("Set Processor Architecture"); + updateArchitectureDescription(); + + languageButton.setName("Set Processor Architecture"); Font font = languageButton.getFont(); languageButton.setFont(font.deriveFont(Font.BOLD)); @@ -387,13 +383,13 @@ class ParseDialog extends ReusableDialogComponentProvider { String newProgramArchitectureSummary = "64/32 (primarily for backward compatibility)"; if (languageIDString != null) { - StringBuilder buf = new StringBuilder(); - buf.append(languageIDString); - buf.append(" / "); - buf.append(compilerIDString != null ? compilerIDString : "none"); - newProgramArchitectureSummary = buf.toString(); + StringBuilder buf = new StringBuilder(); + buf.append(languageIDString); + buf.append(" / "); + buf.append(compilerIDString != null ? compilerIDString : "none"); + newProgramArchitectureSummary = buf.toString(); } - + languageTextField.setText(newProgramArchitectureSummary); } @@ -656,30 +652,30 @@ class ParseDialog extends ReusableDialogComponentProvider { String line = null; while ((line = br.readLine()) != null && line.trim().length() > 0) { line = line.trim(); - + pathList.add(line); } - + while ((line = br.readLine()) != null && line.trim().length() > 0) { line = line.trim(); - + sb.append(line + "\n"); } // get paths while ((line = br.readLine()) != null && line.trim().length() > 0) { line = line.trim(); - + includeList.add(line); } - + // get language while ((line = br.readLine()) != null) { line = line.trim(); if (line.length() > 0) { langString = (line.length() == 0 ? null : line); break; - } + } } // get compiler spec @@ -688,25 +684,24 @@ class ParseDialog extends ReusableDialogComponentProvider { if (line.length() > 0) { compileString = (line.length() == 0 ? null : line); break; - } + } } - String[] paths = new String[pathList.size()]; paths = pathList.toArray(paths); pathPanel.setPaths(paths); - + String[] incpaths = new String[includeList.size()]; incpaths = includeList.toArray(incpaths); includePathPanel.setPaths(incpaths); - + parseOptionsField.setText(sb.toString()); - + languageIDString = langString; - + compilerIDString = compileString; - - updateArchitectureDescription(); + + updateArchitectureDescription(); br.close(); } @@ -726,7 +721,7 @@ class ParseDialog extends ReusableDialogComponentProvider { setActionsEnabled(); } } - + private void writeProfile(ResourceFile outputFile) { // write the pathnames try { @@ -749,27 +744,27 @@ class ParseDialog extends ReusableDialogComponentProvider { writer.newLine(); // Write paths - String [] includePaths = includePathPanel.getPaths(); + String[] includePaths = includePathPanel.getPaths(); for (String path : includePaths) { writer.write(path.trim()); writer.newLine(); } writer.newLine(); - + // Write Language ID Spec if (languageIDString != null) { writer.write(languageIDString); } writer.newLine(); writer.newLine(); - + // Write Compiler ID Spec if (compilerIDString != null) { writer.write(compilerIDString); } writer.newLine(); writer.newLine(); - + writer.close(); } catch (IOException e) { @@ -808,17 +803,18 @@ class ParseDialog extends ReusableDialogComponentProvider { paths = expandPaths(paths); pathPanel.setPaths(paths); - - if (languageIDString == null || compilerIDString == null ) { + + if (languageIDString == null || compilerIDString == null) { Msg.showWarn(getClass(), rootPanel, "Program Architecture not Specified", - "A Program Architecture must be specified in order to parse to a file."); - return; + "A Program Architecture must be specified in order to parse to a file."); + return; } if (parseToFile) { File file = getSaveFile(); if (file != null) { - plugin.parse(paths, includePaths, options, languageIDString, compilerIDString, file.getAbsolutePath()); + plugin.parse(paths, includePaths, options, languageIDString, compilerIDString, + file.getAbsolutePath()); } } else { @@ -996,11 +992,7 @@ class ParseDialog extends ReusableDialogComponentProvider { @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((file == null) ? 0 : file.hashCode()); - result = prime * result + (isUserDefined ? 1231 : 1237); - return result; + return Objects.hash(file, isUserDefined); } } @@ -1017,55 +1009,54 @@ class ParseDialog extends ReusableDialogComponentProvider { return 1; } } - + //================================================================================================== // Methods for Testing //================================================================================================== + GhidraComboBox getParseComboBox() { + return comboBox; + } - GhidraComboBox getParseComboBox() { - return comboBox; - } + PathnameTablePanel getSourceFiles() { + return this.pathPanel; + } - PathnameTablePanel getSourceFiles() { - return this.pathPanel; - } - - PathnameTablePanel getIncludePaths() { - return this.includePathPanel; - } - - JTextArea getParseOptionsTextField() { - return this.parseOptionsField; - } - - JButton getLanguageButton() { - return this.languageButton; - } - - JTextField getLanguageText() { - return this.languageTextField; - } - - JButton getParseButton() { - return this.parseButton; - } - - JButton getParseToFileButton() { - return this.parseToFileButton; - } - - ArrayList getProfiles() { - return this.itemList; - } - - ComboBoxItem getCurrentItem() { - ComboBoxItem item = (ComboBoxItem) comboBox.getSelectedItem(); - - return item; - } - - ResourceFile getUserProfileParent() { - return parentUserFile; - } + PathnameTablePanel getIncludePaths() { + return this.includePathPanel; + } + + JTextArea getParseOptionsTextField() { + return this.parseOptionsField; + } + + JButton getLanguageButton() { + return this.languageButton; + } + + JTextField getLanguageText() { + return this.languageTextField; + } + + JButton getParseButton() { + return this.parseButton; + } + + JButton getParseToFileButton() { + return this.parseToFileButton; + } + + ArrayList getProfiles() { + return this.itemList; + } + + ComboBoxItem getCurrentItem() { + ComboBoxItem item = (ComboBoxItem) comboBox.getSelectedItem(); + + return item; + } + + ResourceFile getUserProfileParent() { + return parentUserFile; + } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableModel.java index ed31aaa02b..42d37ff792 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableModel.java @@ -25,7 +25,6 @@ import javax.swing.JTable; import docking.widgets.table.*; import generic.theme.GColor; -import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.app.util.ToolTipUtils; import ghidra.docking.settings.FormatSettingsDefinition; import ghidra.docking.settings.Settings; @@ -156,8 +155,7 @@ class EquateTableModel extends GDynamicColumnTableModel { JTable table = data.getTable(); if (!eq.isValidUUID()) { // Error equate - label.setForeground( - (isSelected) ? table.getSelectionForeground() : Tables.FG_ERROR_UNSELECTED); + label.setForeground(getErrorForegroundColor(isSelected)); } else if (!eq.isEnumBased()) { // User label label.setForeground( diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java index e44761a424..bde43ea7e2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java @@ -39,7 +39,7 @@ import docking.widgets.label.GLabel; import docking.widgets.table.*; import generic.theme.GIcon; import generic.theme.GThemeDefaults.Colors; -import generic.theme.GThemeDefaults.Colors.*; +import generic.theme.GThemeDefaults.Colors.Palette; import generic.util.WindowUtilities; import ghidra.app.services.DataTypeManagerService; import ghidra.app.util.ToolTipUtils; @@ -213,7 +213,7 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod thunkedText.setEditable(false); DockingUtils.setTransparent(thunkedText); CompoundBorder border = - BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Java.BORDER), + BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Colors.BORDER), BorderFactory.createEmptyBorder(0, 5, 0, 5)); thunkedText.setBorder(border); thunkedText.setForeground(FunctionColors.THUNK); @@ -652,13 +652,12 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod DataType dataType = (DataType) value; Color color = isSelected ? table.getSelectionForeground() : table.getForeground(); if (!tableModel.isCellEditable(row, column)) { - color = - isSelected ? Tables.FG_UNEDITABLE_SELECTED : Tables.FG_UNEDITABLE_UNSELECTED; + color = getUneditableForegroundColor(isSelected); } if (dataType != null) { setText(dataType.getName()); if (dataType.isNotYetDefined()) { - color = isSelected ? Tables.FG_ERROR_SELECTED : Tables.FG_ERROR_UNSELECTED; + color = getErrorForegroundColor(isSelected); } String toolTipText = ToolTipUtils.getToolTipText(dataType); String headerText = "" + @@ -782,8 +781,7 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod boolean isInvalidStorage = !storage.isValid() || rowData.getFormalDataType().getLength() != storage.size(); if (isInvalidStorage) { - setForeground( - isSelected ? Tables.FG_ERROR_SELECTED : Tables.FG_ERROR_UNSELECTED); + setForeground(getErrorForegroundColor(isSelected)); setToolTipText("Invalid Parameter Storage"); } else { @@ -818,8 +816,7 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod ParameterTableModel tableModel = (ParameterTableModel) table.getModel(); if (!tableModel.isCellEditable(row, column)) { - setForeground( - isSelected ? Tables.FG_UNEDITABLE_SELECTED : Tables.FG_UNEDITABLE_UNSELECTED); + setForeground(getUneditableForegroundColor(isSelected)); } else { if (isSelected) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageTableCellEditor.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageTableCellEditor.java index cd89ebe0fe..ca6283b2bb 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageTableCellEditor.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageTableCellEditor.java @@ -15,6 +15,7 @@ */ package ghidra.app.plugin.core.function.editor; +import java.awt.Color; import java.awt.Component; import java.awt.event.MouseEvent; import java.util.EventObject; @@ -53,8 +54,7 @@ class StorageTableCellEditor extends AbstractCellEditor implements TableCellEdit boolean isSelected, int row, int column) { String stringValue = value == null ? "" : value.toString(); JTextField field = new JTextField(stringValue); - field.setBackground( - isSelected ? Tables.FG_UNEDITABLE_SELECTED : Tables.FG_UNEDITABLE_UNSELECTED); + field.setBackground(getUneditableForegroundColor(isSelected)); field.setEditable(false); ParameterTableModel tableModel = (ParameterTableModel) table.getModel(); FunctionVariableData rowData = tableModel.getRowObject(row); @@ -78,4 +78,9 @@ class StorageTableCellEditor extends AbstractCellEditor implements TableCellEdit }); return field; } + + protected Color getUneditableForegroundColor(boolean isSelected) { + return isSelected ? Tables.UNEDITABLE_SELECTED : Tables.UNEDITABLE_UNSELECTED; + } + } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagProvider.java index 7c5ed34091..1c69ed1822 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagProvider.java @@ -27,7 +27,7 @@ import org.apache.commons.lang3.StringUtils; import docking.widgets.label.GLabel; import docking.widgets.textfield.HintTextField; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.app.cmd.function.CreateFunctionTagCmd; import ghidra.app.context.ProgramActionContext; import ghidra.framework.cmd.Command; @@ -239,9 +239,9 @@ public class FunctionTagProvider extends ComponentProviderAdapter targetPanel = new TargetTagsPanel(this, tool, "Assigned To Function"); allFunctionsPanel = new AllFunctionsPanel(program, this, "Functions with Selected Tag"); buttonPanel = new FunctionTagButtonPanel(sourcePanel, targetPanel); - sourcePanel.setBorder(BorderFactory.createLineBorder(Java.BORDER)); - targetPanel.setBorder(BorderFactory.createLineBorder(Java.BORDER)); - allFunctionsPanel.setBorder(BorderFactory.createLineBorder(Java.BORDER)); + sourcePanel.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); + targetPanel.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); + allFunctionsPanel.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); // If we don't set this, then the splitter won't be able to shrink the // target panels below the size required by its header, which can be large diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java index 458f6c0297..21885dcd8e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/hover/AbstractReferenceHover.java @@ -24,8 +24,8 @@ import javax.swing.JToolTip; import docking.widgets.fieldpanel.field.Field; import docking.widgets.fieldpanel.support.FieldLocation; -import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors.Messages; +import generic.theme.GThemeDefaults.Colors.Tooltips; import ghidra.app.plugin.core.gotoquery.GoToHelper; import ghidra.app.services.CodeFormatService; import ghidra.app.util.*; @@ -46,7 +46,7 @@ import ghidra.util.bean.opteditor.OptionsVetoException; public abstract class AbstractReferenceHover extends AbstractConfigurableHover { private static final int WINDOW_OFFSET = 50; - private static final Color BACKGROUND_COLOR = Colors.BG_TOOLTIP; + private static final Color BACKGROUND_COLOR = Tooltips.BACKGROUND; private static final Color FG_COLOR_NOT_IN_MEMORY = Messages.HINT; private CodeFormatService codeFormatService; @@ -251,21 +251,21 @@ public abstract class AbstractReferenceHover extends AbstractConfigurableHover { /* Format - + Address: ram:1234 Address not in memory - - + + Or, when multiple symbols at destination - - + + Address: ram:1234 - Symbols (3): + Symbols (3): foo bar baz Address not in memory - + */ String newline = HTMLUtilities.HTML_NEW_LINE; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/ControlPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/ControlPanel.java index ac8c4fb3f5..a6e80668e0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/ControlPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/ControlPanel.java @@ -21,7 +21,7 @@ import java.awt.GridBagLayout; import javax.swing.BorderFactory; import javax.swing.JPanel; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.app.plugin.core.instructionsearch.InstructionSearchPlugin; /** @@ -57,7 +57,7 @@ public class ControlPanel extends JPanel { gbc.weightx = 1.0; this.add(directionWidget, gbc); - this.setBorder(BorderFactory.createLineBorder(Java.BORDER)); + this.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); } public SelectionScopeWidget getRangeWidget() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java index 00a4efe5d4..cadedb4ce8 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/interpreter/CodeCompletionWindow.java @@ -25,20 +25,14 @@ import javax.swing.border.EmptyBorder; import javax.swing.event.ListDataListener; import docking.widgets.list.GListCellRenderer; -import generic.theme.GThemeDefaults.Colors; +import generic.theme.GThemeDefaults.Colors.Tooltips; import generic.util.WindowUtilities; import ghidra.app.plugin.core.console.CodeCompletion; /** * This class encapsulates a code completion popup Window for the ConsolePlugin. - * - * - * */ public class CodeCompletionWindow extends JDialog { - private static final long serialVersionUID = 1L; - /* from ReferenceHoverPlugin */ - private static final Color BACKGROUND_COLOR = Colors.BG_TOOLTIP; protected final InterpreterPanel console; protected final JTextPane outputTextField; @@ -50,17 +44,6 @@ public class CodeCompletionWindow extends JDialog { /* current list of completions */ protected JList jlist; - /** - * Constructs a new CodeCompletionWindow. - * - * We pass in the PluginTool so we can get a reference to the Frame we are - * popping up over, as well as the text field we are coming from (so we - * can fine-tune where we pop up). - * - * @param tool the PluginTool the has the Frame we are popping up over - * @param console the ConsolePlugin we are providing services for - * @param outputTextField the JTextField from whence we came - */ public CodeCompletionWindow(Window parent, InterpreterPanel cp, JTextPane textField) { super(parent); @@ -73,7 +56,7 @@ public class CodeCompletionWindow extends JDialog { /* don't steal focus from text input! */ setFocusableWindowState(false); - jlist.setBackground(BACKGROUND_COLOR); + jlist.setBackground(Tooltips.BACKGROUND); jlist.setCellRenderer(new CodeCompletionListCellRenderer()); /* add the ability to double-click a code completion */ MouseListener mouseListener = new MouseAdapter() { @@ -105,11 +88,11 @@ public class CodeCompletionWindow extends JDialog { /** * Process a KeyEvent for this Window. - * + * * This method is located here so that others (e.g. ConsolePlugin) can * forward KeyEvents to us, or we can process KeyEvents that were directed * to us (because we had focus instead). - * + * * @param e KeyEvent */ @Override @@ -119,22 +102,22 @@ public class CodeCompletionWindow extends JDialog { /** * Updates the completion list with the given completion mapping. - * + * * The format, as mentioned above, is: * "attribute" -> "substitution value" * If the substitution value is null, then that attribute will not be * selectable for substitution. - * + * * After updating the mapping, this Window then updates its size as * appropriate. - * + * * The Window also will attempt to move out of the way of the cursor/caret * in the textField. However, if the caret's position had recently been * changed and the caret had not been repainted yet, then the caret's * location can be null. In this case, the Window will not move. * You can avoid this condition by calling this method in a * SwingUtilities.invokeLater(Runnable). - * + * * @param list List of code completions */ public void updateCompletionList(List list) { @@ -257,9 +240,9 @@ public class CodeCompletionWindow extends JDialog { /** * Sets the Font on this CodeCompletionWindow. - * + * * Basically sets the Font in the completion list. - * + * * @param font the new Font */ @Override @@ -303,9 +286,9 @@ public class CodeCompletionWindow extends JDialog { /** * Returns the currently selected code completion. - * + * * Returns "" if there is none. - * + * * @return the currently selected code completion, or null if none selected */ public CodeCompletion getCompletion() { @@ -359,12 +342,12 @@ class CodeCompletionListModel implements ListModel { /** * This data type handles selection changes in the CodeCompletionWindow. - * + * * This contains all the "smarts" to determine whether or not indices can be * selected. So when the user clicks on an entry with the mouse, we choose * whether or not that index can actually be highlighted/selected. - * - * + * + * * */ class CodeCompletionListSelectionModel extends DefaultListSelectionModel { @@ -372,7 +355,7 @@ class CodeCompletionListSelectionModel extends DefaultListSelectionModel { /** * Constructs a new CodeCompletionListSelectionModel using the given List. - * + * * @param l the List to use */ public CodeCompletionListSelectionModel(List l) { @@ -382,10 +365,10 @@ class CodeCompletionListSelectionModel extends DefaultListSelectionModel { /** * Called when the selection needs updating. - * + * * Here we will check the value of the new index and determine whether or * not we actually want to select it. - * + * * @param index0 old index * @param index1 new index */ @@ -405,9 +388,6 @@ class CodeCompletionListSelectionModel extends DefaultListSelectionModel { /** * Renders CodeCompletions for the CodeCompletionWindow. - * - * - * */ class CodeCompletionListCellRenderer extends GListCellRenderer { @@ -418,21 +398,21 @@ class CodeCompletionListCellRenderer extends GListCellRenderer { /** * Render either a default list cell, or use the one provided. - * + * * If the CodeCompletion we got has a Component to be used, then use that. * Otherwise, we use the DefaultListCellRenderer routine. */ @Override public Component getListCellRendererComponent(JList list, CodeCompletion codeCompletion, int index, boolean isSelected, boolean cellHasFocus) { - if (null == codeCompletion.getComponent()) { + if (codeCompletion.getComponent() == null) { return super.getListCellRendererComponent(list, codeCompletion, index, isSelected, cellHasFocus); } - /* ooh, we have a fancy component! */ JComponent component = codeCompletion.getComponent(); - /* if it's selected, make sure it shows up that way */ + + // if it's selected, make sure it shows up that way component.setOpaque(true); if (isSelected) { component.setBackground(list.getSelectionBackground()); @@ -440,7 +420,7 @@ class CodeCompletionListCellRenderer extends GListCellRenderer { else { component.setBackground(list.getBackground()); } - /* other nice formatting stuff */ + component.setEnabled(list.isEnabled()); component.setFont(list.getFont()); component.setComponentOrientation(list.getComponentOrientation()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesTableModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesTableModel.java index 671955bdab..5736acd5ec 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesTableModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/locationreferences/LocationReferencesTableModel.java @@ -21,7 +21,6 @@ import java.util.*; import org.apache.commons.lang3.StringUtils; import docking.widgets.table.GTableCellRenderingData; -import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.docking.settings.Settings; import ghidra.framework.plugintool.ServiceProvider; import ghidra.program.model.address.Address; @@ -127,8 +126,7 @@ class LocationReferencesTableModel extends AddressBasedTableModel { + extends AbstractProgramBasedDynamicTableColumn { private ContextCellRenderer renderer = new ContextCellRenderer(); @@ -189,8 +187,7 @@ class LocationReferencesTableModel extends AddressBasedTableModel knots = palette.getKnots(); - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.drawLine(5, topBottomMargin - 6, 10, topBottomMargin - ascent + 2); g.drawString("min entropy (0.0)", 20, topBottomMargin - ascent - descent); @@ -70,7 +70,7 @@ public class KnotLabelPanel extends JPanel { g.drawLine(5, y, 10, y); } - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.drawLine(5, height + topBottomMargin + 4, 10, height + topBottomMargin + 8); g.drawString("max entropy (8.0)", 20, topBottomMargin + height + ascent + descent); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java index 3ab95ed958..1b609c8b1c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/PalettePanel.java @@ -19,7 +19,7 @@ import java.awt.*; import javax.swing.JPanel; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; public class PalettePanel extends JPanel { @@ -47,7 +47,7 @@ public class PalettePanel extends JPanel { g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); if (palette == null) { g.drawRect(0, 0, width - 1, height - 1); return; @@ -64,7 +64,7 @@ public class PalettePanel extends JPanel { g.setColor(c); g.fillRect(0, topBottomMargin + i, width, 1); } - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.drawRect(0, topBottomMargin, width - 1, height); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java index 9efa618862..d1ba660ebe 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java @@ -31,7 +31,7 @@ import javax.swing.text.Document; import docking.widgets.list.GListCellRenderer; import generic.theme.GColor; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.program.model.listing.Program; /** @@ -154,7 +154,7 @@ class ProgramListPanel extends JPanel { // add some padding around the panel Border innerBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5); - Border outerBorder = BorderFactory.createLineBorder(Java.BORDER); + Border outerBorder = BorderFactory.createLineBorder(Colors.BORDER); Border compoundBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder); setBorder(compoundBorder); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java index 4b52614ca0..9eb5dd2f9b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java @@ -36,7 +36,6 @@ import docking.widgets.label.GDLabel; import docking.widgets.label.GLabel; import generic.theme.GColor; import generic.theme.GThemeDefaults.Colors; -import generic.theme.GThemeDefaults.Colors.Java; import ghidra.app.util.AddressInput; import ghidra.program.model.address.*; import ghidra.program.model.listing.*; @@ -534,7 +533,7 @@ class EditMemoryReferencePanel extends EditReferencePanel { model = new HistoryTableModel(fromCodeUnit.getProgram()); displayTable = new JTable(model); displayTable.setTableHeader(null); - displayTable.setBorder(new LineBorder(Java.BORDER)); + displayTable.setBorder(new LineBorder(Colors.BORDER)); displayTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); displayTable.addMouseListener(new MouseAdapter() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferencesProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferencesProvider.java index 39dd6b7022..600a8cc99e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferencesProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditReferencesProvider.java @@ -37,7 +37,6 @@ import docking.widgets.checkbox.GCheckBox; import docking.widgets.table.*; import generic.theme.GColor; import generic.theme.GIcon; -import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.app.events.ProgramSelectionPluginEvent; import ghidra.app.util.SelectionTransferData; import ghidra.app.util.SelectionTransferable; @@ -115,7 +114,7 @@ public class EditReferencesProvider extends ComponentProviderAdapter /** * Set drag feedback according to the ok parameter. - * + * * @param ok true means the drop action is OK * @param e event that has current state of drag and drop operation */ @@ -127,7 +126,7 @@ public class EditReferencesProvider extends ComponentProviderAdapter /** * Return true if is OK to drop the transferable at the location * specified the event. - * + * * @param e event that has current state of drag and drop operation */ @Override @@ -136,8 +135,7 @@ public class EditReferencesProvider extends ComponentProviderAdapter Memory memory = currentCodeUnit.getProgram().getMemory(); try { Object data = e.getTransferable() - .getTransferData( - SelectionTransferable.localProgramSelectionFlavor); + .getTransferData(SelectionTransferable.localProgramSelectionFlavor); AddressSetView view = ((SelectionTransferData) data).getAddressSet(); if (memory.contains(view)) { return true; @@ -164,7 +162,7 @@ public class EditReferencesProvider extends ComponentProviderAdapter /** * Add the object to the droppable component. The DropTargetAdapter * calls this method from its drop() method. - * + * * @param obj Transferable object that is to be dropped; in this case, * it is an AddressSetView * @param e has current state of drop operation @@ -289,8 +287,8 @@ public class EditReferencesProvider extends ComponentProviderAdapter enableGotoReferenceLocation(gotoReferenceLocationToggleAction.isSelected()); } }; - gotoReferenceLocationToggleAction.setToolBarData( - new ToolBarData(SEND_LOCATION_ICON, "NavAction")); + gotoReferenceLocationToggleAction + .setToolBarData(new ToolBarData(SEND_LOCATION_ICON, "NavAction")); gotoReferenceLocationToggleAction.setEnabled(true); tool.addLocalAction(this, gotoReferenceLocationToggleAction); @@ -527,7 +525,7 @@ public class EditReferencesProvider extends ComponentProviderAdapter /** * Find the Data at the currentCuAddress - * + * * @param data place to begin searching * @return Data starting at currentCuAddress */ @@ -852,7 +850,7 @@ public class EditReferencesProvider extends ComponentProviderAdapter //================================================================================================== // Inner Classes -//================================================================================================== +//================================================================================================== /** Fun little storage object */ private class ReferenceInfo { @@ -890,8 +888,8 @@ public class EditReferencesProvider extends ComponentProviderAdapter } Reference ref = tableModel.getReference(row); - RefType[] refTypes = EditReferencesModel.getAllowedRefTypes( - EditReferencesProvider.this.currentProgram, ref); + RefType[] refTypes = EditReferencesModel + .getAllowedRefTypes(EditReferencesProvider.this.currentProgram, ref); comboBox.removeAllItems(); int selectedIndex = -1; @@ -913,10 +911,6 @@ public class EditReferencesProvider extends ComponentProviderAdapter private class CellEditComboBox extends JComboBox { - public CellEditComboBox() { - super(); - } - @Override public void setSelectedIndex(int anIndex) { if (refsTable.getRowCount() == 0) { @@ -1035,40 +1029,27 @@ public class EditReferencesProvider extends ComponentProviderAdapter super.getTableCellRendererComponent(data); - JTable table = data.getTable(); int row = data.getRowViewIndex(); boolean isSelected = data.isSelected(); Reference ref = tableModel.getReference(row); - Address addr = ref.getToAddress(); Memory memory = tableModel.getProgram().getMemory(); boolean bad = addr.isMemoryAddress() ? !memory.contains(addr) : false; - setOpaque(false); // disable table striping - setFont(table.getFont()); + // disable table striping when not selected to reduce clutter + setOpaque(isSelected); - if (isSelected) { - if (bad) { - setForeground(Tables.FG_ERROR_SELECTED); - setFont(boldFont); - } - else { - setFont(defaultFont); - } - - setOpaque(true); + if (bad) { + setForeground(getErrorForegroundColor(isSelected)); + setFont(boldFont); } else { - // set color to red if address does not exist in memory + setFont(defaultFont); + } - if (bad) { - setForeground(Tables.FG_ERROR_UNSELECTED); - setFont(boldFont); - } - else { - setFont(defaultFont); - } + // use a special color when not selected to show which row matches the operand + if (!isSelected) { if (ref.getOperandIndex() == instrPanel.getSelectedOpIndex()) { setBackground(BG_COLOR_ACTIVE_OPERAND); setOpaque(true); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptTableModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptTableModel.java index ebb81e91ad..ac44f948d6 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptTableModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptTableModel.java @@ -372,7 +372,7 @@ class GhidraScriptTableModel extends GDynamicColumnTableModelWe have to set this to true painting, but then false when we are done (Java - * components will not paint themselves if the are not showing). - * + * + *

We have to set this to true painting, but then false when we are done (Java + * components will not paint themselves if the are not showing). + * * @param isShowing true if the component is showing */ public void setShowing(boolean isShowing); diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java index 0bf64aa90b..dd891e06f3 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/ListingGraphComponentPanel.java @@ -40,6 +40,7 @@ import docking.widgets.label.GDLabel; import generic.theme.GColor; import generic.theme.GIcon; import generic.theme.GThemeDefaults.Colors; +import generic.theme.GThemeDefaults.Colors.Tooltips; import ghidra.app.plugin.core.codebrowser.hover.ListingHoverService; import ghidra.app.plugin.core.functiongraph.FunctionGraphPlugin; import ghidra.app.plugin.core.functiongraph.graph.FGEdge; @@ -203,7 +204,7 @@ public class ListingGraphComponentPanel extends AbstractGraphComponentPanel { boolean useFullSizeTooltip = options.useFullSizeTooltip(); previewListingPanel = new FGVertexListingPanel(controller, getFormatManager(useFullSizeTooltip), program, addressSet); - previewListingPanel.setTextBackgroundColor(FGVertex.TOOLTIP_BACKGROUND_COLOR); + previewListingPanel.setTextBackgroundColor(Tooltips.BACKGROUND); previewListingPanel.getFieldPanel().setCursorOn(false); // keep the tooltip window from getting too big; use an arbitrary, reasonable max @@ -216,14 +217,14 @@ public class ListingGraphComponentPanel extends AbstractGraphComponentPanel { tooltipTitleLabel = new GDLabel(); tooltipTitleLabel.setHorizontalAlignment(SwingConstants.LEADING); - tooltipTitleLabel.setBackground(FGVertex.TOOLTIP_BACKGROUND_COLOR); + tooltipTitleLabel.setBackground(Tooltips.BACKGROUND); tooltipTitleLabel.setOpaque(true); Font labelFont = tooltipTitleLabel.getFont(); tooltipTitleLabel.setFont(labelFont.deriveFont(Font.BOLD)); JPanel headerPanel = new JPanel(new BorderLayout()); headerPanel.add(tooltipTitleLabel); - headerPanel.setBorder(BorderFactory.createLineBorder(Colors.Java.BORDER)); + headerPanel.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); panel.add(headerPanel, BorderLayout.NORTH); panel.add(previewListingPanel, BorderLayout.CENTER); diff --git a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidFunctionDebugPanel.java b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidFunctionDebugPanel.java index 68d6a58835..f638525265 100644 --- a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidFunctionDebugPanel.java +++ b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidFunctionDebugPanel.java @@ -21,7 +21,7 @@ import java.awt.event.ActionListener; import javax.swing.*; import docking.widgets.label.GDLabel; -import generic.theme.GThemeDefaults; +import generic.theme.GThemeDefaults.Ids.Fonts; import generic.theme.Gui; import ghidra.feature.fid.db.*; import ghidra.feature.fid.service.FidService; @@ -38,6 +38,7 @@ public class FidFunctionDebugPanel extends JPanel { /** * Creates the panel. * @param service the FID database service + * @param fidQueryService the query service * @param functionRecord the function record to debug */ public FidFunctionDebugPanel(FidService service, FidQueryService fidQueryService, @@ -57,7 +58,7 @@ public class FidFunctionDebugPanel extends JPanel { JButton button = new JButton(text); button.addActionListener(listener); button.setHorizontalAlignment(SwingConstants.LEFT); - Gui.registerFont(button, GThemeDefaults.Ids.Fonts.MONOSPACED); + Gui.registerFont(button, Fonts.MONOSPACED); add(button); } @@ -68,7 +69,7 @@ public class FidFunctionDebugPanel extends JPanel { private void addLabel(String text) { JLabel label = new GDLabel(text); label.setHorizontalAlignment(SwingConstants.LEFT); - label.setFont(Gui.getFont("font.monospaced")); + Gui.registerFont(label, Fonts.MONOSPACED); add(label); } @@ -85,16 +86,14 @@ public class FidFunctionDebugPanel extends JPanel { libraryRecord.getLibraryVersion(), libraryRecord.getLibraryVariant(), languageID.getIdAsString())); - addButton(String.format("0x%016x", functionRecord.getID()), - e -> FidDebugUtils.searchByFunctionID(functionRecord.getID(), service, - fidQueryService)); + addButton(String.format("0x%016x", functionRecord.getID()), e -> FidDebugUtils + .searchByFunctionID(functionRecord.getID(), service, fidQueryService)); addButton(functionRecord.getName(), e -> FidDebugUtils.searchByName(functionRecord.getName(), service, fidQueryService)); - addButton(shorten(functionRecord.getDomainPath()), - e -> FidDebugUtils.searchByDomainPath(functionRecord.getDomainPath(), service, - fidQueryService)); + addButton(shorten(functionRecord.getDomainPath()), e -> FidDebugUtils + .searchByDomainPath(functionRecord.getDomainPath(), service, fidQueryService)); addLabel(String.format("Entry Point: 0x%x", functionRecord.getEntryPoint())); diff --git a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchDebugDialog.java b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchDebugDialog.java index 3ba1bb1279..e0d938b420 100644 --- a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchDebugDialog.java +++ b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchDebugDialog.java @@ -77,13 +77,13 @@ public class FidSearchDebugDialog extends DialogComponentProvider { private JLabel getPreparedLabel(String text) { JLabel label = new GDLabel(text, SwingConstants.RIGHT); - label.setFont(Gui.getFont(Fonts.MONOSPACED)); + Gui.registerFont(label, Fonts.MONOSPACED); return label; } private JTextField getPreparedTextField() { JTextField textField = new JTextField(25); - textField.setFont(Gui.getFont(Fonts.MONOSPACED)); + Gui.registerFont(textField, Fonts.MONOSPACED); return textField; } diff --git a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java index 1e246cedc7..113fda52dc 100644 --- a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java +++ b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java @@ -26,8 +26,6 @@ import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import docking.widgets.table.*; -import generic.theme.GThemeDefaults.Ids.Fonts; -import generic.theme.Gui; import ghidra.feature.fid.db.*; import ghidra.feature.fid.service.FidService; import ghidra.util.Msg; @@ -66,7 +64,7 @@ public class FidSearchResultFrame extends JFrame implements FidQueryCloseListene private void buildFrame() { GTableCellRenderer renderer = new GTableCellRenderer(); - renderer.setFont(Gui.getFont(Fonts.MONOSPACED)); + renderer.setFont(renderer.getFixedWidthFont()); int columnCount = table.getColumnCount(); for (int ii = 0; ii < columnCount; ++ii) { Class columnClass = table.getColumnClass(ii); diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMarkupStatusIcon.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMarkupStatusIcon.java index ec9b80fbdd..e7de5e8cc9 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMarkupStatusIcon.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMarkupStatusIcon.java @@ -22,7 +22,7 @@ import java.util.List; import javax.swing.Icon; import generic.theme.GColor; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.feature.vt.api.main.VTAssociationMarkupStatus; public class VTMarkupStatusIcon implements Icon { @@ -74,7 +74,7 @@ public class VTMarkupStatusIcon implements Icon { drawBar(g, x + startX + BORDER + 1, y + BORDER + 1, width, colors.get(i)); } - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.drawRect(x, y, WIDTH, HEIGHT); // g.drawRect(x, y, WIDTH / 2, HEIGHT); g.drawRect(x + WIDTH, y + HEIGHT / 2 - 3, KNOB_WIDTH, 6); diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/wizard/NewSessionPanel.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/wizard/NewSessionPanel.java index 033a24ba16..d4359d9769 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/wizard/NewSessionPanel.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/wizard/NewSessionPanel.java @@ -27,7 +27,9 @@ import org.apache.commons.lang3.StringUtils; import docking.widgets.button.BrowseButton; import docking.widgets.label.GDLabel; import docking.wizard.*; -import generic.theme.*; +import generic.theme.GIcon; +import generic.theme.GThemeDefaults.Ids.Fonts; +import generic.theme.Gui; import ghidra.app.util.task.OpenProgramTask; import ghidra.app.util.task.OpenProgramTask.OpenProgramRequest; import ghidra.framework.main.DataTreeDialog; @@ -74,7 +76,7 @@ public class NewSessionPanel extends AbstractMageJPanel { folderLabel.setHorizontalAlignment(SwingConstants.RIGHT); folderLabel.setToolTipText("The folder to store the new Version Tracking Session"); folderNameField = new JTextField(); - Gui.registerFont(folderNameField, GThemeDefaults.Ids.Fonts.MONOSPACED); + Gui.registerFont(folderNameField, Fonts.MONOSPACED); folderNameField.setEditable(false); // force user to browse to choose JButton browseFolderButton = new BrowseButton(); diff --git a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingDeveloperDocs.html b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingDeveloperDocs.html index ff9ab1c82f..af3700ef0f 100644 --- a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingDeveloperDocs.html +++ b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingDeveloperDocs.html @@ -2,8 +2,6 @@ - Developer's Guide @@ -21,8 +19,8 @@ want to use colors, fonts, and icons. The key idea to support theming is to never directly reference those resources. Instead, the developer should create an ID string for the resource - and then in a module.theme.properties file, provide a default value for that ID. - (Also, you may define an alternate "dark" default value that will be used if the + and then in a module.theme.properties file, provide a default value for that + ID. (Also, you may define an alternate "dark" default value that will be used if the current theme is considered a dark theme). The way you define and use these IDs is a bit different depending on whether the resource is a color, font, or icon. Colors and icons are similar in that developers use these types by creating either @@ -182,6 +180,42 @@

  • icon.plugin.byteviewer.provider
  • + +
      +
    • System IDs: The following resource IDs are created and + used by the system. For a description of how these IDs are used internally by the + application, see the UiDefaultsMapper class . The system.* keys + allow users to quickly change many Look and Feel values via these high-level concepts. The + laf.* properties are for internal use and do not need to be changed by the user. + A description of the system properties can be found in the SystemThemeIds class. +
    • +
    +
    + +
      +
    • laf.color.*
    • +
    • laf.font.*
    • +
    • laf.icon.*
    • +
    + + +
      +
    • system.color.*
    • +
    • system.font.*
    • +
    + +

    + The system property names use the standard property names, such as + font, bg and fg. These properties introduce these additional terms: + control, view, menu and tooltip. control refers to items that + generally control the state of the application, such as buttons and check boxes. + view refers to widgets that display data, such as trees, tables and text + fields. menu and tooltip work with the items after which they are + named. +

    + +
    +

    Theme Property Files

    @@ -198,7 +232,7 @@ they exist in a module's data directory and are named with the .theme.properties suffix.

    -

    Theme Properties File Naming Convention

    +

    Theme Properties File Naming Convention

    To promote consistency, theme property files should use the following naming convention:

    @@ -260,7 +294,7 @@ color.bg.listing = color.bg color.fg.listing.address = black color.fg.listing.bytes = #00ff00 -font.global = courirer-BOLD-12 +font.global = courier-BOLD-12 font.global.listing = font.global icon.error = defaultError.png @@ -295,11 +329,22 @@ color.fg.listing.bytes = orange example, a reference color entry might be something like "color.bg.listing = color.bg". This says that the listing's background color should be whatever "color.bg" is defined to be. Note that all of the application's defined properties start with either "color.", "font.", or - "icon.". Properties defined by a Java Look and Feel don't follow this pattern. To reference a - property that does not have a standard prefix, an ID can be prefixed with "[color]", - "[font]", or "[icon] as appropriate to allow the theme property parser to recognize the - values as IDs to other properties. So to refer to a Java property named "table.background", - you would use the following definition: "color.bg.table = [color]table.background".

    + "icon.". + +

    + Properties defined by the theming system do not follow this pattern. To reference a + property that does not have a standard prefix, an ID can be prefixed with [color] + , [font], or [icon] as appropriate to allow the theme + property parser to recognize the values as IDs to other properties. For example, to refer to a + system property namedsystem.color.bg.view, + you would use the following definition: +

    + +

    + color.bg.tree = [color]system.color.bg.view +

    + +

    Color Values

    @@ -319,8 +364,8 @@ color.fg.listing.bytes = orange
  • rgba(red, green, blue, alpha)
  • -
  • web color name // the case-insensitive name of a web color such as red, olive, or - purple
  • +
  • web color name // the case-insensitive name of a web color such as red, olive, + or purple
  • @@ -449,6 +494,126 @@ color.fg.listing.bytes = orange + + +

    Useful Concepts

    + + +

    GThemeDefaults

    + +
    +

    + This class contains many common application theme values for developers to use, such as + the default background color. These values can be used directly so developers do not have + to instantiate theme objects using theme IDs. +

    +
    + +

    Icons

    + +
    +

    + When adding icons to the application, consider using standard icons provided by the + Icons class. Many generic concepts that require icons are in this class. +

    +
    + +

    Palette Colors

    + +
    +

    + A list of palette colors has been defined in gui.palette.theme.properties.. + These palette colors values are meant to be used by developers to reduce the total number + of colors used in the application. These color ids and values are viewable in the + Theme Editor Dialog. +

    +

    + One of the benefits of using the palette system is that it is easy for end-users to change + one palette color to update all widgets in the application. +

    +

    + We recommend you use the existing palette colors when picking colors for your widgets. +

    +
    + + +

    HTML Foreground Colors in Messages

    + +
    +

    + Some developers use HTML messages in labels, tables, tooltips, and in calls to system APIs, + like Msg. Using HTML text allows clients to control the formatting of the + text, including the usage of color. If you use color in your HTML, then we suggest you do + so using GColors, like this: +

    +    String message = "Some text: <FONT COLOR=\"" + Messages.ERROR + "\">" + errorText + "";
    +		
    + +

    + In this example, an HTML message is created and part of that text is colored with the + standard error message color, which is red in a light mode theme. You can also use your + own GColor object in your HTML messages. Using standard system colors or + GColors allows these colors to be updated as the theme changes. We do not + recommend the use of hard-coded color values. +

    +
    + + + +

    Options Usage of Colors and Fonts

    + + +
    +

    + The Options class in Ghidra facilitates user-configurable options in the + application. Previously, developers could use options to allow end-users to control color + values. In the new theme-based system, all colors are controlled via theming. However, to + make the transition to theming easier for developers, we added methods to the options class + that allow the developer to bind color editing via the options UI. These color options will + write any changes directly to the theme system. +

    +

    See: Options.registerThemeColorBinding() and + Options.registerThemeFontBinding() +

    +
    + + + +

    UiDefaultsMapper

    + +
    +

    This class discusses some of the plumbing the application uses to unify the various Look + and Feel concepts presented by the different LaFs. +

    +
    + + +

    SystemThemeIds

    + +
    +

    This class is used by the UiDefaultsMapper class and presents a set of resource IDs common across all + LaFs. These values can be changed by the user. See also the description of + System IDs in this document. +

    + +
    + + + +

    Known Issues

    + +
    +

    + Sometimes switching between themes does not reset all widgets. When + this happens, you may notice odd UI artifacts. These will go away when the application is + restarted and often when you again switch the theme. +

    +
    + + + + +

    Provided by: Theme Manager

    Related Topics

    diff --git a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingInternals.html b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingInternals.html index 33ea671d36..b7629ee79d 100644 --- a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingInternals.html +++ b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingInternals.html @@ -2,9 +2,6 @@ - - Theming Architecture diff --git a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingOverview.html b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingOverview.html index c0018e699c..66ba9d24c2 100644 --- a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingOverview.html +++ b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingOverview.html @@ -2,9 +2,6 @@ - - General Overivew diff --git a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingUserDocs.html b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingUserDocs.html index a6035b112b..f869df2f49 100644 --- a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingUserDocs.html +++ b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/ThemingUserDocs.html @@ -2,9 +2,6 @@ - - Theming User Documentation @@ -67,11 +64,10 @@ called "Button.background", it would appear in Ghidra as "laf.color.Button.background".
  • Look and Feel Palette Properties - All the color and fonts used by the Look and Feel properties are grouped into either system property values or auto-generated palette - properties, sso that groups of properties can be changed together.
  • + properties, so that groups of properties can be changed together. -

    See the Developer Documentation for more details on the property ID format and naming conventions.

    @@ -185,6 +181,14 @@ action, press the refresh button in the top right corner of the Theme Editor dialog. +

    Toggle Showing System Values

    +

    + Toggles whether the given table shows system ID values (e.g, those starting with + laf. or system.. By default these values are hidden. +

    + + +

    Saving Themes

    After making changes to one or more theme values, the Theme diff --git a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/images/ThemeEditorDialog.png b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/images/ThemeEditorDialog.png index e0e17c9667..5c23d23aaa 100644 Binary files a/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/images/ThemeEditorDialog.png and b/Ghidra/Framework/Docking/src/main/help/help/topics/Theming/images/ThemeEditorDialog.png differ diff --git a/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java b/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java index 61ab837ab4..72ab3a6130 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/EditWindow.java @@ -38,10 +38,6 @@ public class EditWindow extends JWindow { private AssociatedComponentListener compListener = new AssociatedComponentListener(); - /** - * Constructor for RenameViewWindow. - * @param owner - */ EditWindow(DockingWindowManager mgr) { super(mgr.getRootFrame()); this.mgr = mgr; @@ -52,17 +48,11 @@ public class EditWindow extends JWindow { return comp; } - /** - * @see java.awt.Window#isActive() - */ @Override public boolean isActive() { return active; } - /** - * @see java.awt.Component#setVisible(boolean) - */ @Override public void setVisible(boolean state) { @@ -133,8 +123,7 @@ public class EditWindow extends JWindow { private void create() { textField = new JTextField(" "); JPanel panel = new JPanel(new BorderLayout()); - Color bgColor = Colors.BG_TOOLTIP; - panel.setBackground(bgColor); + panel.setBackground(Colors.BACKGROUND); panel.add(textField, BorderLayout.CENTER); textField.addKeyListener(new KeyAdapter() { @@ -167,32 +156,21 @@ public class EditWindow extends JWindow { private class AssociatedComponentListener implements ComponentListener, ChangeListener { - /* - * @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent) - */ @Override public void componentHidden(ComponentEvent e) { close(); } - /* - * @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent) - */ @Override public void componentResized(ComponentEvent e) { close(); } - /* - * @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent) - */ @Override public void componentShown(ComponentEvent e) { + // stub } - /* - * @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent) - */ @Override public void componentMoved(ComponentEvent e) { if (comp != null && comp.isVisible()) { @@ -200,9 +178,6 @@ public class EditWindow extends JWindow { } } - /* - * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) - */ @Override public void stateChanged(ChangeEvent e) { close(); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java b/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java index 7131b1086f..87ecd2964f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/GenericHeader.java @@ -30,7 +30,7 @@ import docking.util.AnimationUtils; import docking.widgets.VariableHeightPanel; import docking.widgets.label.GDLabel; import generic.theme.GColor; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors.Palette; // TODO: should this be put into generic? @@ -211,7 +211,7 @@ public class GenericHeader extends JPanel { private void constructMultiLinePanel() { removeAll(); - toolbar.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Java.BORDER)); + toolbar.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Colors.BORDER)); add(toolbar, BorderLayout.SOUTH); add(titlePanel, BorderLayout.CENTER); add(menuCloseToolbar, BorderLayout.EAST); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java index ab12e17b2a..23c59e1afd 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/SettableColorSwatchChooserPanel.java @@ -35,7 +35,6 @@ import docking.dnd.StringTransferable; import docking.widgets.label.GDLabel; import docking.widgets.label.GLabel; import generic.theme.GThemeDefaults.Colors; -import generic.theme.GThemeDefaults.Colors.Java; import generic.theme.GThemeDefaults.Colors.Messages; import ghidra.util.ColorUtils; import ghidra.util.WebColors; @@ -151,7 +150,7 @@ public class SettableColorSwatchChooserPanel extends AbstractColorChooserPanel { recentSwatchListener = new RecentSwatchListener(); recentSwatchPanel.addMouseListener(recentSwatchListener); - LineBorder border = new LineBorder(Java.BORDER); + LineBorder border = new LineBorder(Colors.BORDER); swatchPanel.setBorder(border); gbc.gridx = 0; gbc.gridy = 0; @@ -424,7 +423,7 @@ class SwatchPanel extends JPanel { } int y = row * (swatchSize.height + gap.height); g.fillRect(x, y, swatchSize.width, swatchSize.height); - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); g.drawLine(x + swatchSize.width - 1, y, x + swatchSize.width - 1, y + swatchSize.height - 1); g.drawLine(x, y + swatchSize.height - 1, x + swatchSize.width - 1, diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorPaletteTable.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorPaletteTable.java index 77df89fe50..c8a6ebef79 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorPaletteTable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorPaletteTable.java @@ -33,6 +33,8 @@ public class ThemeColorPaletteTable extends ThemeColorTable { @Override protected void filter() { + super.filter(); // this call will update 'colors' + List filtered = new ArrayList<>(); for (ColorValue colorValue : colors) { 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 index 0e2ad018eb..e7ac928356 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeColorTable.java @@ -34,7 +34,7 @@ import ghidra.util.Swing; /** * Color Table for Theme Dialog */ -public class ThemeColorTable extends JPanel implements ActionContextProvider { +public class ThemeColorTable extends JPanel implements ActionContextProvider, ThemeTable { private ThemeColorTableModel colorTableModel; private ColorValueEditor colorEditor = new ColorValueEditor(this::colorValueChanged); @@ -87,6 +87,17 @@ public class ThemeColorTable extends JPanel implements ActionContextProvider { return new ThemeColorTableModel(valuesProvider); } + @Override + public void setShowSystemValues(boolean show) { + colorTableModel.setShowSystemValues(show); + reloadAll(); + } + + @Override + public boolean isShowingSystemValues() { + return colorTableModel.isShowingSystemValues(); + } + void colorValueChanged(PropertyChangeEvent event) { // run later - don't rock the boat in the middle of a listener callback Swing.runLater(() -> { @@ -118,7 +129,7 @@ public class ThemeColorTable extends JPanel implements ActionContextProvider { } String id = currentValue.getId(); ColorValue themeValue = colorTableModel.getThemeValue(id); - return new ThemeTableContext<>(currentValue, themeValue); + return new ThemeTableContext<>(currentValue, themeValue, this); } 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 55bddcf5eb..0e04fab709 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 @@ -16,6 +16,7 @@ package docking.theme.gui; import java.awt.*; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.function.Supplier; @@ -44,6 +45,7 @@ public class ThemeColorTableModel extends GDynamicColumnTableModel filtered = new ArrayList<>(); + + for (ColorValue colorValue : colors) { + String id = colorValue.getId(); + if (showSystemValues) { + filtered.add(colorValue); + continue; + } + + if (!Gui.isSystemId(id)) { + filtered.add(colorValue); + } + + } + + colors = filtered; } @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeEditorDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeEditorDialog.java index 4d84d07159..7468128461 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeEditorDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeEditorDialog.java @@ -50,7 +50,6 @@ public class ThemeEditorDialog extends DialogComponentProvider { private ThemeColorTable paletteTable; private ThemeManager themeManager; - private GThemeValuesCache valuesCache; public ThemeEditorDialog(ThemeManager themeManager) { @@ -107,6 +106,22 @@ public class ThemeEditorDialog extends DialogComponentProvider { .onAction(c -> c.getThemeValue().installValue(themeManager)) .build(); addAction(resetValueAction); + + DockingAction showSystemValuesAction = + new ActionBuilder("Toggle Show System Values", getTitle()) + .popupMenuPath("Toggle Show System Values") + .withContext(ThemeTableContext.class) + .popupWhen(c -> true) + .helpLocation(new HelpLocation("Theming", "Toggle_Show_System_Values")) + .onAction(context -> toggleSystemValues(context)) + .build(); + addAction(showSystemValuesAction); + } + + private void toggleSystemValues(ThemeTableContext context) { + ThemeTable themeTable = context.getThemeTable(); + boolean isShowing = themeTable.isShowingSystemValues(); + themeTable.setShowSystemValues(!isShowing); } private void adjustFonts(int amount) { 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 index aafdc753b9..79e096e5f4 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/gui/ThemeFontTable.java @@ -35,7 +35,7 @@ import ghidra.util.Swing; /** * Font Table for Theme Dialog */ -public class ThemeFontTable extends JPanel implements ActionContextProvider { +public class ThemeFontTable extends JPanel implements ActionContextProvider, ThemeTable { private ThemeFontTableModel fontTableModel; private FontValueEditor fontEditor = new FontValueEditor(this::fontValueChanged); @@ -84,6 +84,17 @@ public class ThemeFontTable extends JPanel implements ActionContextProvider { } + @Override + public void setShowSystemValues(boolean show) { + fontTableModel.setShowSystemValues(show); + reloadAll(); + } + + @Override + public boolean isShowingSystemValues() { + return fontTableModel.isShowingSystemValues(); + } + void fontValueChanged(PropertyChangeEvent event) { // run later - don't rock the boat in the middle of a listener callback Swing.runLater(() -> { @@ -115,7 +126,7 @@ public class ThemeFontTable extends JPanel implements ActionContextProvider { } String id = currentValue.getId(); FontValue themeValue = fontTableModel.getThemeValue(id); - return new ThemeTableContext(currentValue, themeValue); + return new ThemeTableContext(currentValue, themeValue, this); } 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 a846a3be5c..a9559f04b0 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 @@ -17,15 +17,13 @@ package docking.theme.gui; import java.awt.Component; import java.awt.Font; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.function.Supplier; import javax.swing.JLabel; import docking.widgets.table.*; -import generic.theme.FontValue; -import generic.theme.GThemeValueMap; +import generic.theme.*; import ghidra.docking.settings.Settings; import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProviderStub; @@ -41,6 +39,7 @@ public class ThemeFontTableModel extends GDynamicColumnTableModel filtered = new ArrayList<>(); + + for (FontValue fontValue : fonts) { + String id = fontValue.getId(); + if (showSystemValues) { + filtered.add(fontValue); + continue; + } + + if (!Gui.isSystemId(id)) { + filtered.add(fontValue); + } + + } + + fonts = filtered; + } + /** * Reloads the just the current values shown in the table. Called whenever a font changes. */ @@ -71,6 +98,8 @@ public class ThemeFontTableModel extends GDynamicColumnTableModel getComparator() { return (v1, v2) -> { if (v1 == null && v2 == null) { @@ -220,5 +250,6 @@ public class ThemeFontTableModel extends GDynamicColumnTableModel { @@ -111,7 +122,7 @@ public class ThemeIconTable extends JPanel implements ActionContextProvider { } String id = currentValue.getId(); IconValue themeValue = iconTableModel.getThemeValue(id); - return new ThemeTableContext(currentValue, themeValue); + return new ThemeTableContext(currentValue, themeValue, this); } 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 f081de8f99..a504d81894 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 @@ -16,8 +16,7 @@ package docking.theme.gui; import java.awt.Component; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.function.Supplier; import javax.swing.*; @@ -40,6 +39,7 @@ public class ThemeIconTableModel extends GDynamicColumnTableModel filtered = new ArrayList<>(); + + for (IconValue iconValue : icons) { + String id = iconValue.getId(); + if (showSystemValues) { + filtered.add(iconValue); + continue; + } + + if (!Gui.isSystemId(id)) { + filtered.add(iconValue); + } + + } + + icons = filtered; + } + /** * Reloads the just the current values shown in the table. Called whenever an icon changes. */ @@ -70,6 +98,8 @@ public class ThemeIconTableModel extends GDynamicColumnTableModel extends ActionContext { private ThemeValue currentValue; private ThemeValue themeValue; + private ThemeTable themeTable; - public ThemeTableContext(ThemeValue currentValue, ThemeValue themeValue) { + public ThemeTableContext(ThemeValue currentValue, ThemeValue themeValue, + ThemeTable themeTable) { this.currentValue = currentValue; this.themeValue = themeValue; + this.themeTable = themeTable; + } + + /** + * Returns the theme table for this context + * @return the table + */ + public ThemeTable getThemeTable() { + return themeTable; } /** diff --git a/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java b/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java index 23e83db0f4..879865a2ce 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java @@ -26,7 +26,7 @@ import org.jdesktop.animation.timing.TimingTargetAdapter; import org.jdesktop.animation.timing.interpolation.PropertySetter; import generic.theme.GIcon; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors.Palette; import generic.util.WindowUtilities; import generic.util.image.ImageUtils; @@ -878,7 +878,7 @@ public class AnimationUtils { double cx = emphasizedBounds.getCenterX(); double cy = emphasizedBounds.getCenterY(); g2d.rotate(rad, cx, cy); - g.setColor(Java.BORDER); + g.setColor(Colors.BORDER); int iw = emphasizedBounds.width; int ih = emphasizedBounds.height; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java index 394d5f5ea9..690f6a7085 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/AbstractGCellRenderer.java @@ -26,6 +26,7 @@ import docking.widgets.label.GDHtmlLabel; import generic.theme.GColor; import generic.theme.GColorUIResource; import generic.theme.GThemeDefaults.Colors.Palette; +import generic.theme.GThemeDefaults.Colors.Tables; /** * A common base class for list and table renderer objects, unifying the Ghidra look and feel. @@ -165,6 +166,14 @@ public abstract class AbstractGCellRenderer extends GDHtmlLabel { return ALT_BACKGROUND_COLOR; } + protected Color getErrorForegroundColor(boolean isSelected) { + return isSelected ? Tables.ERROR_SELECTED : Tables.ERROR_UNSELECTED; + } + + protected Color getUneditableForegroundColor(boolean isSelected) { + return isSelected ? Tables.UNEDITABLE_SELECTED : Tables.UNEDITABLE_UNSELECTED; + } + // ================================================================================================== // Methods overridden for performance reasons (see DefaultTableCellRenderer & // DefaultListCellRenderer) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java index b97b8a329c..3bf9537b74 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownMultiSelectionTextField.java @@ -28,9 +28,9 @@ import ghidra.util.datastruct.WeakDataStructureFactory; import ghidra.util.datastruct.WeakSet; /** - * Extension of the {@link DropDownSelectionTextField} that allows multiple items to be selected. + * Extension of the {@link DropDownSelectionTextField} that allows multiple items to be selected. *

    - * Note that multiple selection introduces some display complications that are not an issue with + * Note that multiple selection introduces some display complications that are not an issue with * single selection. Namely: *

    * The solution here is to: *
      - *
    • let the preview panel operate normally; it will simply display the preview text for whatever + *
    • let the preview panel operate normally; it will simply display the preview text for whatever * was last selected
    • *
    • display all selected items in the drop down text field as a comma-delimited list
    • *
    @@ -54,7 +54,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie /** * Constructor. - * + * * @param dataModel the model for the drop down widget */ public DropDownMultiSelectionTextField(DropDownTextFieldDataModel dataModel) { @@ -63,7 +63,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie /** * Adds the caller to a list of subscribers who will be notified when selection changes. - * + * * @param listener the subscriber to be added */ public void addDropDownSelectionChoiceListener( @@ -80,7 +80,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie /** * Returns a list of all selected items in the list. - * + * * @return the selected items */ public List getSelectedValues() { @@ -101,6 +101,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie } previewList.setOpaque(true); previewList.setBackground(PREVIEW_WINDOW_BGCOLOR); + previewList.setForeground(PREVIEW_WINDOW_FGCOLOR); previewList.setFocusable(false); previewList.setModel(new DefaultListModel()); } @@ -161,9 +162,9 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie } /** - * Returns a string representing all items selected in the drop-down. If multiple items are + * Returns a string representing all items selected in the drop-down. If multiple items are * selected, they will be comma-delimited. - * + * * @return the comma-delimited selection */ private String getSelectionText() { @@ -178,7 +179,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie /** * Notifies subscribers when the list selection has changed. - * + * * @param selectedItems the list of selected items */ private void fireUserChoiceMade(List selectedItems) { @@ -189,7 +190,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie /** * Saves the selected list items. - * + * * @param newValues the new selected items */ private void storeSelectedValues(List newValues) { @@ -198,7 +199,7 @@ public class DropDownMultiSelectionTextField extends DropDownSelectionTextFie } /** - * Listener for the preview panel which is kicked whenever a selection has been made in the + * Listener for the preview panel which is kicked whenever a selection has been made in the * drop down. This will prompt the preview panel to change what it displays. */ private class PreviewListener implements ListSelectionListener { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java index d4db3281a9..fd384dac45 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java @@ -29,7 +29,7 @@ import org.apache.commons.lang3.StringUtils; import docking.widgets.label.GDHtmlLabel; import docking.widgets.list.GList; import generic.theme.GColor; -import generic.theme.GThemeDefaults.Colors; +import generic.theme.GThemeDefaults.Colors.Tooltips; import generic.util.WindowUtilities; import ghidra.util.StringUtilities; import ghidra.util.SystemUtilities; @@ -39,11 +39,11 @@ import ghidra.util.task.SwingUpdateManager; import util.CollectionUtils; /** - * A text field that handles comparing text typed by the user to the list of objects and then + * A text field that handles comparing text typed by the user to the list of objects and then * presenting potential matches in a drop down window. The items in this window cannot be selected. * - *

    This class will fire {@link #fireEditingStopped()} and {@link #fireEditingCancelled()} events - * when the user makes a choice by pressing the ENTER key, thus allowing the client code to use + *

    This class will fire {@link #fireEditingStopped()} and {@link #fireEditingCancelled()} events + * when the user makes a choice by pressing the ENTER key, thus allowing the client code to use * this class similar in fashion to a property editor. This behavior can be configured to: *

      *
    • Not consume the ENTER key press (it consumes by default), allowing the parent container @@ -53,7 +53,7 @@ import util.CollectionUtils; *
    • *
    * - *

    This class is subclassed to not only have the matching behavior, but to also allow for user + *

    The default is true. Clients will set this to false when they wish to respond to an * Enter event. For example, a dialog may want to close itself on an Enter key press, even - * when the drop-down selection text field is still open. Contrastingly, when this field is - * embedded inside of a larger editor, like a multi-editor field dialog, the Enter key press - * should simply trigger the drop-down window to close and the editing to stop, but should not - * trigger the overall dialog to close. + * when the drop-down selection text field is still open. Contrastingly, when this field is + * embedded inside of a larger editor, like a multi-editor field dialog, the Enter key press + * should simply trigger the drop-down window to close and the editing to stop, but should not + * trigger the overall dialog to close. * @param consume true to consume - * + * */ public void setConsumeEnterKeyPress(boolean consume) { this.consumeEnterKeyPress = consume; } /** - * True signals to do nothing when the user presses Enter. The default is to respond to the - * Enter key, using any existing selection to set this field's {@link #getSelectedValue() + * True signals to do nothing when the user presses Enter. The default is to respond to the + * Enter key, using any existing selection to set this field's {@link #getSelectedValue() * selected value}. * - *

    This can be set to true to allow clients to show drop-down matches without allowing the + *

    This can be set to true to allow clients to show drop-down matches without allowing the * user to select them, triggering the window to be closed. * * @param ignore true to ignore Enter presses; false is the default @@ -504,9 +508,9 @@ public class DropDownTextField extends JTextField implements GComponent { * the text field. * *

    Note: the listener is stored in a {@link WeakDataStructureFactory weak data structure}, - * so you must maintain a reference to the listener you pass in--anonymous classes or lambdas + * so you must maintain a reference to the listener you pass in--anonymous classes or lambdas * will not work. - * + * * @param listener the listener */ public void addDropDownSelectionChoiceListener(DropDownSelectionChoiceListener listener) { @@ -574,10 +578,8 @@ public class DropDownTextField extends JTextField implements GComponent { matchingWindow = new JWindow(parentWindow); matchingWindow.setFocusable(false); JScrollPane scrollPane = new JScrollPane(); - scrollPane.setBorder( - BorderFactory.createBevelBorder(BevelBorder.RAISED, - new GColor("color.border.bevel.highlight"), - new GColor("color.border.bevel.shadow"))); + scrollPane.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, + new GColor("color.border.bevel.highlight"), new GColor("color.border.bevel.shadow"))); scrollPane.setFocusable(false); scrollPane.getVerticalScrollBar().setFocusable(false); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); @@ -648,8 +650,8 @@ public class DropDownTextField extends JTextField implements GComponent { } /** - * This is more complicated that responding to the user mouse click. When clicked, the user is - * signalling to use the clicked item. When pressing Enter, they may have been typing and + * This is more complicated that responding to the user mouse click. When clicked, the user is + * signalling to use the clicked item. When pressing Enter, they may have been typing and * ignoring the list, so we have to do some validation. */ private void setTextFromListOnEnterPress() { @@ -687,11 +689,11 @@ public class DropDownTextField extends JTextField implements GComponent { } /** - * Sets the current selection on this text field. This will store the provided value and set - * the text of the text field to be the name of that value. If the given value is null, then + * Sets the current selection on this text field. This will store the provided value and set + * the text of the text field to be the name of that value. If the given value is null, then * the text of this field will be cleared. * - * @param value The value that is to be the current selection or null to clear the selected + * @param value The value that is to be the current selection or null to clear the selected * value of this text field. */ public void setSelectedValue(T value) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java index 470b915ebb..6748e12e4d 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryList.java @@ -32,7 +32,6 @@ import docking.widgets.label.GDLabel; import docking.widgets.list.GList; import docking.widgets.list.GListAutoLookup; import generic.theme.GThemeDefaults.Colors; -import generic.theme.GThemeDefaults.Colors.Java; import ghidra.util.exception.AssertException; class DirectoryList extends GList implements GhidraFileChooserDirectoryModelIf { @@ -186,7 +185,7 @@ class DirectoryList extends GList implements GhidraFileChooserDirectoryMod }); listEditor = new JPanel(new BorderLayout()); - listEditor.setBorder(BorderFactory.createLineBorder(Java.BORDER)); + listEditor.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); listEditor.add(listEditorLabel, BorderLayout.WEST); listEditor.add(listEditorField, BorderLayout.CENTER); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java index 4914f6594b..c0cf047017 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java @@ -24,7 +24,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; import docking.widgets.label.GDLabel; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import ghidra.util.Msg; import ghidra.util.filechooser.GhidraFileChooserModel; @@ -111,7 +111,7 @@ class FileEditor extends AbstractCellEditor implements TableCellEditor { // match the spacing of non-editing cells editor.setBorder( BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0), - BorderFactory.createLineBorder(Java.BORDER))); + BorderFactory.createLineBorder(Colors.BORDER))); } private void handleDoubleClick(Point p) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java index 1d3ee58dca..29dd4d131f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathManager.java @@ -30,7 +30,6 @@ import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.table.*; import generic.jar.ResourceFile; -import generic.theme.GThemeDefaults.Colors.Tables; import generic.util.Path; import ghidra.framework.options.SaveState; import ghidra.framework.preferences.Preferences; @@ -232,8 +231,7 @@ public class PathManager { if (column == PathManagerModel.COLUMN_PATH) { Path path = (Path) value; if (!isValidPath(path)) { - renderer.setForeground(data.isSelected() ? Tables.FG_ERROR_SELECTED - : Tables.FG_ERROR_UNSELECTED); + renderer.setForeground(getErrorForegroundColor(data.isSelected())); } } return renderer; @@ -386,7 +384,7 @@ public class PathManager { } /** - * Restore paths from user Preferences using the specified keys. + * Restore paths from user Preferences using the specified keys. * If preferences have never been saved, the specified {@code defaultEnablePaths} * will be used. Note: the encoded path list must have been stored * using the same keys using the {@link #savePathsToPreferences(String, String, Path[])} @@ -405,7 +403,7 @@ public class PathManager { } /** - * Restore paths from user Preferences using the specified keys. + * Restore paths from user Preferences using the specified keys. * If preferences have never been saved, the specified {@code defaultEnablePaths} * will be returned. Note: the encoded path list must have been stored * using the same keys using the {@link #savePathsToPreferences(String, String, Path[])} @@ -472,7 +470,7 @@ public class PathManager { /** * Save the specified paths to the user Preferences using the specified keys. - * Note: The encoded path Preferences are intended to be decoded by the + * Note: The encoded path Preferences are intended to be decoded by the * {@link #restoreFromPreferences(String, Path[], String)} and * {@link #getPathsFromPreferences(String, Path[], String)} methods. * @param enablePathKey preference key for storing enabled paths diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java index 0cf2ae7952..6562cf9fb8 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/pathmanager/PathnameTablePanel.java @@ -29,7 +29,6 @@ import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.table.*; import generic.theme.GIcon; -import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.framework.preferences.Preferences; import ghidra.util.filechooser.GhidraFileChooserModel; import ghidra.util.filechooser.GhidraFileFilter; @@ -265,8 +264,7 @@ public class PathnameTablePanel extends JPanel { label.setText(pathName.toString()); if (!fileExists) { - label.setForeground(data.isSelected() ? Tables.FG_ERROR_SELECTED - : Tables.FG_ERROR_UNSELECTED); + label.setForeground(getErrorForegroundColor(data.isSelected())); } return label; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java index ed1d4efec9..aa99348565 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java @@ -33,7 +33,7 @@ import docking.widgets.table.GTableFilterPanel; import docking.widgets.table.RowObjectFilterModel; import docking.widgets.table.columnfilter.*; import docking.widgets.table.constrainteditor.ColumnConstraintEditor; -import generic.theme.GThemeDefaults.Colors.Java; +import generic.theme.GThemeDefaults.Colors; import generic.theme.GThemeDefaults.Colors.Messages; import generic.util.WindowUtilities; import ghidra.util.HelpLocation; @@ -383,7 +383,7 @@ public class ColumnFilterDialog extends ReusableDialogComponentProvider headerPanel.add(new GLabel("Filter Value", SwingConstants.CENTER)); headerPanel.setBorder(new CompoundBorder( - BorderFactory.createMatteBorder(0, 0, 1, 0, Java.BORDER), + BorderFactory.createMatteBorder(0, 0, 1, 0, Colors.BORDER), BorderFactory.createEmptyBorder(4, 0, 4, 0))); return headerPanel; } 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 17035b15a3..a3b51fcbde 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 @@ -409,7 +409,7 @@ public class GraphComponent, G e mainPanel.add(layeredPane, BorderLayout.CENTER); - satellite.setBorder(BorderFactory.createLineBorder(Colors.Java.BORDER)); + satellite.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); undockedSatellitePanel = new JPanel(new BorderLayout()); undockedSatellitePanel.addComponentListener(new ComponentAdapter() { diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualVertexSatelliteRenderer.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualVertexSatelliteRenderer.java index 3cfc039454..1c7242069e 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualVertexSatelliteRenderer.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualVertexSatelliteRenderer.java @@ -128,7 +128,7 @@ public class VisualVertexSatelliteRenderer + * The values in this class can be used where standard colors are desired. For example, where + * clients used to hard-code black for the font color: + *

    + * 
    + * JLabel label = new JLabel():
    + * label.setColor(Color.BLACK);
    + * 
    + * 
    + * Can instead be programmed to use the system's current theme font color instead: + *
    + * 
    + * import generic.theme.GThemeDefaults.Colors;
    + *
    + * ...
    + *
    + * JLabel label = new JLabel():
    + * label.setColor(Colors.FOREGROUND);
    + * 
    + * 
    + * Note that in the second example, you can use the shorthand version of the values in this class + * as long as you import them correctly. This means you do not have to use this form: + *
    + * 
    + * component.setColor(GThemeDefaults.Colors.FOREGROUND);
    + * 
    + * 
    + * * * - * Colors.BACKGROUND - * Colors.Java.BORDER */ public class GThemeDefaults { - public static class Ids { + public static class Ids { public static class Fonts { public static final String MONOSPACED = "font.monospaced"; } } /** - * Colors mapped to system values + * Colors mapped to common system widget concepts, such as foreground, background, border, etc. */ public static class Colors { //@formatter:off - // standard color concepts defined by LookAndFeel - public static final GColor BG_CONTROL = new GColor(BG_CONTROL_ID); - public static final GColor BG_VIEW = new GColor(BG_VIEW_ID); - public static final GColor BG_TOOLTIP = new GColor(BG_TOOLTIP_ID); - public static final GColor BG_VIEW_SELECTED = new GColor(BG_VIEW_SELECTED_ID); - public static final GColor BG_BORDER = new GColor(BG_BORDER_ID); - - public static final GColor FG_CONTROL = new GColor(FG_CONTROL_ID); - public static final GColor FG_VIEW = new GColor(FG_VIEW_ID); - public static final GColor FG_TOOLTIP = new GColor(FG_TOOLTIP_ID); - public static final GColor FG_VIEW_SELECTED = new GColor(FG_VIEW_SELECTED_ID); - public static final GColor FG_DISABLED = new GColor(FG_DISABLED_ID); - // generic color concepts public static final GColor BACKGROUND = new GColor("color.bg"); - public static final GColor CURSOR = new GColor("color.cursor.focused"); - public static final GColor ERROR = new GColor("color.fg.error"); public static final GColor FOREGROUND = new GColor("color.fg"); public static final GColor FOREGROUND_DISABLED = new GColor("color.fg.disabled"); + public static final GColor CURSOR = new GColor("color.cursor.focused"); + public static final GColor ERROR = new GColor("color.fg.error"); + public static final GColor BORDER = new GColor(BG_BORDER_ID); //@formatter:on - public static class Java { - public static final GColor BORDER = BG_BORDER; - } - + /** + * Color values to use for tables + */ public static class Tables { //@formatter:off - public static final GColor FG_ERROR_SELECTED = new GColor("color.fg.error.table.selected"); - public static final GColor FG_ERROR_UNSELECTED = new GColor("color.fg.error.table.unselected"); - public static final GColor FG_UNEDITABLE_SELECTED = new GColor("color.fg.table.uneditable.selected"); - public static final GColor FG_UNEDITABLE_UNSELECTED = new GColor("color.fg.table.uneditable.unselected"); + public static final GColor ERROR_SELECTED = new GColor("color.fg.error.table.selected"); + public static final GColor ERROR_UNSELECTED = new GColor("color.fg.error.table.unselected"); + public static final GColor UNEDITABLE_SELECTED = new GColor("color.fg.table.uneditable.selected"); + public static final GColor UNEDITABLE_UNSELECTED = new GColor("color.fg.table.uneditable.unselected"); //@formatter:on } + /** + * Color values to use with tooltips + */ + public static class Tooltips { + @SuppressWarnings("hiding") // we know there is another 'BACKGROUND' field in this file + public static final GColor BACKGROUND = new GColor(BG_TOOLTIP_ID); + @SuppressWarnings("hiding") // we know there is another 'FOREGROUND' field in this file + public static final GColor FOREGROUND = new GColor(FG_TOOLTIP_ID); + } + /** * 'Messages' is primarily used by system dialogs to display status. That the colors are * used for foregrounds is implied. @@ -89,7 +114,8 @@ public class GThemeDefaults { } /** - * Generic palette colors, using color names, that may be changed along with the theme + * Generic palette colors, using color names, that may be changed along with the theme. + * These are not all defined palette colors, but some of the more commonly used colors. */ public static class Palette { @@ -119,7 +145,7 @@ public class GThemeDefaults { /** * Returns a new {@link GColor} for the given palette name. *

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

    * It is preferred to use the static colors defined in {@link Palette} when possible, as * it prevents excess object creation. This method should be used when the desired diff --git a/Ghidra/Framework/Gui/src/main/java/generic/theme/Gui.java b/Ghidra/Framework/Gui/src/main/java/generic/theme/Gui.java index df190a0747..2059c946fe 100644 --- a/Ghidra/Framework/Gui/src/main/java/generic/theme/Gui.java +++ b/Ghidra/Framework/Gui/src/main/java/generic/theme/Gui.java @@ -161,8 +161,18 @@ public class Gui { return themeManager.isDarkTheme(); } + /** + * Returns true if the given id is a system-defined id, such as those starting with + * {@code laf.color} or {@code system.color}. + * + * @param id the id + * @return true if the given id is a system-defined id + */ + public static boolean isSystemId(String id) { + return id.startsWith("laf.") || id.startsWith("system."); + } + static void setThemeManager(ThemeManager manager) { themeManager = manager; } - } diff --git a/Ghidra/Framework/Gui/src/main/java/generic/theme/SystemThemeIds.java b/Ghidra/Framework/Gui/src/main/java/generic/theme/SystemThemeIds.java index 4d7a858f88..a451dae09e 100644 --- a/Ghidra/Framework/Gui/src/main/java/generic/theme/SystemThemeIds.java +++ b/Ghidra/Framework/Gui/src/main/java/generic/theme/SystemThemeIds.java @@ -18,17 +18,19 @@ package generic.theme; import generic.theme.laf.UiDefaultsMapper; /** - * These are the standard system ids defined to represent general LookAndFeel color and font - * concepts. Various LaF have different names for these concepts and even defines additional - * concepts. These are the ones we use regardless of the LookAndFeel being used. When we - * load a specific LookAndFeel, a {@link UiDefaultsMapper}, specific to that LaF is used to map - * its system ids to our standard system ids. Also, {@link GThemeDefaults} uses these system - * ids to define colors that can be used throughout the application without using these ids + * This class provides a set of IDs that can be used in the application, regardless of which Look + * and Feel (LaF) is being used. + *

    + * Various LaFs have different names for common concepts and even define additional concepts not + * listed here. The values in this class are those the application used use regardless of the LaF + * being used. When we load a specific LaF, a {@link UiDefaultsMapper} specific to that LaF is used + * to map its common LaF ids to these standard system ids. The {@link GThemeDefaults} uses these + * system ids to define colors that can be used throughout the application without using these ids * directly. *

    * The ids are assigned to categories as follows: *

      - *
    • CONTROL- these ids are used for colors and fonts for general system components such as + *
    • CONTROL- these ids are used for colors and fonts for general system components such as * Buttons, Checkboxes, or anything that doesn't fit into one of the other areas
    • *
    • VIEW - these ids are used for the colors and fonts used for widgets that display data * such as Trees, Tables, TextFieds, and Lists
    • @@ -45,7 +47,6 @@ import generic.theme.laf.UiDefaultsMapper; *
    • FG_DISABLED - the foreground color when the component is disabled *
    • BG_BORDER - the border color *
    • FONT - the font - * *
    */ public class SystemThemeIds { diff --git a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/ComponentFontRegistry.java b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/ComponentFontRegistry.java index 9ddc2dca6d..13ffc5b842 100644 --- a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/ComponentFontRegistry.java +++ b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/ComponentFontRegistry.java @@ -24,7 +24,7 @@ import ghidra.util.datastruct.WeakDataStructureFactory; import ghidra.util.datastruct.WeakSet; /** - * Maintains a week set of components associated with a given font id. Whenever the font changes + * Maintains a weak set of components associated with a given font id. Whenever the font changes * for the font id, this class will update the component's font to the new value. */ public class ComponentFontRegistry { diff --git a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/LookAndFeelManager.java b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/LookAndFeelManager.java index d8fd8e9b44..50f4fac625 100644 --- a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/LookAndFeelManager.java +++ b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/LookAndFeelManager.java @@ -194,7 +194,7 @@ public abstract class LookAndFeelManager { /** * Binds the component to the font identified by the given font id. Whenever the font for - * the font id changes, the component will updated with the new font. + * the font id changes, the component will be updated with the new font. * @param component the component to set/update the font * @param fontId the id of the font to register with the given component */ @@ -213,7 +213,7 @@ public abstract class LookAndFeelManager { } /** - * Subclass provide this method to install the specific look and feel. + * Subclasses may override this method to install a specific look and feel. * * @throws ClassNotFoundException if the LookAndFeel * class could not be found @@ -231,7 +231,7 @@ public abstract class LookAndFeelManager { } /** - * Subclass can override this method to do specific LookAndFeel fix ups + * Subclass may override this method to do specific LookAndFeel fix ups */ protected void fixupLookAndFeelIssues() { // no generic fix-ups at this time. diff --git a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java index 8c6145dcf0..7cf80afaa9 100644 --- a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java +++ b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/NimbusLookAndFeelManager.java @@ -25,8 +25,8 @@ import ghidra.util.exception.AssertException; /** * Nimbus {@link LookAndFeelManager}. Specialized so that it can return the Nimbus installer and - * do specialized updating when icons or fonts change. Basically, needs to re-install a new - * instance of the Nimbus LookAndFeel each time a font or icon changes + * perform specialized updating when icons or fonts change. Basically, this class needs to + * re-install a new instance of the Nimbus LookAndFeel each time a font or icon changes. */ public class NimbusLookAndFeelManager extends LookAndFeelManager { @@ -60,9 +60,9 @@ public class NimbusLookAndFeelManager extends LookAndFeelManager { private void reinstallNimubus() { try { - /** + /* * In order to get Nimbus to honor changes to fonts and icons in the UiDefaults, - * we have to reinstall nimbus. Reinstalling nimbus is a bit different that the first + * we have to reinstall Nimbus. Reinstalling Nimbus is a bit different than the original * install. First, we don't want to re-install the java defaults, the current ones are * fine and we don't want loose any current theme values changes. Second, when we * get font and theme value overrides, we want to use all the current values as they @@ -93,16 +93,16 @@ public class NimbusLookAndFeelManager extends LookAndFeelManager { @Override protected void processJavaDefaults() { - // The GNimbusLookAndFeel already extracted the java defaults and installed them in the Gui - + // We already extracted the java defaults and installed them in the Gui } @Override protected void fixupLookAndFeelIssues() { super.fixupLookAndFeelIssues(); - // fix scroll bar grabber disappearing. See https://bugs.openjdk.java.net/browse/JDK-8134828 - // This fix looks like it should not cause harm even if the bug is fixed on the jdk side. + // fix scroll bar grabber disappearing. See + // https://bugs.openjdk.java.net/browse/JDK-8134828. This fix looks like it should not cause + // harm even if the bug is fixed on the jdk side. UIDefaults defaults = UIManager.getDefaults(); defaults.put("ScrollBar.minimumThumbSize", new Dimension(30, 30)); diff --git a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/UiDefaultsMapper.java b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/UiDefaultsMapper.java index 15e7083d42..4fdb938520 100644 --- a/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/UiDefaultsMapper.java +++ b/Ghidra/Framework/Gui/src/main/java/generic/theme/laf/UiDefaultsMapper.java @@ -33,42 +33,42 @@ import generic.theme.*; import ghidra.util.Msg; /** - * The purpose of this class is to introduce multiple levels of indirection into the Java - * {@code LookAndFeel} (LaF), which allows the user to change these values. Further, when + * The purpose of this class is to introduce multiple levels of indirection into the Java + * {@code LookAndFeel} (LaF), which allows the user to change these values. Further, when * introducing this indirection we combine the Java settings into user-friendly system ids to make * changing these values easier. *

    * This class defines these user-friendly groups. The default system assignments are based on the * {@link BasicLookAndFeel} values. *

    - * Subclasses can override the mapping of these standard system values for particular LaFs that have - * different keys or color assignments. + * Subclasses can override the mapping of these standard system values for particular LaFs that have + * different ids or color assignments. *

    * Some basic concepts: *

      *
    • UI Defaults - key-value pairs defined by the Java LaF; there are 2 key types, widget * keys and Java group/reusable keys (e.g., Button.background; control) - *
    • UI Indirection - UI Defaults values are changed to point to custom terms we created to + *
    • UI Indirection - UI Defaults values are changed to point to custom terms we created to * allow for indirection (e.g., Button.background -> laf.color.Button.background) *
    • Normalized Keys - keys we created to facilitate the UI Indirection, based upon the Java * keys (e.g., laf.color.Button.background) - *
    • System Color/Font Keys - user facing terms for common color or font concepts into an - * easy-to-change setting (e.g., system.color.fg.text) + *
    • System Color/Font Keys - user facing terms for common color or font concepts into an + * easy-to-change setting (e.g., system.color.fg.text) *
    • Palette Keys - dynamically generated color palette keys based on the LaF for any colors - * and fonts that were not mapped into an system color or font (e.g., + * and fonts that were not mapped into an system color or font (e.g., * laf.palette.color.01) *
    - * + * *

    * The mapper performs the following operations: *

      *
    1. Extracts all color, font, and icon values from the UI Defaults.
    2. *
    3. Use the current LaF values to populate the pre-defined system colors and fonts.
    4. - *
    5. Any UI Defaults values not assigned in the previous step will be assigned to a dynamic shared + *
    6. Any UI Defaults values not assigned in the previous step will be assigned to a dynamic shared * palette color or font. *
    7. Update Java UI Defaults to use our indirection and system values.
    8. *
    - * + * */ public class UiDefaultsMapper { public static final String LAF_COLOR_ID_PREFIX = "laf.color."; @@ -96,17 +96,17 @@ public class UiDefaultsMapper { // @formatter:off protected ColorMatcher viewColorMatcher = new ColorMatcher(BG_VIEW_ID, - FG_VIEW_ID, - BG_VIEW_SELECTED_ID, + FG_VIEW_ID, + BG_VIEW_SELECTED_ID, FG_VIEW_SELECTED_ID); protected ColorMatcher tooltipColorMatcher = new ColorMatcher(BG_TOOLTIP_ID, FG_TOOLTIP_ID); protected ColorMatcher defaultColorMatcher = new ColorMatcher(BG_CONTROL_ID, - FG_CONTROL_ID, - BG_VIEW_ID, - FG_VIEW_ID, + FG_CONTROL_ID, + BG_VIEW_ID, + FG_VIEW_ID, FG_DISABLED_ID, - BG_VIEW_SELECTED_ID, + BG_VIEW_SELECTED_ID, FG_VIEW_SELECTED_ID, BG_TOOLTIP_ID, BG_BORDER_ID); @@ -187,7 +187,7 @@ public class UiDefaultsMapper { /** * Registers any {@link LookAndFeel} ids that are not used directly (e.g. "control", "text", * etc.) so that these values won't get mapped to any normalized id. There is no need for these - * values to show up in the theme values, since changing them will have no effect. They are + * values to show up in the theme values, since changing them will have no effect. They are * used to seed the values for the system color and fonts. Subclasses should * override this method to add additional ids so they won't show up in the theme values. */ @@ -228,11 +228,11 @@ public class UiDefaultsMapper { protected void assignSystemColorValues() { // Originally, these values were assigned to the corresponding concepts as defined // in the BasicLookAndFeel such as "control", "text", etc. Unfortunately, those - // conventions are rarely used by specific look and feels. It was discovered that using a + // conventions are rarely used by specific look and feels. It was discovered that using a // representative component value worked much better. So each Look and Feel was examined and // those component values chosen here are the ones that seemed to work for the most look and - // feels. If a specific look and feel needs different values, this class is designed to be - // subclassed where the values can be overridden. See the NimbusUiDefaultsMapper as an + // feels. If a specific look and feel needs different values, this class is designed to be + // subclassed where the values can be overridden. See the NimbusUiDefaultsMapper as an // example. assignSystemColorFromLafId(BG_CONTROL_ID, "Button.background"); @@ -325,7 +325,7 @@ public class UiDefaultsMapper { /** * Assigns every component name in the component group to the given ColorValueMatcher * @param componentGroups a list of component names - * @param matcher the ColorMatcher that will provide the precedence of system ids to + * @param matcher the ColorMatcher that will provide the precedence of system ids to * search when replacing LaF component specific values */ private void defineComponentColorMatcher(String[] componentGroups, ColorMatcher matcher) { @@ -337,7 +337,7 @@ public class UiDefaultsMapper { /** * Assigns every component name in a component group to the given FontValueMapper * @param componentGroups a list of component names - * @param matcher the FontValueMatcher that will provide the precedence of ststem font ids to + * @param matcher the FontValueMatcher that will provide the precedence of ststem font ids to * search when replacing LaF component specific fonts with a system Font */ private void defineComponentFontMatcher(String[] componentGroups, FontMatcher matcher) { @@ -477,7 +477,7 @@ public class UiDefaultsMapper { } /** - * Attempts to find a system color id that matches the given color. The order system ids are + * Attempts to find a system color id that matches the given color. The order system ids are * searched depends on the component (Button, Menu, etc.) which is derived from the given * lafId. * @param lafId the lafId we are attempting to get a system color for @@ -499,7 +499,7 @@ public class UiDefaultsMapper { } /** - * Attempts to find a system font id that matches the given font. The order system fonts are + * Attempts to find a system font id that matches the given font. The order system fonts are * searched depends on the component (Button, Menu, etc.) which is derived from the given * lafId. * @param lafId the lafId we are attempting to get a system font for diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/core/help/AboutDomainObjectUtils.java b/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/core/help/AboutDomainObjectUtils.java index 0dd3b1bf97..164889a6c5 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/core/help/AboutDomainObjectUtils.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/app/plugin/core/help/AboutDomainObjectUtils.java @@ -30,8 +30,8 @@ import docking.dnd.GClipboard; import docking.dnd.StringTransferable; import docking.widgets.OptionDialog; import docking.widgets.label.GIconLabel; +import generic.theme.GThemeDefaults.Colors; import generic.theme.Gui; -import generic.theme.GThemeDefaults.Colors.Java; import ghidra.framework.model.DomainFile; import ghidra.framework.plugintool.PluginTool; import ghidra.util.HelpLocation; @@ -118,7 +118,7 @@ public class AboutDomainObjectUtils { auxArea.setCaretPosition(0); // move cursor to BOF... JScrollPane sp = new JScrollPane(auxArea); sp.setBorder(BorderFactory.createTitledBorder( - BorderFactory.createLineBorder(Java.BORDER), "Additional Information")); + BorderFactory.createLineBorder(Colors.BORDER), "Additional Information")); sp.setPreferredSize(new Dimension(1, 175)); //width is ignored by border layout... JScrollBar sb = sp.getVerticalScrollBar(); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java index b175ce06c1..26d3dcca06 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/EditPluginPathDialog.java @@ -37,7 +37,6 @@ import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.label.GDLabel; import docking.widgets.list.GListCellRenderer; import generic.theme.GThemeDefaults.Colors.Messages; -import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.preferences.Preferences; import ghidra.util.HelpLocation; @@ -60,8 +59,6 @@ class EditPluginPathDialog extends DialogComponentProvider { static final String ADD_DIR_BUTTON_TEXT = "Add Dir ..."; static final String ADD_JAR_BUTTON_TEXT = "Add Jar ..."; - private final static Color INVALID_PATH_COLOR = Tables.FG_ERROR_UNSELECTED; - private final static Color INVALID_SELECTED_PATH_COLOR = Tables.FG_ERROR_SELECTED; private final static Color STATUS_MESSAGE_COLOR = Messages.NORMAL; final static String EMPTY_STATUS = " "; @@ -467,7 +464,7 @@ class EditPluginPathDialog extends DialogComponentProvider { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); boolean pathOK = new File(value).canRead(); if (!pathOK) { - setForeground(isSelected ? INVALID_SELECTED_PATH_COLOR : INVALID_PATH_COLOR); + setForeground(getErrorForegroundColor(isSelected)); } return this; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTableModel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTableModel.java index c3fec127b8..72531da72b 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTableModel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTableModel.java @@ -22,7 +22,6 @@ import java.util.*; import docking.widgets.table.*; import docking.widgets.table.threaded.ThreadedTableModel; import generic.jar.ResourceFile; -import generic.theme.GThemeDefaults.Colors.Tables; import ghidra.docking.settings.Settings; import ghidra.framework.Application; import ghidra.framework.plugintool.ServiceProvider; @@ -47,13 +46,13 @@ import utilities.util.FileUtilities; * - Archive directory (hidden) * *

    - * All columns are for display purposes only, except for the installed column, which - * is a checkbox allowing users to install/uninstall a particular extension. - * + * All columns are for display purposes only, except for the installed column, which + * is a checkbox allowing users to install/uninstall a particular extension. + * */ class ExtensionTableModel extends ThreadedTableModel { - /** We don't care about the ordering of other columns, but the install/uninstall checkbox should be + /** We don't care about the ordering of other columns, but the install/uninstall checkbox should be the first one and the name col is our initial sort column. */ final static int INSTALLED_COL = 0; final static int NAME_COL = 1; @@ -66,7 +65,7 @@ class ExtensionTableModel extends ThreadedTableModel { /** * Constructor. - * + * * @param serviceProvider the tool providing the extensions table */ protected ExtensionTableModel(ServiceProvider serviceProvider) { @@ -76,8 +75,7 @@ class ExtensionTableModel extends ThreadedTableModel { @Override protected TableColumnDescriptor createTableColumnDescriptor() { - TableColumnDescriptor descriptor = - new TableColumnDescriptor<>(); + TableColumnDescriptor descriptor = new TableColumnDescriptor<>(); descriptor.addVisibleColumn(new ExtensionInstalledColumn(), INSTALLED_COL, true); descriptor.addVisibleColumn(new ExtensionNameColumn(), NAME_COL, true); @@ -105,7 +103,7 @@ class ExtensionTableModel extends ThreadedTableModel { return false; } - // Do not allow GUI uninstallation of extensions manually installed in installation + // Do not allow GUI uninstallation of extensions manually installed in installation // directory if (extension.getInstallPath() != null && FileUtilities.isPathContainedWithin( Application.getApplicationLayout().getApplicationInstallationDir().getFile(false), @@ -125,12 +123,12 @@ class ExtensionTableModel extends ThreadedTableModel { super.setValueAt(aValue, rowIndex, columnIndex); // We only care about the install column here, as it's the only one that - // is editable. + // is editable. if (columnIndex != INSTALLED_COL) { return; } - // If the user does not have write permissions on the installation dir, they cannot + // If the user does not have write permissions on the installation dir, they cannot // install. ResourceFile installDir = Application.getApplicationLayout().getExtensionInstallationDirs().get(0); @@ -202,7 +200,7 @@ class ExtensionTableModel extends ThreadedTableModel { /** * Returns true if the model has changed as a result of installing or uninstalling an extension - * + * * @return true if the model has changed as a result of installing or uninstalling an extension */ public boolean hasModelChanged() { @@ -211,7 +209,7 @@ class ExtensionTableModel extends ThreadedTableModel { /** * Replaces the table model data with the given list. - * + * * @param model the list to use as the model */ public void setModelData(List model) { @@ -228,11 +226,11 @@ class ExtensionTableModel extends ThreadedTableModel { } /** - * Returns the selected extension. + * Returns the selected extension. *

    * Note that this table is single-selection only, so this will only * ever return 1 item. - * + * * @param row the selected row * @return the selected extension, or null if nothing is selected */ @@ -259,8 +257,8 @@ class ExtensionTableModel extends ThreadedTableModel { } @Override - public String getValue(ExtensionDetails rowObject, Settings settings, - Object data, ServiceProvider sp) throws IllegalArgumentException { + public String getValue(ExtensionDetails rowObject, Settings settings, Object data, + ServiceProvider sp) throws IllegalArgumentException { return rowObject.getName(); } @@ -289,8 +287,8 @@ class ExtensionTableModel extends ThreadedTableModel { } @Override - public String getValue(ExtensionDetails rowObject, Settings settings, - Object data, ServiceProvider sp) throws IllegalArgumentException { + public String getValue(ExtensionDetails rowObject, Settings settings, Object data, + ServiceProvider sp) throws IllegalArgumentException { return rowObject.getDescription(); } @@ -319,8 +317,8 @@ class ExtensionTableModel extends ThreadedTableModel { } @Override - public String getValue(ExtensionDetails rowObject, Settings settings, - Object data, ServiceProvider sp) throws IllegalArgumentException { + public String getValue(ExtensionDetails rowObject, Settings settings, Object data, + ServiceProvider sp) throws IllegalArgumentException { String version = rowObject.getVersion(); @@ -356,8 +354,8 @@ class ExtensionTableModel extends ThreadedTableModel { } @Override - public Boolean getValue(ExtensionDetails rowObject, Settings settings, - Object data, ServiceProvider sp) throws IllegalArgumentException { + public Boolean getValue(ExtensionDetails rowObject, Settings settings, Object data, + ServiceProvider sp) throws IllegalArgumentException { return rowObject.isInstalled(); } } @@ -379,8 +377,8 @@ class ExtensionTableModel extends ThreadedTableModel { } @Override - public String getValue(ExtensionDetails rowObject, Settings settings, - Object data, ServiceProvider sp) throws IllegalArgumentException { + public String getValue(ExtensionDetails rowObject, Settings settings, Object data, + ServiceProvider sp) throws IllegalArgumentException { return rowObject.getInstallPath(); } } @@ -402,8 +400,8 @@ class ExtensionTableModel extends ThreadedTableModel { } @Override - public String getValue(ExtensionDetails rowObject, Settings settings, - Object data, ServiceProvider sp) throws IllegalArgumentException { + public String getValue(ExtensionDetails rowObject, Settings settings, Object data, + ServiceProvider sp) throws IllegalArgumentException { return rowObject.getArchivePath(); } } @@ -416,8 +414,7 @@ class ExtensionTableModel extends ThreadedTableModel { ExtensionDetails extension = getSelectedExtension(data.getRowViewIndex()); if (!isValidVersion(extension)) { - comp.setForeground( - data.isSelected() ? Tables.FG_ERROR_SELECTED : Tables.FG_ERROR_UNSELECTED); + comp.setForeground(getErrorForegroundColor(data.isSelected())); } return comp; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java index 185b8e1db5..7f46d08f94 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java @@ -27,6 +27,7 @@ import docking.widgets.HyperlinkComponent; import docking.widgets.checkbox.GCheckBox; import docking.widgets.label.*; import generic.theme.*; +import generic.theme.GThemeDefaults.Colors; import ghidra.framework.plugintool.PluginConfigurationModel; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.util.*; @@ -130,7 +131,7 @@ public class PluginManagerComponent extends JPanel implements Scrollable { initializeLabelSection(); initializeDescriptionSection(); - setBorder(BorderFactory.createLineBorder(GThemeDefaults.Colors.Java.BORDER)); + setBorder(BorderFactory.createLineBorder(Colors.BORDER)); updateCheckBoxState(); } 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 676a77304a..064fa3d2be 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ClipboardPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ClipboardPluginScreenShots.java @@ -28,7 +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 generic.theme.GThemeDefaults.Colors; import ghidra.app.plugin.core.clipboard.*; import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin; import ghidra.app.plugin.core.codebrowser.CodeViewerProvider; @@ -75,7 +75,7 @@ public class ClipboardPluginScreenShots extends GhidraScreenShotGenerator { captureListingCallMnemonic(start, end); placeImagesSideBySide(image, menuImage); - drawBorder(Java.BORDER); + drawBorder(Colors.BORDER); } private void cropCopyMenu() { 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 6bac7e2829..2db30b6a52 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java @@ -29,7 +29,6 @@ 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; @@ -74,7 +73,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator { Rectangle cursor = getCursorBounds(); captureListingRange(0x0040be40, 0x0040be56, 600); - drawBorder(Java.BORDER); + drawBorder(Colors.BORDER); drawTextWithArrowNearOpenStructureIcon("Closed", cursor); @@ -95,7 +94,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator { Rectangle cursor = getCursorBounds(); captureListingRange(0x0040be40, 0x0040be56, 600); - drawBorder(Java.BORDER); + drawBorder(Colors.BORDER); drawTextWithArrowNearOpenStructureIcon("Open", cursor); } 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 7f82a95cb2..64c042d919 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ToolScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ToolScreenShots.java @@ -37,7 +37,6 @@ 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; @@ -138,7 +137,7 @@ public class ToolScreenShots extends GhidraScreenShotGenerator { tool.executeBackgroundCommand(new DummyBackgroundCommand(), program); Border inner = BorderFactory.createRaisedBevelBorder(); - Border outer = BorderFactory.createLineBorder(Java.BORDER); + Border outer = BorderFactory.createLineBorder(Colors.BORDER); statusBar.setBorder(BorderFactory.createCompoundBorder(outer, inner)); captureComponent(statusBar); program.endTransaction(id, false);

    This class is subclassed to not only have the matching behavior, but to also allow for user * selections. * * @param The type of object that this model manipulates @@ -63,7 +63,8 @@ public class DropDownTextField extends JTextField implements GComponent { private static final int DEFAULT_MAX_UPDATE_DELAY = 2000; private static final int MIN_HEIGHT = 300; private static final int MIN_WIDTH = 200; - protected static final Color PREVIEW_WINDOW_BGCOLOR = Colors.BACKGROUND; + protected static final Color PREVIEW_WINDOW_BGCOLOR = Tooltips.BACKGROUND; + protected static final Color PREVIEW_WINDOW_FGCOLOR = Tooltips.FOREGROUND; private JWindow toolTipWindow; // delayed initialization for parenting private JWindow matchingWindow; // delayed initialization for parenting @@ -91,15 +92,15 @@ public class DropDownTextField extends JTextField implements GComponent { private boolean ignoreEnterKeyPress = false; // do not ignore enter by default private boolean ignoreCaretChanges; - // We use an update manager to buffer requests to update the matches. This allows us to be + // We use an update manager to buffer requests to update the matches. This allows us to be // more responsive when the user is attempting to type multiple characters private String pendingTextUpdate; private SwingUpdateManager updateManager; /** - * The text that was used to generate the current list of matches. This can be different than - * the text of this text field, as the user can move the cursor around, which will change the - * list of matches. Also, we can set the value of the text field as the user arrows through + * The text that was used to generate the current list of matches. This can be different than + * the text of this text field, as the user can move the cursor around, which will change the + * list of matches. Also, we can set the value of the text field as the user arrows through * the list, which will change the contents of the text field, but not the list of matches. */ private String currentMatchingText; @@ -120,7 +121,7 @@ public class DropDownTextField extends JTextField implements GComponent { * * @param dataModel provides element storage and search capabilities to this component. * @param updateMinDelay suggestion list refresh delay, triggered after search results have - * changed. Too low a value may cause an inconsistent view as filtering tasks complete; too + * changed. Too low a value may cause an inconsistent view as filtering tasks complete; too * high a value delivers an unresponsive user experience. */ public DropDownTextField(DropDownTextFieldDataModel dataModel, int updateMinDelay) { @@ -157,6 +158,7 @@ public class DropDownTextField extends JTextField implements GComponent { previewLabel = new GDHtmlLabel(); previewLabel.setOpaque(true); previewLabel.setBackground(PREVIEW_WINDOW_BGCOLOR); + previewLabel.setForeground(PREVIEW_WINDOW_FGCOLOR); previewLabel.setVerticalAlignment(SwingConstants.TOP); previewLabel.setFocusable(false); } @@ -216,7 +218,7 @@ public class DropDownTextField extends JTextField implements GComponent { } // O.K., if we are consuming key presses, then we only want to do so when the selection - // window is showing. This will close the selection window and not send the Enter event up + // window is showing. This will close the selection window and not send the Enter event up // to our parent component. boolean listShowing = isMatchingListShowing(); if (consumeEnterKeyPress) { @@ -250,10 +252,10 @@ public class DropDownTextField extends JTextField implements GComponent { private void validateChosenItemAgainstText(boolean isListShowing) { // - // If the text differs from that of the chosen item, then the implication is the user has - // changed the text after the last time an item was chosen and after the drop-down list was - // closed (if they haven't changed the text, then it will have been set to the value of the - // currently selected item). The user will do this if they want a new item that is not in + // If the text differs from that of the chosen item, then the implication is the user has + // changed the text after the last time an item was chosen and after the drop-down list was + // closed (if they haven't changed the text, then it will have been set to the value of the + // currently selected item). The user will do this if they want a new item that is not in // the list, but the new item starts with the same value as something that is in the list. // if (selectedValue == null) { @@ -343,7 +345,9 @@ public class DropDownTextField extends JTextField implements GComponent { updateWindowLocation(); showMatchingWindow(); - getPreviewPaneComponent().setBackground(PREVIEW_WINDOW_BGCOLOR); + JComponent previewComponent = getPreviewPaneComponent(); + previewComponent.setBackground(PREVIEW_WINDOW_BGCOLOR); + previewComponent.setForeground(PREVIEW_WINDOW_FGCOLOR); toolTipWindow.setVisible(hasPreview()); } } @@ -452,29 +456,29 @@ public class DropDownTextField extends JTextField implements GComponent { /** * When true, this field will not pass Enter key press events up to it's parent when the - * drop-down selection window is open. However, an Enter key press will still be - * "unconsumed" when the drop-down window is not open. When set to false, this method will + * drop-down selection window is open. However, an Enter key press will still be + * "unconsumed" when the drop-down window is not open. When set to false, this method will * always pass the Enter key press up to it's parent. * *