diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiProgramManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiProgramManager.java index efbcb20098..1cf6c60f5f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiProgramManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiProgramManager.java @@ -306,6 +306,10 @@ class MultiProgramManager implements DomainObjectListener, TransactionListener { DomainObjectChangeRecord docr = ev.getChangeRecord(i); int eventType = docr.getEventType(); if (eventType == DomainObject.DO_DOMAIN_FILE_CHANGED) { + ProgramInfo info = getInfo(program); + if (info != null) { + info.programSavedAs(); // updates info to new domain file + } if (currentInfo != null && currentInfo.program == program) { String name = program.getDomainFile().toString(); tool.setSubTitle(name); @@ -522,8 +526,8 @@ class MultiProgramManager implements DomainObjectListener, TransactionListener { // 2. Opened via ProgramLink file // 3. Opened via Program URL - public final DomainFile domainFile; // may be link file - public final URL ghidraURL; + private DomainFile domainFile; // may be link file + private URL ghidraURL; private TransientToolState lastState; private int instance; @@ -552,7 +556,29 @@ class MultiProgramManager implements DomainObjectListener, TransactionListener { this.visible = visible; instance = nextAvailableId.incrementAndGet(); } + + /** + * {@return URL used to open program or null if not applicable} + */ + URL getGhidraUrl() { + return ghidraURL; + } + + /** + * Get the {@link DomainFile} which corresponds to this program. If {@link #getGhidraUrl()} + * return null this file was used to open program. + * @return {@link DomainFile} which corresponds to program + */ + DomainFile getDomainFile() { + return domainFile; + } + void programSavedAs() { + domainFile = program.getDomainFile(); + ghidraURL = null; + str = null; + } + public void setVisible(boolean state) { visible = state; fireVisibilityChangeEvent(program, visible); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java index ef85cd8ea7..b45a06cf26 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java @@ -771,8 +771,9 @@ public class ProgramManagerPlugin extends Plugin implements ProgramManager { return; // do not save state when locked. } - if (programInfo.ghidraURL != null) { - saveState.putString("URL_" + index, programInfo.ghidraURL.toString()); + URL url = programInfo.getGhidraUrl(); + if (url != null) { + saveState.putString("URL_" + index, url.toString()); return; }