1
2
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
24
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
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
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
83 return null;
84 }
85
86 ISelectItemIterator si = listItems(component);
87 if (si.hasNext() == false) {
88
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
101
102 continue;
103 }
104
105 if (valuesSet.contains(value) == false) {
106
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
193
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
216
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
239
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
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
390
391
392 for (; si.hasNext();) {
393
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
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
427
428
429
430
431
432 public static void select(ComboComponent comboComponent, UISelectItem item) {
433 if ((comboComponent instanceof IMultipleSelectCapability) == false) {
434
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
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 }