Java tutorial
/* * 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; } }