Revision: 10508
Author:   [email protected]
Date:     Mon Aug  8 11:12:35 2011
Log: Fixing a bug in HasDataPresenter where paging to a negative row index causes an IndexOutOfRange exception. We now properly trim the keyboard selected row to a non-negative value.

Issue: 6383

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

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

Modified:
 /trunk/user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java
/trunk/user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java

=======================================
--- /trunk/user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java Thu Jul 28 04:03:54 2011 +++ /trunk/user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java Mon Aug 8 11:12:35 2011
@@ -719,8 +719,9 @@
     } else if (KeyboardPagingPolicy.CHANGE_PAGE == keyboardPagingPolicy) {
       // Go to previous page.
       while (index < 0) {
-        newPageStart -= pageSize;
-        index += pageSize;
+        int shift = Math.min(pageSize, newPageStart);
+        newPageStart -= shift;
+        index += shift;
       }

       // Go to next page.
@@ -731,9 +732,10 @@
} else if (KeyboardPagingPolicy.INCREASE_RANGE == keyboardPagingPolicy) {
       // Increase range at the beginning.
       while (index < 0) {
-        newPageSize += PAGE_INCREMENT;
-        newPageStart -= PAGE_INCREMENT;
-        index += PAGE_INCREMENT;
+        int shift = Math.min(PAGE_INCREMENT, newPageStart);
+        newPageSize += shift;
+        newPageStart -= shift;
+        index += shift;
       }
       if (newPageStart < 0) {
         index += newPageStart;
=======================================
--- /trunk/user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java Thu Jul 28 04:03:54 2011 +++ /trunk/user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java Mon Aug 8 11:12:35 2011
@@ -750,6 +750,18 @@
     view.assertKeyboardSelectedRowEmpty();
     assertEquals(10, presenter.getVisibleRange().getStart());
     assertEquals(10, presenter.getVisibleRange().getLength());
+
+    // Negative index out of range.
+    presenter.setVisibleRange(new Range(3, 10));
+    presenter.setKeyboardSelectedRow(3, false, false);
+    populatePresenter(presenter);
+    presenter.flush();
+    presenter.setKeyboardSelectedRow(-4, false, false);
+    populatePresenter(presenter);
+    presenter.flush();
+    assertEquals(0, presenter.getKeyboardSelectedRow());
+    assertEquals(0, presenter.getVisibleRange().getStart());
+    assertEquals(10, presenter.getVisibleRange().getLength());
   }

   public void testSetKeyboardSelectedRowCurrentPage() {
@@ -880,6 +892,18 @@
     assertEquals(0, presenter.getVisibleRange().getStart());
     pageSize += 10;
     assertEquals(pageSize, presenter.getVisibleRange().getLength());
+
+    // Negative index out of range.
+    presenter.setVisibleRange(new Range(3, 10));
+    presenter.setKeyboardSelectedRow(3, false, false);
+    populatePresenter(presenter);
+    presenter.flush();
+    presenter.setKeyboardSelectedRow(-4, false, false);
+    populatePresenter(presenter);
+    presenter.flush();
+    assertEquals(0, presenter.getKeyboardSelectedRow());
+    assertEquals(0, presenter.getVisibleRange().getStart());
+    assertEquals(13, presenter.getVisibleRange().getLength());
   }

   public void testSetRowCount() {

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

Reply via email to