File: System\Windows\Forms\Design\StandardCommandToolStripMenuItem.cs
Web Access
Project: src\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.ComponentModel.Design;
using System.Drawing;
 
namespace System.Windows.Forms.Design;
 
/// <summary>
///  Associates standard command with ToolStripMenuItem.
/// </summary>
internal class StandardCommandToolStripMenuItem : ToolStripMenuItem
{
    private bool _cachedImage;
    private Image? _image;
    private readonly CommandID _menuID;
    private IMenuCommandService? _menuCommandService;
    private readonly IServiceProvider _serviceProvider;
    private readonly string _name;
    private readonly MenuCommand? _menuCommand;
 
    // Ok to call MenuService.FindCommand to find the menuCommand mapping to the appropriated menuID.
    public StandardCommandToolStripMenuItem(
        CommandID menuID,
        string text,
        string imageName,
        IServiceProvider serviceProvider)
    {
        _menuID = menuID;
        _serviceProvider = serviceProvider;
 
        // Findcommand can throw; so we need to catch and disable the command.
        try
        {
            _menuCommand = MenuService?.FindCommand(menuID);
        }
        catch
        {
            Enabled = false;
        }
 
        Text = text;
        _name = imageName;
 
        RefreshItem();
    }
 
    public void RefreshItem()
    {
        if (_menuCommand is not null)
        {
            Visible = _menuCommand.Visible;
            Enabled = _menuCommand.Enabled;
            Checked = _menuCommand.Checked;
        }
    }
 
    /// <summary>
    ///  Retrieves the menu editor service, which we cache for speed.
    /// </summary>
    public IMenuCommandService? MenuService
    {
        get
        {
            if (_menuCommandService is null && _serviceProvider.TryGetService(out IMenuCommandService? menuCommandService))
            {
                _menuCommandService = menuCommandService;
            }
 
            return _menuCommandService;
        }
    }
 
    public override Image? Image
    {
        // Standard 'catch all - rethrow critical' exception pattern
        get
        {
            // Defer loading the image until we're sure we need it
            if (!_cachedImage)
            {
                _cachedImage = true;
                try
                {
                    if (_name is not null)
                    {
                        _image = new Icon(typeof(ToolStripMenuItem), _name).ToBitmap();
                    }
 
                    ImageTransparentColor = Color.Magenta;
                }
                catch (Exception ex) when (!ex.IsCriticalException())
                {
                }
            }
 
            return _image;
        }
        set
        {
            _image = value;
            _cachedImage = true;
        }
    }
 
    protected override void OnClick(EventArgs e)
    {
        if (_menuCommand is not null)
        {
            _menuCommand.Invoke();
        }
        else if (MenuService is not null)
        {
            if (MenuService.GlobalInvoke(_menuID))
            {
                return;
            }
        }
    }
}