From 03669ba8080a916b29c14efa2fd70afc78d3be7f Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Tue, 15 Feb 2022 16:59:29 -0500 Subject: [PATCH] GP-1745 - Updated the program chooser dialog to focus the filter field by default so users can start filtering when the dialog opens --- .../gui/modules/DebuggerModulesProvider.java | 2 + .../DebuggerTraceManagerServicePlugin.java | 37 ++++++++----------- .../ghidra/framework/main/DataTreeDialog.java | 10 ++++- .../main/datatree/ProjectDataTreePanel.java | 4 ++ 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/modules/DebuggerModulesProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/modules/DebuggerModulesProvider.java index 02289d3ceb..e98779a94f 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/modules/DebuggerModulesProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/modules/DebuggerModulesProvider.java @@ -1229,6 +1229,8 @@ public class DebuggerModulesProvider extends ComponentProviderAdapter { return programChooserDialog; } DomainFileFilter filter = df -> Program.class.isAssignableFrom(df.getDomainObjectClass()); + + // TODO regarding the hack note below, I believe this issue ahs been fixed, but not sure how to test return programChooserDialog = new DataTreeDialog(null, "Map Module to Program", DataTreeDialog.OPEN, filter) { { // TODO/HACK: I get an NPE setting the default selection if I don't fake this. diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java index 498e9f7a78..a1d0b8baf3 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java @@ -60,25 +60,16 @@ import ghidra.util.datastruct.CollectionChangeListener; import ghidra.util.exception.*; import ghidra.util.task.*; -@PluginInfo( - shortDescription = "Debugger Trace View Management Plugin", - description = "Manages UI Components, Wrappers, Focus, etc.", - category = PluginCategoryNames.DEBUGGER, - packageName = DebuggerPluginPackage.NAME, - status = PluginStatus.RELEASED, - eventsProduced = { - TraceActivatedPluginEvent.class, - }, - eventsConsumed = { - TraceActivatedPluginEvent.class, - TraceClosedPluginEvent.class, - ModelObjectFocusedPluginEvent.class, - TraceRecorderAdvancedPluginEvent.class, - }, - servicesRequired = {}, - servicesProvided = { - DebuggerTraceManagerService.class, - }) +@PluginInfo(shortDescription = "Debugger Trace View Management Plugin", description = "Manages UI Components, Wrappers, Focus, etc.", category = PluginCategoryNames.DEBUGGER, packageName = DebuggerPluginPackage.NAME, status = PluginStatus.RELEASED, eventsProduced = { + TraceActivatedPluginEvent.class, +}, eventsConsumed = { + TraceActivatedPluginEvent.class, + TraceClosedPluginEvent.class, + ModelObjectFocusedPluginEvent.class, + TraceRecorderAdvancedPluginEvent.class, +}, servicesRequired = {}, servicesProvided = { + DebuggerTraceManagerService.class, +}) public class DebuggerTraceManagerServicePlugin extends Plugin implements DebuggerTraceManagerService { private static final AutoConfigState.ClassHandler CONFIG_STATE_HANDLER = @@ -312,6 +303,8 @@ public class DebuggerTraceManagerServicePlugin extends Plugin return traceChooserDialog; } DomainFileFilter filter = df -> Trace.class.isAssignableFrom(df.getDomainObjectClass()); + + // TODO regarding the hack note below, I believe this issue ahs been fixed, but not sure how to test return traceChooserDialog = new DataTreeDialog(null, OpenTraceAction.NAME, DataTreeDialog.OPEN, filter) { { // TODO/HACK: Why the NPE if I don't do this? @@ -520,9 +513,9 @@ public class DebuggerTraceManagerServicePlugin extends Plugin protected void contextChanged() { Trace trace = current.getTrace(); - String name = trace == null ? "..." : trace.getName(); - actionCloseTrace.getMenuBarData().setMenuItemName(CloseTraceAction.NAME_PREFIX + name); - actionSaveTrace.getMenuBarData().setMenuItemName(SaveTraceAction.NAME_PREFIX + name); + String itemName = trace == null ? "..." : trace.getName(); + actionCloseTrace.getMenuBarData().setMenuItemName(CloseTraceAction.NAME_PREFIX + itemName); + actionSaveTrace.getMenuBarData().setMenuItemName(SaveTraceAction.NAME_PREFIX + itemName); tool.contextChanged(null); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java index 8fbbbeb67d..dfeac5b97f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java @@ -144,8 +144,7 @@ public class DataTreeDialog extends DialogComponentProvider okButton.setText("Save"); okButton.setMnemonic('S'); } - - if (newType == CREATE) { + else if (newType == CREATE) { okButton.setText("Create"); okButton.setMnemonic('C'); } @@ -222,11 +221,15 @@ public class DataTreeDialog extends DialogComponentProvider pendingNameText = null; initializeSelectedFolder(); + setFocusComponent(nameField); if (type == OPEN) { domainFolder = null; nameField.setText(nameFieldText); nameField.selectAll(); populateProjectModel(); + + // the name field is disabled; use the filter field + setFocusComponent(treePanel.getFilterField()); } else if (type == SAVE) { nameField.setText(nameFieldText); @@ -238,6 +241,9 @@ public class DataTreeDialog extends DialogComponentProvider nameField.selectAll(); initializeSelectedFolder(); } + else { // CHOOSE_FOLDER + setFocusComponent(treePanel.getFilterField()); + } setOkEnabled(!nameFieldText.isEmpty()); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java index e927527a6d..4179b23a90 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java @@ -362,6 +362,10 @@ public class ProjectDataTreePanel extends JPanel { tree.setFilterVisible(enabled); } + public Component getFilterField() { + return tree.getFilterField(); + } + public String[] getExpandedPathsByNodeName() { List expandedPaths = tree.getExpandedPaths(root); if (expandedPaths == null || expandedPaths.size() == 0) {