///
/// Copyright © 2003-2008 JetBrains s.r.o.
/// You may distribute under the terms of the GNU General Public License, as published by the Free Software Foundation, version 2 (see License.txt in the repository root folder).
///
using System;
using System.Collections;
namespace JetBrains.JetListViewLibrary
{
///
/// An interface which allows to hide nodes from JetListView based on some condition.
///
public interface IJetListViewNodeFilter
{
bool AcceptNode( JetListViewNode node );
event EventHandler FilterChanged;
}
///
/// A collection of filters in JetListView.
///
public class JetListViewFilterCollection
{
private ArrayList _filters = new ArrayList();
public event EventHandler FilterListChanged;
public int Count
{
get { return _filters.Count; }
}
public void Add( IJetListViewNodeFilter filter )
{
if ( !_filters.Contains( filter ) )
{
filter.FilterChanged += new EventHandler( HandleFilterChanged );
_filters.Add( filter );
OnFilterListChanged();
}
}
public bool Contains( IJetListViewNodeFilter filter )
{
return _filters.Contains( filter );
}
public void Remove( IJetListViewNodeFilter filter )
{
if ( _filters.Contains( filter ) )
{
filter.FilterChanged -= new EventHandler( HandleFilterChanged );
_filters.Remove( filter );
OnFilterListChanged();
}
}
///
/// Refilters the tree.
///
public void Update()
{
OnFilterListChanged();
}
private void HandleFilterChanged( object sender, EventArgs e )
{
OnFilterListChanged();
}
internal bool AcceptNode( JetListViewNode node )
{
if( _filters.Count > 0 )
{
foreach( IJetListViewNodeFilter filter in _filters )
{
if ( !filter.AcceptNode( node ) )
{
return false;
}
}
}
return true;
}
protected void OnFilterListChanged()
{
if ( FilterListChanged != null )
{
FilterListChanged( this, EventArgs.Empty );
}
}
}
}