Release 10.0.0.16997
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / BaseComponents / ViewAccessibilityWrappers.cs
1 /*
2  * Copyright(c) 2022 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 using System;
19 using System.Runtime.InteropServices;
20
21 namespace Tizen.NUI.BaseComponents
22 {
23     public partial class View
24     {
25         private static AccessibilityStates AccessibilityInitialStates = new AccessibilityStates();
26
27         private static void RegisterAccessibilityDelegate()
28         {
29             InitializeAccessibilityDelegateAccessibleInterface();
30             InitializeAccessibilityDelegateActionInterface();
31             InitializeAccessibilityDelegateComponentInterface();
32             InitializeAccessibilityDelegateEditableTextInterface();
33             InitializeAccessibilityDelegateSelectionInterface();
34             InitializeAccessibilityDelegateTextInterface();
35             InitializeAccessibilityDelegateValueInterface();
36             InitializeAccessibilityDelegateTizenExtensions();
37
38             var ad   = Interop.ControlDevel.AccessibilityDelegate.Instance;
39             var size = Marshal.SizeOf<Interop.ControlDevel.AccessibilityDelegate>();
40             var ptr  = Marshal.AllocHGlobal(size);
41
42             Marshal.StructureToPtr(ad, ptr, false);
43             Interop.ControlDevel.DaliAccessibilitySetAccessibilityDelegate(ptr, size);
44         }
45
46         private static View GetViewFromRefObject(IntPtr refObjectPtr)
47         {
48             return Registry.GetManagedBaseHandleFromRefObject(refObjectPtr) as View;
49         }
50
51         private static IntPtr DuplicateString(string value)
52         {
53             return Interop.ControlDevel.DaliAccessibilityDuplicateString(value ?? "");
54         }
55
56         private static IntPtr DuplicateAccessibilityRange(AccessibilityRange range)
57         {
58             return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
59         }
60
61         //
62         // Accessible interface
63         //
64
65         private static void InitializeAccessibilityDelegateAccessibleInterface()
66         {
67             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
68
69             ad.CalculateStates = AccessibilityCalculateStatesWrapper;
70             ad.GetDescription  = AccessibilityGetDescriptionWrapper;
71             ad.GetName         = AccessibilityGetNameWrapper;
72         }
73
74         private static ulong AccessibilityCalculateStatesWrapper(IntPtr self, ulong initialStates)
75         {
76             View view = GetViewFromRefObject(self);
77             ulong bitMask = 0UL;
78
79             lock (AccessibilityInitialStates)
80             {
81                 AccessibilityInitialStates.BitMask = initialStates;
82                 bitMask = view.AccessibilityCalculateStates().BitMask;
83                 AccessibilityInitialStates.BitMask = 0UL;
84             }
85
86             return bitMask;
87         }
88
89         private static IntPtr AccessibilityGetDescriptionWrapper(IntPtr self)
90         {
91             string description = GetViewFromRefObject(self).AccessibilityGetDescription();
92
93             return DuplicateString(description);
94         }
95
96         private static IntPtr AccessibilityGetNameWrapper(IntPtr self)
97         {
98             string name = GetViewFromRefObject(self).AccessibilityGetName();
99
100             return DuplicateString(name);
101         }
102
103         //
104         // Action interface
105         //
106
107         private static void InitializeAccessibilityDelegateActionInterface()
108         {
109             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
110
111             ad.DoAction       = AccessibilityDoActionWrapper;
112             ad.GetActionCount = AccessibilityGetActionCountWrapper;
113             ad.GetActionName  = AccessibilityGetActionNameWrapper;
114         }
115
116         private static bool AccessibilityDoActionWrapper(IntPtr self, IntPtr name)
117         {
118             return GetViewFromRefObject(self).AccessibilityDoAction(Marshal.PtrToStringAnsi(name));
119         }
120
121         private static int AccessibilityGetActionCountWrapper(IntPtr self)
122         {
123             return GetViewFromRefObject(self).AccessibilityGetActionCount();
124         }
125
126         private static IntPtr AccessibilityGetActionNameWrapper(IntPtr self, int index)
127         {
128             string name = GetViewFromRefObject(self).AccessibilityGetActionName(index);
129
130             return DuplicateString(name);
131         }
132
133         //
134         // Component interface
135         //
136
137         private static void InitializeAccessibilityDelegateComponentInterface()
138         {
139             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
140
141             ad.IsScrollable = AccessibilityIsScrollableWrapper;
142         }
143
144         private static bool AccessibilityIsScrollableWrapper(IntPtr self)
145         {
146             return GetViewFromRefObject(self).AccessibilityIsScrollable();
147         }
148
149         //
150         // EditableText interface
151         //
152
153         private static void InitializeAccessibilityDelegateEditableTextInterface()
154         {
155             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
156
157             ad.CopyText        = AccessibilityCopyTextWrapper;
158             ad.CutText         = AccessibilityCutTextWrapper;
159             ad.DeleteText      = AccessibilityDeleteTextWrapper;
160             ad.InsertText      = AccessibilityInsertTextWrapper;
161             ad.SetTextContents = AccessibilitySetTextContentsWrapper;
162         }
163
164         private static bool AccessibilityCopyTextWrapper(IntPtr self, int startPosition, int endPosition)
165         {
166             return GetViewFromRefObject(self).AccessibilityCopyText(startPosition, endPosition);
167         }
168
169         private static bool AccessibilityCutTextWrapper(IntPtr self, int startPosition, int endPosition)
170         {
171             return GetViewFromRefObject(self).AccessibilityCutText(startPosition, endPosition);
172         }
173
174         private static bool AccessibilityDeleteTextWrapper(IntPtr self, int startPosition, int endPosition)
175         {
176             return GetViewFromRefObject(self).AccessibilityDeleteText(startPosition, endPosition);
177         }
178
179         private static bool AccessibilityInsertTextWrapper(IntPtr self, int startPosition, IntPtr text)
180         {
181             return GetViewFromRefObject(self).AccessibilityInsertText(startPosition, Marshal.PtrToStringAnsi(text));
182         }
183
184         private static bool AccessibilitySetTextContentsWrapper(IntPtr self, IntPtr newContents)
185         {
186             return GetViewFromRefObject(self).AccessibilitySetTextContents(Marshal.PtrToStringAnsi(newContents));
187         }
188
189         //
190         // Selection interface
191         //
192
193         private static void InitializeAccessibilityDelegateSelectionInterface()
194         {
195             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
196
197             ad.ClearSelection           = AccessibilityClearSelectionWrapper;
198             ad.DeselectChild            = AccessibilityDeselectChildWrapper;
199             ad.DeselectSelectedChild    = AccessibilityDeselectSelectedChildWrapper;
200             ad.GetSelectedChild         = AccessibilityGetSelectedChildWrapper;
201             ad.GetSelectedChildrenCount = AccessibilityGetSelectedChildrenCountWrapper;
202             ad.IsChildSelected          = AccessibilityIsChildSelectedWrapper;
203             ad.SelectAll                = AccessibilitySelectAllWrapper;
204             ad.SelectChild              = AccessibilitySelectChildWrapper;
205         }
206
207         private static bool AccessibilityClearSelectionWrapper(IntPtr self)
208         {
209             return GetViewFromRefObject(self).AccessibilityClearSelection();
210         }
211
212         private static bool AccessibilityDeselectChildWrapper(IntPtr self, int childIndex)
213         {
214             return GetViewFromRefObject(self).AccessibilityDeselectChild(childIndex);
215         }
216
217         private static bool AccessibilityDeselectSelectedChildWrapper(IntPtr self, int selectedChildIndex)
218         {
219             return GetViewFromRefObject(self).AccessibilityDeselectSelectedChild(selectedChildIndex);
220         }
221
222         private static IntPtr AccessibilityGetSelectedChildWrapper(IntPtr self, int selectedChildIndex)
223         {
224             View child = GetViewFromRefObject(self).AccessibilityGetSelectedChild(selectedChildIndex);
225
226             return View.getCPtr(child).Handle;
227         }
228
229         private static int AccessibilityGetSelectedChildrenCountWrapper(IntPtr self)
230         {
231             return GetViewFromRefObject(self).AccessibilityGetSelectedChildrenCount();
232         }
233
234         private static bool AccessibilityIsChildSelectedWrapper(IntPtr self, int childIndex)
235         {
236             return GetViewFromRefObject(self).AccessibilityIsChildSelected(childIndex);
237         }
238
239         private static bool AccessibilitySelectAllWrapper(IntPtr self)
240         {
241             return GetViewFromRefObject(self).AccessibilitySelectAll();
242         }
243
244         private static bool AccessibilitySelectChildWrapper(IntPtr self, int childIndex)
245         {
246             return GetViewFromRefObject(self).AccessibilitySelectChild(childIndex);
247         }
248
249         //
250         // Text interface
251         //
252
253         private static void InitializeAccessibilityDelegateTextInterface()
254         {
255             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
256
257             ad.GetCharacterCount = AccessibilityGetCharacterCountWrapper;
258             ad.GetCursorOffset   = AccessibilityGetCursorOffsetWrapper;
259             ad.GetSelection      = AccessibilityGetSelectionWrapper;
260             ad.GetText           = AccessibilityGetTextWrapper;
261             ad.GetTextAtOffset   = AccessibilityGetTextAtOffsetWrapper;
262             ad.RemoveSelection   = AccessibilityRemoveSelectionWrapper;
263             ad.SetCursorOffset   = AccessibilitySetCursorOffsetWrapper;
264             ad.SetSelection      = AccessibilitySetSelectionWrapper;
265         }
266
267         private static int AccessibilityGetCharacterCountWrapper(IntPtr self)
268         {
269             return GetViewFromRefObject(self).AccessibilityGetCharacterCount();
270         }
271
272         private static int AccessibilityGetCursorOffsetWrapper(IntPtr self)
273         {
274             return GetViewFromRefObject(self).AccessibilityGetCursorOffset();
275         }
276
277         private static IntPtr AccessibilityGetSelectionWrapper(IntPtr self, int selectionNumber)
278         {
279             AccessibilityRange range = GetViewFromRefObject(self).AccessibilityGetSelection(selectionNumber);
280
281             return DuplicateAccessibilityRange(range);
282         }
283
284         private static IntPtr AccessibilityGetTextWrapper(IntPtr self, int startOffset, int endOffset)
285         {
286             string text = GetViewFromRefObject(self).AccessibilityGetText(startOffset, endOffset);
287
288             return DuplicateString(text);
289         }
290
291         private static IntPtr AccessibilityGetTextAtOffsetWrapper(IntPtr self, int offset, int boundary)
292         {
293             AccessibilityRange range = GetViewFromRefObject(self).AccessibilityGetTextAtOffset(offset, (AccessibilityTextBoundary)boundary);
294
295             return DuplicateAccessibilityRange(range);
296         }
297
298         private static bool AccessibilityRemoveSelectionWrapper(IntPtr self, int selectionNumber)
299         {
300             return GetViewFromRefObject(self).AccessibilityRemoveSelection(selectionNumber);
301         }
302
303         private static bool AccessibilitySetCursorOffsetWrapper(IntPtr self, int offset)
304         {
305             return GetViewFromRefObject(self).AccessibilitySetCursorOffset(offset);
306         }
307
308         private static bool AccessibilitySetSelectionWrapper(IntPtr self, int selectionNumber, int startOffset, int endOffset)
309         {
310             return GetViewFromRefObject(self).AccessibilitySetSelection(selectionNumber, startOffset, endOffset);
311         }
312
313         //
314         // Value interface
315         //
316
317         private static void InitializeAccessibilityDelegateValueInterface()
318         {
319             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
320
321             ad.GetCurrent          = AccessibilityGetCurrentWrapper;
322             ad.GetMaximum          = AccessibilityGetMaximumWrapper;
323             ad.GetMinimum          = AccessibilityGetMinimumWrapper;
324             ad.GetMinimumIncrement = AccessibilityGetMinimumIncrementWrapper;
325             ad.SetCurrent          = AccessibilitySetCurrentWrapper;
326         }
327
328         private static double AccessibilityGetCurrentWrapper(IntPtr self)
329         {
330             return GetViewFromRefObject(self).AccessibilityGetCurrent();
331         }
332
333         private static double AccessibilityGetMaximumWrapper(IntPtr self)
334         {
335             return GetViewFromRefObject(self).AccessibilityGetMaximum();
336         }
337
338         private static double AccessibilityGetMinimumWrapper(IntPtr self)
339         {
340             return GetViewFromRefObject(self).AccessibilityGetMinimum();
341         }
342
343         private static double AccessibilityGetMinimumIncrementWrapper(IntPtr self)
344         {
345             return GetViewFromRefObject(self).AccessibilityGetMinimumIncrement();
346         }
347
348         private static bool AccessibilitySetCurrentWrapper(IntPtr self, double value)
349         {
350             return GetViewFromRefObject(self).AccessibilitySetCurrent(value);
351         }
352
353         //
354         // Tizen extensions
355         //
356
357         private static void InitializeAccessibilityDelegateTizenExtensions()
358         {
359             var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
360
361             ad.ScrollToChild            = AccessibilityScrollToChildWrapper;
362             ad.ShouldReportZeroChildren = AccessibilityShouldReportZeroChildrenWrapper;
363         }
364
365         private static bool AccessibilityScrollToChildWrapper(IntPtr self, IntPtr child)
366         {
367             View view = GetViewFromRefObject(self);
368
369             return view.AccessibilityScrollToChild(view.GetInstanceSafely<View>(child));
370         }
371
372         private static bool AccessibilityShouldReportZeroChildrenWrapper(IntPtr self)
373         {
374             return GetViewFromRefObject(self).AccessibilityShouldReportZeroChildren();
375         }
376     }
377 }