GP-6254 - Fixed NPE in function graph middle-mouse highlighter

This commit is contained in:
dragonmacher
2025-12-18 15:49:13 -05:00
parent 9a8e95e193
commit 0e5095ad9f
3 changed files with 33 additions and 8 deletions

View File

@@ -207,13 +207,17 @@ public class ListingMiddleMouseHighlightProvider
currentHighlightString = highlightString; currentHighlightString = highlightString;
repaint();
}
protected void repaint() {
repaintComponent.repaint(); repaintComponent.repaint();
} }
private void clearHighlight() { private void clearHighlight() {
currentHighlightString = null; currentHighlightString = null;
currentHighlightPattern = null; currentHighlightPattern = null;
repaintComponent.repaint(); repaint();
} }
private Pattern createRegisterPattern(Register register, String... highlightStrings) { private Pattern createRegisterPattern(Register register, String... highlightStrings) {

View File

@@ -21,6 +21,7 @@ import java.awt.geom.Point2D;
import java.util.*; import java.util.*;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Supplier;
import javax.swing.JComponent; import javax.swing.JComponent;
@@ -196,9 +197,10 @@ public class FGController implements ProgramLocationListener, ProgramSelectionLi
return sharedHighlightProvider; return sharedHighlightProvider;
} }
JComponent centerOverComponent = view.getPrimaryGraphViewer(); // At the time of construction, the view has not yet built the graph viewer. We will use a
sharedHighlightProvider = // supplier to access the viewer on demand. It should be valid at that point.
new FgHighlightProvider(env.getTool(), centerOverComponent); Supplier<Component> repaintSupplier = () -> view.getPrimaryGraphViewer();
sharedHighlightProvider = new FgHighlightProvider(env.getTool(), repaintSupplier);
return sharedHighlightProvider; return sharedHighlightProvider;
} }
@@ -1157,10 +1159,10 @@ public class FGController implements ProgramLocationListener, ProgramSelectionLi
private static class FgHighlightProvider private static class FgHighlightProvider
implements ListingHighlightProvider, ButtonPressedListener { implements ListingHighlightProvider, ButtonPressedListener {
private ListingMiddleMouseHighlightProvider highlighter; private FgMiddleMouseHighlightProvider highlighter;
FgHighlightProvider(PluginTool tool, Component repaintComponent) { FgHighlightProvider(PluginTool tool, Supplier<Component> repaintSupplier) {
highlighter = new ListingMiddleMouseHighlightProvider(tool, repaintComponent); highlighter = new FgMiddleMouseHighlightProvider(tool, repaintSupplier);
} }
@Override @Override
@@ -1173,5 +1175,24 @@ public class FGController implements ProgramLocationListener, ProgramSelectionLi
ListingField field, MouseEvent event) { ListingField field, MouseEvent event) {
highlighter.buttonPressed(location, fieldLocation, field, event); highlighter.buttonPressed(location, fieldLocation, field, event);
} }
private class FgMiddleMouseHighlightProvider extends ListingMiddleMouseHighlightProvider {
private Supplier<Component> repaintSupplier;
public FgMiddleMouseHighlightProvider(PluginTool tool,
Supplier<Component> repaintSupplier) {
super(tool, null);
this.repaintSupplier = repaintSupplier;
}
@Override
protected void repaint() {
Component c = repaintSupplier.get();
if (c != null) {
c.repaint();
}
}
}
} }
} }

View File

@@ -216,7 +216,7 @@
<H2> Formatting </H2> <H2> Formatting </H2>
<P> Most of these are handled by the Eclipse formatter and are here to document the Ghidra <P> Most of these are handled by the Eclipse formatter and are here to document the Ghidra
formatting style. The Eclipse formatter can be found in the <I><B>support/eclipse/</B></I> formatting style. The Eclipse formatter can be found in the <I><B>support/eclipse/</B></I>
directory of a Ghidra release, or in the <I><B>eclipse/</B><I> directory of the Ghidra directory of a Ghidra release, or in the <I><B>eclipse/</B></I> directory of the Ghidra
source repository. source repository.
<H3> Line Length </H3> <H3> Line Length </H3>
<H4> Java code will have a character limit of 100 characters per line. </H4> <H4> Java code will have a character limit of 100 characters per line. </H4>