diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/context/NavigatableContextAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/context/NavigatableContextAction.java index 1334810ad1..a387b96294 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/context/NavigatableContextAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/context/NavigatableContextAction.java @@ -17,9 +17,11 @@ package ghidra.app.context; import java.util.Set; -import docking.ActionContext; +import docking.*; import docking.action.DockingAction; import docking.action.KeyBindingType; +import ghidra.app.nav.Navigatable; +import ghidra.app.services.GoToService; public abstract class NavigatableContextAction extends DockingAction { @@ -33,23 +35,61 @@ public abstract class NavigatableContextAction extends DockingAction { @Override public boolean isEnabledForContext(ActionContext context) { - if (!(context instanceof NavigatableActionContext)) { + NavigatableActionContext appropriateContext = getAppropriateContext(context); + if (appropriateContext == null) { return false; } - return isEnabledForContext((NavigatableActionContext) context); + return isEnabledForContext(appropriateContext); } @Override public void actionPerformed(ActionContext context) { - actionPerformed((NavigatableActionContext) context); + actionPerformed(getAppropriateContext(context)); + } + + private NavigatableActionContext getAppropriateContext(ActionContext context) { + if (context instanceof NavigatableActionContext && + isValidNavigationContext((NavigatableActionContext) context)) { + return (NavigatableActionContext) context; + } + return getGlobalNavigationContext(context); } @Override - public boolean isValidContext(ActionContext context) { - if (!(context instanceof NavigatableActionContext)) { - return false; + public final boolean isValidContext(ActionContext context) { + return true; + } + + protected boolean isValidNavigationContext(NavigatableActionContext context) { + return true; + } + + private NavigatableActionContext getGlobalNavigationContext(ActionContext context) { + DockingTool tool = getTool(context.getComponentProvider()); + + if (tool == null) { + return null; } - return isValidContext((NavigatableActionContext) context); + GoToService service = tool.getService(GoToService.class); + if (service == null) { + return null; + } + Navigatable defaultNavigatable = service.getDefaultNavigatable(); + if (defaultNavigatable.getProgram() == null) { + return null; + } + return new NavigatableActionContext(null, defaultNavigatable); + } + + private DockingTool getTool(ComponentProvider provider) { + if (provider != null) { + return provider.getTool(); + } + DockingWindowManager manager = DockingWindowManager.getActiveInstance(); + if (manager != null) { + return manager.getTool(); + } + return null; } @Override @@ -60,10 +100,6 @@ public abstract class NavigatableContextAction extends DockingAction { return isAddToPopup((NavigatableActionContext) context); } - protected boolean isValidContext(NavigatableActionContext context) { - return true; - } - protected boolean isEnabledForContext(NavigatableActionContext context) { return true; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/nav/NextRangeAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/nav/NextRangeAction.java index 1badc379bd..5297cd23c4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/nav/NextRangeAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/nav/NextRangeAction.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +15,8 @@ */ package ghidra.app.nav; +import java.util.Set; + import ghidra.app.context.*; import ghidra.app.plugin.core.navigation.NavigationOptions; import ghidra.app.services.GoToService; @@ -24,8 +25,6 @@ import ghidra.program.model.address.*; import ghidra.program.model.listing.CodeUnit; import ghidra.program.util.ProgramSelection; -import java.util.Set; - public abstract class NextRangeAction extends NavigatableContextAction { private PluginTool tool; @@ -39,7 +38,7 @@ public abstract class NextRangeAction extends NavigatableContextAction { } @Override - protected boolean isValidContext(NavigatableActionContext context) { + protected boolean isValidNavigationContext(NavigatableActionContext context) { // // We want the nav actions to work in the current view that supports this, which right // now is the ListingActionContext. If the current context does not support that, then @@ -51,13 +50,12 @@ public abstract class NextRangeAction extends NavigatableContextAction { @Override public boolean isEnabledForContext(NavigatableActionContext context) { Address currentAddress = context.getAddress(); - ListingActionContext listingContext = (ListingActionContext) context; - ProgramSelection selection = getSelection(listingContext); + ProgramSelection selection = getSelection(context); if (selection == null || selection.isEmpty() || currentAddress == null) { return false; } - CodeUnit cu = listingContext.getProgram().getListing().getCodeUnitAt(currentAddress); + CodeUnit cu = context.getProgram().getListing().getCodeUnitAt(currentAddress); if (cu != null) { currentAddress = cu.getMaxAddress(); } @@ -71,13 +69,10 @@ public abstract class NextRangeAction extends NavigatableContextAction { @Override public void actionPerformed(NavigatableActionContext context) { - // Note: we verified above that the context we are grabbing here is the correct type - ListingActionContext listingContext = (ListingActionContext) context; - - Address goToAddress = getGoToAddress(listingContext); + Address goToAddress = getGoToAddress(context); GoToService service = tool.getService(GoToService.class); if (service != null) { - service.goTo(listingContext.getNavigatable(), goToAddress); + service.goTo(context.getNavigatable(), goToAddress); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/nav/PreviousRangeAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/nav/PreviousRangeAction.java index d0295ae817..e5b04096d2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/nav/PreviousRangeAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/nav/PreviousRangeAction.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +15,8 @@ */ package ghidra.app.nav; +import java.util.Set; + import ghidra.app.context.*; import ghidra.app.plugin.core.navigation.NavigationOptions; import ghidra.app.services.GoToService; @@ -23,8 +24,6 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.address.*; import ghidra.program.util.ProgramSelection; -import java.util.Set; - public abstract class PreviousRangeAction extends NavigatableContextAction { private PluginTool tool; @@ -39,7 +38,7 @@ public abstract class PreviousRangeAction extends NavigatableContextAction { } @Override - protected boolean isValidContext(NavigatableActionContext context) { + protected boolean isValidNavigationContext(NavigatableActionContext context) { // // We want the nav actions to work in the current view that supports this, which right // now is the ListingActionContext. If the current context does not support that, then @@ -58,9 +57,8 @@ public abstract class PreviousRangeAction extends NavigatableContextAction { } private Address getGoToAddress(NavigatableActionContext context) { - ListingActionContext listingContext = (ListingActionContext) context; - ProgramSelection selection = getSelection(listingContext); - Address currentAddress = listingContext.getAddress(); + ProgramSelection selection = getSelection(context); + Address currentAddress = context.getAddress(); AddressRangeIterator it = selection.getAddressRanges(currentAddress, false); if (!it.hasNext()) { @@ -94,8 +92,7 @@ public abstract class PreviousRangeAction extends NavigatableContextAction { @Override public boolean isEnabledForContext(NavigatableActionContext context) { Address currentAddress = context.getAddress(); - ListingActionContext listingContext = (ListingActionContext) context; - ProgramSelection selection = getSelection(listingContext); + ProgramSelection selection = getSelection(context); if (selection == null || selection.isEmpty() || currentAddress == null) { return false; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearPlugin.java index 81235b8507..c9e3371ee0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearPlugin.java @@ -26,7 +26,7 @@ import ghidra.app.context.ListingContextAction; import ghidra.app.plugin.PluginCategoryNames; import ghidra.framework.cmd.Command; import ghidra.framework.plugintool.*; -import ghidra.framework.plugintool.util.*; +import ghidra.framework.plugintool.util.PluginStatus; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressSet; import ghidra.program.model.data.*; @@ -264,12 +264,6 @@ public class ClearPlugin extends Plugin { } return false; } - - @Override - public boolean isValidGlobalContext(ActionContext context) { - // it's too dangerous to let the clear action work globally - return false; - } }; int menuOrdinal = 1; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsPlugin.java index 447a7ac2d6..0aa565b108 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsPlugin.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.core.comments; import java.awt.event.KeyEvent; -import docking.ActionContext; import docking.action.*; import ghidra.app.CorePluginPackage; import ghidra.app.cmd.comments.SetCommentCmd; @@ -187,11 +186,6 @@ public class CommentsPlugin extends Plugin implements OptionsChangeListener { getPopupMenuData().setMenuPath(new String[] { "Comments", "Delete" }); return false; } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } }; deleteAction.setPopupMenuData(new MenuData(DELETE_MENUPATH, null, "comments")); deleteAction.setKeyBindingData(new KeyBindingData(KeyEvent.VK_DELETE, 0)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquatePlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquatePlugin.java index b861620245..3787fa1ec1 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquatePlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquatePlugin.java @@ -19,7 +19,6 @@ import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; -import docking.ActionContext; import docking.action.*; import docking.widgets.OptionDialog; import ghidra.app.CorePluginPackage; @@ -374,8 +373,8 @@ public class EquatePlugin extends Plugin { Program program = context.getProgram(); List opIndices = getInstructionMatches(program, inst, equate); Address addr = inst.getAddress(); - for (int i = 0; i < opIndices.size(); i++) { - bgCmd.add(createRenameCmd(oldName, newName, addr, opIndices.get(i))); + for (Integer opIndice : opIndices) { + bgCmd.add(createRenameCmd(oldName, newName, addr, opIndice)); } } else if (cu instanceof Data) { @@ -429,9 +428,9 @@ public class EquatePlugin extends Plugin { Program program = context.getProgram(); List opIndexes = getInstructionMatches(program, instr, equate); - for (int i = 0; i < opIndexes.size(); i++) { + for (Integer opIndexe : opIndexes) { bckCmd.add( - new ClearEquateCmd(equate.getName(), instr.getAddress(), opIndexes.get(i))); + new ClearEquateCmd(equate.getName(), instr.getAddress(), opIndexe)); } } else if (cu instanceof Data) { @@ -728,12 +727,6 @@ public class EquatePlugin extends Plugin { protected boolean isEnabledForContext(ListingActionContext context) { return getEquate(context) != null; } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } - }; removeAction.setPopupMenuData(new MenuData(REMOVE_MENUPATH, null, GROUP_NAME)); removeAction.setKeyBindingData(new KeyBindingData(KeyEvent.VK_DELETE, 0)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/DeleteFunctionAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/DeleteFunctionAction.java index 3ff943b536..af7baf7401 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/DeleteFunctionAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/DeleteFunctionAction.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.core.function; import java.awt.event.KeyEvent; -import docking.ActionContext; import docking.action.KeyBindingData; import docking.action.MenuData; import ghidra.app.cmd.function.DeleteFunctionCmd; @@ -71,9 +70,4 @@ class DeleteFunctionAction extends ListingContextAction { return false; } - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } - } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/RemoveStackDepthChangeAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/RemoveStackDepthChangeAction.java index eae8ea827f..8fa5c54353 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/RemoveStackDepthChangeAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/RemoveStackDepthChangeAction.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.core.function; import java.awt.event.KeyEvent; -import docking.ActionContext; import docking.action.KeyBindingData; import docking.action.MenuData; import ghidra.app.cmd.function.CallDepthChangeInfo; @@ -73,9 +72,4 @@ class RemoveStackDepthChangeAction extends ListingContextAction { context.getAddress()) != null; } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableCommentDeleteAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableCommentDeleteAction.java index 0d554828df..14df6a6a28 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableCommentDeleteAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableCommentDeleteAction.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.core.function; import java.awt.event.KeyEvent; -import docking.ActionContext; import docking.action.KeyBindingData; import docking.action.KeyBindingType; import ghidra.app.cmd.function.SetVariableCommentCmd; @@ -89,8 +88,4 @@ class VariableCommentDeleteAction extends ListingContextAction { return (loc instanceof VariableCommentFieldLocation); } - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableDeleteAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableDeleteAction.java index 71d90f9396..fe71f670c9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableDeleteAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/VariableDeleteAction.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.core.function; import java.awt.event.KeyEvent; -import docking.ActionContext; import docking.action.KeyBindingData; import docking.action.MenuData; import ghidra.app.cmd.function.DeleteVariableCmd; @@ -105,9 +104,4 @@ class VariableDeleteAction extends ListingContextAction { } return null; } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java index 82ab820d43..691f890f36 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/gotoquery/GoToServicePlugin.java @@ -60,7 +60,7 @@ public final class GoToServicePlugin extends ProgramPlugin { * Creates a new instance of the GoToServicePlugin */ public GoToServicePlugin(PluginTool plugintool) { - super(plugintool, true, false); + super(plugintool, true, true); gotoService = new GoToServiceImpl(this, new DefaultNavigatable()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java index 073ae5fea6..7557b2636e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchPlugin.java @@ -245,7 +245,7 @@ public class InstructionSearchPlugin extends ProgramPlugin { } @Override - protected boolean isValidContext(NavigatableActionContext context) { + protected boolean isValidNavigationContext(NavigatableActionContext context) { return !(context instanceof RestrictedAddressSetContext); } }; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/RemoveLabelAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/RemoveLabelAction.java index 7ff668024f..c4ac18f512 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/RemoveLabelAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/RemoveLabelAction.java @@ -19,7 +19,6 @@ import java.awt.event.KeyEvent; import javax.swing.KeyStroke; -import docking.ActionContext; import docking.action.*; import ghidra.app.context.ListingActionContext; import ghidra.app.context.ListingContextAction; @@ -66,11 +65,6 @@ class RemoveLabelAction extends ListingContextAction { return !plugin.isOnExternalReference(context) && isOnSymbol(context); } - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } - boolean isOnSymbol(ListingActionContext context) { Symbol s = plugin.getSymbol(context); return ((s instanceof CodeSymbol) && !s.isDynamic()) || diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/NextPrevAddressPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/NextPrevAddressPlugin.java index 01980005d5..6fef5ce938 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/NextPrevAddressPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/navigation/NextPrevAddressPlugin.java @@ -316,16 +316,6 @@ public class NextPrevAddressPlugin extends Plugin { setDescription(isNext ? "Go to next location" : "Go to previous location"); } - @Override - public boolean isValidContext(ActionContext context) { - return false; - } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return (globalContext instanceof NavigatableActionContext); - } - @Override public boolean isEnabledForContext(ActionContext context) { Navigatable navigatable = getNavigatable(context); @@ -426,16 +416,6 @@ public class NextPrevAddressPlugin extends Plugin { setMenuBarData(menuData); } - @Override - public boolean isValidContext(ActionContext context) { - return false; - } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return (globalContext instanceof NavigatableActionContext); - } - @Override public boolean isEnabledForContext(ActionContext context) { Navigatable navigatable = getNavigatable(context); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/DeleteReferencesAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/DeleteReferencesAction.java index 3cfc5913bc..226bd34d00 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/DeleteReferencesAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/DeleteReferencesAction.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.core.references; import java.awt.event.KeyEvent; -import docking.ActionContext; import docking.action.KeyBindingData; import docking.action.MenuData; import ghidra.app.cmd.refs.RemoveAllReferencesCmd; @@ -116,10 +115,4 @@ public class DeleteReferencesAction extends ListingContextAction { } return actionOK; } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } - } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/RegisterPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/RegisterPlugin.java index 495d71ccaf..5a3385776d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/RegisterPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/RegisterPlugin.java @@ -167,11 +167,6 @@ public class RegisterPlugin extends ProgramPlugin { } return false; } - - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - return false; // only work on active provider context. - } }; deleteRegisterRangeAction.setKeyBindingData(new KeyBindingData(KeyEvent.VK_DELETE, 0)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchPlugin.java index 31c0f86fae..5927f65187 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchPlugin.java @@ -145,7 +145,7 @@ public class ScalarSearchPlugin extends ProgramPlugin implements DomainObjectLis } @Override - protected boolean isValidContext(NavigatableActionContext context) { + protected boolean isValidNavigationContext(NavigatableActionContext context) { return !(context instanceof RestrictedAddressSetContext); } }; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchPlugin.java index 9af5bdc03a..0edd603493 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchPlugin.java @@ -350,7 +350,7 @@ public class MemSearchPlugin extends Plugin implements OptionsChangeListener, } @Override - protected boolean isValidContext(NavigatableActionContext context) { + protected boolean isValidNavigationContext(NavigatableActionContext context) { return !(context instanceof RestrictedAddressSetContext); } }; @@ -374,7 +374,7 @@ public class MemSearchPlugin extends Plugin implements OptionsChangeListener, } @Override - protected boolean isValidContext(NavigatableActionContext context) { + protected boolean isValidNavigationContext(NavigatableActionContext context) { return !(context instanceof RestrictedAddressSetContext); } }; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java b/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java index d9c2be767e..eced0a54d9 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java @@ -209,11 +209,6 @@ public abstract class AbstractDockingTool implements DockingTool { winMgr.contextChanged(provider); } - @Override - public ActionContext getGlobalContext() { - return winMgr.getGlobalContext(); - } - @Override public void addContextListener(DockingContextListener listener) { winMgr.addContextListener(listener); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingActionProxy.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingActionProxy.java index 8ff8c19c58..fb12bfc3cf 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingActionProxy.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingActionProxy.java @@ -117,11 +117,6 @@ public class DockingActionProxy return dockingAction.isValidContext(context); } - @Override - public boolean isValidGlobalContext(ActionContext context) { - return dockingAction.isValidGlobalContext(context); - } - @Override public void removePropertyChangeListener(PropertyChangeListener listener) { propertyListeners.remove(listener); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingTool.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingTool.java index eb79345a45..cd00144f26 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingTool.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingTool.java @@ -24,12 +24,13 @@ import docking.action.DockingActionIf; import docking.actions.DockingToolActions; import docking.actions.PopupActionProvider; import ghidra.framework.options.ToolOptions; +import ghidra.framework.plugintool.ServiceProvider; /** * Generic tool interface for managing {@link ComponentProvider}s and * {@link DockingActionIf actions} */ -public interface DockingTool { +public interface DockingTool extends ServiceProvider { /** * Returns a combination of the tool name and the instance name of the form @@ -247,15 +248,6 @@ public interface DockingTool { */ public void contextChanged(ComponentProvider provider); - /** - * Returns this tool's notion of the current action context, which is based upon the active - * {@link ComponentProvider}. If there is not active provider, then a generic context will - * be returned. - * - * @return the context - */ - public ActionContext getGlobalContext(); - /** * Adds the given context listener to this tool * @param listener the listener to add diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java index b4c9aca2f6..639404a7dd 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java @@ -353,23 +353,6 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder defaultProvider = provider; } - /** - * Returns this tool's notion of the current action context, which is based upon the active - * {@link ComponentProvider}. If there is not active provider, then a generic context will - * be returned. - * - * @return the context - */ - public ActionContext getGlobalContext() { - if (defaultProvider != null) { - ActionContext actionContext = defaultProvider.getActionContext(null); - if (actionContext != null) { - return actionContext; - } - } - return new ActionContext(); - } - /** * Get the window which contains the specified Provider's component. * @param provider component provider diff --git a/Ghidra/Framework/Docking/src/main/java/docking/MenuBarMenuHandler.java b/Ghidra/Framework/Docking/src/main/java/docking/MenuBarMenuHandler.java index 8366eb08bd..ec01f01d32 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/MenuBarMenuHandler.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/MenuBarMenuHandler.java @@ -47,36 +47,20 @@ public class MenuBarMenuHandler extends MenuHandler { DockingWindowManager.clearMouseOverHelp(); ComponentProvider provider = windowManager.getActiveComponentProvider(); - ActionContext context = provider == null ? null : provider.getActionContext(null); - ActionContext localContext = context == null ? new ActionContext() : context; - ActionContext globalContext = windowManager.getGlobalContext(); + ActionContext providerContext = provider == null ? null : provider.getActionContext(null); + ActionContext context = providerContext == null ? new ActionContext() : providerContext; - ActionContext tempContext = null; - if (action.isValidContext(localContext)) { - tempContext = localContext; // we prefer the local over the global context if valid - } - else if (action.isValidGlobalContext(globalContext)) { - tempContext = globalContext; - } - else { - return; // context is not valid, nothing to do - } - - tempContext.setSourceObject(event.getSource()); - final ActionContext finalContext = tempContext; + context.setSourceObject(event.getSource()); // this gives the UI some time to repaint before executing the action - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - windowManager.setStatusText(""); - if (action.isEnabledForContext(finalContext)) { - if (action instanceof ToggleDockingActionIf) { - ToggleDockingActionIf toggleAction = ((ToggleDockingActionIf) action); - toggleAction.setSelected(!toggleAction.isSelected()); - } - action.actionPerformed(finalContext); + SwingUtilities.invokeLater(() -> { + windowManager.setStatusText(""); + if (action.isValidContext(context) && action.isEnabledForContext(context)) { + if (action instanceof ToggleDockingActionIf) { + ToggleDockingActionIf toggleAction = ((ToggleDockingActionIf) action); + toggleAction.setSelected(!toggleAction.isSelected()); } + action.actionPerformed(context); } }); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/WindowActionManager.java b/Ghidra/Framework/Docking/src/main/java/docking/WindowActionManager.java index fb8066396f..e55b14a373 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/WindowActionManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/WindowActionManager.java @@ -121,7 +121,6 @@ public class WindowActionManager { ComponentProvider provider = placeHolderForScheduledActionUpdate == null ? null : placeHolderForScheduledActionUpdate.getProvider(); ActionContext localContext = provider == null ? null : provider.getActionContext(null); - ActionContext globalContext = winMgr.getGlobalContext(); if (localContext == null) { localContext = new ActionContext(); } @@ -132,9 +131,6 @@ public class WindowActionManager { if (action.isValidContext(localContext)) { action.setEnabled(action.isEnabledForContext(localContext)); } - else if (action.isValidGlobalContext(globalContext)) { - action.setEnabled(action.isEnabledForContext(globalContext)); - } else { action.setEnabled(false); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java index 0ae34ddc1b..5b112ebc3f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingAction.java @@ -76,7 +76,6 @@ public abstract class DockingAction implements DockingActionIf { private Predicate enabledPredicate; private Predicate popupPredicate; private Predicate validContextPredicate; - private Predicate validGlobalContextPredicate; public DockingAction(String name, String owner) { this.name = name; @@ -184,14 +183,6 @@ public abstract class DockingAction implements DockingActionIf { return true; } - @Override - public boolean isValidGlobalContext(ActionContext globalContext) { - if (validGlobalContextPredicate != null) { - return validGlobalContextPredicate.test(globalContext); - } - return isValidContext(globalContext); - } - /** * Default behavior is to add to main window; */ @@ -572,17 +563,6 @@ public abstract class DockingAction implements DockingActionIf { validContextPredicate = predicate; } - /** - * Sets a predicate for dynamically determining if this action is valid for the current global - * {@link ActionContext}. See {@link DockingActionIf#isValidGlobalContext(ActionContext)} - * - * @param predicate the predicate that will be used to dynamically determine an action's - * validity for a given global {@link ActionContext} - */ - public void validGlobalContextWhen(Predicate predicate) { - validGlobalContextPredicate = predicate; - } - //================================================================================================== // Non-public methods //================================================================================================== diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java index bc86fcdf8a..80d92e768c 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java @@ -193,19 +193,6 @@ public interface DockingActionIf extends HelpDescriptor { */ public boolean isValidContext(ActionContext context); - /** - * Method that actions implement to indicate if this action is valid (knows how to work with, is - * appropriate for) for the given global context. This method is just like the isValidContext - * and in fact calls that method by default. Many actions will work with either the active - * provider context or the global (the main listing) context if the local context is not valid. - * If you want a global action to only work on the global context, then override this method - * and return false. - * - * @param globalContext the global {@link ActionContext} from the active provider. - * @return true if this action is appropriate for the given context. - */ - public boolean isValidGlobalContext(ActionContext globalContext); - /** * Method used to determine if this action should be enabled for the given context. *

diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/MultipleKeyAction.java b/Ghidra/Framework/Docking/src/main/java/docking/action/MultipleKeyAction.java index 4541fb7044..880562bcf5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/action/MultipleKeyAction.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/action/MultipleKeyAction.java @@ -121,8 +121,7 @@ public class MultipleKeyAction extends DockingKeyBindingAction { ActionContext localContext = getLocalContext(localProvider); localContext.setSourceObject(event.getSource()); - ActionContext globalContext = tool.getGlobalContext(); - List list = getValidContextActions(localContext, globalContext); + List list = getValidContextActions(localContext); // If menu active, disable all key bindings if (ignoreActionWhileMenuShowing()) { @@ -164,8 +163,7 @@ public class MultipleKeyAction extends DockingKeyBindingAction { return menuManager.getSelectedPath().length != 0; } - private List getValidContextActions(ActionContext localContext, - ActionContext globalContext) { + private List getValidContextActions(ActionContext localContext) { List list = new ArrayList<>(); boolean hasLocalActionsForKeyBinding = false; @@ -222,9 +220,6 @@ public class MultipleKeyAction extends DockingKeyBindingAction { if (isValidAndEnabled(actionData, localContext)) { list.add(new ExecutableKeyActionAdapter(actionData.action, localContext)); } - else if (isValidAndEnabledGlobally(actionData, globalContext)) { - list.add(new ExecutableKeyActionAdapter(actionData.action, globalContext)); - } } } return list; @@ -235,11 +230,6 @@ public class MultipleKeyAction extends DockingKeyBindingAction { return a.isValidContext(localContext) && a.isEnabledForContext(localContext); } - private boolean isValidAndEnabledGlobally(ActionData actionData, ActionContext globalContext) { - DockingActionIf a = actionData.action; - return a.isValidGlobalContext(globalContext) && a.isEnabledForContext(globalContext); - } - @Override public boolean isReservedKeybindingPrecedence() { return false; // MultipleKeyActions can never be reserved @@ -249,9 +239,7 @@ public class MultipleKeyAction extends DockingKeyBindingAction { public KeyBindingPrecedence getKeyBindingPrecedence() { ComponentProvider localProvider = tool.getActiveComponentProvider(); ActionContext localContext = getLocalContext(localProvider); - ActionContext globalContext = tool.getGlobalContext(); - List validActions = - getValidContextActions(localContext, globalContext); + List validActions = getValidContextActions(localContext); if (validActions.isEmpty()) { return null; // a signal that no actions are valid for the current context diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/builder/AbstractActionBuilder.java b/Ghidra/Framework/Docking/src/main/java/docking/action/builder/AbstractActionBuilder.java index 88b87e3656..78018a662a 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/action/builder/AbstractActionBuilder.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/action/builder/AbstractActionBuilder.java @@ -159,12 +159,6 @@ public abstract class AbstractActionBuilder validContextPredicate; - /** - * Predicate for determining if an action is applicable for a given global context - */ - private Predicate validGlobalContextPredicate; - - /** * Builder constructor * @param name the name of the action to be built @@ -551,22 +545,6 @@ public abstract class AbstractActionBuilderNote: most actions will not use this method, but rely instead on - * {@link #enabledWhen(Predicate)}. - * - * @param predicate the predicate that will be used to dynamically determine an action's - * validity for a given global {@link ActionContext} - * @return this builder (for chaining) - */ - public B validGlobalContextWhen(Predicate predicate) { - validGlobalContextPredicate = predicate; - return self(); - } - protected void validate() { if (actionCallback == null) { throw new IllegalStateException( @@ -593,9 +571,6 @@ public abstract class AbstractActionBuilder extends DockingAction { DockingWindowManager manager = DockingWindowManager.getActiveInstance(); ComponentProvider provider = manager.getActiveComponentProvider(); ActionContext localContext = provider == null ? null : provider.getActionContext(null); - final ActionContext actionContext = - localContext == null ? manager.getGlobalContext() : localContext; + ActionContext actionContext = localContext == null ? new ActionContext() : localContext; return actionContext; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/ToolBarItemManager.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/ToolBarItemManager.java index 7085f6632e..b05db19667 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/menu/ToolBarItemManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/ToolBarItemManager.java @@ -189,33 +189,23 @@ public class ToolBarItemManager implements PropertyChangeListener, ActionListene @Override public void actionPerformed(ActionEvent event) { DockingWindowManager.clearMouseOverHelp(); - ActionContext localContext = getActionContext(); - ActionContext globalContext = null; - if (windowManager != null) { - globalContext = windowManager.getGlobalContext(); + ActionContext context = getActionContext(); + + if (!toolBarAction.isValidContext(context)) { + return; } - ActionContext tempContext = null; - if (toolBarAction.isValidContext(localContext)) { - tempContext = localContext; // we prefer the local over the global context if valid - } - else if (toolBarAction.isValidGlobalContext(globalContext)) { - tempContext = globalContext; - } - else { - return; // context is not valid, nothing to do - } - tempContext.setSourceObject(event.getSource()); - final ActionContext finalContext = tempContext; + context.setSourceObject(event.getSource()); // this gives the UI some time to repaint before executing the action SwingUtilities.invokeLater(() -> { - if (toolBarAction.isEnabledForContext(finalContext)) { + if (toolBarAction.isValidContext(context) && + toolBarAction.isEnabledForContext(context)) { if (toolBarAction instanceof ToggleDockingActionIf) { ToggleDockingActionIf toggleAction = (ToggleDockingActionIf) toolBarAction; toggleAction.setSelected(!toggleAction.isSelected()); } - toolBarAction.actionPerformed(finalContext); + toolBarAction.actionPerformed(context); } }); } diff --git a/Ghidra/Framework/Docking/src/test/java/docking/FakeDockingTool.java b/Ghidra/Framework/Docking/src/test/java/docking/FakeDockingTool.java index 2696dbccaa..08a45ccd8d 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/FakeDockingTool.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/FakeDockingTool.java @@ -23,6 +23,7 @@ import javax.swing.ImageIcon; import docking.actions.ToolActions; import docking.framework.ApplicationInformationDisplayFactory; import ghidra.framework.options.ToolOptions; +import ghidra.framework.plugintool.util.ServiceListener; /** * A Test Double of the {@link DockingTool} that provides minimal tool functionality, such @@ -62,4 +63,19 @@ public class FakeDockingTool extends AbstractDockingTool { public void close() { // stub } + + @Override + public T getService(Class serviceClass) { + return null; + } + + @Override + public void addServiceListener(ServiceListener listener) { + // stub + } + + @Override + public void removeServiceListener(ServiceListener listener) { + // stub + } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java index 30c755c46d..f70da7fe6b 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java @@ -73,7 +73,7 @@ import ghidra.util.task.*; *

The PluginTool also manages tasks that run in the background, and options used by the plugins. * */ -public abstract class PluginTool extends AbstractDockingTool implements Tool, ServiceProvider { +public abstract class PluginTool extends AbstractDockingTool implements Tool { private static final String DOCKING_WINDOWS_ON_TOP = "Docking Windows On Top"; diff --git a/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/test/DummyTool.java b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/test/DummyTool.java index 32c00a05ca..3893d83cdd 100644 --- a/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/test/DummyTool.java +++ b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/test/DummyTool.java @@ -34,6 +34,7 @@ import docking.util.image.ToolIconURL; import ghidra.framework.model.*; import ghidra.framework.options.ToolOptions; import ghidra.framework.plugintool.PluginEvent; +import ghidra.framework.plugintool.util.ServiceListener; import ghidra.program.model.listing.Program; public class DummyTool implements Tool { @@ -369,11 +370,6 @@ public class DummyTool implements Tool { //do nothing } - @Override - public ActionContext getGlobalContext() { - return null; - } - @Override public void setStatusInfo(String text) { //do nothing @@ -423,4 +419,19 @@ public class DummyTool implements Tool { public DockingToolActions getToolActions() { return toolActions; } + + @Override + public T getService(Class serviceClass) { + return null; + } + + @Override + public void addServiceListener(ServiceListener listener) { + //do nothing + } + + @Override + public void removeServiceListener(ServiceListener listener) { + //do nothing + } }