Updated node edit task to be smarter about reselecting the edited node

after a rename
This commit is contained in:
dragonmacher
2026-09-01 15:46:38 -04:00
parent b7cbb8522f
commit c1c1bc47e8

View File

@@ -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<GTreeNode> 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
}
}
}