mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
Updated node edit task to be smarter about reselecting the edited node
after a rename
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user