1 package autotest.tko; 2 3 import autotest.common.SimpleCallback; 4 import autotest.common.ui.NotifyManager; 5 import autotest.common.ui.SimplifiedList; 6 7 import com.google.gwt.event.dom.client.ClickEvent; 8 import com.google.gwt.event.dom.client.ClickHandler; 9 import com.google.gwt.event.dom.client.HasClickHandlers; 10 import com.google.gwt.user.client.ui.HasText; 11 12 import java.util.ArrayList; 13 import java.util.HashMap; 14 import java.util.HashSet; 15 import java.util.List; 16 import java.util.Map; 17 import java.util.Set; 18 19 public class ParameterizedFieldListPresenter implements ClickHandler { 20 public interface Display { 21 public interface FieldWidget { 22 public HasClickHandlers getDeleteLink(); 23 } 24 25 public SimplifiedList getTypeSelect(); 26 public HasText getValueInput(); 27 public HasClickHandlers getAddLink(); 28 public FieldWidget addFieldWidget(String name, String filteringName); 29 public void removeFieldWidget(FieldWidget widget); 30 } 31 32 private Display display; 33 private HeaderFieldCollection headerFields; 34 private Map<ParameterizedField, Display.FieldWidget> fieldInputMap = 35 new HashMap<ParameterizedField, Display.FieldWidget>(); 36 private Set<Object> fieldIds = new HashSet<Object>(); 37 private SimpleCallback changeListener; 38 39 /** 40 * @param headerFields Generated ParameterizedFields will be added to this (and removed when 41 * they're deleted) 42 */ 43 public ParameterizedFieldListPresenter(HeaderFieldCollection headerFields) { 44 this.headerFields = headerFields; 45 } 46 47 public void bindDisplay(Display display) { 48 this.display = display; 49 display.getAddLink().addClickHandler(this); 50 populateTypeSelect(); 51 } 52 53 public void setListener(SimpleCallback changeListener) { 54 this.changeListener = changeListener; 55 } 56 57 private void populateTypeSelect() { 58 for (String name : ParameterizedField.getFieldTypeNames()) { 59 display.getTypeSelect().addItem(name, name); 60 } 61 } 62 63 @Override 64 public void onClick(ClickEvent event) { 65 assert event.getSource() == display.getAddLink(); 66 67 String type = display.getTypeSelect().getSelectedName(); 68 String value = display.getValueInput().getText(); 69 if (value.isEmpty()) { 70 NotifyManager.getInstance().showError("You must provide a value"); 71 return; 72 } 73 74 ParameterizedField field = createField(type, value); 75 if (fieldIds.contains(field.getIdentifier())) { 76 NotifyManager.getInstance().showError("This field already exists: " + field.getName()); 77 return; 78 } 79 80 addField(field); 81 changeListener.doCallback(this); 82 display.getValueInput().setText(""); 83 } 84 85 private ParameterizedField createField(String type, String value) { 86 return ParameterizedField.newInstance(type, value); 87 } 88 89 private void addField(final ParameterizedField field) { 90 headerFields.add(field); 91 92 Display.FieldWidget fieldWidget = display.addFieldWidget(field.getName(), 93 field.getFilteringName()); 94 fieldInputMap.put(field, fieldWidget); 95 fieldWidget.getDeleteLink().addClickHandler(new ClickHandler() { 96 @Override 97 public void onClick(ClickEvent event) { 98 deleteField(field); 99 changeListener.doCallback(this); 100 } 101 }); 102 103 fieldIds.add(field.getIdentifier()); 104 } 105 106 public void addFieldIfNotPresent(String type, String name) { 107 ParameterizedField field = createField(type, name); 108 if (!fieldIds.contains(field.getIdentifier())) { 109 addField(field); 110 } 111 } 112 113 private void deleteField(ParameterizedField field) { 114 headerFields.remove(field); 115 Display.FieldWidget widget = fieldInputMap.remove(field); 116 display.removeFieldWidget(widget); 117 fieldIds.remove(field.getIdentifier()); 118 } 119 120 private String getListKey(int index) { 121 return "parameterized_field_" + Integer.toString(index); 122 } 123 124 public void addHistoryArguments(Map<String, String> arguments) { 125 int index = 0; 126 for (ParameterizedField field : fieldInputMap.keySet()) { 127 String baseKey = getListKey(index); 128 arguments.put(baseKey + "_type", field.getTypeName()); 129 arguments.put(baseKey + "_value", field.getValue()); 130 index++; 131 } 132 } 133 134 public void handleHistoryArguments(Map<String, String> arguments) { 135 reset(); 136 for (int index = 0; ; index++) { 137 String baseKey = getListKey(index); 138 String typeKey = baseKey + "_type"; 139 String valueKey = baseKey + "_value"; 140 if (!arguments.containsKey(typeKey) || !arguments.containsKey(valueKey)) { 141 break; 142 } 143 144 String typeName = arguments.get(typeKey), value = arguments.get(valueKey); 145 addField(createField(typeName, value)); 146 } 147 changeListener.doCallback(this); 148 } 149 150 private void reset() { 151 // avoid ConcurrentModificationException 152 List<ParameterizedField> fieldListCopy = 153 new ArrayList<ParameterizedField>(fieldInputMap.keySet()); 154 for (ParameterizedField field : fieldListCopy) { 155 deleteField(field); 156 } 157 } 158 } 159