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