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 } |
141 }; | 146 }; |
142 } | 147 } |
143 | 148 |
144 @Override | 149 @Override |
145 public ToggleControl getToggleMultipleLink() { | 150 public ToggleControl getToggleMultipleLink() { |
146 return new ToggleControl() { | 151 return new ToggleControl() { |
147 @Override | 152 @Override |
148 public HandlerRegistration addClickHandler(ClickHandler handler)
{ | 153 public HandlerRegistration addClickHandler(ClickHandler handler)
{ |
149 throw new UnsupportedOperationException(); | 154 throw new UnsupportedOperationException(); |
150 } | 155 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 this.toggleDisplay = toggleDisplay; | 203 this.toggleDisplay = toggleDisplay; |
199 toggleDisplay.getSingleSelector().addChangeHandler(this); | 204 toggleDisplay.getSingleSelector().addChangeHandler(this); |
200 toggleDisplay.getToggleMultipleLink().addClickHandler(this); | 205 toggleDisplay.getToggleMultipleLink().addClickHandler(this); |
201 toggleDisplay.getToggleMultipleLink().setActive(false); | 206 toggleDisplay.getToggleMultipleLink().setActive(false); |
202 } | 207 } |
203 | 208 |
204 private boolean verifyConsistency() { | 209 private boolean verifyConsistency() { |
205 // check consistency of selectedItems | 210 // check consistency of selectedItems |
206 for (Item item : items) { | 211 for (Item item : items) { |
207 if (item.isSelected() && !selectedItems.contains(item)) { | 212 if (item.isSelected() && !selectedItems.contains(item)) { |
208 throw new RuntimeException("selectedItems is inconsistent, missi
ng: " | 213 throw new RuntimeException("selectedItems is inconsistent, missi
ng: " |
209 + item.toString()); | 214 + item.toString()); |
210 } | 215 } |
211 } | 216 } |
212 return true; | 217 return true; |
213 } | 218 } |
214 | 219 |
215 public void addItem(Item item) { | 220 public void addItem(Item item) { |
216 if (item.isGeneratedItem && isItemPresent(item)) { | 221 if (item.isGeneratedItem && isItemPresent(item)) { |
217 return; | 222 return; |
218 } | 223 } |
219 items.add(item); | 224 items.add(item); |
220 Collections.sort(items); | 225 Collections.sort(items); |
221 if (item.isSelected()) { | 226 if (item.isSelected()) { |
222 selectedItems.add(item); | 227 selectedItems.add(item); |
223 } | 228 } |
224 assert verifyConsistency(); | 229 assert verifyConsistency(); |
225 refresh(); | 230 refresh(); |
226 } | 231 } |
227 | 232 |
228 private boolean isItemPresent(Item item) { | 233 private boolean isItemPresent(Item item) { |
229 return Collections.binarySearch(items, item) >= 0; | 234 return Collections.binarySearch(items, item) >= 0; |
230 } | 235 } |
231 | 236 |
232 private void removeItem(Item item) { | 237 private void removeItem(Item item) { |
233 items.remove(item); | 238 items.remove(item); |
234 if (item.isSelected()) { | 239 if (item.isSelected()) { |
235 selectedItems.remove(item); | 240 selectedItems.remove(item); |
236 } | 241 } |
237 assert verifyConsistency(); | 242 assert verifyConsistency(); |
238 refresh(); | 243 refresh(); |
239 } | 244 } |
240 | 245 |
241 public void clearItems() { | 246 public void clearItems() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 } | 292 } |
288 refreshSingleSelector(); | 293 refreshSingleSelector(); |
289 } | 294 } |
290 } | 295 } |
291 | 296 |
292 private void selectItem(Item item) { | 297 private void selectItem(Item item) { |
293 item.setSelected(true); | 298 item.setSelected(true); |
294 selectedItems.add(item); | 299 selectedItems.add(item); |
295 assert verifyConsistency(); | 300 assert verifyConsistency(); |
296 } | 301 } |
297 | 302 |
298 public void selectItemByName(String name) { | 303 public void selectItemByName(String name) { |
299 selectItem(getItemByName(name)); | 304 selectItem(getItemByName(name)); |
300 refresh(); | 305 refresh(); |
301 } | 306 } |
302 | 307 |
303 /** | 308 /** |
304 * Set the set of selected items by specifying item names. All names must e
xist in the set of | 309 * Set the set of selected items by specifying item names. All names must e
xist in the set of |
305 * header fields. | 310 * header fields. |
306 */ | 311 */ |
307 public void setSelectedItemsByName(List<String> names) { | 312 public void setSelectedItemsByName(List<String> names) { |
(...skipping 11 matching lines...) Expand all Loading... |
319 } | 324 } |
320 } | 325 } |
321 | 326 |
322 if (selectedItems.size() < 2) { | 327 if (selectedItems.size() < 2) { |
323 switchToSingle(); | 328 switchToSingle(); |
324 } | 329 } |
325 refresh(); | 330 refresh(); |
326 } | 331 } |
327 | 332 |
328 /** | 333 /** |
329 * Set the set of selected items, silently dropping any that don't exist in
the header field | 334 * Set the set of selected items, silently dropping any that don't exist in
the header field |
330 * list. | 335 * list. |
331 */ | 336 */ |
332 public void restoreSelectedItems(List<Item> items) { | 337 public void restoreSelectedItems(List<Item> items) { |
333 List<String> currentItems = new ArrayList<String>(); | 338 List<String> currentItems = new ArrayList<String>(); |
334 for (Item item : items) { | 339 for (Item item : items) { |
335 if (hasItemName(item.name)) { | 340 if (hasItemName(item.name)) { |
336 currentItems.add(item.name); | 341 currentItems.add(item.name); |
337 } | 342 } |
338 } | 343 } |
339 setSelectedItemsByName(currentItems); | 344 setSelectedItemsByName(currentItems); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 } | 387 } |
383 | 388 |
384 private Item findItem(String name) { | 389 private Item findItem(String name) { |
385 for (Item item : items) { | 390 for (Item item : items) { |
386 if (item.name.equals(name)) { | 391 if (item.name.equals(name)) { |
387 return item; | 392 return item; |
388 } | 393 } |
389 } | 394 } |
390 return null; | 395 return null; |
391 } | 396 } |
392 | 397 |
393 public boolean hasItemName(String name) { | 398 public boolean hasItemName(String name) { |
394 return findItem(name) != null; | 399 return findItem(name) != null; |
395 } | 400 } |
396 | 401 |
397 @Override | 402 @Override |
398 public void onClick(ClickEvent event) { | 403 public void onClick(ClickEvent event) { |
399 boolean isItemSelectedOnLeft = (display.getAvailableList().getSelectedNa
me() != null); | 404 boolean isItemSelectedOnLeft = display.getAvailableList().getSelectedNam
e() != null; |
400 boolean isItemSelectedOnRight = (display.getSelectedList().getSelectedNa
me() != null); | 405 boolean isItemSelectedOnRight = display.getSelectedList().getSelectedNam
e() != null; |
401 Object source = event.getSource(); | 406 Object source = event.getSource(); |
402 if (source == display.getAddAllButton()) { | 407 if (source == display.getAddAllButton()) { |
403 addAll(); | 408 addAll(); |
404 } else if (source == display.getAddButton() && isItemSelectedOnLeft) { | 409 } else if (source == display.getAddButton() && isItemSelectedOnLeft) { |
405 doSelect(); | 410 doSelect(); |
406 } else if (source == display.getRemoveButton() && isItemSelectedOnRight)
{ | 411 } else if (source == display.getRemoveButton() && isItemSelectedOnRight)
{ |
407 doDeselect(); | 412 doDeselect(); |
408 } else if (source == display.getRemoveAllButton()) { | 413 } else if (source == display.getRemoveAllButton()) { |
409 deselectAll(); | 414 deselectAll(); |
410 } else if ((source == display.getMoveUpButton() || source == display.get
MoveDownButton()) | 415 } else if ((source == display.getMoveUpButton() || source == display.get
MoveDownButton()) |
411 && isItemSelectedOnRight) { | 416 && isItemSelectedOnRight) { |
412 reorderItem(source == display.getMoveUpButton()); | 417 reorderItem(source == display.getMoveUpButton()); |
413 return; // don't refresh again or we'll mess up the user's selection | 418 return; // don't refresh again or we'll mess up the user's selection |
414 } else if (source == toggleDisplay.getToggleMultipleLink()) { | 419 } else if (source == toggleDisplay.getToggleMultipleLink()) { |
415 if (toggleDisplay.getToggleMultipleLink().isActive()) { | 420 if (toggleDisplay.getToggleMultipleLink().isActive()) { |
416 switchToMultiple(); | 421 switchToMultiple(); |
417 } else { | 422 } else { |
418 switchToSingle(); | 423 switchToSingle(); |
419 } | 424 } |
420 } else { | 425 } else { |
421 throw new RuntimeException("Unexpected ClickEvent from " + event.get
Source()); | 426 throw new RuntimeException("Unexpected ClickEvent from " + event.get
Source()); |
422 } | 427 } |
423 | 428 |
424 refresh(); | 429 refresh(); |
425 } | 430 } |
426 | 431 |
427 @Override | 432 @Override |
428 public void onDoubleClick(DoubleClickEvent event) { | 433 public void onDoubleClick(DoubleClickEvent event) { |
429 Object source = event.getSource(); | 434 Object source = event.getSource(); |
430 if (source == display.getAvailableList()) { | 435 if (source == display.getAvailableList()) { |
431 doSelect(); | 436 doSelect(); |
432 } else if (source == display.getSelectedList()) { | 437 } else if (source == display.getSelectedList()) { |
433 doDeselect(); | 438 doDeselect(); |
434 } else { | 439 } else { |
435 // ignore double-clicks on other widgets | 440 // ignore double-clicks on other widgets |
436 return; | 441 return; |
437 } | 442 } |
438 | 443 |
439 refresh(); | 444 refresh(); |
440 } | 445 } |
441 | 446 |
442 @Override | 447 @Override |
443 public void onChange(ChangeEvent event) { | 448 public void onChange(ChangeEvent event) { |
444 assert toggleDisplay != null; | 449 assert toggleDisplay != null; |
445 SimplifiedList selector = toggleDisplay.getSingleSelector(); | 450 SimplifiedList selector = toggleDisplay.getSingleSelector(); |
446 assert event.getSource() == selector; | 451 assert event.getSource() == selector; |
447 // events should only come from the single selector when it's active | 452 // events should only come from the single selector when it's active |
448 assert !toggleDisplay.getToggleMultipleLink().isActive(); | 453 assert !toggleDisplay.getToggleMultipleLink().isActive(); |
449 | 454 |
450 for (Item item : getItemsCopy()) { | 455 for (Item item : getItemsCopy()) { |
451 if (item.isSelected()) { | 456 if (item.isSelected()) { |
452 deselectItem(item); | 457 deselectItem(item); |
453 } else if (item.name.equals(selector.getSelectedName())) { | 458 } else if (item.name.equals(selector.getSelectedName())) { |
454 selectItem(item); | 459 selectItem(item); |
455 } | 460 } |
456 } | 461 } |
457 | 462 |
458 refresh(); | 463 refresh(); |
459 } | 464 } |
460 | 465 |
461 /** | 466 /** |
462 * Selecting or deselecting items can add or remove items (due to generators
), so sometimes we | 467 * Selecting or deselecting items can add or remove items (due to generators
), so sometimes we |
463 * need to iterate over a copy. | 468 * need to iterate over a copy. |
464 */ | 469 */ |
465 private Iterable<Item> getItemsCopy() { | 470 private Iterable<Item> getItemsCopy() { |
466 return new ArrayList<Item>(items); | 471 return new ArrayList<Item>(items); |
467 } | 472 } |
(...skipping 26 matching lines...) Expand all Loading... |
494 Item item = getItemByName(display.getSelectedList().getSelectedName()); | 499 Item item = getItemByName(display.getSelectedList().getSelectedName()); |
495 int positionDelta = moveUp ? -1 : 1; | 500 int positionDelta = moveUp ? -1 : 1; |
496 int newPosition = selectedItems.indexOf(item) + positionDelta; | 501 int newPosition = selectedItems.indexOf(item) + positionDelta; |
497 newPosition = Math.max(0, Math.min(selectedItems.size() - 1, newPosition
)); | 502 newPosition = Math.max(0, Math.min(selectedItems.size() - 1, newPosition
)); |
498 selectedItems.remove(item); | 503 selectedItems.remove(item); |
499 selectedItems.add(newPosition, item); | 504 selectedItems.add(newPosition, item); |
500 refresh(); | 505 refresh(); |
501 display.getSelectedList().selectByName(item.name); | 506 display.getSelectedList().selectByName(item.name); |
502 } | 507 } |
503 } | 508 } |
OLD | NEW |