Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Runtime.InteropServices;

internal static partial class Interop
{
internal static partial class UiaCore
{
[ComImport]
[Guid("6278cab1-b556-4a1a-b4e0-418acc523201")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMultipleViewProvider
{
string GetViewName(int viewId);

void SetCurrentView(int viewId);

int CurrentView
{
get;
}

int[] GetSupportedViews();
}
}
}
3 changes: 3 additions & 0 deletions src/System.Windows.Forms/src/Resources/SR.resx
Original file line number Diff line number Diff line change
Expand Up @@ -6617,4 +6617,7 @@ Stack trace where the illegal operation occurred was:
<data name="ErrorProviderDefaultAccessibleName" xml:space="preserve">
<value>Error provider</value>
</data>
<data name="AccessibleActionDoubleClick" xml:space="preserve">
<value>Double Click</value>
</data>
</root>
5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.ru.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.tr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.zh-Hans.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/System.Windows.Forms/src/Resources/xlf/SR.zh-Hant.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ public class AccessibleObject :
UiaCore.ISelectionProvider,
UiaCore.ISelectionItemProvider,
UiaCore.IRawElementProviderHwndOverride,
UiaCore.IScrollItemProvider
UiaCore.IScrollItemProvider,
UiaCore.IMultipleViewProvider
{
/// <summary>
/// Specifies the <see cref='IAccessible'/> interface used by this <see cref='AccessibleObject'/>.
Expand Down Expand Up @@ -680,6 +681,16 @@ internal virtual void SetValue(string newValue)

internal virtual UiaCore.IRawElementProviderSimple GetOverrideProviderForHwnd(IntPtr hwnd) => null;

internal virtual int GetMultiViewProviderCurrentView() => 0;

internal virtual int[] GetMultiViewProviderSupportedViews() => new int[0];

internal virtual string GetMultiViewProviderViewName(int viewId) => null;

internal virtual void SetMultiViewProviderCurrentView(int viewId)
{
}

internal virtual void SetValue(double newValue)
{
}
Expand Down Expand Up @@ -2182,6 +2193,14 @@ object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder
UiaCore.IRawElementProviderSimple UiaCore.IRawElementProviderHwndOverride.GetOverrideProviderForHwnd(IntPtr hwnd)
=> GetOverrideProviderForHwnd(hwnd);

int UiaCore.IMultipleViewProvider.CurrentView => GetMultiViewProviderCurrentView();

int[] UiaCore.IMultipleViewProvider.GetSupportedViews() => GetMultiViewProviderSupportedViews();

string UiaCore.IMultipleViewProvider.GetViewName(int viewId) => GetMultiViewProviderViewName(viewId);

void UiaCore.IMultipleViewProvider.SetCurrentView(int viewId) => SetMultiViewProviderCurrentView(viewId);

BOOL UiaCore.IRangeValueProvider.IsReadOnly => IsReadOnly ? BOOL.TRUE : BOOL.FALSE;

double UiaCore.IRangeValueProvider.LargeChange => LargeChange;
Expand Down Expand Up @@ -2541,7 +2560,8 @@ internal sealed class InternalAccessibleObject :
UiaCore.ISelectionProvider,
UiaCore.ISelectionItemProvider,
UiaCore.IScrollItemProvider,
UiaCore.IRawElementProviderHwndOverride
UiaCore.IRawElementProviderHwndOverride,
UiaCore.IMultipleViewProvider
{
private IAccessible publicIAccessible; // AccessibleObject as IAccessible
private readonly OleAut32.IEnumVariant publicIEnumVariant; // AccessibleObject as IEnumVariant
Expand Down Expand Up @@ -2569,6 +2589,7 @@ internal sealed class InternalAccessibleObject :
private readonly UiaCore.ISelectionItemProvider publicISelectionItemProvider; // AccessibleObject as ISelectionItemProvider
private readonly UiaCore.IScrollItemProvider publicIScrollItemProvider; // AccessibleObject as IScrollItemProvider
private readonly UiaCore.IRawElementProviderHwndOverride publicIRawElementProviderHwndOverride; // AccessibleObject as IRawElementProviderHwndOverride
private readonly UiaCore.IMultipleViewProvider publicIMultiViewProvider; // AccessibleObject as IMultipleViewProvider

/// <summary>
/// Create a new wrapper.
Expand Down Expand Up @@ -2599,6 +2620,7 @@ internal InternalAccessibleObject(AccessibleObject accessibleImplemention)
publicISelectionItemProvider = (UiaCore.ISelectionItemProvider)accessibleImplemention;
publicIScrollItemProvider = (UiaCore.IScrollItemProvider)accessibleImplemention;
publicIRawElementProviderHwndOverride = (UiaCore.IRawElementProviderHwndOverride)accessibleImplemention;
publicIMultiViewProvider = (UiaCore.IMultipleViewProvider)accessibleImplemention;
// Note: Deliberately not holding onto AccessibleObject to enforce all access through the interfaces
}

Expand Down Expand Up @@ -2846,6 +2868,10 @@ object UiaCore.IRawElementProviderSimple.GetPatternProvider(UiaCore.UIA patternI
{
return (UiaCore.IScrollItemProvider)this;
}
else if (patternId == UiaCore.UIA.MultipleViewPatternId)
{
return (UiaCore.IMultipleViewProvider)this;
}
else
{
return null;
Expand Down Expand Up @@ -3043,5 +3069,17 @@ UiaCore.IRawElementProviderSimple UiaCore.ISelectionItemProvider.SelectionContai
/// <returns>Return the provider for the specified component, or null if the component is not being overridden.</returns>
UiaCore.IRawElementProviderSimple UiaCore.IRawElementProviderHwndOverride.GetOverrideProviderForHwnd(IntPtr hwnd)
=> publicIRawElementProviderHwndOverride.GetOverrideProviderForHwnd(hwnd);

int UiaCore.IMultipleViewProvider.CurrentView
=> publicIMultiViewProvider.CurrentView;

int[] UiaCore.IMultipleViewProvider.GetSupportedViews()
=> publicIMultiViewProvider.GetSupportedViews();

string UiaCore.IMultipleViewProvider.GetViewName(int viewId)
=> publicIMultiViewProvider.GetViewName(viewId);

void UiaCore.IMultipleViewProvider.SetCurrentView(int viewId)
=> publicIMultiViewProvider.SetCurrentView(viewId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.Control;
using static Interop;

namespace System.Windows.Forms
{
public partial class Button
{
[ComVisible(true)]
internal class ButtonAccessibleObject : ControlAccessibleObject
{
internal ButtonAccessibleObject(Button owner) : base(owner)
{
}

private Button OwningButton => Owner as Button;

internal override object GetPropertyValue(UiaCore.UIA propertyID)
{
switch (propertyID)
{
case UiaCore.UIA.NamePropertyId:
return Name;
case UiaCore.UIA.AutomationIdPropertyId:
return OwningButton.IsHandleCreated ? OwningButton.Name : String.Empty;
case UiaCore.UIA.ControlTypePropertyId:
return UiaCore.UIA.ButtonControlTypeId;
case UiaCore.UIA.IsKeyboardFocusablePropertyId:
// This is necessary for compatibility with MSAA proxy:
// IsKeyboardFocusable = true regardless the control is enabled/disabled.
return true;
}

return base.GetPropertyValue(propertyID);
}
}
}
}
5 changes: 4 additions & 1 deletion src/System.Windows.Forms/src/System/Windows/Forms/Button.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace System.Windows.Forms
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[SRDescription(nameof(SR.DescriptionButton))]
[Designer("System.Windows.Forms.Design.ButtonBaseDesigner, " + AssemblyRef.SystemDesign)]
public class Button : ButtonBase, IButtonControl
public partial class Button : ButtonBase, IButtonControl
{
/// <summary>
/// The dialog result that will be sent to the parent dialog form when
Expand Down Expand Up @@ -387,5 +387,8 @@ protected override void WndProc(ref Message m)
break;
}
}

protected override AccessibleObject CreateAccessibilityInstance()
=> new ButtonAccessibleObject(this);
}
}
34 changes: 0 additions & 34 deletions src/System.Windows.Forms/src/System/Windows/Forms/ButtonBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -753,11 +753,6 @@ private void Animate(bool animate)
}
}

protected override AccessibleObject CreateAccessibilityInstance()
{
return new ButtonBaseAccessibleObject(this);
}

private void DetachImageList(object sender, EventArgs e)
{
ImageList = null;
Expand Down Expand Up @@ -1327,34 +1322,5 @@ protected override void WndProc(ref Message m)
}
}
}

[ComVisible(true)]
public class ButtonBaseAccessibleObject : ControlAccessibleObject
{
public ButtonBaseAccessibleObject(Control owner) : base(owner)
{
}

public override void DoDefaultAction()
{
((ButtonBase)Owner).OnClick(EventArgs.Empty);
}

public override AccessibleStates State
{
get
{
AccessibleStates state = base.State;

ButtonBase owner = (ButtonBase)Owner;
if (owner.OwnerDraw && owner.MouseIsDown)
{
state |= AccessibleStates.Pressed;
}

return state;
}
}
}
}
}
Loading