java-org.hwo.ui/src/org/hwo/ui/tree/AutomatedTreeModel.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);
}
}