OLD | NEW |
1 package autotest.common.ui; | 1 package autotest.common.ui; |
2 | 2 |
3 import com.google.gwt.event.dom.client.ChangeEvent; | 3 import com.google.gwt.event.dom.client.ChangeEvent; |
4 import com.google.gwt.event.dom.client.ChangeHandler; | 4 import com.google.gwt.event.dom.client.ChangeHandler; |
5 import com.google.gwt.event.dom.client.ClickEvent; | 5 import com.google.gwt.event.dom.client.ClickEvent; |
6 import com.google.gwt.event.dom.client.ClickHandler; | 6 import com.google.gwt.event.dom.client.ClickHandler; |
7 import com.google.gwt.event.dom.client.DoubleClickEvent; | 7 import com.google.gwt.event.dom.client.DoubleClickEvent; |
8 import com.google.gwt.event.dom.client.DoubleClickHandler; | 8 import com.google.gwt.event.dom.client.DoubleClickHandler; |
9 import com.google.gwt.event.dom.client.HasClickHandlers; | 9 import com.google.gwt.event.dom.client.HasClickHandlers; |
10 import com.google.gwt.event.shared.GwtEvent; | 10 import com.google.gwt.event.shared.GwtEvent; |
(...skipping 14 matching lines...) Expand all Loading... |
25 public HasClickHandlers getRemoveButton(); | 25 public HasClickHandlers getRemoveButton(); |
26 public HasClickHandlers getRemoveAllButton(); | 26 public HasClickHandlers getRemoveAllButton(); |
27 public HasClickHandlers getMoveUpButton(); | 27 public HasClickHandlers getMoveUpButton(); |
28 public HasClickHandlers getMoveDownButton(); | 28 public HasClickHandlers getMoveDownButton(); |
29 public SimplifiedList getAvailableList(); | 29 public SimplifiedList getAvailableList(); |
30 public SimplifiedList getSelectedList(); | 30 public SimplifiedList getSelectedList(); |
31 // ListBoxes don't support DoubleClickEvents themselves, so the display
needs to handle them | 31 // ListBoxes don't support DoubleClickEvents themselves, so the display
needs to handle them |
32 public HandlerRegistration addDoubleClickHandler(DoubleClickHandler hand
ler); | 32 public HandlerRegistration addDoubleClickHandler(DoubleClickHandler hand
ler); |
33 } | 33 } |
34 | 34 |
35 /* Optional additional display allowing toggle between a simple ListBox and
a | 35 /* Optional additional display allowing toggle between a simple ListBox and
a |
36 * DoubleListSelector | 36 * DoubleListSelector |
37 */ | 37 */ |
38 public interface ToggleDisplay { | 38 public interface ToggleDisplay { |
39 public SimplifiedList getSingleSelector(); | 39 public SimplifiedList getSingleSelector(); |
40 public ToggleControl getToggleMultipleLink(); | 40 public ToggleControl getToggleMultipleLink(); |
41 public void setDoubleListVisible(boolean doubleListVisible); | 41 public void setDoubleListVisible(boolean doubleListVisible); |
42 } | 42 } |
43 | 43 |
44 public interface GeneratorHandler { | 44 public interface GeneratorHandler { |
45 /** | 45 /** |
46 * The given generated Item was just deselected; handle any necessary cl
eanup. | 46 * The given generated Item was just deselected; handle any necessary cl
eanup. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 86 |
87 @Override | 87 @Override |
88 public int hashCode() { | 88 public int hashCode() { |
89 return name.hashCode(); | 89 return name.hashCode(); |
90 } | 90 } |
91 | 91 |
92 @Override | 92 @Override |
93 public String toString() { | 93 public String toString() { |
94 return "Item<" + name + ", " + value + ">"; | 94 return "Item<" + name + ", " + value + ">"; |
95 } | 95 } |
96 | 96 |
97 private boolean isSelected() { | 97 private boolean isSelected() { |
98 if (isGeneratedItem) { | 98 if (isGeneratedItem) { |
99 return true; | 99 return true; |
100 } | 100 } |
101 return selected; | 101 return selected; |
102 } | 102 } |
103 | 103 |
104 private void setSelected(boolean selected) { | 104 private void setSelected(boolean selected) { |
105 assert !isGeneratedItem; | 105 assert !isGeneratedItem; |
106 this.selected = selected; | 106 this.selected = selected; |
107 } | 107 } |
108 } | 108 } |
109 | 109 |
110 /** | 110 /** |
111 * Null object to support displays that don't do toggling. | 111 * Null object to support displays that don't do toggling. |
112 */ | 112 */ |
113 private static class NullToggleDisplay implements ToggleDisplay { | 113 private static class NullToggleDisplay implements ToggleDisplay { |
(...skipping 17 matching lines...) Expand all Loading... |
131 | 131 |
132 @Override | 132 @Override |
133 public void selectByName(String name) { | 133 public void selectByName(String name) { |
134 return; | 134 return; |
135 } | 135 } |
136 | 136 |
137 @Override | 137 @Override |
138 public HandlerRegistration addChangeHandler(ChangeHandler handle
r) { | 138 public HandlerRegistration addChangeHandler(ChangeHandler handle
r) { |
139 throw new UnsupportedOperationException(); | 139 throw new UnsupportedOperationException(); |
140 } | 140 } |
141 | |
142 @Override | |
143 public void setEnabled(boolean enabled) { | |
144 throw new UnsupportedOperationException(); | |
145 } | |
146 }; | 141 }; |
147 } | 142 } |
148 | 143 |
149 @Override | 144 @Override |
150 public ToggleControl getToggleMultipleLink() { | 145 public ToggleControl getToggleMultipleLink() { |
151 return new ToggleControl() { | 146 return new ToggleControl() { |
152 @Override | 147 @Override |
153 public HandlerRegistration addClickHandler(ClickHandler handler)
{ | 148 public HandlerRegistration addClickHandler(ClickHandler handler)
{ |
154 throw new UnsupportedOperationException(); | 149 throw new UnsupportedOperationException(); |
155 } | 150 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 this.toggleDisplay = toggleDisplay; | 198 this.toggleDisplay = toggleDisplay; |
204 toggleDisplay.getSingleSelector().addChangeHandler(this); | 199 toggleDisplay.getSingleSelector().addChangeHandler(this); |
205 toggleDisplay.getToggleMultipleLink().addClickHandler(this); | 200 toggleDisplay.getToggleMultipleLink().addClickHandler(this); |
206 toggleDisplay.getToggleMultipleLink().setActive(false); | 201 toggleDisplay.getToggleMultipleLink().setActive(false); |
207 } | 202 } |
208 | 203 |
209 private boolean verifyConsistency() { | 204 private boolean verifyConsistency() { |
210 // check consistency of selectedItems | 205 // check consistency of selectedItems |
211 for (Item item : items) { | 206 for (Item item : items) { |
212 if (item.isSelected() && !selectedItems.contains(item)) { | 207 if (item.isSelected() && !selectedItems.contains(item)) { |
213 throw new RuntimeException("selectedItems is inconsistent, missi
ng: " | 208 throw new RuntimeException("selectedItems is inconsistent, missi
ng: " |
214 + item.toString()); | 209 + item.toString()); |
215 } | 210 } |
216 } | 211 } |
217 return true; | 212 return true; |
218 } | 213 } |
219 | 214 |
220 public void addItem(Item item) { | 215 public void addItem(Item item) { |
221 if (item.isGeneratedItem && isItemPresent(item)) { | 216 if (item.isGeneratedItem && isItemPresent(item)) { |
222 return; | 217 return; |
223 } | 218 } |
224 items.add(item); | 219 items.add(item); |
225 Collections.sort(items); | 220 Collections.sort(items); |
226 if (item.isSelected()) { | 221 if (item.isSelected()) { |
227 selectedItems.add(item); | 222 selectedItems.add(item); |
228 } | 223 } |
229 assert verifyConsistency(); | 224 assert verifyConsistency(); |
230 refresh(); | 225 refresh(); |
231 } | 226 } |
232 | 227 |
233 private boolean isItemPresent(Item item) { | 228 private boolean isItemPresent(Item item) { |
234 return Collections.binarySearch(items, item) >= 0; | 229 return Collections.binarySearch(items, item) >= 0; |
235 } | 230 } |
236 | 231 |
237 private void removeItem(Item item) { | 232 private void removeItem(Item item) { |
238 items.remove(item); | 233 items.remove(item); |
239 if (item.isSelected()) { | 234 if (item.isSelected()) { |
240 selectedItems.remove(item); | 235 selectedItems.remove(item); |
241 } | 236 } |
242 assert verifyConsistency(); | 237 assert verifyConsistency(); |
243 refresh(); | 238 refresh(); |
244 } | 239 } |
245 | 240 |
246 public void clearItems() { | 241 public void clearItems() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 } | 287 } |
293 refreshSingleSelector(); | 288 refreshSingleSelector(); |
294 } | 289 } |
295 } | 290 } |
296 | 291 |
297 private void selectItem(Item item) { | 292 private void selectItem(Item item) { |
298 item.setSelected(true); | 293 item.setSelected(true); |
299 selectedItems.add(item); | 294 selectedItems.add(item); |
300 assert verifyConsistency(); | 295 assert verifyConsistency(); |
301 } | 296 } |
302 | 297 |
303 public void selectItemByName(String name) { | 298 public void selectItemByName(String name) { |
304 selectItem(getItemByName(name)); | 299 selectItem(getItemByName(name)); |
305 refresh(); | 300 refresh(); |
306 } | 301 } |
307 | 302 |
308 /** | 303 /** |
309 * Set the set of selected items by specifying item names. All names must e
xist in the set of | 304 * Set the set of selected items by specifying item names. All names must e
xist in the set of |
310 * header fields. | 305 * header fields. |
311 */ | 306 */ |
312 public void setSelectedItemsByName(List<String> names) { | 307 public void setSelectedItemsByName(List<String> names) { |
(...skipping 11 matching lines...) Expand all Loading... |
324 } | 319 } |
325 } | 320 } |
326 | 321 |
327 if (selectedItems.size() < 2) { | 322 if (selectedItems.size() < 2) { |
328 switchToSingle(); | 323 switchToSingle(); |
329 } | 324 } |
330 refresh(); | 325 refresh(); |
331 } | 326 } |
332 | 327 |
333 /** | 328 /** |
334 * Set the set of selected items, silently dropping any that don't exist in
the header field | 329 * Set the set of selected items, silently dropping any that don't exist in
the header field |
335 * list. | 330 * list. |
336 */ | 331 */ |
337 public void restoreSelectedItems(List<Item> items) { | 332 public void restoreSelectedItems(List<Item> items) { |
338 List<String> currentItems = new ArrayList<String>(); | 333 List<String> currentItems = new ArrayList<String>(); |
339 for (Item item : items) { | 334 for (Item item : items) { |
340 if (hasItemName(item.name)) { | 335 if (hasItemName(item.name)) { |
341 currentItems.add(item.name); | 336 currentItems.add(item.name); |
342 } | 337 } |
343 } | 338 } |
344 setSelectedItemsByName(currentItems); | 339 setSelectedItemsByName(currentItems); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 } | 382 } |
388 | 383 |
389 private Item findItem(String name) { | 384 private Item findItem(String name) { |
390 for (Item item : items) { | 385 for (Item item : items) { |
391 if (item.name.equals(name)) { | 386 if (item.name.equals(name)) { |
392 return item; | 387 return item; |
393 } | 388 } |
394 } | 389 } |
395 return null; | 390 return null; |
396 } | 391 } |
397 | 392 |
398 public boolean hasItemName(String name) { | 393 public boolean hasItemName(String name) { |
399 return findItem(name) != null; | 394 return findItem(name) != null; |
400 } | 395 } |
401 | 396 |
402 @Override | 397 @Override |
403 public void onClick(ClickEvent event) { | 398 public void onClick(ClickEvent event) { |
404 boolean isItemSelectedOnLeft = display.getAvailableList().getSelectedNam
e() != null; | 399 boolean isItemSelectedOnLeft = (display.getAvailableList().getSelectedNa
me() != null); |
405 boolean isItemSelectedOnRight = display.getSelectedList().getSelectedNam
e() != null; | 400 boolean isItemSelectedOnRight = (display.getSelectedList().getSelectedNa
me() != null); |
406 Object source = event.getSource(); | 401 Object source = event.getSource(); |
407 if (source == display.getAddAllButton()) { | 402 if (source == display.getAddAllButton()) { |
408 addAll(); | 403 addAll(); |
409 } else if (source == display.getAddButton() && isItemSelectedOnLeft) { | 404 } else if (source == display.getAddButton() && isItemSelectedOnLeft) { |
410 doSelect(); | 405 doSelect(); |
411 } else if (source == display.getRemoveButton() && isItemSelectedOnRight)
{ | 406 } else if (source == display.getRemoveButton() && isItemSelectedOnRight)
{ |
412 doDeselect(); | 407 doDeselect(); |
413 } else if (source == display.getRemoveAllButton()) { | 408 } else if (source == display.getRemoveAllButton()) { |
414 deselectAll(); | 409 deselectAll(); |
415 } else if ((source == display.getMoveUpButton() || source == display.get
MoveDownButton()) | 410 } else if ((source == display.getMoveUpButton() || source == display.get
MoveDownButton()) |
416 && isItemSelectedOnRight) { | 411 && isItemSelectedOnRight) { |
417 reorderItem(source == display.getMoveUpButton()); | 412 reorderItem(source == display.getMoveUpButton()); |
418 return; // don't refresh again or we'll mess up the user's selection | 413 return; // don't refresh again or we'll mess up the user's selection |
419 } else if (source == toggleDisplay.getToggleMultipleLink()) { | 414 } else if (source == toggleDisplay.getToggleMultipleLink()) { |
420 if (toggleDisplay.getToggleMultipleLink().isActive()) { | 415 if (toggleDisplay.getToggleMultipleLink().isActive()) { |
421 switchToMultiple(); | 416 switchToMultiple(); |
422 } else { | 417 } else { |
423 switchToSingle(); | 418 switchToSingle(); |
424 } | 419 } |
425 } else { | 420 } else { |
426 throw new RuntimeException("Unexpected ClickEvent from " + event.get
Source()); | 421 throw new RuntimeException("Unexpected ClickEvent from " + event.get
Source()); |
427 } | 422 } |
428 | 423 |
429 refresh(); | 424 refresh(); |
430 } | 425 } |
431 | 426 |
432 @Override | 427 @Override |
433 public void onDoubleClick(DoubleClickEvent event) { | 428 public void onDoubleClick(DoubleClickEvent event) { |
434 Object source = event.getSource(); | 429 Object source = event.getSource(); |
435 if (source == display.getAvailableList()) { | 430 if (source == display.getAvailableList()) { |
436 doSelect(); | 431 doSelect(); |
437 } else if (source == display.getSelectedList()) { | 432 } else if (source == display.getSelectedList()) { |
438 doDeselect(); | 433 doDeselect(); |
439 } else { | 434 } else { |
440 // ignore double-clicks on other widgets | 435 // ignore double-clicks on other widgets |
441 return; | 436 return; |
442 } | 437 } |
443 | 438 |
444 refresh(); | 439 refresh(); |
445 } | 440 } |
446 | 441 |
447 @Override | 442 @Override |
448 public void onChange(ChangeEvent event) { | 443 public void onChange(ChangeEvent event) { |
449 assert toggleDisplay != null; | 444 assert toggleDisplay != null; |
450 SimplifiedList selector = toggleDisplay.getSingleSelector(); | 445 SimplifiedList selector = toggleDisplay.getSingleSelector(); |
451 assert event.getSource() == selector; | 446 assert event.getSource() == selector; |
452 // events should only come from the single selector when it's active | 447 // events should only come from the single selector when it's active |
453 assert !toggleDisplay.getToggleMultipleLink().isActive(); | 448 assert !toggleDisplay.getToggleMultipleLink().isActive(); |
454 | 449 |
455 for (Item item : getItemsCopy()) { | 450 for (Item item : getItemsCopy()) { |
456 if (item.isSelected()) { | 451 if (item.isSelected()) { |
457 deselectItem(item); | 452 deselectItem(item); |
458 } else if (item.name.equals(selector.getSelectedName())) { | 453 } else if (item.name.equals(selector.getSelectedName())) { |
459 selectItem(item); | 454 selectItem(item); |
460 } | 455 } |
461 } | 456 } |
462 | 457 |
463 refresh(); | 458 refresh(); |
464 } | 459 } |
465 | 460 |
466 /** | 461 /** |
467 * Selecting or deselecting items can add or remove items (due to generators
), so sometimes we | 462 * Selecting or deselecting items can add or remove items (due to generators
), so sometimes we |
468 * need to iterate over a copy. | 463 * need to iterate over a copy. |
469 */ | 464 */ |
470 private Iterable<Item> getItemsCopy() { | 465 private Iterable<Item> getItemsCopy() { |
471 return new ArrayList<Item>(items); | 466 return new ArrayList<Item>(items); |
472 } | 467 } |
(...skipping 26 matching lines...) Expand all Loading... |
499 Item item = getItemByName(display.getSelectedList().getSelectedName()); | 494 Item item = getItemByName(display.getSelectedList().getSelectedName()); |
500 int positionDelta = moveUp ? -1 : 1; | 495 int positionDelta = moveUp ? -1 : 1; |
501 int newPosition = selectedItems.indexOf(item) + positionDelta; | 496 int newPosition = selectedItems.indexOf(item) + positionDelta; |
502 newPosition = Math.max(0, Math.min(selectedItems.size() - 1, newPosition
)); | 497 newPosition = Math.max(0, Math.min(selectedItems.size() - 1, newPosition
)); |
503 selectedItems.remove(item); | 498 selectedItems.remove(item); |
504 selectedItems.add(newPosition, item); | 499 selectedItems.add(newPosition, item); |
505 refresh(); | 500 refresh(); |
506 display.getSelectedList().selectByName(item.name); | 501 display.getSelectedList().selectByName(item.name); |
507 } | 502 } |
508 } | 503 } |
OLD | NEW |