Files
Xune/UIX.Skia/Microsoft/Iris/ListDataSet.cs
T
2021-07-12 00:40:39 -05:00

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");
}
}
}