1
22 package org.crosswire.bibledesktop.passage;
23
24 import java.util.Enumeration;
25
26 import javax.swing.tree.TreeNode;
27
28 import org.crosswire.bibledesktop.BDMsg;
29 import org.crosswire.common.icu.NumberShaper;
30 import org.crosswire.jsword.passage.Verse;
31 import org.crosswire.jsword.passage.VerseRange;
32 import org.crosswire.jsword.versification.BibleBook;
33 import org.crosswire.jsword.versification.Versification;
34 import org.crosswire.jsword.versification.system.Versifications;
35
36
43 public final class WholeBibleTreeNode implements TreeNode {
44
47 public static WholeBibleTreeNode getRootNode() {
48 Versification v11n = Versifications.instance().getDefaultVersification();
50 return new WholeBibleTreeNode(null, v11n.getAllVerses(), Level.BIBLE);
51 }
52
53
56 protected static WholeBibleTreeNode getNode(TreeNode parent, BibleBook b, int c, int v) {
57 Versification v11n = Versifications.instance().getDefaultVersification();
59 Verse start = null;
60 Verse end = null;
61 Level thislevel = Level.BOOK;
62
63 if (b == null) {
64 assert false : "BibleBook is null";
65 } else if (c == -1) {
66 thislevel = Level.BOOK;
67 int ec = v11n.getLastChapter(b);
68 int ev = v11n.getLastVerse(b, ec);
69 start = new Verse(b, 0, 0);
70 end = new Verse(b, ec, ev);
71 } else if (v == -1) {
72 thislevel = Level.CHAPTER;
73 int ev = v11n.getLastVerse(b, c);
74 start = new Verse(b, c, 0);
75 end = new Verse(b, c, ev);
76 } else {
77 thislevel = Level.VERSE;
78 start = new Verse(b, c, v);
79 end = start;
80 }
81
82 VerseRange rng = new VerseRange(v11n, start, end);
83 return new WholeBibleTreeNode(parent, rng, thislevel);
84 }
85
86
89 private WholeBibleTreeNode(TreeNode parent, VerseRange range, Level level) {
90 if (parent != null) {
91 this.parent = parent;
92 } else {
93 this.parent = this;
94 }
95
96 this.range = range;
97 this.level = level;
98 shaper = new NumberShaper();
99 }
100
101
104 public VerseRange getVerseRange() {
105 return range;
106 }
107
108
111 public TreeNode getParent() {
112 return parent;
113 }
114
115
118 public boolean getAllowsChildren() {
119 return level != Level.VERSE;
120 }
121
122
125 public boolean isLeaf() {
126 return level == Level.VERSE;
127 }
128
129
132 @Override
133 public String toString() {
134 switch (level) {
135 case BIBLE:
136 return BDMsg.gettext("The Bible");
138
139 case BOOK:
140 return range.getStart().getBook().getPreferredName();
141
142 case CHAPTER:
143 return shaper.shape(Integer.toString(range.getStart().getChapter()));
144
145 case VERSE:
146 return shaper.shape(Integer.toString(range.getStart().getVerse()));
147
148 default:
149 return BDMsg.gettext("Error");
151 }
152 }
153
154
157 public TreeNode getChildAt(int i) {
158 switch (level) {
159 case BIBLE:
160 return WholeBibleTreeNode.getNode(this, rs.getBooks().getBook(i), -1, -1);
161
162 case BOOK:
163 return WholeBibleTreeNode.getNode(this, range.getStart().getBook(), i, -1);
164
165 case CHAPTER:
166 return WholeBibleTreeNode.getNode(this, range.getStart().getBook(), range.getStart().getChapter(), i);
167
168 default:
169 return null;
170 }
171 }
172
173
177 public int getChildCount() {
178 switch (level) {
179 case BIBLE:
180 return rs.getBooks().getBookCount();
181
182 case BOOK:
183 return rs.getLastChapter(range.getStart().getBook()) + 1;
184
185 case CHAPTER:
186 return rs.getLastVerse(range.getStart().getBook(), range.getStart().getChapter()) + 1;
187
188 default:
189 return 0;
190 }
191 }
192
193
197 public int getIndex(TreeNode node) {
198 if (!(node instanceof WholeBibleTreeNode)) {
199 return 0;
200 }
201
202 WholeBibleTreeNode vnode = (WholeBibleTreeNode) node;
203
204 switch (level) {
205 case BIBLE:
206 return vnode.getVerseRange().getStart().getBook().ordinal();
208
209 case BOOK:
210 return vnode.getVerseRange().getStart().getChapter();
211
212 case CHAPTER:
213 return vnode.getVerseRange().getStart().getVerse();
214
215 default:
216 return 0;
217 }
218 }
219
220
223 public Enumeration<TreeNode> children() {
224 return new WholeBibleEnumeration(this);
225 }
226
227
230 private class WholeBibleEnumeration implements Enumeration<TreeNode> {
231 public WholeBibleEnumeration(WholeBibleTreeNode treeNode) {
232 this.treeNode = treeNode;
233 }
234 public boolean hasMoreElements() {
235 return count < treeNode.getChildCount();
236 }
237
238 public TreeNode nextElement() {
239 count++;
240 return treeNode.getChildAt(count);
241 }
242
243 private WholeBibleTreeNode treeNode;
244 private int count;
245 }
246
247
250 private enum Level {
251 BIBLE,
252 BOOK,
253 CHAPTER,
254 VERSE,
255 }
256
257 private Versification rs = Versifications.instance().getDefaultVersification();
259
260
261 private NumberShaper shaper;
262
263
264 private VerseRange range;
265
266
267 private TreeNode parent;
268
269
270 private Level level;
271 }
272