File: Primitives\LockableObservableListWrapper.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
#nullable enable
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
 
namespace Microsoft.Maui
{
	[EditorBrowsable(EditorBrowsableState.Never)]
	public class LockableObservableListWrapper : IList<string>, ICollection<string>, INotifyCollectionChanged, INotifyPropertyChanged, IReadOnlyList<string>, IReadOnlyCollection<string>, IEnumerable<string>, IEnumerable
	{
		public readonly ObservableCollection<string> _list = new ObservableCollection<string>();
 
		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 cannot 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<string>)_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<string> 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();
		}
	}
}