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 java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.IdentityHashMap;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.Map;
31 import javax.el.MethodExpression;
32 import javax.faces.component.UIComponent;
33 import javax.faces.context.FacesContext;
34 import javax.faces.el.MethodBinding;
35 import javax.faces.event.AbortProcessingException;
36 import javax.faces.event.FacesEvent;
37 import javax.faces.event.PhaseId;
38 import org.apache.myfaces.trinidad.bean.FacesBean;
39 import org.apache.myfaces.trinidad.bean.PropertyKey;
40 import org.apache.myfaces.trinidad.event.RangeChangeEvent;
41 import org.apache.myfaces.trinidad.event.RangeChangeListener;
42 import org.apache.myfaces.trinidad.event.RowDisclosureEvent;
43 import org.apache.myfaces.trinidad.event.RowDisclosureListener;
44 import org.apache.myfaces.trinidad.event.SelectionEvent;
45 import org.apache.myfaces.trinidad.event.SelectionListener;
46 import org.apache.myfaces.trinidad.event.SortEvent;
47 import org.apache.myfaces.trinidad.event.SortListener;
48 import org.apache.myfaces.trinidad.model.CollectionModel;
49 import org.apache.myfaces.trinidad.model.RowKeySet;
50 import org.apache.myfaces.trinidad.model.RowKeySetImpl;
51 import org.apache.myfaces.trinidad.model.SortCriterion;
52 import org.apache.myfaces.trinidad.util.ComponentUtils;
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 public class UIXTable extends UIXIterator
95 implements CollectionComponent
96 {
97 static public final FacesBean.Type TYPE = new FacesBean.Type(
98 UIXIterator.TYPE);
99 static public final PropertyKey ROW_DISCLOSURE_LISTENER_KEY =
100 TYPE.registerKey("rowDisclosureListener", MethodExpression.class);
101 static public final PropertyKey DISCLOSED_ROW_KEYS_KEY =
102 TYPE.registerKey("disclosedRowKeys", RowKeySet.class, null, 0, PropertyKey.Mutable.OFTEN);
103 static public final PropertyKey SELECTION_LISTENER_KEY =
104 TYPE.registerKey("selectionListener", MethodExpression.class);
105 static public final PropertyKey SELECTED_ROW_KEYS_KEY =
106 TYPE.registerKey("selectedRowKeys", RowKeySet.class, null, 0, PropertyKey.Mutable.OFTEN);
107 static public final PropertyKey IMMEDIATE_KEY =
108 TYPE.registerKey("immediate", Boolean.class, Boolean.FALSE);
109 static public final PropertyKey SORT_LISTENER_KEY =
110 TYPE.registerKey("sortListener", MethodExpression.class);
111 static public final PropertyKey RANGE_CHANGE_LISTENER_KEY =
112 TYPE.registerKey("rangeChangeListener", MethodExpression.class);
113 static public final PropertyKey SHOW_ALL_KEY =
114 TYPE.registerKey("showAll", Boolean.class, Boolean.FALSE);
115 static public final String DETAIL_STAMP_FACET = "detailStamp";
116
117 static public final String COMPONENT_FAMILY =
118 "org.apache.myfaces.trinidad.Table";
119 static public final String COMPONENT_TYPE =
120 "org.apache.myfaces.trinidad.Table";
121
122
123
124
125 public UIXTable()
126 {
127 super("org.apache.myfaces.trinidad.Table");
128 }
129
130
131
132
133 static private final PropertyKey _DISCLOSED_ROW_KEYS_WITHOUT_MODEL_KEY =
134 TYPE.registerKey("disclosedRowKeysWithoutModel", RowKeySet.class);
135 static private final PropertyKey _SELECTED_ROW_KEYS_WITHOUT_MODEL_KEY =
136 TYPE.registerKey("selectedRowKeysWithoutModel", RowKeySet.class);
137
138
139
140
141
142 @Override
143 public void decode(FacesContext context)
144 {
145 _resetContainerClientIdCache();
146 super.decode(context);
147 }
148
149
150
151
152 @Override
153 public void processValidators(FacesContext context)
154 {
155 _resetContainerClientIdCache();
156 super.processValidators(context);
157 }
158
159
160
161
162
163 @Override
164 public void processUpdates(FacesContext context)
165 {
166 _resetContainerClientIdCache();
167 super.processUpdates(context);
168 }
169
170
171
172
173 @Override
174 void __encodeBegin(FacesContext context) throws IOException
175 {
176 _resetContainerClientIdCache();
177 super.__encodeBegin(context);
178 }
179
180
181
182
183 @Override
184 public String getContainerClientId(FacesContext context, UIComponent child)
185 {
186 String id;
187 if (_containerClientIdCache == null || _isStampedChild(child))
188 {
189
190 id = getContainerClientId(context);
191 }
192 else
193 {
194
195 id = getClientId(context);
196 }
197
198 return id;
199 }
200
201 @Override
202 public void setSortCriteria(List<SortCriterion> criteria)
203 {
204 _sortCriteria = criteria;
205 super.setSortCriteria(criteria);
206 }
207
208
209
210
211 @Override
212 public void queueEvent(FacesEvent event)
213 {
214 TableUtils.__handleQueueEvent(this, event);
215 super.queueEvent(event);
216 }
217
218
219
220
221
222
223 @Override
224 public void broadcast(FacesEvent event)
225 throws AbortProcessingException
226 {
227
228
229
230
231
232
233 if (event instanceof RangeChangeEvent)
234 {
235 RangeChangeEvent rEvent = (RangeChangeEvent) event;
236 int first = rEvent.getNewStart();
237 setFirst(first);
238
239 addAttributeChange("first", Integer.valueOf(first));
240
241 if ((first == 0) && (rEvent.getNewEnd() == getRowCount()))
242 {
243 setShowAll(true);
244
245 addAttributeChange("showAll", Boolean.TRUE);
246 }
247 else if (isShowAll())
248 {
249 setShowAll(false);
250
251 addAttributeChange("showAll", Boolean.FALSE);
252 }
253
254 clearCurrencyStringCache();
255
256 broadcastToMethodExpression(event, getRangeChangeListener());
257 }
258 else if (event instanceof RowDisclosureEvent)
259 {
260 RowDisclosureEvent eEvent = (RowDisclosureEvent) event;
261 RowKeySet set = getDisclosedRowKeys();
262 set.addAll(eEvent.getAddedSet());
263 set.removeAll(eEvent.getRemovedSet());
264 addAttributeChange("disclosedRowKeys", set);
265 broadcastToMethodExpression(event, getRowDisclosureListener());
266 }
267 else if (event instanceof SortEvent)
268 {
269 SortEvent sEvent = (SortEvent) event;
270 setSortCriteria(sEvent.getSortCriteria());
271 broadcastToMethodExpression(event, getSortListener());
272 }
273 else if (event instanceof SelectionEvent)
274 {
275
276 addAttributeChange("selectedRowKeys",
277 getSelectedRowKeys());
278 broadcastToMethodExpression(event, getSelectionListener());
279 }
280
281 super.broadcast(event);
282 }
283
284
285
286 @Deprecated
287 public void setRangeChangeListener(MethodBinding binding)
288 {
289 setRangeChangeListener(adaptMethodBinding(binding));
290 }
291
292 @Deprecated
293 public void setSortListener(MethodBinding binding)
294 {
295 setSortListener(adaptMethodBinding(binding));
296 }
297
298 @Deprecated
299 public void setRowDisclosureListener(MethodBinding binding)
300 {
301 setRowDisclosureListener(adaptMethodBinding(binding));
302 }
303
304 @Deprecated
305 public void setSelectionListener(MethodBinding binding)
306 {
307 setSelectionListener(adaptMethodBinding(binding));
308 }
309
310 @Override
311 @SuppressWarnings("unchecked")
312 public Object saveState(FacesContext context)
313 {
314 Object o = super.saveState(context);
315 if ((o == null) &&
316 ((_sortCriteria == null) || _sortCriteria.isEmpty()))
317 return null;
318
319 return new Object[]{o, _sortCriteria};
320 }
321
322 @Override
323 @SuppressWarnings("unchecked")
324 public void restoreState(FacesContext context, Object state)
325 {
326 Object[] array = (Object[]) state;
327 super.restoreState(context, array[0]);
328
329
330
331
332
333
334
335 List<SortCriterion> criteria = (List<SortCriterion>) array[1];
336 _sortCriteria = criteria;
337 }
338
339
340
341
342
343
344
345
346 public Object getSelectedRowData()
347 {
348 RowKeySet state = getSelectedRowKeys();
349 Iterator<Object> keys = state.iterator();
350 if (keys.hasNext())
351 {
352 Object key = keys.next();
353 CollectionModel model = getCollectionModel();
354 Object old = model.getRowKey();
355 try
356 {
357 model.setRowKey(key);
358 if (isRowAvailable())
359 return model.getRowData();
360 }
361 finally
362 {
363 model.setRowKey(old);
364 }
365 }
366 return null;
367 }
368
369 @Override
370 protected void processFacetsAndChildren(
371 FacesContext context,
372 PhaseId phaseId)
373 {
374
375
376
377 TableUtils.processFacets(context, this, this, phaseId,
378 UIXTable.DETAIL_STAMP_FACET);
379
380
381 TableUtils.processColumnFacets(context, this, this, phaseId);
382
383
384 processStamps(context, phaseId);
385 }
386
387
388
389
390
391
392 @Override
393 protected final List<UIComponent> getStamps()
394 {
395 List<UIComponent> children = super.getStamps();
396 UIComponent detail = getDetailStamp();
397 if (detail != null)
398 {
399 List<UIComponent> stamps = new ArrayList<UIComponent>(children.size() + 1);
400 stamps.addAll(children);
401 stamps.add(detail);
402 return stamps;
403 }
404 return children;
405 }
406
407
408
409
410
411 @Override
412 protected final Object saveStampState(FacesContext context, UIComponent stamp)
413 {
414 if (stamp instanceof UIXColumn)
415 {
416
417
418 return StampState.saveChildStampState(context, stamp, this);
419 }
420 else
421 {
422 Object stampState = super.saveStampState(context, stamp);
423
424
425
426
427
428
429
430
431
432
433
434
435
436 if(stamp instanceof UIXIterator && _movingToNonNullCurrency)
437 {
438
439 if(_iteratorStampMap == null)
440 {
441 _iteratorStampMap = new HashMap<String, Object>();
442 }
443
444
445 _iteratorStampMap.put(stamp.getClientId(context), stampState);
446
447
448 ((UIXIterator)stamp).__resetMyStampState();
449
450
451 stampState = super.saveStampState(context, stamp);
452 }
453
454 return stampState;
455 }
456 }
457
458
459
460
461
462 @Override
463 protected final void restoreStampState(FacesContext context, UIComponent stamp, Object stampState)
464 {
465 if (stamp instanceof UIXColumn)
466 {
467
468
469 StampState.restoreChildStampState(context, stamp, this, stampState);
470 }
471 else
472 {
473
474
475 if(stamp instanceof UIXIterator && _movingBackToNullCurrency && _iteratorStampMap != null)
476 {
477
478 stamp.setId(stamp.getId());
479 stampState = _iteratorStampMap.get(stamp.getClientId(context));
480 }
481 super.restoreStampState(context, stamp, stampState);
482 }
483 }
484
485 @Override
486 protected final CollectionModel createCollectionModel(
487 CollectionModel current,
488 Object value)
489 {
490 return super.createCollectionModel(current, value);
491 }
492
493 @Override
494 protected void postCreateCollectionModel(CollectionModel model)
495 {
496 RowKeySet selectedRowKeys = getSelectedRowKeys();
497
498 if (selectedRowKeys == null)
499 {
500 selectedRowKeys = new RowKeySetImpl();
501 setSelectedRowKeys(selectedRowKeys);
502 }
503
504 RowKeySet disclosedRowKeys = getDisclosedRowKeys();
505
506 if (disclosedRowKeys == null)
507 {
508 disclosedRowKeys = new RowKeySetImpl();
509 setDisclosedRowKeys(disclosedRowKeys);
510 }
511
512 selectedRowKeys.setCollectionModel(model);
513 disclosedRowKeys.setCollectionModel(model);
514
515
516 if (_sortCriteria != null)
517 {
518 model.setSortCriteria(_sortCriteria);
519 }
520 }
521
522
523
524
525 @Override
526 Object __getMyStampState()
527 {
528 Object[] state = new Object[6];
529 state[0] = _sortCriteria;
530 state[1] = super.__getMyStampState();
531 state[2] = Integer.valueOf(getFirst());
532 state[3] = Boolean.valueOf(isShowAll());
533
534
535
536
537
538 RowKeySet selectedRowKeys = (RowKeySet)getProperty(_SELECTED_ROW_KEYS_WITHOUT_MODEL_KEY);
539 RowKeySet disclosedRowKeys = (RowKeySet)getProperty(_DISCLOSED_ROW_KEYS_WITHOUT_MODEL_KEY);
540
541 state[4] = selectedRowKeys;
542 state[5] = disclosedRowKeys;
543
544 return state;
545 }
546
547
548
549
550
551 @Override
552 @SuppressWarnings("unchecked")
553 void __setMyStampState(Object stampState)
554 {
555 Object[] state = (Object[]) stampState;
556 _sortCriteria = (List<SortCriterion>) state[0];
557 super.__setMyStampState(state[1]);
558 setFirst(((Integer) state[2]).intValue());
559 setShowAll(Boolean.TRUE == state[3]);
560 setSelectedRowKeys((RowKeySet) state[4]);
561 setDisclosedRowKeys((RowKeySet) state[5]);
562 }
563
564 @Override
565 void __resetMyStampState()
566 {
567 super.__resetMyStampState();
568 _sortCriteria = null;
569 setFirst((Integer)FIRST_KEY.getDefault());
570 setShowAll(Boolean.TRUE == SHOW_ALL_KEY.getDefault());
571 setSelectedRowKeys(null);
572 setDisclosedRowKeys(null);
573 }
574
575 protected void processStamps(
576 FacesContext context,
577 PhaseId phaseId)
578 {
579
580 CollectionModel tableData = getCollectionModel();
581 if (tableData.getRowCount() != 0)
582 {
583 int startIndex = getFirst();
584 int endIndex = isShowAll() ? getRowCount()-1 : TableUtils.getLast(this);
585
586 UIComponent detail = getDetailStamp();
587 RowKeySet disclosureState =
588 (detail == null) ? null : getDisclosedRowKeys();
589
590 for (int i = startIndex; i <= endIndex; i++)
591 {
592 setRowIndex(i);
593 if (isRowAvailable())
594 {
595 TableUtils.processStampedChildren(context, this, phaseId);
596
597 if ((disclosureState != null) && disclosureState.isContained())
598 {
599 assert getRowIndex() == i;
600 processComponent(context, detail, phaseId);
601 }
602 }
603 }
604
605 setRowIndex(-1);
606 }
607 }
608
609
610
611
612 private boolean _isStampedChild(UIComponent target)
613 {
614 assert _containerClientIdCache != null;
615 return !_containerClientIdCache.containsKey(target);
616 }
617
618
619
620
621 private void _resetContainerClientIdCache()
622 {
623 if(_containerClientIdCache == null)
624 _containerClientIdCache = new IdentityHashMap<UIComponent, Boolean>();
625 else
626 _containerClientIdCache.clear();
627
628 TableUtils.cacheHeaderFooterFacets(this, _containerClientIdCache);
629 TableUtils.cacheColumnHeaderFooterFacets(this, _containerClientIdCache);
630 }
631
632
633 @Override
634 void __init()
635 {
636 super.__init();
637 if (getSelectedRowKeys() == null)
638 setSelectedRowKeys(new RowKeySetImpl());
639 if (getDisclosedRowKeys() == null)
640 setDisclosedRowKeys(new RowKeySetImpl());
641
642
643
644 setFirst(getFirst());
645 }
646
647 @Override
648 protected FacesBean createFacesBean(String rendererType)
649 {
650 return new RowKeyFacesBeanWrapper(super.createFacesBean(rendererType));
651 }
652
653 private class RowKeyFacesBeanWrapper
654 extends FacesBeanWrapper
655 {
656 private boolean _retrievingDisclosedRows = false;
657 private boolean _retrievingSelectedRows = false;
658
659 RowKeyFacesBeanWrapper(FacesBean bean)
660 {
661 super(bean);
662 }
663
664 @Override
665 public Object getProperty(PropertyKey key)
666 {
667 if (key == _DISCLOSED_ROW_KEYS_WITHOUT_MODEL_KEY)
668 {
669
670
671
672
673
674 return super.getProperty(DISCLOSED_ROW_KEYS_KEY);
675 }
676 else if (key == _SELECTED_ROW_KEYS_WITHOUT_MODEL_KEY)
677 {
678
679
680
681
682
683 return super.getProperty(SELECTED_ROW_KEYS_KEY);
684 }
685
686 Object value = super.getProperty(key);
687 if (key == DISCLOSED_ROW_KEYS_KEY)
688 {
689 if (!_retrievingDisclosedRows && value instanceof RowKeySet)
690 {
691
692
693 _retrievingDisclosedRows = true;
694
695 try
696 {
697 RowKeySet rowKeys = (RowKeySet) value;
698
699
700 __flushCachedModel();
701 rowKeys.setCollectionModel(getCollectionModel());
702 }
703 finally
704 {
705 _retrievingDisclosedRows = false;
706 }
707 }
708 }
709 else if (key == SELECTED_ROW_KEYS_KEY)
710 {
711 if (!_retrievingSelectedRows && value instanceof RowKeySet)
712 {
713
714
715 _retrievingSelectedRows = true;
716
717 try
718 {
719 RowKeySet rowKeys = (RowKeySet) value;
720
721
722 __flushCachedModel();
723 rowKeys.setCollectionModel(getCollectionModel());
724 }
725 finally
726 {
727 _retrievingSelectedRows = false;
728 }
729 }
730 }
731
732 return value;
733 }
734
735 @Override
736 public Object saveState(FacesContext context)
737 {
738 RowKeySet rowKeys = (RowKeySet)super.getProperty(DISCLOSED_ROW_KEYS_KEY);
739 if (rowKeys != null)
740 {
741
742 rowKeys.setCollectionModel(null);
743 }
744 rowKeys = (RowKeySet)super.getProperty(SELECTED_ROW_KEYS_KEY);
745 if (rowKeys != null)
746 {
747
748 rowKeys.setCollectionModel(null);
749 }
750 return super.saveState(context);
751 }
752 }
753
754 @Override
755 public void setRowKey(Object rowKey)
756 {
757 _preCurrencyChange(rowKey == null);
758 try
759 {
760 super.setRowKey(rowKey);
761 }
762 finally
763 {
764 _postCurrencyChange();
765 }
766 }
767
768 @Override
769 public void setRowIndex(int rowIndex)
770 {
771 _preCurrencyChange(rowIndex == -1);
772 try
773 {
774 super.setRowIndex(rowIndex);
775 }
776 finally
777 {
778 _postCurrencyChange();
779 }
780 }
781
782
783
784
785
786
787
788
789
790 private void _preCurrencyChange(boolean isNewCurrencyNull)
791 {
792 Object currencyObj = getRowKey();
793 if(currencyObj == null && !isNewCurrencyNull)
794 {
795 _movingToNonNullCurrency = true;
796 }
797
798 if(currencyObj != null && isNewCurrencyNull)
799 {
800 _movingBackToNullCurrency = true;
801 }
802 }
803
804
805
806
807 private void _postCurrencyChange()
808 {
809 _movingToNonNullCurrency = false;
810
811 if(_movingBackToNullCurrency)
812 {
813 _iteratorStampMap = null;
814 }
815 _movingBackToNullCurrency = false;
816 }
817
818 transient private List<SortCriterion> _sortCriteria = null;
819
820
821 transient private IdentityHashMap<UIComponent, Boolean> _containerClientIdCache = null;
822
823
824 transient private boolean _movingToNonNullCurrency = false;
825 transient private boolean _movingBackToNullCurrency = false;
826
827
828 transient private Map<String, Object> _iteratorStampMap = null;
829
830
831
832
833
834 final public UIComponent getDetailStamp()
835 {
836 return getFacet(DETAIL_STAMP_FACET);
837 }
838
839
840
841
842
843 @SuppressWarnings("unchecked")
844 final public void setDetailStamp(UIComponent detailStampFacet)
845 {
846 getFacets().put(DETAIL_STAMP_FACET, detailStampFacet);
847 }
848
849
850
851
852
853
854 final public MethodExpression getRowDisclosureListener()
855 {
856 return (MethodExpression)getProperty(ROW_DISCLOSURE_LISTENER_KEY);
857 }
858
859
860
861
862
863
864 final public void setRowDisclosureListener(MethodExpression rowDisclosureListener)
865 {
866 setProperty(ROW_DISCLOSURE_LISTENER_KEY, (rowDisclosureListener));
867 }
868
869
870
871
872
873
874
875 final public RowKeySet getDisclosedRowKeys()
876 {
877 return (RowKeySet)getProperty(DISCLOSED_ROW_KEYS_KEY);
878 }
879
880
881
882
883
884
885
886 final public void setDisclosedRowKeys(RowKeySet disclosedRowKeys)
887 {
888 setProperty(DISCLOSED_ROW_KEYS_KEY, (disclosedRowKeys));
889 }
890
891
892
893
894
895
896 final public MethodExpression getSelectionListener()
897 {
898 return (MethodExpression)getProperty(SELECTION_LISTENER_KEY);
899 }
900
901
902
903
904
905
906 final public void setSelectionListener(MethodExpression selectionListener)
907 {
908 setProperty(SELECTION_LISTENER_KEY, (selectionListener));
909 }
910
911
912
913
914
915
916 final public RowKeySet getSelectedRowKeys()
917 {
918 return (RowKeySet)getProperty(SELECTED_ROW_KEYS_KEY);
919 }
920
921
922
923
924
925
926 final public void setSelectedRowKeys(RowKeySet selectedRowKeys)
927 {
928 setProperty(SELECTED_ROW_KEYS_KEY, (selectedRowKeys));
929 }
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945 final public boolean isImmediate()
946 {
947 return ComponentUtils.resolveBoolean(getProperty(IMMEDIATE_KEY), false);
948 }
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964 final public void setImmediate(boolean immediate)
965 {
966 setProperty(IMMEDIATE_KEY, immediate ? Boolean.TRUE : Boolean.FALSE);
967 }
968
969
970
971
972
973
974 final public MethodExpression getSortListener()
975 {
976 return (MethodExpression)getProperty(SORT_LISTENER_KEY);
977 }
978
979
980
981
982
983
984 final public void setSortListener(MethodExpression sortListener)
985 {
986 setProperty(SORT_LISTENER_KEY, (sortListener));
987 }
988
989
990
991
992
993
994
995 final public MethodExpression getRangeChangeListener()
996 {
997 return (MethodExpression)getProperty(RANGE_CHANGE_LISTENER_KEY);
998 }
999
1000
1001
1002
1003
1004
1005
1006 final public void setRangeChangeListener(MethodExpression rangeChangeListener)
1007 {
1008 setProperty(RANGE_CHANGE_LISTENER_KEY, (rangeChangeListener));
1009 }
1010
1011
1012
1013
1014
1015
1016
1017
1018 final public boolean isShowAll()
1019 {
1020 return ComponentUtils.resolveBoolean(getProperty(SHOW_ALL_KEY), false);
1021 }
1022
1023
1024
1025
1026
1027
1028
1029
1030 final public void setShowAll(boolean showAll)
1031 {
1032 setProperty(SHOW_ALL_KEY, showAll ? Boolean.TRUE : Boolean.FALSE);
1033 }
1034
1035
1036
1037
1038
1039
1040 final public void addRowDisclosureListener(
1041 RowDisclosureListener listener)
1042 {
1043 addFacesListener(listener);
1044 }
1045
1046
1047
1048
1049
1050
1051 final public void removeRowDisclosureListener(
1052 RowDisclosureListener listener)
1053 {
1054 removeFacesListener(listener);
1055 }
1056
1057
1058
1059
1060
1061
1062 final public RowDisclosureListener[] getRowDisclosureListeners()
1063 {
1064 return (RowDisclosureListener[])getFacesListeners(RowDisclosureListener.class);
1065 }
1066
1067
1068
1069
1070
1071
1072 final public void addSelectionListener(
1073 SelectionListener listener)
1074 {
1075 addFacesListener(listener);
1076 }
1077
1078
1079
1080
1081
1082
1083 final public void removeSelectionListener(
1084 SelectionListener listener)
1085 {
1086 removeFacesListener(listener);
1087 }
1088
1089
1090
1091
1092
1093
1094 final public SelectionListener[] getSelectionListeners()
1095 {
1096 return (SelectionListener[])getFacesListeners(SelectionListener.class);
1097 }
1098
1099
1100
1101
1102
1103
1104 final public void addRangeChangeListener(
1105 RangeChangeListener listener)
1106 {
1107 addFacesListener(listener);
1108 }
1109
1110
1111
1112
1113
1114
1115 final public void removeRangeChangeListener(
1116 RangeChangeListener listener)
1117 {
1118 removeFacesListener(listener);
1119 }
1120
1121
1122
1123
1124
1125
1126 final public RangeChangeListener[] getRangeChangeListeners()
1127 {
1128 return (RangeChangeListener[])getFacesListeners(RangeChangeListener.class);
1129 }
1130
1131
1132
1133
1134
1135
1136 final public void addSortListener(
1137 SortListener listener)
1138 {
1139 addFacesListener(listener);
1140 }
1141
1142
1143
1144
1145
1146
1147 final public void removeSortListener(
1148 SortListener listener)
1149 {
1150 removeFacesListener(listener);
1151 }
1152
1153
1154
1155
1156
1157
1158 final public SortListener[] getSortListeners()
1159 {
1160 return (SortListener[])getFacesListeners(SortListener.class);
1161 }
1162
1163 @Override
1164 public String getFamily()
1165 {
1166 return COMPONENT_FAMILY;
1167 }
1168
1169 @Override
1170 protected FacesBean.Type getBeanType()
1171 {
1172 return TYPE;
1173 }
1174
1175
1176
1177
1178 protected UIXTable(
1179 String rendererType
1180 )
1181 {
1182 super(rendererType);
1183 }
1184
1185 static
1186 {
1187 TYPE.lockAndRegister("org.apache.myfaces.trinidad.Table","org.apache.myfaces.trinidad.Table");
1188 }
1189 }