diff --git a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java index d6e08558d4..2e40b08456 100644 --- a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java +++ b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java @@ -1216,7 +1216,7 @@ public class DefaultGraphDisplay implements GraphDisplay { @Override public void addAction(DockingAction action) { - componentProvider.addLocalAction(action); + Swing.runLater(() -> componentProvider.addLocalAction(action)); } @Override @@ -1286,4 +1286,19 @@ public class DefaultGraphDisplay implements GraphDisplay { public AttributedGraph getGraph() { return graph; } + + /** + * Removes all externally added actions. This is called before re-using the graph window for a + * new graph which may add its own set of actions for that particular graph. + */ + void restoreToDefaultSetOfActions() { + Swing.runLater(() -> { + // remove all actions + componentProvider.removeAllLocalActions(); + // put the standard graph actions back + createToolbarActions(); + createPopupActions(); + }); + } + } diff --git a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayComponentProvider.java b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayComponentProvider.java index cdbd9d5b53..5faaaf9765 100644 --- a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayComponentProvider.java +++ b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayComponentProvider.java @@ -69,4 +69,10 @@ public class DefaultGraphDisplayComponentProvider extends ComponentProviderAdapt public ActionContext getActionContext(MouseEvent event) { return display.getActionContext(event); } + + // overridden to make it accessible + @Override + public void removeAllLocalActions() { + super.removeAllLocalActions(); + } } diff --git a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayProvider.java b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayProvider.java index 2c936323e7..aa4be85a83 100644 --- a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayProvider.java +++ b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplayProvider.java @@ -51,7 +51,9 @@ public class DefaultGraphDisplayProvider implements GraphDisplayProvider { TaskMonitor monitor) { if (reuseGraph && !displays.isEmpty()) { - return getVisibleGraph(); + DefaultGraphDisplay visibleGraph = getVisibleGraph(); + visibleGraph.restoreToDefaultSetOfActions(); + return visibleGraph; } DefaultGraphDisplay display = @@ -73,9 +75,11 @@ public class DefaultGraphDisplayProvider implements GraphDisplayProvider { * return one from the Set via its iterator * @return a display that is showing */ - private GraphDisplay getVisibleGraph() { - return displays.stream().filter(d -> d.getComponent().isShowing()) - .findAny().orElse(displays.iterator().next()); + private DefaultGraphDisplay getVisibleGraph() { + return displays.stream() + .filter(d -> d.getComponent().isShowing()) + .findAny() + .orElse(displays.iterator().next()); } @Override @@ -100,4 +104,5 @@ public class DefaultGraphDisplayProvider implements GraphDisplayProvider { public void remove(DefaultGraphDisplay defaultGraphDisplay) { displays.remove(defaultGraphDisplay); } + } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java index 2e546433b2..b45a616933 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java @@ -267,7 +267,7 @@ public abstract class ComponentProvider implements HelpDescriptor, ActionContext } /** - * Removes the given action from the system. + * Removes the given action from this component provider. * @param action The action to remove. */ protected void removeLocalAction(DockingAction action) { @@ -277,6 +277,16 @@ public abstract class ComponentProvider implements HelpDescriptor, ActionContext } } + /** + * Removes all local actions from this component provider + */ + protected void removeAllLocalActions() { + if (isInTool()) { + actionSet.forEach(action -> dockingTool.removeLocalAction(this, action)); + } + actionSet.clear(); + } + /** * Convenience method to show or hide this provider. * @param visible True shows the provider; false hides the provider