File: System\Windows\Forms\Controls\ListBoxes\CheckedListBox.CheckedListBoxItemAccessibleObject.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.System.Variant;
using Windows.Win32.UI.Accessibility;
 
namespace System.Windows.Forms;
 
public partial class CheckedListBox
{
    internal sealed class CheckedListBoxItemAccessibleObject : ListBoxItemAccessibleObject
    {
        private readonly CheckedListBox _owningCheckedListBox;
 
        public CheckedListBoxItemAccessibleObject(CheckedListBox owningCheckedListBox, ItemArray.Entry item, CheckedListBoxAccessibleObject owningAccessibleObject) : base(owningCheckedListBox, item, owningAccessibleObject)
        {
            _owningCheckedListBox = owningCheckedListBox;
        }
 
        public override string DefaultAction
        {
            get
            {
                if (!_owningCheckedListBox.IsHandleCreated)
                {
                    return string.Empty;
                }
 
                return IsItemChecked ? SR.AccessibleActionUncheck : SR.AccessibleActionCheck;
            }
        }
 
        internal override bool CanGetDefaultActionInternal => false;
 
        public override void DoDefaultAction()
        {
            if (!_owningCheckedListBox.IsHandleCreated)
            {
                return;
            }
 
            _owningCheckedListBox.SetItemChecked(CurrentIndex, !IsItemChecked);
        }
 
        internal override VARIANT GetPropertyValue(UIA_PROPERTY_ID propertyID)
            => propertyID switch
            {
                UIA_PROPERTY_ID.UIA_ControlTypePropertyId => (VARIANT)(int)UIA_CONTROLTYPE_ID.UIA_CheckBoxControlTypeId,
                _ => base.GetPropertyValue(propertyID)
            };
 
        private bool IsItemChecked => _owningCheckedListBox.GetItemChecked(CurrentIndex);
 
        internal override bool IsPatternSupported(UIA_PATTERN_ID patternId)
            => patternId switch
            {
                UIA_PATTERN_ID.UIA_InvokePatternId => true,
                UIA_PATTERN_ID.UIA_TogglePatternId => true,
                UIA_PATTERN_ID.UIA_ValuePatternId => true,
                _ => base.IsPatternSupported(patternId)
            };
 
        public override AccessibleRole Role => AccessibleRole.CheckButton;
 
        public override AccessibleStates State
        {
            get
            {
                if (!_owningCheckedListBox.IsHandleCreated)
                {
                    return AccessibleStates.None;
                }
 
                AccessibleStates state = AccessibleStates.Selectable | AccessibleStates.Focusable;
 
                if (!Parent.BoundingRectangle.IntersectsWith(Bounds))
                {
                    state |= AccessibleStates.Offscreen;
                }
 
                // Checked state
                switch (_owningCheckedListBox.GetItemCheckState(CurrentIndex))
                {
                    case CheckState.Checked:
                        state |= AccessibleStates.Checked;
                        break;
                    case CheckState.Indeterminate:
                        state |= AccessibleStates.Indeterminate;
                        break;
                    case CheckState.Unchecked:
                        // No accessible state corresponding to unchecked
                        break;
                }
 
                // Selected state
                if (_owningCheckedListBox.SelectedIndex == CurrentIndex)
                {
                    state |= AccessibleStates.Selected | AccessibleStates.Focused;
                }
 
                if (_owningCheckedListBox.Focused && _owningCheckedListBox.SelectedIndex == -1)
                {
                    state |= AccessibleStates.Focused;
                }
 
                return state;
            }
        }
 
        internal override void Toggle() => DoDefaultAction();
 
        internal override ToggleState ToggleState
        {
            get
            {
                ToggleState toggleState = ToggleState.ToggleState_Off;
                switch (_owningCheckedListBox.GetItemCheckState(CurrentIndex))
                {
                    case CheckState.Checked:
                        toggleState = ToggleState.ToggleState_On;
                        break;
                    case CheckState.Indeterminate:
                        toggleState = ToggleState.ToggleState_Indeterminate;
                        break;
                }
 
                return toggleState;
            }
        }
 
        public override string Value => IsItemChecked.ToString();
 
        internal override bool CanGetValueInternal => false;
    }
}