diff --git a/Ghidra/Features/Base/data/base.theme.properties b/Ghidra/Features/Base/data/base.theme.properties index 7ea430fc96..8e38aaab77 100644 --- a/Ghidra/Features/Base/data/base.theme.properties +++ b/Ghidra/Features/Base/data/base.theme.properties @@ -140,12 +140,6 @@ color.bg.plugin.overview.entropy.uninitialized = blue color.bg.plugin.overview.entropy.palette.base.low = black color.bg.plugin.overview.entropy.palette.base.high = white -color.bg.plugin.programdiff.highlight = moccasin - -color.bg.plugin.programdiff.details.address = #009999 -color.bg.plugin.programdiff.details.comment = #009900 -color.bg.plugin.programdiff.details.danger = #FF0000 -color.bg.plugin.programdiff.details.emphasize = #009900 color.bg.plugin.references.table.active.operand = rgb(205, 205, 205) @@ -213,8 +207,6 @@ color.bg.plugin.editors.compositeeditor.byte.header = [color]system.color.bg.vie color.fg.plugin.equate.enum = deepskyblue -color.bg.plugin.programdiff.highlight = darkRed - color.bg.plugin.references.table.active.operand = #5A5E60 diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/marker/MarkerManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/marker/MarkerManager.java index 5746e7305e..0f8449cc68 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/marker/MarkerManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/marker/MarkerManager.java @@ -28,6 +28,7 @@ import org.apache.commons.collections4.IterableUtils; import org.apache.commons.collections4.map.LazyMap; import docking.widgets.PopupWindow; +import generic.theme.*; import ghidra.app.nav.Navigatable; import ghidra.app.services.*; import ghidra.app.util.viewer.listingpanel.*; @@ -85,6 +86,7 @@ public class MarkerManager implements MarkerService { private List listeners = new ArrayList<>(); private MarkerClickedListener markerClickedListener = null; + private ThemeListener themeListener = e -> themeChanged(e); public MarkerManager(Plugin plugin) { this(plugin.getName(), plugin.getTool()); @@ -103,6 +105,13 @@ public class MarkerManager implements MarkerService { primaryMarginProvider = createMarginProvider(); primaryOverviewProvider = createOverviewProvider(); + Gui.addThemeListener(themeListener); + } + + private void themeChanged(ThemeEvent e) { + if (e instanceof ColorChangedThemeEvent) { + markerSetCache.clearColors(); + } } private void programClosed(Program program) { @@ -230,6 +239,7 @@ public class MarkerManager implements MarkerService { } public void dispose() { + Gui.removeThemeListener(themeListener); updater.dispose(); markerSetCache.clear(); overviewProviders.forEach(provider -> provider.dispose()); @@ -475,6 +485,12 @@ public class MarkerManager implements MarkerService { return entry; } + void clearColors() { + for (MarkerSetCacheEntry entry : map.values()) { + entry.clearColors(); + } + } + public void clear() { map.clear(); } @@ -509,6 +525,10 @@ public class MarkerManager implements MarkerService { program.addCloseListener(closeListener); } + void clearColors() { + colorCache.clear(); + } + private void programClosed() { program.removeCloseListener(closeListener); cache.programClosed(program); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java index 5032c571d6..0cc083b5cf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java @@ -223,6 +223,7 @@ public class MultiTabPanel extends JPanel { iconLabel.setToolTipText("Close"); iconLabel.setName("Close"); // junit access + iconLabel.setOpaque(true); MouseListener iconSwitcherMouseListener = new MouseAdapter() { @Override @@ -925,6 +926,8 @@ public class MultiTabPanel extends JPanel { this.nameLabel = nameLabel; this.labelPanel = labelPanel; this.iconLabel = iconLabel; + + setBackground(backgroundColor); } void refresh() { diff --git a/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html b/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html index 34c2de01c7..e052020152 100644 --- a/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html +++ b/Ghidra/Features/FunctionGraph/src/main/help/help/topics/FunctionGraphPlugin/Function_Graph.html @@ -69,7 +69,6 @@

-

Once a graph is stale, you can press the refresh button at any time to have the graph re-create itself without performing a relayout. The green box in the image above diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGSatelliteUndockedProvider.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGSatelliteUndockedProvider.java deleted file mode 100644 index 096bc836f1..0000000000 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGSatelliteUndockedProvider.java +++ /dev/null @@ -1,69 +0,0 @@ -/* ### - * IP: GHIDRA - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ghidra.app.plugin.core.functiongraph; - -import java.awt.Dimension; -import java.awt.event.MouseEvent; - -import javax.swing.Icon; -import javax.swing.JComponent; - -import docking.*; -import generic.theme.GIcon; -import ghidra.app.plugin.core.functiongraph.mvc.FGController; -import ghidra.framework.plugintool.ComponentProviderAdapter; -import ghidra.util.HelpLocation; - -public class FGSatelliteUndockedProvider extends ComponentProviderAdapter { - - static final String NAME = "Function Graph Satellite"; - private static final Icon ICON = new GIcon("icon.functiongraph.action.provider.satellite"); - - private FGController controller; - private JComponent satelliteComponent; - - public FGSatelliteUndockedProvider(FunctionGraphPlugin plugin, FGController controller, - JComponent satelliteComponent) { - super(plugin.getTool(), NAME, plugin.getName()); - this.controller = controller; - this.satelliteComponent = satelliteComponent; - satelliteComponent.setMinimumSize(new Dimension(400, 400)); - - setHelpLocation(new HelpLocation("FunctionGraphPlugin", "Satellite_View_Dock")); - - setIcon(ICON); - setDefaultWindowPosition(WindowPosition.WINDOW); - setWindowMenuGroup(FunctionGraphPlugin.FUNCTION_GRAPH_NAME); - - addToTool(); - } - - @Override - public ActionContext getActionContext(MouseEvent event) { - ComponentProvider primaryProvider = controller.getProvider(); - return primaryProvider.getActionContext(event); - } - - @Override - public JComponent getComponent() { - return satelliteComponent; - } - - @Override - public void componentShown() { - controller.satelliteProviderShown(); - } -} diff --git a/Ghidra/Features/FunctionGraph/src/test.slow/java/ghidra/app/plugin/core/functiongraph/AbstractFunctionGraphTest.java b/Ghidra/Features/FunctionGraph/src/test.slow/java/ghidra/app/plugin/core/functiongraph/AbstractFunctionGraphTest.java index c476f8f424..2ee2f07a4c 100644 --- a/Ghidra/Features/FunctionGraph/src/test.slow/java/ghidra/app/plugin/core/functiongraph/AbstractFunctionGraphTest.java +++ b/Ghidra/Features/FunctionGraph/src/test.slow/java/ghidra/app/plugin/core/functiongraph/AbstractFunctionGraphTest.java @@ -79,6 +79,8 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte protected static final Transferable DUMMY_TRANSFERABLE = new DummyTransferable(); + protected static final String SATELLITE_NAME = "Function Graph Satellite"; + protected PluginTool tool; protected FunctionGraphPlugin graphPlugin; protected ProgramDB program; @@ -170,12 +172,12 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte // 01002239 /* - + A |->B C - - + + */ // A @@ -210,7 +212,7 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte private void build_ghidra(ToyProgramBuilder builder) throws MemoryAccessException { /* Originally from notepad 'ghidra' - + A |-> B |-> C @@ -222,7 +224,7 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte |-> G | H - + */ // A - @@ -309,7 +311,7 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte private void build_sscanf(ToyProgramBuilder builder) throws MemoryAccessException { /* Originally from notepad 'sscanf' - + A |-> B | @@ -320,7 +322,7 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte F | G - + */ // A - 9 code units @@ -1448,14 +1450,14 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte // /* - + 0) Initial Graph - + 1 -> 2 -> 3 -> 4 | * 5 - + */ create12345Graph(); @@ -1479,12 +1481,12 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte /* 1) Create two separate group vertices (A and B), such that A has an edge to B. - + A (v:{1,2} e:{1->2, 2->3}) -> B (v:{3,4} e:{2->3,3->4,3->5}) | * 5 - + */ GroupedFunctionGraphVertex groupA = group("A", v1, v2); @@ -1497,12 +1499,12 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte /* 2) Create a third group vertex (Z) that contains a non-grouped vertex *and* one of the other groups (B). - + A (v:{1,2} e:{1->2, 2->3}) -> Z ( v:{B (v:{3,4} e:{2->3,3->4,3->5}), 5} e:{2->3, 3->5} ) - + */ GroupedFunctionGraphVertex groupZ = group("Z", groupB, v5); @@ -1512,12 +1514,12 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte /* 3) Now, ungroup the 1 remaining originally grouped vertex (A). - + 1 -> 2 -> Z ( v:{B (v:{3,4} e:{2->3,3->4,3->5}), 5} e:{2->3, 3->5} ) - + */ ungroup(groupA); @@ -1527,14 +1529,14 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte verifyEdgeCount(2); /* - + 4) Now, ungroup Z and go back to having one remaining group vertex (B) - + 1 -> 2 -> -> B (v:{3,4} e:{2->3,3->4,3->5}) | * 5 - + */ ungroup(groupZ); @@ -1546,12 +1548,12 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte /* 5) Finally, ungroup the last group and make sure the graph is restored - + 1 -> 2 -> 3 -> 4 | * 5 - + */ ungroup(groupB); @@ -2120,12 +2122,12 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte } protected void assertNoUndockedProvider() { - ComponentProvider provider = tool.getComponentProvider(FGSatelliteUndockedProvider.NAME); + ComponentProvider provider = tool.getComponentProvider(SATELLITE_NAME); assertNull("Undocked satellite provider is installed when it should not be", provider); } protected void assertUndockedProviderNotShowing() { - ComponentProvider provider = tool.getComponentProvider(FGSatelliteUndockedProvider.NAME); + ComponentProvider provider = tool.getComponentProvider(SATELLITE_NAME); if (provider == null) { return; // no provider; not showing } @@ -2133,7 +2135,7 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte } protected void assertUndockedProviderShowing() { - ComponentProvider provider = tool.getComponentProvider(FGSatelliteUndockedProvider.NAME); + ComponentProvider provider = tool.getComponentProvider(SATELLITE_NAME); assertUndockedProviderShowing(provider); } @@ -2173,7 +2175,7 @@ public abstract class AbstractFunctionGraphTest extends AbstractGhidraHeadedInte } protected void closeUndockedProvider() { - ComponentProvider provider = tool.getComponentProvider(FGSatelliteUndockedProvider.NAME); + ComponentProvider provider = tool.getComponentProvider(SATELLITE_NAME); assertNotNull("Undocked provider is not installed when it should be", provider); tool.showComponentProvider(provider, false); waitForSwing(); diff --git a/Ghidra/Features/ProgramDiff/data/programdiff.theme.properties b/Ghidra/Features/ProgramDiff/data/programdiff.theme.properties index 9c4434e595..b0c77562b7 100644 --- a/Ghidra/Features/ProgramDiff/data/programdiff.theme.properties +++ b/Ghidra/Features/ProgramDiff/data/programdiff.theme.properties @@ -1,6 +1,14 @@ [Defaults] + +color.bg.plugin.programdiff.highlight = moccasin + +color.bg.plugin.programdiff.details.address = #009999 +color.bg.plugin.programdiff.details.comment = #009900 +color.bg.plugin.programdiff.details.danger = #FF0000 +color.bg.plugin.programdiff.details.emphasize = #009900 + icon.plugin.programdiff.apply = pencil16.png icon.plugin.programdiff.apply.next = pencil_arrow16.png icon.plugin.programdiff.ignore = eraser_arrow16.png @@ -10,5 +18,8 @@ icon.plugin.programdiff.open.close.program = table_relationship.png icon.plugin.programdiff.settings = settings16.gif icon.plugin.programdiff.cursor.location = cursor_arrow.gif + + [Dark Defaults] +color.bg.plugin.programdiff.highlight = #4D4D2A \ No newline at end of file diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/label/AbstractHtmlLabel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/label/AbstractHtmlLabel.java index d7e280092e..1c797ab7e3 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/label/AbstractHtmlLabel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/label/AbstractHtmlLabel.java @@ -48,6 +48,7 @@ public abstract class AbstractHtmlLabel extends JLabel private static final String HTML_TAG = ""; private boolean isUpdating = false; + private boolean isHtml = false; protected AbstractHtmlLabel() { addPropertyChangeListener(this); @@ -64,6 +65,10 @@ public abstract class AbstractHtmlLabel extends JLabel // do not pass up to the parent so that it does not install its own html rendering if (text != null && text.toLowerCase().startsWith(HTML_TAG)) { text = text.substring(HTML_TAG.length()); + isHtml = true; + } + else { + isHtml = false; } super.setText(text); @@ -80,7 +85,7 @@ public abstract class AbstractHtmlLabel extends JLabel private void updateHtmlView() { String text = getText(); - if (text == null || !isHTMLRenderingEnabled()) { + if (text == null || !isHtml || !isHTMLRenderingEnabled()) { putClientProperty(BasicHTML.propertyKey, null); return; } @@ -211,10 +216,9 @@ public abstract class AbstractHtmlLabel extends JLabel String size = Integer.toString(font.getSize()); String weight = font.isBold() ? "700" : "400"; String style = font.isItalic() ? "italic" : "normal"; - String color = WebColors.toString(bg); + String color = WebColors.toString(bg, false); String css = String.format(s, family, size, weight, style, color); - StyleSheet styleSheet = getStyleSheet(); - styleSheet.addRule(css); + ss.addRule(css); } @Override 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 ca00b63872..3cfc039454 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 @@ -29,7 +29,7 @@ import ghidra.graph.viewer.VisualVertex; import ghidra.graph.viewer.vertex.AbstractVisualVertexRenderer; /** - * A renderer for vertices for the satellite view. This is really just a basic renderer + * A renderer for vertices for the satellite view. This is really just a basic renderer * that adds emphasis capability, as seen in the primary function graph renderer. * @param the vertex type * @param the edge type @@ -59,9 +59,9 @@ public class VisualVertexSatelliteRendererLookAndFeel * class could not be found * @throws InstantiationException if a new instance of the class @@ -237,7 +238,7 @@ public abstract class LookAndFeelManager { } /** - * Extracts java default colors, fonts, and icons and stores them in the + * Extracts java default colors, fonts, and icons and stores them in the * {@link ThemeManager} and updates the {@link UIDefaults} by installing GColors for all * color values and installing any overridden fonts or icons. */