Add empty rows to the end of related list and list view tables.
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / client / ui / ListViewImpl.java
1 /*
2  * Copyright (C) 2010, 2011 Openismus GmbH
3  *
4  * This file is part of GWT-Glom.
5  *
6  * GWT-Glom is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation, either version 3 of the License, or (at your
9  * option) any later version.
10  *
11  * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
14  * for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with GWT-Glom.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package org.glom.web.client.ui;
21
22 import org.glom.web.client.ui.list.ListViewTable;
23 import org.glom.web.shared.layout.LayoutGroup;
24
25 import com.google.gwt.user.client.ui.Composite;
26 import com.google.gwt.user.client.ui.FlowPanel;
27
28 public class ListViewImpl extends Composite implements ListView {
29
30         final private FlowPanel mainPanel = new FlowPanel();
31         private Presenter presenter;
32
33         public ListViewImpl() {
34                 initWidget(mainPanel);
35         }
36
37         @Override
38         public void setPresenter(Presenter presenter) {
39                 this.presenter = presenter;
40         }
41
42         @Override
43         public void setCellTable(final String documentID, LayoutGroup layoutGroup) {
44                 // This is not really in the MVP style because we're creating a new ListTable (really just a configured
45                 // CellTable) for every document and table name change. The issue with creating a re-usable CellTable with
46                 // methods like setColumnTitles() and setNumRows() is that the column objects (new Column<DataItem[],
47                 // DataItem>(new GlomTextCell())) aren't destroyed when the column is removed from the CellTable and
48                 // IndexOutOfBounds exceptions are encountered with invalid array indexes trying access the data in this line:
49                 // return object[j]. There's probably a workaround that could be done to fix this but I'm leaving it until
50                 // there's a reason to fix it (performance, ease of testing, alternate implementation or otherwise).
51                 // Note: This comment refers to code that is now in the ListTable class.
52
53                 mainPanel.clear();
54
55                 ListViewTable listViewTable = new ListViewTable(documentID, layoutGroup);
56                 listViewTable.addOpenButtonColumnn(presenter, "Details");
57                 // Only set the row count if the data has more rows than the minimum number of rows visible. This
58                 // ensures that data with fewer rows than the minimum will not create indexes in the underlying CellTable that
59                 // will override the rendering of the empty rows.
60                 if (layoutGroup.getExpectedResultSize() > listViewTable.getMinNumVisibleRows())
61                         listViewTable.setRowCount(layoutGroup.getExpectedResultSize());
62
63                 mainPanel.add(listViewTable);
64         }
65
66         /*
67          * (non-Javadoc)
68          * 
69          * @see org.glom.web.client.ui.ListView#clear()
70          */
71         @Override
72         public void clear() {
73                 mainPanel.clear();
74         }
75
76 }