Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: frontend/client/src/autotest/common/ui/MultiListSelectPresenter.java

Issue 3554003: Merge remote branch 'cros/upstream' into tempbranch3 (Closed) Base URL: http://git.chromium.org/git/autotest.git
Patch Set: Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « frontend/client/src/autotest/common/table/DynamicTable.java ('k') | frontend/client/src/autotest/common/ui/RadioChooser.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698