/* * $Id$ * * Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library 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 library 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jdesktop.swingxset.util; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.table.AbstractTableModel; /** * <p> * A table model for displaying a list of items. The items are typically data classes. In such * cases, the table columns represent data fields from the item. * </p> * * <pre> * public class SimpleExampleModel extends AbstractListTableModel<ExampleItem> { * public int getColumnCount() { * return numberOfDataFields; * } * * public Object getValueAt(int rowIndex, int columnIndex) { * ExampleItem item = getRow(rowIndex); * Object result = null; * * switch (columnIndex) { * case 0: * result = item.getSomeField(); * break; * case 1: * result = item.getSomeOtherField(); * break; * ... * default: * //does nothing * break; * } * * return result; * } * } * </pre> * * @param <T> * the type for the rows of the table. */ @SuppressWarnings("serial") public abstract class AbstractListTableModel<T> extends AbstractTableModel { /** * The row data for this table model. */ protected List<T> data; /** * Creates an {@code AbstractListTableModel}. */ public AbstractListTableModel() { this.data = new ArrayList<T>(); } /** * {@inheritDoc} */ public final int getRowCount() { return data.size(); } /** * Inserts a row at the specified index. * * @param rowIndex * the position to place the new row. * @param row * the row data to insert. */ public void insertRow(int rowIndex, T row) { data.add(rowIndex, row); fireTableRowsInserted(rowIndex, rowIndex); } /** * Inserts a group of rows at the specified index. * * @param rowIndex * the position to place the new row. * @param rows * the row data to insert. */ public void insertRows(int rowIndex, Collection<T> rows) { data.addAll(rowIndex, rows); fireTableRowsInserted(rowIndex, rowIndex + rows.size() - 1); } /** * Appends a row to the model. * * @param row * the row to add. */ public void addRow(T row) { int currentSize = data.size(); data.add(row); fireTableRowsInserted(currentSize, currentSize); } /** * Appends a group of rows to the end of the table. * * @param rows * the rows to add. */ public void addRows(Collection<T> rows) { int currentSize = data.size(); data.addAll(rows); fireTableRowsInserted(currentSize, data.size() - 1); } /** * Removes the row at the specified index. * * @param rowIndex * the position of the row to delete. */ public void removeRow(int rowIndex) { //notify listeners before delete, so they can query the model fireTableRowsDeleted(rowIndex, rowIndex); data.remove(rowIndex); } /** * Remove a range of rows from {@code beginIndex} inclusive to * {@code endIndex} exclusive}. * * @param beginIndex * the position of the first row to remove. * @param endIndex * the position of the last row to remove + 1. */ public void removeRows(int beginIndex, int endIndex) { //notify listeners before delete, so they can query the model fireTableRowsDeleted(beginIndex, endIndex - 1); for (int i = endIndex - 1; i >= beginIndex; i--) { data.remove(i); } } /** * Remove all rows from the table model. * <p> * This implementation defers to {@code removeRows(int, int)}. */ public void removeAllRows() { if (data.size() > 0) { removeRows(0, data.size()); } } /** * Obtains the row index of the specified item. If the item is not managed by this model * {@code -1} is returned. * * @param item * the item to find in the model * @return the row index of the item, or {@code -1} if the item is not found */ public final int indexOf(T item) { return data.indexOf(item); } /** * Gives access to a specific model entry based on row index. * <p> * When retrieving this, the {@code JTable.convertRowIndexToModel} should be * used to accommodate sorting and filtering. * </p> * * @param rowIndex * the row index * @return instance of data model type corresponding to row index * @throws IndexOutOfBoundsException * if {@code column < 0 || column >= getColumnCount()} */ public final T getRow(int rowIndex) { return data.get(rowIndex); } }