File: System\Windows\Forms\ToolTip\KeyboardToolTipStateMachine.ToolToTipDictionary.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.Runtime.CompilerServices;
 
namespace System.Windows.Forms;
 
internal sealed partial class KeyboardToolTipStateMachine
{
    private sealed class ToolToTipDictionary
    {
        private readonly ConditionalWeakTable<IKeyboardToolTip, WeakReference<ToolTip?>> _table = [];
 
        public ToolTip? this[IKeyboardToolTip tool]
        {
            get
            {
                ToolTip? toolTip = null;
                if (_table.TryGetValue(tool, out WeakReference<ToolTip?>? toolTipReference))
                {
                    if (!toolTipReference.TryGetTarget(out toolTip))
                    {
                        // removing dead reference
                        _table.Remove(tool);
                    }
                }
 
                return toolTip;
            }
            set
            {
                if (_table.TryGetValue(tool, out WeakReference<ToolTip?>? toolTipReference))
                {
                    toolTipReference.SetTarget(value);
                }
                else
                {
                    _table.Add(tool, new WeakReference<ToolTip?>(value));
                }
            }
        }
 
        public void Remove(IKeyboardToolTip tool, ToolTip toolTip)
        {
            if (_table.TryGetValue(tool, out WeakReference<ToolTip?>? toolTipReference))
            {
                if (toolTipReference.TryGetTarget(out ToolTip? existingToolTip))
                {
                    if (existingToolTip == toolTip)
                    {
                        _table.Remove(tool);
                    }
                }
                else
                {
                    // removing dead reference
                    _table.Remove(tool);
                }
            }
        }
    }
}