/*
* Copyright (C) 2014 GG-Net GmbH - Oliver Günther
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.ggnet.dwoss.util.table;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;
/**
*
* @author oliver.guenther
*/
public class PojoTableModel<T> extends AbstractTableModel {
private List<T> dataModel;
private List<PojoColumn<T>> columns;
private JTable table;
private PojoFilter<T> filter;
public PojoTableModel(List<T> dataModel, PojoColumn<T>... columns) {
this.dataModel = dataModel;
this.columns = new ArrayList<PojoColumn<T>>();
if ( columns != null && columns.length > 0 ) this.columns.addAll(Arrays.asList(columns));
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if ( table == null ) return String.class;
return columns.get(columnIndex).getColumnClass();
}
@Override
public String getColumnName(int column) {
return columns.get(column).getHeadline();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columns.get(columnIndex).isEditable();
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
// columns.get(columnIndex).setValue(rowIndex, aValue);
fireTableRowsUpdated(rowIndex, rowIndex);
}
@Override
public int getRowCount() {
return dataModel.size();
}
@Override
public int getColumnCount() {
return columns.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if ( table == null ) return "View @ Model is null";
return columns.get(columnIndex).getValue(dataModel.get(rowIndex));
}
public List<T> getLines() {
return dataModel;
}
public void remove(T t) {
dataModel.remove(t);
fireTableDataChanged();
}
public void add(T t) {
dataModel.add(t);
fireTableRowsInserted(dataModel.size() - 1, dataModel.size() - 1);
}
public T getSelected() {
if ( table.getSelectedRow() == -1 ) return null;
return dataModel.get(table.convertRowIndexToModel(table.getSelectedRow()));
}
public PojoTableModel<T> add(PojoColumn<T> column) {
columns.add(column);
return this;
}
public JTable getTable() {
return table;
}
public void setTable(JTable table) {
if ( table == null ) return;
this.table = table;
for (int i = 0; i < columns.size(); i++) {
table.getColumnModel().getColumn(i).setPreferredWidth(columns.get(i).getPreferredWidth());
}
TableRowSorter<PojoTableModel<T>> rowSorter = new TableRowSorter<PojoTableModel<T>>(this);
rowSorter.setRowFilter(new RowFilter<PojoTableModel<T>, Integer>() {
@Override
public boolean include(RowFilter.Entry<? extends PojoTableModel<T>, ? extends Integer> entry) {
if ( filter == null ) return true;
return filter.filter(entry.getModel().getLines().get(entry.getIdentifier()));
}
});
table.setRowSorter(rowSorter);
}
public PojoFilter<T> getFilter() {
return filter;
}
public void setFilter(PojoFilter<T> filter) {
this.filter = filter;
}
}