package autotest.tko; import autotest.common.SimpleCallback; import autotest.common.ui.NotifyManager; import autotest.common.ui.SimplifiedList; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.user.client.ui.HasText; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class ParameterizedFieldListPresenter implements ClickHandler { public interface Display { public interface FieldWidget { public HasClickHandlers getDeleteLink(); } public SimplifiedList getTypeSelect(); public HasText getValueInput(); public HasClickHandlers getAddLink(); public FieldWidget addFieldWidget(String name, String filteringName); public void removeFieldWidget(FieldWidget widget); } private Display display; private HeaderFieldCollection headerFields; private Map fieldInputMap = new HashMap(); private Set fieldIds = new HashSet(); private SimpleCallback changeListener; /** * @param headerFields Generated ParameterizedFields will be added to this (and removed when * they're deleted) */ public ParameterizedFieldListPresenter(HeaderFieldCollection headerFields) { this.headerFields = headerFields; } public void bindDisplay(Display display) { this.display = display; display.getAddLink().addClickHandler(this); populateTypeSelect(); } public void setListener(SimpleCallback changeListener) { this.changeListener = changeListener; } private void populateTypeSelect() { for (String name : ParameterizedField.getFieldTypeNames()) { display.getTypeSelect().addItem(name, name); } } @Override public void onClick(ClickEvent event) { assert event.getSource() == display.getAddLink(); String type = display.getTypeSelect().getSelectedName(); String value = display.getValueInput().getText(); if (value.isEmpty()) { NotifyManager.getInstance().showError("You must provide a value"); return; } ParameterizedField field = createField(type, value); if (fieldIds.contains(field.getIdentifier())) { NotifyManager.getInstance().showError("This field already exists: " + field.getName()); return; } addField(field); changeListener.doCallback(this); display.getValueInput().setText(""); } private ParameterizedField createField(String type, String value) { return ParameterizedField.newInstance(type, value); } private void addField(final ParameterizedField field) { headerFields.add(field); Display.FieldWidget fieldWidget = display.addFieldWidget(field.getName(), field.getFilteringName()); fieldInputMap.put(field, fieldWidget); fieldWidget.getDeleteLink().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { deleteField(field); changeListener.doCallback(this); } }); fieldIds.add(field.getIdentifier()); } public void addFieldIfNotPresent(String type, String name) { ParameterizedField field = createField(type, name); if (!fieldIds.contains(field.getIdentifier())) { addField(field); } } private void deleteField(ParameterizedField field) { headerFields.remove(field); Display.FieldWidget widget = fieldInputMap.remove(field); display.removeFieldWidget(widget); fieldIds.remove(field.getIdentifier()); } private String getListKey(int index) { return "parameterized_field_" + Integer.toString(index); } public void addHistoryArguments(Map arguments) { int index = 0; for (ParameterizedField field : fieldInputMap.keySet()) { String baseKey = getListKey(index); arguments.put(baseKey + "_type", field.getTypeName()); arguments.put(baseKey + "_value", field.getValue()); index++; } } public void handleHistoryArguments(Map arguments) { reset(); for (int index = 0; ; index++) { String baseKey = getListKey(index); String typeKey = baseKey + "_type"; String valueKey = baseKey + "_value"; if (!arguments.containsKey(typeKey) || !arguments.containsKey(valueKey)) { break; } String typeName = arguments.get(typeKey), value = arguments.get(valueKey); addField(createField(typeName, value)); } changeListener.doCallback(this); } private void reset() { // avoid ConcurrentModificationException List fieldListCopy = new ArrayList(fieldInputMap.keySet()); for (ParameterizedField field : fieldListCopy) { deleteField(field); } } }