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 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.isContainer(); } @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); } }