Reviewers: rjrjr,

Description:
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


Please review this at http://gwt-code-reviews.appspot.com/1513804/

Affected files:
  M user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java
  M user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java


Index: user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java
===================================================================
--- user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java (revision 10507) +++ user/src/com/google/gwt/user/cellview/client/HasDataPresenter.java (working copy)
@@ -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;
Index: user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java
===================================================================
--- user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java (revision 10507) +++ user/test/com/google/gwt/user/cellview/client/HasDataPresenterTest.java (working copy)
@@ -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