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