|
// 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 ToolStripButton
{
/// <summary>
/// An implementation of AccessibleChild for use with ToolStripItems
/// </summary>
internal class ToolStripButtonAccessibleObject : ToolStripItemAccessibleObject
{
private readonly ToolStripButton _ownerItem;
public ToolStripButtonAccessibleObject(ToolStripButton ownerItem) : base(ownerItem)
{
_ownerItem = ownerItem;
}
internal override bool IsPatternSupported(UIA_PATTERN_ID patternId) =>
patternId switch
{
UIA_PATTERN_ID.UIA_TogglePatternId => Role == AccessibleRole.CheckButton,
_ => base.IsPatternSupported(patternId)
};
public override AccessibleRole Role
{
get
{
AccessibleRole role = _ownerItem.AccessibleRole;
if (role != AccessibleRole.Default)
{
return role;
}
if (_ownerItem.CheckOnClick || _ownerItem.Checked)
{
return AccessibleRole.CheckButton;
}
return base.Role;
}
}
public override AccessibleStates State
{
get
{
if (_ownerItem.Enabled && _ownerItem.Checked)
{
return base.State | AccessibleStates.Checked;
}
// Disabled ToolStripButton, that is selected, must have focus state so that
// Narrator can announce it
if (!_ownerItem.Enabled && _ownerItem.Selected)
{
return base.State | AccessibleStates.Focused;
}
return base.State;
}
}
#region Toggle Pattern
internal override void Toggle()
{
if (IsPatternSupported(UIA_PATTERN_ID.UIA_TogglePatternId))
{
_ownerItem.Checked = !_ownerItem.Checked;
}
}
internal override ToggleState ToggleState
=> CheckStateToToggleState(_ownerItem.CheckState);
internal void OnCheckStateChanged(CheckState oldValue, CheckState newValue)
{
RaiseAutomationPropertyChangedEvent(
UIA_PROPERTY_ID.UIA_ToggleToggleStatePropertyId,
(VARIANT)(int)CheckStateToToggleState(oldValue),
(VARIANT)(int)CheckStateToToggleState(newValue));
}
private static ToggleState CheckStateToToggleState(CheckState checkState)
=> checkState switch
{
CheckState.Checked => ToggleState.ToggleState_On,
CheckState.Unchecked => ToggleState.ToggleState_Off,
_ => ToggleState.ToggleState_Indeterminate
};
#endregion
}
}
|