OLD | NEW |
1 package autotest.afe; | 1 package autotest.afe; |
2 | 2 |
3 import autotest.common.JSONArrayList; | 3 import autotest.common.JSONArrayList; |
4 import autotest.common.StaticDataRepository; | 4 import autotest.common.StaticDataRepository; |
5 import autotest.common.Utils; | 5 import autotest.common.Utils; |
6 import autotest.common.table.DataTable; | 6 import autotest.common.table.DataTable; |
7 import autotest.common.table.SelectionManager; | |
8 import autotest.common.table.TableClickWidget; | |
9 import autotest.common.table.DataTable.DataTableListener; | 7 import autotest.common.table.DataTable.DataTableListener; |
10 import autotest.common.table.DataTable.TableWidgetFactory; | 8 import autotest.common.table.DataTable.TableWidgetFactory; |
| 9 import autotest.common.table.SelectionManager; |
11 import autotest.common.table.SelectionManager.SelectionListener; | 10 import autotest.common.table.SelectionManager.SelectionListener; |
| 11 import autotest.common.table.TableClickWidget; |
| 12 import autotest.common.ui.SimplifiedList; |
12 | 13 |
13 import com.google.gwt.event.dom.client.ChangeEvent; | 14 import com.google.gwt.event.dom.client.ChangeEvent; |
14 import com.google.gwt.event.dom.client.ChangeHandler; | 15 import com.google.gwt.event.dom.client.ChangeHandler; |
15 import com.google.gwt.json.client.JSONArray; | 16 import com.google.gwt.json.client.JSONArray; |
16 import com.google.gwt.json.client.JSONObject; | 17 import com.google.gwt.json.client.JSONObject; |
17 import com.google.gwt.user.client.ui.Composite; | 18 import com.google.gwt.user.client.ui.Composite; |
18 import com.google.gwt.user.client.ui.HTML; | 19 import com.google.gwt.user.client.ui.HasHTML; |
19 import com.google.gwt.user.client.ui.HorizontalPanel; | |
20 import com.google.gwt.user.client.ui.HorizontalSplitPanel; | |
21 import com.google.gwt.user.client.ui.Label; | |
22 import com.google.gwt.user.client.ui.ListBox; | |
23 import com.google.gwt.user.client.ui.Panel; | |
24 import com.google.gwt.user.client.ui.VerticalPanel; | |
25 import com.google.gwt.user.client.ui.Widget; | 20 import com.google.gwt.user.client.ui.Widget; |
26 | 21 |
27 import java.util.ArrayList; | 22 import java.util.ArrayList; |
28 import java.util.Collection; | 23 import java.util.Collection; |
29 import java.util.HashMap; | 24 import java.util.HashMap; |
30 import java.util.List; | 25 import java.util.List; |
31 import java.util.Map; | 26 import java.util.Map; |
32 | 27 |
33 class TestSelector extends Composite implements DataTableListener, ChangeHandler
, | 28 public class TestSelector extends Composite implements DataTableListener, Change
Handler, |
34 TableWidgetFactory, SelectionLis
tener { | 29 TableWidgetFactory, SelectionLis
tener { |
| 30 public static interface Display { |
| 31 public SimplifiedList getTestTypeSelect(); |
| 32 public IDataTable getTestTable(); |
| 33 public ISelectionManager getTestSelection(); |
| 34 public HasHTML getTestInfo(); |
| 35 } |
| 36 |
| 37 // TODO: Change DataTable to passive view, then get rid of this ad-hoc inter
face |
| 38 public static interface IDataTable { |
| 39 public void setWidgetFactory(TableWidgetFactory widgetFactory); |
| 40 public void addListener(DataTableListener listener); |
| 41 public void clear(); |
| 42 public void addRow(JSONObject row); |
| 43 public void refreshWidgets(); |
| 44 |
| 45 public static class DataTableImpl extends DataTable implements IDataTabl
e { |
| 46 public DataTableImpl(String[][] columns) { |
| 47 super(columns); |
| 48 } |
| 49 } |
| 50 } |
| 51 |
| 52 // TODO: Change SelectionManager to use the DataTable passive view model, th
en get rid of this |
| 53 // ad-hoc interface |
| 54 public static interface ISelectionManager { |
| 55 public void deselectAll(); |
| 56 public Widget createWidget(int row, int cell, JSONObject rowObject); |
| 57 public void addListener(SelectionListener listener); |
| 58 |
| 59 public static class SelectionManagerImpl extends SelectionManager |
| 60 implements ISelectionManager { |
| 61 public SelectionManagerImpl(DataTable table, boolean selectOnlyOne)
{ |
| 62 super(table, selectOnlyOne); |
| 63 } |
| 64 |
| 65 } |
| 66 } |
| 67 |
35 // control file types | 68 // control file types |
36 static final String SERVER_TYPE = "Server"; | 69 public static final String SERVER_TYPE = "Server"; |
37 static final String CLIENT_TYPE = "Client"; | 70 public static final String CLIENT_TYPE = "Client"; |
38 | 71 |
39 private static final String[][] testTableColumns = new String[][] { | |
40 {DataTable.WIDGET_COLUMN, ""}, | |
41 {"name", "Test"}, | |
42 }; | |
43 | |
44 public static interface TestSelectorListener { | 72 public static interface TestSelectorListener { |
45 /** | 73 /** |
46 * Called when a test is selected or deselected, or when the test type i
s changed. | 74 * Called when a test is selected or deselected, or when the test type i
s changed. |
47 */ | 75 */ |
48 public void onTestSelectionChanged(); | 76 public void onTestSelectionChanged(); |
49 } | 77 } |
50 | 78 |
51 private static class TestInfoBuilder { | 79 private static class TestInfoBuilder { |
52 private static final Map<String, String> timeMap = new HashMap<String, S
tring>(); | 80 private static final Map<String, String> timeMap = new HashMap<String, S
tring>(); |
53 static { | 81 static { |
54 timeMap.put("SHORT", "less than 15 minutes"); | 82 timeMap.put("SHORT", "less than 15 minutes"); |
55 timeMap.put("MEDIUM", "15 minutes to four hours"); | 83 timeMap.put("MEDIUM", "15 minutes to four hours"); |
56 timeMap.put("LONG", "over four hours"); | 84 timeMap.put("LONG", "over four hours"); |
57 } | 85 } |
58 | 86 |
59 private StringBuilder builder = new StringBuilder(); | 87 private StringBuilder builder = new StringBuilder(); |
60 private JSONObject test; | 88 private JSONObject test; |
61 | 89 |
62 public TestInfoBuilder(JSONObject test) { | 90 public TestInfoBuilder(JSONObject test) { |
63 this.test = test; | 91 this.test = test; |
64 | 92 |
65 writeTitleLine(); | 93 writeTitleLine(); |
66 appendTextField("Written by", getField("author")); | 94 appendTextField("Written by", getField("author")); |
67 appendTextField("Type", getField("test_type")); | 95 appendTextField("Type", getField("test_type")); |
68 appendTextField("Synchronization count", getField("sync_count")); | 96 appendTextField("Synchronization count", getField("sync_count")); |
69 writeTime(); | 97 writeTime(); |
70 writeSkipVerify(test); | 98 writeSkipVerify(test); |
71 | 99 |
72 builder.append("<br>" + getField("description")); | 100 builder.append("<br>" + getField("description")); |
73 } | 101 } |
74 | 102 |
75 private void writeTitleLine() { | 103 private void writeTitleLine() { |
76 builder.append("<b>" + getField("name") + "</b> "); | 104 builder.append("<b>" + getField("name") + "</b> "); |
77 builder.append("(" + | 105 builder.append("(" + |
78 getField("test_class") + " / " + getField("test_categ
ory") + | 106 getField("test_class") + " / " + getField("test_categ
ory") + |
79 ")<br><br>"); | 107 ")<br><br>"); |
80 } | 108 } |
81 | 109 |
82 private void writeTime() { | 110 private void writeTime() { |
83 String time = getField("test_time"); | 111 String time = getField("test_time"); |
84 String timeDetail = "unknown time"; | 112 String timeDetail = "unknown time"; |
85 if (timeMap.containsKey(time)) { | 113 if (timeMap.containsKey(time)) { |
86 timeDetail = timeMap.get(time); | 114 timeDetail = timeMap.get(time); |
87 } | 115 } |
88 appendTextField("Time", time + " (" + timeDetail + ")"); | 116 appendTextField("Time", time + " (" + timeDetail + ")"); |
89 } | 117 } |
90 | 118 |
91 private void writeSkipVerify(JSONObject test) { | 119 private void writeSkipVerify(JSONObject test) { |
92 if (!test.get("run_verify").isBoolean().booleanValue()) { | 120 if (!test.get("run_verify").isBoolean().booleanValue()) { |
93 builder.append("Verify is <b>not</b> run<br>"); | 121 builder.append("Verify is <b>not</b> run<br>"); |
94 } | 122 } |
95 } | 123 } |
96 | 124 |
97 private void appendTextField(String name, String text) { | 125 private void appendTextField(String name, String text) { |
98 builder.append("<b>" + name + "</b>: " + text + "<br>"); | 126 builder.append("<b>" + name + "</b>: " + text + "<br>"); |
99 } | 127 } |
100 | 128 |
101 private String getField(String field) { | 129 private String getField(String field) { |
102 return Utils.escape(Utils.jsonToString(test.get(field))); | 130 return Utils.escape(Utils.jsonToString(test.get(field))); |
103 } | 131 } |
104 | 132 |
105 public String getInfo() { | 133 public String getInfo() { |
106 return builder.toString(); | 134 return builder.toString(); |
107 } | 135 } |
108 } | 136 } |
109 | 137 |
110 private ListBox testTypeSelect = new ListBox(); | |
111 private DataTable testTable = new DataTable(testTableColumns); | |
112 private SelectionManager testSelection = new SelectionManager(testTable, fal
se); | |
113 private HTML testInfo = new HTML("Click a test to view its description"); | |
114 private HorizontalSplitPanel mainPanel = new HorizontalSplitPanel(); | |
115 private boolean enabled = true; | 138 private boolean enabled = true; |
116 private TestSelectorListener listener; | 139 private TestSelectorListener listener; |
117 private StaticDataRepository staticData = StaticDataRepository.getRepository
(); | 140 private StaticDataRepository staticData = StaticDataRepository.getRepository
(); |
118 private List<JSONObject> selectedTests = new ArrayList<JSONObject>(); | 141 private List<JSONObject> selectedTests = new ArrayList<JSONObject>(); |
119 | 142 |
120 public TestSelector() { | 143 private Display display; |
121 testInfo.setStyleName("test-description"); | 144 |
122 | 145 public void bindDisplay(Display display) { |
123 testTypeSelect.addItem(CLIENT_TYPE); | 146 this.display = display; |
124 testTypeSelect.addItem(SERVER_TYPE); | 147 |
125 testTypeSelect.addChangeHandler(this); | 148 display.getTestTypeSelect().addItem(CLIENT_TYPE, CLIENT_TYPE); |
126 | 149 display.getTestTypeSelect().addItem(SERVER_TYPE, SERVER_TYPE); |
127 testTable.fillParent(); | 150 display.getTestTypeSelect().addChangeHandler(this); |
128 testTable.setWidgetFactory(this); | 151 |
129 testTable.setClickable(true); | 152 display.getTestTable().setWidgetFactory(this); |
130 testTable.addListener(this); | 153 display.getTestTable().addListener(this); |
131 | 154 |
132 Panel testTypePanel = new HorizontalPanel(); | |
133 testTypePanel.add(new Label("Test type:")); | |
134 testTypePanel.add(testTypeSelect); | |
135 | |
136 Panel testInfoPanel = new VerticalPanel(); | |
137 testInfoPanel.add(testInfo); | |
138 | |
139 mainPanel.setLeftWidget(testTable); | |
140 mainPanel.setRightWidget(testInfoPanel); | |
141 mainPanel.setSize("100%", "30em"); | |
142 mainPanel.setSplitPosition("20em"); | |
143 | |
144 Panel container = new VerticalPanel(); | |
145 container.add(testTypePanel); | |
146 container.add(mainPanel); | |
147 container.setWidth("100%"); | |
148 | |
149 populateTests(); | 155 populateTests(); |
150 | 156 |
151 initWidget(container); | 157 display.getTestSelection().addListener(this); |
152 | |
153 testSelection.addListener(this); | |
154 } | 158 } |
155 | 159 |
156 private void populateTests() { | 160 private void populateTests() { |
157 testSelection.deselectAll(); | 161 display.getTestSelection().deselectAll(); |
158 testTable.clear(); | 162 display.getTestTable().clear(); |
159 | 163 |
160 JSONArray tests = staticData.getData("tests").isArray(); | 164 JSONArray tests = staticData.getData("tests").isArray(); |
161 for (JSONObject test : new JSONArrayList<JSONObject>(tests)) { | 165 for (JSONObject test : new JSONArrayList<JSONObject>(tests)) { |
162 if (!includeExperimentalTests() | 166 if (!includeExperimentalTests() |
163 && test.get("experimental").isBoolean().booleanValue()) { | 167 && test.get("experimental").isBoolean().booleanValue()) { |
164 continue; | 168 continue; |
165 } | 169 } |
166 String testType = test.get("test_type").isString().stringValue(); | 170 String testType = test.get("test_type").isString().stringValue(); |
167 if (testType.equals(getSelectedTestType())) { | 171 if (testType.equals(getSelectedTestType())) { |
168 testTable.addRow(test); | 172 display.getTestTable().addRow(test); |
169 } | 173 } |
170 } | 174 } |
171 } | 175 } |
172 | 176 |
173 private boolean includeExperimentalTests() { | 177 private boolean includeExperimentalTests() { |
174 JSONObject user = staticData.getData("current_user").isObject(); | 178 JSONObject user = staticData.getData("current_user").isObject(); |
175 return user.get("show_experimental").isBoolean().booleanValue(); | 179 return user.get("show_experimental").isBoolean().booleanValue(); |
176 } | 180 } |
177 | 181 |
178 @Override | 182 @Override |
179 public void onRowClicked(int rowIndex, JSONObject row, boolean isRightClick)
{ | 183 public void onRowClicked(int rowIndex, JSONObject row, boolean isRightClick)
{ |
180 TestInfoBuilder builder = new TestInfoBuilder(row); | 184 TestInfoBuilder builder = new TestInfoBuilder(row); |
181 testInfo.setHTML(builder.getInfo()); | 185 display.getTestInfo().setHTML(builder.getInfo()); |
182 } | 186 } |
183 | 187 |
184 @Override | 188 @Override |
185 public void onChange(ChangeEvent event) { | 189 public void onChange(ChangeEvent event) { |
186 populateTests(); | 190 populateTests(); |
187 notifyListener(); | 191 notifyListener(); |
188 } | 192 } |
189 | 193 |
190 public Collection<JSONObject> getSelectedTests() { | 194 public Collection<JSONObject> getSelectedTests() { |
191 return selectedTests; | 195 return selectedTests; |
192 } | 196 } |
193 | 197 |
194 public String getSelectedTestType() { | 198 public String getSelectedTestType() { |
195 return testTypeSelect.getItemText(testTypeSelect.getSelectedIndex()); | 199 return display.getTestTypeSelect().getSelectedName(); |
196 } | 200 } |
197 | 201 |
198 public void setEnabled(boolean enabled) { | 202 public void setEnabled(boolean enabled) { |
199 this.enabled = enabled; | 203 this.enabled = enabled; |
200 testTypeSelect.setEnabled(enabled); | 204 display.getTestTypeSelect().setEnabled(enabled); |
201 testTable.refreshWidgets(); | 205 display.getTestTable().refreshWidgets(); |
202 } | 206 } |
203 | 207 |
204 public Widget createWidget(int row, int cell, JSONObject rowObject) { | 208 public Widget createWidget(int row, int cell, JSONObject rowObject) { |
205 TableClickWidget widget = | 209 TableClickWidget widget = |
206 (TableClickWidget) testSelection.createWidget(row, cell, rowObject); | 210 (TableClickWidget) display.getTestSelection().createWidget(row, cell
, rowObject); |
207 if (!enabled) { | 211 if (!enabled) { |
208 widget.getContainedWidget().setEnabled(false); | 212 widget.getContainedWidget().setEnabled(false); |
209 } | 213 } |
210 return widget; | 214 return widget; |
211 } | 215 } |
212 | 216 |
213 public void reset() { | 217 public void reset() { |
214 testTypeSelect.setSelectedIndex(0); | 218 display.getTestTypeSelect().selectByName(CLIENT_TYPE); |
215 populateTests(); | 219 populateTests(); |
216 } | 220 } |
217 | 221 |
218 private void notifyListener() { | 222 private void notifyListener() { |
219 if (listener != null) { | 223 if (listener != null) { |
220 listener.onTestSelectionChanged(); | 224 listener.onTestSelectionChanged(); |
221 } | 225 } |
222 } | 226 } |
223 | 227 |
224 public void setListener(TestSelectorListener listener) { | 228 public void setListener(TestSelectorListener listener) { |
225 this.listener = listener; | 229 this.listener = listener; |
226 } | 230 } |
227 | 231 |
228 public void onAdd(Collection<JSONObject> objects) { | 232 public void onAdd(Collection<JSONObject> objects) { |
229 selectedTests.addAll(objects); | 233 selectedTests.addAll(objects); |
230 notifyListener(); | 234 notifyListener(); |
231 } | 235 } |
232 | 236 |
233 public void onRemove(Collection<JSONObject> objects) { | 237 public void onRemove(Collection<JSONObject> objects) { |
234 selectedTests.removeAll(objects); | 238 selectedTests.removeAll(objects); |
235 notifyListener(); | 239 notifyListener(); |
236 } | 240 } |
237 } | 241 } |
OLD | NEW |