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;
|
package docking.widgets.tree.tasks;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
import javax.swing.CellEditor;
|
import javax.swing.CellEditor;
|
||||||
import javax.swing.JTree;
|
import javax.swing.JTree;
|
||||||
import javax.swing.event.CellEditorListener;
|
import javax.swing.event.*;
|
||||||
import javax.swing.event.ChangeEvent;
|
|
||||||
import javax.swing.tree.TreePath;
|
import javax.swing.tree.TreePath;
|
||||||
|
|
||||||
import docking.widgets.tree.*;
|
import docking.widgets.tree.*;
|
||||||
|
import docking.widgets.tree.internal.GTreeModel;
|
||||||
|
import ghidra.util.Swing;
|
||||||
import ghidra.util.exception.CancelledException;
|
import ghidra.util.exception.CancelledException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
import ghidra.util.task.TaskMonitor;
|
||||||
|
|
||||||
public class GTreeStartEditingTask extends GTreeTask {
|
public class GTreeStartEditingTask extends GTreeTask {
|
||||||
|
|
||||||
private final GTreeNode modelParent;
|
|
||||||
private final GTreeNode modelEditNode;
|
private final GTreeNode modelEditNode;
|
||||||
|
|
||||||
public GTreeStartEditingTask(GTree gTree, JTree jTree, GTreeNode editNode) {
|
public GTreeStartEditingTask(GTree gTree, JTree jTree, GTreeNode editNode) {
|
||||||
super(gTree);
|
super(gTree);
|
||||||
this.modelParent = tree.getModelNode(editNode.getParent());
|
|
||||||
this.modelEditNode = tree.getModelNode(editNode);
|
this.modelEditNode = tree.getModelNode(editNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +55,6 @@ public class GTreeStartEditingTask extends GTreeTask {
|
|||||||
private void edit() {
|
private void edit() {
|
||||||
|
|
||||||
GTreeNode viewEditNode = tree.getViewNode(modelEditNode);
|
GTreeNode viewEditNode = tree.getViewNode(modelEditNode);
|
||||||
|
|
||||||
TreePath path = viewEditNode.getTreePath();
|
TreePath path = viewEditNode.getTreePath();
|
||||||
CellEditor cellEditor = tree.getCellEditor();
|
CellEditor cellEditor = tree.getCellEditor();
|
||||||
cellEditor.addCellEditorListener(new CellEditorListener() {
|
cellEditor.addCellEditorListener(new CellEditorListener() {
|
||||||
@@ -72,16 +69,7 @@ public class GTreeStartEditingTask extends GTreeTask {
|
|||||||
String newName = Objects.toString(cellEditor.getCellEditorValue());
|
String newName = Objects.toString(cellEditor.getCellEditorValue());
|
||||||
cellEditor.removeCellEditorListener(this);
|
cellEditor.removeCellEditorListener(this);
|
||||||
|
|
||||||
// NOTE: there may be cases where this node search fails to correctly
|
new SelectNodeListener(tree.getModel(), newName);
|
||||||
// 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);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -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