GP-1981 - Graph Theme Updates

This commit is contained in:
dragonmacher 2022-07-14 18:49:45 -04:00 committed by ghidragon
parent 50de9eb7b3
commit ae02a34d8b
47 changed files with 462 additions and 341 deletions

View file

@ -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<FGVertex, FGEdge, FunctionGraph>
@Override
protected FGPrimaryViewer createPrimaryGraphViewer(VisualGraphLayout<FGVertex, FGEdge> layout,
Dimension viewerSize) {
return new FGPrimaryViewer(this, layout, viewerSize);
}
FGPrimaryViewer viewer = new FGPrimaryViewer(this, layout, viewerSize);
@Override
protected void decoratePrimaryViewer(GraphViewer<FGVertex, FGEdge> viewer,
VisualGraphLayout<FGVertex, FGEdge> layout) {
RenderContext<FGVertex, FGEdge> 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<FGVertex, FGEdge> renderer = viewer.getRenderer();
renderer.setVertexRenderer(new FGVertexRenderer());
RenderContext<FGVertex, FGEdge> renderContext = viewer.getRenderContext();
// for background colors when we are zoomed to far to render the listing
PickedState<FGVertex> 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<FGEdge, String> edgeLabelTransformer = e -> e.getLabel();
@ -240,31 +242,29 @@ public class FGComponent extends GraphComponent<FGVertex, FGEdge, FunctionGraph>
}
}
return viewer;
}
@Override
protected SatelliteGraphViewer<FGVertex, FGEdge> createSatelliteGraphViewer(
GraphViewer<FGVertex, FGEdge> masterViewer, Dimension viewerSize) {
protected void decorateSatelliteViewer(SatelliteGraphViewer<FGVertex, FGEdge> viewer,
VisualGraphLayout<FGVertex, FGEdge> layout) {
SatelliteGraphViewer<FGVertex, FGEdge> viewer =
super.createSatelliteGraphViewer(masterViewer, viewerSize);
super.decorateSatelliteViewer(viewer, layout);
RenderContext<FGVertex, FGEdge> renderContext = viewer.getRenderContext();
// the edge renderer was set by the parent call; get the renderer to add our painter
Renderer<FGVertex, FGEdge> renderer = viewer.getRenderer();
FGEdgePaintTransformer edgePaintTransformer =
new FGEdgePaintTransformer(getFucntionGraphOptions());
renderContext.setEdgeDrawPaintTransformer(edgePaintTransformer);
renderContext.setArrowDrawPaintTransformer(edgePaintTransformer);
renderContext.setArrowFillPaintTransformer(edgePaintTransformer);
AbstractVisualVertexRenderer<FGVertex, FGEdge> vertexRenderer =
(AbstractVisualVertexRenderer<FGVertex, FGEdge>) renderer.getVertexRenderer();
PickedState<FGVertex> pickedVertexState = viewer.getPickedVertexState();
RenderContext<FGVertex, FGEdge> 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<FGVertex, FGEdge, FunctionGraph>
// FG-specific Client Methods
//==================================================================================================
public FunctionGraphOptions getFucntionGraphOptions() {
public FunctionGraphOptions getFunctionGraphOptions() {
return (FunctionGraphOptions) vgOptions;
}

View file

@ -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<FGEdge, Paint> {
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;
}
}

View file

@ -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<FGVertex, FGEdge> {
@Override
public Color getBaseColor(Graph<FGVertex, FGEdge> g, FGEdge e) {
public Color getDrawColor(Graph<FGVertex, FGEdge> g, FGEdge e) {
FunctionGraphOptions options = getOptions(g);
FlowType flowType = e.getFlowType();
Color color = options.getColor(flowType);
return color;
}
@Override
public Color getFocusedColor(Graph<FGVertex, FGEdge> g, FGEdge e) {
FunctionGraphOptions options = getOptions(g);
return options.getColor(e.getFlowType());
}
@Override
public Color getHighlightColor(Graph<FGVertex, FGEdge> g, FGEdge e) {
public Color getSelectedColor(Graph<FGVertex, FGEdge> g, FGEdge e) {
FunctionGraphOptions options = getOptions(g);
return options.getHighlightColor(e.getFlowType());
}

View file

@ -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');