File: System\Windows\Forms\Design\CommandSet.CommandSetItem.StatusState.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.
 
namespace System.Windows.Forms.Design;
 
internal partial class CommandSet
{
    protected partial class CommandSetItem
    {
        /// <summary>
        /// This class saves the state for a given command. It keeps track of the results
        /// of the last status handler invocation and what "selection version" that happened on.
        /// </summary>
        private class StatusState
        {
            // these are the command's possible values.
            //
            [Flags]
            private enum StatusFlag
            {
                Enabled = 0x01,
                Visible = 0x02,
                Checked = 0x04,
                Supported = 0x08,
                NeedsUpdate = 0x10
            }
 
            private StatusFlag _statusFlags = StatusFlag.NeedsUpdate; // our flags.
 
            // Multiple CommandSetItem instances can share a same status handler within a designer host.
            // We use a simple ref count to make sure the CommandSetItem can be properly removed.
            internal int _refCount;
 
            /// <summary>
            /// Just what it says...
            /// </summary>
            public int SelectionVersion { get; private set; }
 
            /// <summary>
            /// Pushes the state stored in this object into the given command item.
            /// </summary>
            internal void ApplyState(CommandSetItem item)
            {
                Debug.Assert(!_statusFlags.HasFlag(StatusFlag.NeedsUpdate), "Updating item when StatusState is not valid.");
 
                item.Enabled = _statusFlags.HasFlag(StatusFlag.Enabled);
                item.Visible = _statusFlags.HasFlag(StatusFlag.Visible);
                item.Checked = _statusFlags.HasFlag(StatusFlag.Checked);
                item.Supported = _statusFlags.HasFlag(StatusFlag.Supported);
            }
 
            /// <summary>
            /// Updates this status object with the state from the given item,
            /// and saves the selection version.
            /// </summary>
            internal void SaveState(CommandSetItem item, int version)
            {
                SelectionVersion = version;
                _statusFlags = 0;
                if (item.Enabled)
                {
                    _statusFlags |= StatusFlag.Enabled;
                }
 
                if (item.Visible)
                {
                    _statusFlags |= StatusFlag.Visible;
                }
 
                if (item.Checked)
                {
                    _statusFlags |= StatusFlag.Checked;
                }
 
                if (item.Supported)
                {
                    _statusFlags |= StatusFlag.Supported;
                }
            }
        }
    }
}