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