// 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 ErrorProvider { internal partial class ErrorWindow { private class ErrorWindowAccessibleObject : AccessibleObject { private readonly ErrorWindow _owner; public ErrorWindowAccessibleObject(ErrorWindow owner) { _owner = 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(GetChildCount() - 1), _ => base.FragmentNavigate(direction), }; internal override IRawElementProviderFragmentRoot.Interface FragmentRoot => this; public override AccessibleObject? GetChild(int index) { if (index >= 0 && index <= GetChildCount() - 1) { return _owner.ControlItems[index].AccessibilityObject; } return base.GetChild(index); } private protected override bool IsInternal => true; public override int GetChildCount() => _owner.ControlItems.Count; internal override VARIANT GetPropertyValue(UIA_PROPERTY_ID propertyID) => propertyID switch { UIA_PROPERTY_ID.UIA_ControlTypePropertyId => (VARIANT)(int)UIA_CONTROLTYPE_ID.UIA_GroupControlTypeId, UIA_PROPERTY_ID.UIA_NativeWindowHandlePropertyId => UIAHelper.WindowHandleToVariant(_owner.Handle), _ => base.GetPropertyValue(propertyID) }; public override AccessibleObject? HitTest(int x, int y) { foreach (ControlItem control in _owner.ControlItems) { if (control.AccessibilityObject.Bounds.Contains(x, y)) { return control.AccessibilityObject; } } return null; } internal override unsafe IRawElementProviderSimple* HostRawElementProvider { get { PInvoke.UiaHostProviderFromHwnd(new HandleRef<HWND>(this, _owner.HWND), out IRawElementProviderSimple* provider); return provider; } } internal override bool IsIAccessibleExSupported() => true; internal override bool IsPatternSupported(UIA_PATTERN_ID patternId) { if (patternId == UIA_PATTERN_ID.UIA_LegacyIAccessiblePatternId) { return true; } return base.IsPatternSupported(patternId); } internal override bool IsReadOnly => true; [AllowNull] public override string Name { get { string? name = base.Name; return string.IsNullOrEmpty(name) ? SR.ErrorProviderDefaultAccessibleName : name; } } internal override bool CanGetNameInternal => false; public override AccessibleRole Role => AccessibleRole.Grouping; internal override int[] RuntimeId => [ RuntimeIDFirstItem, (int)_owner.Handle, _owner.GetHashCode() ]; public override AccessibleStates State => AccessibleStates.ReadOnly; } } } |