// 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; public abstract partial class UpDownBase { internal partial class UpDownButtons { internal sealed partial class UpDownButtonsAccessibleObject : ControlAccessibleObject { private int[]? _runtimeId; private DirectionButtonAccessibleObject? _upButton; private DirectionButtonAccessibleObject? _downButton; public UpDownButtonsAccessibleObject(UpDownButtons owner) : base(owner) { } internal override IRawElementProviderFragment.Interface? ElementProviderFromPoint(double x, double y) { AccessibleObject? element = HitTest((int)x, (int)y); if (element is not null) { return element; } return base.ElementProviderFromPoint(x, y); } internal override IRawElementProviderFragment.Interface? FragmentNavigate(NavigateDirection direction) => direction switch { NavigateDirection.NavigateDirection_FirstChild => GetChild(0), NavigateDirection.NavigateDirection_LastChild => GetChild(1), _ => base.FragmentNavigate(direction), }; internal override IRawElementProviderFragmentRoot.Interface FragmentRoot => this; private DirectionButtonAccessibleObject UpButton => _upButton ??= new DirectionButtonAccessibleObject(this, true); private DirectionButtonAccessibleObject DownButton => _downButton ??= new DirectionButtonAccessibleObject(this, false); public override AccessibleObject? GetChild(int index) => index switch { 0 => UpButton, 1 => DownButton, _ => null, }; public override int GetChildCount() => 2; public override AccessibleObject? HitTest(int x, int y) { if (UpButton.Bounds.Contains(x, y)) { return UpButton; } if (DownButton.Bounds.Contains(x, y)) { return DownButton; } return null; } [AllowNull] public override string Name { get { string? baseName = base.Name; return string.IsNullOrEmpty(baseName) ? SR.DefaultUpDownButtonsAccessibleName : baseName; } } public override AccessibleObject? Parent => this.TryGetOwnerAs(out UpDownButtons? owner) ? owner.AccessibilityObject : null; private protected override bool IsInternal => true; internal void ReleaseChildUiaProviders() { PInvoke.UiaDisconnectProvider(_upButton, skipOSCheck: true); _upButton = null; PInvoke.UiaDisconnectProvider(_downButton, skipOSCheck: true); _downButton = null; } public override AccessibleRole Role => this.GetOwnerAccessibleRole(AccessibleRole.SpinButton); internal override int[] RuntimeId => _runtimeId ??= base.RuntimeId; } } } |