// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing; using Windows.Win32.UI.Accessibility; namespace System.Windows.Forms; public partial class ListViewItem { internal abstract class ListViewItemWithImageAccessibleObject : ListViewItemBaseAccessibleObject { private const int ImageAccessibleObjectIndex = 0; private ListViewItemImageAccessibleObject? _imageAccessibleObject; private ListViewLabelEditAccessibleObject? _labelEditAccessibleObject; public ListViewItemWithImageAccessibleObject(ListViewItem owningItem) : base(owningItem) { } internal override int FirstSubItemIndex => HasImage ? 1 : 0; private ListViewItemImageAccessibleObject ImageAccessibleObject => _imageAccessibleObject ??= new(_owningItem); private ListViewLabelEditAccessibleObject? LabelEditAccessibleObject => _labelEditAccessibleObject ??= _owningListView._labelEdit is null ? null : new(_owningListView, _owningListView._labelEdit); internal override IRawElementProviderFragment.Interface? FragmentNavigate(NavigateDirection direction) => direction switch { NavigateDirection.NavigateDirection_FirstChild => GetChildCount() > 0 ? GetChild(0) : null, NavigateDirection.NavigateDirection_LastChild => GetChildCount() > 0 ? GetChild(GetChildCount() - 1) : null, _ => base.FragmentNavigate(direction), }; internal AccessibleObject GetAccessibleObject(Point point) { return HasImage && ImageAccessibleObject.GetImageRectangle().Contains(point) ? ImageAccessibleObject : this; } public override AccessibleObject? GetChild(int index) { if (_owningListView.View != View) { throw new InvalidOperationException(string.Format(SR.ListViewItemAccessibilityObjectInvalidViewException, View.ToString())); } if (index == ImageAccessibleObjectIndex && HasImage) { return ImageAccessibleObject; } if (index >= ImageAccessibleObjectIndex || !HasImage) { return LabelEditAccessibleObject; } return null; } public override int GetChildCount() { if (_owningListView.View != View) { throw new InvalidOperationException(string.Format(SR.ListViewItemAccessibilityObjectInvalidViewException, View.ToString())); } if (!_owningListView.IsHandleCreated) { return InvalidIndex; } int _childCount = 0; if (HasImage) { _childCount++; } if (_owningListView._labelEdit is not null && _owningListView._listViewSubItem is null) { _childCount++; } return _childCount > 0 ? _childCount : InvalidIndex; } internal override int GetChildIndex(AccessibleObject? child) => child is ListViewItemImageAccessibleObject ? ImageAccessibleObjectIndex : InvalidIndex; internal override Rectangle GetSubItemBounds(int accessibleChildIndex) => _owningListView.IsHandleCreated && accessibleChildIndex == ImageAccessibleObjectIndex && HasImage ? ImageAccessibleObject.Bounds : Rectangle.Empty; /// <devdoc> /// Caller should ensure that the current OS is Windows 8 or greater. /// </devdoc> internal override void ReleaseChildUiaProviders() { base.ReleaseChildUiaProviders(); PInvoke.UiaDisconnectProvider(_imageAccessibleObject, skipOSCheck: true); } } }