Merge remote-tracking branch 'origin/GP-5279_ghintern_programtree_npe--SQUASHED' into Ghidra_11.3

This commit is contained in:
Ryan Kurtz 2025-01-17 13:56:17 -05:00
commit 0084e66f27
2 changed files with 30 additions and 2 deletions

View file

@ -323,13 +323,15 @@ public class ProgramTreePlugin extends ProgramPlugin
//
// Update low-level component cache. We want to maintain the order of the tree views so
// that the UI does not move around on the user. Use the view names as they are stored in
// the program to provide a consistent order.
// the program to provide a consistent order. Do not open trees the user has closed.
//
List<TreeViewProvider> list = new ArrayList<>();
String[] orderedTreeNames = currentProgram.getListing().getTreeNames();
for (String treeName : orderedTreeNames) {
TreeViewProvider provider = providerMap.get(treeName);
list.add(provider);
if (provider != null) { // Provider will be null if this tree is not open in the view
list.add(provider);
}
}
componentProvider.treeViewsRestored(list);

View file

@ -425,6 +425,32 @@ public class ViewManagerPluginTest extends AbstractGhidraHeadedIntegrationTest {
assertTrue(provider.getCurrentView().hasSameAddresses(vps.getCurrentView()));
}
@Test
public void testCloseSaveRestoreState() throws Exception {
//
// Test that we can close one of the program's trees and have the close correctly persist
// when saved and restored. This happens when a user closes a tree, then changes between
// program tabs.
//
final DockingActionIf closeAction = getAction(plugin, "Close Tree View");
setCurrentViewProvider(DEFAULT_TREE_NAME);
performAction(closeAction);
setCurrentViewProvider("Main Tree");
AddressSetView set = provider.getCurrentView();
env.saveRestoreToolState();
String[] treeNames = program.getListing().getTreeNames();
assertEquals(treeNames.length - 1, tabbedPane.getTabCount());
ViewProviderService vps = provider.getCurrentViewProvider();
assertEquals("Main Tree", vps.getViewName());
assertTrue(set.hasSameAddresses(provider.getCurrentView()));
assertTrue(set.hasSameAddresses(cb.getView()));
assertTrue(provider.getCurrentView().hasSameAddresses(vps.getCurrentView()));
}
@SuppressWarnings("unused")
private JTextField findTextField(Container container) {
Component[] c = container.getComponents();