View Javadoc

1   /*
2    * $Id: ListTools.java,v 1.18 2011/06/16 09:29:41 jbmeslin Exp $
3    * 
4    */
5   package org.rcfaces.core.internal.tools;
6   
7   import java.util.ArrayList;
8   import java.util.Arrays;
9   import java.util.Collections;
10  import java.util.HashSet;
11  import java.util.List;
12  import java.util.Set;
13  
14  import javax.faces.component.UISelectItem;
15  
16  import org.rcfaces.core.component.ComboComponent;
17  import org.rcfaces.core.component.capability.IMultipleSelectCapability;
18  import org.rcfaces.core.component.iterator.ISelectItemIterator;
19  import org.rcfaces.core.internal.util.ComponentIterators;
20  import org.rcfaces.core.internal.util.IncompatibleValueException;
21  
22  /**
23   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
24   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
25   */
26  public class ListTools {
27      private static final String REVISION = "$Revision: 1.18 $";
28  
29      private static final boolean USE_ARRAY_VALUE_FOR_Combo = false;
30  
31      private static final ISelectItemIterator EMPTY_COMPONENT_ITERATOR = new SelectItemIteratorWrapper(
32              Collections.EMPTY_LIST);
33  
34      public static ISelectItemIterator listItems(ComboComponent component) {
35  
36          List list = ComponentIterators.list(component, UISelectItem.class);
37          if (list.isEmpty()) {
38              return EMPTY_COMPONENT_ITERATOR;
39          }
40  
41          return new SelectItemIteratorWrapper(list);
42      }
43  
44      public static ISelectItemIterator listAllSelectedItems(
45              ComboComponent component) {
46  
47          Object value = component.getValue();
48          if (value == null) {
49              return EMPTY_COMPONENT_ITERATOR;
50          }
51  
52          if (value instanceof Object[]) {
53              // C'est peut être le cas de la listBox
54  
55              List l = listAllSelectedItems(component, (Object[]) value);
56              if (l == null || l.isEmpty()) {
57                  return EMPTY_COMPONENT_ITERATOR;
58              }
59  
60              return new SelectItemListIterator(l);
61          }
62  
63          // C'est peut être le cas de la Combo
64  
65          UISelectItem si = listAllSelectedItems(component, value);
66          if (si == null) {
67              return EMPTY_COMPONENT_ITERATOR;
68          }
69  
70          return new SelectItemArrayIterator(si);
71      }
72  
73      private static UISelectItem listAllSelectedItems(ComboComponent component,
74              Object value) {
75  
76          return getFirstSelectedItem(component, value);
77      }
78  
79      private static List listAllSelectedItems(ComboComponent component,
80              Object values[]) {
81          if (values == null || values.length < 1) {
82              // Aucun ID sélectionné !
83              return null;
84          }
85  
86          ISelectItemIterator si = listItems(component);
87          if (si.hasNext() == false) {
88              // Aucun SelectItem !
89              return null;
90          }
91  
92          Set valuesSet = new HashSet(Arrays.asList(values));
93  
94          List l = null;
95          for (; si.hasNext();) {
96              UISelectItem selectItem = si.next();
97  
98              Object value = selectItem.getItemValue();
99              if (value == null) {
100                 // On ignore les selectItems qui n'ont pas d'ID : mais est-ce
101                 // possible ?
102                 continue;
103             }
104 
105             if (valuesSet.contains(value) == false) {
106                 // Pas dans la liste des Ids sélectionnés ...
107                 continue;
108             }
109 
110             if (l == null) {
111                 int n = Math.min(values.length, si.count());
112 
113                 l = new ArrayList(n);
114             }
115 
116             l.add(selectItem);
117         }
118 
119         if (l == null) {
120             return null;
121         }
122 
123         return l;
124 
125     }
126 
127     public static UISelectItem getFirstSelectedItem(ComboComponent component) {
128         Object value = component.getValue();
129 
130         if (value == null) {
131             return null;
132         }
133 
134         if (value instanceof Object[]) {
135             return getFirstSelectedItem(component, (Object[]) value);
136         }
137 
138         if (value instanceof String) {
139             return getFirstSelectedItem(component, value);
140         }
141 
142         throw new IncompatibleValueException(value, "String, String[]");
143     }
144 
145     private static UISelectItem getFirstSelectedItem(ComboComponent component,
146             Object value) {
147         ISelectItemIterator si = listItems(component);
148         for (; si.hasNext();) {
149             UISelectItem item = si.next();
150 
151             if (value.equals(item.getItemValue())) {
152                 return item;
153             }
154         }
155 
156         return null;
157     }
158 
159     private static UISelectItem getFirstSelectedItem(ComboComponent component,
160             Object values[]) {
161         if (values == null || values.length == 0) {
162             return null;
163         }
164 
165         ISelectItemIterator si = listItems(component);
166         if (si.hasNext() == false) {
167             return null;
168         }
169 
170         Set valuesSet = new HashSet(Arrays.asList(values));
171 
172         for (; si.hasNext();) {
173             UISelectItem selectItem = si.next();
174 
175             Object value = selectItem.getItemValue();
176             if (value == null) {
177                 continue;
178             }
179 
180             if (valuesSet.contains(value) == false) {
181                 continue;
182             }
183 
184             return selectItem;
185         }
186 
187         return null;
188     }
189 
190     /**
191      * 
192      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
193      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
194      */
195     private static final class SelectItemIteratorWrapper extends
196             ComponentIterators.ComponentListIterator implements
197             ISelectItemIterator {
198         private static final String REVISION = "$Revision: 1.18 $";
199 
200         public SelectItemIteratorWrapper(List list) {
201             super(list);
202         }
203 
204         public final UISelectItem next() {
205             return (UISelectItem) nextComponent();
206         }
207 
208         public UISelectItem[] toArray() {
209             return (UISelectItem[]) toArray(new UISelectItem[count()]);
210         }
211     }
212 
213     /**
214      * 
215      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
216      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
217      */
218     private static final class SelectItemListIterator extends
219             ComponentIterators.ComponentListIterator implements
220             ISelectItemIterator {
221         private static final String REVISION = "$Revision: 1.18 $";
222 
223         public SelectItemListIterator(List list) {
224             super(list);
225         }
226 
227         public final UISelectItem next() {
228             return (UISelectItem) nextComponent();
229         }
230 
231         public UISelectItem[] toArray() {
232             return (UISelectItem[]) toArray(new UISelectItem[count()]);
233         }
234     }
235 
236     /**
237      * 
238      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
239      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
240      */
241     private static final class SelectItemArrayIterator extends
242             ComponentIterators.ComponentArrayIterator implements
243             ISelectItemIterator {
244         private static final String REVISION = "$Revision: 1.18 $";
245 
246         public SelectItemArrayIterator(UISelectItem selectItem) {
247             super(selectItem);
248         }
249 
250         public final UISelectItem next() {
251             return (UISelectItem) nextComponent();
252         }
253 
254         public UISelectItem[] toArray() {
255             return (UISelectItem[]) toArray(new UISelectItem[count()]);
256         }
257     }
258 
259     public static int findIndexOfFirstListItemSelected(ComboComponent component) {
260 
261         Object value = component.getValue();
262 
263         if (value == null) {
264             return -1;
265         }
266 
267         if (value instanceof Object[]) {
268             return findIndexOfFirstListItemSelected(component, (Object[]) value);
269         }
270 
271         return findIndexOfFirstListItemSelected(component, value);
272     }
273 
274     private static int findIndexOfFirstListItemSelected(
275             ComboComponent component, Object value) {
276 
277         ISelectItemIterator si = listItems(component);
278         if (si.hasNext() == false) {
279             return -1;
280         }
281 
282         int index = 0;
283         for (; si.hasNext(); index++) {
284             UISelectItem selectItem = si.next();
285 
286             Object cid = selectItem.getValue();
287             if (cid == null) {
288                 continue;
289             }
290 
291             if (value.equals(cid) == false) {
292                 continue;
293             }
294 
295             return index;
296         }
297 
298         return -1;
299 
300     }
301 
302     private static int findIndexOfFirstListItemSelected(
303             ComboComponent component, Object values[]) {
304 
305         if (values.length == 0) {
306             return -1;
307         }
308 
309         ISelectItemIterator si = listItems(component);
310         if (si.hasNext() == false) {
311             return -1;
312         }
313 
314         Set valuesSet = new HashSet(Arrays.asList(values));
315 
316         int index = 0;
317         for (; si.hasNext(); index++) {
318             UISelectItem selectItem = si.next();
319 
320             Object value = selectItem.getItemValue();
321             if (value == null) {
322                 continue;
323             }
324 
325             if (valuesSet.contains(value) == false) {
326                 continue;
327             }
328 
329             return index;
330         }
331 
332         return -1;
333     }
334 
335     public static void deselect(ComboComponent component, UISelectItem item) {
336         Object value = component.getValue();
337 
338         if (value == null) {
339             return;
340         }
341 
342         if (value instanceof String) {
343             deselect(component, item, (String) value);
344             return;
345         }
346 
347         if (value instanceof String[]) {
348             deselect(component, item, (String[]) value);
349             return;
350         }
351 
352         throw new IncompatibleValueException(value, "String, String[]");
353     }
354 
355     private static void deselect(ComboComponent component, UISelectItem item,
356             String id) {
357         if (id.equals(item.getId()) == false) {
358             return;
359         }
360 
361         component.setValue(null);
362     }
363 
364     private static void deselect(ComboComponent component, UISelectItem item,
365             String ids[]) {
366 
367         if (ids.length == 1) {
368             deselect(component, item, ids[0]);
369             return;
370         }
371 
372         Set idsSet = new HashSet(Arrays.asList(ids));
373         if (idsSet.remove(item.getId()) == false) {
374             // pas de remove ? donc pas de changement !
375             return;
376         }
377 
378         component.setValue(idsSet.toArray(new String[idsSet.size()]));
379     }
380 
381     public static void selectAll(ComboComponent component) {
382         ISelectItemIterator si = listItems(component);
383         if (si.hasNext() == false) {
384             component.setValue(null);
385             return;
386         }
387 
388         if ((component instanceof IMultipleSelectCapability) == false) {
389             // Une selection simple , on considere la value comme une simple
390             // String (pas un tableau)
391 
392             for (; si.hasNext();) {
393                 // On recherche le premier selectItem valide !
394                 UISelectItem selectItem = si.next();
395 
396                 String id = selectItem.getId();
397                 if (id == null) {
398                     continue;
399                 }
400 
401                 component.setValue(id);
402                 return;
403             }
404 
405             // On a rien trouv? !
406             component.setValue(null);
407             return;
408         }
409 
410         List l = new ArrayList(si.count());
411         for (; si.hasNext();) {
412             UISelectItem selectItem = si.next();
413 
414             String id = selectItem.getId();
415             if (id == null) {
416                 continue;
417             }
418 
419             l.add(id);
420         }
421 
422         component.setValue(l.toArray(new String[l.size()]));
423     }
424 
425     /*
426      * public static int[] listIndexOfAllSelectedItems(ListComponent component) {
427      * return null; }
428      */
429     /**
430      * 
431      */
432     public static void select(ComboComponent comboComponent, UISelectItem item) {
433         if ((comboComponent instanceof IMultipleSelectCapability) == false) {
434             // Selection simple, c'ets le cas d'une Combo
435 
436             if (USE_ARRAY_VALUE_FOR_Combo) {
437                 comboComponent.setValue(new Object[] { item.getItemValue() });
438                 return;
439             }
440 
441             comboComponent.setValue(item.getItemValue());
442             return;
443         }
444 
445         Object value = comboComponent.getValue();
446         if (value == null) {
447             comboComponent.setValue(new Object[] { item.getItemValue() });
448             return;
449         }
450 
451         Set ids;
452         if (value instanceof Object[]) {
453             Object s[] = (Object[]) value;
454 
455             ids = new HashSet(Arrays.asList(s));
456         } else {
457             ids = new HashSet(2);
458             ids.add(value);
459         }
460 
461         ids.add(item.getItemValue());
462 
463         comboComponent.setValue(ids.toArray());
464     }
465 
466     public static Set listAllSelectedItemsSet(ComboComponent component) {
467 
468         Object value = component.getValue();
469         if (value == null) {
470             return Collections.EMPTY_SET;
471         }
472 
473         if (value instanceof Object[]) {
474             // C'est peut ?tre le cas de la listBox
475 
476             List l = listAllSelectedItems(component, (Object[]) value);
477             if (l == null) {
478                 return Collections.EMPTY_SET;
479             }
480             return new HashSet(l);
481         }
482 
483         UISelectItem us = listAllSelectedItems(component, value);
484         if (us == null) {
485             return Collections.EMPTY_SET;
486         }
487         Set set = new HashSet(1);
488         set.add(us);
489 
490         return set;
491     }
492 }