Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.EditableObjects.EditableList.cs

 
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<T> : EditableArrayList, IList<T>
    {
        #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<T> list) 
            : base(list, true)
        {
        }

        public EditableList(EditableList<T> list, bool trackChanges)
            : base(list, trackChanges)
        {
        }

        #endregion

        #region Typed Methods

        public override object Clone()
        {
            return Clone(new EditableList<T>((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<T> Methods

        public T Find(Predicate<T> match)
        {
            if (match == null) throw new ArgumentNullException("match");

            foreach (T t in List)
                if (match(t))
                    return t;

            return default(T);
        }

        public EditableList<T> FindAll(Predicate<T> match)
        {
            if (match == null) throw new ArgumentNullException("match");

            EditableList<T> list = new EditableList<T>();

            foreach (T t in List)
                if (match(t))
                    list.Add(t);

            return list;
        }

        public int FindIndex(Predicate<T> match)
        {
            return FindIndex(0, List.Count, match);
        }

        public int FindIndex(int startIndex, Predicate<T> match)
        {
            return FindIndex(startIndex, List.Count - startIndex, match);
        }

        public int FindIndex(int startIndex, int count, Predicate<T> 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<T> 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<T> match)
        {
            return FindLastIndex(List.Count - 1, List.Count, match);
        }

        public int FindLastIndex(int startIndex, Predicate<T> match)
        {
            return FindLastIndex(startIndex, startIndex + 1, match);
        }

        public int FindLastIndex(int startIndex, int count, Predicate<T> 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<T> action)
        {
            if (action == null) throw new ArgumentNullException("action");

            foreach (T t in List)
                action(t);
        }

        public void Sort(IComparer<T> comparer)
        {
            Sort(0, List.Count, comparer);
        }

        public void Sort(int index, int count, IComparer<T> comparer)
        {
            if (List.Count > 1 && count > 1)
            {
                T[] items = new T[count];

                List.CopyTo(index, items, 0, count);
                Array.Sort<T>(items, index, count, comparer);

                for (int i = 0; i < count; i++)
                    List[i + index] = items[i];

                OnListChanged(ListChangedType.Reset, 0);
            }
        }

        public void Sort(Comparison<T> comparison)
        {
            if (List.Count > 1)
            {
                T[] items = new T[List.Count];

                List.CopyTo(items);
                Array.Sort<T>(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<T> Adapter(List<T> list)
        {
            return new EditableList<T>(ArrayList.Adapter(list));
        }

        public static new EditableList<T> Adapter(IList list)
        {
            return list is ArrayList? 
                new EditableList<T>((ArrayList)list):
                new EditableList<T>(ArrayList.Adapter(list));
        }

        #endregion

        #region IList<T> Members

        public int IndexOf(T item)
        {
            return IndexOf((object)item);
        }

        public void Insert(int index, T item)
        {
            Insert(index, (object)item);
        }

        #endregion

        #region ICollection<T> 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<T> Members

        public new IEnumerator<T> GetEnumerator()
        {
            return new Enumerator(List.GetEnumerator());
        }

        class Enumerator : IEnumerator<T>
        {
            public Enumerator(IEnumerator enumerator)
            {
                _enumerator = enumerator;
            }

            private readonly IEnumerator _enumerator;

            #region IEnumerator<T> Members

            T IEnumerator<T>.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
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net