PageRenderTime 28ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/test/com/google/gwt/gen2/table/client/PagingScrollTableTest.java

http://google-web-toolkit-incubator.googlecode.com/
Java | 1113 lines | 797 code | 129 blank | 187 comment | 27 complexity | 6218bb0ad9ed9655c17602ffb692e364 MD5 | raw file
  1. /*
  2. * Copyright 2008 Google Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.google.gwt.gen2.table.client;
  17. import com.google.gwt.gen2.table.client.AbstractColumnDefinitionTest.CustomColumnDefinition;
  18. import com.google.gwt.gen2.table.client.SortableGrid.ColumnSorter;
  19. import com.google.gwt.gen2.table.client.SortableGrid.ColumnSorterCallback;
  20. import com.google.gwt.gen2.table.client.TableModelHelper.ColumnSortList;
  21. import com.google.gwt.gen2.table.client.TableModelHelper.Request;
  22. import com.google.gwt.gen2.table.event.client.PageChangeEvent;
  23. import com.google.gwt.gen2.table.event.client.PageChangeHandler;
  24. import com.google.gwt.gen2.table.event.client.PageCountChangeEvent;
  25. import com.google.gwt.gen2.table.event.client.PageCountChangeHandler;
  26. import com.google.gwt.gen2.table.event.client.PageLoadEvent;
  27. import com.google.gwt.gen2.table.event.client.PageLoadHandler;
  28. import com.google.gwt.user.client.ui.HTML;
  29. import com.google.gwt.user.client.ui.Widget;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. /**
  33. * Tests methods in the {@link PagingScrollTable} class.
  34. */
  35. public class PagingScrollTableTest extends AbstractScrollTableTest {
  36. /**
  37. * A custom handler used for testing.
  38. */
  39. protected static class TestPageChangeHandler implements PageChangeHandler {
  40. private PageChangeEvent lastEvent = null;
  41. public void assertNewPage(int expected) {
  42. assertNotNull(lastEvent);
  43. assertEquals(expected, lastEvent.getNewPage());
  44. }
  45. public void assertOldPage(int expected) {
  46. assertNotNull(lastEvent);
  47. assertEquals(expected, lastEvent.getOldPage());
  48. }
  49. public void onPageChange(PageChangeEvent event) {
  50. lastEvent = event;
  51. }
  52. }
  53. /**
  54. * A custom handler used for testing.
  55. */
  56. protected static class TestPageCountChangeHandler implements
  57. PageCountChangeHandler {
  58. private PageCountChangeEvent lastEvent = null;
  59. public void assertNewPageCount(int expected) {
  60. assertNotNull(lastEvent);
  61. assertEquals(expected, lastEvent.getNewPageCount());
  62. }
  63. public void assertNotFired() {
  64. assertNull(lastEvent);
  65. }
  66. public void assertOldPageCount(int expected) {
  67. assertNotNull(lastEvent);
  68. assertEquals(expected, lastEvent.getOldPageCount());
  69. }
  70. public void onPageCountChange(PageCountChangeEvent event) {
  71. lastEvent = event;
  72. }
  73. public void reset() {
  74. lastEvent = null;
  75. }
  76. }
  77. /**
  78. * A custom handler used for testing.
  79. */
  80. protected static class TestPageLoadHandler implements PageLoadHandler {
  81. private PageLoadEvent lastEvent = null;
  82. public void assertNotFired() {
  83. assertNull(lastEvent);
  84. }
  85. public void assertPage(int expected) {
  86. assertNotNull(lastEvent);
  87. assertEquals(expected, lastEvent.getPage());
  88. }
  89. public void onPageLoad(PageLoadEvent event) {
  90. lastEvent = event;
  91. }
  92. }
  93. /**
  94. * A custom {@link ListTableModel} used for testing.
  95. */
  96. private static class TestListTableModel extends ListTableModel {
  97. /**
  98. * The last {@link Request} that was received.
  99. */
  100. private Request lastRequest = null;
  101. public TestListTableModel(List<List<Object>> rows) {
  102. super(rows);
  103. }
  104. public Request getLastRequest() {
  105. return lastRequest;
  106. }
  107. @Override
  108. public void requestRows(Request request, Callback<List<Object>> callback) {
  109. lastRequest = request;
  110. super.requestRows(request, callback);
  111. }
  112. }
  113. /**
  114. * Test absolute row index operations.
  115. */
  116. @SuppressWarnings("deprecation")
  117. public void testAbsoluteRowIndex() {
  118. // Initialize the grid
  119. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  120. table.setPageSize(5);
  121. // First page with plenty of rows
  122. {
  123. table.setPageSize(5);
  124. table.gotoPage(0, true);
  125. assertEquals(0, table.getAbsoluteFirstRowIndex());
  126. assertEquals(4, table.getAbsoluteLastRowIndex());
  127. assertEquals(0, table.getFirstRow());
  128. assertEquals(4, table.getLastRow());
  129. }
  130. // Second page with plenty of rows
  131. {
  132. table.gotoPage(1, true);
  133. assertEquals(5, table.getAbsoluteFirstRowIndex());
  134. assertEquals(9, table.getAbsoluteLastRowIndex());
  135. assertEquals(5, table.getFirstRow());
  136. assertEquals(9, table.getLastRow());
  137. }
  138. // Second page with limited rows
  139. {
  140. table.setPageSize(15);
  141. assertEquals(15, table.getAbsoluteFirstRowIndex());
  142. assertEquals(24, table.getAbsoluteLastRowIndex());
  143. assertEquals(15, table.getFirstRow());
  144. assertEquals(24, table.getLastRow());
  145. }
  146. // First page with no page size
  147. {
  148. table.setPageSize(0);
  149. assertEquals(0, table.getAbsoluteFirstRowIndex());
  150. assertEquals(24, table.getAbsoluteLastRowIndex());
  151. assertEquals(0, table.getFirstRow());
  152. assertEquals(24, table.getLastRow());
  153. }
  154. }
  155. /**
  156. * Test absolute row operations.
  157. */
  158. public void testAbsoluteRows() {
  159. // Insert absolute row
  160. {
  161. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  162. FixedWidthGrid grid = table.getDataTable();
  163. table.setPageSize(5);
  164. table.gotoPage(1, true);
  165. assertEquals("cell 2:1", grid.getText(2, 1));
  166. table.insertAbsoluteRow(10);
  167. assertEquals("cell 2:1", grid.getText(2, 1));
  168. table.insertAbsoluteRow(1);
  169. assertEquals("cell 1:1", grid.getText(2, 1));
  170. }
  171. // Remove absolute row
  172. {
  173. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  174. FixedWidthGrid grid = table.getDataTable();
  175. table.setPageSize(5);
  176. table.gotoPage(1, true);
  177. assertEquals("cell 2:1", grid.getText(2, 1));
  178. table.removeAbsoluteRow(10);
  179. assertEquals("cell 2:1", grid.getText(2, 1));
  180. table.removeAbsoluteRow(1);
  181. assertEquals("cell 2:1", grid.getText(2, 1));
  182. table.removeAbsoluteRow(6);
  183. assertEquals("cell 3:1", grid.getText(2, 1));
  184. }
  185. // Remove very last absolute row
  186. {
  187. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  188. FixedWidthGrid grid = table.getDataTable();
  189. table.setPageSize(7);
  190. table.gotoPage(3, true);
  191. assertEquals(4, grid.getRowCount());
  192. table.removeAbsoluteRow(24);
  193. assertEquals(3, grid.getRowCount());
  194. table.removeAbsoluteRow(23);
  195. assertEquals(2, grid.getRowCount());
  196. table.removeAbsoluteRow(22);
  197. assertEquals(1, grid.getRowCount());
  198. table.removeAbsoluteRow(21);
  199. assertEquals(0, grid.getRowCount());
  200. }
  201. }
  202. /**
  203. * Test column sorting.
  204. */
  205. public void testColumnSorting() {
  206. // Initialize the grid
  207. PagingScrollTable<List<Object>> scrollTable = getPagingScrollTable();
  208. FixedWidthGrid dataTable = scrollTable.getDataTable();
  209. scrollTable.setPageSize(5);
  210. scrollTable.gotoPage(2, true);
  211. // Sort the column without specifying a ColumnSorter
  212. {
  213. TestPageLoadHandler plh = new TestPageLoadHandler();
  214. scrollTable.addPageLoadHandler(plh);
  215. plh.assertNotFired();
  216. dataTable.sortColumn(3, true);
  217. plh.assertPage(2);
  218. }
  219. // Sort the column with a column sorter
  220. {
  221. TestPageLoadHandler plh = new TestPageLoadHandler();
  222. scrollTable.addPageLoadHandler(plh);
  223. dataTable.setColumnSorter(new ColumnSorter() {
  224. @Override
  225. public void onSortColumn(SortableGrid grid, ColumnSortList sortList,
  226. ColumnSorterCallback callback) {
  227. }
  228. });
  229. plh.assertNotFired();
  230. dataTable.sortColumn(3, true);
  231. plh.assertNotFired();
  232. }
  233. }
  234. public void testCrossPageSelectionDisabled() {
  235. PagingScrollTable<List<Object>> scrollTable = getPagingScrollTable();
  236. scrollTable.setCrossPageSelectionEnabled(false);
  237. scrollTable.setPageSize(5);
  238. FixedWidthGrid dataTable = scrollTable.getDataTable();
  239. // Select rows on page 0
  240. scrollTable.gotoFirstPage();
  241. List<Object> rowValue0 = scrollTable.getRowValue(0);
  242. List<Object> rowValue1 = scrollTable.getRowValue(0);
  243. List<Object> rowValue2 = scrollTable.getRowValue(0);
  244. List<Object> rowValue3 = scrollTable.getRowValue(0);
  245. List<Object> rowValue4 = scrollTable.getRowValue(0);
  246. {
  247. assertEquals(0, scrollTable.getSelectedRowValues().size());
  248. assertEquals(0, dataTable.getSelectedRows().size());
  249. // Select row 0
  250. dataTable.selectRow(0, false);
  251. assertEquals(1, scrollTable.getSelectedRowValues().size());
  252. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  253. // Select row 2
  254. dataTable.selectRow(2, false);
  255. assertEquals(2, scrollTable.getSelectedRowValues().size());
  256. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  257. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  258. // Select row 4
  259. dataTable.selectRow(4, false);
  260. assertEquals(3, scrollTable.getSelectedRowValues().size());
  261. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  262. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  263. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue4));
  264. }
  265. // Select rows on page 2
  266. {
  267. scrollTable.gotoPage(2, true);
  268. assertEquals(0, scrollTable.getSelectedRowValues().size());
  269. assertEquals(0, dataTable.getSelectedRows().size());
  270. // Select row 1
  271. dataTable.selectRow(1, false);
  272. assertEquals(1, scrollTable.getSelectedRowValues().size());
  273. assertTrue(scrollTable.getSelectedRowValues().contains(
  274. scrollTable.getRowValue(1)));
  275. // Select row 3
  276. dataTable.selectRow(3, false);
  277. assertEquals(2, scrollTable.getSelectedRowValues().size());
  278. assertTrue(scrollTable.getSelectedRowValues().contains(
  279. scrollTable.getRowValue(1)));
  280. assertTrue(scrollTable.getSelectedRowValues().contains(
  281. scrollTable.getRowValue(3)));
  282. }
  283. // Return to page 0
  284. {
  285. scrollTable.gotoPage(0, true);
  286. assertEquals(0, scrollTable.getSelectedRowValues().size());
  287. assertEquals(0, dataTable.getSelectedRows().size());
  288. }
  289. }
  290. /**
  291. * Verify that if cross page selection is disabled after it has been enabled,
  292. * {@link PagingScrollTable#getSelectedRowValues()} returns the row values on
  293. * the current page.
  294. */
  295. public void testCrossPageSelectionDisabledAfterEnabled() {
  296. PagingScrollTable<List<Object>> scrollTable = getPagingScrollTable();
  297. scrollTable.setCrossPageSelectionEnabled(true);
  298. scrollTable.setPageSize(5);
  299. FixedWidthGrid dataTable = scrollTable.getDataTable();
  300. // Select rows on page 0
  301. scrollTable.gotoFirstPage();
  302. {
  303. assertEquals(0, scrollTable.getSelectedRowValues().size());
  304. assertEquals(0, dataTable.getSelectedRows().size());
  305. dataTable.selectRow(0, false);
  306. dataTable.selectRow(2, false);
  307. dataTable.selectRow(4, false);
  308. assertEquals(3, scrollTable.getSelectedRowValues().size());
  309. assertEquals(3, dataTable.getSelectedRows().size());
  310. }
  311. // Select rows on page 2
  312. {
  313. scrollTable.gotoPage(2, true);
  314. assertEquals(3, scrollTable.getSelectedRowValues().size());
  315. assertEquals(0, dataTable.getSelectedRows().size());
  316. dataTable.selectRow(1, false);
  317. dataTable.selectRow(3, false);
  318. assertEquals(5, scrollTable.getSelectedRowValues().size());
  319. assertEquals(2, dataTable.getSelectedRows().size());
  320. }
  321. // Disable cross page selection
  322. {
  323. scrollTable.setCrossPageSelectionEnabled(false);
  324. assertEquals(2, scrollTable.getSelectedRowValues().size());
  325. assertEquals(2, dataTable.getSelectedRows().size());
  326. assertTrue(scrollTable.getSelectedRowValues().contains(
  327. scrollTable.getRowValue(1)));
  328. assertTrue(scrollTable.getSelectedRowValues().contains(
  329. scrollTable.getRowValue(3)));
  330. }
  331. }
  332. public void testCrossPageSelectionEnabled() {
  333. PagingScrollTable<List<Object>> scrollTable = getPagingScrollTable();
  334. scrollTable.setCrossPageSelectionEnabled(true);
  335. scrollTable.setPageSize(5);
  336. FixedWidthGrid dataTable = scrollTable.getDataTable();
  337. // Select rows on page 0
  338. scrollTable.gotoFirstPage();
  339. List<Object> rowValue0 = scrollTable.getRowValue(0);
  340. List<Object> rowValue1 = scrollTable.getRowValue(0);
  341. List<Object> rowValue2 = scrollTable.getRowValue(0);
  342. List<Object> rowValue3 = scrollTable.getRowValue(0);
  343. List<Object> rowValue4 = scrollTable.getRowValue(0);
  344. {
  345. assertEquals(0, scrollTable.getSelectedRowValues().size());
  346. assertEquals(0, dataTable.getSelectedRows().size());
  347. // Select row 0
  348. dataTable.selectRow(0, false);
  349. assertEquals(1, scrollTable.getSelectedRowValues().size());
  350. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  351. // Select row 2
  352. dataTable.selectRow(2, false);
  353. assertEquals(2, scrollTable.getSelectedRowValues().size());
  354. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  355. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  356. // Select row 4
  357. dataTable.selectRow(4, false);
  358. assertEquals(3, scrollTable.getSelectedRowValues().size());
  359. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  360. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  361. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue4));
  362. }
  363. // Select rows on page 2
  364. {
  365. scrollTable.gotoPage(2, true);
  366. assertEquals(3, scrollTable.getSelectedRowValues().size());
  367. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  368. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  369. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue4));
  370. assertEquals(0, dataTable.getSelectedRows().size());
  371. // Select row 1
  372. dataTable.selectRow(1, false);
  373. assertEquals(4, scrollTable.getSelectedRowValues().size());
  374. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  375. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  376. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue4));
  377. assertTrue(scrollTable.getSelectedRowValues().contains(
  378. scrollTable.getRowValue(1)));
  379. // Select row 3
  380. dataTable.selectRow(3, false);
  381. assertEquals(5, scrollTable.getSelectedRowValues().size());
  382. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  383. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  384. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue4));
  385. assertTrue(scrollTable.getSelectedRowValues().contains(
  386. scrollTable.getRowValue(1)));
  387. assertTrue(scrollTable.getSelectedRowValues().contains(
  388. scrollTable.getRowValue(3)));
  389. }
  390. // Return to page 0
  391. {
  392. scrollTable.gotoPage(0, true);
  393. assertEquals(5, scrollTable.getSelectedRowValues().size());
  394. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue0));
  395. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue2));
  396. assertTrue(scrollTable.getSelectedRowValues().contains(rowValue4));
  397. assertTrue(dataTable.isRowSelected(0));
  398. assertFalse(dataTable.isRowSelected(1));
  399. assertTrue(dataTable.isRowSelected(2));
  400. assertFalse(dataTable.isRowSelected(3));
  401. assertTrue(dataTable.isRowSelected(4));
  402. }
  403. }
  404. /**
  405. * Create a {@link PagingScrollTable} with an empty table definition.
  406. */
  407. public void testEmptyTableDefinition() {
  408. // Without bulk renderer
  409. {
  410. TableDefinition<List<Object>> tableDef = new DefaultTableDefinition<List<Object>>();
  411. TableModel<List<Object>> tableModel = createTableModel();
  412. PagingScrollTable<List<Object>> table = new PagingScrollTable<List<Object>>(
  413. tableModel, tableDef);
  414. table.gotoFirstPage();
  415. }
  416. // With bulk renderer
  417. {
  418. TableDefinition<List<Object>> tableDef = new DefaultTableDefinition<List<Object>>();
  419. TableModel<List<Object>> tableModel = createTableModel();
  420. PagingScrollTable<List<Object>> table = new PagingScrollTable<List<Object>>(
  421. tableModel, tableDef);
  422. FixedWidthGridBulkRenderer<List<Object>> renderer = new FixedWidthGridBulkRenderer<List<Object>>(
  423. table.getDataTable(), table);
  424. table.setBulkRenderer(renderer);
  425. table.gotoFirstPage();
  426. }
  427. }
  428. /**
  429. * Generate a two row, column spanning footer.
  430. */
  431. public void testFooterGenerationColSpan() {
  432. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  433. FixedWidthFlexTable footerTable = table.getFooterTable();
  434. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  435. // Setup the footers
  436. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  437. int numColumns = colDefs.size();
  438. for (int i = 0; i < numColumns; i++) {
  439. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  440. colDef.setFooter(0, "Group");
  441. colDef.setFooter(1, "Column");
  442. }
  443. // Test the footer table
  444. table.setFooterGenerated(true);
  445. assertEquals(numColumns, footerTable.getColumnCount());
  446. assertEquals(1, footerTable.getCellCount(0));
  447. assertEquals(1, footerTable.getCellCount(1));
  448. assertEquals(2, footerTable.getRowCount());
  449. assertEquals("Group", footerTable.getHTML(0, 0));
  450. assertEquals("Column", footerTable.getHTML(1, 0));
  451. }
  452. /**
  453. * Generate a two row, row spanning footer.
  454. */
  455. public void testFooterGenerationRowSpan() {
  456. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  457. FixedWidthFlexTable footerTable = table.getFooterTable();
  458. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  459. // Setup the footers
  460. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  461. int numColumns = colDefs.size();
  462. for (int i = 0; i < numColumns; i++) {
  463. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  464. colDef.setFooter(0, "Column " + i);
  465. colDef.setFooter(1, "Column " + i);
  466. }
  467. // Test the footer table
  468. table.setFooterGenerated(true);
  469. assertEquals(numColumns, footerTable.getColumnCount());
  470. assertEquals(numColumns, footerTable.getCellCount(0));
  471. assertEquals(1, footerTable.getRowCount());
  472. for (int i = 0; i < numColumns; i++) {
  473. assertEquals("Column " + i, footerTable.getHTML(0, i));
  474. }
  475. }
  476. /**
  477. * Generate a two row, non spanning footer.
  478. */
  479. public void testFooterGenerationSimple() {
  480. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  481. FixedWidthFlexTable footerTable = table.getFooterTable();
  482. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  483. // Setup the footers
  484. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  485. int numColumns = colDefs.size();
  486. for (int i = 0; i < numColumns; i++) {
  487. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  488. colDef.setFooter(0, "Group " + i);
  489. colDef.setFooter(1, "Column " + i);
  490. }
  491. // Test the footer table
  492. table.setFooterGenerated(true);
  493. assertEquals(numColumns, footerTable.getColumnCount());
  494. assertEquals(numColumns, footerTable.getCellCount(0));
  495. assertEquals(numColumns, footerTable.getCellCount(1));
  496. assertEquals(2, footerTable.getRowCount());
  497. for (int i = 0; i < numColumns; i++) {
  498. assertEquals("Group " + i, footerTable.getHTML(0, i));
  499. assertEquals("Column " + i, footerTable.getHTML(1, i));
  500. }
  501. }
  502. /**
  503. * Generate a two row, column spanning footer.
  504. */
  505. public void testFooterGenerationUneven() {
  506. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  507. FixedWidthFlexTable footerTable = table.getFooterTable();
  508. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  509. // Setup the footers
  510. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  511. int numColumns = colDefs.size();
  512. for (int i = 0; i < numColumns; i++) {
  513. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  514. colDef.setFooter(0, "Topic " + i);
  515. if (i % 2 == 0) {
  516. colDef.setFooter(1, "Group " + i);
  517. colDef.setFooter(2, "Column " + i);
  518. }
  519. }
  520. // Test the footer table
  521. table.setFooterGenerated(true);
  522. assertEquals(numColumns, footerTable.getColumnCount());
  523. assertEquals(numColumns, footerTable.getCellCount(0));
  524. assertEquals(numColumns, footerTable.getCellCount(1));
  525. assertEquals(numColumns / 2, footerTable.getCellCount(2));
  526. assertEquals(3, footerTable.getRowCount());
  527. for (int i = 0; i < numColumns; i++) {
  528. if (i % 2 == 0) {
  529. assertEquals("Group " + i, footerTable.getHTML(1, i));
  530. } else {
  531. assertEquals("&nbsp;", footerTable.getHTML(1, i));
  532. }
  533. assertEquals("Topic " + i, footerTable.getHTML(0, i));
  534. }
  535. }
  536. /**
  537. * Generate a two row, column spanning header.
  538. */
  539. public void testHeaderGenerationColSpan() {
  540. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  541. FixedWidthFlexTable headerTable = table.getHeaderTable();
  542. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  543. // Setup the headers
  544. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  545. int numColumns = colDefs.size();
  546. for (int i = 0; i < numColumns; i++) {
  547. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  548. colDef.setHeader(0, "Column");
  549. colDef.setHeader(1, "Group");
  550. }
  551. // Test the header table
  552. table.setHeaderGenerated(true);
  553. assertEquals(numColumns, headerTable.getColumnCount());
  554. assertEquals(1, headerTable.getCellCount(0));
  555. assertEquals(1, headerTable.getCellCount(1));
  556. assertEquals(2, headerTable.getRowCount());
  557. assertEquals("Group", headerTable.getHTML(0, 0));
  558. assertEquals("Column", headerTable.getHTML(1, 0));
  559. }
  560. /**
  561. * Generate a two row, row spanning header.
  562. */
  563. public void testHeaderGenerationRowSpan() {
  564. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  565. FixedWidthFlexTable headerTable = table.getHeaderTable();
  566. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  567. // Setup the headers
  568. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  569. int numColumns = colDefs.size();
  570. for (int i = 0; i < numColumns; i++) {
  571. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  572. colDef.setHeader(0, "Column " + i);
  573. colDef.setHeader(1, "Column " + i);
  574. }
  575. // Test the header table
  576. table.setHeaderGenerated(true);
  577. assertEquals(numColumns, headerTable.getColumnCount());
  578. assertEquals(numColumns, headerTable.getCellCount(0));
  579. assertEquals(1, headerTable.getRowCount());
  580. for (int i = 0; i < numColumns; i++) {
  581. assertEquals("Column " + i, headerTable.getHTML(0, i));
  582. }
  583. }
  584. /**
  585. * Generate a two row, non spanning header.
  586. */
  587. public void testHeaderGenerationSimple() {
  588. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  589. FixedWidthFlexTable headerTable = table.getHeaderTable();
  590. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  591. // Setup the headers
  592. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  593. int numColumns = colDefs.size();
  594. for (int i = 0; i < numColumns; i++) {
  595. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  596. colDef.setHeader(0, "Column " + i);
  597. colDef.setHeader(1, "Group " + i);
  598. }
  599. // Test the header table
  600. table.setHeaderGenerated(true);
  601. assertEquals(numColumns, headerTable.getColumnCount());
  602. assertEquals(numColumns, headerTable.getCellCount(0));
  603. assertEquals(numColumns, headerTable.getCellCount(1));
  604. assertEquals(2, headerTable.getRowCount());
  605. for (int i = 0; i < numColumns; i++) {
  606. assertEquals("Group " + i, headerTable.getHTML(0, i));
  607. assertEquals("Column " + i, headerTable.getHTML(1, i));
  608. }
  609. }
  610. /**
  611. * Generate a two row, column spanning header.
  612. */
  613. public void testHeaderGenerationUneven() {
  614. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  615. FixedWidthFlexTable headerTable = table.getHeaderTable();
  616. TableDefinition<List<Object>> tableDef = table.getTableDefinition();
  617. // Setup the headers
  618. List<ColumnDefinition<List<Object>, ?>> colDefs = tableDef.getVisibleColumnDefinitions();
  619. int numColumns = colDefs.size();
  620. for (int i = 0; i < numColumns; i++) {
  621. AbstractColumnDefinition<List<Object>, ?> colDef = (AbstractColumnDefinition<List<Object>, ?>) colDefs.get(i);
  622. colDef.setHeader(0, "Column " + i);
  623. if (i % 2 == 0) {
  624. colDef.setHeader(1, "Group " + i);
  625. colDef.setHeader(2, "Topic " + i);
  626. }
  627. }
  628. // Test the header table
  629. table.setHeaderGenerated(true);
  630. assertEquals(numColumns, headerTable.getColumnCount());
  631. assertEquals(numColumns, headerTable.getCellCount(0));
  632. assertEquals(numColumns / 2, headerTable.getCellCount(1));
  633. assertEquals(numColumns, headerTable.getCellCount(2));
  634. assertEquals(3, headerTable.getRowCount());
  635. for (int i = 0; i < numColumns; i++) {
  636. if (i % 2 == 0) {
  637. assertEquals("Topic " + i, headerTable.getHTML(0, i));
  638. } else {
  639. assertEquals("&nbsp;", headerTable.getHTML(0, i));
  640. }
  641. assertEquals("Column " + i, headerTable.getHTML(2, i));
  642. }
  643. }
  644. public void testOnDataTableRendered() {
  645. final List<Object> tester = new ArrayList<Object>();
  646. TableModel<List<Object>> tableModel = createTableModel();
  647. TableDefinition<List<Object>> tableDef = createTableDefinition();
  648. PagingScrollTable<List<Object>> table = new PagingScrollTable<List<Object>>(
  649. tableModel, tableDef) {
  650. @Override
  651. protected void onDataTableRendered() {
  652. super.onDataTableRendered();
  653. tester.add("onDataTableRendered");
  654. }
  655. };
  656. // Goto to a page
  657. assertEquals(0, tester.size());
  658. table.gotoFirstPage();
  659. assertEquals(1, tester.size());
  660. }
  661. public void testPageChangeHandler() {
  662. // Initialize the grid
  663. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  664. TableModel<List<Object>> tableModel = table.getTableModel();
  665. // Create some handlers
  666. TestPageChangeHandler pch = new TestPageChangeHandler();
  667. table.addPageChangeHandler(pch);
  668. tableModel.setRowCount(100);
  669. table.setPageSize(10);
  670. // Goto page
  671. table.gotoPage(0, true);
  672. pch.assertOldPage(-1);
  673. pch.assertNewPage(0);
  674. // Goto another page
  675. table.gotoPage(4, true);
  676. pch.assertOldPage(0);
  677. pch.assertNewPage(4);
  678. }
  679. public void testPageCountChangeHandler() {
  680. // Initialize the grid
  681. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  682. TableModel<List<Object>> tableModel = table.getTableModel();
  683. // Create some handlers
  684. TestPageCountChangeHandler pch = new TestPageCountChangeHandler();
  685. table.addPageCountChangeHandler(pch);
  686. tableModel.setRowCount(1000);
  687. table.setPageSize(10);
  688. // Set row count
  689. tableModel.setRowCount(500);
  690. pch.assertOldPageCount(100);
  691. pch.assertNewPageCount(50);
  692. // Set page size
  693. table.setPageSize(5);
  694. pch.assertOldPageCount(50);
  695. pch.assertNewPageCount(100);
  696. // Unknown row count
  697. tableModel.setRowCount(-1);
  698. pch.assertOldPageCount(100);
  699. pch.assertNewPageCount(-1);
  700. // Set page size with unknown row count
  701. pch.reset();
  702. table.setPageSize(10);
  703. pch.assertNotFired();
  704. // Reestablish row count
  705. tableModel.setRowCount(20);
  706. pch.assertOldPageCount(-1);
  707. pch.assertNewPageCount(2);
  708. // No page size
  709. table.setPageSize(0);
  710. pch.assertOldPageCount(2);
  711. pch.assertNewPageCount(1);
  712. }
  713. /**
  714. * Test page navigation.
  715. */
  716. public void testPaging() {
  717. // Initialize the grid
  718. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  719. TableModel<List<Object>> tableModel = table.getTableModel();
  720. // Goto first or last page
  721. table.setPageSize(5);
  722. table.gotoPage(2, false);
  723. assertEquals(2, table.getCurrentPage());
  724. table.gotoFirstPage();
  725. assertEquals(0, table.getCurrentPage());
  726. table.gotoFirstPage();
  727. assertEquals(0, table.getCurrentPage());
  728. table.gotoLastPage();
  729. assertEquals(4, table.getCurrentPage());
  730. table.gotoLastPage();
  731. assertEquals(4, table.getCurrentPage());
  732. assertFalse(table.isPageLoading());
  733. // Goto next or previous page
  734. table.gotoPage(2, false);
  735. assertEquals(2, table.getCurrentPage());
  736. table.gotoNextPage();
  737. assertEquals(3, table.getCurrentPage());
  738. table.gotoNextPage();
  739. assertEquals(4, table.getCurrentPage());
  740. table.gotoPreviousPage();
  741. assertEquals(3, table.getCurrentPage());
  742. table.gotoPreviousPage();
  743. assertEquals(2, table.getCurrentPage());
  744. // Goto specific page
  745. table.gotoPage(3, false);
  746. assertEquals(3, table.getCurrentPage());
  747. table.gotoPage(0, false);
  748. assertEquals(0, table.getCurrentPage());
  749. table.gotoPage(0, true);
  750. assertEquals(0, table.getCurrentPage());
  751. table.gotoPage(4, false);
  752. assertEquals(4, table.getCurrentPage());
  753. table.gotoPage(4, true);
  754. assertEquals(4, table.getCurrentPage());
  755. // Check page bounds
  756. table.gotoPage(-1, false);
  757. assertEquals(0, table.getCurrentPage());
  758. table.gotoPreviousPage();
  759. assertEquals(0, table.getCurrentPage());
  760. table.gotoPage(5, false);
  761. assertEquals(4, table.getCurrentPage());
  762. table.gotoNextPage();
  763. assertEquals(4, table.getCurrentPage());
  764. // Unknown number of pages
  765. tableModel.setRowCount(MutableTableModel.UNKNOWN_ROW_COUNT);
  766. table.gotoPage(20, false);
  767. assertEquals(20, table.getCurrentPage());
  768. table.gotoPage(300, false);
  769. assertEquals(300, table.getCurrentPage());
  770. table.gotoLastPage();
  771. assertEquals(300, table.getCurrentPage());
  772. table.gotoFirstPage();
  773. assertEquals(0, table.getCurrentPage());
  774. }
  775. public void testPagingAccessors() {
  776. // Initialize the grid
  777. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  778. TableModel<List<Object>> tableModel = table.getTableModel();
  779. FixedWidthGrid grid = table.getDataTable();
  780. // pageSize
  781. table.setPageSize(5);
  782. assertEquals(5, table.getPageSize());
  783. table.setPageSize(0);
  784. assertEquals(0, table.getPageSize());
  785. table.setPageSize(-1);
  786. assertEquals(0, table.getPageSize());
  787. // numPages
  788. table.setPageSize(5);
  789. assertEquals(5, table.getPageCount());
  790. table.setPageSize(10);
  791. assertEquals(3, table.getPageCount());
  792. table.setPageSize(25);
  793. assertEquals(1, table.getPageCount());
  794. // Unknown number of pages
  795. tableModel.setRowCount(MutableTableModel.UNKNOWN_ROW_COUNT);
  796. assertEquals(-1, table.getPageCount());
  797. table.setPageSize(0);
  798. assertEquals(1, table.getPageCount());
  799. // bulk renderer
  800. FixedWidthGridBulkRenderer<List<Object>> bulkRenderer = new FixedWidthGridBulkRenderer<List<Object>>(
  801. grid, table.getTableDefinition());
  802. table.setBulkRenderer(bulkRenderer);
  803. // Empty table widget
  804. {
  805. Widget emptyTableWidget = new HTML("Empty");
  806. table.setEmptyTableWidget(emptyTableWidget);
  807. assertEquals(emptyTableWidget, table.getEmptyTableWidget());
  808. }
  809. // header generation
  810. {
  811. table.setHeaderGenerated(true);
  812. assertTrue(table.isHeaderGenerated());
  813. table.setHeaderGenerated(false);
  814. assertFalse(table.isHeaderGenerated());
  815. }
  816. // footer generation
  817. {
  818. table.setFooterGenerated(true);
  819. assertTrue(table.isFooterGenerated());
  820. table.setFooterGenerated(false);
  821. assertFalse(table.isFooterGenerated());
  822. }
  823. // isCrossPageSelectionEnabled
  824. {
  825. assertFalse(table.isCrossPageSelectionEnabled());
  826. table.setCrossPageSelectionEnabled(true);
  827. assertTrue(table.isCrossPageSelectionEnabled());
  828. }
  829. }
  830. /**
  831. * Test page navigation when there is only one page.
  832. */
  833. public void testPagingSinglePage() {
  834. // Initialize the grid
  835. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  836. TestListTableModel tableModel = (TestListTableModel) table.getTableModel();
  837. table.setPageSize(0);
  838. table.gotoPage(0, false);
  839. assertEquals(0, table.getCurrentPage());
  840. assertEquals(25, table.getDataTable().getRowCount());
  841. assertEquals(0, tableModel.getLastRequest().getStartRow());
  842. assertEquals(25, tableModel.getLastRequest().getNumRows());
  843. }
  844. /**
  845. * Test paging when the TableModel responds with a failure.
  846. */
  847. public void testPagingFailure() {
  848. TableModel<List<Object>> tableModel = new TableModel<List<Object>>() {
  849. @Override
  850. public void requestRows(Request request,
  851. TableModel.Callback<List<Object>> callback) {
  852. callback.onFailure(new Exception());
  853. }
  854. };
  855. PagingScrollTable<List<Object>> table = getPagingScrollTable(tableModel);
  856. assertFalse(table.isPageLoading());
  857. table.gotoPage(0, true);
  858. assertFalse(table.isPageLoading());
  859. }
  860. /**
  861. * Test paging when the TableModel does not respond.
  862. */
  863. public void testPagingNoResponse() {
  864. TableModel<List<Object>> tableModel = new TableModel<List<Object>>() {
  865. @Override
  866. public void requestRows(Request request,
  867. TableModel.Callback<List<Object>> callback) {
  868. }
  869. };
  870. PagingScrollTable<List<Object>> table = getPagingScrollTable(tableModel);
  871. assertFalse(table.isPageLoading());
  872. table.gotoPage(0, true);
  873. assertTrue(table.isPageLoading());
  874. }
  875. /**
  876. * Test changing a row value.
  877. */
  878. public void testRowValueChanged() {
  879. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  880. TestListTableModel tableModel = (TestListTableModel) table.getTableModel();
  881. table.setPageSize(5);
  882. table.gotoPage(1, true);
  883. // Set a row value on the page
  884. {
  885. List<Object> rowValue = new ArrayList<Object>();
  886. tableModel.setRowValue(6, rowValue);
  887. assertEquals(rowValue, table.getRowValue(1));
  888. }
  889. // Set a row value before the page
  890. {
  891. List<Object> rowValue = new ArrayList<Object>();
  892. tableModel.setRowValue(4, rowValue);
  893. }
  894. // Set a row value after the page
  895. {
  896. List<Object> rowValue = new ArrayList<Object>();
  897. tableModel.setRowValue(10, rowValue);
  898. }
  899. }
  900. /**
  901. * Test values associated with rows.
  902. */
  903. public void testRowValues() {
  904. // Initialize the grid
  905. PagingScrollTable<List<Object>> table = getPagingScrollTable();
  906. table.getDataTable().resize(10, 10);
  907. // Test manually setting values
  908. List<Object> value1 = new ArrayList<Object>();
  909. List<Object> value2 = new ArrayList<Object>();
  910. List<Object> value3 = new ArrayList<Object>();
  911. assertNull(table.getRowValue(0));
  912. assertNull(table.getRowValue(10));
  913. table.setRowValue(4, value1);
  914. assertNull(table.getRowValue(3));
  915. assertEquals(value1, table.getRowValue(4));
  916. assertNull(table.getRowValue(5));
  917. table.setRowValue(4, value2);
  918. assertNull(table.getRowValue(3));
  919. assertEquals(value2, table.getRowValue(4));
  920. assertNull(table.getRowValue(5));
  921. table.setRowValue(5, value3);
  922. assertNull(table.getRowValue(3));
  923. assertEquals(value2, table.getRowValue(4));
  924. assertEquals(value3, table.getRowValue(5));
  925. assertNull(table.getRowValue(6));
  926. }
  927. /**
  928. * @return a {@link PagingScrollTable}
  929. */
  930. protected PagingScrollTable<List<Object>> getPagingScrollTable() {
  931. return getPagingScrollTable(createTableModel());
  932. }
  933. @Override
  934. protected PagingScrollTable<List<Object>> getScrollTable(
  935. FixedWidthFlexTable headerTable, FixedWidthGrid dataTable,
  936. FixedWidthFlexTable footerTable) {
  937. return getPagingScrollTable(headerTable, dataTable, footerTable,
  938. createTableModel());
  939. }
  940. /**
  941. * @return a new table definition with 10 columns
  942. */
  943. private DefaultTableDefinition<List<Object>> createTableDefinition() {
  944. List<ColumnDefinition<List<Object>, ?>> colDefs = new ArrayList<ColumnDefinition<List<Object>, ?>>();
  945. for (int i = 0; i < 10; i++) {
  946. colDefs.add(new CustomColumnDefinition<List<Object>, Object>());
  947. }
  948. return new DefaultTableDefinition<List<Object>>(colDefs);
  949. }
  950. /**
  951. * @return a new table model with 25 rows
  952. */
  953. private TableModel<List<Object>> createTableModel() {
  954. // Create the row data
  955. List<List<Object>> rowList = new ArrayList<List<Object>>();
  956. for (int row = 0; row < 25; row++) {
  957. ArrayList<Object> columnList = new ArrayList<Object>();
  958. rowList.add(columnList);
  959. for (int column = 0; column < 4; column++) {
  960. columnList.add(row + ":" + column);
  961. }
  962. }
  963. return new TestListTableModel(rowList);
  964. }
  965. /**
  966. * @return a {@link PagingScrollTable}
  967. */
  968. private PagingScrollTable<List<Object>> getPagingScrollTable(
  969. TableModel<List<Object>> tableModel) {
  970. FixedWidthFlexTable headerTable = new FixedWidthFlexTable();
  971. FixedWidthGrid dataTable = new FixedWidthGrid();
  972. FixedWidthFlexTable footerTable = new FixedWidthFlexTable();
  973. return getPagingScrollTable(headerTable, dataTable, footerTable, tableModel);
  974. }
  975. private PagingScrollTable<List<Object>> getPagingScrollTable(
  976. FixedWidthFlexTable headerTable, FixedWidthGrid dataTable,
  977. FixedWidthFlexTable footerTable, TableModel<List<Object>> tableModel) {
  978. DefaultTableDefinition<List<Object>> tableDef = createTableDefinition();
  979. PagingScrollTable<List<Object>> scrollTable = new PagingScrollTable<List<Object>>(
  980. tableModel, dataTable, headerTable, tableDef);
  981. scrollTable.setFooterTable(footerTable);
  982. return scrollTable;
  983. }
  984. }