diff --git a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponentProvider.java b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponentProvider.java index 1c6928d045..35d93c367a 100644 --- a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponentProvider.java +++ b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponentProvider.java @@ -455,7 +455,7 @@ public abstract class ByteViewerComponentProvider extends ComponentProviderAdapt * @param message non-html text to display */ void setStatusMessage(String message) { - plugin.setStatusMessage(message, this); + plugin.setStatusMessage(message); } void setEditMode(boolean isEditable) { diff --git a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPlugin.java b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPlugin.java index 65e36fcfe2..b68d8d30c6 100644 --- a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPlugin.java +++ b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPlugin.java @@ -20,7 +20,6 @@ import java.util.*; import org.jdom.Element; import docking.ActionContext; -import docking.ComponentProvider; import docking.action.DockingAction; import docking.action.ToolBarData; import ghidra.app.CorePluginPackage; @@ -37,6 +36,7 @@ import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramSelection; import ghidra.util.SystemUtilities; import resources.ResourceManager; +import utility.function.Callback; /** * Visible Plugin to show ByteBlock data in various formats. @@ -62,7 +62,7 @@ import resources.ResourceManager; public class ByteViewerPlugin extends Plugin { private Program currentProgram; - private boolean restoringTransientState; + private boolean areEventsDisabled; private ProgramLocation currentLocation; private ProgramByteViewerComponentProvider connectedProvider; @@ -155,11 +155,12 @@ public class ByteViewerPlugin extends Plugin { public void fireProgramLocationPluginEvent(ProgramByteViewerComponentProvider provider, ProgramLocationPluginEvent event) { + if (SystemUtilities.isEqual(event.getLocation(), currentLocation)) { return; } - currentLocation = event.getLocation(); + currentLocation = event.getLocation(); if (provider == connectedProvider) { firePluginEvent(event); } @@ -190,30 +191,35 @@ public class ByteViewerPlugin extends Plugin { */ @Override public void readDataState(SaveState saveState) { - ProgramManager programManagerService = tool.getService(ProgramManager.class); - connectedProvider.readDataState(saveState); + doWithEventsDisabled(() -> { - int numDisconnected = saveState.getInt("Num Disconnected", 0); - for (int i = 0; i < numDisconnected; i++) { - Element xmlElement = saveState.getXmlElement("Provider" + i); - SaveState providerSaveState = new SaveState(xmlElement); - String programPath = providerSaveState.getString("Program Path", ""); - DomainFile file = tool.getProject().getProjectData().getFile(programPath); - if (file == null) { - continue; + ProgramManager programManagerService = tool.getService(ProgramManager.class); + + connectedProvider.readDataState(saveState); + + int numDisconnected = saveState.getInt("Num Disconnected", 0); + for (int i = 0; i < numDisconnected; i++) { + Element xmlElement = saveState.getXmlElement("Provider" + i); + SaveState providerSaveState = new SaveState(xmlElement); + String programPath = providerSaveState.getString("Program Path", ""); + DomainFile file = tool.getProject().getProjectData().getFile(programPath); + if (file == null) { + continue; + } + Program program = programManagerService.openProgram(file); + if (program != null) { + ProgramByteViewerComponentProvider provider = + new ProgramByteViewerComponentProvider(tool, this, false); + provider.doSetProgram(program); + provider.readConfigState(providerSaveState); + provider.readDataState(providerSaveState); + tool.showComponentProvider(provider, true); + addProvider(provider); + } } - Program program = programManagerService.openProgram(file); - if (program != null) { - ProgramByteViewerComponentProvider provider = - new ProgramByteViewerComponentProvider(tool, this, false); - provider.doSetProgram(program); - provider.readConfigState(providerSaveState); - provider.readDataState(providerSaveState); - tool.showComponentProvider(provider, true); - addProvider(provider); - } - } + + }); } /** @@ -290,8 +296,6 @@ public class ByteViewerPlugin extends Plugin { } } - //////////////////////////////////////////////////////////////// - @Override public Object getTransientState() { Object[] state = new Object[2]; @@ -305,40 +309,31 @@ public class ByteViewerPlugin extends Plugin { return state; } - /* - * (non-Javadoc) - * @see ghidra.framework.plugintool.Plugin#restoreTransientState(java.lang.Object) - */ @Override public void restoreTransientState(Object objectState) { - restoringTransientState = true; - try { + + doWithEventsDisabled(() -> { Object[] state = (Object[]) objectState; - connectedProvider.restoreLocation((SaveState) state[0]); - connectedProvider.setSelection((ProgramSelection) state[1]); + }); + } + + private void doWithEventsDisabled(Callback callback) { + areEventsDisabled = true; + try { + callback.call(); } finally { - restoringTransientState = false; + areEventsDisabled = false; } } - ///////////////////////////////////////////////////////////////// - // *** package-level methods *** - ///////////////////////////////////////////////////////////////// - - boolean isRestoringTransientState() { - return restoringTransientState; + private boolean eventsDisabled() { + return areEventsDisabled; } - /** - * Set the status info on the tool. - * - * @param msg text to display - * @param provider not used - */ - void setStatusMessage(String msg, ComponentProvider provider) { + void setStatusMessage(String msg) { tool.setStatusInfo(msg); } @@ -384,7 +379,7 @@ public class ByteViewerPlugin extends Plugin { public void updateLocation(ProgramByteViewerComponentProvider provider, ProgramLocationPluginEvent event, boolean export) { - if (isRestoringTransientState()) { + if (eventsDisabled()) { return; }