| File: System\ComponentModel\Design\DesignSurfaceCollection.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections; namespace System.ComponentModel.Design; /// <summary> /// Provides a read-only collection of design surfaces. /// </summary> public sealed class DesignSurfaceCollection : ICollection { private readonly DesignerCollection _designers; /// <summary> /// Initializes a new instance of the DesignSurfaceCollection class /// </summary> internal DesignSurfaceCollection(DesignerCollection? designers) { _designers = designers ?? new DesignerCollection(null); } /// <summary> /// Gets number of design surfaces in the collection. /// </summary> public int Count => _designers.Count; /// <summary> /// Gets or sets the document at the specified index. /// </summary> public DesignSurface this[int index] { get { IDesignerHost host = _designers[index]!; if (host.GetService(typeof(DesignSurface)) is DesignSurface surface) { return surface; } throw new NotSupportedException(); } } /// <summary> /// Creates and retrieves a new enumerator for this collection. /// </summary> public IEnumerator GetEnumerator() => new DesignSurfaceEnumerator(_designers.GetEnumerator()); int ICollection.Count => Count; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => null!; void ICollection.CopyTo(Array array, int index) { foreach (DesignSurface surface in this) { array.SetValue(surface, index++); } } public void CopyTo(DesignSurface[] array, int index) => ((ICollection)this).CopyTo(array, index); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); /// <summary> /// Enumerator that performs the conversion from designer host /// to design surface. /// </summary> private class DesignSurfaceEnumerator : IEnumerator { private readonly IEnumerator _designerEnumerator; internal DesignSurfaceEnumerator(IEnumerator designerEnumerator) { _designerEnumerator = designerEnumerator; } public object Current { get { IDesignerHost host = (IDesignerHost)_designerEnumerator.Current!; if (host.GetService(typeof(DesignSurface)) is DesignSurface surface) { return surface; } throw new NotSupportedException(); } } public bool MoveNext() => _designerEnumerator.MoveNext(); public void Reset() => _designerEnumerator.Reset(); } }