/*
* OneCMDB, an open source configuration management project.
* Copyright 2007, Lokomo Systems AB, and individual contributors
* as indicated by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.onecmdb.ui.gwt.toolkit.client.view.table;
import java.util.List;
import org.gwtiger.client.widget.HoverGridWidget;
import org.onecmdb.ui.gwt.toolkit.client.control.input.AttributeValue;
import org.onecmdb.ui.gwt.toolkit.client.control.input.IBaseField;
import org.onecmdb.ui.gwt.toolkit.client.control.listener.LoadListener;
import org.onecmdb.ui.gwt.toolkit.client.control.listener.LoadListenerCollection;
import org.onecmdb.ui.gwt.toolkit.client.control.listener.order.IOrderListener;
import org.onecmdb.ui.gwt.toolkit.client.control.listener.order.ISourcesOrderEvents;
import org.onecmdb.ui.gwt.toolkit.client.control.listener.order.OrderEvent;
import org.onecmdb.ui.gwt.toolkit.client.control.table.ITableControl;
import org.onecmdb.ui.gwt.toolkit.client.model.onecmdb.GWT_AttributeBean;
import org.onecmdb.ui.gwt.toolkit.client.view.input.AttributeRender;
import org.onecmdb.ui.gwt.toolkit.client.view.input.IAttributeRender;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
public class CITablePanel extends HoverGridWidget implements IOrderListener {
protected static final String STYLE_CELL = "gwtiger-tableCell";
protected static final String STYLE_HEADER_CELL = "gwtiger-tableHeaderCell";
private ITableControl control;
private IAttributeRender render;
private LoadListenerCollection loadListenerCollection = new LoadListenerCollection();
public CITablePanel() {
getColumnFormatter().setStyleName(0, STYLE_HEADER);
}
public ITableControl getTableControl() {
return(this.control);
}
public void setTabelControl(ITableControl control) {
this.control = control;
}
public void addHeader(int column, Widget header) {
//hasHeader=true;
RowFormatter rowFormatter = getRowFormatter();
rowFormatter.setStyleName(0, STYLE_HEADER);
header.setStyleName(STYLE_HEADER_CELL);
setWidget(0, column, header);
}
public void load() {
if (getRowCount() > 0) {
removeRow(0);
}
this.control.getColumns(new AsyncCallback() {
public void onFailure(Throwable caught) {
loadListenerCollection.fireOnLoadFailure(CITablePanel.this, caught);
}
public void onSuccess(Object result) {
if (result instanceof List) {
List resultList = (List)result;
addHeader(0, "#");
for (int col = 1; col < (resultList.size()+1); col++) {
Object column = resultList.get(col-1);
Widget columnWidget = render.getColumnHeaderWidget(column);
if (columnWidget instanceof ISourcesOrderEvents) {
((ISourcesOrderEvents)columnWidget).addOrderListener(CITablePanel.this);
}
addHeader(col, columnWidget);
}
}
}
});
reload();
}
protected void reload() {
loadListenerCollection.fireOnLoadStart(this);
this.control.getRows(new AsyncCallback() {
public void onFailure(Throwable caught) {
loadListenerCollection.fireOnLoadFailure(CITablePanel.this, caught);
}
public void onSuccess(Object result) {
if (result instanceof List) {
List rows = (List)result;
Integer firstItem = control.getFirstItem();
int rowIndex = 1;
if (firstItem != null) {
rowIndex = firstItem.intValue();
rowIndex++;
}
System.out.println("ROW COUNT=" + rows.size());
for (int row = 0; row < rows.size(); row++) {
Object rowData = rows.get(row);
setText(row+1, 0, "" + rowIndex);
rowIndex++;
if (((row+1) % 2) == 0) {
getRowFormatter().setStyleName(row+1, STYLE_ROW_EVEN);
} else {
getRowFormatter().setStyleName(row+1, STYLE_ROW_ODD);
}
getCellFormatter().setStyleName(row+1, 0, STYLE_HEADER);
if (rowData instanceof List) {
List cols = (List)rowData;
for (int col = 1; col < (cols.size()+1); col++) {
Object colObject = cols.get(col-1);
Widget widget = render.getColumnWidget(colObject);
if (widget != null) {
widget.setWidth("100%");
widget.setStyleName(STYLE_CELL);
if (widget instanceof IBaseField) {
setWidget(row+1, col, ((IBaseField)widget).getBaseField());
} else {
setWidget(row+1, col, widget);
}
} else {
setText(row+1, col, "");
}
}
}
}
// Remove not visible rows.
for (int row = (control.getMaxResult().intValue()+1); row > rows.size() ; row--) {
if (getRowCount() > row) {
removeRow(row);
}
}
}
loadListenerCollection.fireOnLoadComplete(CITablePanel.this);
}
});
}
public void addLoadListener(LoadListener listener) {
loadListenerCollection.add(listener);
}
public void setAttributeRender(IAttributeRender render) {
this.render = render;
}
public void onOrderEvent(OrderEvent evnt) {
if (evnt.getData() instanceof AttributeValue) {
if (getRowCount() > 0) {
int cols = getCellCount(0);
for (int i = 0; i < cols; i++) {
Widget w = getWidget(0, i);
if (w != null && !w.equals(evnt.getSender())) {
if (w instanceof ColumnHeaderWidget) {
((ColumnHeaderWidget)w).setSortVisable(false);
}
}
}
}
GWT_AttributeBean aBean = ((AttributeValue)evnt.getData()).getAttributeBean();
if (aBean != null) {
this.control.setSortOrder(aBean.getAlias());
this.control.setSortOrderAscending(evnt.isAscending());
} else {
this.control.setSortOrder(null);
}
reload();
}
}
}