/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright 2008 - 2009 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.pac.ui.gwt.table;
import java.util.List;
import java.util.Map;
import org.pentaho.pac.ui.gwt.table.model.ColumnModel;
import org.pentaho.pac.ui.gwt.table.model.TableDataServiceAsync;
import org.pentaho.pac.ui.gwt.table.model.TableModel;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Widget;
public class RowSupport {
private TableModel model;
private Widget[][] rowWidgets;
private int visibleRows;
private int idxOfTopRow = 0;
private int rowHeight;
private TableDataServiceAsync dataService;
private List<NameValue> discriminators;
public RowSupport(TableModel model,
TableDataServiceAsync dataService) {
this.model = model;
visibleRows = model.getVisibleRows() + 1;
rowHeight = model.getPixelRowHeight();
this.dataService = dataService;
}
protected void setDiscriminators(List<NameValue> discriminators) {
this.discriminators = discriminators;
}
public void removeRows(Grid where, ColumnSupport cs) {
if (rowWidgets == null || rowWidgets.length != visibleRows
|| (rowWidgets.length > 0 && rowWidgets[0].length != cs.size())) {
if (rowWidgets != null) {
for (int x = 0; x < rowWidgets.length; x++) {
for (int y = 0; y < rowWidgets[x].length; y++) {
Widget existing = rowWidgets[x][y];
if (existing != null)
where.remove(existing);
}
}
}
rowWidgets = new Widget[visibleRows][cs.size()];
}
}
public void layoutRows(final Grid where, final ColumnSupport colSupport,
final int currentPosition) {
if (dataService == null)
return;
dataService.getData(colSupport.getColumnNames(),
discriminators == null ? new NameValue[] {} : discriminators
.toArray(new NameValue[discriminators.size()]),
new AsyncCallback<Map<String, String[]>>() {
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
}
public void onSuccess(Map<String, String[]> results) {
for (int i = 0; i < visibleRows; i++)
if (rowWidgets[i][0] != null)
model.hidden(i + idxOfTopRow);
idxOfTopRow = currentPosition
/ model.getPixelRowHeight();
ColumnModel[] columns = colSupport.getColumns();
where.resize(visibleRows, columns.length);
// to get the row count it is easy. We just need to
// count the length of one of the strings
int rowCount = results.values().iterator().next().length;
model.setActualRowCount(rowCount);
for (int i = 0; i < visibleRows; i++) {
int idx = idxOfTopRow + i;
if (idx >= rowCount)
break;
for (int k = 0; k < columns.length; k++) {
Widget existing = rowWidgets[i][k];
rowWidgets[i][k] = columns[k].getCell(idx,
results);
if (existing != null
&& existing != rowWidgets[i][k])
where.remove(existing);
rowWidgets[i][k].setPixelSize(columns[k]
.getWidth(), rowHeight);
where.setWidget(i, k, rowWidgets[i][k]);
if (model.getStyles() != null) {
List<String> styleNames = model.getStyles()
.getStyleNames(i % 2 == 0 ? TableStyles.Type.EVEN_ROW
: TableStyles.Type.ODD_ROW);
if (styleNames != null
&& styleNames.size() > 0)
where.getRowFormatter().setStyleName(i,
styleNames.get(0));
}
}
model.visible(idx);
}
}
});
}
}