/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cli_fmw.report.panels.model.delegate;
import cli_fmw.main.ClipsException;
import cli_fmw.main.ContentStateListener;
import cli_fmw.main.Stateful;
import cli_fmw.utils.ErrorValue;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.table.AbstractTableModel;
/**
*
* @param <T>
* @author finder
*/
public abstract class DelegateTableModel<T extends Stateful> extends AbstractTableModel implements ContentStateListener {
//private static final long serialVersionUID = 1L;
ArrayList<T> delegates;
public DelegateTableModel(Collection<? extends T> delegates) {
this.delegates = new ArrayList<T>(delegates);
for (T t : delegates) {
t.addContentStateListener(this);
}
}
@Override
public int getRowCount() {
return delegates.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
try {
return getColumnValue(delegates.get(rowIndex), columnIndex);
} catch (ClipsException ex) {
return new ErrorValue(ex);
}
}
@Override
public void contentStateChanged() {
fireTableRowsUpdated(0, getRowCount() - 1);
}
public <V extends T> void add(V del){
delegates.add(del);
del.addContentStateListener(this);
fireTableRowsInserted(delegates.size() - 1, delegates.size() - 1);
}
public <V extends T> void remove(V del){
int id = delegates.indexOf(del);
if (id >= 0){
T torem = delegates.get(id);
delegates.remove(id);
torem.removeContentStateListener(this);
fireTableRowsDeleted(id, id);
}
}
public T get(int i){
return delegates.get(i);
}
public void set(int i, T delegate){
delegates.set(i, delegate);
}
public int indexOf(T o) {
return delegates.indexOf(o);
}
abstract public Object getColumnValue(T delegate, int column) throws ClipsException;
@Override
abstract public String getColumnName(int column);
}