/*
* FilteredListFacadeTableModel.java
* Copyright 2011 Connor Petty <cpmeister@users.sourceforge.net>
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Created on Jan 31, 2011, 9:55:02 PM
*/
package pcgen.gui2.filter;
import java.util.Comparator;
import javax.swing.table.AbstractTableModel;
import pcgen.facade.core.CharacterFacade;
import pcgen.facade.util.ListFacade;
import pcgen.facade.util.SortedListFacade;
import pcgen.facade.util.event.ListEvent;
import pcgen.facade.util.event.ListListener;
import pcgen.gui2.util.table.Row;
import pcgen.gui2.util.table.SortableTableModel;
/**
*
* @author Connor Petty <cpmeister@users.sourceforge.net>
*/
public abstract class FilteredListFacadeTableModel<E> extends AbstractTableModel implements SortableTableModel, ListListener<E>
{
protected final SortedListFacade<E> sortedList;
private final FilteredListFacade<CharacterFacade, E> filteredList;
protected final CharacterFacade character;
public FilteredListFacadeTableModel()
{
this(null);
}
public FilteredListFacadeTableModel(CharacterFacade character)
{
this.character = character;
this.filteredList = new FilteredListFacade<>();
filteredList.setContext(character);
this.sortedList = new SortedListFacade<>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
return 0;
}
});
sortedList.addListListener(this);
sortedList.setDelegate(filteredList);
}
protected void setDelegate(ListFacade<E> delegate)
{
filteredList.setDelegate(delegate);
}
public void setFilter(Filter<? super CharacterFacade, ? super E> filter)
{
filteredList.setFilter(filter);
}
public void refilter()
{
filteredList.refilter();
}
@Override
public int getRowCount()
{
return sortedList.getSize();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
return getValueAt(sortedList.getElementAt(rowIndex), columnIndex);
}
protected abstract Object getValueAt(E element, int column);
@Override
public void sortModel(Comparator<Row> comparator)
{
if (comparator == null)
{
return;
}
sortedList.setComparator(new RowComparator(comparator));
}
@Override
public void elementAdded(ListEvent<E> e)
{
fireTableRowsInserted(e.getIndex(), e.getIndex());
}
@Override
public void elementRemoved(ListEvent<E> e)
{
fireTableRowsDeleted(e.getIndex(), e.getIndex());
}
@Override
public void elementsChanged(ListEvent<E> e)
{
fireTableDataChanged();
}
@Override
public void elementModified(ListEvent<E> e)
{
fireTableRowsUpdated(e.getIndex(), e.getIndex());
}
private class ElementRow implements Row
{
private final E element;
public ElementRow(E element)
{
this.element = element;
}
@Override
public Object getValueAt(int column)
{
return FilteredListFacadeTableModel.this.getValueAt(element, column);
}
}
private class RowComparator implements Comparator<E>
{
private final Comparator<Row> comp;
public RowComparator(Comparator<Row> comparator)
{
super();
this.comp = comparator;
}
@Override
public int compare(E o1, E o2)
{
return comp.compare(new ElementRow(o1), new ElementRow(o2));
}
}
}