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.Collections.Generic;
20 using System.Runtime.InteropServices;
21 using Tizen.NUI.Accessibility;
23 namespace Tizen.NUI.BaseComponents
25 public partial class View
27 private static AccessibilityStates AccessibilityInitialStates = new AccessibilityStates();
29 private static void RegisterAccessibilityDelegate()
31 InitializeAccessibilityDelegateAccessibleInterface();
32 InitializeAccessibilityDelegateActionInterface();
33 InitializeAccessibilityDelegateComponentInterface();
34 InitializeAccessibilityDelegateEditableTextInterface();
35 InitializeAccessibilityDelegateSelectionInterface();
36 InitializeAccessibilityDelegateTableInterface();
37 InitializeAccessibilityDelegateTableCellInterface();
38 InitializeAccessibilityDelegateTextInterface();
39 InitializeAccessibilityDelegateValueInterface();
40 InitializeAccessibilityDelegateTizenExtensions();
42 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
43 var size = Marshal.SizeOf<Interop.ControlDevel.AccessibilityDelegate>();
44 var ptr = Marshal.AllocHGlobal(size);
46 Marshal.StructureToPtr(ad, ptr, false);
47 Interop.ControlDevel.DaliAccessibilitySetAccessibilityDelegate(ptr, Convert.ToUInt32(size));
50 private static View GetViewFromRefObject(IntPtr refObjectPtr)
52 View view = Registry.GetManagedBaseHandleFromRefObject(refObjectPtr) as View;
56 throw new ArgumentException($"RefObject 0x{refObjectPtr:x} is not a View", nameof(refObjectPtr));
62 private static T GetInterfaceFromRefObject<T>(IntPtr refObjectPtr)
64 var view = GetViewFromRefObject(refObjectPtr);
66 // NUIViewAccessible::CallMethod<T> checks whether a given interface is implemented
67 // before jumping to managed code, so this condition should always be true.
68 if (view is T atspiInterface)
70 return atspiInterface;
73 throw new ArgumentException($"RefObject 0x{refObjectPtr:x} is not a {typeof(T).FullName}", nameof(refObjectPtr));
76 private static IntPtr DuplicateString(string value)
78 return Interop.ControlDevel.DaliAccessibilityDuplicateString(value ?? "");
81 private static IntPtr DuplicateAccessibilityRange(AccessibilityRange range)
83 return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
86 private static IntPtr DuplicateAccessibilityRectangle(Rectangle rect)
88 return Interop.Rectangle.NewRectangle(rect.X, rect.Y, rect.Width, rect.Height);
91 private static IntPtr DuplicateIntPair(Tuple<int, int> pair)
93 return Interop.ControlDevel.DaliAccessibilityMakeIntPair(pair.Item1, pair.Item2);
97 // Accessible interface
100 private static void InitializeAccessibilityDelegateAccessibleInterface()
102 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
104 ad.CalculateStates = AccessibilityCalculateStatesWrapper;
105 ad.GetAttributes = AccessibilityGetAttributes; // Not a wrapper, entirely private implementation
106 ad.GetDescription = AccessibilityGetDescriptionWrapper;
107 ad.GetInterfaces = AccessibilityGetInterfaces; // Not a wrapper, entirely private implementation
108 ad.GetName = AccessibilityGetNameWrapper;
111 private static ulong AccessibilityCalculateStatesWrapper(IntPtr self, ulong initialStates)
113 View view = GetViewFromRefObject(self);
117 lock (AccessibilityInitialStates)
119 AccessibilityInitialStates.BitMask = initialStates;
120 bitMask = view.AccessibilityCalculateStates().BitMask;
121 AccessibilityInitialStates.BitMask = 0UL;
127 private static void AccessibilityGetAttributes(IntPtr self, Interop.ControlDevel.AccessibilityDelegate.AccessibilityGetAttributesCallback callback, IntPtr userData)
129 var view = GetViewFromRefObject(self);
130 var attributes = view.AccessibilityAttributes;
131 var classKey = "class";
133 if (!attributes.ContainsKey(classKey))
135 attributes[classKey] = view.GetType().Name;
138 foreach (var attribute in attributes)
140 callback(attribute.Key, attribute.Value, userData);
143 foreach (var attribute in view.AccessibilityDynamicAttributes)
145 callback(attribute.Key, attribute.Value.Invoke(), userData);
149 private static IntPtr AccessibilityGetDescriptionWrapper(IntPtr self)
151 string description = GetViewFromRefObject(self).AccessibilityGetDescription();
153 return DuplicateString(description);
156 private static uint AccessibilityGetInterfaces(IntPtr self)
158 View view = GetViewFromRefObject(self);
161 if (view is IAtspiEditableText)
163 flags |= (1U << (int)AccessibilityInterface.EditableText);
166 if (view is IAtspiSelection)
168 flags |= (1U << (int)AccessibilityInterface.Selection);
171 if (view is IAtspiTable)
173 flags |= (1U << (int)AccessibilityInterface.Table);
176 if (view is IAtspiTableCell)
178 flags |= (1U << (int)AccessibilityInterface.TableCell);
181 if (view is IAtspiText)
183 flags |= (1U << (int)AccessibilityInterface.Text);
186 if (view is IAtspiValue)
188 flags |= (1U << (int)AccessibilityInterface.Value);
194 private static IntPtr AccessibilityGetNameWrapper(IntPtr self)
196 string name = GetViewFromRefObject(self).AccessibilityGetName();
198 return DuplicateString(name);
205 private static void InitializeAccessibilityDelegateActionInterface()
207 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
209 ad.DoAction = AccessibilityDoActionWrapper;
210 ad.GetActionCount = AccessibilityGetActionCountWrapper;
211 ad.GetActionName = AccessibilityGetActionNameWrapper;
214 private static bool AccessibilityDoActionWrapper(IntPtr self, IntPtr name)
216 return GetViewFromRefObject(self).AccessibilityDoAction(Marshal.PtrToStringAnsi(name));
219 private static int AccessibilityGetActionCountWrapper(IntPtr self)
221 return GetViewFromRefObject(self).AccessibilityGetActionCount();
224 private static IntPtr AccessibilityGetActionNameWrapper(IntPtr self, int index)
226 string name = GetViewFromRefObject(self).AccessibilityGetActionName(index);
228 return DuplicateString(name);
232 // Component interface
235 private static void InitializeAccessibilityDelegateComponentInterface()
237 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
239 ad.IsScrollable = AccessibilityIsScrollableWrapper;
242 private static bool AccessibilityIsScrollableWrapper(IntPtr self)
244 return GetViewFromRefObject(self).AccessibilityIsScrollable();
248 // EditableText interface
251 private static void InitializeAccessibilityDelegateEditableTextInterface()
253 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
255 ad.CopyText = AccessibilityCopyTextWrapper;
256 ad.CutText = AccessibilityCutTextWrapper;
257 ad.DeleteText = AccessibilityDeleteTextWrapper;
258 ad.InsertText = AccessibilityInsertTextWrapper;
259 ad.SetTextContents = AccessibilitySetTextContentsWrapper;
262 private static bool AccessibilityCopyTextWrapper(IntPtr self, int startPosition, int endPosition)
264 return GetInterfaceFromRefObject<IAtspiEditableText>(self).AccessibilityCopyText(startPosition, endPosition);
267 private static bool AccessibilityCutTextWrapper(IntPtr self, int startPosition, int endPosition)
269 return GetInterfaceFromRefObject<IAtspiEditableText>(self).AccessibilityCutText(startPosition, endPosition);
272 private static bool AccessibilityDeleteTextWrapper(IntPtr self, int startPosition, int endPosition)
274 return GetInterfaceFromRefObject<IAtspiEditableText>(self).AccessibilityDeleteText(startPosition, endPosition);
277 private static bool AccessibilityInsertTextWrapper(IntPtr self, int startPosition, IntPtr text)
279 return GetInterfaceFromRefObject<IAtspiEditableText>(self).AccessibilityInsertText(startPosition, Marshal.PtrToStringAnsi(text));
282 private static bool AccessibilitySetTextContentsWrapper(IntPtr self, IntPtr newContents)
284 return GetInterfaceFromRefObject<IAtspiEditableText>(self).AccessibilitySetTextContents(Marshal.PtrToStringAnsi(newContents));
288 // Selection interface
291 private static void InitializeAccessibilityDelegateSelectionInterface()
293 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
295 ad.ClearSelection = AccessibilityClearSelectionWrapper;
296 ad.DeselectChild = AccessibilityDeselectChildWrapper;
297 ad.DeselectSelectedChild = AccessibilityDeselectSelectedChildWrapper;
298 ad.GetSelectedChild = AccessibilityGetSelectedChildWrapper;
299 ad.GetSelectedChildrenCount = AccessibilityGetSelectedChildrenCountWrapper;
300 ad.IsChildSelected = AccessibilityIsChildSelectedWrapper;
301 ad.SelectAll = AccessibilitySelectAllWrapper;
302 ad.SelectChild = AccessibilitySelectChildWrapper;
305 private static bool AccessibilityClearSelectionWrapper(IntPtr self)
307 return GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilityClearSelection();
310 private static bool AccessibilityDeselectChildWrapper(IntPtr self, int childIndex)
312 return GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilityDeselectChild(childIndex);
315 private static bool AccessibilityDeselectSelectedChildWrapper(IntPtr self, int selectedChildIndex)
317 return GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilityDeselectSelectedChild(selectedChildIndex);
320 private static IntPtr AccessibilityGetSelectedChildWrapper(IntPtr self, int selectedChildIndex)
322 View child = GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilityGetSelectedChild(selectedChildIndex);
324 return View.getCPtr(child).Handle;
327 private static int AccessibilityGetSelectedChildrenCountWrapper(IntPtr self)
329 return GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilityGetSelectedChildrenCount();
332 private static bool AccessibilityIsChildSelectedWrapper(IntPtr self, int childIndex)
334 return GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilityIsChildSelected(childIndex);
337 private static bool AccessibilitySelectAllWrapper(IntPtr self)
339 return GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilitySelectAll();
342 private static bool AccessibilitySelectChildWrapper(IntPtr self, int childIndex)
344 return GetInterfaceFromRefObject<IAtspiSelection>(self).AccessibilitySelectChild(childIndex);
351 private static void InitializeAccessibilityDelegateTableInterface()
353 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
355 ad.AddColumnSelection = AccessibilityAddColumnSelectionWrapper;
356 ad.AddRowSelection = AccessibilityAddRowSelectionWrapper;
357 ad.GetCaption = AccessibilityGetCaptionWrapper;
358 ad.GetCell = AccessibilityGetCellWrapper;
359 ad.GetChildIndex = AccessibilityGetChildIndexWrapper;
360 ad.GetColumnCount = AccessibilityGetColumnCountWrapper;
361 ad.GetColumnDescription = AccessibilityGetColumnDescriptionWrapper;
362 ad.GetColumnHeader = AccessibilityGetColumnHeaderWrapper;
363 ad.GetPositionByChildIndex = AccessibilityGetPositionByChildIndexWrapper;
364 ad.GetRowCount = AccessibilityGetRowCountWrapper;
365 ad.GetRowDescription = AccessibilityGetRowDescriptionWrapper;
366 ad.GetRowHeader = AccessibilityGetRowHeaderWrapper;
367 ad.GetSelectedColumnCount = AccessibilityGetSelectedColumnCountWrapper;
368 ad.GetSelectedColumns = AccessibilityGetSelectedColumnsWrapper;
369 ad.GetSelectedRowCount = AccessibilityGetSelectedRowCountWrapper;
370 ad.GetSelectedRows = AccessibilityGetSelectedRowsWrapper;
371 ad.GetSummary = AccessibilityGetSummaryWrapper;
372 ad.IsCellSelected = AccessibilityIsCellSelectedWrapper;
373 ad.IsColumnSelected = AccessibilityIsColumnSelectedWrapper;
374 ad.IsRowSelected = AccessibilityIsRowSelectedWrapper;
375 ad.RemoveColumnSelection = AccessibilityRemoveColumnSelectionWrapper;
376 ad.RemoveRowSelection = AccessibilityRemoveRowSelectionWrapper;
379 private static bool AccessibilityAddColumnSelectionWrapper(IntPtr self, int column)
381 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityAddColumnSelection(column);
384 private static bool AccessibilityAddRowSelectionWrapper(IntPtr self, int row)
386 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityAddRowSelection(row);
389 private static IntPtr AccessibilityGetCaptionWrapper(IntPtr self)
391 View caption = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetCaption();
393 return View.getCPtr(caption).Handle;
396 private static IntPtr AccessibilityGetCellWrapper(IntPtr self, int row, int column)
398 IAtspiTableCell cell = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetCell(row, column);
400 if (cell is View view)
402 return View.getCPtr(view).Handle;
405 NUILog.Error("Cannot get Actor handle from IAtspiTableCell");
410 private static ulong AccessibilityGetChildIndexWrapper(IntPtr self, int row, int column)
412 return (ulong)GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetChildIndex(row, column);
415 private static int AccessibilityGetColumnCountWrapper(IntPtr self)
417 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetColumnCount();
420 private static IntPtr AccessibilityGetColumnDescriptionWrapper(IntPtr self, int column)
422 string description = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetColumnDescription(column);
424 return DuplicateString(description);
427 private static IntPtr AccessibilityGetColumnHeaderWrapper(IntPtr self, int column)
429 View header = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetColumnHeader(column);
431 return View.getCPtr(header).Handle;
434 private static IntPtr AccessibilityGetPositionByChildIndexWrapper(IntPtr self, ulong childIndex)
436 Tuple<int, int> position = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetPositionByChildIndex((int)childIndex);
438 return DuplicateIntPair(position);
441 private static int AccessibilityGetRowCountWrapper(IntPtr self)
443 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetRowCount();
446 private static IntPtr AccessibilityGetRowDescriptionWrapper(IntPtr self, int row)
448 string description = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetRowDescription(row);
450 return DuplicateString(description);
453 private static IntPtr AccessibilityGetRowHeaderWrapper(IntPtr self, int row)
455 View header = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetRowHeader(row);
457 return View.getCPtr(header).Handle;
460 private static int AccessibilityGetSelectedColumnCountWrapper(IntPtr self)
462 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetSelectedColumnCount();
465 private static void AccessibilityGetSelectedColumnsWrapper(IntPtr self, Interop.ControlDevel.AccessibilityDelegate.AccessibilityGetSelectedRowsColumnsCallback callback, IntPtr userData)
467 IEnumerable<int> columns = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetSelectedColumns();
469 foreach (int column in columns)
471 callback(column, userData);
475 private static int AccessibilityGetSelectedRowCountWrapper(IntPtr self)
477 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetSelectedRowCount();
480 private static void AccessibilityGetSelectedRowsWrapper(IntPtr self, Interop.ControlDevel.AccessibilityDelegate.AccessibilityGetSelectedRowsColumnsCallback callback, IntPtr userData)
482 IEnumerable<int> rows = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetSelectedRows();
484 foreach (int row in rows)
486 callback(row, userData);
490 private static IntPtr AccessibilityGetSummaryWrapper(IntPtr self)
492 View summary = GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityGetSummary();
494 return View.getCPtr(summary).Handle;
497 private static bool AccessibilityIsCellSelectedWrapper(IntPtr self, int row, int column)
499 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityIsCellSelected(row, column);
502 private static bool AccessibilityIsColumnSelectedWrapper(IntPtr self, int column)
504 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityIsColumnSelected(column);
507 private static bool AccessibilityIsRowSelectedWrapper(IntPtr self, int row)
509 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityIsRowSelected(row);
512 private static bool AccessibilityRemoveColumnSelectionWrapper(IntPtr self, int column)
514 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityRemoveColumnSelection(column);
517 private static bool AccessibilityRemoveRowSelectionWrapper(IntPtr self, int row)
519 return GetInterfaceFromRefObject<IAtspiTable>(self).AccessibilityRemoveRowSelection(row);
523 // TableCell interface
526 private static void InitializeAccessibilityDelegateTableCellInterface()
528 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
530 ad.GetCellColumnSpan = AccessibilityGetCellColumnSpanWrapper;
531 ad.GetCellPosition = AccessibilityGetCellPositionWrapper;
532 ad.GetCellRowSpan = AccessibilityGetCellRowSpanWrapper;
533 ad.GetTable = AccessibilityGetTableWrapper;
536 private static int AccessibilityGetCellColumnSpanWrapper(IntPtr self)
538 return GetInterfaceFromRefObject<IAtspiTableCell>(self).AccessibilityGetCellColumnSpan();
541 private static IntPtr AccessibilityGetCellPositionWrapper(IntPtr self)
543 Tuple<int, int> position = GetInterfaceFromRefObject<IAtspiTableCell>(self).AccessibilityGetCellPosition();
545 return DuplicateIntPair(position);
548 private static int AccessibilityGetCellRowSpanWrapper(IntPtr self)
550 return GetInterfaceFromRefObject<IAtspiTableCell>(self).AccessibilityGetCellRowSpan();
553 private static IntPtr AccessibilityGetTableWrapper(IntPtr self)
555 IAtspiTable table = GetInterfaceFromRefObject<IAtspiTableCell>(self).AccessibilityGetTable();
557 if (table is View view)
559 return View.getCPtr(view).Handle;
562 NUILog.Error("Cannot get Actor handle from IAtspiTable");
571 private static void InitializeAccessibilityDelegateTextInterface()
573 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
575 ad.GetCharacterCount = AccessibilityGetCharacterCountWrapper;
576 ad.GetCursorOffset = AccessibilityGetCursorOffsetWrapper;
577 ad.GetRangeExtents = AccessibilityGetRangeExtentsWrapper;
578 ad.GetSelection = AccessibilityGetSelectionWrapper;
579 ad.GetText = AccessibilityGetTextWrapper;
580 ad.GetTextAtOffset = AccessibilityGetTextAtOffsetWrapper;
581 ad.RemoveSelection = AccessibilityRemoveSelectionWrapper;
582 ad.SetCursorOffset = AccessibilitySetCursorOffsetWrapper;
583 ad.SetSelection = AccessibilitySetSelectionWrapper;
586 private static int AccessibilityGetCharacterCountWrapper(IntPtr self)
588 return GetInterfaceFromRefObject<IAtspiText>(self).AccessibilityGetCharacterCount();
591 private static int AccessibilityGetCursorOffsetWrapper(IntPtr self)
593 return GetInterfaceFromRefObject<IAtspiText>(self).AccessibilityGetCursorOffset();
596 private static IntPtr AccessibilityGetRangeExtentsWrapper(IntPtr self, int startOffset, int endOffset, int coordType)
598 using Rectangle rect = GetInterfaceFromRefObject<IAtspiText>(self).AccessibilityGetRangeExtents(startOffset, endOffset, (AccessibilityCoordinateType)coordType);
600 return DuplicateAccessibilityRectangle(rect);
603 private static IntPtr AccessibilityGetSelectionWrapper(IntPtr self, int selectionNumber)
605 AccessibilityRange range = GetInterfaceFromRefObject<IAtspiText>(self).AccessibilityGetSelection(selectionNumber);
607 return DuplicateAccessibilityRange(range);
610 private static IntPtr AccessibilityGetTextWrapper(IntPtr self, int startOffset, int endOffset)
612 string text = GetInterfaceFromRefObject<IAtspiText>(self).AccessibilityGetText(startOffset, endOffset);
614 return DuplicateString(text);
617 private static IntPtr AccessibilityGetTextAtOffsetWrapper(IntPtr self, int offset, int boundary)
619 AccessibilityRange range = GetInterfaceFromRefObject<IAtspiText>(self).AccessibilityGetTextAtOffset(offset, (AccessibilityTextBoundary)boundary);
621 return DuplicateAccessibilityRange(range);
624 private static bool AccessibilityRemoveSelectionWrapper(IntPtr self, int selectionNumber)
626 return GetInterfaceFromRefObject<IAtspiText>(self).AccessibilityRemoveSelection(selectionNumber);
629 private static bool AccessibilitySetCursorOffsetWrapper(IntPtr self, int offset)
631 return GetInterfaceFromRefObject<IAtspiText>(self).AccessibilitySetCursorOffset(offset);
634 private static bool AccessibilitySetSelectionWrapper(IntPtr self, int selectionNumber, int startOffset, int endOffset)
636 return GetInterfaceFromRefObject<IAtspiText>(self).AccessibilitySetSelection(selectionNumber, startOffset, endOffset);
643 private static void InitializeAccessibilityDelegateValueInterface()
645 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
647 ad.GetCurrent = AccessibilityGetCurrentWrapper;
648 ad.GetMaximum = AccessibilityGetMaximumWrapper;
649 ad.GetMinimum = AccessibilityGetMinimumWrapper;
650 ad.GetMinimumIncrement = AccessibilityGetMinimumIncrementWrapper;
651 ad.GetValueText = AccessibilityGetValueTextWrapper;
652 ad.SetCurrent = AccessibilitySetCurrentWrapper;
655 private static double AccessibilityGetCurrentWrapper(IntPtr self)
657 return GetInterfaceFromRefObject<IAtspiValue>(self).AccessibilityGetCurrent();
660 private static double AccessibilityGetMaximumWrapper(IntPtr self)
662 return GetInterfaceFromRefObject<IAtspiValue>(self).AccessibilityGetMaximum();
665 private static double AccessibilityGetMinimumWrapper(IntPtr self)
667 return GetInterfaceFromRefObject<IAtspiValue>(self).AccessibilityGetMinimum();
670 private static double AccessibilityGetMinimumIncrementWrapper(IntPtr self)
672 return GetInterfaceFromRefObject<IAtspiValue>(self).AccessibilityGetMinimumIncrement();
675 private static IntPtr AccessibilityGetValueTextWrapper(IntPtr self)
677 var view = GetViewFromRefObject(self);
678 var value = GetInterfaceFromRefObject<IAtspiValue>(self);
681 // Mimic the behaviour of the pairs AccessibilityNameRequested & AccessibilityGetName(),
682 // and AccessibilityDescriptionRequested & AccessibilityGetDescription(),
683 // i.e. a higher-priority Accessibility[…]Requested event for application developers,
684 // and a lower-priority AccessibilityGet[…]() virtual method for component developers.
685 // The difference is that event-or-virtual-method dispatching is done in C++ for
686 // Name and Description, and here in this wrapper method for ValueText (because there
687 // is no signal for ValueText in DALi.)
688 if (view.AccessibilityValueTextRequested?.GetInvocationList().Length > 0)
690 var args = new AccessibilityValueTextRequestedEventArgs();
691 view.AccessibilityValueTextRequested.Invoke(view, args);
696 text = value.AccessibilityGetValueText();
699 return DuplicateString(text);
702 private static bool AccessibilitySetCurrentWrapper(IntPtr self, double value)
704 return GetInterfaceFromRefObject<IAtspiValue>(self).AccessibilitySetCurrent(value);
711 private static void InitializeAccessibilityDelegateTizenExtensions()
713 var ad = Interop.ControlDevel.AccessibilityDelegate.Instance;
715 ad.ScrollToChild = AccessibilityScrollToChildWrapper;
718 private static bool AccessibilityScrollToChildWrapper(IntPtr self, IntPtr child)
720 View view = GetViewFromRefObject(self);
722 return view.AccessibilityScrollToChild(view.GetInstanceSafely<View>(child));