a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
354 lines
7.3 KiB
C#
354 lines
7.3 KiB
C#
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
|
|
//
|
|
// Authors:
|
|
// Peter Bartok (pbartok@novell.com)
|
|
//
|
|
//
|
|
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Globalization;
|
|
using System.Reflection;
|
|
using System.Security.Permissions;
|
|
|
|
namespace System.Web.UI.WebControls {
|
|
|
|
// CAS - no inheritance demand required because the class is sealed
|
|
[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
|
|
ArrayList items;
|
|
bool tracking;
|
|
bool dirty;
|
|
int lastDirty = 0;
|
|
#endregion // Fields
|
|
|
|
#region Public Constructors
|
|
public ListItemCollection() {
|
|
items = new ArrayList();
|
|
}
|
|
#endregion // Public Constructors
|
|
|
|
#region Public Instance Properties
|
|
public int Capacity {
|
|
get {
|
|
return items.Capacity;
|
|
}
|
|
|
|
set {
|
|
items.Capacity = value;
|
|
}
|
|
}
|
|
|
|
public int Count {
|
|
get {
|
|
return items.Count;
|
|
}
|
|
}
|
|
|
|
public bool IsReadOnly {
|
|
get {
|
|
return items.IsReadOnly;
|
|
}
|
|
}
|
|
|
|
public bool IsSynchronized {
|
|
get {
|
|
return items.IsSynchronized;
|
|
}
|
|
}
|
|
|
|
public object SyncRoot {
|
|
get {
|
|
return items.SyncRoot;
|
|
}
|
|
}
|
|
|
|
public ListItem this[int index] {
|
|
get {
|
|
return (ListItem)items[index];
|
|
}
|
|
}
|
|
#endregion // Public Instance Properties
|
|
|
|
#region Public Instance Methods
|
|
public void Add(ListItem item) {
|
|
items.Add(item);
|
|
if (tracking) {
|
|
item.TrackViewState ();
|
|
SetDirty ();
|
|
}
|
|
}
|
|
|
|
public void Add(string 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) {
|
|
return items.Contains(item);
|
|
}
|
|
|
|
public void CopyTo(Array array, int index) {
|
|
items.CopyTo(array, index);
|
|
}
|
|
|
|
public ListItem FindByText (string text)
|
|
{
|
|
for (int i = 0; i < items.Count; i++)
|
|
if (text == this [i].Text)
|
|
return this [i];
|
|
|
|
return null;
|
|
}
|
|
|
|
public ListItem FindByValue (string value)
|
|
{
|
|
for (int i = 0; i < items.Count; i++)
|
|
if (value == this [i].Value)
|
|
return this [i];
|
|
|
|
return null;
|
|
}
|
|
|
|
public IEnumerator GetEnumerator() {
|
|
return items.GetEnumerator();
|
|
}
|
|
|
|
public int IndexOf(ListItem item) {
|
|
return items.IndexOf(item);
|
|
}
|
|
|
|
internal int IndexOf(string value) {
|
|
for (int i = 0; i < items.Count; i++)
|
|
if (value == this [i].Value)
|
|
return i;
|
|
return -1;
|
|
}
|
|
|
|
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) {
|
|
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) {
|
|
items.RemoveAt (i);
|
|
|
|
if (tracking)
|
|
SetDirty ();
|
|
}
|
|
}
|
|
|
|
public void RemoveAt(int index) {
|
|
items.RemoveAt(index);
|
|
|
|
if (tracking)
|
|
SetDirty ();
|
|
}
|
|
#endregion // Public Instance Methods
|
|
|
|
#region Interface methods
|
|
bool IList.IsFixedSize {
|
|
get {
|
|
return items.IsFixedSize;
|
|
}
|
|
}
|
|
|
|
object IList.this[int index] {
|
|
get {
|
|
return this[index];
|
|
}
|
|
|
|
set {
|
|
if ((index >= 0) && (index < items.Count)) {
|
|
items[index] = (ListItem)value;
|
|
|
|
if (tracking)
|
|
((ListItem) value).TrackViewState ();
|
|
}
|
|
}
|
|
}
|
|
|
|
int IList.Add(object value) {
|
|
int i = items.Add ((ListItem) value);
|
|
|
|
if (tracking) {
|
|
((IStateManager) value).TrackViewState ();
|
|
SetDirty ();
|
|
}
|
|
return i;
|
|
}
|
|
|
|
bool IList.Contains(object value) {
|
|
return Contains((ListItem)value);
|
|
}
|
|
|
|
int IList.IndexOf(object value) {
|
|
return IndexOf((ListItem)value);
|
|
}
|
|
|
|
void IList.Insert(int index, object value) {
|
|
Insert(index, (ListItem)value);
|
|
}
|
|
|
|
void IList.Remove(object value) {
|
|
Remove((ListItem)value);
|
|
}
|
|
|
|
bool IStateManager.IsTrackingViewState {
|
|
get {
|
|
return tracking;
|
|
}
|
|
}
|
|
|
|
void IStateManager.LoadViewState (object savedState)
|
|
{
|
|
Pair pair = savedState as Pair;
|
|
if (pair == null)
|
|
return;
|
|
|
|
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++) {
|
|
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;
|
|
bool itemsDirty = false;
|
|
|
|
count = items.Count;
|
|
if (count == 0 && !dirty)
|
|
return null;
|
|
|
|
object [] itemsState = null;
|
|
if (count > 0)
|
|
itemsState = new object [count];
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
itemsState [i] = ((IStateManager) items [i]).SaveViewState ();
|
|
if (itemsState [i] != null)
|
|
itemsDirty = true;
|
|
}
|
|
|
|
if (!dirty && !itemsDirty)
|
|
return null;
|
|
|
|
return new Pair (dirty, itemsState);
|
|
}
|
|
|
|
void IStateManager.TrackViewState() {
|
|
tracking = true;
|
|
|
|
for (int i = 0; i < items.Count; i++) {
|
|
((ListItem)items[i]).TrackViewState();
|
|
}
|
|
}
|
|
#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;
|
|
}
|
|
}
|
|
}
|