/* * 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.client.common.ui; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.pentaho.gwt.widgets.client.ui.ICallback; import org.pentaho.pac.client.PentahoAdminConsole; import org.pentaho.pac.client.i18n.Messages; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; /** * * @author Steven Barkdull * * @param <RowDataType> type of the object that can be stored as data with each row in the list. */ public class TableListCtrl<RowDataType> extends ScrollPanel { private FlexTable table = null; private List<RowDataType> dataList = new LinkedList<RowDataType>(); private CheckBox selectAllCb = null; private ICallback<TableListCtrl<RowDataType>> selectAllHandler = null; private ICallback<TableListCtrl<RowDataType>> selectHandler = null; private static final int HEADER_ROW = 0; private static final int FIRST_ROW = HEADER_ROW+1; private static final int SELECT_COLUMN = 0; private static final int FIRST_COLUMN = SELECT_COLUMN+1; private static final String BLANK = " "; //$NON-NLS-1$ public TableListCtrl( String[] columnHeaderNames ) { this( textToLabel( columnHeaderNames ) ); } public TableListCtrl( Widget[] columnHeaderWidgets ) { super(); table = createTable( columnHeaderWidgets ); add( table ); } private static Widget[] textToLabel( String[] columnHeaderNames ) { int len = columnHeaderNames.length; Widget[] widgets = new Widget[ columnHeaderNames.length ]; for ( int ii = 0; ii<len; ++ii ) { widgets[ ii ] = new Label( columnHeaderNames[ii] ); } return widgets; } public void setTableStyleName( String styleName ) { table.setStyleName( styleName ); } public void setTableHeaderStyleName( String styleName ) { table.getRowFormatter().setStyleName( 0, styleName ); } private FlexTable createTable( Widget[] columnHeaderWidgets ) { FlexTable tmpTable = new FlexTable(); tmpTable.setCellPadding( 0 ); tmpTable.setCellSpacing( 0 ); addTableHeader( tmpTable, columnHeaderWidgets ); return tmpTable; } private void addTableHeader( FlexTable tmpTable, Widget[] columnHeaderWidgets ) { final TableListCtrl<RowDataType> localThis = this; selectAllCb = new CheckBox(); selectAllCb.setTitle( Messages.getString("checkToSelectAll") ); //$NON-NLS-1$ selectAllCb.addClickListener( new ClickListener() { public void onClick(Widget sender) { if ( localThis.selectAllCb.isChecked() ) { selectAll(); } else { unselectAll(); } if ( null != selectAllHandler ) { selectAllHandler.onHandle( localThis ); } } }); tmpTable.setWidget( HEADER_ROW, SELECT_COLUMN, selectAllCb ); for ( int ii=0; ii<columnHeaderWidgets.length; ++ii ) { tmpTable.setWidget( HEADER_ROW, ii+FIRST_COLUMN, columnHeaderWidgets[ii] ); } } private Widget getEmptyWidget() { Label l = new Label(); l.getElement().setInnerHTML( "<span> </span>" ); //$NON-NLS-1$ return l; } public List<Integer> getSelectedIndexes() { List<Integer> idxs = new ArrayList<Integer>(); int rowCount = table.getRowCount(); if ( rowCount <= FIRST_ROW || !(table.getWidget( FIRST_ROW, SELECT_COLUMN ) instanceof CheckBox ) ) { return idxs; // must be displaying a label (Loading... or Empty List), so nothing can be selected } for ( int rowNum=FIRST_ROW; rowNum<rowCount; ++rowNum ) { CheckBox cb = (CheckBox)table.getWidget( rowNum, SELECT_COLUMN ); if ( cb.isChecked() ) { idxs.add( Integer.valueOf( rowNum-FIRST_ROW ) ); } } return idxs; } public int getNumSelections() { return getSelectedIndexes().size(); } /** * Removes all non-header items from the list */ public void removeAll() { // don't delete row 0, it's the header for ( int rowNum=table.getRowCount()-1; rowNum>=FIRST_ROW; --rowNum ) { table.removeRow( rowNum ); } dataList.clear(); } public void remove( int rowNum ) { table.removeRow( rowNum+FIRST_ROW ); dataList.remove( rowNum ); } public void selectAll() { for ( int rowNum=FIRST_ROW; rowNum<table.getRowCount(); ++rowNum ) { CheckBox cb = getSelectCheckBox( rowNum ); cb.setChecked( true ); } } public void unselectAll() { for ( int rowNum=FIRST_ROW; rowNum<table.getRowCount(); ++rowNum ) { CheckBox cb = getSelectCheckBox( rowNum ); cb.setChecked( false ); } } public void select( int rowNum ) { CheckBox cb = getSelectCheckBox( rowNum+FIRST_ROW ); cb.setChecked( true ); } public void unselect( int rowNum ) { CheckBox cb = getSelectCheckBox( rowNum+FIRST_ROW ); cb.setChecked( false ); } private CheckBox getSelectCheckBox( int actualRowNum ) { return (CheckBox)table.getWidget( actualRowNum, SELECT_COLUMN ); } public void addRow( Widget[] widgets ) { addRow( widgets, null ); } /** * NOTE: it is ok for elements of the widgets array to be null. * * @param widgets * @param data */ public void addRow( Widget[] widgets, RowDataType data ) { int newRowNum = table.getRowCount(); CheckBox checkbox = new CheckBox(); final TableListCtrl<RowDataType> localThis = this; checkbox.addClickListener( new ClickListener() { public void onClick(Widget sender) { if ( null != selectHandler ) { selectHandler.onHandle( localThis ); } } }); table.setWidget( newRowNum, 0, checkbox ); for ( int ii=0; ii<widgets.length; ++ii ) { Widget w = widgets[ii]; if ( null == w ) { w = getEmptyWidget(); } setCellWidget( newRowNum-FIRST_ROW, ii+1, w ); } dataList.add( data ); assert dataList.size() == (table.getRowCount()-FIRST_ROW) : "Number of items in data list does not equal the number of items in the list."; //$NON-NLS-1$ } public void setCellWidget( int rowNum, int colNum, Widget w ) { table.setWidget( rowNum+FIRST_ROW, colNum+SELECT_COLUMN, w ); } public Widget getCellWidget( int rowNum, int colNum ) { return table.getWidget( rowNum+FIRST_ROW, colNum+SELECT_COLUMN ); } public void setRowData( int rowNum, RowDataType data ) { dataList.remove( rowNum ); dataList.add( rowNum, data ); } public RowDataType getRowData( int rowNum ) { return dataList.get( rowNum ); } public int getNumRows() { return table.getRowCount() - FIRST_ROW; } public int getNumColumns() { return table.getCellCount(HEADER_ROW); } public void clearTempMessage() { table.removeRow( FIRST_ROW ); } public void setTempMessage( String msg ) { removeAll(); Label l = new Label(); l.setText( msg ); table.setWidget( FIRST_ROW, 0, l ); table.getFlexCellFormatter().setColSpan( FIRST_ROW, 0, getNumColumns() ); } public void setOnSelectAllHandler( ICallback<TableListCtrl<RowDataType>> handler ) { this.selectAllHandler = handler; } public void setOnSelectHandler( ICallback<TableListCtrl<RowDataType>> handler ) { this.selectHandler = handler; } }