// 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; } } |