using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; namespace BLToolkit.EditableObjects { [Serializable] [DebuggerDisplay("Count = {Count}")] public class EditableList : EditableArrayList, IList { #region Constructors public EditableList() : base(typeof(T)) { } public EditableList(int capacity) : base(typeof(T), capacity) { } public EditableList(ICollection c) : base(typeof(T), c) { } public EditableList(bool trackChanges) : base(typeof(T), trackChanges) { } public EditableList(int capacity, bool trackChanges) : base(typeof(T), capacity, trackChanges) { } public EditableList(ICollection c, bool trackChanges) : base(typeof(T), c, trackChanges) { } public EditableList(EditableList list) : base(list, true) { } public EditableList(EditableList list, bool trackChanges) : base(list, trackChanges) { } #endregion #region Typed Methods public override object Clone() { return Clone(new EditableList((ArrayList)List.Clone())); } public new T this[int index] { get { return (T)base[index]; } set { base[index] = value; } } public new T[] ToArray() { return (T[])base.ToArray(typeof(T)); } public new T AddNew() { return (T)base.AddNew(); } #endregion #region Like List Methods public T Find(Predicate match) { if (match == null) throw new ArgumentNullException("match"); foreach (T t in List) if (match(t)) return t; return default(T); } public EditableList FindAll(Predicate match) { if (match == null) throw new ArgumentNullException("match"); EditableList list = new EditableList(); foreach (T t in List) if (match(t)) list.Add(t); return list; } public int FindIndex(Predicate match) { return FindIndex(0, List.Count, match); } public int FindIndex(int startIndex, Predicate match) { return FindIndex(startIndex, List.Count - startIndex, match); } public int FindIndex(int startIndex, int count, Predicate match) { if (startIndex > List.Count) throw new ArgumentOutOfRangeException("startIndex"); if (count < 0 || startIndex > List.Count - count) throw new ArgumentOutOfRangeException("count"); if (match == null) throw new ArgumentNullException("match"); for (int i = startIndex; i < startIndex + count; i++) if (match((T)List[i])) return i; return -1; } public T FindLast(Predicate match) { if (match == null) throw new ArgumentNullException("match"); for (int i = List.Count - 1; i >= 0; i--) { T t = (T)List[i]; if (match(t)) return t; } return default(T); } public int FindLastIndex(Predicate match) { return FindLastIndex(List.Count - 1, List.Count, match); } public int FindLastIndex(int startIndex, Predicate match) { return FindLastIndex(startIndex, startIndex + 1, match); } public int FindLastIndex(int startIndex, int count, Predicate match) { if (startIndex >= List.Count) throw new ArgumentOutOfRangeException("startIndex"); if (count < 0 || startIndex - count + 1 < 0) throw new ArgumentOutOfRangeException("count"); if (match == null) throw new ArgumentNullException("match"); for (int i = startIndex; i > startIndex - count; i--) { T t = (T)List[i]; if (match(t)) return i; } return -1; } public void ForEach(Action action) { if (action == null) throw new ArgumentNullException("action"); foreach (T t in List) action(t); } public void Sort(IComparer comparer) { Sort(0, List.Count, comparer); } public void Sort(int index, int count, IComparer comparer) { if (List.Count > 1 && count > 1) { T[] items = new T[count]; List.CopyTo(index, items, 0, count); Array.Sort(items, index, count, comparer); for (int i = 0; i < count; i++) List[i + index] = items[i]; OnListChanged(ListChangedType.Reset, 0); } } public void Sort(Comparison comparison) { if (List.Count > 1) { T[] items = new T[List.Count]; List.CopyTo(items); Array.Sort(items, comparison); for (int i = 0; i < List.Count; i++) List[i] = items[i]; OnListChanged(ListChangedType.Reset, 0); } } #endregion #region Static Methods internal EditableList(ArrayList list) : base(typeof(T), list) { } public static EditableList Adapter(List list) { return new EditableList(ArrayList.Adapter(list)); } public static new EditableList Adapter(IList list) { return list is ArrayList? new EditableList((ArrayList)list): new EditableList(ArrayList.Adapter(list)); } #endregion #region IList Members public int IndexOf(T item) { return IndexOf((object)item); } public void Insert(int index, T item) { Insert(index, (object)item); } #endregion #region ICollection Members public void Add(T item) { Add((object)item); } public bool Contains(T item) { return Contains((object)item); } public void CopyTo(T[] array, int arrayIndex) { CopyTo((Array)array, arrayIndex); } public bool Remove(T item) { if (Contains(item) == false) return false; Remove((object)item); return true; } #endregion #region IEnumerable Members public new IEnumerator GetEnumerator() { return new Enumerator(List.GetEnumerator()); } class Enumerator : IEnumerator { public Enumerator(IEnumerator enumerator) { _enumerator = enumerator; } private readonly IEnumerator _enumerator; #region IEnumerator Members T IEnumerator.Current { get { return (T)_enumerator.Current; } } #endregion #region IEnumerator Members object IEnumerator.Current { get { return _enumerator.Current; } } bool IEnumerator.MoveNext() { return _enumerator.MoveNext(); } void IEnumerator.Reset() { _enumerator.Reset(); } #endregion #region IDisposable Members void IDisposable.Dispose() { } #endregion } #endregion } }