blob: c0d0c16fd12ee6c2d64a1d29c5ddfe90c661579c [file] [log] [blame]
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<ParameterizedField, Display.FieldWidget> fieldInputMap =
new HashMap<ParameterizedField, Display.FieldWidget>();
private Set<Object> fieldIds = new HashSet<Object>();
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<String, String> 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<String, String> 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<ParameterizedField> fieldListCopy =
new ArrayList<ParameterizedField>(fieldInputMap.keySet());
for (ParameterizedField field : fieldListCopy) {
deleteField(field);
}
}
}