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