From d53aa193f015e099893e92e0533828974ad24376 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Tue, 15 Oct 2024 18:40:19 -0400 Subject: [PATCH] Fixed Structure Editor UI border bug when switching Look and Feel; fixed help location inception --- .../core/compositeeditor/CompEditorPanel.java | 14 +++++++++- .../CompositeEditorProvider.java | 18 ++++++++++++- .../core/string/StringTableProvider.java | 27 ++++--------------- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java index b3c18c962a..600aa5b210 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java @@ -24,6 +24,7 @@ import java.awt.event.*; import java.util.List; import javax.swing.*; +import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.text.DefaultFormatterFactory; @@ -36,6 +37,7 @@ import docking.widgets.label.GDLabel; import docking.widgets.textfield.GFormattedTextField; import generic.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Viewport; +import generic.theme.Gui; import ghidra.app.plugin.core.compositeeditor.BitFieldPlacementComponent.BitAttributes; import ghidra.program.model.data.*; import ghidra.program.model.data.Composite; @@ -695,9 +697,19 @@ public class CompEditorPanel extends CompositeEditorPanel { packingPanel.add(packingEnablementButton); JPanel innerPanel = new JPanel(new GridBagLayout()); - innerPanel.setBorder(UIManager.getBorder("TitledBorder.border")); + Border titledBorder = UIManager.getBorder("TitledBorder.border"); + innerPanel.setBorder(titledBorder); packingPanel.add(innerPanel); + // Since we set the border manually, it does not get updated when switching LaFs. Add a + // theme listener to update the border ourselves. + Gui.addThemeListener(e -> { + if (e.isLookAndFeelChanged()) { + Border updatedTitledBorder = UIManager.getBorder("TitledBorder.border"); + innerPanel.setBorder(updatedTitledBorder); + } + }); + setupDefaultPackingButton(); setupExplicitPackingButtonAndTextField(); setupPackingEnablementButton(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorProvider.java index a66fdf566f..deb7e36560 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorProvider.java @@ -31,11 +31,13 @@ import ghidra.framework.plugintool.Plugin; import ghidra.program.model.data.*; import ghidra.program.model.listing.Program; import ghidra.util.HelpLocation; +import ghidra.util.SystemUtilities; import ghidra.util.datastruct.WeakDataStructureFactory; import ghidra.util.datastruct.WeakSet; import ghidra.util.exception.AssertException; import help.Help; import help.HelpService; +import utilities.util.reflection.ReflectionUtilities; /** * Editor provider for a Composite Data Type. @@ -335,8 +337,22 @@ public abstract class CompositeEditorProvider extends ComponentProviderAdapter } protected void registerHelp(Object object, String anchor) { + String inception = recordHelpInception(); HelpService help = Help.getHelpService(); - help.registerHelp(object, new HelpLocation(getHelpTopic(), getHelpName() + "_" + anchor)); + String fullAnchor = getHelpName() + "_" + anchor; + help.registerHelp(object, new HelpLocation(getHelpTopic(), fullAnchor, inception)); + } + + private String recordHelpInception() { + if (!SystemUtilities.isInDevelopmentMode()) { + return ""; + } + return getInceptionFromTheFirstClassThatIsNotUsOrABuilder(); + } + + protected String getInceptionFromTheFirstClassThatIsNotUsOrABuilder() { + Throwable t = ReflectionUtilities.createThrowableWithStackOlderThan("registerHelp"); + return t.getStackTrace()[0].toString(); } protected void requestTableFocus() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java index 2e0b7606d2..0da884bf0a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -27,8 +27,8 @@ import docking.DockingUtils; import docking.action.*; import docking.widgets.checkbox.GCheckBox; import docking.widgets.label.GLabel; -import docking.widgets.table.*; -import docking.widgets.table.threaded.ThreadedTableModel; +import docking.widgets.table.GTableCellRenderer; +import docking.widgets.table.GTableCellRenderingData; import docking.widgets.textfield.IntegerTextField; import generic.theme.GIcon; import ghidra.app.util.HelpTopics; @@ -488,27 +488,10 @@ public class StringTableProvider extends ComponentProviderAdapter implements Dom } } - private class StringTable extends GhidraTable { - public StringTable(ThreadedTableModel model) { - super(model); - } - -// @Override -// protected SelectionManager createSelectionManager(TableModel tableModel) { -// return null; -// } - - } - private JComponent buildTablePanel() { stringModel = new StringTableModel(tool, options); - threadedTablePanel = new GhidraThreadedTablePanel<>(stringModel, 1000) { - @Override - protected GTable createTable(ThreadedTableModel model) { - return new StringTable(model); - } - }; + threadedTablePanel = new GhidraThreadedTablePanel<>(stringModel, 1000); table = threadedTablePanel.getTable(); table.setActionsEnabled(true); table.setName("DataTable");