diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/tasks/GTreeStartEditingTask.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/tasks/GTreeStartEditingTask.java index 8601afaf72..405e784855 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/tasks/GTreeStartEditingTask.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/tasks/GTreeStartEditingTask.java @@ -16,26 +16,24 @@ package docking.widgets.tree.tasks; import java.util.Objects; -import java.util.function.Predicate; import javax.swing.CellEditor; import javax.swing.JTree; -import javax.swing.event.CellEditorListener; -import javax.swing.event.ChangeEvent; +import javax.swing.event.*; import javax.swing.tree.TreePath; import docking.widgets.tree.*; +import docking.widgets.tree.internal.GTreeModel; +import ghidra.util.Swing; import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskMonitor; public class GTreeStartEditingTask extends GTreeTask { - private final GTreeNode modelParent; private final GTreeNode modelEditNode; public GTreeStartEditingTask(GTree gTree, JTree jTree, GTreeNode editNode) { super(gTree); - this.modelParent = tree.getModelNode(editNode.getParent()); this.modelEditNode = tree.getModelNode(editNode); } @@ -57,7 +55,6 @@ public class GTreeStartEditingTask extends GTreeTask { private void edit() { GTreeNode viewEditNode = tree.getViewNode(modelEditNode); - TreePath path = viewEditNode.getTreePath(); CellEditor cellEditor = tree.getCellEditor(); cellEditor.addCellEditorListener(new CellEditorListener() { @@ -72,16 +69,7 @@ public class GTreeStartEditingTask extends GTreeTask { String newName = Objects.toString(cellEditor.getCellEditorValue()); cellEditor.removeCellEditorListener(this); - // NOTE: there may be cases where this node search fails to correctly - // identify the renamed node when name and node class is insufficient to match. - Class nodeClass = viewEditNode.getClass(); - Predicate nodeMatches = n -> { - return nodeClass == n.getClass() && n.getName().equals(newName); - }; - tree.whenNodeIsReady(modelParent, nodeMatches, newNode -> { - tree.setSelectedNode(newNode); - }); - + new SelectNodeListener(tree.getModel(), newName); } }); @@ -90,4 +78,45 @@ public class GTreeStartEditingTask extends GTreeTask { } + private class SelectNodeListener implements TreeModelListener { + + private String newName; + private GTreeModel model; + + SelectNodeListener(GTreeModel model, String newName) { + this.model = model; + this.newName = newName; + model.addTreeModelListener(this); + } + + @Override + public void treeNodesInserted(TreeModelEvent e) { + Object[] children = e.getChildren(); + for (Object object : children) { + GTreeNode node = (GTreeNode) object; + String nodeName = node.getName(); + if (nodeName.equals(newName) || nodeName.contains(newName)) { + // do later to avoid mutating the model during notification + Swing.runLater(() -> model.removeTreeModelListener(this)); + tree.setSelectedNode(node); + break; + } + } + } + + @Override + public void treeNodesChanged(TreeModelEvent e) { + // stub + } + + @Override + public void treeNodesRemoved(TreeModelEvent e) { + // stub + } + + @Override + public void treeStructureChanged(TreeModelEvent e) { + // stub + } + } }