[AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
// attributes
[Editor("System.Web.UI.Design.WebControls.ListItemsCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
- public sealed class ListItemCollection : IList, ICollection, IEnumerable, IStateManager {
- #region Fields
- private ArrayList items;
- private bool tracking;
- #endregion // Fields
-
- #region Public Constructors
+ public sealed class ListItemCollection : IList, ICollection, IEnumerable, IStateManager
+ {
+#region Fields
+ ArrayList items;
+ bool tracking;
+ bool dirty;
+ int lastDirty = 0;
+#endregion // Fields
+
+#region Public Constructors
public ListItemCollection() {
items = new ArrayList();
}
- #endregion // Public Constructors
+#endregion // Public Constructors
- #region Public Instance Properties
+#region Public Instance Properties
public int Capacity {
get {
return items.Capacity;
#region Public Instance Methods
public void Add(ListItem item) {
items.Add(item);
+ if (tracking) {
+ item.TrackViewState ();
+ SetDirty ();
+ }
}
public void Add(string item) {
- items.Add(new ListItem(item));
+ ListItem listItem = new ListItem (item);
+ items.Add (listItem);
+
+ if (tracking) {
+ listItem.TrackViewState ();
+ SetDirty ();
+ }
}
public void AddRange(ListItem[] items) {
for (int i = 0; i < items.Length; i++) {
Add(items[i]);
+
+ if (tracking) {
+ items [i].TrackViewState ();
+ SetDirty ();
+ }
}
}
public void Clear() {
items.Clear();
+
+ if (tracking)
+ SetDirty ();
}
public bool Contains(ListItem item) {
public void Insert(int index, ListItem item) {
items.Insert(index, item);
+
+ if (tracking) {
+ item.TrackViewState ();
+ lastDirty = index;
+ SetDirty ();
+ }
}
public void Insert(int index, string item) {
- items.Insert(index, new ListItem(item));
+ ListItem listItem = new ListItem(item);
+ items.Insert (index, listItem);
+
+ if (tracking) {
+ listItem.TrackViewState ();
+ lastDirty = index;
+ SetDirty ();
+ }
}
public void Remove(ListItem item) {
items.Remove(item);
+
+ if (tracking)
+ SetDirty ();
}
public void Remove (string item)
{
for (int i = 0; i < items.Count; i++)
- if (item == this [i].Value)
+ if (item == this [i].Value) {
items.RemoveAt (i);
+
+ if (tracking)
+ SetDirty ();
+ }
}
public void RemoveAt(int index) {
items.RemoveAt(index);
+
+ if (tracking)
+ SetDirty ();
}
- #endregion // Public Instance Methods
+#endregion // Public Instance Methods
- #region Interface methods
+#region Interface methods
bool IList.IsFixedSize {
get {
return items.IsFixedSize;
set {
if ((index >= 0) && (index < items.Count)) {
items[index] = (ListItem)value;
+
+ if (tracking)
+ ((ListItem) value).TrackViewState ();
}
}
}
int IList.Add(object value) {
- return items.Add((ListItem)value);
+ int i = items.Add ((ListItem) value);
+
+ if (tracking) {
+ ((IStateManager) value).TrackViewState ();
+ SetDirty ();
+ }
+ return i;
}
bool IList.Contains(object value) {
}
}
- void IStateManager.LoadViewState(object state) {
- int count;
- string[] text;
- string[] value;
-#if NET_2_0
- bool [] enabled;
-#endif
-
- if (state == null) {
+ void IStateManager.LoadViewState (object savedState)
+ {
+ Pair pair = savedState as Pair;
+ if (pair == null)
return;
- }
-#if NET_2_0
- Triplet stateObj;
- stateObj = (Triplet) state;
-#else
- Pair stateObj;
- stateObj = (Pair) state;
-#endif
-
- text = (string []) stateObj.First;
- value = (string []) stateObj.Second;
-#if NET_2_0
- enabled = (bool []) stateObj.Third;
-#endif
-
- count = text.Length;
-
- items = new ArrayList(count);
+
+ bool newCollection = (bool) pair.First;
+ object [] itemsArray = (object []) pair.Second;
+ int count = itemsArray==null ? 0 : itemsArray.Length;
+
+ if (newCollection)
+ if (count > 0)
+ items = new ArrayList(count);
+ else
+ items = new ArrayList();
+
for (int i = 0; i < count; i++) {
-#if NET_2_0
- items.Add(new ListItem(text[i], value[i], enabled[i]));
-#else
- items.Add(new ListItem(text[i], value[i]));
-#endif
+ ListItem item = new ListItem ();
+
+ if (newCollection) {
+ item.LoadViewState (itemsArray [i]);
+ item.SetDirty ();
+ Add (item);
+ }
+ else{
+ if (itemsArray [i] != null){
+ item.LoadViewState (itemsArray [i]);
+ item.SetDirty ();
+ items [i] = item;
+ }
+ }
}
}
object IStateManager.SaveViewState() {
int count;
- string[] text;
- string[] value;
-#if NET_2_0
- bool [] enabled;
-#endif
+ bool itemsDirty = false;
count = items.Count;
- text = new string[count];
- value = new string[count];
-#if NET_2_0
- enabled = new bool [count];
-#endif
+ if (count == 0 && !dirty)
+ return null;
+
+ object [] itemsState = null;
+ if (count > 0)
+ itemsState = new object [count];
for (int i = 0; i < count; i++) {
- text[i] = ((ListItem)items[i]).Text;
- value[i] = ((ListItem)items[i]).Value;
-#if NET_2_0
- enabled [i] = ((ListItem) items [i]).Enabled;
-#endif
+ itemsState [i] = ((IStateManager) items [i]).SaveViewState ();
+ if (itemsState [i] != null)
+ itemsDirty = true;
}
-#if NET_2_0
- return new Triplet(text, value, enabled);
-#else
- return new Pair(text, value);
-#endif
+ if (!dirty && !itemsDirty)
+ return null;
+
+ return new Pair (dirty, itemsState);
}
void IStateManager.TrackViewState() {
((ListItem)items[i]).TrackViewState();
}
}
- #endregion // Interface methods
+#endregion // Interface methods
+
+ void SetDirty ()
+ {
+ dirty = true;
+ for (int i = lastDirty; i < items.Count; i++)
+ ((ListItem) items [i]).SetDirty ();
+
+ lastDirty = items.Count - 1;
+ if (lastDirty < 0)
+ lastDirty = 0;
+ }
}
}