using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Acacia.Controls { public class KDataFilter { public readonly string FilterText; public KDataFilter(string filterText) { this.FilterText = filterText; } } public interface KDataSourceRaw { System.Collections.IEnumerable Items { get; } System.Collections.IEnumerable FilteredItems { get; } KDataFilter Filter { get; set; } string GetItemText(object item); } abstract public class KDataSource : KDataSourceRaw { /// /// Returns all the items /// abstract public IEnumerable Items { get; } public IEnumerable FilteredItems { get { if (string.IsNullOrWhiteSpace(Filter?.FilterText)) return Items; return ApplyFilter(); } } private IEnumerable ApplyFilter() { foreach (T item in Items) { if (MatchesFilter(item)) yield return item; } } virtual protected bool MatchesFilter(T item) { return GetItemText(item).StartsWith(Filter.FilterText); } abstract protected string GetItemText(T item); public string GetItemText(object item) { return GetItemText((T)item); } public KDataFilter Filter { get; set; } IEnumerable KDataSourceRaw.Items { get{return Items;}} IEnumerable KDataSourceRaw.FilteredItems { get { return FilteredItems; } } } }