forked from LupusNobilis/java-org.hwo.ui
150 lines
3.8 KiB
Java
150 lines
3.8 KiB
Java
package org.hwo.ui.tree;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
|
|
import javax.swing.event.TreeModelEvent;
|
|
import javax.swing.event.TreeModelListener;
|
|
import javax.swing.tree.TreeModel;
|
|
import javax.swing.tree.TreePath;
|
|
|
|
import org.hwo.StringHelper;
|
|
|
|
public class AutomatedTreeModel implements TreeModel,AutomatedTreeNodeListener {
|
|
|
|
List<TreeModelListener> treeModelListeners;
|
|
AutomatedTreeNode root;
|
|
|
|
public AutomatedTreeModel() {
|
|
treeModelListeners = new LinkedList<>();
|
|
this.root = new InternalRootNode();
|
|
this.root.addAutomatedTreeNodeListener(this);
|
|
}
|
|
|
|
public AutomatedTreeModel(AutomatedTreeNode root) {
|
|
treeModelListeners = new LinkedList<>();
|
|
this.root = root;
|
|
this.root.addAutomatedTreeNodeListener(this);
|
|
}
|
|
|
|
@Override
|
|
public Object getRoot() {
|
|
return this.root;
|
|
}
|
|
public void setRoot(AutomatedTreeNode root) {
|
|
this.root.removeAutomatedTreeNodeListener(this);
|
|
this.root = root;
|
|
this.root.addAutomatedTreeNodeListener(this);
|
|
fireTreeStructureChanged(new TreeModelEvent(this.root, new Object[]{ this.root }));
|
|
}
|
|
|
|
@Override
|
|
public void addTreeModelListener(TreeModelListener l) {
|
|
treeModelListeners.add(l);
|
|
}
|
|
@Override
|
|
public void removeTreeModelListener(TreeModelListener l) {
|
|
treeModelListeners.remove(l);
|
|
}
|
|
|
|
@Override
|
|
public Object getChild(Object parent, int index) {
|
|
AutomatedTreeNode node = (AutomatedTreeNode)parent;
|
|
return node.getChild(index);
|
|
}
|
|
|
|
@Override
|
|
public int getChildCount(Object parent) {
|
|
AutomatedTreeNode node = (AutomatedTreeNode)parent;
|
|
return node.getChildren().length;
|
|
}
|
|
|
|
@Override
|
|
public int getIndexOfChild(Object parent, Object child) {
|
|
AutomatedTreeNode node = (AutomatedTreeNode)parent;
|
|
return node.getIndexOfChild((AutomatedTreeNode)child);
|
|
}
|
|
|
|
@Override
|
|
public boolean isLeaf(Object parent) {
|
|
AutomatedTreeNode node = (AutomatedTreeNode)parent;
|
|
return node.getChildren().length > 0 ? false : true;
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
public void valueForPathChanged(TreePath path, Object newValue) {
|
|
System.err.println("valueForPathChanged(...)");
|
|
}
|
|
|
|
|
|
public class InternalRootNode extends AutomatedTreeNode {
|
|
|
|
public InternalRootNode() {
|
|
super(null);
|
|
}
|
|
|
|
@Override
|
|
public int compareTo(AutomatedTreeNode o) {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "ROOT NODE";
|
|
}
|
|
|
|
};
|
|
|
|
@Override
|
|
public void childInserted(AutomatedTreeNode node, AutomatedTreeNode child) {
|
|
TreeModelEvent tme = new TreeModelEvent(
|
|
node,
|
|
node.getPath(),
|
|
new int[]{ node.getIndexOfChild( child ) },
|
|
new Object[]{ child }
|
|
);
|
|
|
|
System.err.println(String.format("childInserted: %s [ %d = %s ]",StringHelper.join(Arrays.asList(tme.getPath()), "." ),tme.getChildIndices()[0],tme.getChildren()[0] ));
|
|
|
|
fireTreeNodesInserted(tme);
|
|
}
|
|
|
|
@Override
|
|
public void childRemoved(AutomatedTreeNode node, AutomatedTreeNode child, int index) {
|
|
TreeModelEvent tme = new TreeModelEvent(
|
|
node,
|
|
node.getPath(),
|
|
new int[]{ index },
|
|
new Object[]{ child }
|
|
);
|
|
|
|
System.err.println(String.format("childRemoved: %s [ %d = %s ]",StringHelper.join(Arrays.asList(tme.getPath()), "." ),tme.getChildIndices()[0],tme.getChildren()[0].toString() ));
|
|
|
|
fireTreeNodesRemoved(tme);
|
|
}
|
|
|
|
private void fireTreeNodesChanged(TreeModelEvent e){
|
|
for (TreeModelListener l: this.treeModelListeners)
|
|
l.treeNodesChanged(e);
|
|
}
|
|
|
|
private void fireTreeNodesInserted(TreeModelEvent e){
|
|
for (TreeModelListener l: this.treeModelListeners)
|
|
l.treeNodesInserted(e);
|
|
}
|
|
|
|
private void fireTreeNodesRemoved(TreeModelEvent e){
|
|
for (TreeModelListener l: this.treeModelListeners)
|
|
l.treeNodesRemoved(e);
|
|
}
|
|
|
|
private void fireTreeStructureChanged(TreeModelEvent e){
|
|
for (TreeModelListener l: this.treeModelListeners)
|
|
l.treeStructureChanged(e);
|
|
}
|
|
|
|
}
|