1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.tree.model;
20
21 import org.apache.myfaces.custom.tree.DefaultMutableTreeNode;
22 import org.apache.myfaces.custom.tree.MutableTreeNode;
23 import org.apache.myfaces.custom.tree.TreeNode;
24
25 import java.io.Serializable;
26 import java.util.Iterator;
27 import java.util.Collection;
28 import java.util.LinkedList;
29
30
31
32
33
34
35 public class DefaultTreeModel
36 implements TreeModel, Serializable
37 {
38
39 private TreeNode root;
40 private LinkedList listeners = new LinkedList();
41
42
43 public DefaultTreeModel()
44 {
45 this(new DefaultMutableTreeNode("Root"));
46 }
47
48
49 public DefaultTreeModel(TreeNode root)
50 {
51 this.root = root;
52 }
53
54
55 public Object getRoot()
56 {
57 return root;
58 }
59
60
61 public Object getChild(Object parent, int index)
62 {
63 return ((TreeNode)parent).getChildAt(index);
64 }
65
66
67 public int getChildCount(Object parent)
68 {
69 return ((TreeNode)parent).getChildCount();
70 }
71
72
73 public boolean isLeaf(Object node)
74 {
75 return ((TreeNode)node).isLeaf();
76 }
77
78
79 public void valueForPathChanged(TreePath path, Object newValue)
80 {
81 MutableTreeNode node = (MutableTreeNode)path.getLastPathComponent();
82
83 node.setUserObject(newValue);
84 }
85
86
87 public int getIndexOfChild(Object parent, Object child)
88 {
89 return ((TreeNode)parent).getIndex((TreeNode)child);
90 }
91
92
93 public Collection getTreeModelListeners()
94 {
95 return listeners;
96 }
97
98
99
100
101
102
103 public void nodeChanged(TreeNode node)
104 {
105 if (listeners.isEmpty())
106 {
107
108 return;
109 }
110
111 if (node != null)
112 {
113 TreeNode parent = node.getParent();
114
115 if (parent != null)
116 {
117 int index = parent.getIndex(node);
118 if (index != -1)
119 {
120 int[] childIndices = new int[1];
121
122 childIndices[0] = index;
123 nodesChanged(parent, childIndices);
124 }
125 }
126 else if (node == getRoot())
127 {
128 nodesChanged(node, null);
129 }
130 }
131 }
132
133
134
135
136
137
138 public void nodesChanged(TreeNode node, int[] childIndices)
139 {
140 if (listeners.isEmpty())
141 {
142
143 return;
144 }
145
146 if (node != null)
147 {
148 if (childIndices != null)
149 {
150 int count = childIndices.length;
151
152 if (count > 0)
153 {
154 Object[] children = new Object[count];
155
156 for (int i = 0; i < count; i++)
157 {
158 children[i] = node.getChildAt(childIndices[i]);
159 }
160 fireTreeNodesChanged(this, getPathToRoot(node), childIndices, children);
161 }
162 }
163 else if (node == root)
164 {
165 fireTreeNodesChanged(this, getPathToRoot(node), null, null);
166 }
167 }
168 }
169
170
171
172
173
174
175
176 public void nodeStructureChanged(TreeNode node)
177 {
178 if (listeners.isEmpty())
179 {
180
181 return;
182 }
183
184 if (node != null)
185 {
186 fireTreeStructureChanged(this, getPathToRoot(node), null, null);
187 }
188 }
189
190
191
192
193
194
195
196 public void nodesWereInserted(TreeNode node, int[] childIndices)
197 {
198 if (listeners.isEmpty())
199 {
200
201 return;
202 }
203 if (node != null && childIndices != null && childIndices.length > 0)
204 {
205 int cCount = childIndices.length;
206 Object[] newChildren = new Object[cCount];
207
208 for (int counter = 0; counter < cCount; counter++)
209 {
210 newChildren[counter] = node.getChildAt(childIndices[counter]);
211 }
212 fireTreeNodesInserted(this, getPathToRoot(node), childIndices,
213 newChildren);
214 }
215 }
216
217
218
219
220
221
222
223
224 public void nodesWereRemoved(TreeNode node, int[] childIndices, Object[] removedChildren)
225 {
226 if (listeners.isEmpty())
227 {
228
229 return;
230 }
231 if (node != null && childIndices != null)
232 {
233 fireTreeNodesRemoved(this, getPathToRoot(node), childIndices, removedChildren);
234 }
235 }
236
237
238
239
240
241
242
243 public TreeNode[] getPathToRoot(TreeNode node)
244 {
245 return getPathToRoot(node, 0);
246 }
247
248
249
250
251
252
253
254
255
256 protected TreeNode[] getPathToRoot(TreeNode node, int depth)
257 {
258 TreeNode[] answer;
259
260 if (node == null)
261 {
262 if (depth == 0)
263 {
264
265 return null;
266 }
267 else
268 {
269
270 answer = new TreeNode[depth];
271 }
272 }
273 else
274 {
275
276 depth++;
277
278 if (node == root)
279 {
280
281 answer = new TreeNode[depth];
282 }
283 else
284 {
285 answer = getPathToRoot(node.getParent(), depth);
286 }
287 answer[answer.length - depth] = node;
288 }
289 return answer;
290 }
291
292
293
294
295
296
297
298
299
300
301 protected void fireTreeNodesChanged(Object source, Object[] path, int[] childIndices, Object[] children)
302 {
303 TreeModelEvent event = null;
304 for (Iterator iterator = listeners.iterator(); iterator.hasNext();)
305 {
306 TreeModelListener listener = (TreeModelListener)iterator.next();
307 if (event == null)
308 {
309 event = new TreeModelEvent(source, path, childIndices, children);
310 }
311 listener.treeNodesChanged(event);
312 }
313 }
314
315
316
317
318
319
320
321
322
323
324 protected void fireTreeNodesInserted(Object source, Object[] path, int[] childIndices, Object[] children)
325 {
326 TreeModelEvent event = null;
327 for (Iterator iterator = listeners.iterator(); iterator.hasNext();)
328 {
329 TreeModelListener listener = (TreeModelListener)iterator.next();
330 if (event == null)
331 {
332 event = new TreeModelEvent(source, path, childIndices, children);
333 }
334 listener.treeNodesInserted(event);
335 }
336 }
337
338
339
340
341
342
343
344
345
346
347 protected void fireTreeNodesRemoved(Object source, Object[] path, int[] childIndices, Object[] children)
348 {
349 TreeModelEvent event = null;
350 for (Iterator iterator = listeners.iterator(); iterator.hasNext();)
351 {
352 TreeModelListener listener = (TreeModelListener)iterator.next();
353 if (event == null)
354 {
355 event = new TreeModelEvent(source, path, childIndices, children);
356 }
357 listener.treeNodesRemoved(event);
358 }
359 }
360
361
362
363
364
365
366
367
368
369
370 protected void fireTreeStructureChanged(Object source, Object[] path, int[] childIndices, Object[] children)
371 {
372 TreeModelEvent event = null;
373 for (Iterator iterator = listeners.iterator(); iterator.hasNext();)
374 {
375 TreeModelListener listener = (TreeModelListener)iterator.next();
376 if (event == null)
377 {
378 event = new TreeModelEvent(source, path, childIndices, children);
379 }
380 listener.treeStructureChanged(event);
381 }
382 }
383
384
385
386
387
388
389
390
391 protected void fireTreeStructureChanged(Object source, TreePath path)
392 {
393 TreeModelEvent event = null;
394 for (Iterator iterator = listeners.iterator(); iterator.hasNext();)
395 {
396 TreeModelListener listener = (TreeModelListener)iterator.next();
397 if (event == null)
398 {
399 event = new TreeModelEvent(source, path);
400 }
401 listener.treeStructureChanged(event);
402 }
403 }
404
405 }