package ilarkesto.swing; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import javax.swing.table.AbstractTableModel; public final class ListTableModel<E> extends AbstractTableModel { private Column[] columns; private LinkedList<E> elements = new LinkedList<E>(); public ListTableModel() { columns = new Column[] { new DefaultColumn() }; } public void moveToBottom(E element) { elements.remove(element); elements.add(element); fireTableDataChanged(); } public void moveToTop(Collection<E> elements) { this.elements.removeAll(elements); this.elements.addAll(0, elements); fireTableDataChanged(); } public Column[] getColumns() { return columns; } public void setColumns(Column... columns) { this.columns = columns; fireTableStructureChanged(); } public final void setElements(Collection<E> elements) { this.elements = new LinkedList<E>(elements); fireTableDataChanged(); } public final void removeElements(Collection<E> elements) { this.elements.removeAll(elements); fireTableDataChanged(); } public void removeAllElements() { elements.clear(); fireTableDataChanged(); } public final void addElements(Collection<E> elements) { this.elements.addAll(elements); fireTableDataChanged(); } public final void addElement(E element) { elements.add(element); fireTableDataChanged(); } public final E getElement(int index) { return elements.get(index); } public int getElementsCount() { return elements.size(); } public final int getColumnCount() { return columns.length; } @Override public final String getColumnName(int column) { return columns[column].getLabel(); } public final int getRowCount() { return elements.size(); } public final Object getValueAt(int rowIndex, int columnIndex) { return columns[columnIndex].getValue(getElement(rowIndex)); } public static interface Column<E> { String getLabel(); Object getValue(E element); } public List<E> getElements(int[] selectedRows) { List<E> result = new ArrayList<E>(selectedRows.length); for (int row : selectedRows) { result.add(getElement(row)); } return result; } class DefaultColumn implements Column { public String getLabel() { return ""; } public Object getValue(Object element) { return element.toString(); } } }