• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
getDeleteLink()22             public HasClickHandlers getDeleteLink();
23         }
24 
getTypeSelect()25         public SimplifiedList getTypeSelect();
getValueInput()26         public HasText getValueInput();
getAddLink()27         public HasClickHandlers getAddLink();
addFieldWidget(String name, String filteringName)28         public FieldWidget addFieldWidget(String name, String filteringName);
removeFieldWidget(FieldWidget widget)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      */
ParameterizedFieldListPresenter(HeaderFieldCollection headerFields)43     public ParameterizedFieldListPresenter(HeaderFieldCollection headerFields) {
44         this.headerFields = headerFields;
45     }
46 
bindDisplay(Display display)47     public void bindDisplay(Display display) {
48         this.display = display;
49         display.getAddLink().addClickHandler(this);
50         populateTypeSelect();
51     }
52 
setListener(SimpleCallback changeListener)53     public void setListener(SimpleCallback changeListener) {
54         this.changeListener = changeListener;
55     }
56 
populateTypeSelect()57     private void populateTypeSelect() {
58         for (String name : ParameterizedField.getFieldTypeNames()) {
59             display.getTypeSelect().addItem(name, name);
60         }
61     }
62 
63     @Override
onClick(ClickEvent event)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 
createField(String type, String value)85     private ParameterizedField createField(String type, String value) {
86         return ParameterizedField.newInstance(type, value);
87     }
88 
addField(final ParameterizedField field)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 
addFieldIfNotPresent(String type, String name)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 
deleteField(ParameterizedField field)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 
getListKey(int index)120     private String getListKey(int index) {
121         return "parameterized_field_" + Integer.toString(index);
122     }
123 
addHistoryArguments(Map<String, String> arguments)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 
handleHistoryArguments(Map<String, String> arguments)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 
reset()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