Revision: 8527
Author: [email protected]
Date: Thu Aug 12 09:42:27 2010
Log: This patch allow empty row data lists that start on the pageStart to pass through the AbstractListViewAdapter and HasDataPresenter down to the HasData implementation (such as CellList). This ensures that Cell Widgets clear the view when the row count goes to 0. Before this change, setting the rowCount to zero would redraw with the empty list, but the empty list was considered "out of range."
http://code.google.com/p/google-web-toolkit/issues/detail?id=5149

Review at http://gwt-code-reviews.appspot.com/756801

Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=8527

Modified:
 /trunk/user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java
 /trunk/user/src/com/google/gwt/view/client/AbstractListViewAdapter.java
 /trunk/user/src/com/google/gwt/view/client/ListViewAdapter.java
/trunk/user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java /trunk/user/test/com/google/gwt/view/client/AbstractListViewAdapterTest.java
 /trunk/user/test/com/google/gwt/view/client/ListViewAdapterTest.java

=======================================
--- /trunk/user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java Tue Aug 10 07:37:40 2010 +++ /trunk/user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java Thu Aug 12 09:42:27 2010
@@ -381,8 +381,9 @@
     int pageEnd = pageStart + pageSize;
     int boundedStart = Math.max(start, pageStart);
     int boundedEnd = Math.min(valuesEnd, pageEnd);
-    if (boundedStart >= boundedEnd) {
+    if (start != pageStart && boundedStart >= boundedEnd) {
       // The data is out of range for the current page.
+      // Intentionally allow empty lists that start on the page start.
       return;
     }

=======================================
--- /trunk/user/src/com/google/gwt/view/client/AbstractListViewAdapter.java Tue Aug 10 07:37:40 2010 +++ /trunk/user/src/com/google/gwt/view/client/AbstractListViewAdapter.java Thu Aug 12 09:42:27 2010
@@ -207,8 +207,9 @@
     int curStart = range.getStart();
     int curLength = range.getLength();
     int curEnd = curStart + curLength;
-    if (curStart < end && curEnd > start) {
+    if (start == curStart || (curStart < end && curEnd > start)) {
       // Fire the handler with the data that is in the range.
+      // Allow an empty list that starts on the page start.
       int realStart = curStart < start ? start : curStart;
       int realEnd = curEnd > end ? end : curEnd;
       int realLength = realEnd - realStart;
=======================================
--- /trunk/user/src/com/google/gwt/view/client/ListViewAdapter.java Tue Aug 10 10:18:55 2010 +++ /trunk/user/src/com/google/gwt/view/client/ListViewAdapter.java Thu Aug 12 09:42:27 2010
@@ -489,6 +489,10 @@

   @Override
   protected void onRangeChanged(HasData<T> view) {
-    updateViewData(view, 0, listWrapper.size(), listWrapper);
+    int size = listWrapper.size();
+    if (size > 0) {
+      // Do not push data if the data set is empty.
+      updateViewData(view, 0, size, listWrapper);
+    }
   }
 }
=======================================
--- /trunk/user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java Tue Aug 10 07:37:40 2010 +++ /trunk/user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java Thu Aug 12 09:42:27 2010
@@ -508,6 +508,27 @@
     assertEquals(15, presenter.getRowCount());
     view.assertLoadingState(LoadingState.LOADED);
   }
+
+  /**
+ * Setting an empty list that starts on the page start should pass through to
+   * the view.
+   */
+  public void testSetRowValuesEmptySet() {
+    HasData<String> listView = new MockHasData<String>();
+    MockView<String> view = new MockView<String>();
+    HasDataPresenter<String> presenter = new HasDataPresenter<String>(
+        listView, view, 10);
+
+    // Set the initial data size.
+    presenter.setRowCount(10, true);
+    view.assertLoadingState(LoadingState.LOADING);
+
+    // Set an empty list of row values.
+    presenter.setRowValues(0, createData(0, 0));
+    view.assertLoadingState(LoadingState.LOADING);
+    view.assertReplaceAllChildrenCalled(true);
+    view.assertReplaceChildrenCalled(false);
+  }

   public void testSetRowValuesOutsideRange() {
     HasData<String> listView = new MockHasData<String>();
=======================================
--- /trunk/user/test/com/google/gwt/view/client/AbstractListViewAdapterTest.java Tue Aug 10 07:37:40 2010 +++ /trunk/user/test/com/google/gwt/view/client/AbstractListViewAdapterTest.java Thu Aug 12 09:42:27 2010
@@ -216,6 +216,15 @@
       assertEquals(new Range(12, 2), view.getLastRowValuesRange());
       view.clearLastRowValuesAndRange();
     }
+
+    // Empty data list starting at page start.
+    {
+      List<String> values = createData(10, 0);
+      adapter.updateViewData(10, 0, values);
+      assertEquals(values, view.getLastRowValues());
+      assertEquals(new Range(10, 0), view.getLastRowValuesRange());
+      view.clearLastRowValuesAndRange();
+    }

     // Data before range.
     {
=======================================
--- /trunk/user/test/com/google/gwt/view/client/ListViewAdapterTest.java Tue Aug 10 07:37:40 2010 +++ /trunk/user/test/com/google/gwt/view/client/ListViewAdapterTest.java Thu Aug 12 09:42:27 2010
@@ -460,9 +460,9 @@
     List<String> replace = new ArrayList<String>();
     adapter.setList(replace);
     assertEquals(0, view.getRowCount());
-    // An empty set should NOT set the row values.
-    assertEquals(null, view.getLastRowValues());
-    assertEquals(null, view.getLastRowValuesRange());
+    // An empty set should set the row values.
+    assertEquals(replace, view.getLastRowValues());
+    assertEquals(new Range(0, 0), view.getLastRowValuesRange());
   }

   @Override

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to