|
// 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 ToolStripSplitButton
{
internal class ToolStripSplitButtonExAccessibleObject : ToolStripSplitButtonAccessibleObject
{
private readonly ToolStripSplitButton _owningToolStripSplitButton;
public ToolStripSplitButtonExAccessibleObject(ToolStripSplitButton item)
: base(item)
{
_owningToolStripSplitButton = item;
}
internal override VARIANT GetPropertyValue(UIA_PROPERTY_ID propertyID) =>
propertyID switch
{
// If we don't set a default role for the accessible object
// it will be retrieved from Windows.
// And we don't have a 100% guarantee it will be correct, hence set it ourselves.
UIA_PROPERTY_ID.UIA_ControlTypePropertyId when
_owningToolStripSplitButton.AccessibleRole == AccessibleRole.Default
=> (VARIANT)(int)UIA_CONTROLTYPE_ID.UIA_ButtonControlTypeId,
_ => base.GetPropertyValue(propertyID)
};
internal override bool IsIAccessibleExSupported()
{
if (_owningToolStripSplitButton is not null)
{
return true;
}
else
{
return base.IsIAccessibleExSupported();
}
}
internal override bool IsPatternSupported(UIA_PATTERN_ID patternId)
{
if (patternId == UIA_PATTERN_ID.UIA_ExpandCollapsePatternId && _owningToolStripSplitButton.HasDropDownItems)
{
return true;
}
else
{
return base.IsPatternSupported(patternId);
}
}
internal override void Expand()
{
DoDefaultAction();
}
internal override void Collapse()
{
if (_owningToolStripSplitButton is not null && _owningToolStripSplitButton.DropDown is not null && _owningToolStripSplitButton.DropDown.Visible)
{
_owningToolStripSplitButton.DropDown.Close();
}
}
internal override ExpandCollapseState ExpandCollapseState
{
get
{
return _owningToolStripSplitButton.DropDown.Visible ? ExpandCollapseState.ExpandCollapseState_Expanded : ExpandCollapseState.ExpandCollapseState_Collapsed;
}
}
internal override IRawElementProviderFragment.Interface? FragmentNavigate(NavigateDirection direction)
=> direction switch
{
NavigateDirection.NavigateDirection_FirstChild => DropDownItemsCount > 0 ? _owningToolStripSplitButton.DropDown.Items[0].AccessibilityObject : null,
NavigateDirection.NavigateDirection_LastChild => DropDownItemsCount > 0 ? _owningToolStripSplitButton.DropDown.Items[_owningToolStripSplitButton.DropDown.Items.Count - 1].AccessibilityObject : null,
_ => base.FragmentNavigate(direction),
};
private int DropDownItemsCount
{
get
{
// Do not expose child items when the drop-down is collapsed to prevent Narrator from announcing
// invisible menu items when Narrator is in item's mode (CAPSLOCK + Arrow Left/Right) or
// in scan mode (CAPSLOCK + Space)
if (ExpandCollapseState == ExpandCollapseState.ExpandCollapseState_Collapsed)
{
return 0;
}
return _owningToolStripSplitButton.DropDownItems.Count;
}
}
}
}
|