// HtmlAgilityPack V1.0 - Simon Mourier using System; using System.Collections; namespace HtmlAgilityPack { /// /// Represents a list of mixed code fragments. /// public class MixedCodeDocumentFragmentList : IEnumerable { #region Fields private MixedCodeDocument _doc; private ArrayList _items = new ArrayList(); #endregion #region Constructors internal MixedCodeDocumentFragmentList(MixedCodeDocument doc) { _doc = doc; } #endregion #region Properties /// /// Gets the Document /// public MixedCodeDocument Doc { get { return _doc; } } /// /// Gets the number of fragments contained in the list. /// public int Count { get { return _items.Count; } } /// /// Gets a fragment from the list using its index. /// public MixedCodeDocumentFragment this[int index] { get { return _items[index] as MixedCodeDocumentFragment; } } #endregion #region IEnumerable Members /// /// Gets an enumerator that can iterate through the fragment list. /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion #region Public Methods /// /// Appends a fragment to the list of fragments. /// /// The fragment to append. May not be null. public void Append(MixedCodeDocumentFragment newFragment) { if (newFragment == null) { throw new ArgumentNullException("newFragment"); } _items.Add(newFragment); } /// /// Gets an enumerator that can iterate through the fragment list. /// public MixedCodeDocumentFragmentEnumerator GetEnumerator() { return new MixedCodeDocumentFragmentEnumerator(_items); } /// /// Prepends a fragment to the list of fragments. /// /// The fragment to append. May not be null. public void Prepend(MixedCodeDocumentFragment newFragment) { if (newFragment == null) { throw new ArgumentNullException("newFragment"); } _items.Insert(0, newFragment); } /// /// Remove a fragment from the list of fragments. If this fragment was not in the list, an exception will be raised. /// /// The fragment to remove. May not be null. public void Remove(MixedCodeDocumentFragment fragment) { if (fragment == null) { throw new ArgumentNullException("fragment"); } int index = GetFragmentIndex(fragment); if (index == -1) { throw new IndexOutOfRangeException(); } RemoveAt(index); } /// /// Remove all fragments from the list. /// public void RemoveAll() { _items.Clear(); } /// /// Remove a fragment from the list of fragments, using its index in the list. /// /// The index of the fragment to remove. public void RemoveAt(int index) { //MixedCodeDocumentFragment frag = (MixedCodeDocumentFragment) _items[index]; _items.RemoveAt(index); } #endregion #region Internal Methods internal void Clear() { _items.Clear(); } internal int GetFragmentIndex(MixedCodeDocumentFragment fragment) { if (fragment == null) { throw new ArgumentNullException("fragment"); } for (int i = 0; i < _items.Count; i++) { if ((_items[i]) == fragment) { return i; } } return -1; } #endregion #region Nested type: MixedCodeDocumentFragmentEnumerator /// /// Represents a fragment enumerator. /// public class MixedCodeDocumentFragmentEnumerator : IEnumerator { #region Fields private int _index; private ArrayList _items; #endregion #region Constructors internal MixedCodeDocumentFragmentEnumerator(ArrayList items) { _items = items; _index = -1; } #endregion #region Properties /// /// Gets the current element in the collection. /// public MixedCodeDocumentFragment Current { get { return (MixedCodeDocumentFragment) (_items[_index]); } } #endregion #region IEnumerator Members /// /// Gets the current element in the collection. /// object IEnumerator.Current { get { return (Current); } } /// /// Advances the enumerator to the next element of the collection. /// /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. public bool MoveNext() { _index++; return (_index < _items.Count); } /// /// Sets the enumerator to its initial position, which is before the first element in the collection. /// public void Reset() { _index = -1; } #endregion } #endregion } }