KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > swingwtx > swing > tree > DefaultTreeModel


1 /*
2    SwingWT
3    Copyright(c)2003-2004, R. Rawson-Tetley
4
5    For more information on distributing and using this program, please
6    see the accompanying "COPYING" file.
7
8    Contact me by electronic mail: bobintetley@users.sourceforge.net
9
10    $Log: DefaultTreeModel.java,v $
11    Revision 1.6 2004/05/04 11:17:40 bobintetley
12    (Laurent Martell) DefaultMutableTreeNode/DefaultTreeModel fixes
13
14    Revision 1.5 2004/03/26 12:04:43 bobintetley
15    Fixed bug in TreeModel that caused events not to fire down to JTree
16
17    Revision 1.4 2003/12/14 09:13:39 bobintetley
18    Added CVS log to source headers
19
20 */

21
22 package swingwtx.swing.tree;
23
24 import swingwtx.swing.event.EventListenerList;
25 import swingwtx.swing.event.TreeModelEvent;
26 import swingwtx.swing.event.TreeModelListener;
27
28 public class DefaultTreeModel implements TreeModel {
29     
30     protected TreeNode root;
31     protected EventListenerList listenerList = new EventListenerList();
32     protected boolean asksAllowsChildren;
33
34     public DefaultTreeModel(TreeNode root) {
35         this(root, false);
36     }
37
38     public DefaultTreeModel(TreeNode root, boolean asksAllowsChildren) {
39         super();
40         this.root = root;
41         this.asksAllowsChildren = asksAllowsChildren;
42     }
43
44     public void setRoot(TreeNode root) {
45         Object JavaDoc lastRoot = this.root;
46     this.root = root;
47         if (root == null && lastRoot != null) {
48             fireTreeStructureChanged(this, null, null, null);
49         }
50         else {
51             nodeStructureChanged(root);
52         }
53     }
54
55     public Object JavaDoc getRoot() {
56         return root;
57     }
58
59     public int getIndexOfChild(Object JavaDoc parent, Object JavaDoc child) {
60         if(parent == null || child == null)
61             return -1;
62         return ((TreeNode) parent).getIndex((TreeNode) child);
63     }
64
65     public void setAsksAllowsChildren(boolean newValue) {
66         asksAllowsChildren = newValue;
67     }
68
69     public boolean asksAllowsChildren() {
70         return asksAllowsChildren;
71     }
72     
73     public Object JavaDoc getChild(Object JavaDoc parent, int index) {
74         return ((TreeNode) parent).getChildAt(index);
75     }
76
77     public int getChildCount(Object JavaDoc parent) {
78         return ((TreeNode) parent).getChildCount();
79     }
80
81     public boolean isLeaf(Object JavaDoc node) {
82         if(asksAllowsChildren)
83             return !((TreeNode) node).getAllowsChildren();
84         return ((TreeNode)node).isLeaf();
85     }
86
87     public void reload() {
88         reload(root);
89     }
90     
91     public void reload(TreeNode node) {
92         fireTreeStructureChanged(this, getPathToRoot(node), null, null);
93     }
94
95     public void valueForPathChanged(TreePath path, Object JavaDoc newValue) {
96     MutableTreeNode node = (MutableTreeNode) path.getLastPathComponent();
97         node.setUserObject(newValue);
98         nodeChanged(node);
99     }
100
101     public void insertNodeInto(MutableTreeNode newChild,
102                                MutableTreeNode parent, int index){
103         parent.insert(newChild, index);
104         int[] newIndexs = new int[1];
105         newIndexs[0] = index;
106         nodesWereInserted(parent, newIndexs);
107     }
108
109     public void removeNodeFromParent(MutableTreeNode node) {
110         MutableTreeNode parent = (MutableTreeNode)node.getParent();
111         int[] childIndex = new int[1];
112         Object JavaDoc[] removedArray = new Object JavaDoc[1];
113         childIndex[0] = parent.getIndex(node);
114         parent.remove(childIndex[0]);
115         removedArray[0] = node;
116         nodesWereRemoved(parent, childIndex, removedArray);
117     }
118
119     public void nodeChanged(TreeNode node) {
120         if( listenerList.getListenerCount() > 0 && node != null) {
121             TreeNode parent = node.getParent();
122             if(parent != null) {
123                 int anIndex = parent.getIndex(node);
124                 if(anIndex != -1) {
125                     int[] cIndexs = new int[1];
126                     cIndexs[0] = anIndex;
127                     nodesChanged(parent, cIndexs);
128                 }
129             }
130         else if (node == getRoot()) {
131         nodesChanged(node, null);
132         }
133         }
134     }
135
136     public void nodesWereInserted(TreeNode node, int[] childIndices) {
137         if(listenerList.getListenerCount() > 0 && node != null && childIndices != null
138            && childIndices.length > 0) {
139             int cCount = childIndices.length;
140             Object JavaDoc[] newChildren = new Object JavaDoc[cCount];
141             for(int counter = 0; counter < cCount; counter++)
142                 newChildren[counter] = node.getChildAt(childIndices[counter]);
143             fireTreeNodesInserted(this, getPathToRoot(node), childIndices,
144                                   newChildren);
145         }
146     }
147     
148     public void nodesWereRemoved(TreeNode node, int[] childIndices,
149                                  Object JavaDoc[] removedChildren) {
150         if(node != null && childIndices != null) {
151             fireTreeNodesRemoved(this, getPathToRoot(node), childIndices, removedChildren);
152         }
153     }
154
155     public void nodesChanged(TreeNode node, int[] childIndices) {
156         if(node != null) {
157         if (childIndices != null) {
158         int cCount = childIndices.length;
159         if(cCount > 0) {
160             Object JavaDoc[] cChildren = new Object JavaDoc[cCount];
161             for(int counter = 0; counter < cCount; counter++)
162             cChildren[counter] = node.getChildAt
163                 (childIndices[counter]);
164             fireTreeNodesChanged(this, getPathToRoot(node), childIndices, cChildren);
165         }
166         }
167         else if (node == getRoot()) {
168         fireTreeNodesChanged(this, getPathToRoot(node), null, null);
169         }
170         }
171     }
172
173     public void nodeStructureChanged(TreeNode node) {
174         if(node != null) {
175            fireTreeStructureChanged(this, getPathToRoot(node), null, null);
176         }
177     }
178
179     public TreeNode[] getPathToRoot(TreeNode aNode) {
180         return getPathToRoot(aNode, 0);
181     }
182
183     protected TreeNode[] getPathToRoot(TreeNode aNode, int depth) {
184         TreeNode[] nodes;
185         if(aNode == null) {
186             if(depth == 0)
187                 return null;
188             else
189                 nodes = new TreeNode[depth];
190         }
191         else {
192             depth++;
193             if(aNode == root)
194                 nodes = new TreeNode[depth];
195             else
196                 nodes = getPathToRoot(aNode.getParent(), depth);
197             nodes[nodes.length - depth] = aNode;
198         }
199         return nodes;
200     }
201     
202
203     public Object JavaDoc[] getListeners(Class JavaDoc listenerType) {
204      return listenerList.getListeners(listenerType);
205     }
206
207     public void addTreeModelListener(TreeModelListener l) {
208         listenerList.add(TreeModelListener.class, l);
209     }
210
211     public void removeTreeModelListener(TreeModelListener l) {
212         listenerList.remove(TreeModelListener.class, l);
213     }
214
215     public TreeModelListener[] getTreeModelListeners() {
216         return (TreeModelListener[]) listenerList.getListeners(TreeModelListener.class);
217     }
218
219     protected void fireTreeNodesInserted(Object JavaDoc source, Object JavaDoc[] path,
220                                         int[] childIndices,
221                                         Object JavaDoc[] children) {
222         Object JavaDoc[] listenerz = getTreeModelListeners();
223         TreeModelEvent e = new TreeModelEvent(source, path, childIndices, children);
224         for (int i = 0; i< listenerz.length; i++) {
225             ((TreeModelListener) listenerz[i]).treeNodesInserted(e);
226         }
227     }
228     
229     protected void fireTreeNodesChanged(Object JavaDoc source, Object JavaDoc[] path,
230                                         int[] childIndices,
231                                         Object JavaDoc[] children) {
232         Object JavaDoc[] listenerz = getTreeModelListeners();
233         TreeModelEvent e = new TreeModelEvent(source, path, childIndices, children);
234         for (int i = 0; i< listenerz.length; i++) {
235             ((TreeModelListener) listenerz[i]).treeNodesChanged(e);
236         }
237     }
238
239     protected void fireTreeNodesRemoved(Object JavaDoc source, Object JavaDoc[] path,
240                                         int[] childIndices,
241                                         Object JavaDoc[] children) {
242         Object JavaDoc[] listenerz = getTreeModelListeners();
243         TreeModelEvent e = new TreeModelEvent(source, path, childIndices, children);
244         for (int i = 0; i< listenerz.length; i++) {
245             ((TreeModelListener) listenerz[i]).treeNodesRemoved(e);
246         }
247         
248     }
249
250     protected void fireTreeStructureChanged(Object JavaDoc source, Object JavaDoc[] path,
251                                         int[] childIndices,
252                                         Object JavaDoc[] children) {
253         Object JavaDoc[] listenerz = getTreeModelListeners();
254         TreeModelEvent e = new TreeModelEvent(source, path, childIndices, children);
255         for (int i = 0; i< listenerz.length; i++) {
256             ((TreeModelListener) listenerz[i]).treeStructureChanged(e);
257         }
258     }
259
260
261 }
262
Popular Tags