KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tonbeller > wcf > tree > FilteringTreeModelDecorator


1 /*
2  * ====================================================================
3  * This software is subject to the terms of the Common Public License
4  * Agreement, available at the following URL:
5  * http://www.opensource.org/licenses/cpl.html .
6  * Copyright (C) 2003-2004 TONBELLER AG.
7  * All Rights Reserved.
8  * You must accept the terms of that agreement to use this software.
9  * ====================================================================
10  *
11  *
12  */

13 package com.tonbeller.wcf.tree;
14
15 import java.util.ArrayList JavaDoc;
16 import java.util.List JavaDoc;
17
18 /**
19  * uses a <code>NodeFilter</code> to select the visible nodes
20  */

21 public class FilteringTreeModelDecorator implements TreeModel, DecoratedTreeModel {
22   TreeModel decoree;
23   NodeFilter filter;
24   
25   /**
26    * tree nodes that are accepted by this filter are assumed to have
27    * always children. So hasChildren() returns always true and does
28    * not call getChildren()
29    */

30   NodeFilter hasAlwaysChildren = NodeFilter.TRUE_FILTER;
31
32   public FilteringTreeModelDecorator(TreeModel decoree, NodeFilter filter) {
33     this.decoree = decoree;
34     this.filter = filter;
35   }
36
37   public FilteringTreeModelDecorator(TreeModel decoree, NodeFilter filter, NodeFilter hasAlwaysChildren) {
38     this.decoree = decoree;
39     this.filter = filter;
40     this.hasAlwaysChildren = hasAlwaysChildren;
41   }
42   
43   public Object JavaDoc[] getRoots() {
44     return acceptableMembers(decoree.getRoots());
45   }
46
47   public boolean hasChildren(Object JavaDoc node) {
48     if (!decoree.hasChildren(node))
49       return false;
50     if(hasAlwaysChildren.accept(node))
51       return true;
52
53     return hasAcceptableMember(decoree.getChildren(node));
54   }
55
56   public Object JavaDoc[] getChildren(Object JavaDoc node) {
57     return acceptableMembers(decoree.getChildren(node));
58   }
59
60   public Object JavaDoc getParent(Object JavaDoc node) {
61     return decoree.getParent(node);
62   }
63
64   boolean hasAcceptableMember(Object JavaDoc[] array) {
65     for (int i = 0; i < array.length; i++)
66       if (filter.accept(array[i]))
67         return true;
68     return false;
69   }
70
71   Object JavaDoc[] acceptableMembers(Object JavaDoc[] array) {
72     List JavaDoc accepted = new ArrayList JavaDoc();
73     for (int i = 0; i < array.length; i++)
74       if (filter.accept(array[i]))
75         accepted.add(array[i]);
76     return accepted.toArray();
77   }
78
79   public TreeModel getDecoree() {
80     return decoree;
81   }
82
83   public NodeFilter getFilter() {
84     return filter;
85   }
86
87   public void setDecoree(TreeModel model) {
88     decoree = model;
89   }
90
91   public void setFilter(NodeFilter filter) {
92     this.filter = filter;
93   }
94
95   public void addTreeModelChangeListener(TreeModelChangeListener l) {
96     decoree.addTreeModelChangeListener(l);
97   }
98
99   public void removeTreeModelChangeListener(TreeModelChangeListener l) {
100     decoree.removeTreeModelChangeListener(l);
101   }
102
103   public void fireModelChanged(boolean identityChanged) {
104     decoree.fireModelChanged(identityChanged);
105   }
106
107   /**
108    * tree nodes that are accepted by this filter are assumed to have
109    * always children. So hasChildren() returns always true and does
110    * not call getChildren()
111    */

112   public NodeFilter getHasAlwaysChildren() {
113     return hasAlwaysChildren;
114   }
115   /**
116    * tree nodes that are accepted by this filter are assumed to have
117    * always children. So hasChildren() returns always true and does
118    * not call getChildren()
119    */

120   public void setHasAlwaysChildren(NodeFilter hasAlwaysChildren) {
121     this.hasAlwaysChildren = hasAlwaysChildren;
122   }
123 }
124
Popular Tags