426 lines
12 KiB
C#
426 lines
12 KiB
C#
namespace System.Workflow.ComponentModel
|
|
{
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
[Flags]
|
|
internal enum ItemListChangeAction
|
|
{
|
|
Add = 0x01,
|
|
Remove = 0x2,
|
|
Replace = Add | Remove
|
|
}
|
|
|
|
internal class ItemListChangeEventArgs<T> : EventArgs
|
|
{
|
|
private int index = 0;
|
|
private ICollection<T> addedItems = null;
|
|
private ICollection<T> removedItems = null;
|
|
private object owner = null;
|
|
private ItemListChangeAction action = ItemListChangeAction.Add;
|
|
|
|
public ItemListChangeEventArgs(int index, ICollection<T> removedItems, ICollection<T> addedItems, object owner, ItemListChangeAction action)
|
|
{
|
|
this.index = index;
|
|
this.removedItems = removedItems;
|
|
this.addedItems = addedItems;
|
|
this.action = action;
|
|
this.owner = owner;
|
|
}
|
|
|
|
public ItemListChangeEventArgs(int index, T removedActivity, T addedActivity, object owner, ItemListChangeAction action)
|
|
{
|
|
this.index = index;
|
|
if ((object)removedActivity != null)
|
|
{
|
|
this.removedItems = new List<T>();
|
|
((List<T>)this.removedItems).Add(removedActivity);
|
|
}
|
|
if ((object)addedActivity != null)
|
|
{
|
|
this.addedItems = new List<T>();
|
|
((List<T>)this.addedItems).Add(addedActivity);
|
|
}
|
|
this.action = action;
|
|
this.owner = owner;
|
|
}
|
|
|
|
public IList<T> RemovedItems
|
|
{
|
|
get
|
|
{
|
|
return (this.removedItems != null) ? new List<T>(this.removedItems).AsReadOnly() : new List<T>().AsReadOnly();
|
|
}
|
|
}
|
|
|
|
public IList<T> AddedItems
|
|
{
|
|
get
|
|
{
|
|
return (this.addedItems != null) ? new List<T>(this.addedItems).AsReadOnly() : new List<T>().AsReadOnly();
|
|
}
|
|
}
|
|
|
|
public object Owner
|
|
{
|
|
get
|
|
{
|
|
return this.owner;
|
|
}
|
|
}
|
|
|
|
public int Index
|
|
{
|
|
get
|
|
{
|
|
return this.index;
|
|
}
|
|
}
|
|
|
|
public ItemListChangeAction Action
|
|
{
|
|
get
|
|
{
|
|
return this.action;
|
|
}
|
|
}
|
|
}
|
|
|
|
internal delegate void ItemListChangeEventHandler<T>(object sender, ItemListChangeEventArgs<T> e);
|
|
|
|
internal class ItemList<T> : List<T>, IList<T>, IList
|
|
{
|
|
internal event ItemListChangeEventHandler<T> ListChanging;
|
|
private object owner = null;
|
|
|
|
internal ItemList(object owner)
|
|
{
|
|
this.owner = owner;
|
|
}
|
|
|
|
protected object Owner
|
|
{
|
|
get
|
|
{
|
|
return this.owner;
|
|
}
|
|
}
|
|
|
|
bool IsFixedSize
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
#region ItemList<T> Members
|
|
|
|
public event ItemListChangeEventHandler<T> ListChanged;
|
|
|
|
#endregion
|
|
|
|
#region IList<T> Members
|
|
|
|
void IList<T>.RemoveAt(int index)
|
|
{
|
|
if (index < 0 || index > base.Count)
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
T item = base[index];
|
|
|
|
FireListChanging(new ItemListChangeEventArgs<T>(index, item, default(T), this.owner, ItemListChangeAction.Remove));
|
|
base.RemoveAt(index);
|
|
FireListChanged(new ItemListChangeEventArgs<T>(index, item, default(T), this.owner, ItemListChangeAction.Remove));
|
|
}
|
|
|
|
void IList<T>.Insert(int index, T item)
|
|
{
|
|
if (index < 0 || index > base.Count)
|
|
throw new ArgumentOutOfRangeException();
|
|
if ((object)item == null)
|
|
throw new ArgumentNullException("item");
|
|
|
|
FireListChanging(new ItemListChangeEventArgs<T>(index, default(T), item, this.owner, ItemListChangeAction.Add));
|
|
base.Insert(index, item);
|
|
FireListChanged(new ItemListChangeEventArgs<T>(index, default(T), item, this.owner, ItemListChangeAction.Add));
|
|
}
|
|
T IList<T>.this[int index]
|
|
{
|
|
get
|
|
{
|
|
return base[index];
|
|
}
|
|
set
|
|
{
|
|
if ((object)value == null)
|
|
throw new ArgumentNullException("item");
|
|
|
|
T oldItem = base[index];
|
|
FireListChanging(new ItemListChangeEventArgs<T>(index, oldItem, value, this.owner, ItemListChangeAction.Replace));
|
|
base[index] = value;
|
|
FireListChanged(new ItemListChangeEventArgs<T>(index, oldItem, value, this.owner, ItemListChangeAction.Replace));
|
|
}
|
|
}
|
|
int IList<T>.IndexOf(T item)
|
|
{
|
|
return base.IndexOf(item);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ICollection<T> Members
|
|
|
|
bool ICollection<T>.IsReadOnly
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool ICollection<T>.Contains(T item)
|
|
{
|
|
return base.Contains(item);
|
|
}
|
|
|
|
bool ICollection<T>.Remove(T item)
|
|
{
|
|
if (!base.Contains(item))
|
|
return false;
|
|
|
|
int index = base.IndexOf(item);
|
|
if (index >= 0)
|
|
{
|
|
FireListChanging(new ItemListChangeEventArgs<T>(index, item, default(T), this.owner, ItemListChangeAction.Remove));
|
|
base.Remove(item);
|
|
FireListChanged(new ItemListChangeEventArgs<T>(index, item, default(T), this.owner, ItemListChangeAction.Remove));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void ICollection<T>.Clear()
|
|
{
|
|
ICollection<T> children = this.GetRange(0, this.Count);
|
|
FireListChanging(new ItemListChangeEventArgs<T>(-1, children, null, this.owner, ItemListChangeAction.Remove));
|
|
base.Clear();
|
|
FireListChanged(new ItemListChangeEventArgs<T>(-1, children, null, this.owner, ItemListChangeAction.Remove));
|
|
}
|
|
|
|
void ICollection<T>.Add(T item)
|
|
{
|
|
if ((object)item == null)
|
|
throw new ArgumentNullException("item");
|
|
|
|
FireListChanging(new ItemListChangeEventArgs<T>(base.Count, default(T), item, this.owner, ItemListChangeAction.Add));
|
|
base.Add(item);
|
|
FireListChanged(new ItemListChangeEventArgs<T>(base.Count, default(T), item, this.owner, ItemListChangeAction.Add));
|
|
}
|
|
|
|
int ICollection<T>.Count
|
|
{
|
|
get
|
|
{
|
|
return base.Count;
|
|
}
|
|
}
|
|
void ICollection<T>.CopyTo(T[] array, int arrayIndex)
|
|
{
|
|
base.CopyTo(array, arrayIndex);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IEnumerable<T> Members
|
|
|
|
IEnumerator<T> IEnumerable<T>.GetEnumerator()
|
|
{
|
|
return base.GetEnumerator();
|
|
}
|
|
|
|
#endregion
|
|
|
|
public new void Add(T item)
|
|
{
|
|
((IList<T>)this).Add(item);
|
|
}
|
|
|
|
public new void AddRange(IEnumerable<T> collection)
|
|
{
|
|
if (collection == null)
|
|
throw new ArgumentNullException("collection");
|
|
|
|
FireListChanging(new ItemListChangeEventArgs<T>(-1, null, new List<T>(collection), this.owner, ItemListChangeAction.Add));
|
|
base.AddRange(collection);
|
|
FireListChanged(new ItemListChangeEventArgs<T>(base.Count, null, new List<T>(collection), this.owner, ItemListChangeAction.Add));
|
|
}
|
|
|
|
public new void InsertRange(int index, IEnumerable<T> collection)
|
|
{
|
|
if (index < 0 || index > base.Count)
|
|
throw new ArgumentOutOfRangeException();
|
|
if (collection == null)
|
|
throw new ArgumentNullException("collection");
|
|
|
|
FireListChanging(new ItemListChangeEventArgs<T>(index, null, new List<T>(collection), this.owner, ItemListChangeAction.Add));
|
|
base.InsertRange(index, collection);
|
|
FireListChanged(new ItemListChangeEventArgs<T>(index, null, new List<T>(collection), this.owner, ItemListChangeAction.Add));
|
|
}
|
|
|
|
public new void Clear()
|
|
{
|
|
((IList<T>)this).Clear();
|
|
}
|
|
|
|
public new void Insert(int index, T item)
|
|
{
|
|
((IList<T>)this).Insert(index, item);
|
|
}
|
|
|
|
public new bool Remove(T item)
|
|
{
|
|
return ((IList<T>)this).Remove(item);
|
|
}
|
|
|
|
public new void RemoveAt(int index)
|
|
{
|
|
((IList<T>)this).RemoveAt(index);
|
|
}
|
|
|
|
public new T this[int index]
|
|
{
|
|
get
|
|
{
|
|
return ((IList<T>)this)[index];
|
|
}
|
|
set
|
|
{
|
|
((IList<T>)this)[index] = value;
|
|
}
|
|
}
|
|
|
|
|
|
#region Helper methods
|
|
|
|
protected virtual void FireListChanging(ItemListChangeEventArgs<T> eventArgs)
|
|
{
|
|
if (this.ListChanging != null)
|
|
this.ListChanging(this, eventArgs);
|
|
}
|
|
|
|
protected virtual void FireListChanged(ItemListChangeEventArgs<T> eventArgs)
|
|
{
|
|
if (this.ListChanged != null)
|
|
this.ListChanged(this, eventArgs);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IList Members
|
|
|
|
int IList.Add(object value)
|
|
{
|
|
if (!(value is T))
|
|
throw new Exception(SR.GetString(SR.Error_InvalidListItem, this.GetType().GetGenericArguments()[0].FullName));
|
|
((IList<T>)this).Add((T)value);
|
|
return this.Count - 1;
|
|
}
|
|
|
|
void IList.Clear()
|
|
{
|
|
((IList<T>)this).Clear();
|
|
}
|
|
|
|
bool IList.Contains(object value)
|
|
{
|
|
if (!(value is T))
|
|
throw new Exception(SR.GetString(SR.Error_InvalidListItem, this.GetType().GetGenericArguments()[0].FullName));
|
|
return ((IList<T>)this).Contains((T)value);
|
|
}
|
|
|
|
int IList.IndexOf(object value)
|
|
{
|
|
if (!(value is T))
|
|
throw new Exception(SR.GetString(SR.Error_InvalidListItem, this.GetType().GetGenericArguments()[0].FullName));
|
|
return ((IList<T>)this).IndexOf((T)value);
|
|
}
|
|
|
|
void IList.Insert(int index, object value)
|
|
{
|
|
if (!(value is T))
|
|
throw new Exception(SR.GetString(SR.Error_InvalidListItem, this.GetType().GetGenericArguments()[0].FullName));
|
|
((IList<T>)this).Insert(index, (T)value);
|
|
}
|
|
|
|
bool IList.IsFixedSize
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IList.IsReadOnly
|
|
{
|
|
get
|
|
{
|
|
return ((IList<T>)this).IsReadOnly;
|
|
}
|
|
}
|
|
|
|
void IList.Remove(object value)
|
|
{
|
|
if (!(value is T))
|
|
throw new Exception(SR.GetString(SR.Error_InvalidListItem, this.GetType().GetGenericArguments()[0].FullName));
|
|
((IList<T>)this).Remove((T)value);
|
|
}
|
|
object IList.this[int index]
|
|
{
|
|
get
|
|
{
|
|
return ((IList<T>)this)[index];
|
|
}
|
|
|
|
set
|
|
{
|
|
if (!(value is T))
|
|
throw new Exception(SR.GetString(SR.Error_InvalidListItem, this.GetType().GetGenericArguments()[0].FullName));
|
|
((IList<T>)this)[index] = (T)value;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ICollection Members
|
|
|
|
void ICollection.CopyTo(Array array, int index)
|
|
{
|
|
for (int loop = 0; loop < Count; loop++)
|
|
array.SetValue(this[loop], loop + index);
|
|
}
|
|
bool ICollection.IsSynchronized
|
|
{
|
|
get { return false; }
|
|
}
|
|
|
|
object ICollection.SyncRoot
|
|
{
|
|
get { return this; }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IEnumerable Members
|
|
|
|
IEnumerator IEnumerable.GetEnumerator()
|
|
{
|
|
return base.GetEnumerator();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
}
|