package org.activityinfo.geoadmin.util; import java.util.List; import javax.swing.table.AbstractTableModel; import com.google.common.base.Function; import com.google.common.collect.Lists; public class GenericTableModel<T> extends AbstractTableModel { private List<T> rows; private List<TableColumn<T, ?>> columns; public GenericTableModel(List<T> rows, List<TableColumn<T, ?>> columns) { super(); this.rows = rows; this.columns = columns; } @Override public int getColumnCount() { return columns.size(); } @Override public int getRowCount() { return rows.size(); } public T getRowAt(int row) { return rows.get(row); } @Override public Object getValueAt(int row, int column) { return columns.get(column).getValue(rows.get(row)); } @Override public Class<?> getColumnClass(int columnIndex) { return columns.get(columnIndex).getColumnClass(); } @Override public String getColumnName(int columnIndex) { return columns.get(columnIndex).getName(); } public static <RowT> Builder<RowT> newModel(List<RowT> rows) { Builder<RowT> builder = new Builder<RowT>(); builder.rows = rows; return builder; } public static class Builder<RowT> { private List<RowT> rows; private List<TableColumn<RowT, ?>> columns = Lists.newArrayList(); public <ValueT> Builder<RowT> addColumn(String name, Class<ValueT> clazz, Function<RowT, ValueT> accessor) { columns.add(new TableColumn<RowT, ValueT>(name, clazz, accessor)); return this; } public GenericTableModel<RowT> build() { return new GenericTableModel<RowT>(rows, columns); } } }