[ATSPI] Fix for DefaultLabel
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / BaseComponents / ViewAccessibility.cs
1 /*
2  * Copyright(c) 2021 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.ComponentModel;
20 using System.Runtime.InteropServices;
21 using Tizen.NUI;
22
23 namespace Tizen.NUI.BaseComponents
24 {
25     /// <summary>
26     /// Address represents an unique object address on accessibility bus.
27     /// </summary>
28     [EditorBrowsable(EditorBrowsableState.Never)]
29     public class Address
30     {
31         /// <summary>
32         /// Creates an initialized Address.
33         /// </summary>
34         /// <param name="bus">Accessibility bus</param>
35         /// <param name="path">Accessibility path</param>
36         [EditorBrowsable(EditorBrowsableState.Never)]
37         public Address(string bus, string path)
38         {
39             Bus = bus;
40             Path = path;
41         }
42
43         /// <summary>
44         /// Gets or sets accessibility bus.
45         /// </summary>
46         [EditorBrowsable(EditorBrowsableState.Never)]
47         public string Bus { get; set; }
48
49         /// <summary>
50         /// Gets or sets accessibility path.
51         /// </summary>
52         [EditorBrowsable(EditorBrowsableState.Never)]
53         public string Path { get; set; }
54     }
55
56     /// <summary>
57     /// AddressCollection.
58     /// </summary>
59     [EditorBrowsable(EditorBrowsableState.Never)]
60     public class AddressCollection : SafeHandle
61     {
62         /// <summary>
63         /// Creates an initialized AddressCollection.
64         /// </summary>
65         /// <param name="collection">Initialized AddressCollection</param>
66         [EditorBrowsable(EditorBrowsableState.Never)]
67         public AddressCollection(IntPtr collection) : base(collection, true)
68         {
69         }
70
71         /// <summary>
72         /// Checks whether this handle is invalid or not.
73         /// </summary>
74         [EditorBrowsable(EditorBrowsableState.Never)]
75         public override bool IsInvalid
76         {
77             get
78             {
79                 return this.handle == IntPtr.Zero;
80             }
81         }
82
83         /// <summary>
84         /// Gets the size of accessibility relation.
85         /// </summary>
86         /// <param name="relation">Accessibility relation</param>
87         /// <returns>The size of relation, which means the number of elements</returns>
88         [EditorBrowsable(EditorBrowsableState.Never)]
89         public uint GetRelationSize(AccessibilityRelationType relation)
90         {
91             uint result = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsRelationSize(this, Convert.ToInt32(relation));
92             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
93             return result;
94         }
95
96         /// <summary>
97         /// Gets Address object using contained bus and path.
98         /// </summary>
99         /// <param name="relation">Accessibility relation</param>
100         /// <param name="position">Position</param>
101         /// <returns>Accessibility Adress</returns>
102         [EditorBrowsable(EditorBrowsableState.Never)]
103         public Address GetAddressAt(AccessibilityRelationType relation, int position)
104         {
105             var bus = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 0);
106             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
107
108             var path = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 1);
109             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
110
111             return new Address(bus, path);
112         }
113
114         /// <summary>
115         /// Releases handle itself.
116         /// </summary>
117         /// <returns>true when released successfully.</returns>
118         [EditorBrowsable(EditorBrowsableState.Never)]
119         protected override bool ReleaseHandle()
120         {
121             Interop.ControlDevel.DaliToolkitDevelControlDeleteAccessibilityRelations(handle);
122             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
123             this.SetHandle(IntPtr.Zero);
124             return true;
125         }
126     }
127
128     /// <summary>
129     /// AccessibilityRange is used to store data related with Text.
130     /// </summary>
131     [EditorBrowsable(EditorBrowsableState.Never)]
132     public class AccessibilityRange
133     {
134         /// <summary>
135         /// Start position in stored text.
136         /// </summary>
137         public int StartOffset { get; set; } = 0;
138
139         /// <summary>
140         /// End position in stored text.
141         /// </summary>
142         public int EndOffset { get; set; } = 0;
143
144         /// <summary>
145         /// Text content in stored text.
146         /// </summary>
147         public string Content { get; set; } = "";
148     }
149
150     /// <summary>
151     /// View is the base class for all views.
152     /// </summary>
153     /// <since_tizen> 3 </since_tizen>
154     public partial class View
155     {
156         ///////////////////////////////////////////////////////////////////
157         // ****************** Accessibility Attributes ****************** //
158         ///////////////////////////////////////////////////////////////////
159
160         /// <summary>
161         /// Adds or modifies the value matched with given key.
162         /// </summary>
163         /// <remarks>
164         /// Modification takes place if key was previously set.
165         /// </remarks>
166         /// <param name="key">The key to insert</param>
167         /// <param name="value">The value to insert</param>
168         [EditorBrowsable(EditorBrowsableState.Never)]
169         public void AppendAccessibilityAttribute(string key, string value)
170         {
171             Interop.ControlDevel.DaliToolkitDevelControlAppendAccessibilityAttribute(SwigCPtr, key, value);
172             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
173         }
174
175         /// <summary>
176         /// Erases a key with its value from accessibility attributes.
177         /// </summary>
178         /// <param name="key">The key to remove</param>
179         [EditorBrowsable(EditorBrowsableState.Never)]
180         public void RemoveAccessibilityAttribute(string key)
181         {
182             Interop.ControlDevel.DaliToolkitDevelControlRemoveAccessibilityAttribute(SwigCPtr, key);
183             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
184         }
185
186         /// <summary>
187         /// Clears accessibility attributes.
188         /// </summary>
189         [EditorBrowsable(EditorBrowsableState.Never)]
190         public void ClearAccessibilityAttributes()
191         {
192             Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityAttributes(SwigCPtr);
193             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
194         }
195
196         ///////////////////////////////////////////////////////////////////
197         // ************************** Highlight ************************ //
198         ///////////////////////////////////////////////////////////////////
199
200         /// <summary>
201         /// Clears accessibility highlight.
202         /// </summary>
203         /// <returns>True if cleared, otherwise false when it is not possible</returns>
204         [EditorBrowsable(EditorBrowsableState.Never)]
205         public bool ClearAccessibilityHighlight()
206         {
207             bool result = Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityHighlight(SwigCPtr);
208             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
209             return result;
210         }
211
212         /// <summary>
213         /// Grabs accessibility highlight.
214         /// </summary>
215         /// <returns>True if cleared, otherwise false when it is not possible</returns>
216         [EditorBrowsable(EditorBrowsableState.Never)]
217         public bool GrabAccessibilityHighlight()
218         {
219             bool result = Interop.ControlDevel.DaliToolkitDevelControlGrabAccessibilityHighlight(SwigCPtr);
220             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
221             return result;
222         }
223
224         /// <summary>
225         /// Flag to check whether this view is highlighted or not.
226         /// </summary>
227         [EditorBrowsable(EditorBrowsableState.Never)]
228         protected bool IsHighlighted
229         {
230             get
231             {
232                 using (View view = Accessibility.Accessibility.Instance.GetCurrentlyHighlightedView())
233                 {
234                     return view == this;
235                 }
236             }
237         }
238
239         ///////////////////////////////////////////////////////////////////
240         // ****************** Accessibility Relations ******************* //
241         ///////////////////////////////////////////////////////////////////
242
243         /// <summary>
244         /// Creates relation between objects.
245         /// </summary>
246         /// <param name="second">Object which will be in relation.</param>
247         /// <param name="relation">Relation type.</param>
248         /// <exception cref="ArgumentNullException">You must pass valid object. NULL could not be in relation.</exception>
249         [EditorBrowsable(EditorBrowsableState.Never)]
250         public void AppendAccessibilityRelation(View second, AccessibilityRelationType relation)
251         {
252             if (second is null)
253             {
254                 throw new ArgumentNullException(nameof(second));
255             }
256
257             Interop.ControlDevel.DaliToolkitDevelControlAppendAccessibilityRelation(SwigCPtr, second.SwigCPtr, (int)relation);
258             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
259         }
260
261         /// <summary>
262         /// Removes accessibility relation.
263         /// </summary>
264         /// <param name="second">Object which will be removed in relation</param>
265         /// <param name="relation">Relation type</param>
266         [EditorBrowsable(EditorBrowsableState.Never)]
267         public void RemoveAccessibilityRelation(View second, AccessibilityRelationType relation)
268         {
269             if (second is null)
270             {
271                 throw new ArgumentNullException(nameof(second));
272             }
273
274             Interop.ControlDevel.DaliToolkitDevelControlRemoveAccessibilityRelation(SwigCPtr, second.SwigCPtr, (int)relation);
275             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
276         }
277
278         /// <summary>
279         /// Removes all previously appended relations.
280         /// </summary>
281         [EditorBrowsable(EditorBrowsableState.Never)]
282         public void ClearAccessibilityRelations()
283         {
284             Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityRelations(SwigCPtr);
285             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
286         }
287
288         /// <summary>
289         /// Gets accessibility collection connected with the current object.
290         /// </summary>
291         /// <returns>AddressCollection</returns>
292         [EditorBrowsable(EditorBrowsableState.Never)]
293         public AddressCollection GetAccessibilityRelations()
294         {
295             var result = new AddressCollection(Interop.ControlDevel.DaliToolkitDevelControlNewGetAccessibilityRelations(SwigCPtr));
296             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
297             return result;
298         }
299
300         ///////////////////////////////////////////////////////////////////
301         // ********************* ReadingInfoType *********************** //
302         ///////////////////////////////////////////////////////////////////
303
304         /// <summary>
305         /// Sets accessibility reading information.
306         /// </summary>
307         /// <param name="type">Reading information type</param>
308         [EditorBrowsable(EditorBrowsableState.Never)]
309         public void SetAccessibilityReadingInfoTypes(AccessibilityReadingInfoTypes type)
310         {
311             Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityReadingInfoTypes(SwigCPtr, (int)type);
312             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
313         }
314
315         /// <summary>
316         /// Gets accessibility reading information.
317         /// </summary>
318         /// <returns>Reading information type</returns>
319         [EditorBrowsable(EditorBrowsableState.Never)]
320         public AccessibilityReadingInfoTypes GetAccessibilityReadingInfoTypes()
321         {
322             AccessibilityReadingInfoTypes result = (AccessibilityReadingInfoTypes)Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityReadingInfoTypes(SwigCPtr);
323             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
324             return result;
325         }
326
327         ///////////////////////////////////////////////////////////////////
328         // ******************** Accessibility States ******************* //
329         ///////////////////////////////////////////////////////////////////
330
331         /// <summary>
332         /// Notifies sending notifications about the current states to accessibility clients.
333         /// </summary>
334         /// <remarks>
335         /// If recursive is true, all children of the Accessibility object will also re-emit the states.
336         /// </remarks>
337         /// <param name="states">Accessibility States</param>
338         /// <param name="recursive">Flag to point if notifications of children's state would be sent</param>
339         [EditorBrowsable(EditorBrowsableState.Never)]
340         public void NotifyAccessibilityStatesChange(AccessibilityStates states, bool recursive)
341         {
342             Interop.ControlDevel.DaliToolkitDevelControlNotifyAccessibilityStatesChange(SwigCPtr, (ulong)states, Convert.ToInt32(recursive));
343             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
344         }
345
346         /// <summary>
347         /// Gets Accessibility States.
348         /// </summary>
349         /// <returns>Accessibility States</returns>
350         [EditorBrowsable(EditorBrowsableState.Never)]
351         public AccessibilityStates GetAccessibilityStates()
352         {
353             AccessibilityStates result = (AccessibilityStates) Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityStates(SwigCPtr);
354             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
355             return result;
356         }
357
358         ///////////////////////////////////////////////////////////////////
359         // ************************ Accessible ************************* //
360         ///////////////////////////////////////////////////////////////////
361
362         /// <summary>
363         /// Emits accessibility property changed event.
364         /// </summary>
365         /// <param name="changeEvent">Property changed event</param>
366         [EditorBrowsable(EditorBrowsableState.Never)]
367         public void EmitAccessibilityEvent(AccessibilityPropertyChangeEvent changeEvent)
368         {
369             Interop.ControlDevel.DaliAccessibilityEmitAccessibilityEvent(SwigCPtr, Convert.ToInt32(changeEvent));
370             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
371         }
372
373         /// <summary>
374         /// Emits accessibility states changed event.
375         /// </summary>
376         /// <param name="state">Accessibility state</param>
377         /// <param name="equal">True if the state is set or enabled, otherwise false</param>
378         [EditorBrowsable(EditorBrowsableState.Never)]
379         public void EmitAccessibilityStatesChangedEvent(AccessibilityStates state, bool equal)
380         {
381             Interop.ControlDevel.DaliAccessibilityEmitAccessibilityStatesChangedEvent(SwigCPtr, (ulong)state, Convert.ToInt32(equal));
382             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
383         }
384
385         /// <summary>
386         /// Emits accessibility text inserted event.
387         /// </summary>
388         /// <param name="cursorPosition">Text cursor position</param>
389         /// <param name="length">Text length</param>
390         /// <param name="content">Inserted text content</param>
391         [EditorBrowsable(EditorBrowsableState.Never)]
392         public void EmitTextInsertedEvent(int cursorPosition, int length, string content)
393         {
394             Interop.ControlDevel.DaliAccessibilityEmitTextInsertedEvent(SwigCPtr, cursorPosition, length, content);
395             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
396         }
397
398         /// <summary>
399         /// Emits accessibility text deleted event.
400         /// </summary>
401         /// <param name="cursorPosition">Text cursor position</param>
402         /// <param name="length">Text length</param>
403         /// <param name="content">Inserted text content</param>
404         [EditorBrowsable(EditorBrowsableState.Never)]
405         public void EmitTextDeletedEvent(int cursorPosition, int length, string content)
406         {
407             Interop.ControlDevel.DaliAccessibilityEmitTextDeletedEvent(SwigCPtr, cursorPosition, length, content);
408             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
409         }
410
411         /// <summary>
412         /// Emits accessibility text cursor moved event.
413         /// </summary>
414         /// <param name="cursorPosition">The new cursor position</param>
415         [EditorBrowsable(EditorBrowsableState.Never)]
416         public void EmitTextCursorMovedEvent(int cursorPosition)
417         {
418             Interop.ControlDevel.DaliAccessibilityEmitTextCursorMovedEvent(SwigCPtr, cursorPosition);
419             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
420         }
421
422         ///////////////////////////////////////////////////////////////////
423         // ************************** Bridge *************************** //
424         ///////////////////////////////////////////////////////////////////
425
426         /// <summary>
427         /// Registers component as a source of an accessibility "default label".
428         /// The "Default label" is a text that could be read by screen-reader immediately
429         /// after the navigation context has changed (window activates, popup shows up, tab changes)
430         /// and before first UI element is highlighted.
431         /// </summary>
432         [EditorBrowsable(EditorBrowsableState.Never)]
433         public void RegisterDefaultLabel()
434         {
435             Interop.ControlDevel.DaliAccessibilityBridgeRegisterDefaultLabel(SwigCPtr);
436             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
437         }
438
439         /// <summary>
440         /// Unregisters component that has been registered previously as a source of an accessibility "default label".
441         /// The "Default label" is a text that could be read by screen-reader immediately
442         /// after the navigation context has changed (window activates, popup shows up, tab changes)
443         /// and before first UI element is highlighted.
444         /// </summary>
445         [EditorBrowsable(EditorBrowsableState.Never)]
446         public void UnregisterDefaultLabel()
447         {
448             Interop.ControlDevel.DaliAccessibilityBridgeUnregisterDefaultLabel(SwigCPtr);
449             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
450         }
451
452         private IntPtr DuplicateString(string value)
453         {
454             return Interop.ControlDevel.DaliToolkitDevelControlAccessibleImplNUIDuplicateString(value ?? "");
455         }
456
457         private IntPtr DuplicateStates(AccessibilityStates states)
458         {
459             return Interop.ControlDevel.DaliToolkitDevelControlConvertState((ulong)states);
460         }
461
462         private IntPtr DuplicateRange(AccessibilityRange range)
463         {
464             return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
465         }
466
467         private Interop.ControlDevel.AccessibilityDelegate accessibilityDelegate = null;
468         private IntPtr accessibilityDelegatePtr;
469
470         /// <summary>
471         /// Sets the specific constructor for creating accessibility structure with its role and interface.
472         /// </summary>
473         /// <remarks>
474         /// The method should be called inside OnInitialize method of all classes inheriting from View.
475         /// </remarks>
476         /// <param name="role">Accessibility role</param>
477         /// <param name="accessibilityInterface">Accessibility interface</param>
478         [EditorBrowsable(EditorBrowsableState.Never)]
479         public void SetAccessibilityConstructor(Role role, AccessibilityInterface accessibilityInterface = AccessibilityInterface.None)
480         {
481             var size = Marshal.SizeOf<Interop.ControlDevel.AccessibilityDelegate>();
482
483             if (accessibilityDelegate == null)
484             {
485                 accessibilityDelegate = new Interop.ControlDevel.AccessibilityDelegate()
486                 {
487                     GetName = () => DuplicateString(AccessibilityGetName()),
488                     GetDescription = () => DuplicateString(AccessibilityGetDescription()),
489                     DoAction = (name) => AccessibilityDoAction(Marshal.PtrToStringAnsi(name)),
490                     CalculateStates = (states) => DuplicateStates(AccessibilityCalculateStates(states)),
491                     GetActionCount = () => AccessibilityGetActionCount(),
492                     GetActionName = (index) => DuplicateString(AccessibilityGetActionName(index)),
493                     ShouldReportZeroChildren = () => AccessibilityShouldReportZeroChildren(),
494                     GetMinimum = () => AccessibilityGetMinimum(),
495                     GetCurrent = () => AccessibilityGetCurrent(),
496                     GetMaximum = () => AccessibilityGetMaximum(),
497                     SetCurrent = (value) => AccessibilitySetCurrent(value),
498                     GetMinimumIncrement = () => AccessibilityGetMinimumIncrement(),
499                     IsScrollable = () => AccessibilityIsScrollable(),
500                     GetText = (startOffset, endOffset) => DuplicateString(AccessibilityGetText(startOffset, endOffset)),
501                     GetCharacterCount = () => AccessibilityGetCharacterCount(),
502                     GetCursorOffset = () => AccessibilityGetCursorOffset(),
503                     SetCursorOffset = (offset) => AccessibilitySetCursorOffset(offset),
504                     GetTextAtOffset = (offset, boundary) => DuplicateRange(AccessibilityGetTextAtOffset(offset, (AccessibilityTextBoundary)boundary)),
505                     GetSelection = (selectionNumber) => DuplicateRange(AccessibilityGetSelection(selectionNumber)),
506                     RemoveSelection = (selectionNumber) => AccessibilityRemoveSelection(selectionNumber),
507                     SetSelection = (selectionNumber, startOffset, endOffset) => AccessibilitySetSelection(selectionNumber, startOffset, endOffset),
508                     CopyText = (startPosition, endPosition) => AccessibilityCopyText(startPosition, endPosition),
509                     CutText = (startPosition, endPosition) => AccessibilityCutText(startPosition, endPosition),
510                     InsertText = (startPosition, text) => AccessibilityInsertText(startPosition, Marshal.PtrToStringAnsi(text)),
511                     SetTextContents = (newContents) => AccessibilitySetTextContents(Marshal.PtrToStringAnsi(newContents)),
512                     DeleteText = (startPosition, endPosition) => AccessibilityDeleteText(startPosition, endPosition),
513                     ScrollToChild = (child) => {
514                         using (var view = new View(child, true))
515                         {
516                             return AccessibilityScrollToChild(view);
517                         }
518                     },
519                     GetSelectedChildrenCount = () => AccessibilityGetSelectedChildrenCount(),
520                     GetSelectedChild = (selectedChildIndex) => View.getCPtr(AccessibilityGetSelectedChild(selectedChildIndex)).Handle,
521                     SelectChild = (childIndex) => AccessibilitySelectChild(childIndex),
522                     DeselectSelectedChild = (selectedChildIndex) => AccessibilityDeselectSelectedChild(selectedChildIndex),
523                     IsChildSelected = (childIndex) => AccessibilityIsChildSelected(childIndex),
524                     SelectAll = () => AccessibilitySelectAll(),
525                     ClearSelection = () => AccessibilityClearSelection(),
526                     DeselectChild = (childIndex) => AccessibilityDeselectChild(childIndex),
527                 };
528
529                 accessibilityDelegatePtr = Marshal.AllocHGlobal(size);
530                 Marshal.StructureToPtr(accessibilityDelegate, accessibilityDelegatePtr, false);
531             }
532
533             Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityConstructor(SwigCPtr, (int)role, (int)accessibilityInterface, accessibilityDelegatePtr, size);
534
535             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
536         }
537
538         /// <summary>
539         /// A helper method to manipulate individual bit flags (e.g. turn them on or off)
540         /// </summary>
541         /// <param name="obj">An object that accumulates combination of bit flags</param>
542         /// <param name="bit">A bit flag to be operated</param>
543         /// <param name="state">A state of the bit flag to be set (0 == off, 1 == on)</param>
544         [EditorBrowsable(EditorBrowsableState.Never)]
545         static public void FlagSetter<T>(ref T obj ,T bit, bool state)
546         {
547             dynamic result = obj;
548             dynamic param = bit;
549             if (state)
550             {
551                 result |= param;
552             }
553             else
554             {
555                 result &= (~param);
556             }
557             obj = result;
558         }
559
560         [EditorBrowsable(EditorBrowsableState.Never)]
561         protected override void Dispose(bool disposing)
562         {
563             if (disposed)
564             {
565                 return;
566             }
567
568             if (disposing == false)
569             {
570                 if (IsNativeHandleInvalid() || SwigCMemOwn == false)
571                 {
572                     // at this case, implicit nor explicit dispose is not required. No native object is made.
573                     disposed = true;
574                     return;
575                 }
576             }
577
578             if (disposing)
579             {
580                 Unparent();
581             }
582
583             if (accessibilityDelegate != null)
584             {
585                 Marshal.DestroyStructure<Interop.ControlDevel.AccessibilityDelegate>(accessibilityDelegatePtr);
586                 Marshal.FreeHGlobal(accessibilityDelegatePtr);
587                 accessibilityDelegate = null;
588             }
589
590             base.Dispose(disposing);
591         }
592
593         [EditorBrowsable(EditorBrowsableState.Never)]
594         protected static readonly string AccessibilityActivateAction = "activate";
595         [EditorBrowsable(EditorBrowsableState.Never)]
596         protected static readonly string AccessibilityReadingSkippedAction = "ReadingSkipped";
597         [EditorBrowsable(EditorBrowsableState.Never)]
598         protected static readonly string AccessibilityReadingCancelledAction = "ReadingCancelled";
599         [EditorBrowsable(EditorBrowsableState.Never)]
600         protected static readonly string AccessibilityReadingStoppedAction = "ReadingStopped";
601         [EditorBrowsable(EditorBrowsableState.Never)]
602         protected static readonly string AccessibilityReadingPausedAction = "ReadingPaused";
603         [EditorBrowsable(EditorBrowsableState.Never)]
604         protected static readonly string AccessibilityReadingResumedAction = "ReadingResumed";
605
606         [EditorBrowsable(EditorBrowsableState.Never)]
607         private static readonly string[] AccessibilityActions = {
608             AccessibilityActivateAction,
609             AccessibilityReadingSkippedAction,
610             AccessibilityReadingCancelledAction,
611             AccessibilityReadingStoppedAction,
612             AccessibilityReadingPausedAction,
613             AccessibilityReadingResumedAction,
614         };
615
616         [EditorBrowsable(EditorBrowsableState.Never)]
617         protected virtual string AccessibilityGetName()
618         {
619             return "";
620         }
621
622         [EditorBrowsable(EditorBrowsableState.Never)]
623         protected virtual string AccessibilityGetDescription()
624         {
625             return "";
626         }
627
628         [EditorBrowsable(EditorBrowsableState.Never)]
629         protected virtual bool AccessibilityDoAction(string name)
630         {
631             return false;
632         }
633
634         [EditorBrowsable(EditorBrowsableState.Never)]
635         protected virtual AccessibilityStates AccessibilityCalculateStates(ulong states)
636         {
637             AccessibilityStates accessibilityStates = (AccessibilityStates)states;
638
639             FlagSetter(ref accessibilityStates, AccessibilityStates.Highlightable, this.AccessibilityHighlightable);
640             FlagSetter(ref accessibilityStates, AccessibilityStates.Focusable, this.Focusable);
641             FlagSetter(ref accessibilityStates, AccessibilityStates.Focused, this.State == States.Focused);
642             FlagSetter(ref accessibilityStates, AccessibilityStates.Highlighted, this.IsHighlighted);
643             FlagSetter(ref accessibilityStates, AccessibilityStates.Enabled, this.State != States.Disabled);
644             FlagSetter(ref accessibilityStates, AccessibilityStates.Sensitive, this.Sensitive);
645             FlagSetter(ref accessibilityStates, AccessibilityStates.Visible, true);
646             FlagSetter(ref accessibilityStates, AccessibilityStates.Defunct, !this.IsOnWindow);
647
648             return accessibilityStates;
649         }
650
651         [EditorBrowsable(EditorBrowsableState.Never)]
652         protected virtual int AccessibilityGetActionCount()
653         {
654             return AccessibilityActions.Length;
655         }
656
657         [EditorBrowsable(EditorBrowsableState.Never)]
658         protected virtual string AccessibilityGetActionName(int index)
659         {
660             if (index >= 0 && index < AccessibilityActions.Length)
661             {
662                 return AccessibilityActions[index];
663             }
664             else
665             {
666                 return "";
667             }
668         }
669
670         [EditorBrowsable(EditorBrowsableState.Never)]
671         protected virtual bool AccessibilityShouldReportZeroChildren()
672         {
673             return false;
674         }
675
676         [EditorBrowsable(EditorBrowsableState.Never)]
677         protected virtual double AccessibilityGetMinimum()
678         {
679             return 0.0;
680         }
681
682         [EditorBrowsable(EditorBrowsableState.Never)]
683         protected virtual double AccessibilityGetCurrent()
684         {
685             return 0.0;
686         }
687
688         [EditorBrowsable(EditorBrowsableState.Never)]
689         protected virtual double AccessibilityGetMaximum()
690         {
691             return 0.0;
692         }
693
694         [EditorBrowsable(EditorBrowsableState.Never)]
695         protected virtual bool AccessibilitySetCurrent(double value)
696         {
697             return false;
698         }
699
700         [EditorBrowsable(EditorBrowsableState.Never)]
701         protected virtual double AccessibilityGetMinimumIncrement()
702         {
703             return 0.0;
704         }
705
706         [EditorBrowsable(EditorBrowsableState.Never)]
707         protected virtual bool AccessibilityIsScrollable()
708         {
709             return false;
710         }
711
712         [EditorBrowsable(EditorBrowsableState.Never)]
713         protected virtual string AccessibilityGetText(int startOffset, int endOffset)
714         {
715             return "";
716         }
717
718         [EditorBrowsable(EditorBrowsableState.Never)]
719         protected virtual int AccessibilityGetCharacterCount()
720         {
721             return 0;
722         }
723
724         [EditorBrowsable(EditorBrowsableState.Never)]
725         protected virtual int AccessibilityGetCursorOffset()
726         {
727             return 0;
728         }
729
730         [EditorBrowsable(EditorBrowsableState.Never)]
731         protected virtual bool AccessibilitySetCursorOffset(int offset)
732         {
733             return false;
734         }
735
736         [EditorBrowsable(EditorBrowsableState.Never)]
737         protected virtual AccessibilityRange AccessibilityGetTextAtOffset(int offset, AccessibilityTextBoundary boundary)
738         {
739             return new AccessibilityRange();
740         }
741
742         [EditorBrowsable(EditorBrowsableState.Never)]
743         protected virtual AccessibilityRange AccessibilityGetSelection(int selectionNumber)
744         {
745             return new AccessibilityRange();
746         }
747
748         [EditorBrowsable(EditorBrowsableState.Never)]
749         protected virtual bool AccessibilityRemoveSelection(int selectionNumber)
750         {
751             return false;
752         }
753
754         [EditorBrowsable(EditorBrowsableState.Never)]
755         protected virtual bool AccessibilitySetSelection(int selectionNumber, int startOffset, int endOffset)
756         {
757             return false;
758         }
759
760         [EditorBrowsable(EditorBrowsableState.Never)]
761         protected virtual bool AccessibilityCopyText(int startPosition, int endPosition)
762         {
763             return false;
764         }
765
766         [EditorBrowsable(EditorBrowsableState.Never)]
767         protected virtual bool AccessibilityCutText(int startPosition, int endPosition)
768         {
769             return false;
770         }
771
772         [EditorBrowsable(EditorBrowsableState.Never)]
773         protected virtual bool AccessibilityInsertText(int startPosition, string text)
774         {
775             return false;
776         }
777
778         [EditorBrowsable(EditorBrowsableState.Never)]
779         protected virtual bool AccessibilitySetTextContents(string newContents)
780         {
781             return false;
782         }
783
784         [EditorBrowsable(EditorBrowsableState.Never)]
785         protected virtual bool AccessibilityDeleteText(int startPosition, int endPosition)
786         {
787             return false;
788         }
789
790         [EditorBrowsable(EditorBrowsableState.Never)]
791         protected virtual bool AccessibilityScrollToChild(View child)
792         {
793             return false;
794         }
795
796         [EditorBrowsable(EditorBrowsableState.Never)]
797         protected virtual int AccessibilityGetSelectedChildrenCount()
798         {
799             return 0;
800         }
801
802         [EditorBrowsable(EditorBrowsableState.Never)]
803         protected virtual View AccessibilityGetSelectedChild(int selectedChildIndex)
804         {
805             return null;
806         }
807
808         [EditorBrowsable(EditorBrowsableState.Never)]
809         protected virtual bool AccessibilitySelectChild(int childIndex)
810         {
811             return false;
812         }
813
814         [EditorBrowsable(EditorBrowsableState.Never)]
815         protected virtual bool AccessibilityDeselectSelectedChild(int selectedChildIndex)
816         {
817             return false;
818         }
819
820         [EditorBrowsable(EditorBrowsableState.Never)]
821         protected virtual bool AccessibilityIsChildSelected(int childIndex)
822         {
823             return false;
824         }
825
826         [EditorBrowsable(EditorBrowsableState.Never)]
827         protected virtual bool AccessibilitySelectAll()
828         {
829             return false;
830         }
831
832         [EditorBrowsable(EditorBrowsableState.Never)]
833         protected virtual bool AccessibilityClearSelection()
834         {
835             return false;
836         }
837
838         [EditorBrowsable(EditorBrowsableState.Never)]
839         protected virtual bool AccessibilityDeselectChild(int childIndex)
840         {
841             return false;
842         }
843     }
844 }