/*
* FilteredTreeViewTable.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 15, 2010, 7:42:03 PM
*/
package pcgen.gui2.filter;
import java.awt.Rectangle;
import java.util.Collections;
import java.util.List;
import javax.swing.RowSorter;
import pcgen.gui2.util.JTreeViewTable;
import pcgen.gui2.util.table.SortableTableModel;
import pcgen.gui2.util.table.SortableTableRowSorter;
import pcgen.gui2.util.treeview.TreeView;
import pcgen.gui2.util.treeview.TreeViewModel;
import pcgen.gui2.util.treeview.TreeViewPath;
/**
*
* @author Connor Petty <cpmeister@users.sourceforge.net>
*/
public class FilteredTreeViewTable<C, E> extends JTreeViewTable<E> implements FilterHandler
{
private static final TreeView<Object> searchView = new TreeView<Object>()
{
@Override
public String getViewName()
{
// TODO: use localized string
return "Search";
}
@Override
public List<TreeViewPath<Object>> getPaths(Object pobj)
{
return Collections.singletonList(new TreeViewPath<>(pobj));
}
};
private boolean searchMode = false;
private DisplayableFilter<C, E> filter = null;
private FilteredTreeViewModel<C, E> filteredModel = null;
private C context = null;
private TreeView<? super E> tempView;
public FilteredTreeViewTable()
{
RowSorter rowSorter = new SortableTableRowSorter()
{
@Override
public SortableTableModel getModel()
{
return (SortableTableModel) FilteredTreeViewTable.this.getModel();
}
};
setRowSorter(rowSorter);
rowSorter.toggleSortOrder(0);
}
@Override
public void refilter()
{
filteredModel.refilter();
updateDisplay();
}
@Override
public void scrollToTop()
{
this.scrollRectToVisible(new Rectangle(getCellRect(0, 0, true)));
}
public void setContext(C context)
{
this.context = context;
if (filteredModel != null)
{
filteredModel.setContext(context);
}
}
public void setDisplayableFilter(DisplayableFilter<C, E> filter)
{
if (this.filter != null)
{
this.filter.setFilterHandler(null);
}
this.filter = filter;
filter.setFilterHandler(this);
if (filteredModel != null)
{
filteredModel.setFilter(filter);
}
}
@Override
public void setTreeViewModel(TreeViewModel<E> viewModel)
{
FilteredTreeViewModel oldModel = filteredModel;
filteredModel = new FilteredTreeViewModel<>();
filteredModel.setBaseModel(viewModel);
if (filter != null)
{
filteredModel.setFilter(filter);
filteredModel.setContext(context);
}
super.setTreeViewModel(filteredModel);
if (oldModel != null)
{
oldModel.setBaseModel(null);
}
sortModel();
}
// private CharacterInfoTab parentTab()
// {
// Container parent = this;
// do
// {
// parent = parent.getParent();
// }
// while (parent != null && !(parent instanceof CharacterInfoTab));
// return (CharacterInfoTab) parent;
// }
//
// @Override
// public void setTreeViewModel(TreeViewModel<E> viewModel)
// {
// CharacterInfoTab tab = parentTab();
// String id = "";
// if (tab != null)
// {
// id = tab.getClass().getName();
// }
//
// StopWatch watch = new StopWatch(id);
// FilteredTreeViewModel oldModel = filteredModel;
// filteredModel = new FilteredTreeViewModel<C, E>();
// watch.start("setBaseModel");
// filteredModel.setBaseModel(viewModel);
// watch.stop();
// if (filter != null)
// {
// watch.start("setFilter");
// filteredModel.setFilter(filter);
// watch.stop();
// watch.start("setContext");
// filteredModel.setContext(context);
// watch.stop();
// }
// watch.start("super.setTreeViewModel");
// super.setTreeViewModel(filteredModel);
// watch.stop();
// if (oldModel != null)
// {
// watch.start("oldModel.setBaseModel");
// oldModel.setBaseModel(null);
// watch.stop();
// }
// watch.start("sortModel");
// sortModel();
// watch.stop();
// System.out.println(watch.prettyPrint());
// }
@Override
public void setSearchEnabled(boolean searchMode)
{
if (this.searchMode != searchMode)
{
this.searchMode = searchMode;
if (treetableModel != null)
{
if (searchMode)
{
tempView = treetableModel.getSelectedTreeView();
setTreeView(searchView);
cornerPopupMenu.setTreeViewsEnabled(false);
}
else
{
setTreeView(tempView);
cornerPopupMenu.setTreeViewsEnabled(true);
}
}
}
}
@Override
public void refreshModelData()
{
super.refreshModelData();
refilter();
}
public boolean isSearchEnabled()
{
return searchMode;
}
}