/*
* FilteredTreeViewModel.java
* Copyright 2010 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 May 14, 2010, 2:06:44 PM
*/
package pcgen.gui2.filter;
import java.util.ArrayList;
import java.util.List;
import pcgen.facade.util.event.ListEvent;
import pcgen.facade.util.event.ListListener;
import pcgen.facade.util.DefaultListFacade;
import pcgen.facade.util.ListFacade;
import pcgen.facade.util.ListFacades;
import pcgen.gui2.util.treeview.DataView;
import pcgen.gui2.util.treeview.TreeView;
import pcgen.gui2.util.treeview.TreeViewModel;
/**
*
* @author Connor Petty <cpmeister@users.sourceforge.net>
*/
public class FilteredTreeViewModel<C, E>
implements TreeViewModel<E>, ListListener<E>
{
private DefaultListFacade<E> data = new DefaultListFacade<>();
private Filter<C, E> filter;
private TreeViewModel<E> model;
private C context;
@Override
public ListFacade<? extends TreeView<E>> getTreeViews()
{
return model.getTreeViews();
}
@Override
public int getDefaultTreeViewIndex()
{
return model.getDefaultTreeViewIndex();
}
@Override
public DataView<E> getDataView()
{
return model.getDataView();
}
@Override
public ListFacade<E> getDataModel()
{
return data;
}
public void setBaseModel(TreeViewModel<E> model)
{
if (this.model != null)
{
this.model.getDataModel().removeListListener(this);
}
this.model = model;
if (this.model != null)
{
this.model.getDataModel().addListListener(this);
data.updateContents(ListFacades.wrap(model.getDataModel()));
}
}
public void setContext(C context)
{
this.context = context;
if (filter != null)
{
refilter();
}
}
public void setFilter(Filter<C, E> filter)
{
this.filter = filter;
filterCheck();
}
private void filterCheck()
{
if (filter != null && context != null)
{
refilter();
}
}
public void refilter()
{
ListFacade<E> base = model.getDataModel();
List<E> list = new ArrayList<>(base.getSize());
for (E element : base)
{
if (filter == null || filter.accept(context, element))
{
list.add(element);
}
}
data.updateContents(list);
}
@Override
public void elementAdded(ListEvent<E> e)
{
if (filter == null || filter.accept(context, e.getElement()))
{
data.addElement(e.getElement());
}
}
@Override
public void elementRemoved(ListEvent<E> e)
{
data.removeElement(e.getElement());
}
@Override
public void elementsChanged(ListEvent<E> e)
{
refilter();
}
@Override
public void elementModified(ListEvent<E> e)
{
if (!filter.accept(context, e.getElement()))
{
data.removeElement(e.getElement());
}
else
{
data.modifyElement(e.getElement());
}
}
}