//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
namespace System.Web.UI.WebControls {
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing.Design;
///
/// Encapsulates the items within a .
/// This class cannot be inherited.
///
[
Editor("System.Web.UI.Design.WebControls.ListItemsCollectionEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor))
]
public sealed class ListItemCollection : ICollection, IList, IStateManager {
private ArrayList listItems;
private bool marked;
private bool saveAll;
///
/// Initializes a new instance of the
/// class.
///
public ListItemCollection() {
listItems = new ArrayList();
marked = false;
saveAll = false;
}
///
/// Gets a referenced by the specified ordinal
/// index value.
///
public ListItem this[int index] {
get {
return (ListItem)listItems[index];
}
}
///
object IList.this[int index] {
get {
return listItems[index];
}
set {
listItems[index] = (ListItem)value;
}
}
public int Capacity {
get {
return listItems.Capacity;
}
set {
listItems.Capacity = value;
}
}
///
/// Gets the item count of the collection.
///
public int Count {
get {
return listItems.Count;
}
}
///
/// Adds the specified item to the end of the collection.
///
public void Add(string item) {
Add(new ListItem(item));
}
///
/// Adds the specified to the end of the collection.
///
public void Add(ListItem item) {
listItems.Add(item);
if (marked) {
item.Dirty = true;
}
}
///
int IList.Add(object item) {
ListItem newItem = (ListItem) item;
int returnValue = listItems.Add(newItem);
if (marked) {
newItem.Dirty = true;
}
return returnValue;
}
///
///
public void AddRange(ListItem[] items) {
if (items == null) {
throw new ArgumentNullException("items");
}
foreach(ListItem item in items) {
Add(item);
}
}
///
/// Removes all controls from the collection.
///
public void Clear() {
listItems.Clear();
if (marked)
saveAll = true;
}
///
/// Returns a value indicating whether the
/// collection contains the specified item.
///
public bool Contains(ListItem item) {
return listItems.Contains(item);
}
///
bool IList.Contains(object item) {
return Contains((ListItem) item);
}
///
/// Copies contents from the collection to a specified with a
/// specified starting index.
///
public void CopyTo(Array array, int index) {
listItems.CopyTo(array,index);
}
public ListItem FindByText(string text) {
int index = FindByTextInternal(text, true);
if (index != -1) {
return (ListItem)listItems[index];
}
return null;
}
internal int FindByTextInternal(string text, bool includeDisabled) {
int i = 0;
foreach (ListItem item in listItems) {
if (item.Text.Equals(text) && (includeDisabled || item.Enabled)) {
return i;
}
i++;
}
return -1;
}
public ListItem FindByValue(string value) {
int index = FindByValueInternal(value, true);
if (index != -1) {
return (ListItem)listItems[index];
}
return null;
}
internal int FindByValueInternal(string value, bool includeDisabled) {
int i = 0;
foreach (ListItem item in listItems) {
if (item.Value.Equals(value) && (includeDisabled || item.Enabled)) {
return i;
}
i++;
}
return -1;
}
///
/// Returns an enumerator of all controls within the
/// collection.
///
public IEnumerator GetEnumerator() {
return listItems.GetEnumerator();
}
///
/// Returns an ordinal index value that represents the
/// position of the specified within the collection.
///
public int IndexOf(ListItem item) {
return listItems.IndexOf(item);
}
///
int IList.IndexOf(object item) {
return IndexOf((ListItem) item);
}
///
/// Adds the specified item to the collection at the specified index
/// location.
///
public void Insert(int index,string item) {
Insert(index,new ListItem(item));
}
///
/// Inserts the specified to the collection at the specified
/// index location.
///
public void Insert(int index,ListItem item) {
listItems.Insert(index,item);
if (marked)
saveAll = true;
}
///
void IList.Insert(int index, object item) {
Insert(index, (ListItem) item);
}
///
bool IList.IsFixedSize {
get {
return false;
}
}
///
/// Gets a value indicating whether the collection is read-only.
///
public bool IsReadOnly {
get { return listItems.IsReadOnly; }
}
///
/// Gets a value indicating whether access to the collection is synchronized
/// (thread-safe).
///
public bool IsSynchronized {
get { return listItems.IsSynchronized; }
}
///
/// Removes the from the collection at the specified
/// index location.
///
public void RemoveAt(int index) {
listItems.RemoveAt(index);
if (marked)
saveAll = true;
}
///
/// Removes the specified item from the collection.
///
public void Remove(string item) {
int index = IndexOf(new ListItem(item));
if (index >= 0) {
RemoveAt(index);
}
}
///
/// Removes the specified from the collection.
///
public void Remove(ListItem item) {
int index = IndexOf(item);
if (index >= 0) {
RemoveAt(index);
}
}
///
void IList.Remove(object item) {
Remove((ListItem) item);
}
///
/// Gets the object that can be used to synchronize access to the collection. In
/// this case, it is the collection itself.
///
public object SyncRoot {
get { return this; }
}
///
///
/// Return true if tracking state changes.
/// Method of private interface, IStateManager.
///
bool IStateManager.IsTrackingViewState {
get {
return marked;
}
}
///
void IStateManager.LoadViewState(object state) {
LoadViewState(state);
}
internal void LoadViewState(object state) {
if (state != null) {
if (state is Pair) {
// only changed items were saved
Pair p = (Pair) state;
ArrayList indices = (ArrayList) p.First;
ArrayList items = (ArrayList) p.Second;
for (int i=0; i
void IStateManager.TrackViewState() {
TrackViewState();
}
internal void TrackViewState() {
marked = true;
for (int i=0; i < Count; i++)
this[i].TrackViewState();
}
///
object IStateManager.SaveViewState() {
return SaveViewState();
}
internal object SaveViewState() {
if (saveAll == true) {
// save all items
int count = Count;
object[] texts = new string[count];
object[] values = new string[count];
bool[] enableds = new bool[count];
for (int i=0; i < count; i++) {
texts[i] = this[i].Text;
values[i] = this[i].Value;
enableds[i] = this[i].Enabled;
}
return new Triplet(texts, values, enableds);
}
else {
// save only the changed items
ArrayList indices = new ArrayList(4);
ArrayList items = new ArrayList(4);
for (int i=0; i < Count; i++) {
object item = this[i].SaveViewState();
if (item != null) {
indices.Add(i);
items.Add(item);
}
}
if (indices.Count > 0)
return new Pair(indices, items);
return null;
}
}
}
}