2 * Copyright(c) 2022 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 using System.Runtime.InteropServices;
21 namespace Tizen.NUI.BaseComponents
23 public partial class View
25 private static AccessibilityStates AccessibilityInitialStates = new AccessibilityStates();
27 private static void RegisterAccessibilityDelegate()
29 InitializeAccessibilityDelegateAccessibleInterface();
30 InitializeAccessibilityDelegateActionInterface();
31 InitializeAccessibilityDelegateComponentInterface();
32 InitializeAccessibilityDelegateEditableTextInterface();
33 InitializeAccessibilityDelegateSelectionInterface();
34 InitializeAccessibilityDelegateTextInterface();
35 InitializeAccessibilityDelegateValueInterface();
36 InitializeAccessibilityDelegateTizenExtensions();
38 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
39 var size = Marshal.SizeOf<Interop.ControlDevel.AccessibilityDelegate>();
40 var ptr = Marshal.AllocHGlobal(size);
42 Marshal.StructureToPtr(ad, ptr, false);
43 Interop.ControlDevel.DaliAccessibilitySetAccessibilityDelegate(ptr, size);
46 private static View GetViewFromRefObject(IntPtr refObjectPtr)
48 return Registry.GetManagedBaseHandleFromRefObject(refObjectPtr) as View;
51 private static IntPtr DuplicateString(string value)
53 return Interop.ControlDevel.DaliAccessibilityDuplicateString(value ?? "");
56 private static IntPtr DuplicateAccessibilityRange(AccessibilityRange range)
58 return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
62 // Accessible interface
65 private static void InitializeAccessibilityDelegateAccessibleInterface()
67 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
69 ad.CalculateStates = AccessibilityCalculateStatesWrapper;
70 ad.GetDescription = AccessibilityGetDescriptionWrapper;
71 ad.GetName = AccessibilityGetNameWrapper;
74 private static ulong AccessibilityCalculateStatesWrapper(IntPtr self, ulong initialStates)
76 View view = GetViewFromRefObject(self);
79 lock (AccessibilityInitialStates)
81 AccessibilityInitialStates.BitMask = initialStates;
82 bitMask = view.AccessibilityCalculateStates().BitMask;
83 AccessibilityInitialStates.BitMask = 0UL;
89 private static IntPtr AccessibilityGetDescriptionWrapper(IntPtr self)
91 string description = GetViewFromRefObject(self).AccessibilityGetDescription();
93 return DuplicateString(description);
96 private static IntPtr AccessibilityGetNameWrapper(IntPtr self)
98 string name = GetViewFromRefObject(self).AccessibilityGetName();
100 return DuplicateString(name);
107 private static void InitializeAccessibilityDelegateActionInterface()
109 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
111 ad.DoAction = AccessibilityDoActionWrapper;
112 ad.GetActionCount = AccessibilityGetActionCountWrapper;
113 ad.GetActionName = AccessibilityGetActionNameWrapper;
116 private static bool AccessibilityDoActionWrapper(IntPtr self, IntPtr name)
118 return GetViewFromRefObject(self).AccessibilityDoAction(Marshal.PtrToStringAnsi(name));
121 private static int AccessibilityGetActionCountWrapper(IntPtr self)
123 return GetViewFromRefObject(self).AccessibilityGetActionCount();
126 private static IntPtr AccessibilityGetActionNameWrapper(IntPtr self, int index)
128 string name = GetViewFromRefObject(self).AccessibilityGetActionName(index);
130 return DuplicateString(name);
134 // Component interface
137 private static void InitializeAccessibilityDelegateComponentInterface()
139 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
141 ad.IsScrollable = AccessibilityIsScrollableWrapper;
144 private static bool AccessibilityIsScrollableWrapper(IntPtr self)
146 return GetViewFromRefObject(self).AccessibilityIsScrollable();
150 // EditableText interface
153 private static void InitializeAccessibilityDelegateEditableTextInterface()
155 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
157 ad.CopyText = AccessibilityCopyTextWrapper;
158 ad.CutText = AccessibilityCutTextWrapper;
159 ad.DeleteText = AccessibilityDeleteTextWrapper;
160 ad.InsertText = AccessibilityInsertTextWrapper;
161 ad.SetTextContents = AccessibilitySetTextContentsWrapper;
164 private static bool AccessibilityCopyTextWrapper(IntPtr self, int startPosition, int endPosition)
166 return GetViewFromRefObject(self).AccessibilityCopyText(startPosition, endPosition);
169 private static bool AccessibilityCutTextWrapper(IntPtr self, int startPosition, int endPosition)
171 return GetViewFromRefObject(self).AccessibilityCutText(startPosition, endPosition);
174 private static bool AccessibilityDeleteTextWrapper(IntPtr self, int startPosition, int endPosition)
176 return GetViewFromRefObject(self).AccessibilityDeleteText(startPosition, endPosition);
179 private static bool AccessibilityInsertTextWrapper(IntPtr self, int startPosition, IntPtr text)
181 return GetViewFromRefObject(self).AccessibilityInsertText(startPosition, Marshal.PtrToStringAnsi(text));
184 private static bool AccessibilitySetTextContentsWrapper(IntPtr self, IntPtr newContents)
186 return GetViewFromRefObject(self).AccessibilitySetTextContents(Marshal.PtrToStringAnsi(newContents));
190 // Selection interface
193 private static void InitializeAccessibilityDelegateSelectionInterface()
195 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
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;
207 private static bool AccessibilityClearSelectionWrapper(IntPtr self)
209 return GetViewFromRefObject(self).AccessibilityClearSelection();
212 private static bool AccessibilityDeselectChildWrapper(IntPtr self, int childIndex)
214 return GetViewFromRefObject(self).AccessibilityDeselectChild(childIndex);
217 private static bool AccessibilityDeselectSelectedChildWrapper(IntPtr self, int selectedChildIndex)
219 return GetViewFromRefObject(self).AccessibilityDeselectSelectedChild(selectedChildIndex);
222 private static IntPtr AccessibilityGetSelectedChildWrapper(IntPtr self, int selectedChildIndex)
224 View child = GetViewFromRefObject(self).AccessibilityGetSelectedChild(selectedChildIndex);
226 return View.getCPtr(child).Handle;
229 private static int AccessibilityGetSelectedChildrenCountWrapper(IntPtr self)
231 return GetViewFromRefObject(self).AccessibilityGetSelectedChildrenCount();
234 private static bool AccessibilityIsChildSelectedWrapper(IntPtr self, int childIndex)
236 return GetViewFromRefObject(self).AccessibilityIsChildSelected(childIndex);
239 private static bool AccessibilitySelectAllWrapper(IntPtr self)
241 return GetViewFromRefObject(self).AccessibilitySelectAll();
244 private static bool AccessibilitySelectChildWrapper(IntPtr self, int childIndex)
246 return GetViewFromRefObject(self).AccessibilitySelectChild(childIndex);
253 private static void InitializeAccessibilityDelegateTextInterface()
255 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
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;
267 private static int AccessibilityGetCharacterCountWrapper(IntPtr self)
269 return GetViewFromRefObject(self).AccessibilityGetCharacterCount();
272 private static int AccessibilityGetCursorOffsetWrapper(IntPtr self)
274 return GetViewFromRefObject(self).AccessibilityGetCursorOffset();
277 private static IntPtr AccessibilityGetSelectionWrapper(IntPtr self, int selectionNumber)
279 AccessibilityRange range = GetViewFromRefObject(self).AccessibilityGetSelection(selectionNumber);
281 return DuplicateAccessibilityRange(range);
284 private static IntPtr AccessibilityGetTextWrapper(IntPtr self, int startOffset, int endOffset)
286 string text = GetViewFromRefObject(self).AccessibilityGetText(startOffset, endOffset);
288 return DuplicateString(text);
291 private static IntPtr AccessibilityGetTextAtOffsetWrapper(IntPtr self, int offset, int boundary)
293 AccessibilityRange range = GetViewFromRefObject(self).AccessibilityGetTextAtOffset(offset, (AccessibilityTextBoundary)boundary);
295 return DuplicateAccessibilityRange(range);
298 private static bool AccessibilityRemoveSelectionWrapper(IntPtr self, int selectionNumber)
300 return GetViewFromRefObject(self).AccessibilityRemoveSelection(selectionNumber);
303 private static bool AccessibilitySetCursorOffsetWrapper(IntPtr self, int offset)
305 return GetViewFromRefObject(self).AccessibilitySetCursorOffset(offset);
308 private static bool AccessibilitySetSelectionWrapper(IntPtr self, int selectionNumber, int startOffset, int endOffset)
310 return GetViewFromRefObject(self).AccessibilitySetSelection(selectionNumber, startOffset, endOffset);
317 private static void InitializeAccessibilityDelegateValueInterface()
319 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
321 ad.GetCurrent = AccessibilityGetCurrentWrapper;
322 ad.GetMaximum = AccessibilityGetMaximumWrapper;
323 ad.GetMinimum = AccessibilityGetMinimumWrapper;
324 ad.GetMinimumIncrement = AccessibilityGetMinimumIncrementWrapper;
325 ad.SetCurrent = AccessibilitySetCurrentWrapper;
328 private static double AccessibilityGetCurrentWrapper(IntPtr self)
330 return GetViewFromRefObject(self).AccessibilityGetCurrent();
333 private static double AccessibilityGetMaximumWrapper(IntPtr self)
335 return GetViewFromRefObject(self).AccessibilityGetMaximum();
338 private static double AccessibilityGetMinimumWrapper(IntPtr self)
340 return GetViewFromRefObject(self).AccessibilityGetMinimum();
343 private static double AccessibilityGetMinimumIncrementWrapper(IntPtr self)
345 return GetViewFromRefObject(self).AccessibilityGetMinimumIncrement();
348 private static bool AccessibilitySetCurrentWrapper(IntPtr self, double value)
350 return GetViewFromRefObject(self).AccessibilitySetCurrent(value);
357 private static void InitializeAccessibilityDelegateTizenExtensions()
359 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
361 ad.ScrollToChild = AccessibilityScrollToChildWrapper;
362 ad.ShouldReportZeroChildren = AccessibilityShouldReportZeroChildrenWrapper;
365 private static bool AccessibilityScrollToChildWrapper(IntPtr self, IntPtr child)
367 View view = GetViewFromRefObject(self);
369 return view.AccessibilityScrollToChild(view.GetInstanceSafely<View>(child));
372 private static bool AccessibilityShouldReportZeroChildrenWrapper(IntPtr self)
374 return GetViewFromRefObject(self).AccessibilityShouldReportZeroChildren();