Skip to content

Commit

Permalink
Fix issue with showing groups in the Inspector when groups are disabl…
Browse files Browse the repository at this point in the history
…ed (dotnet#4677)

Added conditions to ignore ListViewGroupAccessibleObjects when groups or visual styles are disabled

Updated unit tests.
  • Loading branch information
SergeySmirnov-Akvelon authored Mar 29, 2021
1 parent 2b161db commit 06d0e8d
Show file tree
Hide file tree
Showing 9 changed files with 639 additions and 120 deletions.
42 changes: 42 additions & 0 deletions CodeMaid.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="SteveCadwallader.CodeMaid.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</configSections>
<userSettings>
<SteveCadwallader.CodeMaid.Properties.Settings>
<setting name="Reorganizing_MemberTypeConstructors" serializeAs="String">
<value>Constructors||3||Constructors</value>
</setting>
<setting name="Reorganizing_MemberTypeMethods" serializeAs="String">
<value>Methods||8||Methods</value>
</setting>
<setting name="Reorganizing_MemberTypeProperties" serializeAs="String">
<value>Properties||5||Properties</value>
</setting>
<setting name="Reorganizing_MemberTypeEnums" serializeAs="String">
<value>Enums||9||Enums</value>
</setting>
<setting name="Reorganizing_MemberTypeDestructors" serializeAs="String">
<value>Destructors||4||Destructors</value>
</setting>
<setting name="Reorganizing_MemberTypeDelegates" serializeAs="String">
<value>Delegates||2||Delegates</value>
</setting>
<setting name="Reorganizing_RegionsRemoveExistingRegions" serializeAs="String">
<value>True</value>
</setting>
<setting name="Reorganizing_MemberTypeIndexers" serializeAs="String">
<value>Indexers||6||Indexers</value>
</setting>
<setting name="Reorganizing_MemberTypeInterfaces" serializeAs="String">
<value>Interfaces||10||Interfaces</value>
</setting>
<setting name="Reorganizing_MemberTypeEvents" serializeAs="String">
<value>Events||7||Events</value>
</setting>
</SteveCadwallader.CodeMaid.Properties.Settings>
</userSettings>
</configuration>
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ private bool OwnerHasDefaultGroup
}

private bool OwnerHasGroups
=> _owningListView.IsHandleCreated && _owningListView.Groups.Count > 0;
=> _owningListView.IsHandleCreated && ShowGroupAccessibleObject;

internal override int RowCount
=> _owningListView.Items.Count;
Expand All @@ -75,6 +75,9 @@ internal override int[]? RuntimeId
}
}

// ListViewGroup are not displayed when the ListView is in "List" view
private bool ShowGroupAccessibleObject => _owningListView.View != View.List && _owningListView.GroupsEnabled;

internal override UiaCore.IRawElementProviderFragment? ElementProviderFromPoint(double x, double y)
{
AccessibleObject? element = HitTest((int)x, (int)y);
Expand Down Expand Up @@ -136,7 +139,7 @@ public override int GetChildCount()
return 0;
}

if (_owningListView.Groups.Count > 0)
if (ShowGroupAccessibleObject)
{
return OwnerHasDefaultGroup ? _owningListView.Groups.Count + 1 : _owningListView.Groups.Count;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3156,7 +3156,7 @@ public void EndUpdate()

private void EnsureDefaultGroup()
{
if (IsHandleCreated && Application.ComCtlSupportsVisualStyles && GroupsEnabled)
if (IsHandleCreated && GroupsEnabled)
{
if (User32.SendMessageW(this, (User32.WM)LVM.HASGROUP, (IntPtr)DefaultGroup.ID) == IntPtr.Zero)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public ListViewGroup(string? header, HorizontalAlignment headerAlignment) : this
_headerAlignment = headerAlignment;
}

internal AccessibleObject? AccessibilityObject
internal AccessibleObject AccessibilityObject
{
get
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ private string AutomationId
=> string.Format("{0}-{1}", typeof(ListViewItem).Name, CurrentIndex);

public override Rectangle Bounds
=> _owningGroup?.CollapsedState == ListViewGroupCollapsedState.Collapsed
=> ShowGroupAccessibleObject && _owningGroup?.CollapsedState == ListViewGroupCollapsedState.Collapsed
? Rectangle.Empty
: new Rectangle(
_owningListView.AccessibilityObject.Bounds.X + _owningItem.Bounds.X,
Expand Down Expand Up @@ -71,6 +71,9 @@ private bool OwningListItemFocused
public override AccessibleRole Role
=> AccessibleRole.ListItem;

// ListViewGroup are not displayed when the ListView is in "List" view
private bool ShowGroupAccessibleObject => _owningListView.View != View.List && _owningListView.GroupsEnabled;

/// <summary>
/// Gets the accessible state.
/// </summary>
Expand Down Expand Up @@ -106,7 +109,9 @@ public override void DoDefaultAction()

internal override UiaCore.IRawElementProviderFragment? FragmentNavigate(UiaCore.NavigateDirection direction)
{
ListViewGroupAccessibleObject? owningGroupAccessibleObject = (ListViewGroupAccessibleObject?)_owningGroup?.AccessibilityObject;
ListViewGroupAccessibleObject? owningGroupAccessibleObject = ShowGroupAccessibleObject && _owningGroup is not null
? (ListViewGroupAccessibleObject)_owningGroup.AccessibilityObject
: null;
switch (direction)
{
case UiaCore.NavigateDirection.Parent:
Expand Down Expand Up @@ -149,7 +154,7 @@ public override void DoDefaultAction()

public override AccessibleObject? GetChild(int index)
{
if (index < 0 || index >= _owningItem.SubItems.Count || _owningGroup != null)
if (index < 0 || index >= _owningItem.SubItems.Count)
{
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,6 @@ internal virtual AccessibleObject AccessibilityObject
if (_accessibilityObject is null)
{
bool inDefaultGroup = listView?.GroupsEnabled == true && Group is null;

_accessibilityObject = new ListViewItemAccessibleObject(
this, inDefaultGroup ? listView.DefaultGroup : Group);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,44 @@ public void ListViewAccessibleObject_ListWithOneItem_GetChildCount_ReturnsCorrec
[WinFormsTheory]
[InlineData(true, 2)]
[InlineData(false, 0)]
public void ListViewAccessibleObject_ListWithTwoGroups_GetChildCount_ReturnsCorrectValue(bool createdControl, int expectedChildCount)
public void ListViewAccessibleObject_ListWithTwoGroups_GetChildCount_ReturnsCorrectValue_UseVisualStylesEnabled(bool createdControl, int expectedChildCount)
{
if (!Application.UseVisualStyles)
{
return;
}

using ListView listView = new ListView();
if (createdControl)
{
listView.CreateControl();
}

listView.Items.Add(new ListViewItem());
ListViewItem item = new ListViewItem();
ListViewItem item2 = new ListViewItem();
ListViewGroup group = new ListViewGroup();
item2.Group = group;
item.Group = group;
listView.Groups.Add(group);
listView.Items.Add(item);
listView.Items.Add(item2);

AccessibleObject accessibleObject = listView.AccessibilityObject;
Assert.Equal(expectedChildCount, accessibleObject.GetChildCount()); // Default group and one specified group
Assert.Equal(createdControl, listView.IsHandleCreated);
}

[WinFormsTheory]
[InlineData(true, 3)]
[InlineData(false, 0)]
public void ListViewAccessibleObject_ListWithTwoGroups_GetChildCount_ReturnsCorrectValue_UseVisualStylesDisabled(bool createdControl, int expectedChildCount)
{
if (Application.UseVisualStyles)
{
return;
}

using ListView listView = new ListView();
if (createdControl)
{
Expand All @@ -120,8 +156,13 @@ public void ListViewAccessibleObject_ListWithTwoGroups_GetChildCount_ReturnsCorr
}

[WinFormsFact]
public void ListViewAccessibleObject_ListWithTwoGroups_FragmentNavigateWorkCorrectly_IfHandleIsCreated()
public void ListViewAccessibleObject_ListWithTwoGroups_FragmentNavigateWorkCorrectly_IfHandleIsCreated_VisualStylesEnabled()
{
if (!Application.UseVisualStyles)
{
return;
}

using ListView listView = new ListView();
listView.CreateControl();
listView.Items.Add(new ListViewItem());
Expand All @@ -144,6 +185,36 @@ public void ListViewAccessibleObject_ListWithTwoGroups_FragmentNavigateWorkCorre
Assert.True(listView.IsHandleCreated);
}

[WinFormsFact]
public void ListViewAccessibleObject_ListWithTwoGroups_FragmentNavigateWorkCorrectly_IfHandleIsCreated_VisualStylesDisabled()
{
if (Application.UseVisualStyles)
{
return;
}

using ListView listView = new ListView();
listView.CreateControl();
listView.Items.Add(new ListViewItem());
ListViewItem item = new ListViewItem();
ListViewItem item2 = new ListViewItem();
ListViewGroup group = new ListViewGroup();
item2.Group = group;
item.Group = group;
listView.Groups.Add(group);
listView.Items.Add(item);
listView.Items.Add(item2);

AccessibleObject accessibleObject = listView.AccessibilityObject;

AccessibleObject firstChild = accessibleObject.FragmentNavigate(UiaCore.NavigateDirection.FirstChild) as AccessibleObject;
AccessibleObject lastChild = accessibleObject.FragmentNavigate(UiaCore.NavigateDirection.LastChild) as AccessibleObject;
Assert.IsType<ListViewItemAccessibleObject>(firstChild);
Assert.IsType<ListViewItemAccessibleObject>(lastChild);
Assert.NotEqual(firstChild, lastChild);
Assert.True(listView.IsHandleCreated);
}

[WinFormsFact]
public void ListViewAccessibleObject_ListWithTwoGroups_FragmentNavigateWorkCorrectly_IfHandleIsNotCreated()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,13 @@ public void ListViewGroupAccessibleObject_GetPropertyValue_returns_correct_value
}

[WinFormsFact]
public void ListViewGroupAccessibleObject_ListWithTwoGroups_FragmentNavigateWorkCorrectly_IfHandleIsCreated()
public void ListViewGroupAccessibleObject_ListWithTwoGroups_FragmentNavigateWorkCorrectly_IfHandleIsCreated_VisualStylesEnabled()
{
if (!Application.UseVisualStyles)
{
return;
}

using ListView list = new ListView();
list.CreateControl();
ListViewGroup listGroup = new ListViewGroup("Group1");
Expand Down
Loading

0 comments on commit 06d0e8d

Please sign in to comment.