KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > dom4j > swing > BranchTreeNode


1 /*
2  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3  *
4  * This software is open source.
5  * See the bottom of this file for the licence.
6  */

7
8 package org.dom4j.swing;
9
10 import java.util.ArrayList JavaDoc;
11 import java.util.Enumeration JavaDoc;
12 import java.util.List JavaDoc;
13
14 import javax.swing.tree.TreeNode JavaDoc;
15
16 import org.dom4j.Branch;
17 import org.dom4j.CharacterData;
18 import org.dom4j.Node;
19
20 /**
21  * <p>
22  * <code>BranchTreeNode</code> implements the Swing TreeNode interface to bind
23  * dom4j XML Branch nodes (i.e. Document and Element nodes) to a Swing
24  * TreeModel.
25  * </p>
26  *
27  * @author <a HREF="mailto:james.strachan@metastuff.com">James Strachan </a>
28  * @author Jakob Jenkov
29  * @version $Revision: 1.10 $
30  */

31 public class BranchTreeNode extends LeafTreeNode {
32     /** Stores the child tree nodes */
33     protected List JavaDoc children;
34
35     public BranchTreeNode() {
36     }
37
38     public BranchTreeNode(Branch xmlNode) {
39         super(xmlNode);
40     }
41
42     public BranchTreeNode(TreeNode JavaDoc parent, Branch xmlNode) {
43         super(parent, xmlNode);
44     }
45
46     // TreeNode methods
47
// -------------------------------------------------------------------------
48
public Enumeration JavaDoc children() {
49         return new Enumeration JavaDoc() {
50             private int index = -1;
51
52             public boolean hasMoreElements() {
53                 return (index + 1) < getChildCount();
54             }
55
56             public Object JavaDoc nextElement() {
57                 return getChildAt(++index);
58             }
59         };
60     }
61
62     public boolean getAllowsChildren() {
63         return true;
64     }
65
66     public TreeNode JavaDoc getChildAt(int childIndex) {
67         return (TreeNode JavaDoc) getChildList().get(childIndex);
68     }
69
70     public int getChildCount() {
71         return getChildList().size();
72     }
73
74     public int getIndex(TreeNode JavaDoc node) {
75         return getChildList().indexOf(node);
76     }
77
78     public boolean isLeaf() {
79         return getXmlBranch().nodeCount() <= 0;
80     }
81
82     public String JavaDoc toString() {
83         return xmlNode.getName();
84     }
85
86     // Implementation methods
87
// -------------------------------------------------------------------------
88

89     /**
90      * Uses Lazy Initialization pattern to create a List of children
91      *
92      * @return DOCUMENT ME!
93      */

94     protected List JavaDoc getChildList() {
95         // for now lets just create the children once, the first time they
96
// are asked for.
97
// XXXX - we may wish to detect inconsistencies here....
98
if (children == null) {
99             children = createChildList();
100         }
101
102         return children;
103     }
104
105     /**
106      * Factory method to create List of children TreeNodes
107      *
108      * @return DOCUMENT ME!
109      */

110     protected List JavaDoc createChildList() {
111         // add attributes and content as children?
112
Branch branch = getXmlBranch();
113         int size = branch.nodeCount();
114         List JavaDoc childList = new ArrayList JavaDoc(size);
115
116         for (int i = 0; i < size; i++) {
117             Node JavaDoc node = branch.node(i);
118
119             // ignore whitespace text nodes
120
if (node instanceof CharacterData) {
121                 String JavaDoc text = node.getText();
122
123                 if (text == null) {
124                     continue;
125                 }
126
127                 text = text.trim();
128
129                 if (text.length() <= 0) {
130                     continue;
131                 }
132             }
133
134             childList.add(createChildTreeNode(node));
135         }
136
137         return childList;
138     }
139
140     /**
141      * Factory method to create child tree nodes for a given XML node type
142      *
143      * @param xmlNode
144      * DOCUMENT ME!
145      *
146      * @return DOCUMENT ME!
147      */

148     protected TreeNode JavaDoc createChildTreeNode(Node JavaDoc xmlNode) {
149         if (xmlNode instanceof Branch) {
150             return new BranchTreeNode(this, (Branch) xmlNode);
151         } else {
152             return new LeafTreeNode(this, xmlNode);
153         }
154     }
155
156     protected Branch getXmlBranch() {
157         return (Branch) xmlNode;
158     }
159 }
160
161 /*
162  * Redistribution and use of this software and associated documentation
163  * ("Software"), with or without modification, are permitted provided that the
164  * following conditions are met:
165  *
166  * 1. Redistributions of source code must retain copyright statements and
167  * notices. Redistributions must also contain a copy of this document.
168  *
169  * 2. Redistributions in binary form must reproduce the above copyright notice,
170  * this list of conditions and the following disclaimer in the documentation
171  * and/or other materials provided with the distribution.
172  *
173  * 3. The name "DOM4J" must not be used to endorse or promote products derived
174  * from this Software without prior written permission of MetaStuff, Ltd. For
175  * written permission, please contact dom4j-info@metastuff.com.
176  *
177  * 4. Products derived from this Software may not be called "DOM4J" nor may
178  * "DOM4J" appear in their names without prior written permission of MetaStuff,
179  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
180  *
181  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
182  *
183  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
184  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
185  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
186  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
187  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
188  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
189  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
190  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
191  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
192  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
193  * POSSIBILITY OF SUCH DAMAGE.
194  *
195  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
196  */

197
Popular Tags