From e6d5186c8acbf37b877c7ca3c77a378352a3743d Mon Sep 17 00:00:00 2001 From: kingces95 Date: Tue, 7 Mar 2017 14:56:24 -0500 Subject: Remove InternalsVisibleTo from Core to XF.Platforms.* (#782) * Remove InternalsVisibleTo from Core to XF.Platforms.* * Changes per Jason's code review * Move LockableObservableListWrapper to internals namespace * Changes per Stephane's code review * update docs * Touch code to get CI to run tests * Rebase; Update documentation --- .../LockableObservableListWrapper.cs | 131 +++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Xamarin.Forms.Core/LockableObservableListWrapper.cs (limited to 'Xamarin.Forms.Core/LockableObservableListWrapper.cs') diff --git a/Xamarin.Forms.Core/LockableObservableListWrapper.cs b/Xamarin.Forms.Core/LockableObservableListWrapper.cs new file mode 100644 index 00000000..6bfdb39a --- /dev/null +++ b/Xamarin.Forms.Core/LockableObservableListWrapper.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using Xamarin.Forms.Internals; +using Xamarin.Forms.Platform; + +namespace Xamarin.Forms.Internals +{ + public class LockableObservableListWrapper : IList, ICollection, INotifyCollectionChanged, INotifyPropertyChanged, IReadOnlyList, IReadOnlyCollection, IEnumerable, IEnumerable + { + public readonly ObservableCollection _list = new ObservableCollection(); + + event NotifyCollectionChangedEventHandler INotifyCollectionChanged.CollectionChanged + { + add { ((INotifyCollectionChanged)_list).CollectionChanged += value; } + remove { ((INotifyCollectionChanged)_list).CollectionChanged -= value; } + } + + event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged { + add { ((INotifyPropertyChanged)_list).PropertyChanged += value; } + remove { ((INotifyPropertyChanged)_list).PropertyChanged -= value; } + } + + public bool IsLocked { get; set; } + + void ThrowOnLocked() + { + if (IsLocked) + throw new InvalidOperationException("The Items list can not be manipulated if the ItemsSource property is set"); + } + + public string this [int index] { + get { return _list [index]; } + set { + ThrowOnLocked(); + _list [index] = value; } + } + + public int Count { + get { return _list.Count; } + } + + public bool IsReadOnly { + get { return ((IList)_list).IsReadOnly; } + } + + public void InternalAdd(string item) + { + _list.Add(item); + } + + public void Add(string item) + { + ThrowOnLocked(); + InternalAdd(item); + } + + public void InternalClear() + { + _list.Clear(); + } + + public void Clear() + { + ThrowOnLocked(); + InternalClear(); + } + + public bool Contains(string item) + { + return _list.Contains(item); + } + + public void CopyTo(string [] array, int arrayIndex) + { + _list.CopyTo(array, arrayIndex); + } + + public IEnumerator GetEnumerator() + { + return _list.GetEnumerator(); + } + + public int IndexOf(string item) + { + return _list.IndexOf(item); + } + + public void InternalInsert(int index, string item) + { + _list.Insert(index, item); + } + + public void Insert(int index, string item) + { + ThrowOnLocked(); + InternalInsert(index, item); + } + + public bool InternalRemove(string item) + { + return _list.Remove(item); + } + + public bool Remove(string item) + { + ThrowOnLocked(); + return InternalRemove(item); + } + + public void InternalRemoveAt(int index) + { + _list.RemoveAt(index); + } + + public void RemoveAt(int index) + { + ThrowOnLocked(); + InternalRemoveAt(index); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)_list).GetEnumerator(); + } + } +} \ No newline at end of file -- cgit v1.2.3