File: System\Windows\Forms\Controls\ListView\ListViewLabelEditAccessibleObject.cs
Web Access
Project: src\src\System.Windows.Forms\src\System.Windows.Forms.csproj (System.Windows.Forms)
// 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;
using static System.Windows.Forms.ListViewItem.ListViewSubItem;
 
namespace System.Windows.Forms;
 
internal sealed unsafe class ListViewLabelEditAccessibleObject : LabelEditAccessibleObject
{
    private const string LIST_VIEW_LABEL_EDIT_AUTOMATION_ID = "1";
 
    private readonly WeakReference<ListView> _owningListView;
 
    public ListViewLabelEditAccessibleObject(ListView owningListView, ListViewLabelEditNativeWindow labelEdit) : base(owningListView, labelEdit)
    {
        ArgumentNullException.ThrowIfNull(owningListView);
 
        _owningListView = new(owningListView);
        UseStdAccessibleObjects(labelEdit.Handle);
    }
 
    private ListViewSubItemAccessibleObject? OwningSubItemAccessibleObject =>
        _owningListView.TryGetTarget(out ListView? target)
            ? target._listViewSubItem?.AccessibilityObject as ListViewSubItemAccessibleObject
            : null;
 
    private AccessibleObject? OwningListViewItemAccessibleObject =>
        _owningListView.TryGetTarget(out ListView? target)
            ? target._selectedItem?.AccessibilityObject
            : null;
 
    private protected override string AutomationId => LIST_VIEW_LABEL_EDIT_AUTOMATION_ID;
 
    public override AccessibleObject? Parent =>
        _owningListView.TryGetTarget(out ListView? target)
        ? target._listViewSubItem is null
            ? OwningListViewItemAccessibleObject
            : target.View == View.Tile
                ? OwningListViewItemAccessibleObject
                : OwningSubItemAccessibleObject
        : null;
 
    private protected override bool IsInternal => true;
 
    internal override VARIANT GetPropertyValue(UIA_PROPERTY_ID propertyID) =>
        propertyID switch
        {
            UIA_PROPERTY_ID.UIA_IsEnabledPropertyId => _owningListView.TryGetTarget(out ListView? target) ? (VARIANT)target.Enabled : VARIANT.False,
            _ => base.GetPropertyValue(propertyID)
        };
 
    internal override IRawElementProviderFragment.Interface? FragmentNavigate(NavigateDirection direction) =>
        direction switch
        {
            NavigateDirection.NavigateDirection_NextSibling
                => _owningListView.TryGetTarget(out ListView? target) && target.View == View.Tile ? target._selectedItem?.SubItems[1].AccessibilityObject : null,
            _ => base.FragmentNavigate(direction)
        };
 
    internal override IRawElementProviderFragmentRoot.Interface? FragmentRoot =>
        _owningListView.TryGetTarget(out ListView? target)
            ? target.AccessibilityObject
            : null;
}