18579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardpackage autotest.afe;
28579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
3ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luoimport autotest.afe.ITextBox;
48579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport autotest.common.JSONArrayList;
58579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport autotest.common.StaticDataRepository;
68579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport autotest.common.Utils;
78579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport autotest.common.table.DataTable;
88579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport autotest.common.table.DataTable.DataTableListener;
98579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport autotest.common.table.DataTable.TableWidgetFactory;
106f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.table.SelectionManager;
118579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport autotest.common.table.SelectionManager.SelectionListener;
126f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.table.TableClickWidget;
136f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.ui.SimplifiedList;
148579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
150d92da0fe19a095fc5678c4159e6a1756df65e48showardimport com.google.gwt.event.dom.client.ChangeEvent;
160d92da0fe19a095fc5678c4159e6a1756df65e48showardimport com.google.gwt.event.dom.client.ChangeHandler;
178579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport com.google.gwt.json.client.JSONArray;
188579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport com.google.gwt.json.client.JSONObject;
198579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport com.google.gwt.user.client.ui.Composite;
206f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport com.google.gwt.user.client.ui.HasHTML;
218579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport com.google.gwt.user.client.ui.Widget;
228579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
238579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport java.util.ArrayList;
248579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport java.util.Collection;
258579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport java.util.HashMap;
268579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport java.util.List;
278579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshowardimport java.util.Map;
288579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
296f27d4f22a1ba5063968b8c322fa0845f3279adeEric Lipublic class TestSelector extends Composite implements DataTableListener, ChangeHandler,
308579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward                                                TableWidgetFactory, SelectionListener {
316f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public static interface Display {
326f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public SimplifiedList getTestTypeSelect();
33ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo        public ITextBox getTestNameFilter();
346f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public IDataTable getTestTable();
356f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public ISelectionManager getTestSelection();
366f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public HasHTML getTestInfo();
376f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    }
386f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
396f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    // TODO: Change DataTable to passive view, then get rid of this ad-hoc interface
406f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public static interface IDataTable {
416f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public void setWidgetFactory(TableWidgetFactory widgetFactory);
426f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public void addListener(DataTableListener listener);
436f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public void clear();
446f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public void addRow(JSONObject row);
456f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public void refreshWidgets();
466f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
476f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public static class DataTableImpl extends DataTable implements IDataTable {
486f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            public DataTableImpl(String[][] columns) {
496f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li                super(columns);
506f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            }
516f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        }
526f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    }
536f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
546f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    // TODO: Change SelectionManager to use the DataTable passive view model, then get rid of this
556f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    // ad-hoc interface
566f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public static interface ISelectionManager {
576f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public void deselectAll();
586f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public Widget createWidget(int row, int cell, JSONObject rowObject);
596f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public void addListener(SelectionListener listener);
606f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
616f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        public static class SelectionManagerImpl extends SelectionManager
626f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li                implements ISelectionManager {
636f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            public SelectionManagerImpl(DataTable table, boolean selectOnlyOne) {
646f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li                super(table, selectOnlyOne);
656f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            }
666f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
676f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        }
686f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    }
696f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
708579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    // control file types
716f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public static final String SERVER_TYPE = "Server";
726f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public static final String CLIENT_TYPE = "Client";
736f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
748579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public static interface TestSelectorListener {
758579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        /**
768579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward         * Called when a test is selected or deselected, or when the test type is changed.
778579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward         */
788579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        public void onTestSelectionChanged();
798579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
806f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
818579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    private static class TestInfoBuilder {
828579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private static final Map<String, String> timeMap = new HashMap<String, String>();
838579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        static {
848579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            timeMap.put("SHORT", "less than 15 minutes");
858579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            timeMap.put("MEDIUM", "15 minutes to four hours");
868579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            timeMap.put("LONG", "over four hours");
878579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
886f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
898579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private StringBuilder builder = new StringBuilder();
908579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private JSONObject test;
916f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
928579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        public TestInfoBuilder(JSONObject test) {
938579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            this.test = test;
946f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
958579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            writeTitleLine();
968579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            appendTextField("Written by", getField("author"));
972bab8f45adedeacbf2d62d37b90255581adc3c7dshoward            appendTextField("Type", getField("test_type"));
98529cdf3a9bd5d6c8f29d18a00ce3229880b9e4c2showard            appendTextField("Synchronization count", getField("sync_count"));
998579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            writeTime();
1008579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            writeSkipVerify(test);
1016f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1028579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            builder.append("<br>" + getField("description"));
1038579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1048579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
1058579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private void writeTitleLine() {
1068579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            builder.append("<b>" + getField("name") + "</b> ");
1076f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            builder.append("(" +
1086f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li                           getField("test_class") + " / " + getField("test_category") +
1098579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward                           ")<br><br>");
1108579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1116f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1128579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private void writeTime() {
1138579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            String time = getField("test_time");
1148579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            String timeDetail = "unknown time";
1158579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            if (timeMap.containsKey(time)) {
1168579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward                timeDetail = timeMap.get(time);
1178579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            }
1188579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            appendTextField("Time", time + " (" + timeDetail + ")");
1198579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1208579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
1218579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private void writeSkipVerify(JSONObject test) {
1221a9eaa51c52c10953e3d296a7b529126eab2862eshoward            if (!test.get("run_verify").isBoolean().booleanValue()) {
1238579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward                builder.append("Verify is <b>not</b> run<br>");
1248579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            }
1258579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1268579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
1278579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private void appendTextField(String name, String text) {
1288579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            builder.append("<b>" + name + "</b>: " + text + "<br>");
1298579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1308579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
1318579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        private String getField(String field) {
1321a9eaa51c52c10953e3d296a7b529126eab2862eshoward            return Utils.escape(Utils.jsonToString(test.get(field)));
1338579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1346f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1358579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        public String getInfo() {
1368579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            return builder.toString();
1378579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1388579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
1396f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1408579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    private boolean enabled = true;
1418579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    private TestSelectorListener listener;
14297db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard    private StaticDataRepository staticData = StaticDataRepository.getRepository();
143907f2159b2605a4b330ee76dbafc99c8bda4bca0showard    private List<JSONObject> selectedTests = new ArrayList<JSONObject>();
144d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori    private JSONArray imageTests = new JSONArray();
1456f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1466f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    private Display display;
1476f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1486f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public void bindDisplay(Display display) {
1496f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        this.display = display;
1506f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1516f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTypeSelect().addItem(CLIENT_TYPE, CLIENT_TYPE);
1526f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTypeSelect().addItem(SERVER_TYPE, SERVER_TYPE);
1536f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTypeSelect().addChangeHandler(this);
1546f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1556f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTable().setWidgetFactory(this);
1566f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTable().addListener(this);
1576f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1588579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        populateTests();
1596f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1606f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestSelection().addListener(this);
161ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo        display.getTestNameFilter().addChangeHandler(this);
1628579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
1636f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1648579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    private void populateTests() {
1656f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestSelection().deselectAll();
1666f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTable().clear();
1676f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1688579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        JSONArray tests = staticData.getData("tests").isArray();
169d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori
1701043809018daa39812a64805c04456ce7b706d08Matthew Sartori        if (usingTestsFromBuild()) {
171d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori            tests = imageTests;
172d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori        }
173d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori
1748579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        for (JSONObject test : new JSONArrayList<JSONObject>(tests)) {
1756f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            if (!includeExperimentalTests()
17697db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard                    && test.get("experimental").isBoolean().booleanValue()) {
17797db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard                continue;
17897db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard            }
179d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori            String testType = test.get("test_type").isString().stringValue().toLowerCase();
180ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo            String testName = test.get("name").isString().stringValue().toLowerCase();
181ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo            if (testType.equals(getSelectedTestType()) &&
182ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo                testName.contains(getTestNameFilterText())) {
1836f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li                display.getTestTable().addRow(test);
1848579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            }
1858579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
1868579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
1878579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
18897db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard    private boolean includeExperimentalTests() {
18997db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard        JSONObject user = staticData.getData("current_user").isObject();
19097db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard        return user.get("show_experimental").isBoolean().booleanValue();
19197db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard    }
1926f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1934cd4763a855d8eb7d25fd4963babc432eb4d25e6showard    @Override
1944cd4763a855d8eb7d25fd4963babc432eb4d25e6showard    public void onRowClicked(int rowIndex, JSONObject row, boolean isRightClick) {
1958579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        TestInfoBuilder builder = new TestInfoBuilder(row);
1966f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestInfo().setHTML(builder.getInfo());
1978579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
1986f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1990d92da0fe19a095fc5678c4159e6a1756df65e48showard    @Override
2000d92da0fe19a095fc5678c4159e6a1756df65e48showard    public void onChange(ChangeEvent event) {
2018579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        populateTests();
2028579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        notifyListener();
2038579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2046f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
2058579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public Collection<JSONObject> getSelectedTests() {
206907f2159b2605a4b330ee76dbafc99c8bda4bca0showard        return selectedTests;
2078579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2088579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
2098579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public String getSelectedTestType() {
210d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori        return display.getTestTypeSelect().getSelectedName().toLowerCase();
2118579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2128579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
213ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo    public String getTestNameFilterText() {
214ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo        return display.getTestNameFilter().getText().toLowerCase();
215ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo    }
216ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo
2178579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public void setEnabled(boolean enabled) {
2188579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        this.enabled = enabled;
2196f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTypeSelect().setEnabled(enabled);
220ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo        display.getTestNameFilter().setEnabled(enabled);
2216f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTable().refreshWidgets();
2228579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2238579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
2248579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public Widget createWidget(int row, int cell, JSONObject rowObject) {
2256f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        TableClickWidget widget =
2266f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            (TableClickWidget) display.getTestSelection().createWidget(row, cell, rowObject);
2278579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        if (!enabled) {
2288579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            widget.getContainedWidget().setEnabled(false);
2298579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
2308579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        return widget;
2318579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2328579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
2338579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public void reset() {
2346f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        display.getTestTypeSelect().selectByName(CLIENT_TYPE);
235ad57645f1fd54b398a386fe184f5c47a91ddb1a3Jiaxi Luo        display.getTestNameFilter().setText("");
23697db5ba6cdee21d706dff3d1a85c354c8bfae6f9showard        populateTests();
2378579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2386f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
2398579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    private void notifyListener() {
2408579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        if (listener != null) {
2418579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward            listener.onTestSelectionChanged();
2428579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        }
2438579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2448579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
2458579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public void setListener(TestSelectorListener listener) {
2468579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        this.listener = listener;
2478579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2488579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
2498579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public void onAdd(Collection<JSONObject> objects) {
250907f2159b2605a4b330ee76dbafc99c8bda4bca0showard        selectedTests.addAll(objects);
2518579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        notifyListener();
2528579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
2538579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward
2548579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    public void onRemove(Collection<JSONObject> objects) {
255907f2159b2605a4b330ee76dbafc99c8bda4bca0showard        selectedTests.removeAll(objects);
2568579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward        notifyListener();
2578579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward    }
258d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori
259d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori    public void setImageTests(JSONArray tests) {
260d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori        imageTests = tests;
261d96fb9b34a65661008adab39b5ca998844ec7543Matthew Sartori    }
2621043809018daa39812a64805c04456ce7b706d08Matthew Sartori
2631043809018daa39812a64805c04456ce7b706d08Matthew Sartori    public boolean usingTestsFromBuild() {
2641043809018daa39812a64805c04456ce7b706d08Matthew Sartori        return imageTests.size() > 0;
2651043809018daa39812a64805c04456ce7b706d08Matthew Sartori    }
2668579ea343f8d4c74b44d5b5cb2df3ef7552b2f6eshoward}
267