Fixed state saving for the data types table

This commit is contained in:
dragonmacher
2026-09-25 16:00:16 -04:00
parent ffbc5acf0f
commit 07ac60d329
3 changed files with 33 additions and 26 deletions

View File

@@ -292,6 +292,7 @@ public class DataTypeManagerPlugin extends ProgramPlugin
restoreRecentlyOpenedArchiveNames(saveState); restoreRecentlyOpenedArchiveNames(saveState);
restoreFavorites(saveState); restoreFavorites(saveState);
provider.restore(saveState); provider.restore(saveState);
tableProvider.restore(saveState);
} }
@Override @Override
@@ -300,6 +301,7 @@ public class DataTypeManagerPlugin extends ProgramPlugin
saveRecentlyOpenedArchiveNames(saveState); saveRecentlyOpenedArchiveNames(saveState);
saveFavorites(saveState); saveFavorites(saveState);
provider.save(saveState); provider.save(saveState);
tableProvider.save(saveState);
} }
private void restoreRecentlyOpenedArchiveNames(SaveState saveState) { private void restoreRecentlyOpenedArchiveNames(SaveState saveState) {

View File

@@ -44,6 +44,7 @@ import ghidra.app.plugin.core.datamgr.archive.InvalidArchive;
import ghidra.app.plugin.core.datamgr.util.DataTypeUtils; import ghidra.app.plugin.core.datamgr.util.DataTypeUtils;
import ghidra.docking.settings.Settings; import ghidra.docking.settings.Settings;
import ghidra.framework.options.PreferenceState; import ghidra.framework.options.PreferenceState;
import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;
@@ -69,6 +70,8 @@ import resources.Icons;
*/ */
public class DataTypesTableProvider extends ComponentProvider { public class DataTypesTableProvider extends ComponentProvider {
private static final String SAVE_STATE_NAME = "DATA_TYPES_TABLE";
private static final String FILTER_STATE_PREF_KEY = private static final String FILTER_STATE_PREF_KEY =
DataTypesTableProvider.class.getSimpleName() + ".DtFilterState"; DataTypesTableProvider.class.getSimpleName() + ".DtFilterState";
@@ -88,15 +91,14 @@ public class DataTypesTableProvider extends ComponentProvider {
private ToggleDockingAction showOnlyProgramTypesAction; private ToggleDockingAction showOnlyProgramTypesAction;
public DataTypesTableProvider(DataTypeManagerPlugin plugin) { public DataTypesTableProvider(DataTypeManagerPlugin plugin) {
this(plugin, getDtFilterState(plugin), plugin.getCurrentProgram(), true); this(plugin, plugin.getCurrentProgram(), true);
} }
private DataTypesTableProvider(DataTypeManagerPlugin plugin, DtFilterState filterState, private DataTypesTableProvider(DataTypeManagerPlugin plugin, Program program,
Program program, boolean isConnected) { boolean isConnected) {
super(plugin.getTool(), "Data Types Table", plugin.getName()); super(plugin.getTool(), "Data Types Table", plugin.getName());
this.plugin = plugin; this.plugin = plugin;
this.filterState = filterState;
this.program = program; this.program = program;
if (!isConnected) { if (!isConnected) {
@@ -128,23 +130,31 @@ public class DataTypesTableProvider extends ComponentProvider {
} }
} }
private static DtFilterState getDtFilterState(DataTypeManagerPlugin plugin) { public void restore(SaveState saveState) {
PreferenceState preferenceState = getPreferenceState(plugin); SaveState subSaveState = saveState.getSaveState(SAVE_STATE_NAME);
if (preferenceState != null) { if (subSaveState == null) {
DtFilterState filterState = new DtFilterState(); // Special case: the first time this provider is shown, there will not be any saved
filterState.restore(preferenceState); // state, so use the filter settings of the data type tree.
return filterState; filterState = plugin.getTreeFilterState();
return;
} }
// use the tree's current filter state as a default filterState.restore(subSaveState);
return plugin.getTreeFilterState();
boolean onlyProgram = subSaveState.getBoolean(SHOW_ONLY_PROGRAM_TYPES_KEY, false);
showOnlyProgramTypesAction.setSelected(onlyProgram);
} }
private static PreferenceState getPreferenceState(DataTypeManagerPlugin plugin) { public void save(SaveState saveState) {
PluginTool tool = plugin.getTool();
DockingWindowManager dwm = tool.getWindowManager(); SaveState subSaveState = new SaveState();
return dwm.getPreferenceState(FILTER_STATE_PREF_KEY);
filterState.save(subSaveState);
subSaveState.putBoolean(SHOW_ONLY_PROGRAM_TYPES_KEY,
showOnlyProgramTypesAction.isSelected());
saveState.putSaveState(SAVE_STATE_NAME, subSaveState);
} }
private void saveDtFilterState() { private void saveDtFilterState() {
@@ -326,12 +336,6 @@ public class DataTypesTableProvider extends ComponentProvider {
.onAction(c -> reload()) .onAction(c -> reload())
.buildAndInstallLocal(this); .buildAndInstallLocal(this);
PreferenceState preferenceState = getPreferenceState(plugin);
if (preferenceState != null) {
boolean onlyProgram = preferenceState.getBoolean(SHOW_ONLY_PROGRAM_TYPES_KEY, false);
showOnlyProgramTypesAction.setSelected(onlyProgram);
}
// Show in Tree / Select in Tree (select all items) // Show in Tree / Select in Tree (select all items)
new ActionBuilder("Select Data Types in Tree", plugin.getName()) new ActionBuilder("Select Data Types in Tree", plugin.getName())
.popupMenuPath("Select in Tree") .popupMenuPath("Select in Tree")
@@ -364,12 +368,13 @@ public class DataTypesTableProvider extends ComponentProvider {
} }
private void clone(ActionContext context) { private void clone(ActionContext context) {
DtFilterState newFilterState = filterState.copy();
DataTypesTableProvider newProvider = DataTypesTableProvider newProvider =
new DataTypesTableProvider(plugin, newFilterState, program, false); new DataTypesTableProvider(plugin, program, false);
newProvider.filterState = filterState.copy();
filterPanel.transferSettings(newProvider.filterPanel); filterPanel.transferSettings(newProvider.filterPanel);
newProvider.showOnlyProgramTypesAction.setSelected(showOnlyProgramTypesAction.isSelected()); newProvider.showOnlyProgramTypesAction.setSelected(showOnlyProgramTypesAction.isSelected());
newProvider.setVisible(true); newProvider.setVisible(true);
@@ -1133,5 +1138,4 @@ public class DataTypesTableProvider extends ComponentProvider {
} }
} }
} }
} }

View File

@@ -56,6 +56,7 @@ public class DtFilterDialog extends DialogComponentProvider {
initCheckBoxes(); initCheckBoxes();
setRememberSize(false); setRememberSize(false);
setRememberLocation(false);
} }
@Override @Override