Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9c413ca

Browse files
committed
Merge remote-tracking branch 'origin/GP-4545_ghidragon_data_tree_dialo_focus_issue--SQUASHED'
2 parents f9ade82 + 330f7fe commit 9c413ca

File tree

5 files changed

+84
-147
lines changed

5 files changed

+84
-147
lines changed

Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/modules/DebuggerModulesProvider.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,12 +1190,7 @@ private DataTreeDialog getProgramChooserDialog() {
11901190

11911191
DomainFileFilter filter = df -> Program.class.isAssignableFrom(df.getDomainObjectClass());
11921192

1193-
// TODO regarding the hack note below, I believe it's fixed, but not sure how to test
1194-
return new DataTreeDialog(null, "Map Module to Program", DataTreeDialog.OPEN, filter) {
1195-
{ // TODO/HACK: I get an NPE setting the default selection if I don't fake this.
1196-
dialogShown();
1197-
}
1198-
};
1193+
return new DataTreeDialog(null, "Map Module to Program", DataTreeDialog.OPEN, filter);
11991194
}
12001195

12011196
public DomainFile askProgram(Program program) {

Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -430,12 +430,7 @@ public boolean followLinkedFolders() {
430430
}
431431
};
432432

433-
// TODO regarding the hack note below, I believe this issue ahs been fixed, but not sure how to test
434-
return new DataTreeDialog(null, OpenTraceAction.NAME, DataTreeDialog.OPEN, filter) {
435-
{ // TODO/HACK: Why the NPE if I don't do this?
436-
dialogShown();
437-
}
438-
};
433+
return new DataTreeDialog(null, OpenTraceAction.NAME, DataTreeDialog.OPEN, filter);
439434
}
440435

441436
public DomainFile askTrace(Trace trace) {

Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java

Lines changed: 59 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,7 @@ public class DataTreeDialog extends DialogComponentProvider
8181
private Component parent;
8282

8383
private String searchString;
84-
private boolean comboModelInitialized;
8584
private boolean cancelled = false;
86-
private String pendingNameText;
87-
private DomainFolder pendingDomainFolder;
8885

8986
private ProjectDataExpandAction<DialogProjectTreeContext> expandAction;
9087
private ProjectDataCollapseAction<DialogProjectTreeContext> collapseAction;
@@ -134,23 +131,31 @@ public DataTreeDialog(Component parent, String title, int type, DomainFileFilter
134131
public DataTreeDialog(Component parent, String title, int type, DomainFileFilter filter,
135132
Project project) {
136133
super(title, true, true, true, false);
134+
135+
if (type < 0 || type > CREATE) {
136+
throw new IllegalArgumentException("Invalid type specified: " + type);
137+
}
138+
137139
this.project = project;
138140
this.parent = parent;
139-
initDataTreeDialog(type, filter);
140-
}
141+
this.type = type;
142+
this.filter = filter;
141143

142-
private static DomainFileFilter getDefaultFilter(int type) {
143-
if (type == CHOOSE_FOLDER || type == OPEN) {
144-
// return filter which forces folder selection and allow navigation into linked-folders
145-
return new DomainFileFilter() {
144+
addWorkPanel(buildMainPanel());
145+
initializeButtons();
146+
rootPanel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
146147

147-
@Override
148-
public boolean accept(DomainFile df) {
149-
return true; // show all files (legacy behavior)
150-
}
151-
};
148+
initializeFocusedComponent();
149+
150+
createActions();
151+
}
152+
153+
private void initializeFocusedComponent() {
154+
Component focusComponent = nameField;
155+
if (!nameField.isEditable()) {
156+
focusComponent = treePanel.getFilterField();
152157
}
153-
return null;
158+
setFocusComponent(focusComponent);
154159
}
155160

156161
public void setTreeSelectionMode(int mode) {
@@ -160,34 +165,20 @@ public void setTreeSelectionMode(int mode) {
160165
treeSelectionMode = mode;
161166
}
162167

163-
private void initDataTreeDialog(int newType, DomainFileFilter newFilter) {
164-
165-
if (newType < 0 || newType > CREATE) {
166-
throw new IllegalArgumentException("Invalid type specified: " + newType);
167-
}
168-
this.type = newType;
169-
this.filter = newFilter;
170-
171-
okButton = new JButton("OK");
172-
okButton.setMnemonic('K');
173-
okButton.addActionListener(ev -> okCallback());
174-
addButton(okButton);
168+
private void initializeButtons() {
169+
addOKButton();
175170
addCancelButton();
176171

177-
if (newType == SAVE) {
172+
if (type == SAVE) {
178173
okButton.setText("Save");
179174
okButton.setMnemonic('S');
180175
}
181-
else if (newType == CREATE) {
176+
else if (type == CREATE) {
182177
okButton.setText("Create");
183178
okButton.setMnemonic('C');
184179
}
180+
setOkEnabled(false);
185181

186-
rootPanel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
187-
188-
setFocusComponent(nameField);
189-
190-
createActions();
191182
}
192183

193184
private void createActions() {
@@ -223,7 +214,6 @@ public ActionContext getActionContext(MouseEvent event) {
223214
}
224215

225216
public void show() {
226-
doSetup();
227217
DockingWindowManager.showDialog(parent, this);
228218
}
229219

@@ -235,79 +225,13 @@ public void showComponent() {
235225
show();
236226
}
237227

238-
@Override
239-
protected void dialogShown() {
240-
if (!comboModelInitialized) {
241-
doSetup();
242-
}
243-
}
244-
245-
private void doSetup() {
246-
addWorkPanel(buildMainPanel());
247-
248-
comboModelInitialized = true;
249-
// repopulate the tree
250-
ProjectData pd = project.getProjectData();
251-
treePanel.setProjectData(project.getName(), pd);
252-
253-
String nameFieldText = pendingNameText == null ? "" : pendingNameText;
254-
pendingNameText = null;
255-
initializeSelectedFolder();
256-
257-
setFocusComponent(nameField);
258-
if (type == OPEN) {
259-
domainFolder = null;
260-
nameField.setText(nameFieldText);
261-
nameField.selectAll();
262-
populateProjectModel();
263-
264-
// the name field is disabled; use the filter field
265-
setFocusComponent(treePanel.getFilterField());
266-
}
267-
else if (type == SAVE) {
268-
nameField.setText(nameFieldText);
269-
nameField.selectAll();
270-
initializeSelectedFolder();
271-
}
272-
else if (type == CREATE) {
273-
nameField.setText(nameFieldText);
274-
nameField.selectAll();
275-
initializeSelectedFolder();
276-
}
277-
else { // CHOOSE_FOLDER
278-
setFocusComponent(treePanel.getFilterField());
279-
}
280-
281-
setOkEnabled(!nameFieldText.isEmpty());
282-
283-
if (searchString != null) {
284-
findAndSelect(searchString);
285-
}
286-
287-
clearStatusText();
288-
}
289-
290-
private void initializeSelectedFolder() {
291-
if (pendingDomainFolder != null) {
292-
// set the explicitly requested folder to be selected
293-
treePanel.selectDomainFolder(pendingDomainFolder);
294-
pendingDomainFolder = null;
295-
}
296-
else {
297-
// default case--make sure we have a folder selected
298-
domainFolder = treePanel.getSelectedDomainFolder();
299-
if (domainFolder == null) {
300-
treePanel.selectRootDataFolder();
301-
}
302-
}
303-
}
304-
305228
public String getNameText() {
306229
return nameField.getText();
307230
}
308231

309232
public void setNameText(String name) {
310-
pendingNameText = name;
233+
nameField.setText(name.trim());
234+
nameField.selectAll();
311235
}
312236

313237
/**
@@ -316,7 +240,9 @@ public void setNameText(String name) {
316240
* @param folder {@link DomainFolder} to select when showing the dialog
317241
*/
318242
public void setSelectedFolder(DomainFolder folder) {
319-
pendingDomainFolder = folder;
243+
if (folder != null) {
244+
treePanel.selectDomainFolder(folder);
245+
}
320246
}
321247

322248
/**
@@ -474,27 +400,33 @@ public void close() {
474400
treePanel.dispose();
475401
}
476402
treePanel = null;
477-
comboModelInitialized = false;
478403
}
479404

480405
protected JPanel buildMainPanel() {
481406

482407
JPanel panel = new JPanel();
483408
panel.setLayout(new BorderLayout());
484409

410+
JPanel namePanel = createNamePanel();
411+
485412
// data tree panel must be created before the combo box
486413
JPanel dataTreePanel = createDataTreePanel();
414+
ProjectData pd = project.getProjectData();
415+
treePanel.setProjectData(project.getName(), pd);
416+
treePanel.selectRootDataFolder();
487417

488418
if (type == OPEN) {
489419
JPanel comboPanel = createComboBoxPanel();
490420

491421
panel.add(comboPanel, BorderLayout.NORTH);
422+
populateProjectModel();
492423
}
493-
panel.add(dataTreePanel, BorderLayout.CENTER);
494424

495-
JPanel namePanel = createNamePanel();
425+
panel.add(dataTreePanel, BorderLayout.CENTER);
496426
panel.add(namePanel, BorderLayout.SOUTH);
497427

428+
// can't add tree listeners until everything is built
429+
addTreeListeners();
498430
return panel;
499431
}
500432

@@ -537,7 +469,9 @@ private JPanel createDataTreePanel() {
537469
treePanel.addTreeSelectionListener(this);
538470
treePanel.setPreferredTreePanelSize(new Dimension(150, 150));
539471

540-
addTreeListeners();
472+
// don't put the filter in the dialog when the user can/must type a name, as it's confusing
473+
boolean userChoosesName = (type == SAVE) || (type == CREATE);
474+
treePanel.setTreeFilterEnabled(!userChoosesName);
541475

542476
panel.add(treePanel, BorderLayout.CENTER);
543477
return panel;
@@ -633,9 +567,6 @@ public void changedUpdate(DocumentEvent e) {
633567
nameField.setEditable(userChoosesName);
634568
nameField.setEnabled(userChoosesName);
635569

636-
// don't put the filter in the dialog when the user can/must type a name, as it's confusing
637-
treePanel.setTreeFilterEnabled(!userChoosesName);
638-
639570
JPanel namePanel = new JPanel(new PairLayout(2, 5, 100));
640571

641572
if (!userChoosesName) {
@@ -688,12 +619,24 @@ private void populateProjectModel() {
688619
map = null;
689620
}
690621

691-
public void findAndSelect(String s) {
692-
treePanel.findAndSelect(s);
622+
public void setSearchText(String s) {
623+
if (searchString != null) {
624+
treePanel.findAndSelect(s);
625+
}
693626
}
694627

695-
public void setSearchText(String string) {
696-
searchString = string;
628+
private static DomainFileFilter getDefaultFilter(int type) {
629+
if (type == CHOOSE_FOLDER || type == OPEN) {
630+
// return filter which forces folder selection and allow navigation into linked-folders
631+
return new DomainFileFilter() {
632+
633+
@Override
634+
public boolean accept(DomainFile df) {
635+
return true; // show all files (legacy behavior)
636+
}
637+
};
638+
}
639+
return null;
697640
}
698641

699642
private class FieldKeyListener extends KeyAdapter {
@@ -702,4 +645,5 @@ public void keyPressed(KeyEvent e) {
702645
clearStatusText();
703646
}
704647
}
648+
705649
}

Ghidra/Features/Base/src/main/java/ghidra/framework/main/OpenVersionedFileDialog.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,20 @@ public OpenVersionedFileDialog(PluginTool tool, String title, Class<T> domainObj
7979
super(tool.getToolFrame(), title, DataTreeDialog.OPEN, f -> {
8080
return domainObjectClass.isAssignableFrom(f.getDomainObjectClass());
8181
});
82+
8283
this.tool = tool;
8384
this.domainObjectClass = domainObjectClass;
84-
init();
85+
updateOkTooltip();
86+
checkIfHistoryWasOpen();
87+
}
88+
89+
private void checkIfHistoryWasOpen() {
90+
String showHistory =
91+
Preferences.getProperty(SHOW_HISTORY_PREFERENCES_KEY, Boolean.FALSE.toString(), true);
92+
93+
if (Boolean.parseBoolean(showHistory)) {
94+
showHistoryPanel(true);
95+
}
8596
}
8697

8798
/**
@@ -164,6 +175,10 @@ public DomainFolder getDomainFolder() {
164175

165176
@Override
166177
protected JPanel buildMainPanel() {
178+
historyButton = new JButton("History>>");
179+
historyButton.addActionListener(e -> showHistoryPanel(!historyIsShowing));
180+
181+
rootPanel.setPreferredSize(getPreferredSizeForHistoryState());
167182

168183
mainPanel = new JPanel(new BorderLayout());
169184
mainPanel.add(super.buildMainPanel(), BorderLayout.CENTER);
@@ -183,18 +198,9 @@ protected JPanel buildMainPanel() {
183198
JPanel projectFilePanel = new JPanel(new BorderLayout());
184199
projectFilePanel.add(splitPane);
185200

186-
String showHistory =
187-
Preferences.getProperty(SHOW_HISTORY_PREFERENCES_KEY, Boolean.FALSE.toString(), true);
188-
189-
if (Boolean.parseBoolean(showHistory)) {
190-
showHistoryPanel(true);
191-
}
192-
193201
openObjectsTable = null;
194202
tabbedPane = null;
195203

196-
updateOkTooltip();
197-
198204
if (openDomainObjects == null) {
199205
return projectFilePanel; // return Project File selection panel only
200206
}
@@ -245,7 +251,7 @@ private Component buildOpenObjectsTable() {
245251
openObjectsTable = new GFilterTable<>(new OpenObjectsTableModel());
246252
GTable table = openObjectsTable.getTable();
247253
table.getSelectionModel()
248-
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
254+
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
249255
openObjectsTable.addSelectionListener(e -> {
250256
setOkEnabled(true);
251257
okButton.setToolTipText("Use the selected " + domainObjectClass.getSimpleName());
@@ -376,13 +382,6 @@ private boolean createHistoryPanel() {
376382
return true;
377383
}
378384

379-
private void init() {
380-
historyButton = new JButton("History>>");
381-
historyButton.addActionListener(e -> showHistoryPanel(!historyIsShowing));
382-
383-
rootPanel.setPreferredSize(getPreferredSizeForHistoryState());
384-
}
385-
386385
@Override
387386
protected void addTreeListeners() {
388387
super.addTreeListeners();

0 commit comments

Comments
 (0)