From bd66419fc065e80632cf66a8ee4b13f691844457 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 28 May 2026 17:49:26 -0400 Subject: [PATCH] GP-6870 - Updated the New Project Wizard to have better default focus --- .../src/main/java/docking/wizard/WizardDialog.java | 12 ++++++++++++ .../ghidra/framework/main/ProjectAccessPanel.java | 5 +++++ .../ghidra/framework/main/ServerInfoComponent.java | 6 ++++++ .../main/wizard/project/ProjectAccessStep.java | 6 ++++++ .../main/wizard/project/ProjectTypePanel.java | 5 +++++ .../main/wizard/project/ProjectTypeStep.java | 7 +++++++ .../main/wizard/project/RepositoryPanel.java | 5 +++++ .../main/wizard/project/RepositoryStep.java | 6 ++++++ .../main/wizard/project/SelectProjectPanel.java | 5 +++++ .../main/wizard/project/SelectProjectStep.java | 6 ++++++ .../main/wizard/project/ServerInfoPanel.java | 8 +++++--- .../framework/main/wizard/project/ServerStep.java | 7 +++++++ 12 files changed, 75 insertions(+), 3 deletions(-) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardDialog.java index 0bfa9e136f..c645b05e33 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardDialog.java @@ -29,6 +29,7 @@ import docking.widgets.label.GDLabel; import generic.theme.GThemeDefaults.Colors.Messages; import generic.theme.Gui; import ghidra.util.HelpLocation; +import ghidra.util.Swing; import help.Help; import help.HelpService; import resources.Icons; @@ -193,6 +194,17 @@ public class WizardDialog extends DialogComponentProvider { HelpService help = Help.getHelpService(); help.registerHelp(getComponent(), helpLocation); statusChanged(); + + initializeFocus(step); + } + + private void initializeFocus(WizardStep step) { + Component toFocus = step.getDefaultFocusComponent(); + if (toFocus != null) { + Swing.runLater(() -> { + toFocus.requestFocusInWindow(); + }); + } } private void createButtons() { diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java index a666f324dd..9851f9b4ad 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java @@ -112,6 +112,10 @@ public class ProjectAccessPanel extends JPanel { createMainPanel(knownUsers, anonymousServerAccessAllowed); } + public Component getDefaultFocusComponent() { + return knownUsersPanel; + } + /** * Sets the help location. * @@ -573,4 +577,5 @@ public class ProjectAccessPanel extends JPanel { } } } + } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java index ab18c119f9..12e45aa548 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java @@ -16,6 +16,7 @@ package ghidra.framework.main; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -49,6 +50,10 @@ public class ServerInfoComponent extends JPanel { buildMainPanel(); } + public Component getDefaultFocusComponent() { + return nameField; + } + /** * Set the status listener * @param statusListener @@ -218,4 +223,5 @@ public class ServerInfoComponent extends JPanel { public boolean isValidInformation() { return checkServerName() && checkPortNumber(); } + } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectAccessStep.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectAccessStep.java index 4ecab47ac4..f74e87cf93 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectAccessStep.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectAccessStep.java @@ -15,6 +15,7 @@ */ package ghidra.framework.main.wizard.project; +import java.awt.Component; import java.io.IOException; import java.util.ArrayList; @@ -45,6 +46,11 @@ public class ProjectAccessStep extends WizardStep { this.tool = tool; } + @Override + public Component getDefaultFocusComponent() { + return panel.getDefaultFocusComponent(); + } + @Override public void initialize(ProjectWizardData data) { setTitle("Specify Users for Repository: " + data.getRepositoryName()); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypePanel.java index 6acfaa60a2..cbacc5c4d1 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypePanel.java @@ -16,6 +16,7 @@ package ghidra.framework.main.wizard.project; import java.awt.BorderLayout; +import java.awt.Component; import javax.swing.*; @@ -55,4 +56,8 @@ public class ProjectTypePanel extends JPanel { boolean isSharedProject() { return sharedRB.isSelected(); } + + public Component getDefaultFocusComponent() { + return nonSharedRB; + } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypeStep.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypeStep.java index 9cb83843f4..1766a28827 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypeStep.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ProjectTypeStep.java @@ -15,6 +15,8 @@ */ package ghidra.framework.main.wizard.project; +import java.awt.Component; + import javax.swing.JComponent; import docking.wizard.WizardModel; @@ -35,6 +37,11 @@ public class ProjectTypeStep extends WizardStep { panel = new ProjectTypePanel(); } + @Override + public Component getDefaultFocusComponent() { + return panel.getDefaultFocusComponent(); + } + @Override public void initialize(ProjectWizardData data) { // do nothing diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryPanel.java index c376d2cdf6..55c27835c2 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryPanel.java @@ -16,6 +16,7 @@ package ghidra.framework.main.wizard.project; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -53,6 +54,10 @@ public class RepositoryPanel extends JPanel { buildMainPanel(repositoryNames, readOnlyServerAccess); } + public Component getDefaultFocusComponent() { + return nameList; + } + public boolean isCreateRepositorySelected() { return createRepButton.isSelected(); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryStep.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryStep.java index e0cdd731e8..e8a557d6dc 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryStep.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/RepositoryStep.java @@ -15,6 +15,7 @@ */ package ghidra.framework.main.wizard.project; +import java.awt.Component; import java.io.IOException; import java.util.List; @@ -42,6 +43,11 @@ public class RepositoryStep extends WizardStep { super(model, "", new HelpLocation(GenericHelpTopics.FRONT_END, "SelectRepository")); } + @Override + public Component getDefaultFocusComponent() { + return panel.getDefaultFocusComponent(); + } + @Override public void initialize(ProjectWizardData data) { ServerInfo serverInfo = data.getServerInfo(); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectPanel.java index 08487c03ff..cd37c20c8a 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectPanel.java @@ -16,6 +16,7 @@ package ghidra.framework.main.wizard.project; import java.awt.BorderLayout; +import java.awt.Component; import java.io.File; import javax.swing.*; @@ -64,6 +65,10 @@ public class SelectProjectPanel extends JPanel { buildMainPanel(); } + public Component getDefaultFocusComponent() { + return directoryField; + } + void setProjectName(String projectName) { projectNameField.setText(projectName); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectStep.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectStep.java index fc9b4f8f9e..2f79e8e11d 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectStep.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/SelectProjectStep.java @@ -17,6 +17,7 @@ package ghidra.framework.main.wizard.project; import static ghidra.app.util.GenericHelpTopics.*; +import java.awt.Component; import java.io.File; import javax.swing.JComponent; @@ -41,6 +42,11 @@ public class SelectProjectStep extends WizardStep { panel = new SelectProjectPanel(() -> notifyStatusChanged()); } + @Override + public Component getDefaultFocusComponent() { + return panel.getDefaultFocusComponent(); + } + @Override public void initialize(ProjectWizardData data) { boolean isShared = data.isSharedProject(); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerInfoPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerInfoPanel.java index 07d3e1626a..45a4c61fbe 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerInfoPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerInfoPanel.java @@ -16,6 +16,7 @@ package ghidra.framework.main.wizard.project; import java.awt.BorderLayout; +import java.awt.Component; import javax.swing.JPanel; @@ -41,6 +42,10 @@ public class ServerInfoPanel extends JPanel { serverInfoComponent.setChangeListener(e -> statusChangedCallback.call()); } + public Component getDefaultFocusComponent() { + return serverInfoComponent.getDefaultFocusComponent(); + } + public boolean isValidInformation() { return serverInfoComponent.isValidInformation(); } @@ -57,9 +62,6 @@ public class ServerInfoPanel extends JPanel { return serverInfoComponent.getPortNumber(); } - /** - * Set the field values using the given server info. - */ public void setServerInfo(ServerInfo info) { serverInfoComponent.setServerInfo(info); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerStep.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerStep.java index 83430f264d..2af8b2a597 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerStep.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/wizard/project/ServerStep.java @@ -15,6 +15,8 @@ */ package ghidra.framework.main.wizard.project; +import java.awt.Component; + import javax.swing.JComponent; import docking.wizard.WizardModel; @@ -40,6 +42,11 @@ public class ServerStep extends WizardStep { panel = new ServerInfoPanel(this::notifyStatusChanged); } + @Override + public Component getDefaultFocusComponent() { + return panel.getDefaultFocusComponent(); + } + @Override public void initialize(ProjectWizardData data) { if (panel.getServerName().isBlank()) {