1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.myfaces.trinidad.component;
23
24 import java.io.IOException;
25 import javax.el.MethodExpression;
26 import javax.faces.component.UIComponent;
27 import javax.faces.component.visit.VisitCallback;
28 import javax.faces.component.visit.VisitContext;
29 import javax.faces.component.visit.VisitHint;
30 import javax.faces.context.FacesContext;
31 import javax.faces.event.AbortProcessingException;
32 import javax.faces.event.FacesEvent;
33 import javax.faces.event.PhaseId;
34 import org.apache.myfaces.trinidad.bean.FacesBean;
35 import org.apache.myfaces.trinidad.bean.PropertyKey;
36 import org.apache.myfaces.trinidad.event.RowDisclosureListener;
37 import org.apache.myfaces.trinidad.model.CollectionModel;
38 import org.apache.myfaces.trinidad.model.RowKeySet;
39 import org.apache.myfaces.trinidad.model.RowKeySetTreeImpl;
40 import org.apache.myfaces.trinidad.model.TreeModel;
41 import org.apache.myfaces.trinidad.util.ComponentUtils;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public class UIXNavigationTree extends UIXNavigationHierarchy
71 {
72 static public final FacesBean.Type TYPE = new FacesBean.Type(
73 UIXNavigationHierarchy.TYPE);
74 static public final PropertyKey ROW_DISCLOSURE_LISTENER_KEY =
75 TYPE.registerKey("rowDisclosureListener", MethodExpression.class);
76 static public final PropertyKey DISCLOSED_ROW_KEYS_KEY =
77 TYPE.registerKey("disclosedRowKeys", RowKeySet.class);
78 static public final PropertyKey VALUE_KEY =
79 TYPE.registerKey("value");
80 static public final PropertyKey START_LEVEL_KEY =
81 TYPE.registerKey("startLevel", Integer.class, Integer.valueOf(0));
82 static public final PropertyKey VAR_STATUS_KEY =
83 TYPE.registerKey("varStatus", String.class, PropertyKey.CAP_NOT_BOUND);
84 static public final PropertyKey IMMEDIATE_KEY =
85 TYPE.registerKey("immediate", Boolean.class, Boolean.FALSE);
86 static public final String NODE_STAMP_FACET = "nodeStamp";
87
88 static public final String COMPONENT_FAMILY =
89 "org.apache.myfaces.trinidad.NavigationTree";
90 static public final String COMPONENT_TYPE =
91 "org.apache.myfaces.trinidad.NavigationTree";
92
93
94
95
96 public UIXNavigationTree()
97 {
98 super("org.apache.myfaces.trinidad.NavigationTree");
99 }
100
101
102
103
104 @Override
105 public void queueEvent(FacesEvent event)
106 {
107 TableUtils.__handleQueueEvent(this, event);
108 super.queueEvent(event);
109 }
110
111
112
113
114
115
116 @Override
117 public void broadcast(FacesEvent event) throws AbortProcessingException
118 {
119 HierarchyUtils.__handleBroadcast(this,
120 event,
121 getDisclosedRowKeys(),
122 getRowDisclosureListener());
123 super.broadcast(event);
124 }
125
126 @Override
127 @SuppressWarnings("unchecked")
128 public CollectionModel createCollectionModel(CollectionModel current, Object value)
129 {
130 TreeModel model = (TreeModel)super.createCollectionModel(current, value);
131 RowKeySet treeState = getDisclosedRowKeys();
132 treeState.setCollectionModel(model);
133 return model;
134 }
135
136 @Override
137 @SuppressWarnings("unchecked")
138 protected void processFacetsAndChildren(
139 FacesContext context,
140 PhaseId phaseId)
141 {
142
143
144 Object oldPath = getRowKey();
145 HierarchyUtils.__setStartDepthPath(this, getStartLevel());
146 HierarchyUtils.__iterateOverTree(context,
147 phaseId,
148 this,
149 getDisclosedRowKeys(),
150 true);
151 setRowKey(oldPath);
152 }
153
154 @Override
155 protected boolean visitChildren(
156 VisitContext visitContext,
157 VisitCallback callback)
158 {
159 return visitData(visitContext, callback);
160 }
161
162 @Override
163 protected boolean visitData(
164 VisitContext visitContext,
165 VisitCallback callback)
166 {
167 Object oldRowKey = getRowKey();
168
169
170
171 RowKeySet disclosedRowKeys = (visitContext.getHints().contains(VisitHint.SKIP_UNRENDERED))
172 ? getDisclosedRowKeys()
173 : null;
174
175 boolean done;
176
177 HierarchyUtils.__setStartDepthPath(this, getStartLevel());
178
179 try
180 {
181 done = visitHierarchy(visitContext, callback, getStamps(), disclosedRowKeys);
182 }
183 finally
184 {
185 setRowKey(oldRowKey);
186 }
187
188 return done;
189 }
190
191 @Override
192 void __encodeBegin(FacesContext context) throws IOException
193 {
194 HierarchyUtils.__handleEncodeBegin(this, getDisclosedRowKeys());
195 super.__encodeBegin(context);
196 }
197
198 @Override
199 void __init()
200 {
201 super.__init();
202 if (getDisclosedRowKeys() == null)
203 setDisclosedRowKeys(new RowKeySetTreeImpl());
204 }
205
206 @Override
207 protected FacesBean createFacesBean(String rendererType)
208 {
209 return new RowKeyFacesBeanWrapper(super.createFacesBean(rendererType));
210 }
211
212 private class RowKeyFacesBeanWrapper
213 extends FacesBeanWrapper
214 {
215 private boolean _retrievingDisclosedRows = false;
216
217 RowKeyFacesBeanWrapper(FacesBean bean)
218 {
219 super(bean);
220 }
221
222 @Override
223 public Object getProperty(PropertyKey key)
224 {
225 Object value = super.getProperty(key);
226
227 if (key == DISCLOSED_ROW_KEYS_KEY && !_retrievingDisclosedRows && value instanceof RowKeySet)
228 {
229
230
231 _retrievingDisclosedRows = true;
232
233 try
234 {
235 RowKeySet rowKeys = (RowKeySet) value;
236
237
238 rowKeys.setCollectionModel(getCollectionModel());
239 }
240 finally
241 {
242 _retrievingDisclosedRows = false;
243 }
244 }
245
246 return value;
247 }
248
249 @Override
250 public Object saveState(FacesContext context)
251 {
252 RowKeySet rowKeys = (RowKeySet)super.getProperty(DISCLOSED_ROW_KEYS_KEY);
253 if (rowKeys != null)
254 {
255
256 rowKeys.setCollectionModel(null);
257 }
258 return super.saveState(context);
259 }
260 }
261
262
263
264
265
266
267
268
269 final public UIComponent getNodeStamp()
270 {
271 return getFacet(NODE_STAMP_FACET);
272 }
273
274
275
276
277
278
279
280
281 @SuppressWarnings("unchecked")
282 final public void setNodeStamp(UIComponent nodeStampFacet)
283 {
284 getFacets().put(NODE_STAMP_FACET, nodeStampFacet);
285 }
286
287
288
289
290
291
292 final public MethodExpression getRowDisclosureListener()
293 {
294 return (MethodExpression)getProperty(ROW_DISCLOSURE_LISTENER_KEY);
295 }
296
297
298
299
300
301
302 final public void setRowDisclosureListener(MethodExpression rowDisclosureListener)
303 {
304 setProperty(ROW_DISCLOSURE_LISTENER_KEY, (rowDisclosureListener));
305 }
306
307
308
309
310
311
312
313 final public RowKeySet getDisclosedRowKeys()
314 {
315 return (RowKeySet)getProperty(DISCLOSED_ROW_KEYS_KEY);
316 }
317
318
319
320
321
322
323
324 final public void setDisclosedRowKeys(RowKeySet disclosedRowKeys)
325 {
326 setProperty(DISCLOSED_ROW_KEYS_KEY, (disclosedRowKeys));
327 }
328
329
330
331
332
333
334
335 final public Object getValue()
336 {
337 return getProperty(VALUE_KEY);
338 }
339
340
341
342
343
344
345
346 final public void setValue(Object value)
347 {
348 setProperty(VALUE_KEY, (value));
349 }
350
351
352
353
354
355
356 final public int getStartLevel()
357 {
358 return ComponentUtils.resolveInteger(getProperty(START_LEVEL_KEY), 0);
359 }
360
361
362
363
364
365
366 final public void setStartLevel(int startLevel)
367 {
368 setProperty(START_LEVEL_KEY, Integer.valueOf(startLevel));
369 }
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384 final public String getVarStatus()
385 {
386 return ComponentUtils.resolveString(getProperty(VAR_STATUS_KEY));
387 }
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402 final public void setVarStatus(String varStatus)
403 {
404 setProperty(VAR_STATUS_KEY, (varStatus));
405 }
406
407
408
409
410
411
412
413
414
415
416
417
418
419 final public boolean isImmediate()
420 {
421 return ComponentUtils.resolveBoolean(getProperty(IMMEDIATE_KEY), false);
422 }
423
424
425
426
427
428
429
430
431
432
433
434
435
436 final public void setImmediate(boolean immediate)
437 {
438 setProperty(IMMEDIATE_KEY, immediate ? Boolean.TRUE : Boolean.FALSE);
439 }
440
441
442
443
444
445
446 final public void addRowDisclosureListener(
447 RowDisclosureListener listener)
448 {
449 addFacesListener(listener);
450 }
451
452
453
454
455
456
457 final public void removeRowDisclosureListener(
458 RowDisclosureListener listener)
459 {
460 removeFacesListener(listener);
461 }
462
463
464
465
466
467
468 final public RowDisclosureListener[] getRowDisclosureListeners()
469 {
470 return (RowDisclosureListener[])getFacesListeners(RowDisclosureListener.class);
471 }
472
473 @Override
474 public String getFamily()
475 {
476 return COMPONENT_FAMILY;
477 }
478
479 @Override
480 protected FacesBean.Type getBeanType()
481 {
482 return TYPE;
483 }
484
485
486
487
488 protected UIXNavigationTree(
489 String rendererType
490 )
491 {
492 super(rendererType);
493 }
494
495 static
496 {
497 TYPE.lockAndRegister("org.apache.myfaces.trinidad.NavigationTree","org.apache.myfaces.trinidad.NavigationTree");
498 }
499 }