/// /// 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 ); } } } }