diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java index 19768383da..8fdf767d83 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java @@ -120,11 +120,18 @@ public class DataTypeManagerHandler { /** * Notification that the given program is open. Add the root category * for the program to any provider that is open. + * @param program the program */ public void programOpened(Program program) { + boolean wasChanged = tool.hasConfigChanged(); programArchive = new ProgramArchive(program); openProgramArchives(program); addArchive(programArchive); + + // Do not mark tool configs as changed when restoring archives used by the program. The + // archives opened by the program are considered transient. Alternatively, archives opened + // by the user will trigger config state changes. + tool.setConfigChanged(wasChanged); } /** @@ -1492,7 +1499,7 @@ public class DataTypeManagerHandler { super(parent, title, type, filter); } - /** + /* * Callback method to create the DB and to show errors if they happen. */ boolean createNewDataTypeArchive() { @@ -1530,10 +1537,6 @@ public class DataTypeManagerHandler { private DomainFile domainFile; private PluginTool pluginTool; - /** - * Construct new SaveFileTask. - * @param df domain file to save - */ DomainFileSaveTask(String domainObjectType, DomainFile df, PluginTool tool) { super("Save " + domainObjectType, true, true, true); this.domainObjectType = domainObjectType; @@ -1541,9 +1544,6 @@ public class DataTypeManagerHandler { this.pluginTool = tool; } - /** - * @see ghidra.util.task.Task#run(TaskMonitor) - */ @Override public void run(TaskMonitor monitor) { monitor.setMessage("Saving " + domainObjectType + "..."); @@ -1576,16 +1576,6 @@ public class DataTypeManagerHandler { private String newName; private boolean doOverwrite; - /** - * Construct new SaveProjectArchiveTask to do a "Save As" - * @param domainObjectType - * @param domainObject - * @param folder new parent folder - * @param newName name for domain object - * @param doOverwrite true means the given name already exists and the user - * wants to overwrite that existing file; false means a new file will - * get created - */ DomainObjectSaveAsTask(String domainObjectType, UndoableDomainObject domainObject, DomainFolder folder, String newName, boolean doOverwrite) { @@ -1597,9 +1587,6 @@ public class DataTypeManagerHandler { this.doOverwrite = doOverwrite; } - /** - * @see ghidra.util.task.Task#run(TaskMonitor) - */ @Override public void run(TaskMonitor monitor) { monitor.setMessage("Saving " + domainObjectType + "..."); @@ -1648,19 +1635,7 @@ public class DataTypeManagerHandler { @Override public void domainFileRemoved(DomainFolder parentFolder, String name, String fileID) { - // DT What if anything needs to be done here? -// Iterator archiveIter = openArchives.iterator(); -// while (archiveIter.hasNext()) { -// Archive archive = archiveIter.next(); -// if (archive instanceof ProjectArchive) { -// ProjectArchive projectArchive = (ProjectArchive) archive; -// DomainFile domainFile = projectArchive.getDomainFile(); -// if (StringUtilities.equals(domainFile.getFileID(), fileID)) { -// // DT What if anything needs to be done here? -// return; -// } -// } -// } + // ignore } @Override @@ -1715,12 +1690,12 @@ public class DataTypeManagerHandler { try { contentType = newDomainFile.getContentType(); try { - openArchive(newDomainFile, false, false, TaskMonitorAdapter.DUMMY_MONITOR); + openArchive(newDomainFile, false, false, TaskMonitor.DUMMY); } catch (VersionException e) { // should never happen following check-in (i.e., DomainObjectReplaced) if (VersionExceptionHandler.isUpgradeOK(null, newDomainFile, "Re-open", e)) { - openArchive(newDomainFile, true, false, TaskMonitorAdapter.DUMMY_MONITOR); + openArchive(newDomainFile, true, false, TaskMonitor.DUMMY); } } } @@ -1788,8 +1763,8 @@ public class DataTypeManagerHandler { /** * Create project archive path string for recently used project archive - * @param projectName - * @param pathname + * @param projectName the project name + * @param pathname the pathname used to create the final path * @return recently used project pathname string */ public static String getProjectPathname(String projectName, String pathname) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java b/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java index fcb5e09fd4..ddacbc84d1 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/AbstractDockingTool.java @@ -34,7 +34,7 @@ public abstract class AbstractDockingTool implements Tool { protected DockingWindowManager winMgr; protected ToolActions toolActions; protected Map optionsMap = new HashMap<>(); - protected boolean configChangedFlag; + private boolean configChangedFlag; @Override public boolean isVisible() { 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 62c7bd7c6e..4cdea06ca9 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 @@ -137,7 +137,7 @@ public abstract class PluginTool extends AbstractDockingTool { boolean hasErrors = restoreFromXml(template.getToolElement()); if (!hasErrors) { - configChangedFlag = false; + setConfigChanged(false); } optionsMgr.validateOptions(); } @@ -1095,7 +1095,7 @@ public abstract class PluginTool extends AbstractDockingTool { } public boolean shouldSave() { - return configChangedFlag; // ignore the window layout changes + return hasConfigChanged(); // ignore the window layout changes } /** @@ -1106,28 +1106,26 @@ public abstract class PluginTool extends AbstractDockingTool { if (toolServices.canAutoSave(this)) { saveTool(); } - else { - if (configChangedFlag) { - int result = OptionDialog.showOptionDialog(getToolFrame(), SAVE_DIALOG_TITLE, - "This tool has changed. There are/were multiple instances of this tool\n" + - "running and Ghidra cannot determine if this tool instance should\n" + - "automatically be saved. Do you want to save the configuration of this tool\n" + - "instance?", - "Save", "Save As...", "Don't Save", OptionDialog.WARNING_MESSAGE); - if (result == OptionDialog.CANCEL_OPTION) { - return false; - } - if (result == OptionDialog.OPTION_ONE) { - saveTool(); - } - else if (result == OptionDialog.OPTION_TWO) { - boolean didSave = saveToolAs(); - if (!didSave) { - return doSaveTool(); - } - } - // option 3 is don't save; just exit + else if (hasConfigChanged()) { + int result = OptionDialog.showOptionDialog(getToolFrame(), SAVE_DIALOG_TITLE, + "This tool has changed. There are/were multiple instances of this tool\n" + + "running and Ghidra cannot determine if this tool instance should\n" + + "automatically be saved. Do you want to save the configuration of this tool\n" + + "instance?", + "Save", "Save As...", "Don't Save", OptionDialog.WARNING_MESSAGE); + if (result == OptionDialog.CANCEL_OPTION) { + return false; } + if (result == OptionDialog.OPTION_ONE) { + saveTool(); + } + else if (result == OptionDialog.OPTION_TWO) { + boolean didSave = saveToolAs(); + if (!didSave) { + return doSaveTool(); + } + } + // option 3 is don't save; just exit } return true; }