File: System\Windows\Forms\Dialogs\TaskDialog\TaskDialogRadioButtonCollection.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.ObjectModel;
 
namespace System.Windows.Forms;
 
/// <summary>
///   Represents a collection of <see cref="TaskDialogRadioButton"/> objects.
/// </summary>
public class TaskDialogRadioButtonCollection : Collection<TaskDialogRadioButton>
{
    // HashSet to detect duplicate items.
    private readonly HashSet<TaskDialogRadioButton> _itemSet = [];
 
    /// <summary>
    ///   Initializes a new instance of the <see cref="TaskDialogRadioButtonCollection"/> class.
    /// </summary>
    public TaskDialogRadioButtonCollection()
    {
    }
 
    internal TaskDialogPage? BoundPage { get; set; }
 
    /// <summary>
    ///   Creates and adds a <see cref="TaskDialogRadioButton"/> to the collection.
    /// </summary>
    /// <param name="text">The text of the radio button.</param>
    /// <returns>The created <see cref="TaskDialogRadioButton"/>.</returns>
    /// <exception cref="InvalidOperationException">
    ///   This collection is currently bound to a task dialog.
    /// </exception>
    public TaskDialogRadioButton Add(string? text)
    {
        TaskDialogRadioButton button = new()
        {
            Text = text
        };
 
        Add(button);
        return button;
    }
 
    /// <inheritdoc/>
    /// <exception cref="ArgumentNullException">
    ///   <paramref name="item"/> is <see langword="null"/>.
    /// </exception>
    /// <exception cref="ArgumentException">
    ///   <paramref name="item"/> has already been added to the collection.
    /// </exception>
    /// <exception cref="InvalidOperationException">
    ///   <paramref name="item"/> is already a part of a different collection.
    ///   - or -
    ///   This collection is currently bound to a task dialog.
    /// </exception>
    protected override void SetItem(int index, TaskDialogRadioButton item)
    {
        ArgumentNullException.ThrowIfNull(item);
 
        // Disallow collection modification, so that we don't need to copy it
        // when binding the TaskDialogPage.
        BoundPage?.DenyIfBound();
        DenyIfHasOtherCollection(item);
 
        TaskDialogRadioButton oldItem = this[index];
        if (oldItem != item)
        {
            // First, add the new item (which will throw if it is a duplicate entry),
            // then remove the old one.
            if (!_itemSet.Add(item))
            {
                throw new ArgumentException(SR.TaskDialogControlAlreadyAddedToCollection);
            }
 
            _itemSet.Remove(oldItem);
 
            oldItem.Collection = null;
            item.Collection = this;
        }
 
        base.SetItem(index, item);
    }
 
    /// <inheritdoc/>
    /// <exception cref="ArgumentNullException">
    ///   <paramref name="item"/> is <see langword="null"/>.
    /// </exception>
    /// <exception cref="ArgumentException">
    ///   <paramref name="item"/> has already been added to the collection.
    /// </exception>
    /// <exception cref="InvalidOperationException">
    ///   <paramref name="item"/> is already a part of a different collection.
    ///   - or -
    ///   This collection is currently bound to a task dialog.
    /// </exception>
    protected override void InsertItem(int index, TaskDialogRadioButton item)
    {
        ArgumentNullException.ThrowIfNull(item);
 
        // Disallow collection modification, so that we don't need to copy it
        // when binding the TaskDialogPage.
        BoundPage?.DenyIfBound();
        DenyIfHasOtherCollection(item);
 
        if (!_itemSet.Add(item))
        {
            throw new ArgumentException(SR.TaskDialogControlAlreadyAddedToCollection);
        }
 
        item.Collection = this;
        base.InsertItem(index, item);
    }
 
    /// <inheritdoc/>
    /// <exception cref="InvalidOperationException">
    ///   This collection is currently bound to a task dialog.
    /// </exception>
    protected override void RemoveItem(int index)
    {
        // Disallow collection modification, so that we don't need to copy it
        // when binding the TaskDialogPage.
        BoundPage?.DenyIfBound();
 
        TaskDialogRadioButton oldItem = this[index];
        oldItem.Collection = null;
        _itemSet.Remove(oldItem);
        base.RemoveItem(index);
    }
 
    /// <inheritdoc/>
    /// <exception cref="InvalidOperationException">
    ///   This collection is currently bound to a task dialog.
    /// </exception>
    protected override void ClearItems()
    {
        // Disallow collection modification, so that we don't need to copy it
        // when binding the TaskDialogPage.
        BoundPage?.DenyIfBound();
 
        foreach (TaskDialogRadioButton button in this)
        {
            button.Collection = null;
        }
 
        _itemSet.Clear();
        base.ClearItems();
    }
 
    private void DenyIfHasOtherCollection(TaskDialogRadioButton item)
    {
        if (item.Collection is not null && item.Collection != this)
        {
            throw new InvalidOperationException(SR.TaskDialogControlIsPartOfOtherCollection);
        }
    }
}