File: System\Windows\Forms\Panels\TableLayoutPanel\TableLayoutStyleCollection.cs
Web Access
Project: src\src\System.Windows.Forms\src\System.Windows.Forms.csproj (System.Windows.Forms)
// 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;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms.Layout;
 
namespace System.Windows.Forms;
 
[Editor($"System.Windows.Forms.Design.StyleCollectionEditor, {AssemblyRef.SystemDesign}", typeof(UITypeEditor))]
public abstract class TableLayoutStyleCollection : IList
{
    private IArrangedElement? _owner;
    private readonly List<TableLayoutStyle> _innerList = [];
 
    internal TableLayoutStyleCollection(IArrangedElement? owner)
    {
        _owner = owner;
    }
 
    internal IArrangedElement? Owner => _owner;
 
    internal virtual string? PropertyName => null;
 
    int IList.Add(object? style) => Add((TableLayoutStyle)style!);
 
    public int Add(TableLayoutStyle style)
    {
        ArgumentNullException.ThrowIfNull(style);
        if (style is not TableLayoutStyle tableLayoutStyle)
        {
            throw new ArgumentException(string.Format(SR.InvalidArgumentType, nameof(style), typeof(TableLayoutStyle)), nameof(style));
        }
 
        EnsureNotOwned(tableLayoutStyle);
        tableLayoutStyle.Owner = Owner;
        int index = ((IList)_innerList).Add(tableLayoutStyle);
        PerformLayoutIfOwned();
        return index;
    }
 
    void IList.Insert(int index, object? style)
    {
        ArgumentNullException.ThrowIfNull(style);
        if (style is not TableLayoutStyle tableLayoutStyle)
        {
            throw new ArgumentException(string.Format(SR.InvalidArgumentType, nameof(style), typeof(TableLayoutStyle)), nameof(style));
        }
 
        EnsureNotOwned(tableLayoutStyle);
        tableLayoutStyle.Owner = Owner;
        _innerList.Insert(index, tableLayoutStyle);
        PerformLayoutIfOwned();
    }
 
    object? IList.this[int index]
    {
        get => _innerList[index];
        set
        {
            ArgumentNullException.ThrowIfNull(value);
            if (value is not TableLayoutStyle tableLayoutStyle)
            {
                throw new ArgumentException(string.Format(SR.InvalidArgumentType, nameof(value), typeof(TableLayoutStyle)), nameof(value));
            }
 
            EnsureNotOwned(tableLayoutStyle);
            tableLayoutStyle.Owner = Owner;
            _innerList[index] = tableLayoutStyle;
            PerformLayoutIfOwned();
        }
    }
 
    public TableLayoutStyle this[int index]
    {
        get => (TableLayoutStyle)((IList)this)[index]!;
        set => ((IList)this)[index] = value;
    }
 
    void IList.Remove(object? style)
    {
        if (style is null)
        {
            return;
        }
 
        if (style is not TableLayoutStyle tableLayoutStyle)
        {
            throw new ArgumentException(string.Format(SR.InvalidArgumentType, nameof(style), typeof(TableLayoutStyle)), nameof(style));
        }
 
        if (!_innerList.Remove(tableLayoutStyle))
        {
            return;
        }
 
        tableLayoutStyle.Owner = null;
        PerformLayoutIfOwned();
    }
 
    public void Clear()
    {
        foreach (TableLayoutStyle style in _innerList)
        {
            style.Owner = null;
        }
 
        _innerList.Clear();
        PerformLayoutIfOwned();
    }
 
    public void RemoveAt(int index)
    {
        TableLayoutStyle style = _innerList[index];
        style.Owner = null;
        _innerList.RemoveAt(index);
        PerformLayoutIfOwned();
    }
 
    bool IList.Contains(object? style) => ((IList)_innerList).Contains(style);
 
    int IList.IndexOf(object? style) => ((IList)_innerList).IndexOf(style);
 
    bool IList.IsFixedSize => ((IList)_innerList).IsFixedSize;
 
    bool IList.IsReadOnly => ((IList)_innerList).IsReadOnly;
 
    void ICollection.CopyTo(Array array, int startIndex) => ((ICollection)_innerList).CopyTo(array, startIndex);
 
    public int Count => _innerList.Count;
 
    bool ICollection.IsSynchronized => ((ICollection)_innerList).IsSynchronized;
 
    object ICollection.SyncRoot => ((ICollection)_innerList).SyncRoot;
 
    IEnumerator IEnumerable.GetEnumerator() => _innerList.GetEnumerator();
 
    private static void EnsureNotOwned(TableLayoutStyle style)
    {
        if (style.Owner is not null)
        {
            throw new ArgumentException(string.Format(SR.OnlyOneControl, style.GetType().Name), nameof(style));
        }
    }
 
    internal void EnsureOwnership(IArrangedElement owner)
    {
        _owner = owner;
        for (int i = 0; i < Count; i++)
        {
            this[i].Owner = owner;
        }
    }
 
    private void PerformLayoutIfOwned()
    {
        if (Owner is not null)
        {
            LayoutTransaction.DoLayout(Owner, Owner, PropertyName);
        }
    }
}