File: System\Windows\Forms\Input\MouseHoverTimer.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.
 
namespace System.Windows.Forms;
 
internal class MouseHoverTimer : IDisposable
{
    private readonly Timer _mouseHoverTimer = new();
    private readonly WeakReference<ToolStripItem?> _currentItem = new(null);
 
    public MouseHoverTimer()
    {
        _mouseHoverTimer.Interval = SystemInformation.MouseHoverTime;
        _mouseHoverTimer.Tick += OnTick;
    }
 
    public void Start(ToolStripItem? item)
    {
        _currentItem.TryGetTarget(out var currentItem);
        if (item != currentItem)
        {
            Cancel();
            _currentItem.SetTarget(item);
        }
 
        if (item is not null)
        {
            _mouseHoverTimer.Enabled = true;
        }
    }
 
    /// <summary>
    /// Cancels if and only if this <paramref name="item"/> was the one that requested the timer.
    /// </summary>
    public void Cancel(ToolStripItem? item)
    {
        _currentItem.TryGetTarget(out var currentItem);
        if (item == currentItem)
        {
            Cancel();
        }
    }
 
    public void Dispose()
    {
        Cancel();
        _mouseHoverTimer.Dispose();
    }
 
    private void Cancel()
    {
        _mouseHoverTimer.Enabled = false;
        _currentItem.SetTarget(null);
    }
 
    private void OnTick(object? sender, EventArgs e)
    {
        _mouseHoverTimer.Enabled = false;
        if (_currentItem.TryGetTarget(out var currentItem) && !currentItem.IsDisposed)
        {
            currentItem.FireEvent(EventArgs.Empty, ToolStripItemEventType.MouseHover);
        }
    }
}