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