| 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 |