From ae02a34d8bc25465983269391ab5897dd53c424f Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 14 Jul 2022 18:49:45 -0400 Subject: [PATCH] GP-1981 - Graph Theme Updates --- Ghidra/Features/Base/certification.manifest | 1 - .../Base/data/base.listing.theme.properties | 2 +- .../data/functiongraph.theme.properties | 2 +- .../core/functiongraph/graph/FGComponent.java | 48 +++--- .../jung/renderer/FGEdgePaintTransformer.java | 41 ----- .../graph/jung/renderer/FGEdgeRenderer.java | 13 +- .../graph/vertex/GroupedVertexInfo.java | 2 +- .../GraphFunctionCalls/certification.manifest | 2 +- ...ies => functioncallgraph.theme.properties} | 8 +- .../java/functioncalls/graph/FcgVertex.java | 17 +- .../renderer/FcgEdgePaintTransformer.java | 5 +- .../graph/view/FcgComponent.java | 39 +++-- .../data/docking.palette.theme.properties | 24 ++- .../Docking/data/docking.theme.properties | 6 +- .../src/main/java/docking/theme/GColor.java | 13 +- .../java/docking/theme/GThemeDefaults.java | 20 ++- .../docking/widgets/DropDownTextField.java | 5 +- .../autocomplete/TextFieldAutocompleter.java | 13 +- .../src/main/java/ghidra/util/WebColors.java | 2 +- .../ghidra/util/datastruct/WeakStore.java | 13 +- .../Graph/data/graph.theme.properties | 20 ++- .../ghidra/graph/viewer/GraphComponent.java | 61 ++++--- .../graph/viewer/SatelliteGraphViewer.java | 2 +- .../graph/viewer/edge/VisualEdgeRenderer.java | 152 +++++++++--------- .../edge/routing/ArticulatedEdgeRouter.java | 21 +-- .../mouse/JungPickingGraphMousePlugin.java | 3 +- ...ualGraphMouseTrackingGraphMousePlugin.java | 6 +- .../viewer/layout/VisualGraphLayout.java | 1 + .../graph/viewer/renderer/DebugShape.java | 13 +- .../renderer/MouseClickedPaintableShape.java | 4 +- .../MouseDraggedLinePaintableShape.java | 11 +- .../renderer/MouseDraggedPaintableShape.java | 11 +- .../graph/viewer/renderer/PaintableShape.java | 4 +- .../viewer/renderer/VisualGraphRenderer.java | 9 +- .../VisualVertexSatelliteRenderer.java | 36 ++++- .../CachingSatelliteGraphViewer.java | 15 +- .../vertex/AbstractVisualVertexRenderer.java | 29 +++- .../viewer/vertex/DockingVisualVertex.java | 6 +- .../viewer/vertex/VisualVertexRenderer.java | 15 +- .../service/graph/GraphDisplayOptions.java | 10 +- .../ghidra/graph/support/TestGraphViewer.java | 6 +- .../support/TestVertexTooltipProvider.java | 4 +- .../graph/support/TextAreaTestVertex.java | 6 +- .../viewer/AlgorithmTestSteppingVertex.java | 11 +- ...TestGraphAlgorithmSteppingViewerPanel.java | 3 +- .../ghidra/graph/graphs/LabelTestVertex.java | 4 +- .../graph/GraphDisplayOptionsTest.java | 64 ++++---- 47 files changed, 462 insertions(+), 341 deletions(-) delete mode 100644 Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgePaintTransformer.java rename Ghidra/Features/GraphFunctionCalls/data/{functioncall.theme.properties => functioncallgraph.theme.properties} (71%) diff --git a/Ghidra/Features/Base/certification.manifest b/Ghidra/Features/Base/certification.manifest index bc1a3136e7..ebdad0323b 100644 --- a/Ghidra/Features/Base/certification.manifest +++ b/Ghidra/Features/Base/certification.manifest @@ -16,7 +16,6 @@ data/ElfFunctionsThatDoNotReturn||GHIDRA||||END| data/ExtensionPoint.manifest||GHIDRA||||END| data/MachOFunctionsThatDoNotReturn||GHIDRA||||END| data/PEFunctionsThatDoNotReturn||GHIDRA||||END| -data/base.functiongraph.theme.properties||GHIDRA||||END| data/base.listing.theme.properties||GHIDRA||||END| data/base.theme.properties||GHIDRA||||END| data/decompiler.theme.properties||GHIDRA||||END| diff --git a/Ghidra/Features/Base/data/base.listing.theme.properties b/Ghidra/Features/Base/data/base.listing.theme.properties index 5f0a1349d2..680c1558e3 100644 --- a/Ghidra/Features/Base/data/base.listing.theme.properties +++ b/Ghidra/Features/Base/data/base.listing.theme.properties @@ -1,7 +1,7 @@ [Defaults] color.bg.listing = color.bg -color.bg.currentline.listing = color.bg.currentline +color.bg.currentline.listing = color.bg.currentline color.bg.selection.listing = color.bg.selection color.bg.highlight.listing = color.bg.highlight diff --git a/Ghidra/Features/FunctionGraph/data/functiongraph.theme.properties b/Ghidra/Features/FunctionGraph/data/functiongraph.theme.properties index 6688694e7b..ec3a741d2f 100644 --- a/Ghidra/Features/FunctionGraph/data/functiongraph.theme.properties +++ b/Ghidra/Features/FunctionGraph/data/functiongraph.theme.properties @@ -14,7 +14,7 @@ color.bg.functiongraph.vertex.picked = color.palette.yellow color.bg.functiongraph.edge.fall-through = color.flowtype.fall-through color.bg.functiongraph.edge.fall-through.highlight = rgb(255, 127, 127) color.bg.functiongraph.edge.jump.conditional = color.flowtype.jump.conditional -color.bg.functiongraph.edge.jump.conditional.highlight = green +color.bg.functiongraph.edge.jump.conditional.highlight = lime color.bg.functiongraph.edge.jump.unconditional = color.flowtype.jump.unconditional color.bg.functiongraph.edge.jump.unconditional.highlight = rgb(127, 127, 255) diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGComponent.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGComponent.java index cf48b643c5..c9cd078050 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGComponent.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/FGComponent.java @@ -27,7 +27,6 @@ import edu.uci.ics.jung.visualization.RenderContext; import edu.uci.ics.jung.visualization.picking.PickedState; import edu.uci.ics.jung.visualization.renderers.Renderer; import edu.uci.ics.jung.visualization.util.Caching; -import ghidra.app.plugin.core.functiongraph.graph.jung.renderer.FGEdgePaintTransformer; import ghidra.app.plugin.core.functiongraph.graph.jung.renderer.FGVertexRenderer; import ghidra.app.plugin.core.functiongraph.graph.jung.transformer.FGVertexPickableBackgroundPaintTransformer; import ghidra.app.plugin.core.functiongraph.graph.layout.FGLayout; @@ -38,6 +37,7 @@ import ghidra.graph.viewer.layout.LayoutListener.ChangeType; import ghidra.graph.viewer.layout.LayoutProvider; import ghidra.graph.viewer.layout.VisualGraphLayout; import ghidra.graph.viewer.renderer.VisualGraphEdgeLabelRenderer; +import ghidra.graph.viewer.vertex.AbstractVisualVertexRenderer; import ghidra.program.model.listing.Function; import ghidra.program.util.ProgramLocation; import ghidra.util.SystemUtilities; @@ -193,23 +193,25 @@ public class FGComponent extends GraphComponent @Override protected FGPrimaryViewer createPrimaryGraphViewer(VisualGraphLayout layout, Dimension viewerSize) { + return new FGPrimaryViewer(this, layout, viewerSize); + } - FGPrimaryViewer viewer = new FGPrimaryViewer(this, layout, viewerSize); + @Override + protected void decoratePrimaryViewer(GraphViewer viewer, + VisualGraphLayout layout) { - RenderContext renderContext = viewer.getRenderContext(); - FGEdgePaintTransformer edgePaintTransformer = - new FGEdgePaintTransformer(getFucntionGraphOptions()); - renderContext.setEdgeDrawPaintTransformer(edgePaintTransformer); - renderContext.setArrowDrawPaintTransformer(edgePaintTransformer); - renderContext.setArrowFillPaintTransformer(edgePaintTransformer); + super.decoratePrimaryViewer(viewer, layout); + // the edge renderer was set by the parent call; get the renderer to add our painter Renderer renderer = viewer.getRenderer(); - renderer.setVertexRenderer(new FGVertexRenderer()); + RenderContext renderContext = viewer.getRenderContext(); // for background colors when we are zoomed to far to render the listing PickedState pickedVertexState = viewer.getPickedVertexState(); - renderContext.setVertexFillPaintTransformer(new FGVertexPickableBackgroundPaintTransformer( + FGVertexRenderer vertexRenderer = new FGVertexRenderer(); + vertexRenderer.setVertexFillPaintTransformer(new FGVertexPickableBackgroundPaintTransformer( pickedVertexState, PICKED_COLOR, START_COLOR, END_COLOR)); + renderer.setVertexRenderer(vertexRenderer); // edge label rendering com.google.common.base.Function edgeLabelTransformer = e -> e.getLabel(); @@ -240,31 +242,29 @@ public class FGComponent extends GraphComponent } } - return viewer; } @Override - protected SatelliteGraphViewer createSatelliteGraphViewer( - GraphViewer masterViewer, Dimension viewerSize) { + protected void decorateSatelliteViewer(SatelliteGraphViewer viewer, + VisualGraphLayout layout) { - SatelliteGraphViewer viewer = - super.createSatelliteGraphViewer(masterViewer, viewerSize); + super.decorateSatelliteViewer(viewer, layout); - RenderContext renderContext = viewer.getRenderContext(); + // the edge renderer was set by the parent call; get the renderer to add our painter + Renderer renderer = viewer.getRenderer(); - FGEdgePaintTransformer edgePaintTransformer = - new FGEdgePaintTransformer(getFucntionGraphOptions()); - renderContext.setEdgeDrawPaintTransformer(edgePaintTransformer); - renderContext.setArrowDrawPaintTransformer(edgePaintTransformer); - renderContext.setArrowFillPaintTransformer(edgePaintTransformer); + AbstractVisualVertexRenderer vertexRenderer = + (AbstractVisualVertexRenderer) renderer.getVertexRenderer(); PickedState pickedVertexState = viewer.getPickedVertexState(); + + RenderContext renderContext = viewer.getRenderContext(); renderContext.setVertexFillPaintTransformer(new FGVertexPickableBackgroundPaintTransformer( pickedVertexState, PICKED_COLOR, START_COLOR, END_COLOR)); + vertexRenderer.setVertexFillPaintTransformer(new FGVertexPickableBackgroundPaintTransformer( + pickedVertexState, PICKED_COLOR, START_COLOR, END_COLOR)); viewer.setGraphOptions(vgOptions); - - return viewer; } @Override @@ -289,7 +289,7 @@ public class FGComponent extends GraphComponent // FG-specific Client Methods //================================================================================================== - public FunctionGraphOptions getFucntionGraphOptions() { + public FunctionGraphOptions getFunctionGraphOptions() { return (FunctionGraphOptions) vgOptions; } diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgePaintTransformer.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgePaintTransformer.java deleted file mode 100644 index 29cb3b36a9..0000000000 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgePaintTransformer.java +++ /dev/null @@ -1,41 +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.graph.jung.renderer; - -import java.awt.Color; -import java.awt.Paint; - -import com.google.common.base.Function; - -import ghidra.app.plugin.core.functiongraph.graph.FGEdge; -import ghidra.app.plugin.core.functiongraph.mvc.FunctionGraphOptions; -import ghidra.program.model.symbol.FlowType; - -public class FGEdgePaintTransformer implements Function { - - private FunctionGraphOptions options; - - public FGEdgePaintTransformer(FunctionGraphOptions options) { - this.options = options; - } - - @Override - public Paint apply(FGEdge e) { - FlowType flowType = e.getFlowType(); - Color color = options.getColor(flowType); - return color; - } -} diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgeRenderer.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgeRenderer.java index f46ee6534d..cc77eee231 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgeRenderer.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/jung/renderer/FGEdgeRenderer.java @@ -23,6 +23,7 @@ import ghidra.app.plugin.core.functiongraph.graph.FunctionGraph; import ghidra.app.plugin.core.functiongraph.graph.vertex.FGVertex; import ghidra.app.plugin.core.functiongraph.mvc.FunctionGraphOptions; import ghidra.graph.viewer.renderer.ArticulatedEdgeRenderer; +import ghidra.program.model.symbol.FlowType; /** * A renderer used by the Function Graph API to provide additional edge coloring, as @@ -31,13 +32,21 @@ import ghidra.graph.viewer.renderer.ArticulatedEdgeRenderer; public class FGEdgeRenderer extends ArticulatedEdgeRenderer { @Override - public Color getBaseColor(Graph g, FGEdge e) { + public Color getDrawColor(Graph g, FGEdge e) { + FunctionGraphOptions options = getOptions(g); + FlowType flowType = e.getFlowType(); + Color color = options.getColor(flowType); + return color; + } + + @Override + public Color getFocusedColor(Graph g, FGEdge e) { FunctionGraphOptions options = getOptions(g); return options.getColor(e.getFlowType()); } @Override - public Color getHighlightColor(Graph g, FGEdge e) { + public Color getSelectedColor(Graph g, FGEdge e) { FunctionGraphOptions options = getOptions(g); return options.getHighlightColor(e.getFlowType()); } diff --git a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/GroupedVertexInfo.java b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/GroupedVertexInfo.java index 5faeb49652..92dd9fd31f 100644 --- a/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/GroupedVertexInfo.java +++ b/Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/vertex/GroupedVertexInfo.java @@ -249,7 +249,7 @@ class GroupedVertexInfo extends VertexInfo { @Override public String toString() { String superString = super.toString(); - StringBuffer buffy = new StringBuffer(superString); + StringBuilder buffy = new StringBuilder(superString); buffy.append('\n'); for (VertexInfo info : vertexInfos) { buffy.append('\t').append(info.toString()).append('\n'); diff --git a/Ghidra/Features/GraphFunctionCalls/certification.manifest b/Ghidra/Features/GraphFunctionCalls/certification.manifest index 376b6e3c84..90d6cbdf19 100644 --- a/Ghidra/Features/GraphFunctionCalls/certification.manifest +++ b/Ghidra/Features/GraphFunctionCalls/certification.manifest @@ -1,7 +1,7 @@ ##VERSION: 2.0 ##MODULE IP: Oxygen Icons - LGPL 3.0 Module.manifest||GHIDRA||||END| -data/functioncall.theme.properties||GHIDRA||||END| +data/functioncallgraph.theme.properties||GHIDRA||||END| src/main/help/help/TOC_Source.xml||GHIDRA||||END| src/main/help/help/shared/arrow.gif||GHIDRA||||END| src/main/help/help/shared/close16.gif||GHIDRA||||END| diff --git a/Ghidra/Features/GraphFunctionCalls/data/functioncall.theme.properties b/Ghidra/Features/GraphFunctionCalls/data/functioncallgraph.theme.properties similarity index 71% rename from Ghidra/Features/GraphFunctionCalls/data/functioncall.theme.properties rename to Ghidra/Features/GraphFunctionCalls/data/functioncallgraph.theme.properties index e62242507f..a79eeecb84 100644 --- a/Ghidra/Features/GraphFunctionCalls/data/functioncall.theme.properties +++ b/Ghidra/Features/GraphFunctionCalls/data/functioncallgraph.theme.properties @@ -1,10 +1,12 @@ [Defaults] color.bg.fcg.vertex.default = rgb(110, 197, 174) // chill green -color.bg.fcg.vertex.toobig = color.palette.lightGray +color.bg.fcg.vertex.toobig = color.palette.lightgray -color.bg.fcg.edge.primary.direct = rgb(143, 197, 143) // lightGreen -color.bg.fcg.edge.primary.indirect = rgb(233, 233, 233) // lightGray +color.bg.fcg.edge.primary.direct = rgb(143, 197, 143) // light pale green +color.bg.fcg.edge.primary.direct.selected = rgb(68, 171, 96) // lighter green +color.bg.fcg.edge.primary.indirect = rgb(233, 233, 233) // lightGray +color.bg.fcg.edge.primary.indirect.selected = rgb(201, 195, 195) // the satellite gets too cluttered, so wash out the edges color.bg.fcg.edge.satellite.direct = rgba(0,0,0,0.1) // 'washed out black' diff --git a/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/FcgVertex.java b/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/FcgVertex.java index 81746e4fb6..797df3b9e3 100644 --- a/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/FcgVertex.java +++ b/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/FcgVertex.java @@ -28,6 +28,7 @@ import javax.swing.border.LineBorder; import docking.theme.GColor; import docking.theme.GThemeDefaults.Colors.Palette; +import docking.theme.Gui; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GDLabel; import ghidra.graph.viewer.vertex.AbstractVisualVertex; @@ -45,7 +46,7 @@ public class FcgVertex extends AbstractVisualVertex implements VertexShapeProvid //@formatter:off public static final Color DEFAULT_VERTEX_SHAPE_COLOR = new GColor("color.bg.fcg.vertex.default"); - private static final Color TOO_BIG_VERTEX_SHAPE_COLOR = new GColor("color.bg.fcg.vertex.toobig "); + private static final Color TOO_BIG_VERTEX_SHAPE_COLOR = new GColor("color.bg.fcg.vertex.toobig"); //@formatter:on public static final Icon NOT_ALLOWED_ICON = Icons.ERROR_ICON; @@ -55,9 +56,9 @@ public class FcgVertex extends AbstractVisualVertex implements VertexShapeProvid ResourceManager.getScaledIcon(Icons.COLLAPSE_ALL_ICON, 10, 10); // higher numbered layers go on top - private static final Integer VERTEX_SHAPE_LAYER = new Integer(100); - private static final Integer TOGGLE_BUTTON_LAYER = new Integer(200); - private static final Integer LABEL_LAYER = new Integer(300); + private static final Integer VERTEX_SHAPE_LAYER = 100; + private static final Integer TOGGLE_BUTTON_LAYER = 200; + private static final Integer LABEL_LAYER = 300; private static final int GAP = 2; private static final int VERTEX_SHAPE_SIZE = 50; @@ -131,8 +132,8 @@ public class FcgVertex extends AbstractVisualVertex implements VertexShapeProvid Color vertexShapeColor = getVertexShapeColor(); Color lightColor = vertexShapeColor; - Color darkColor = vertexShapeColor.darker(); - Color darkestColor = darkColor.darker(); + Color darkColor = Gui.darker(vertexShapeColor); + Color darkestColor = Gui.darker(darkColor); int offset = 5 * level.getDistance(); int half = VERTEX_SHAPE_SIZE / 2; int start = 0; @@ -159,7 +160,7 @@ public class FcgVertex extends AbstractVisualVertex implements VertexShapeProvid // calculate the needed size layeredPane = new JLayeredPane(); - Border border = createDebugBorder(new LineBorder(Color.YELLOW.darker(), 1)); + Border border = createDebugBorder(new LineBorder(Palette.GOLD, 1)); layeredPane.setBorder(border); updateLayeredPaneSize(); @@ -549,7 +550,7 @@ public class FcgVertex extends AbstractVisualVertex implements VertexShapeProvid /** * Sets whether this vertex has any outgoing references * - * @param hasIncoming true if this vertex has any incoming references + * @param hasOutgoing true if this vertex has any outgoing references */ public void setHasOutgoingReferences(boolean hasOutgoing) { diff --git a/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/renderer/FcgEdgePaintTransformer.java b/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/renderer/FcgEdgePaintTransformer.java index eda4faca1b..428aa3555e 100644 --- a/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/renderer/FcgEdgePaintTransformer.java +++ b/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/renderer/FcgEdgePaintTransformer.java @@ -16,7 +16,6 @@ package functioncalls.graph.renderer; import java.awt.Color; -import java.awt.Paint; import com.google.common.base.Function; @@ -26,7 +25,7 @@ import ghidra.util.ColorUtils; /** * Generates colors for a given {@link FcgEdge} */ -public class FcgEdgePaintTransformer implements Function { +public class FcgEdgePaintTransformer implements Function { private Color directColor; private Color indirectColor; @@ -52,7 +51,7 @@ public class FcgEdgePaintTransformer implements Function { } @Override - public Paint apply(FcgEdge e) { + public Color apply(FcgEdge e) { if (e.isDirectEdge()) { return getDirectEdgeColor(e); } diff --git a/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/view/FcgComponent.java b/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/view/FcgComponent.java index 001b16844a..f251e18e4c 100644 --- a/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/view/FcgComponent.java +++ b/Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/view/FcgComponent.java @@ -16,13 +16,16 @@ package functioncalls.graph.view; import docking.theme.GColor; -import edu.uci.ics.jung.visualization.RenderContext; +import edu.uci.ics.jung.visualization.renderers.Renderer; import functioncalls.graph.*; import functioncalls.graph.renderer.FcgEdgePaintTransformer; import functioncalls.graph.renderer.FcgVertexPaintTransformer; import functioncalls.plugin.FunctionCallGraphPlugin; import ghidra.graph.viewer.*; +import ghidra.graph.viewer.edge.VisualEdgeRenderer; import ghidra.graph.viewer.layout.VisualGraphLayout; +import ghidra.graph.viewer.renderer.VisualVertexSatelliteRenderer; +import ghidra.graph.viewer.vertex.VisualVertexRenderer; /** * A graph component for the {@link FunctionCallGraphPlugin} @@ -32,13 +35,15 @@ public class FcgComponent extends GraphComponent renderContext = viewer.getRenderContext(); - renderContext.setVertexFillPaintTransformer(vertexPaintTransformer); + Renderer renderer = viewer.getRenderer(); + VisualVertexRenderer vertexRenderer = + (VisualVertexRenderer) renderer.getVertexRenderer(); + vertexRenderer.setVertexFillPaintTransformer(vertexPaintTransformer); - // Note: setting the fill for the edges has the effect of drawing a filled-in circle - // instead of just the outer edge. - // renderContext.setEdgeFillPaintTransformer(edgePaintTransformer); - renderContext.setEdgeDrawPaintTransformer(edgePaintTransformer); - renderContext.setArrowFillPaintTransformer(edgePaintTransformer); - renderContext.setArrowDrawPaintTransformer(edgePaintTransformer); + VisualEdgeRenderer edgeRenderer = + (VisualEdgeRenderer) renderer.getEdgeRenderer(); + edgeRenderer.setDrawColorTransformer(edgePaintTransformer); + edgeRenderer.setSelectedColorTransformer(selectedEdgePaintTransformer); } @Override @@ -76,12 +81,14 @@ public class FcgComponent extends GraphComponent renderContext = viewer.getRenderContext(); - renderContext.setVertexFillPaintTransformer(vertexPaintTransformer); - //renderContext.setEdgeFillPaintTransformer(satelliteEdgePaintTransformer); - renderContext.setEdgeDrawPaintTransformer(satelliteEdgePaintTransformer); - renderContext.setArrowFillPaintTransformer(satelliteEdgePaintTransformer); - renderContext.setArrowDrawPaintTransformer(satelliteEdgePaintTransformer); + Renderer renderer = viewer.getRenderer(); + VisualVertexSatelliteRenderer vertexRenderer = + (VisualVertexSatelliteRenderer) renderer.getVertexRenderer(); + vertexRenderer.setVertexFillPaintTransformer(vertexPaintTransformer); + + VisualEdgeRenderer edgeRenderer = + (VisualEdgeRenderer) renderer.getEdgeRenderer(); + edgeRenderer.setDrawColorTransformer(satelliteEdgePaintTransformer); } @Override diff --git a/Ghidra/Framework/Docking/data/docking.palette.theme.properties b/Ghidra/Framework/Docking/data/docking.palette.theme.properties index 1d29c76bff..4c505e9a26 100644 --- a/Ghidra/Framework/Docking/data/docking.palette.theme.properties +++ b/Ghidra/Framework/Docking/data/docking.palette.theme.properties @@ -3,16 +3,36 @@ color.palette.nocolor = rgba(255,255,255,0) color.palette.black = black +color.palette.blue = blue +color.palette.crimson = crimson color.palette.cyan = cyan -color.palette.lightGray = rgb(192, 192, 192) +color.palette.darkblue = DarkBlue +color.palette.darkkhaki = DarkKhaki +color.palette.dodgerblue = DodgerBlue +color.palette.gold = gold +color.palette.gray = gray +color.palette.green = green +color.palette.khaki = khaki +color.palette.lavender = lavender +color.palette.lime = lime +color.palette.lightgray = rgb(192, 192, 192) color.palette.lightgreen = rgb(127, 255, 127) color.palette.lightred = rgb(255, 127, 127) +color.palette.magenta = magenta +color.palette.mistyrose = mistyrose +color.palette.olive = olive +color.palette.orange = orange +color.palette.palegreen = palegreen +color.palette.palevioletred = PaleVioletRed +color.palette.pink = pink color.palette.red = red color.palette.yellow = yellow +color.palette.yellowgreen = yellowgreen color.palette.white = white [Dark Defaults] -// TODO replace values above with dark values \ No newline at end of file +// TODO replace values above with dark values +color.palette.black = lightgray \ No newline at end of file diff --git a/Ghidra/Framework/Docking/data/docking.theme.properties b/Ghidra/Framework/Docking/data/docking.theme.properties index 77f02ea31a..508b60984d 100644 --- a/Ghidra/Framework/Docking/data/docking.theme.properties +++ b/Ghidra/Framework/Docking/data/docking.theme.properties @@ -48,8 +48,8 @@ color.bg.fieldpanel.selection-highlight = green [Dark Defaults] color.bg = rgb(40, 42, 46) -color.fg = gray -color.bg.currentline = rgb(60,60,70) +color.fg = lightgray +color.bg.currentline = rgb(60,60,70) // dark gray color.cursor.focused = indianRed color.cursor.unfocussed = darkGray @@ -59,7 +59,7 @@ color.bg.textfield.hint.invalid = maroon color.bg.selection = teal color.bg.highlight = rgb(110,110,0) -color.bg.fieldpanel.select-highlight = darkGreen +color.bg.fieldpanel.selection-highlight = darkGreen color.bg.tableheader.gradient.start = color.bg color.bg.tableheader.gradient.end = darkGray diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/GColor.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/GColor.java index 8d812d7d2d..824e55beae 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/theme/GColor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/GColor.java @@ -47,6 +47,16 @@ public class GColor extends Color implements Refreshable { } + private GColor(String id, int alpha) { + this(id); + + delegate = new Color(delegate.getRed(), delegate.getGreen(), delegate.getBlue(), alpha); + } + + public GColor withAlpha(int alpha) { + return new GColor(id, alpha); + } + public String getId() { return id; } @@ -165,7 +175,8 @@ public class GColor extends Color implements Refreshable { public void refresh() { Color color = Gui.getRawColor(id, false); if (color != null) { - delegate = color; + int alpha = delegate.getAlpha(); + delegate = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); } else { System.out.println("Hey"); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/theme/GThemeDefaults.java b/Ghidra/Framework/Docking/src/main/java/docking/theme/GThemeDefaults.java index d4f250235f..25e94b0ada 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/theme/GThemeDefaults.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/theme/GThemeDefaults.java @@ -48,19 +48,29 @@ public class GThemeDefaults { //@formatter:on public static class Java { - public static final Color BORDER = new GColor(Ids.Java.BORDER); + public static final GColor BORDER = new GColor(Ids.Java.BORDER); } /** * Generic palette colors, using color names, that may be changed along with the theme */ public static class Palette { + + /** Transparent color */ public static final Color NO_COLOR = new GColor("color.palette.nocolor"); - public static final Color BLACK = new GColor("color.palette.black"); - public static final Color CYAN = new GColor("color.palette.cyan"); - public static final Color RED = new GColor("color.palette.red"); - public static final Color WHITE = new GColor("color.palette.white"); + public static final GColor BLACK = new GColor("color.palette.black"); + public static final GColor BLUE = new GColor("color.palette.blue"); + public static final GColor CYAN = new GColor("color.palette.cyan"); + public static final GColor GOLD = new GColor("color.palette.gold"); + public static final GColor GRAY = new GColor("color.palette.gray"); + public static final GColor GREEN = new GColor("color.palette.green"); + public static final GColor LIME = new GColor("color.palette.lime"); + public static final GColor ORANGE = new GColor("color.palette.orange"); + public static final GColor PINK = new GColor("color.palette.pink"); + public static final GColor RED = new GColor("color.palette.red"); + public static final GColor WHITE = new GColor("color.palette.white"); + public static final GColor YELLOW = new GColor("color.palette.yellow"); } 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 336a087f7a..ddd21c8622 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/DropDownTextField.java @@ -26,6 +26,7 @@ import javax.swing.event.*; import org.apache.commons.lang3.StringUtils; +import docking.theme.GColor; import docking.widgets.label.GDHtmlLabel; import docking.widgets.list.GList; import generic.util.WindowUtilities; @@ -573,7 +574,9 @@ public class DropDownTextField extends JTextField implements GComponent { matchingWindow.setFocusable(false); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBorder( - BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.GRAY, Color.BLACK)); + 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); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/autocomplete/TextFieldAutocompleter.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/autocomplete/TextFieldAutocompleter.java index d45552dfef..c48aacf819 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/autocomplete/TextFieldAutocompleter.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/autocomplete/TextFieldAutocompleter.java @@ -30,6 +30,7 @@ import javax.swing.text.Caret; import docking.DockingUtils; import docking.DockingUtils.TreeTraversalResult; +import docking.theme.GColor; import docking.widgets.textfield.TextFieldLinker; import generic.util.WindowUtilities; import ghidra.util.task.SwingUpdateManager; @@ -131,9 +132,13 @@ public class TextFieldAutocompleter { // Prepare all the swing components (except the window) { content.setBorder( - BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.LIGHT_GRAY, Color.GRAY)); + BorderFactory.createBevelBorder(BevelBorder.RAISED, + new GColor("color.border.bevel.highlight"), + new GColor("color.border.bevel.shadow"))); scrollPane.setBorder( - BorderFactory.createBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, Color.GRAY)); + BorderFactory.createBevelBorder(BevelBorder.RAISED, + new GColor("color.border.bevel.highlight"), + new GColor("color.border.bevel.shadow"))); //content.setFocusable(false); scrollPane.getVerticalScrollBar().setFocusable(false); @@ -1094,7 +1099,7 @@ public class TextFieldAutocompleter { dual.setVisible(true); - AutocompletionModel model = new AutocompletionModel() { + AutocompletionModel model = new AutocompletionModel<>() { Set strings = new HashSet<>(Arrays.asList(new String[] { "Test", "Testing", "Another", "Yet another", "Yet still more", "Yet still even more", "Yetis, yo" })); @@ -1110,7 +1115,7 @@ public class TextFieldAutocompleter { return matching; } }; - TextFieldAutocompleter auto = new TextFieldAutocompleter(model) { + TextFieldAutocompleter auto = new TextFieldAutocompleter<>(model) { @Override protected String getPrefix(JTextField field) { return dual.getTextBeforeCursor(field); diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/WebColors.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/WebColors.java index c3a6b3ba49..0f8fdee1fe 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/WebColors.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/WebColors.java @@ -150,7 +150,7 @@ public abstract class WebColors { public static final Color MISTY_ROSE = registerColor("MistyRose", Color.decode("0xFFE4E1")); public static final Color BLANCHED_ALMOND = registerColor("BlanchedAlmond", Color.decode("0xFFEBCD")); public static final Color PAPAYA_WHIP = registerColor("PapayaWhip", Color.decode("0xFFEFD5")); - public static final Color LAVENDAR_BLUSH = registerColor("LavenderBlush", Color.decode("0xFFF0F5")); + public static final Color LAVENDER_BLUSH = registerColor("LavenderBlush", Color.decode("0xFFF0F5")); public static final Color SEASHELL = registerColor("SeaShell", Color.decode("0xFFF5EE")); public static final Color CORNSILK = registerColor("Cornsilk", Color.decode("0xFFF8DC")); public static final Color LEMON_CHIFFON = registerColor("LemonChiffon", Color.decode("0xFFFACD")); diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/WeakStore.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/WeakStore.java index 82127cc3db..534376191b 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/WeakStore.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/WeakStore.java @@ -20,12 +20,13 @@ import java.lang.ref.WeakReference; import java.util.*; /** - * Class for storing weak reference to object instances. Objects of type T can be place - * in this store and they will remain there until there are no references to that object - * remaining. Note that this is not a Set and you can have multiple instances that are - * "equal" in this store.The main purpose of this store is to be able to get all objects - * in the store that are still reference; typically to refresh or "kick" them in some manner. - * Could be useful for a thread safe weak listener list. + * Class for storing weak reference to object instances. Objects of type T can be place in this + * store and they will remain there until there are no references to that object remaining. Note + * that this is not a Set and you can have multiple instances that are "equal" in this store.The + * main purpose of this store is to be able to get all objects in the store that are still + * referenced. This is useful when you need to visit all remaining items. + *

+ * This class is thread safe. * * @param The type of objects stored in this WeakStore */ diff --git a/Ghidra/Framework/Graph/data/graph.theme.properties b/Ghidra/Framework/Graph/data/graph.theme.properties index de7206c154..3c2fd5bf80 100644 --- a/Ghidra/Framework/Graph/data/graph.theme.properties +++ b/Ghidra/Framework/Graph/data/graph.theme.properties @@ -1,13 +1,21 @@ [Defaults] - +# visual graph color.bg.visualgraph = color.bg -color.bg.highlight.visualgraph = rgba(255,255,0,0.6) // somewhat transparent yellow +color.bg.visualgraph.satellite = lightgray +color.bg.highlight.visualgraph = rgba(255,255,0,155) // somewhat transparent yellow +color.bg.visualgraph.message = rgb(138, 185, 241) // jordy blue -color.graph.display.vertex = green -color.graph.display.edge = green -color.graph.display.vertex.selected = blue -color.graph.display.edge.selected = blue +color.fg.visualgraph.message = color.palette.black + +# graph display +color.graphdisplay.vertex = green +color.graphdisplay.edge = green +color.graphdisplay.vertex.selected = blue +color.graphdisplay.edge.selected = blue [Dark Defaults] +color.bg.highlight.visualgraph = rgba(120,120,120,155) // light gray with dark bg = dark gray +color.bg.visualgraph.message = rgb(65, 146, 242) // dark blue close to jordy blue +color.fg.visualgraph.message = color.palette.lightgray 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 39e307c99f..9ce4e6287f 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java @@ -27,6 +27,10 @@ import com.google.common.base.Function; import docking.DockingUtils; import docking.DockingWindowManager; import docking.actions.KeyBindingUtils; +import docking.help.HelpService; +import docking.theme.GColor; +import docking.theme.GThemeDefaults.Colors; +import docking.theme.GThemeDefaults.Colors.Palette; import docking.widgets.EmptyBorderButton; import docking.widgets.PopupWindow; import docking.widgets.label.GIconLabel; @@ -39,6 +43,7 @@ import edu.uci.ics.jung.visualization.decorators.PickableVertexPaintTransformer; import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; import edu.uci.ics.jung.visualization.picking.PickedState; import edu.uci.ics.jung.visualization.picking.ShapePickSupport; +import edu.uci.ics.jung.visualization.renderers.BasicEdgeRenderer; import edu.uci.ics.jung.visualization.renderers.Renderer; import edu.uci.ics.jung.visualization.util.Caching; import ghidra.graph.VisualGraph; @@ -193,21 +198,6 @@ public class GraphComponent, G e GraphViewer viewer = new GraphViewer<>(layout, viewerSize); - Renderer renderer = viewer.getRenderer(); - renderer.setVertexRenderer(new VisualVertexRenderer<>()); - - RenderContext renderContext = viewer.getRenderContext(); - - Color normal = Color.GREEN.darker().darker(); - Color selected = Color.GREEN; - renderContext.setEdgeDrawPaintTransformer(e -> e.isSelected() ? selected : normal); - renderContext.setArrowDrawPaintTransformer(e -> e.isSelected() ? selected : normal); - renderContext.setArrowFillPaintTransformer(e -> e.isSelected() ? selected : normal); - - PickedState pickedVertexState = viewer.getPickedVertexState(); - renderContext.setVertexFillPaintTransformer( - new PickableVertexPaintTransformer<>(pickedVertexState, Color.WHITE, Color.YELLOW)); - viewer.setGraphOptions(vgOptions); return viewer; @@ -258,10 +248,33 @@ public class GraphComponent, G e protected void decoratePrimaryViewer(GraphViewer viewer, VisualGraphLayout layout) { Renderer renderer = viewer.getRenderer(); - renderer.setEdgeRenderer(layout.getEdgeRenderer()); + BasicEdgeRenderer edgeRenderer = layout.getEdgeRenderer(); + renderer.setEdgeRenderer(edgeRenderer); RenderContext renderContext = viewer.getRenderContext(); + Color normal = Palette.GREEN; + Color selected = Palette.LIME; + if (edgeRenderer instanceof VisualEdgeRenderer) { + VisualEdgeRenderer visualRenderer = + (VisualEdgeRenderer) renderer.getEdgeRenderer(); + visualRenderer.setDrawColorTransformer(e -> normal); + visualRenderer.setSelectedColorTransformer(e -> selected); + } + else { + Function edgeColorTransformer = + e -> e.isSelected() ? selected : normal; + renderContext.setEdgeDrawPaintTransformer(edgeColorTransformer); + renderContext.setArrowDrawPaintTransformer(edgeColorTransformer); + renderContext.setArrowFillPaintTransformer(edgeColorTransformer); + } + + VisualVertexRenderer vertexRenderer = new VisualVertexRenderer<>(); + renderer.setVertexRenderer(vertexRenderer); + PickedState pickedVertexState = viewer.getPickedVertexState(); + vertexRenderer.setVertexFillPaintTransformer( + new PickableVertexPaintTransformer<>(pickedVertexState, Palette.WHITE, Palette.YELLOW)); + // this will paint thicker, but with the shape being used...which can look odd //renderContext.setEdgeFillPaintTransformer(null); PickedState pickedEdgeState = viewer.getPickedEdgeState(); @@ -319,8 +332,14 @@ public class GraphComponent, G e Renderer renderer = viewer.getRenderer(); renderer.setVertexRenderer(viewer.getPreferredVertexRenderer()); - renderer.setEdgeRenderer(new VisualGraphEdgeSatelliteRenderer<>( - (VisualEdgeRenderer) layout.getEdgeRenderer())); + VisualGraphEdgeSatelliteRenderer visualEdgeRenderer = + new VisualGraphEdgeSatelliteRenderer<>( + (VisualEdgeRenderer) layout.getEdgeRenderer()); + renderer.setEdgeRenderer(visualEdgeRenderer); + + Color normal = Palette.GREEN; + Color selected = Palette.LIME; + visualEdgeRenderer.setDrawColorTransformer(e -> e.isSelected() ? selected : normal); Function edgeTransformer = layout.getEdgeShapeTransformer(); renderContext.setEdgeShapeTransformer(edgeTransformer); @@ -374,7 +393,7 @@ public class GraphComponent, G e mainPanel.add(layeredPane, BorderLayout.CENTER); - satellite.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + satellite.setBorder(BorderFactory.createLineBorder(Colors.Java.BORDER)); undockedSatellitePanel = new JPanel(new BorderLayout()); undockedSatellitePanel.addComponentListener(new ComponentAdapter() { @@ -966,7 +985,7 @@ public class GraphComponent, G e private class MessagePaintable implements Paintable { - private final Color backgroundColor = new Color(134, 180, 238); + private final Color backgroundColor = new GColor("color.bg.visualgraph.message"); private String message = null; @Override @@ -1009,7 +1028,7 @@ public class GraphComponent, G e g2.setPaint(bottomToTopGradiant); g2.fillRect(backgroundX, upperY, backgroundWidth, backgroundHeight); - g2.setPaint(Color.BLACK); + g2.setPaint(Palette.BLACK); int textX = startX + (isGraphViewStale() ? staleGraphViewPanel.getBounds().width + 5 : 0); g2.drawString(message, textX, startY); diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/SatelliteGraphViewer.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/SatelliteGraphViewer.java index 71f04eb432..d8cc1f7295 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/SatelliteGraphViewer.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/SatelliteGraphViewer.java @@ -37,7 +37,7 @@ public class SatelliteGraphViewer graphViewer; private boolean docked; - private VisualGraphOptions options; + protected VisualGraphOptions options; public SatelliteGraphViewer(GraphViewer master, Dimension preferredSize) { super(master, preferredSize); diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/VisualEdgeRenderer.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/VisualEdgeRenderer.java index 3109df70f5..bb73596f0d 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/VisualEdgeRenderer.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/VisualEdgeRenderer.java @@ -18,12 +18,15 @@ package ghidra.graph.viewer.edge; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; +import java.util.Objects; import javax.swing.JComponent; import com.google.common.base.Function; import com.google.common.base.Predicate; +import docking.theme.GThemeDefaults.Colors.Palette; +import docking.theme.Gui; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.util.Context; @@ -75,6 +78,13 @@ import ghidra.graph.viewer.vertex.VisualGraphVertexShapeTransformer; * have to be changed, such as the {@link AbstractVisualGraphLayout}, which needs the centering * offsets to handle vertex clipping. * + *

When painting edges this renderer will paint colors based on the following states: default, + * hovered, focused and selected. A focused edge is one that is part of the path between focused + * vertices, whereas a selected edge is one that has been selected by the user (see + * {@link VisualEdge} for details). Each of these states may have a different color that can be + * changed by calling the various setter methods on this renderer. When painting, these colors + * are used along with various different strokes to paint in an overlay fashion. + * * @param the vertex type * @param the edge type */ @@ -88,8 +98,9 @@ public abstract class VisualEdgeRenderer drawColorTransformer = e -> Palette.BLACK; + private Function focusedColorTransformer = e -> Palette.GRAY; + private Function selectedColorTransformer = e -> Palette.GRAY; private VisualEdgeArrowRenderingSupport arrowRenderingSupport = new VisualEdgeArrowRenderingSupport<>(); @@ -106,20 +117,58 @@ public abstract class VisualEdgeRenderer transformer) { + this.drawColorTransformer = Objects.requireNonNull(transformer); } - public Color getBaseColor(Graph g, E e) { - return defaultBaseColor; + /** + * Returns the current draw color. + * @param g the graph + * @param e the edge + * @return the color + */ + public Color getDrawColor(Graph g, E e) { + return this.drawColorTransformer.apply(e); } - public void setHighlightColor(Color highlightColor) { - this.defaultHighlightColor = highlightColor; + /** + * Sets the color provider to use when drawing this edge when the edge is focused. + * @param transformer the color provider + */ + public void setFocusedColorTransformer(Function transformer) { + this.focusedColorTransformer = Objects.requireNonNull(transformer); } - public Color getHighlightColor(Graph g, E e) { - return defaultHighlightColor; + /** + * Returns the current color to use when the edge is focused. + * @param g the graph + * @param e the edge + * @return the color + */ + public Color getFocusedColor(Graph g, E e) { + return focusedColorTransformer.apply(e); + } + + /** + * Sets the color provider to use when drawing this edge when the edge is selected. + * @param transformer the color provider + */ + public void setSelectedColorTransformer(Function transformer) { + this.selectedColorTransformer = Objects.requireNonNull(transformer); + } + + /** + * Returns the current color to use when the edge is selected. + * @param g the graph + * @param e the edge + * @return the color + */ + public Color getSelectedColor(Graph g, E e) { + return selectedColorTransformer.apply(e); } // template method @@ -167,12 +216,13 @@ public abstract class VisualEdgeRenderer rc, Graph graph, E e, float x1, diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/routing/ArticulatedEdgeRouter.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/routing/ArticulatedEdgeRouter.java index 3671dfd0d8..e1d4255056 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/routing/ArticulatedEdgeRouter.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/edge/routing/ArticulatedEdgeRouter.java @@ -27,6 +27,8 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.collections4.*; +import docking.theme.GColor; +import docking.theme.GThemeDefaults.Colors.Palette; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.util.Pair; @@ -220,6 +222,7 @@ class ArticulatedEdgeRouter> return createLineEdge(start, end, edge); } + @SuppressWarnings("unchecked") E newEdge = (E) edge.cloneEdge(edge.getStart(), edge.getEnd()); moveArticulationsAroundVertices(intersectingVertices, newEdge, goLeft); @@ -229,7 +232,6 @@ class ArticulatedEdgeRouter> /** * Returns a mapping edges to vertices that touch them. * - * @param viewer the viewer containing the graph * @param edgeCollection the edges to check for occlusion * @return a mapping of occluded edges (a subset of the provided edges) to those vertices that * occlude them. @@ -319,35 +321,34 @@ class ArticulatedEdgeRouter> private Color getRoutingBoxColor(E edge) { if (isTrueEdge(edge)) { - return Color.MAGENTA; + return new GColor("color.palette.magenta"); } - return Color.ORANGE; + return Palette.ORANGE; } // // private Color getIntersectingBoxColor(E edge) { // if (isTrueEdge(edge)) { -// return Color.RED; +// return Palette.RED; // } -// return Color.PINK; +// return Palette.PINK; // } private Color getPhantomEdgeColor(E edge, boolean isLeft) { if (isLeft) { if (isTrueEdge(edge)) { - return new Color(0x999900); + return new GColor("color.palette.darkkhaki"); } - return new Color(0x009900); + return Palette.GREEN; } if (isTrueEdge(edge)) { - return new Color(0x3300CC); + return new GColor("color.palette.darkblue"); } - return new Color(0x3399FF); + return new GColor("color.palette.dodgerblue"); } private boolean isTrueEdge(E edge) { return true; - // return edge.getFlowType().isJump(); // a jump is a 'true' edge } } diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/JungPickingGraphMousePlugin.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/JungPickingGraphMousePlugin.java index cf7f3c6206..2a72b2d44c 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/JungPickingGraphMousePlugin.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/JungPickingGraphMousePlugin.java @@ -22,6 +22,7 @@ import java.util.Collection; import javax.swing.JComponent; +import docking.theme.GThemeDefaults.Colors.Palette; import edu.uci.ics.jung.algorithms.layout.GraphElementAccessor; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.visualization.Layer; @@ -94,7 +95,7 @@ public class JungPickingGraphMousePlugin extends AbstractGraphMousePlugin /** * color for the picking rectangle */ - protected Color lensColor = Color.cyan; + protected Color lensColor = Palette.CYAN; /** * create an instance with default settings diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/VisualGraphMouseTrackingGraphMousePlugin.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/VisualGraphMouseTrackingGraphMousePlugin.java index 15406fa43f..eb69d9b262 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/VisualGraphMouseTrackingGraphMousePlugin.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/event/mouse/VisualGraphMouseTrackingGraphMousePlugin.java @@ -22,6 +22,7 @@ import java.awt.geom.AffineTransform; import java.util.Objects; import docking.DockingUtils; +import docking.theme.GThemeDefaults.Colors.Palette; import edu.uci.ics.jung.visualization.*; import edu.uci.ics.jung.visualization.control.AbstractGraphMousePlugin; import edu.uci.ics.jung.visualization.transform.MutableTransformer; @@ -92,6 +93,7 @@ public class VisualGraphMouseTrackingGraphMousePlugin calculateLocations(VisualGraph graph, TaskMonitor monitor); diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/DebugShape.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/DebugShape.java index 03c1cae595..3ab472b0b4 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/DebugShape.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/DebugShape.java @@ -19,11 +19,11 @@ import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.concurrent.atomic.AtomicInteger; -import javax.swing.SwingUtilities; - +import docking.theme.GThemeDefaults.Colors.Palette; import edu.uci.ics.jung.visualization.VisualizationServer; import edu.uci.ics.jung.visualization.VisualizationServer.Paintable; import edu.uci.ics.jung.visualization.transform.shape.GraphicsDecorator; +import ghidra.util.Swing; public class DebugShape implements Paintable { @@ -75,7 +75,7 @@ public class DebugShape implements Paintable { g.draw(shape); - g.setColor(Color.black); + g.setColor(Palette.BLACK); FontMetrics fontMetrics = g.getFontMetrics(); Rectangle2D stringBounds = fontMetrics.getStringBounds(text, g); Point location = shape.getBounds().getLocation(); @@ -88,12 +88,7 @@ public class DebugShape implements Paintable { private boolean shapeIsOutdated() { if (drawingIterationID != drawingIterationCounter.get()) { // we are no longer drawing this shape - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - viewer.removePostRenderPaintable(DebugShape.this); - } - }); + Swing.runLater(() -> viewer.removePostRenderPaintable(DebugShape.this)); return true; } return false; diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseClickedPaintableShape.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseClickedPaintableShape.java index 735bc4da37..38b3bfec64 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseClickedPaintableShape.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseClickedPaintableShape.java @@ -19,12 +19,14 @@ import java.awt.Color; import java.awt.Point; import java.awt.geom.Ellipse2D; +import docking.theme.GThemeDefaults.Colors.Palette; + /** * A debugging shape painter that allows the user to see where a mouse clicked happened. */ public class MouseClickedPaintableShape extends PaintableShape { - private static final Color DEFAULT_COLOR = new Color(255, 200, 0, 127); // orangish + private static final Color DEFAULT_COLOR = Palette.ORANGE.withAlpha(127); public MouseClickedPaintableShape(Point p, double tx, double ty) { this(p, tx, ty, DEFAULT_COLOR); diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedLinePaintableShape.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedLinePaintableShape.java index 59bd05ff6a..5e65c576dd 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedLinePaintableShape.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedLinePaintableShape.java @@ -20,6 +20,11 @@ import java.awt.geom.GeneralPath; import java.util.ArrayList; import java.util.List; +import docking.theme.GThemeDefaults.Colors.Palette; + +/** + * Paints a line showing the start and end points of a drag operation. + */ public class MouseDraggedLinePaintableShape extends PaintableShape { private List points = new ArrayList<>(); @@ -27,7 +32,7 @@ public class MouseDraggedLinePaintableShape extends PaintableShape { public MouseDraggedLinePaintableShape(Point start, Point end, double tx, double ty) { super(tx, ty); - this.color = new Color(0, 200, 0, 137); + this.color = Palette.GREEN.withAlpha(127); this.stroke = new BasicStroke(20); points.add(start); @@ -89,7 +94,7 @@ public class MouseDraggedLinePaintableShape extends PaintableShape { g.draw(shape); // g.fill(shape); -// g.setColor(new Color(20, 200, 20, 147)); +// g.setColor(Palette.GREEN.withAlpha(127);); // controls.forEach(c -> { // // int x = c.x; @@ -101,7 +106,7 @@ public class MouseDraggedLinePaintableShape extends PaintableShape { // g.fill(r); // }); // -// g.setColor(Color.pink); +// g.setColor(Palette.PINK); // points.forEach(p -> { // int x = p.x; // int y = p.y; diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedPaintableShape.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedPaintableShape.java index 7f8ec92266..1ba3d28ab2 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedPaintableShape.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/MouseDraggedPaintableShape.java @@ -18,16 +18,21 @@ package ghidra.graph.viewer.renderer; import java.awt.*; import java.awt.geom.Rectangle2D; +import docking.theme.GColor; + +/** + * Paints a rectangle showing the start and end points of a drag. + */ public class MouseDraggedPaintableShape extends PaintableShape { - private static final Color START_COLOR = new Color(200, 0, 80, 25); - private static final Color END_COLOR = new Color(200, 0, 80, 200); + private static final GColor BASE_COLOR = new GColor("color.palette.crimson"); + private static final Color START_COLOR = BASE_COLOR.withAlpha(25); + private static final Color END_COLOR = BASE_COLOR.withAlpha(200); private Paint paint; public MouseDraggedPaintableShape(Point start, Point end, double tx, double ty) { super(tx, ty); - this.color = new Color(200, 0, 80, 147); this.stroke = new BasicStroke(15); int x1 = start.x; diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/PaintableShape.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/PaintableShape.java index 83c52860e2..548ed9bad8 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/PaintableShape.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/PaintableShape.java @@ -18,13 +18,15 @@ package ghidra.graph.viewer.renderer; import java.awt.*; import java.util.Objects; +import docking.theme.GThemeDefaults.Colors.Palette; + /** * A base class for shapes that can be painted on the graph. See {@link MouseDebugPaintable}. */ public class PaintableShape { protected Shape shape; - protected Color color = new Color(255, 200, 0, 127); // orange with alpha; + protected Color color = Palette.ORANGE.withAlpha(127); protected Stroke stroke; protected double tx; diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualGraphRenderer.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualGraphRenderer.java index a6e46ad8bc..f63da20c6b 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualGraphRenderer.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/renderer/VisualGraphRenderer.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. @@ -21,6 +21,7 @@ import java.util.*; import com.google.common.base.Function; +import docking.theme.GThemeDefaults.Colors.Palette; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.visualization.*; import edu.uci.ics.jung.visualization.layout.ObservableCachingLayout; @@ -143,8 +144,8 @@ public class VisualGraphRenderer GraphicsDecorator g = renderContext.getGraphicsContext(); Color originalColor = g.getColor(); - Color gridColor = Color.ORANGE; - Color textColor = Color.BLACK; + Color gridColor = Palette.ORANGE; + Color textColor = Palette.BLACK; boolean isCondensed = locationMap.isCondensed(); Row lastRow = locationMap.lastRow(); 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 9b406a4e71..509b925a13 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 @@ -17,6 +17,10 @@ package ghidra.graph.viewer.renderer; import java.awt.*; +import com.google.common.base.Function; + +import docking.theme.GColor; +import docking.theme.GThemeDefaults.Colors; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.visualization.RenderContext; import edu.uci.ics.jung.visualization.transform.shape.GraphicsDecorator; @@ -27,10 +31,14 @@ import ghidra.graph.viewer.vertex.AbstractVisualVertexRenderer; /** * 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 */ public class VisualVertexSatelliteRenderer> extends AbstractVisualVertexRenderer { + private Color highlightColor = new GColor("color.bg.highlight.visualgraph"); + /** * Overridden to handle painting emphasis. */ @@ -63,6 +71,27 @@ public class VisualVertexSatelliteRenderer rc, V v, Shape shape) { + GraphicsDecorator g = rc.getGraphicsContext(); + Paint oldPaint = g.getPaint(); + + Function fillXform = getVertexFillPaintTransformer(); + if (fillXform == null) { + fillXform = rc.getVertexFillPaintTransformer(); + } + + Paint fillPaint = fillXform.apply(v); + if (fillPaint == null) { + super.paintShapeForVertex(rc, v, shape); + return; + } + + g.setPaint(fillPaint); + g.fill(shape); + g.setPaint(oldPaint); + } + @Override protected Shape prepareFinalVertexShape(RenderContext rc, V v, Layout layout, int[] coords) { @@ -83,10 +112,7 @@ public class VisualVertexSatelliteRenderer highlightRenderer = new VisualVertexSatelliteRenderer<>(); @@ -56,10 +55,6 @@ public class CachingSatelliteGraphViewer layout = masterViewer.getGraphLayout(); if (layout instanceof ObservableCachingLayout) { ObservableCachingLayout cachingLayout = (ObservableCachingLayout) layout; @@ -76,7 +71,7 @@ public class CachingSatelliteGraphViewer getPreferredVertexRenderer() { - return new VisualVertexSatelliteRenderer() { + return new VisualVertexSatelliteRenderer<>() { @Override protected void paintHighlight(RenderContext rc, V vertex, GraphicsDecorator g, Rectangle bounds) { @@ -100,16 +95,16 @@ public class CachingSatelliteGraphViewer vertexFillPaintTransformer; + + /** + * Sets the optional transformer used to convert a vertex into a color + * @param transformer the transformer + */ + public void setVertexFillPaintTransformer(Function transformer) { + this.vertexFillPaintTransformer = transformer; + } + + public Function getVertexFillPaintTransformer() { + return vertexFillPaintTransformer; + } + /** * Creates a copy of the given {@link GraphicsDecorator} that may have scaling tweaked to * handle {@link VisualVertex#getEmphasis()} emphasized vertices. + * @param g the graphics + * @param vertex the vertex + * @param rc the render context + * @param layout the graph layout + * @return the new graphics */ protected GraphicsDecorator getEmphasisGraphics(GraphicsDecorator g, V vertex, RenderContext rc, Layout layout) { @@ -111,10 +131,10 @@ public class AbstractVisualVertexRenderer rc) { diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/DockingVisualVertex.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/DockingVisualVertex.java index 277b6de5cd..29fbd3231a 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/DockingVisualVertex.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/DockingVisualVertex.java @@ -23,6 +23,8 @@ import java.beans.PropertyChangeListener; import javax.swing.*; import docking.GenericHeader; +import docking.theme.GColor; +import docking.theme.GThemeDefaults.Colors.Palette; import ghidra.graph.viewer.VisualVertex; import ghidra.util.MathUtilities; @@ -54,8 +56,8 @@ public class DockingVisualVertex extends AbstractVisualVertex { }; textArea.setText(name); textArea.setPreferredSize(new Dimension(200, 50)); - textArea.setBackground(Color.YELLOW.darker()); - textArea.setCaretColor(Color.PINK); + textArea.setBackground(new GColor("color.palette.darkkhaki")); + textArea.setCaretColor(Palette.PINK); textArea.setBorder(BorderFactory.createRaisedBevelBorder()); textArea.setLineWrap(true); diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/VisualVertexRenderer.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/VisualVertexRenderer.java index 7827d795e3..be0beb7ac8 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/VisualVertexRenderer.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/vertex/VisualVertexRenderer.java @@ -21,6 +21,7 @@ import java.awt.*; import com.google.common.base.Function; +import docking.theme.GThemeDefaults.Colors; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.util.Context; @@ -108,10 +109,10 @@ public class VisualVertexRenderer rc, V vertex, GraphicsDecorator g, Shape shape) { - Function fillXform = rc.getVertexFillPaintTransformer(); + + Function fillXform = getVertexFillPaintTransformer(); + if (fillXform == null) { + fillXform = rc.getVertexFillPaintTransformer(); + } + Paint fillPaint = fillXform.apply(vertex); if (fillPaint == null) { return; @@ -147,9 +153,10 @@ public class VisualVertexRenderer edgePriorityMap = new HashMap<>(); private List changeListeners = new CopyOnWriteArrayList<>(); - private Color vertexSelectionColor = new GColor("color.graph.display.vertex.selected"); - private Color edgeSelectionColor = new GColor("color.graph.display.edge.selected"); - private Color defaultVertexColor = new GColor("color.graph.display.vertex"); - private Color defaultEdgeColor = new GColor("color.graph.display.edge"); + private Color vertexSelectionColor = new GColor("color.graphdisplay.vertex.selected"); + private Color edgeSelectionColor = new GColor("color.graphdisplay.edge.selected"); + private Color defaultVertexColor = new GColor("color.graphdisplay.vertex"); + private Color defaultEdgeColor = new GColor("color.graphdisplay.edge"); private String favoredEdgeType; private VertexShape defaultVertexShape = VertexShape.RECTANGLE; diff --git a/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestGraphViewer.java b/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestGraphViewer.java index f1db1e2d4f..2c9b0e8027 100644 --- a/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestGraphViewer.java +++ b/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestGraphViewer.java @@ -15,11 +15,11 @@ */ package ghidra.graph.support; -import java.awt.Color; import java.awt.Dimension; -import ghidra.graph.graphs.TestEdge; +import docking.theme.GThemeDefaults.Colors.Palette; import ghidra.graph.graphs.AbstractTestVertex; +import ghidra.graph.graphs.TestEdge; import ghidra.graph.viewer.GraphViewer; /** @@ -29,7 +29,7 @@ public class TestGraphViewer extends GraphViewer { public TestGraphViewer(TestGraphLayout layout, Dimension size) { super(layout, size); - setBackground(Color.WHITE); + setBackground(Palette.WHITE); } } diff --git a/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestVertexTooltipProvider.java b/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestVertexTooltipProvider.java index a48712666e..3ea1ef630a 100644 --- a/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestVertexTooltipProvider.java +++ b/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TestVertexTooltipProvider.java @@ -15,7 +15,6 @@ */ package ghidra.graph.support; -import java.awt.Color; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.util.*; @@ -26,6 +25,7 @@ import javax.swing.JComponent; import org.apache.commons.collections4.Factory; import org.apache.commons.collections4.map.LazyMap; +import docking.theme.GColor; import docking.widgets.label.GDHtmlLabel; import ghidra.graph.graphs.AbstractTestVertex; import ghidra.graph.graphs.TestEdge; @@ -110,7 +110,7 @@ public class TestVertexTooltipProvider SpyTooltipLabel(String text) { setText(text); setOpaque(true); - setBackground(Color.ORANGE.darker()); + setBackground(new GColor("color.palette.olive")); setPreferredSize(new Dimension(200, 100)); } diff --git a/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TextAreaTestVertex.java b/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TextAreaTestVertex.java index dbc736170e..80b988bd35 100644 --- a/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TextAreaTestVertex.java +++ b/Ghidra/Framework/Graph/src/test.slow/java/ghidra/graph/support/TextAreaTestVertex.java @@ -23,6 +23,8 @@ import java.beans.PropertyChangeListener; import javax.swing.*; import docking.GenericHeader; +import docking.theme.GColor; +import docking.theme.GThemeDefaults.Colors.Palette; import ghidra.graph.graphs.AbstractTestVertex; /** @@ -39,8 +41,8 @@ public class TextAreaTestVertex extends AbstractTestVertex { textArea.setText(name); textArea.setPreferredSize(new Dimension(200, 50)); - textArea.setBackground(Color.YELLOW.darker()); - textArea.setCaretColor(Color.PINK); + textArea.setBackground(new GColor("color.palette.darkkhaki")); + textArea.setCaretColor(Palette.PINK); textArea.setBorder(BorderFactory.createRaisedBevelBorder()); textArea.setLineWrap(true); diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java index 6a5f9e3447..df7a9cc716 100644 --- a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java +++ b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/AlgorithmTestSteppingVertex.java @@ -22,6 +22,8 @@ import java.awt.image.BufferedImage; import javax.swing.*; +import docking.theme.GColor; +import docking.theme.GThemeDefaults.Colors.Palette; import ghidra.graph.algo.GraphAlgorithmStatusListener.STATUS; import ghidra.graph.graphs.AbstractTestVertex; import ghidra.graph.viewer.vertex.VertexShapeProvider; @@ -87,10 +89,11 @@ public class AlgorithmTestSteppingVertex extends AbstractTestVertex private void buildShapes() { defaultShape = buildCircleShape(Color.LIGHT_GRAY, "default"); - defaultWithPathShape = buildCircleShape(new Color(192, 216, 65), "default; was in path"); - scheduledShape = buildCircleShape(new Color(255, 248, 169), "scheduled"); - exploringShape = buildCircleShape(new Color(0, 147, 0), "exploring"); - blockedShape = buildCircleShape(new Color(249, 190, 190), "blocked"); + defaultWithPathShape = + buildCircleShape(new GColor("color.palette.yellowgreen"), "default; was in path"); + scheduledShape = buildCircleShape(new GColor("color.palette.khaki"), "scheduled"); + exploringShape = buildCircleShape(Palette.GREEN, "exploring"); + blockedShape = buildCircleShape(Palette.PINK, "blocked"); currentShape = defaultShape; } diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/TestGraphAlgorithmSteppingViewerPanel.java b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/TestGraphAlgorithmSteppingViewerPanel.java index 6f490e53a0..a06843c94b 100644 --- a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/TestGraphAlgorithmSteppingViewerPanel.java +++ b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/algo/viewer/TestGraphAlgorithmSteppingViewerPanel.java @@ -25,6 +25,7 @@ import javax.swing.*; import org.apache.commons.collections4.BidiMap; import org.apache.commons.collections4.bidimap.DualHashBidiMap; +import docking.theme.GThemeDefaults.Colors.Palette; import edu.uci.ics.jung.visualization.decorators.EdgeShape; import edu.uci.ics.jung.visualization.renderers.Renderer; import generic.util.image.ImageUtils; @@ -86,7 +87,7 @@ public class TestGraphAlgorithmSteppingViewerPanel> extend BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g = (Graphics2D) image.getGraphics(); - g.setColor(Color.WHITE); + g.setColor(Palette.WHITE); g.fillRect(0, 0, w, h); try { diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/graphs/LabelTestVertex.java b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/graphs/LabelTestVertex.java index 1d0726fadf..bee6004c83 100644 --- a/Ghidra/Framework/Graph/src/test/java/ghidra/graph/graphs/LabelTestVertex.java +++ b/Ghidra/Framework/Graph/src/test/java/ghidra/graph/graphs/LabelTestVertex.java @@ -15,11 +15,11 @@ */ package ghidra.graph.graphs; -import java.awt.Color; import java.awt.Dimension; import javax.swing.*; +import docking.theme.GThemeDefaults.Colors.Palette; import docking.widgets.label.GDLabel; /** @@ -33,7 +33,7 @@ public class LabelTestVertex extends AbstractTestVertex { super(name); label.setText(name); label.setPreferredSize(new Dimension(50, 50)); - label.setBackground(Color.YELLOW.darker()); + label.setBackground(Palette.GOLD); label.setOpaque(true); label.setBorder(BorderFactory.createRaisedBevelBorder()); label.setHorizontalAlignment(SwingConstants.CENTER); diff --git a/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java b/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java index 320bc70600..5f4d48f6fc 100644 --- a/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java +++ b/Ghidra/Framework/Graph/src/test/java/ghidra/service/graph/GraphDisplayOptionsTest.java @@ -17,7 +17,6 @@ package ghidra.service.graph; import static org.junit.Assert.*; -import java.awt.Color; import java.util.Arrays; import java.util.List; @@ -25,6 +24,7 @@ import org.junit.Before; import org.junit.Test; import docking.FakeDockingTool; +import docking.theme.GThemeDefaults.Colors.Palette; import ghidra.framework.options.Options; import ghidra.framework.options.ToolOptions; import ghidra.util.HelpLocation; @@ -51,14 +51,14 @@ public class GraphDisplayOptionsTest { @Test public void testSetAndGetDefaultVertexColor() { - options.setDefaultVertexColor(Color.MAGENTA); - assertEquals(Color.MAGENTA, options.getDefaultVertexColor()); + options.setDefaultVertexColor(Palette.RED); + assertEquals(Palette.RED, options.getDefaultVertexColor()); } @Test public void testSetAndGetDefaultEdgeColor() { - options.setDefaultEdgeColor(Color.MAGENTA); - assertEquals(Color.MAGENTA, options.getDefaultEdgeColor()); + options.setDefaultEdgeColor(Palette.RED); + assertEquals(Palette.RED, options.getDefaultEdgeColor()); } @Test @@ -131,62 +131,62 @@ public class GraphDisplayOptionsTest { @Test public void testGetVertexColor() { - options.setVertexColor("V1", Color.RED); - options.setVertexColor("V2", Color.GREEN); + options.setVertexColor("V1", Palette.RED); + options.setVertexColor("V2", Palette.GREEN); AttributedVertex vertex = new AttributedVertex("Foo"); assertEquals(options.getDefaultVertexColor(), options.getVertexColor(vertex)); vertex.setVertexType("V1"); - assertEquals(Color.RED, options.getVertexColor(vertex)); + assertEquals(Palette.RED, options.getVertexColor(vertex)); vertex.setVertexType("V2"); - assertEquals(Color.GREEN, options.getVertexColor(vertex)); + assertEquals(Palette.GREEN, options.getVertexColor(vertex)); } @Test public void testGetVertexColorWithOverride() { - options.setVertexColor("V1", Color.RED); - options.setVertexColor("V2", Color.GREEN); + options.setVertexColor("V1", Palette.RED); + options.setVertexColor("V2", Palette.GREEN); options.setVertexColorOverrideAttributeKey("Color"); AttributedVertex vertex = new AttributedVertex("Foo"); vertex.setVertexType("V1"); - assertEquals(Color.RED, options.getVertexColor(vertex)); + assertEquals(Palette.RED, options.getVertexColor(vertex)); - vertex.setAttribute("Color", WebColors.toString(Color.BLUE)); + vertex.setAttribute("Color", WebColors.toString(Palette.BLUE)); - assertEquals(Color.BLUE, options.getVertexColor(vertex)); + assertEquals(Palette.BLUE, options.getVertexColor(vertex)); } @Test public void testGetEdgeColor() { - options.setEdgeColor("E1", Color.RED); - options.setEdgeColor("E2", Color.GREEN); + options.setEdgeColor("E1", Palette.RED); + options.setEdgeColor("E2", Palette.GREEN); AttributedEdge edge = new AttributedEdge("1"); assertEquals(options.getDefaultEdgeColor(), options.getEdgeColor(edge)); edge.setEdgeType("E1"); - assertEquals(Color.RED, options.getEdgeColor(edge)); + assertEquals(Palette.RED, options.getEdgeColor(edge)); edge.setEdgeType("E2"); - assertEquals(Color.GREEN, options.getEdgeColor(edge)); + assertEquals(Palette.GREEN, options.getEdgeColor(edge)); } @Test public void testGetEdgeColorWithOverride() { - options.setEdgeColor("E1", Color.RED); - options.setEdgeColor("E2", Color.GREEN); + options.setEdgeColor("E1", Palette.RED); + options.setEdgeColor("E2", Palette.GREEN); options.setEdgeColorOverrideAttributeKey("Color"); AttributedEdge edge = new AttributedEdge("1"); assertEquals(options.getDefaultEdgeColor(), options.getEdgeColor(edge)); edge.setEdgeType("E1"); - assertEquals(Color.RED, options.getEdgeColor(edge)); + assertEquals(Palette.RED, options.getEdgeColor(edge)); - edge.setAttribute("Color", WebColors.toString(Color.BLUE)); + edge.setAttribute("Color", WebColors.toString(Palette.BLUE)); - assertEquals(Color.BLUE, options.getEdgeColor(edge)); + assertEquals(Palette.BLUE, options.getEdgeColor(edge)); } @Test @@ -206,8 +206,8 @@ public class GraphDisplayOptionsTest { @Test public void testGetVertexColorForType() { assertEquals(options.getDefaultVertexColor(), options.getVertexColor("V1")); - options.setVertexColor("V1", Color.RED); - assertEquals(Color.RED, options.getVertexColor("V1")); + options.setVertexColor("V1", Palette.RED); + assertEquals(Palette.RED, options.getVertexColor("V1")); } @Test @@ -220,8 +220,8 @@ public class GraphDisplayOptionsTest { @Test public void testGetEdgeColorForType() { assertEquals(options.getDefaultEdgeColor(), options.getEdgeColor("V1")); - options.setEdgeColor("E1", Color.RED); - assertEquals(Color.RED, options.getEdgeColor("E1")); + options.setEdgeColor("E1", Palette.RED); + assertEquals(Palette.RED, options.getEdgeColor("E1")); } @Test @@ -237,7 +237,7 @@ public class GraphDisplayOptionsTest { List leafOptionNames = vertexColorOptions.getLeafOptionNames(); assertEquals(Arrays.asList("V1", "V2", "V3"), leafOptionNames); assertEquals(options.getDefaultVertexColor(), - vertexColorOptions.getColor("V1", Color.WHITE)); + vertexColorOptions.getColor("V1", Palette.WHITE)); Options vertexShapeOptions = graphDisplayOptions.getOptions("Vertex Shapes"); leafOptionNames = vertexShapeOptions.getLeafOptionNames(); @@ -249,7 +249,7 @@ public class GraphDisplayOptionsTest { leafOptionNames = edgeColorOptions.getLeafOptionNames(); assertEquals(Arrays.asList("E1", "E2", "E3"), leafOptionNames); assertEquals(options.getDefaultEdgeColor(), - edgeColorOptions.getColor("E1", Color.WHITE)); + edgeColorOptions.getColor("E1", Palette.WHITE)); Options miscellaneousOptions = graphDisplayOptions.getOptions("Miscellaneous"); leafOptionNames = miscellaneousOptions.getLeafOptionNames(); @@ -269,13 +269,13 @@ public class GraphDisplayOptionsTest { AttributedVertex vertex = new AttributedVertex("Foo"); vertex.setVertexType("V1"); - assertEquals(Color.BLUE, options.getVertexColor(vertex)); + assertEquals(Palette.BLUE, options.getVertexColor(vertex)); Options graphDisplayOptions = toolOptions.getOptions(options.getRootOptionsName()); Options vertexColorOptions = graphDisplayOptions.getOptions("Vertex Colors"); - vertexColorOptions.setColor("V1", Color.CYAN); + vertexColorOptions.setColor("V1", Palette.CYAN); - assertEquals(Color.CYAN, options.getVertexColor(vertex)); + assertEquals(Palette.CYAN, options.getVertexColor(vertex)); } }