@@ -22,8 +22,8 @@ private AvnAutomationPeer(AutomationPeer inner)
22
22
{
23
23
_inner = inner ;
24
24
_inner . ChildrenChanged += ( _ , _ ) => Node ? . ChildrenChanged ( ) ;
25
- if ( inner is WindowBaseAutomationPeer window )
26
- window . FocusChanged += ( _ , _ ) => Node ? . FocusChanged ( ) ;
25
+ if ( inner is IRootProvider root )
26
+ root . FocusChanged += ( _ , _ ) => Node ? . FocusChanged ( ) ;
27
27
}
28
28
29
29
~ AvnAutomationPeer ( ) => Node ? . Dispose ( ) ;
@@ -39,6 +39,7 @@ private AvnAutomationPeer(AutomationPeer inner)
39
39
public IAvnAutomationPeer ? LabeledBy => Wrap ( _inner . GetLabeledBy ( ) ) ;
40
40
public IAvnString Name => _inner . GetName ( ) . ToAvnString ( ) ;
41
41
public IAvnAutomationPeer ? Parent => Wrap ( _inner . GetParent ( ) ) ;
42
+ public IAvnAutomationPeer ? VisualRoot => Wrap ( _inner . GetVisualRoot ( ) ) ;
42
43
43
44
public int HasKeyboardFocus ( ) => _inner . HasKeyboardFocus ( ) . AsComBool ( ) ;
44
45
public int IsContentElement ( ) => _inner . IsContentElement ( ) . AsComBool ( ) ;
@@ -48,14 +49,21 @@ private AvnAutomationPeer(AutomationPeer inner)
48
49
public void SetFocus ( ) => _inner . SetFocus ( ) ;
49
50
public int ShowContextMenu ( ) => _inner . ShowContextMenu ( ) . AsComBool ( ) ;
50
51
52
+ public void SetNode ( IAvnAutomationNode node )
53
+ {
54
+ if ( Node is not null )
55
+ throw new InvalidOperationException ( "The AvnAutomationPeer already has a node." ) ;
56
+ Node = node ;
57
+ }
58
+
51
59
public IAvnAutomationPeer ? RootPeer
52
60
{
53
61
get
54
62
{
55
63
var peer = _inner ;
56
64
var parent = peer . GetParent ( ) ;
57
65
58
- while ( peer is not IRootProvider && parent is not null )
66
+ while ( peer . GetProvider < IRootProvider > ( ) is null && parent is not null )
59
67
{
60
68
peer = parent ;
61
69
parent = peer . GetParent ( ) ;
@@ -65,26 +73,23 @@ public IAvnAutomationPeer? RootPeer
65
73
}
66
74
}
67
75
68
- public void SetNode ( IAvnAutomationNode node )
69
- {
70
- if ( Node is not null )
71
- throw new InvalidOperationException ( "The AvnAutomationPeer already has a node." ) ;
72
- Node = node ;
73
- }
74
-
75
- public int IsRootProvider ( ) => ( _inner is IRootProvider ) . AsComBool ( ) ;
76
+ private IEmbeddedRootProvider EmbeddedRootProvider => GetProvider < IEmbeddedRootProvider > ( ) ;
77
+ private IExpandCollapseProvider ExpandCollapseProvider => GetProvider < IExpandCollapseProvider > ( ) ;
78
+ private IInvokeProvider InvokeProvider => GetProvider < IInvokeProvider > ( ) ;
79
+ private IRangeValueProvider RangeValueProvider => GetProvider < IRangeValueProvider > ( ) ;
80
+ private IRootProvider RootProvider => GetProvider < IRootProvider > ( ) ;
81
+ private ISelectionItemProvider SelectionItemProvider => GetProvider < ISelectionItemProvider > ( ) ;
82
+ private IToggleProvider ToggleProvider => GetProvider < IToggleProvider > ( ) ;
83
+ private IValueProvider ValueProvider => GetProvider < IValueProvider > ( ) ;
76
84
77
- public IAvnWindowBase RootProvider_GetWindow ( )
78
- {
79
- var window = ( WindowBase ) ( ( ControlAutomationPeer ) _inner ) . Owner ;
80
- return ( ( WindowBaseImpl ) window . PlatformImpl ! ) . Native ;
81
- }
82
-
83
- public IAvnAutomationPeer ? RootProvider_GetFocus ( ) => Wrap ( ( ( IRootProvider ) _inner ) . GetFocus ( ) ) ;
85
+ public int IsRootProvider ( ) => IsProvider < IRootProvider > ( ) ;
86
+
87
+ public IAvnWindowBase ? RootProvider_GetWindow ( ) => ( RootProvider . PlatformImpl as WindowBaseImpl ) ? . Native ;
88
+ public IAvnAutomationPeer ? RootProvider_GetFocus ( ) => Wrap ( RootProvider . GetFocus ( ) ) ;
84
89
85
90
public IAvnAutomationPeer ? RootProvider_GetPeerFromPoint ( AvnPoint point )
86
91
{
87
- var result = ( ( IRootProvider ) _inner ) . GetPeerFromPoint ( point . ToAvaloniaPoint ( ) ) ;
92
+ var result = RootProvider . GetPeerFromPoint ( point . ToAvaloniaPoint ( ) ) ;
88
93
89
94
if ( result is null )
90
95
return null ;
@@ -103,46 +108,80 @@ public IAvnWindowBase RootProvider_GetWindow()
103
108
return Wrap ( result ) ;
104
109
}
105
110
106
- public int IsExpandCollapseProvider ( ) => ( _inner is IExpandCollapseProvider ) . AsComBool ( ) ;
107
111
108
- public int ExpandCollapseProvider_GetIsExpanded ( ) => ( ( IExpandCollapseProvider ) _inner ) . ExpandCollapseState switch
112
+ public int IsEmbeddedRootProvider ( ) => IsProvider < IEmbeddedRootProvider > ( ) ;
113
+
114
+ public IAvnAutomationPeer ? EmbeddedRootProvider_GetFocus ( ) => Wrap ( EmbeddedRootProvider . GetFocus ( ) ) ;
115
+
116
+ public IAvnAutomationPeer ? EmbeddedRootProvider_GetPeerFromPoint ( AvnPoint point )
117
+ {
118
+ var result = EmbeddedRootProvider . GetPeerFromPoint ( point . ToAvaloniaPoint ( ) ) ;
119
+
120
+ if ( result is null )
121
+ return null ;
122
+
123
+ // The OSX accessibility APIs expect non-ignored elements when hit-testing.
124
+ while ( ! result . IsControlElement ( ) )
125
+ {
126
+ var parent = result . GetParent ( ) ;
127
+
128
+ if ( parent is not null )
129
+ result = parent ;
130
+ else
131
+ break ;
132
+ }
133
+
134
+ return Wrap ( result ) ;
135
+ }
136
+
137
+ public int IsExpandCollapseProvider ( ) => IsProvider < IExpandCollapseProvider > ( ) ;
138
+
139
+ public int ExpandCollapseProvider_GetIsExpanded ( ) => ExpandCollapseProvider . ExpandCollapseState switch
109
140
{
110
141
ExpandCollapseState . Expanded => 1 ,
111
142
ExpandCollapseState . PartiallyExpanded => 1 ,
112
143
_ => 0 ,
113
144
} ;
114
145
115
- public int ExpandCollapseProvider_GetShowsMenu ( ) => ( ( IExpandCollapseProvider ) _inner ) . ShowsMenu . AsComBool ( ) ;
116
- public void ExpandCollapseProvider_Expand ( ) => ( ( IExpandCollapseProvider ) _inner ) . Expand ( ) ;
117
- public void ExpandCollapseProvider_Collapse ( ) => ( ( IExpandCollapseProvider ) _inner ) . Collapse ( ) ;
146
+ public int ExpandCollapseProvider_GetShowsMenu ( ) => ExpandCollapseProvider . ShowsMenu . AsComBool ( ) ;
147
+ public void ExpandCollapseProvider_Expand ( ) => ExpandCollapseProvider . Expand ( ) ;
148
+ public void ExpandCollapseProvider_Collapse ( ) => ExpandCollapseProvider . Collapse ( ) ;
118
149
119
- public int IsInvokeProvider ( ) => ( _inner is IInvokeProvider ) . AsComBool ( ) ;
120
- public void InvokeProvider_Invoke ( ) => ( ( IInvokeProvider ) _inner ) . Invoke ( ) ;
150
+ public int IsInvokeProvider ( ) => IsProvider < IInvokeProvider > ( ) ;
151
+ public void InvokeProvider_Invoke ( ) => InvokeProvider . Invoke ( ) ;
121
152
122
- public int IsRangeValueProvider ( ) => ( _inner is IRangeValueProvider ) . AsComBool ( ) ;
123
- public double RangeValueProvider_GetValue ( ) => ( ( IRangeValueProvider ) _inner ) . Value ;
124
- public double RangeValueProvider_GetMinimum ( ) => ( ( IRangeValueProvider ) _inner ) . Minimum ;
125
- public double RangeValueProvider_GetMaximum ( ) => ( ( IRangeValueProvider ) _inner ) . Maximum ;
126
- public double RangeValueProvider_GetSmallChange ( ) => ( ( IRangeValueProvider ) _inner ) . SmallChange ;
127
- public double RangeValueProvider_GetLargeChange ( ) => ( ( IRangeValueProvider ) _inner ) . LargeChange ;
128
- public void RangeValueProvider_SetValue ( double value ) => ( ( IRangeValueProvider ) _inner ) . SetValue ( value ) ;
153
+ public int IsRangeValueProvider ( ) => IsProvider < IRangeValueProvider > ( ) ;
154
+ public double RangeValueProvider_GetValue ( ) => RangeValueProvider . Value ;
155
+ public double RangeValueProvider_GetMinimum ( ) => RangeValueProvider . Minimum ;
156
+ public double RangeValueProvider_GetMaximum ( ) => RangeValueProvider . Maximum ;
157
+ public double RangeValueProvider_GetSmallChange ( ) => RangeValueProvider . SmallChange ;
158
+ public double RangeValueProvider_GetLargeChange ( ) => RangeValueProvider . LargeChange ;
159
+ public void RangeValueProvider_SetValue ( double value ) => RangeValueProvider . SetValue ( value ) ;
129
160
130
- public int IsSelectionItemProvider ( ) => ( _inner is ISelectionItemProvider ) . AsComBool ( ) ;
131
- public int SelectionItemProvider_IsSelected ( ) => ( ( ISelectionItemProvider ) _inner ) . IsSelected . AsComBool ( ) ;
161
+ public int IsSelectionItemProvider ( ) => IsProvider < ISelectionItemProvider > ( ) ;
162
+ public int SelectionItemProvider_IsSelected ( ) => SelectionItemProvider . IsSelected . AsComBool ( ) ;
132
163
133
- public int IsToggleProvider ( ) => ( _inner is IToggleProvider ) . AsComBool ( ) ;
134
- public int ToggleProvider_GetToggleState ( ) => ( int ) ( ( IToggleProvider ) _inner ) . ToggleState ;
135
- public void ToggleProvider_Toggle ( ) => ( ( IToggleProvider ) _inner ) . Toggle ( ) ;
164
+ public int IsToggleProvider ( ) => IsProvider < IToggleProvider > ( ) ;
165
+ public int ToggleProvider_GetToggleState ( ) => ( int ) ToggleProvider . ToggleState ;
166
+ public void ToggleProvider_Toggle ( ) => ToggleProvider . Toggle ( ) ;
136
167
137
- public int IsValueProvider ( ) => ( _inner is IValueProvider ) . AsComBool ( ) ;
138
- public IAvnString ValueProvider_GetValue ( ) => ( ( IValueProvider ) _inner ) . Value . ToAvnString ( ) ;
139
- public void ValueProvider_SetValue ( string value ) => ( ( IValueProvider ) _inner ) . SetValue ( value ) ;
168
+ public int IsValueProvider ( ) => IsProvider < IValueProvider > ( ) ;
169
+ public IAvnString ValueProvider_GetValue ( ) => ValueProvider . Value . ToAvnString ( ) ;
170
+ public void ValueProvider_SetValue ( string value ) => ValueProvider . SetValue ( value ) ;
140
171
141
172
[ return : NotNullIfNotNull ( "peer" ) ]
142
173
public static AvnAutomationPeer ? Wrap ( AutomationPeer ? peer )
143
174
{
144
175
return peer is null ? null : s_wrappers . GetValue ( peer , x => new ( peer ) ) ;
145
176
}
177
+
178
+ private T GetProvider < T > ( )
179
+ {
180
+ return _inner . GetProvider < T > ( ) ?? throw new InvalidOperationException (
181
+ $ "The peer { _inner } does not implement { typeof ( T ) } .") ;
182
+ }
183
+
184
+ private int IsProvider < T > ( ) => ( _inner . GetProvider < T > ( ) is not null ) . AsComBool ( ) ;
146
185
}
147
186
148
187
internal class AvnAutomationPeerArray : NativeCallbackBase , IAvnAutomationPeerArray
0 commit comments