File: System\Windows\Forms\Controls\PropertyGrid\PropertyGridToolStripButton.PropertyGridToolStripButtonAccessibleObject.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 Windows.Win32.UI.Accessibility;
 
namespace System.Windows.Forms;
 
internal partial class PropertyGridToolStripButton
{
    internal class PropertyGridToolStripButtonAccessibleObject : ToolStripButtonAccessibleObject
    {
        private readonly PropertyGrid? _owningPropertyGrid;
        private readonly PropertyGridToolStripButton _owningPropertyGridToolStripButton;
 
        public PropertyGridToolStripButtonAccessibleObject(PropertyGridToolStripButton owningToolStripButton) : base(owningToolStripButton)
        {
            _owningPropertyGridToolStripButton = owningToolStripButton;
            _owningPropertyGrid = owningToolStripButton._owningPropertyGrid;
        }
 
        internal override bool IsItemSelected
            => _owningPropertyGridToolStripButton.Checked;
 
        internal override bool IsPatternSupported(UIA_PATTERN_ID patternId)
            => patternId switch
            {
                UIA_PATTERN_ID.UIA_SelectionItemPatternId => _owningPropertyGridToolStripButton._selectItemEnabled,
                UIA_PATTERN_ID.UIA_TogglePatternId => false,
                _ => base.IsPatternSupported(patternId)
            };
 
        internal override void AddToSelection() => SelectItem();
 
        internal override void Invoke() => SelectItem();
 
        internal override void RemoveFromSelection()
        {
        }
 
        internal override unsafe void SelectItem()
        {
            if (_owningPropertyGrid is null || !_owningPropertyGrid.IsHandleCreated)
            {
                return;
            }
 
            bool initialState = _owningPropertyGridToolStripButton.Checked;
            _owningPropertyGridToolStripButton.PerformClick();
 
            // This code is required to simulate the behavior in 4.7.1. When we call "Toggle" method on an already
            // checked button, the focus switches to the ToolStrip. If the button was not checked before the call,
            // then the focus is switched to the table with properties.
            AccessibleObject? focusedAccessibleObject = initialState
                ? _owningPropertyGridToolStripButton.Parent?.AccessibilityObject
                : _owningPropertyGridToolStripButton._owningPropertyGrid.GridViewAccessibleObject.GetFocused();
 
            focusedAccessibleObject?.RaiseAutomationEvent(UIA_EVENT_ID.UIA_AutomationFocusChangedEventId);
        }
    }
}