mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
366 lines
12 KiB
C#
366 lines
12 KiB
C#
// Decompiled with JetBrains decompiler
|
|||
|
|
// Type: Microsoft.Iris.ListDataSet
|
||
|
|
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
||
|
|
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
|
||
|
|
// Assembly location: C:\Program Files\Zune\UIX.dll
|
||
|
|
|
||
|
|
using Microsoft.Iris.Data;
|
||
|
|
using Microsoft.Iris.Library;
|
||
|
|
using System;
|
||
|
|
using System.Collections;
|
||
|
|
|
||
|
|
namespace Microsoft.Iris
|
||
|
|
{
|
||
|
|
public class ListDataSet : ModelItem, INotifyList, IList, ICollection, IEnumerable
|
||
|
|
{
|
||
|
|
private static readonly EventCookie s_listContentsChangedEvent = EventCookie.ReserveSlot();
|
||
|
|
private IList _sourceList;
|
||
|
|
|
||
|
|
protected ListDataSet()
|
||
|
|
: this(null)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
public ListDataSet(IList source)
|
||
|
|
: this(null, source)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
public ListDataSet(IModelItemOwner owner, IList source)
|
||
|
|
: base(owner)
|
||
|
|
=> _sourceList = source;
|
||
|
|
|
||
|
|
public IList Source
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList;
|
||
|
|
}
|
||
|
|
set
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (_sourceList == value)
|
||
|
|
return;
|
||
|
|
_sourceList = !(_sourceList is IVirtualList) ? value : throw new ArgumentException(InvariantString.Format("ListDataSet does not support IVirtualList. Cannot associate with source list: {0}", value));
|
||
|
|
FirePropertyChanged(nameof(Source));
|
||
|
|
FirePropertyChanged("Count");
|
||
|
|
FireSetChanged(UIListContentsChangeType.Reset, -1, -1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public virtual int Count
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList == null ? 0 : _sourceList.Count;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public virtual bool IsSynchronized
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList != null && _sourceList.IsSynchronized;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public virtual object SyncRoot
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList == null ? null : _sourceList.SyncRoot;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool IsReadOnly
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList == null || _sourceList.IsReadOnly;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool IsFixedSize
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList == null || _sourceList.IsFixedSize;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public object this[int itemIndex]
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList == null ? null : _sourceList[itemIndex];
|
||
|
|
}
|
||
|
|
set
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (_sourceList == null)
|
||
|
|
throw new InvalidOperationException("Cannot use the this indexer without first specifying a Source for this ListDataSet.");
|
||
|
|
if (itemIndex < 0 || itemIndex >= Count)
|
||
|
|
throw new ArgumentOutOfRangeException(nameof(itemIndex), itemIndex, "Given index is out of the range of this list.");
|
||
|
|
if (_sourceList[itemIndex] == value)
|
||
|
|
return;
|
||
|
|
_sourceList[itemIndex] = value;
|
||
|
|
FireSetChanged(UIListContentsChangeType.Modified, itemIndex, itemIndex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public virtual void Clear()
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (_sourceList == null)
|
||
|
|
return;
|
||
|
|
_sourceList.Clear();
|
||
|
|
FireSetChanged(UIListContentsChangeType.Clear, -1, -1);
|
||
|
|
FirePropertyChanged("Count");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public virtual void CopyTo(Array array, int index)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (_sourceList == null)
|
||
|
|
throw new NotImplementedException("The \"CopyTo\" operation is not supported by this ListDataSet");
|
||
|
|
_sourceList.CopyTo(array, index);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void CopyFrom(IEnumerable source)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (source == null)
|
||
|
|
throw new ArgumentNullException(nameof(source));
|
||
|
|
foreach (object obj in source)
|
||
|
|
Add(obj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public virtual IEnumerator GetEnumerator()
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList != null ? _sourceList.GetEnumerator() : throw new NotImplementedException("The \"GetEnumerator\" operation is not supported by this UIDataSet");
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool Contains(object item)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList != null && _sourceList.Contains(item);
|
||
|
|
}
|
||
|
|
|
||
|
|
public int IndexOf(object item)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
return _sourceList == null ? -1 : _sourceList.IndexOf(item);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Remove(object item)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
int index = IndexOf(item);
|
||
|
|
if (index <= -1)
|
||
|
|
return;
|
||
|
|
RemoveAt(index);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void RemoveAt(int index)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (_sourceList == null)
|
||
|
|
throw new ArgumentException(InvariantString.Format("Empty list cannot remove item at index {0}", index));
|
||
|
|
object obj = this[index];
|
||
|
|
_sourceList.RemoveAt(index);
|
||
|
|
FireSetChanged(UIListContentsChangeType.Remove, index, -1);
|
||
|
|
FirePropertyChanged("Count");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Move(int oldIndex, int newIndex)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (_sourceList == null)
|
||
|
|
throw new ArgumentException(InvariantString.Format("Empty list cannot move item from {0} to {1}", oldIndex, newIndex));
|
||
|
|
object obj = this[oldIndex];
|
||
|
|
if (_sourceList is INotifyList sourceList)
|
||
|
|
{
|
||
|
|
sourceList.Move(oldIndex, newIndex);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
_sourceList.RemoveAt(oldIndex);
|
||
|
|
_sourceList.Insert(newIndex, obj);
|
||
|
|
}
|
||
|
|
FireSetChanged(UIListContentsChangeType.Move, oldIndex, newIndex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public int Reorder(IList indices, int newIndex)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (indices == null)
|
||
|
|
throw new ArgumentNullException(nameof(indices));
|
||
|
|
if (newIndex < 0 || newIndex > Count)
|
||
|
|
throw new ArgumentOutOfRangeException(nameof(newIndex), "newIndex must be greater than 0 and less than or equal to the size of the collection");
|
||
|
|
int[] numArray = null;
|
||
|
|
if (indices.IsReadOnly)
|
||
|
|
numArray = new int[indices.Count];
|
||
|
|
int index1 = 0;
|
||
|
|
foreach (object index2 in indices)
|
||
|
|
{
|
||
|
|
if (!(index2 is int num))
|
||
|
|
throw new ArgumentException("indices[" + index1 + "] does not contain an int", nameof(indices));
|
||
|
|
if (num < 0 || num >= Count)
|
||
|
|
throw new ArgumentOutOfRangeException(nameof(indices), "indices[" + index1 + "] must be greater than 0 and less than the size of the collection");
|
||
|
|
if (numArray != null)
|
||
|
|
numArray[index1] = num;
|
||
|
|
++index1;
|
||
|
|
}
|
||
|
|
if (numArray != null)
|
||
|
|
indices = numArray;
|
||
|
|
int num1 = newIndex;
|
||
|
|
for (int index2 = 0; index2 < indices.Count; ++index2)
|
||
|
|
{
|
||
|
|
int index3 = (int)indices[index2];
|
||
|
|
if (index3 < newIndex)
|
||
|
|
{
|
||
|
|
--newIndex;
|
||
|
|
--num1;
|
||
|
|
}
|
||
|
|
if (index3 != newIndex)
|
||
|
|
{
|
||
|
|
Move(index3, newIndex);
|
||
|
|
for (int index4 = index2 + 1; index4 < indices.Count; ++index4)
|
||
|
|
{
|
||
|
|
int index5 = (int)indices[index4];
|
||
|
|
if (index3 < index5 && index5 <= newIndex)
|
||
|
|
indices[index4] = index5 - 1;
|
||
|
|
else if (newIndex <= index5 && index5 < index3)
|
||
|
|
indices[index4] = index5 + 1;
|
||
|
|
else if (index5 == index3)
|
||
|
|
indices[index4] = newIndex;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
++newIndex;
|
||
|
|
}
|
||
|
|
return num1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Insert(int index, object item)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
_sourceList.Insert(index, item);
|
||
|
|
FireSetChanged(UIListContentsChangeType.Insert, -1, index);
|
||
|
|
FirePropertyChanged("Count");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public int Add(object item)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
int newIndex = _sourceList != null ? _sourceList.Add(item) : throw new ArgumentException("Empty list cannot add items.");
|
||
|
|
FireSetChanged(UIListContentsChangeType.Add, -1, newIndex);
|
||
|
|
FirePropertyChanged("Count");
|
||
|
|
return newIndex;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Sort(IComparer comparer)
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
{
|
||
|
|
if (comparer == null)
|
||
|
|
throw new ArgumentException("Must provide a valid IComparer");
|
||
|
|
SortWorker(comparer);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Sort()
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
SortWorker(null);
|
||
|
|
}
|
||
|
|
|
||
|
|
private void SortWorker(IComparer cmp)
|
||
|
|
{
|
||
|
|
for (int index1 = 0; index1 < Count; ++index1)
|
||
|
|
{
|
||
|
|
for (int index2 = index1 + 1; index2 < Count; ++index2)
|
||
|
|
{
|
||
|
|
if (Compare(this[index1], this[index2], cmp) > 0)
|
||
|
|
Move(index2, index1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private int Compare(object objA, object objB, IComparer cmp)
|
||
|
|
{
|
||
|
|
if (cmp != null)
|
||
|
|
return cmp.Compare(objA, objB);
|
||
|
|
return objA is IComparable comparable ? comparable.CompareTo(objB) : 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
event UIListContentsChangedHandler INotifyList.ContentsChanged
|
||
|
|
{
|
||
|
|
add
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
AddEventHandler(s_listContentsChangedEvent, value);
|
||
|
|
}
|
||
|
|
remove
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
RemoveEventHandler(s_listContentsChangedEvent, value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public event ListContentsChangedHandler ContentsChanged
|
||
|
|
{
|
||
|
|
add
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
AddEventHandler(s_listContentsChangedEvent, ListContentsChangedProxy.Thunk(value));
|
||
|
|
}
|
||
|
|
remove
|
||
|
|
{
|
||
|
|
using (ThreadValidator)
|
||
|
|
RemoveEventHandler(s_listContentsChangedEvent, ListContentsChangedProxy.Thunk(value));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
internal void FireSetChanged(UIListContentsChangeType type, int oldIndex, int newIndex)
|
||
|
|
{
|
||
|
|
UIListContentsChangedHandler eventHandler = (UIListContentsChangedHandler)GetEventHandler(s_listContentsChangedEvent);
|
||
|
|
if (eventHandler != null)
|
||
|
|
{
|
||
|
|
UIListContentsChangedArgs args = new UIListContentsChangedArgs(type, oldIndex, newIndex);
|
||
|
|
eventHandler(this, args);
|
||
|
|
}
|
||
|
|
FirePropertyChanged("ContentsChanged");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|