Have embedded spreadsheets follow the passive view design pattern

Signed-off-by: James Ren <[email protected]>
Index: autotest/frontend/client/src/autotest/EmbeddedSpreadsheetClient.gwt.xml
===================================================================
--- autotest/frontend/client/src/autotest/EmbeddedSpreadsheetClient.gwt.xml	(revision 4598)
+++ autotest/frontend/client/src/autotest/EmbeddedSpreadsheetClient.gwt.xml	(working copy)
@@ -5,7 +5,7 @@
 
   <source path="tko"/>
   <source path="common"/>
-  <entry-point class='autotest.tko.EmbeddedSpreadsheetClient'/>
+  <entry-point class='autotest.tko.embedded_spreadsheet.EmbeddedSpreadsheetClient'/>
 
   <stylesheet src='common.css'/>
   <stylesheet src='standard.css'/>
Index: autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetClient.java
===================================================================
--- autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetClient.java	(revision 0)
+++ autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetClient.java	(revision 0)
@@ -0,0 +1,17 @@
+package autotest.tko.embedded_spreadsheet;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.RootPanel;
+
+public class EmbeddedSpreadsheetClient implements EntryPoint {
+    private EmbeddedSpreadsheetPresenter presenter = new EmbeddedSpreadsheetPresenter();
+    private EmbeddedSpreadsheetDisplay display = new EmbeddedSpreadsheetDisplay();
+
+    @Override
+    public void onModuleLoad() {
+        presenter.bindDisplay(display);
+        presenter.initialize(Window.Location.getParameter("afe_job_id"));
+        RootPanel.get().add(display);
+    }
+}
Index: autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetDisplay.java
===================================================================
--- autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetDisplay.java	(revision 0)
+++ autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetDisplay.java	(revision 0)
@@ -0,0 +1,59 @@
+package autotest.tko.embedded_spreadsheet;
+
+import autotest.common.spreadsheet.Spreadsheet;
+
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Panel;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
+
+public class EmbeddedSpreadsheetDisplay extends Composite
+        implements EmbeddedSpreadsheetPresenter.Display {
+    private static final String NO_RESULTS = "There are no results for this query (yet?)";
+
+    private Panel panel = new SimplePanel();
+    private Spreadsheet spreadsheet = new Spreadsheet();
+    private Label noResults = new Label(NO_RESULTS);
+
+    public EmbeddedSpreadsheetDisplay() {
+        initWidget(panel);
+    }
+
+    private void notifyParent(Widget w) {
+        Element elem = w.getElement();
+        notifyParent(elem.getClientWidth(), elem.getClientHeight());
+    }
+
+    private native void notifyParent(int width, int height) /*-{
+        $wnd.parent.postMessage(width + 'px ' + height + 'px', '*');
+    }-*/;
+
+    @Override
+    public Command getOnSpreadsheetRendered() {
+        return new Command() {
+            @Override
+            public void execute() {
+                notifyParent(spreadsheet);
+            }
+        };
+    }
+
+    @Override
+    public Spreadsheet getSpreadsheet() {
+        return spreadsheet;
+    }
+
+    @Override
+    public void showNoResults() {
+        panel.add(noResults);
+        notifyParent(noResults);
+    }
+
+    @Override
+    public void showSpreadsheet() {
+        panel.add(spreadsheet);
+    }
+}
Index: autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetPresenter.java
===================================================================
--- autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetPresenter.java	(revision 0)
+++ autotest/frontend/client/src/autotest/tko/embedded_spreadsheet/EmbeddedSpreadsheetPresenter.java	(revision 0)
@@ -0,0 +1,165 @@
+package autotest.tko.embedded_spreadsheet;
+
+import autotest.common.JsonRpcCallback;
+import autotest.common.JsonRpcProxy;
+import autotest.common.spreadsheet.Spreadsheet;
+import autotest.common.spreadsheet.Spreadsheet.CellInfo;
+import autotest.common.spreadsheet.Spreadsheet.SpreadsheetListener;
+import autotest.tko.HeaderField;
+import autotest.tko.SpreadsheetDataProcessor;
+import autotest.tko.TestGroupDataSource;
+import autotest.tko.TestSet;
+import autotest.tko.TkoSpreadsheetUtils;
+import autotest.tko.TkoSpreadsheetUtils.DrilldownType;
+
+import com.google.gwt.http.client.URL;
+import com.google.gwt.json.client.JSONNumber;
+import com.google.gwt.json.client.JSONObject;
+import com.google.gwt.json.client.JSONValue;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
+
+import java.util.Collections;
+import java.util.List;
+
+public class EmbeddedSpreadsheetPresenter implements SpreadsheetListener {
+    public interface Display {
+        public void showNoResults();
+        public void showSpreadsheet();
+        public Spreadsheet getSpreadsheet();
+        public Command getOnSpreadsheetRendered();
+    }
+
+    private static class SimpleHeaderField extends HeaderField {
+        protected SimpleHeaderField(String name) {
+            super(name, name);
+        }
+
+        @Override
+        public String getSqlCondition(String value) {
+            return getSimpleSqlCondition(name, value);
+        }
+    }
+
+    public static final String ROW_HEADER = "hostname";
+    public static final String COLUMN_HEADER = "test_name";
+    public static final String DRILLDOWN_ROW_HEADER = "job_tag";
+    public static final String DRILLDOWN_COLUMN_HEADER = "subdir";
+
+    private List<HeaderField> rowHeader =
+            Collections.singletonList((HeaderField) new SimpleHeaderField(ROW_HEADER));
+    private List<HeaderField> columnHeader =
+            Collections.singletonList((HeaderField) new SimpleHeaderField(COLUMN_HEADER));
+
+    private String afeJobIdStr;
+    private JSONObject condition;
+
+    private Display display;
+
+    public void bindDisplay(Display display) {
+        this.display = display;
+    }
+
+    public void initialize(String afeJobIdStr) {
+        JsonRpcProxy.setDefaultBaseUrl(JsonRpcProxy.TKO_BASE_URL);
+        this.afeJobIdStr = afeJobIdStr;
+
+        condition = getFilterCondition(afeJobIdStr);
+        if (condition == null) {
+            showNoResults();
+        }
+
+        JsonRpcProxy.getProxy().rpcCall("get_num_test_views", condition, new JsonRpcCallback() {
+            @Override
+            public void onSuccess(JSONValue result) {
+                if (result.isNumber().doubleValue() != 0) {
+                    renderSpreadsheet(condition);
+                } else {
+                    showNoResults();
+                }
+            }
+        });
+    }
+
+    private JSONObject getFilterCondition(String afeJobIdStr) {
+        if (afeJobIdStr == null) {
+            return null;
+        }
+
+        int afeJobId;
+        try {
+            afeJobId = Integer.parseInt(afeJobIdStr);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+
+        JSONObject condition = new JSONObject();
+        condition.put("afe_job_id", new JSONNumber(afeJobId));
+        return condition;
+    }
+
+    private void showNoResults() {
+        display.showNoResults();
+    }
+
+    private void renderSpreadsheet(JSONObject condition) {
+        display.showSpreadsheet();
+        SpreadsheetDataProcessor spreadsheetProcessor =
+                new SpreadsheetDataProcessor(display.getSpreadsheet());
+        spreadsheetProcessor.setDataSource(TestGroupDataSource.getStatusCountDataSource());
+        spreadsheetProcessor.setHeaders(rowHeader, columnHeader, new JSONObject());
+
+        display.getSpreadsheet().setListener(this);
+        spreadsheetProcessor.refresh(condition, display.getOnSpreadsheetRendered());
+    }
+
+    @Override
+    public void onCellClicked(CellInfo cellInfo, boolean isRightClick) {
+        TestSet testSet = TkoSpreadsheetUtils.getTestSet(
+                cellInfo, condition, rowHeader, columnHeader);
+
+        if (testSet.isSingleTest()) {
+            openTestDetailView(testSet.getTestIndex());
+        } else {
+            openSpreadsheetView(testSet.getPartialSqlCondition(),
+                    TkoSpreadsheetUtils.getDrilldownType(cellInfo));
+        }
+    }
+
+    private void openTestDetailView(int testIdx) {
+        openUrl("/new_tko/#tab_id=test_detail_view&object_id=" + testIdx);
+    }
+
+    private void openSpreadsheetView(String extraCondition, DrilldownType drilldownType) {
+        String drilldownPath;
+
+        switch (drilldownType) {
+        case DRILLDOWN_ROW:
+            drilldownPath = generatePath(DRILLDOWN_ROW_HEADER, COLUMN_HEADER, extraCondition);
+            break;
+        case DRILLDOWN_COLUMN:
+            drilldownPath = generatePath(ROW_HEADER, DRILLDOWN_COLUMN_HEADER, extraCondition);
+            break;
+        case DRILLDOWN_BOTH:
+            drilldownPath = generatePath(
+                    DRILLDOWN_ROW_HEADER, DRILLDOWN_COLUMN_HEADER, extraCondition);
+            break;
+        default:
+            throw new UnsupportedOperationException(
+                    "DrilldownType " + drilldownType + " not supported");
+        }
+
+        openUrl(drilldownPath);
+    }
+
+    private String generatePath(String rowHeader, String columnHeader, String extraCondition) {
+        String condition = "afe_job_id = " + afeJobIdStr + " AND " + extraCondition;
+
+        return "/new_tko/#tab_id=spreadsheet_view&row=" + rowHeader + "&column=" + columnHeader +
+                "&condition=" + URL.encodeComponent(condition, true) + "&show_incomplete=true";
+    }
+
+    private void openUrl(String url) {
+        Window.open(url, "_blank", null);
+    }
+}
Index: autotest/frontend/client/src/autotest/tko/TestGroupDataSource.java
===================================================================
--- autotest/frontend/client/src/autotest/tko/TestGroupDataSource.java	(revision 4598)
+++ autotest/frontend/client/src/autotest/tko/TestGroupDataSource.java	(working copy)
@@ -13,7 +13,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-class TestGroupDataSource extends RpcDataSource {
+public class TestGroupDataSource extends RpcDataSource {
     private static final String NUM_GROUPS_RPC = "get_num_groups";
     private static final String GROUP_COUNTS_RPC = "get_group_counts";
     private static final String STATUS_COUNTS_RPC = "get_status_counts";
Index: autotest/frontend/client/src/autotest/tko/EmbeddedSpreadsheetClient.java
===================================================================
--- autotest/frontend/client/src/autotest/tko/EmbeddedSpreadsheetClient.java	(revision 4598)
+++ autotest/frontend/client/src/autotest/tko/EmbeddedSpreadsheetClient.java	(working copy)
@@ -1,172 +0,0 @@
-package autotest.tko;
-
-import autotest.common.JsonRpcCallback;
-import autotest.common.JsonRpcProxy;
-import autotest.common.spreadsheet.Spreadsheet;
-import autotest.common.spreadsheet.Spreadsheet.CellInfo;
-import autotest.common.spreadsheet.Spreadsheet.SpreadsheetListener;
-import autotest.tko.TkoSpreadsheetUtils.DrilldownType;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.http.client.URL;
-import com.google.gwt.json.client.JSONNumber;
-import com.google.gwt.json.client.JSONObject;
-import com.google.gwt.json.client.JSONValue;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.RootPanel;
-
-import java.util.Collections;
-import java.util.List;
-
-public class EmbeddedSpreadsheetClient implements EntryPoint, SpreadsheetListener {
-    private static class SimpleHeaderField extends HeaderField {
-        protected SimpleHeaderField(String name) {
-            super(name, name);
-        }
-
-        @Override
-        public String getSqlCondition(String value) {
-            return getSimpleSqlCondition(name, value);
-        }
-    }
-
-    public static final String ROW_HEADER = "hostname";
-    public static final String COLUMN_HEADER = "test_name";
-    private static final String NO_RESULTS = "There are no results for this query (yet?)";
-
-    public static final String DRILLDOWN_ROW_HEADER = "job_tag";
-    public static final String DRILLDOWN_COLUMN_HEADER = "subdir";
-
-    private Label noResults = new Label(NO_RESULTS);
-    private Spreadsheet spreadsheet = new Spreadsheet();
-    private SpreadsheetDataProcessor spreadsheetProcessor =
-            new SpreadsheetDataProcessor(spreadsheet);
-    private List<HeaderField> rowHeader =
-            Collections.singletonList((HeaderField) new SimpleHeaderField(ROW_HEADER));
-    private List<HeaderField> columnHeader =
-            Collections.singletonList((HeaderField) new SimpleHeaderField(COLUMN_HEADER));
-
-    private String afeJobIdStr;
-    private JSONObject condition;
-
-    @Override
-    public void onModuleLoad() {
-        JsonRpcProxy.setDefaultBaseUrl(JsonRpcProxy.TKO_BASE_URL);
-        afeJobIdStr = Window.Location.getParameter("afe_job_id");
-        checkAndRender();
-    }
-
-    private void checkAndRender() {
-        condition = getFilterCondition(afeJobIdStr);
-        if (condition == null) {
-            showNoResults();
-        }
-
-        JsonRpcProxy.getProxy().rpcCall("get_num_test_views", condition, new JsonRpcCallback() {
-            @Override
-            public void onSuccess(JSONValue result) {
-                if (result.isNumber().doubleValue() != 0) {
-                    renderSpreadsheet(condition);
-                } else {
-                    showNoResults();
-                }
-            }
-        });
-    }
-
-    private JSONObject getFilterCondition(String afeJobIdStr) {
-        if (afeJobIdStr == null) {
-            return null;
-        }
-
-        int afeJobId;
-        try {
-            afeJobId = Integer.parseInt(afeJobIdStr);
-        } catch (NumberFormatException e) {
-            return null;
-        }
-
-        JSONObject condition = new JSONObject();
-        condition.put("afe_job_id", new JSONNumber(afeJobId));
-        return condition;
-    }
-
-    private void showNoResults() {
-        RootPanel.get().add(noResults);
-        notifyParent(noResults.getElement());
-    }
-
-    private void renderSpreadsheet(JSONObject condition) {
-        spreadsheetProcessor.setDataSource(TestGroupDataSource.getStatusCountDataSource());
-        spreadsheetProcessor.setHeaders(rowHeader, columnHeader, new JSONObject());
-
-        spreadsheet.setListener(this);
-        RootPanel.get().add(spreadsheet);
-        spreadsheetProcessor.refresh(condition, new Command() {
-            public void execute() {
-                notifyParent(spreadsheet.getElement());
-            }
-        });
-    }
-
-    private void notifyParent(Element elem) {
-        notifyParent(elem.getClientWidth(), elem.getClientHeight());
-    }
-
-    private native void notifyParent(int width, int height) /*-{
-        $wnd.parent.postMessage(width + 'px ' + height + 'px', '*');
-    }-*/;
-
-    @Override
-    public void onCellClicked(CellInfo cellInfo, boolean isRightClick) {
-        TestSet testSet = TkoSpreadsheetUtils.getTestSet(
-                cellInfo, condition, rowHeader, columnHeader);
-
-        if (testSet.isSingleTest()) {
-            openTestDetailView(testSet.getTestIndex());
-        } else {
-            openSpreadsheetView(testSet.getPartialSqlCondition(),
-                    TkoSpreadsheetUtils.getDrilldownType(cellInfo));
-        }
-    }
-
-    private void openTestDetailView(int testIdx) {
-        openUrl("/new_tko/#tab_id=test_detail_view&object_id=" + testIdx);
-    }
-
-    private void openSpreadsheetView(String extraCondition, DrilldownType drilldownType) {
-        String drilldownPath;
-
-        switch (drilldownType) {
-        case DRILLDOWN_ROW:
-            drilldownPath = generatePath(DRILLDOWN_ROW_HEADER, COLUMN_HEADER, extraCondition);
-            break;
-        case DRILLDOWN_COLUMN:
-            drilldownPath = generatePath(ROW_HEADER, DRILLDOWN_COLUMN_HEADER, extraCondition);
-            break;
-        case DRILLDOWN_BOTH:
-            drilldownPath = generatePath(
-                    DRILLDOWN_ROW_HEADER, DRILLDOWN_COLUMN_HEADER, extraCondition);
-            break;
-        default:
-            throw new UnsupportedOperationException(
-                    "DrilldownType " + drilldownType + " not supported");
-        }
-
-        openUrl(drilldownPath);
-    }
-
-    private String generatePath(String rowHeader, String columnHeader, String extraCondition) {
-        String condition = "afe_job_id = " + afeJobIdStr + " AND " + extraCondition;
-
-        return "/new_tko/#tab_id=spreadsheet_view&row=" + rowHeader + "&column=" + columnHeader +
-                "&condition=" + URL.encodeComponent(condition, true) + "&show_incomplete=true";
-    }
-
-    private void openUrl(String url) {
-        Window.open(url, "_blank", null);
-    }
-}
Index: autotest/frontend/client/src/autotest/tko/HeaderField.java
===================================================================
--- autotest/frontend/client/src/autotest/tko/HeaderField.java	(revision 4598)
+++ autotest/frontend/client/src/autotest/tko/HeaderField.java	(working copy)
@@ -11,15 +11,15 @@
  * * sort by this field in table view,
  * * group by this field in spreadsheet or table view, and
  * * filter on this field in the SQL condition.
- * It's assumed that the name returned by getSqlName() is a field returned by the server which may 
- * also be used for grouping and sorting.  Filtering, however, is done separately (through 
- * getSqlCondition()), so HeaderFields may generate arbitrary SQL to perform filtering.  
+ * It's assumed that the name returned by getSqlName() is a field returned by the server which may
+ * also be used for grouping and sorting.  Filtering, however, is done separately (through
+ * getSqlCondition()), so HeaderFields may generate arbitrary SQL to perform filtering.
  * HeaderFields may also add arbitrary query arguments to support themselves.
- * 
- * While the set of HeaderFields active in the application may change at runtime, HeaderField 
+ *
+ * While the set of HeaderFields active in the application may change at runtime, HeaderField
  * objects themselves are immutable.
  */
-abstract class HeaderField implements Comparable<HeaderField> {
+public abstract class HeaderField implements Comparable<HeaderField> {
     protected String name;
     protected String sqlName;
 
@@ -31,7 +31,7 @@
         this.name = name;
         this.sqlName = sqlName;
     }
-    
+
     public int compareTo(HeaderField other) {
         return name.compareTo(other.name);
     }
@@ -65,7 +65,7 @@
     public String getSqlName() {
         return sqlName;
     }
-    
+
     /**
      * Get a quoted version of getSqlName() safe for use directly in SQL.
      */
@@ -89,7 +89,7 @@
     public boolean isUserSelectable() {
         return true;
     }
-    
+
     /**
      * @return a MultiListSelectPresenter.Item for this HeaderField.
      */
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to