[NUI][ATSPI] remove duplicated calculation for states
[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                 return (this == Accessibility.Accessibility.Instance.GetCurrentlyHighlightedView());
233             }
234         }
235
236         ///////////////////////////////////////////////////////////////////
237         // ****************** Accessibility Relations ******************* //
238         ///////////////////////////////////////////////////////////////////
239
240         /// <summary>
241         /// Creates relation between objects.
242         /// </summary>
243         /// <param name="second">Object which will be in relation.</param>
244         /// <param name="relation">Relation type.</param>
245         /// <exception cref="ArgumentNullException">You must pass valid object. NULL could not be in relation.</exception>
246         [EditorBrowsable(EditorBrowsableState.Never)]
247         public void AppendAccessibilityRelation(View second, AccessibilityRelationType relation)
248         {
249             if (second is null)
250             {
251                 throw new ArgumentNullException(nameof(second));
252             }
253
254             Interop.ControlDevel.DaliToolkitDevelControlAppendAccessibilityRelation(SwigCPtr, second.SwigCPtr, (int)relation);
255             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
256         }
257
258         /// <summary>
259         /// Removes accessibility relation.
260         /// </summary>
261         /// <param name="second">Object which will be removed in relation</param>
262         /// <param name="relation">Relation type</param>
263         [EditorBrowsable(EditorBrowsableState.Never)]
264         public void RemoveAccessibilityRelation(View second, AccessibilityRelationType relation)
265         {
266             if (second is null)
267             {
268                 throw new ArgumentNullException(nameof(second));
269             }
270
271             Interop.ControlDevel.DaliToolkitDevelControlRemoveAccessibilityRelation(SwigCPtr, second.SwigCPtr, (int)relation);
272             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
273         }
274
275         /// <summary>
276         /// Removes all previously appended relations.
277         /// </summary>
278         [EditorBrowsable(EditorBrowsableState.Never)]
279         public void ClearAccessibilityRelations()
280         {
281             Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityRelations(SwigCPtr);
282             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
283         }
284
285         /// <summary>
286         /// Gets accessibility collection connected with the current object.
287         /// </summary>
288         /// <returns>AddressCollection</returns>
289         [EditorBrowsable(EditorBrowsableState.Never)]
290         public AddressCollection GetAccessibilityRelations()
291         {
292             var result = new AddressCollection(Interop.ControlDevel.DaliToolkitDevelControlNewGetAccessibilityRelations(SwigCPtr));
293             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
294             return result;
295         }
296
297         ///////////////////////////////////////////////////////////////////
298         // ********************* ReadingInfoType *********************** //
299         ///////////////////////////////////////////////////////////////////
300
301         /// <summary>
302         /// Sets accessibility reading information.
303         /// </summary>
304         /// <param name="type">Reading information type</param>
305         [EditorBrowsable(EditorBrowsableState.Never)]
306         public void SetAccessibilityReadingInfoTypes(AccessibilityReadingInfoTypes type)
307         {
308             Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityReadingInfoTypes(SwigCPtr, (int)type);
309             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
310         }
311
312         /// <summary>
313         /// Gets accessibility reading information.
314         /// </summary>
315         /// <returns>Reading information type</returns>
316         [EditorBrowsable(EditorBrowsableState.Never)]
317         public AccessibilityReadingInfoTypes GetAccessibilityReadingInfoTypes()
318         {
319             AccessibilityReadingInfoTypes result = (AccessibilityReadingInfoTypes)Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityReadingInfoTypes(SwigCPtr);
320             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
321             return result;
322         }
323
324         ///////////////////////////////////////////////////////////////////
325         // ******************** Accessibility States ******************* //
326         ///////////////////////////////////////////////////////////////////
327
328         /// <summary>
329         /// Notifies sending notifications about the current states to accessibility clients.
330         /// </summary>
331         /// <remarks>
332         /// If recursive is true, all children of the Accessibility object will also re-emit the states.
333         /// </remarks>
334         /// <param name="states">Accessibility States</param>
335         /// <param name="notifyMode">Controls the notification strategy</param>
336         [EditorBrowsable(EditorBrowsableState.Never)]
337         public void NotifyAccessibilityStatesChange(AccessibilityStates states, AccessibilityStatesNotifyMode notifyMode)
338         {
339             Interop.ControlDevel.DaliToolkitDevelControlNotifyAccessibilityStatesChange(SwigCPtr, (ulong)states, (int)notifyMode);
340             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
341         }
342
343         /// <summary>
344         /// Gets Accessibility States.
345         /// </summary>
346         /// <returns>Accessibility States</returns>
347         [EditorBrowsable(EditorBrowsableState.Never)]
348         public AccessibilityStates GetAccessibilityStates()
349         {
350             AccessibilityStates result = (AccessibilityStates) Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityStates(SwigCPtr);
351             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
352             return result;
353         }
354
355         ///////////////////////////////////////////////////////////////////
356         // ************************ Accessible ************************* //
357         ///////////////////////////////////////////////////////////////////
358
359         /// <summary>
360         /// Emits accessibility property changed event.
361         /// </summary>
362         /// <param name="changeEvent">Property changed event</param>
363         [EditorBrowsable(EditorBrowsableState.Never)]
364         public void EmitAccessibilityEvent(AccessibilityPropertyChangeEvent changeEvent)
365         {
366             Interop.ControlDevel.DaliAccessibilityEmitAccessibilityEvent(SwigCPtr, Convert.ToInt32(changeEvent));
367             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
368         }
369
370         /// <summary>
371         /// Emits accessibility states changed event.
372         /// </summary>
373         /// <param name="state">Accessibility state</param>
374         /// <param name="equal">True if the state is set or enabled, otherwise false</param>
375         [EditorBrowsable(EditorBrowsableState.Never)]
376         public void EmitAccessibilityStatesChangedEvent(AccessibilityStates state, bool equal)
377         {
378             Interop.ControlDevel.DaliAccessibilityEmitAccessibilityStatesChangedEvent(SwigCPtr, (ulong)state, Convert.ToInt32(equal));
379             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
380         }
381
382         /// <summary>
383         /// Emits accessibility text inserted event.
384         /// </summary>
385         /// <param name="cursorPosition">Text cursor position</param>
386         /// <param name="length">Text length</param>
387         /// <param name="content">Inserted text content</param>
388         [EditorBrowsable(EditorBrowsableState.Never)]
389         public void EmitTextInsertedEvent(int cursorPosition, int length, string content)
390         {
391             Interop.ControlDevel.DaliAccessibilityEmitTextInsertedEvent(SwigCPtr, cursorPosition, length, content);
392             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
393         }
394
395         /// <summary>
396         /// Emits accessibility text deleted event.
397         /// </summary>
398         /// <param name="cursorPosition">Text cursor position</param>
399         /// <param name="length">Text length</param>
400         /// <param name="content">Inserted text content</param>
401         [EditorBrowsable(EditorBrowsableState.Never)]
402         public void EmitTextDeletedEvent(int cursorPosition, int length, string content)
403         {
404             Interop.ControlDevel.DaliAccessibilityEmitTextDeletedEvent(SwigCPtr, cursorPosition, length, content);
405             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
406         }
407
408         /// <summary>
409         /// Emits accessibility text cursor moved event.
410         /// </summary>
411         /// <param name="cursorPosition">The new cursor position</param>
412         [EditorBrowsable(EditorBrowsableState.Never)]
413         public void EmitTextCursorMovedEvent(int cursorPosition)
414         {
415             Interop.ControlDevel.DaliAccessibilityEmitTextCursorMovedEvent(SwigCPtr, cursorPosition);
416             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
417         }
418
419         ///////////////////////////////////////////////////////////////////
420         // ************************** Bridge *************************** //
421         ///////////////////////////////////////////////////////////////////
422
423         /// <summary>
424         /// Registers component as a source of an accessibility "default label".
425         /// The "Default label" is a text that could be read by screen-reader immediately
426         /// after the navigation context has changed (window activates, popup shows up, tab changes)
427         /// and before first UI element is highlighted.
428         /// </summary>
429         [EditorBrowsable(EditorBrowsableState.Never)]
430         public void RegisterDefaultLabel()
431         {
432             Interop.ControlDevel.DaliAccessibilityBridgeRegisterDefaultLabel(SwigCPtr);
433             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
434         }
435
436         /// <summary>
437         /// Unregisters component that has been registered previously as a source of an accessibility "default label".
438         /// The "Default label" is a text that could be read by screen-reader immediately
439         /// after the navigation context has changed (window activates, popup shows up, tab changes)
440         /// and before first UI element is highlighted.
441         /// </summary>
442         [EditorBrowsable(EditorBrowsableState.Never)]
443         public void UnregisterDefaultLabel()
444         {
445             Interop.ControlDevel.DaliAccessibilityBridgeUnregisterDefaultLabel(SwigCPtr);
446             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
447         }
448
449         private IntPtr DuplicateString(string value)
450         {
451             return Interop.ControlDevel.DaliToolkitDevelControlAccessibleImplNUIDuplicateString(value ?? "");
452         }
453
454         private IntPtr DuplicateStates(AccessibilityStates states)
455         {
456             return Interop.ControlDevel.DaliToolkitDevelControlConvertState((ulong)states);
457         }
458
459         private IntPtr DuplicateRange(AccessibilityRange range)
460         {
461             return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
462         }
463
464         private Interop.ControlDevel.AccessibilityDelegate accessibilityDelegate = null;
465         private IntPtr accessibilityDelegatePtr;
466
467         /// <summary>
468         /// Sets the specific constructor for creating accessibility structure with its role and interface.
469         /// </summary>
470         /// <remarks>
471         /// The method should be called inside OnInitialize method of all classes inheriting from View.
472         /// </remarks>
473         /// <param name="role">Accessibility role</param>
474         /// <param name="accessibilityInterface">Accessibility interface</param>
475         [EditorBrowsable(EditorBrowsableState.Never)]
476         public void SetAccessibilityConstructor(Role role, AccessibilityInterface accessibilityInterface = AccessibilityInterface.None)
477         {
478             var size = Marshal.SizeOf<Interop.ControlDevel.AccessibilityDelegate>();
479
480             if (accessibilityDelegate == null)
481             {
482                 accessibilityDelegate = new Interop.ControlDevel.AccessibilityDelegate()
483                 {
484                     GetName = () => DuplicateString(AccessibilityGetName()),
485                     GetDescription = () => DuplicateString(AccessibilityGetDescription()),
486                     DoAction = (name) => AccessibilityDoAction(Marshal.PtrToStringAnsi(name)),
487                     CalculateStates = (states) => DuplicateStates(AccessibilityCalculateStates(states)),
488                     GetActionCount = () => AccessibilityGetActionCount(),
489                     GetActionName = (index) => DuplicateString(AccessibilityGetActionName(index)),
490                     ShouldReportZeroChildren = () => AccessibilityShouldReportZeroChildren(),
491                     GetMinimum = () => AccessibilityGetMinimum(),
492                     GetCurrent = () => AccessibilityGetCurrent(),
493                     GetMaximum = () => AccessibilityGetMaximum(),
494                     SetCurrent = (value) => AccessibilitySetCurrent(value),
495                     GetMinimumIncrement = () => AccessibilityGetMinimumIncrement(),
496                     IsScrollable = () => AccessibilityIsScrollable(),
497                     GetText = (startOffset, endOffset) => DuplicateString(AccessibilityGetText(startOffset, endOffset)),
498                     GetCharacterCount = () => AccessibilityGetCharacterCount(),
499                     GetCursorOffset = () => AccessibilityGetCursorOffset(),
500                     SetCursorOffset = (offset) => AccessibilitySetCursorOffset(offset),
501                     GetTextAtOffset = (offset, boundary) => DuplicateRange(AccessibilityGetTextAtOffset(offset, (AccessibilityTextBoundary)boundary)),
502                     GetSelection = (selectionNumber) => DuplicateRange(AccessibilityGetSelection(selectionNumber)),
503                     RemoveSelection = (selectionNumber) => AccessibilityRemoveSelection(selectionNumber),
504                     SetSelection = (selectionNumber, startOffset, endOffset) => AccessibilitySetSelection(selectionNumber, startOffset, endOffset),
505                     CopyText = (startPosition, endPosition) => AccessibilityCopyText(startPosition, endPosition),
506                     CutText = (startPosition, endPosition) => AccessibilityCutText(startPosition, endPosition),
507                     InsertText = (startPosition, text) => AccessibilityInsertText(startPosition, Marshal.PtrToStringAnsi(text)),
508                     SetTextContents = (newContents) => AccessibilitySetTextContents(Marshal.PtrToStringAnsi(newContents)),
509                     DeleteText = (startPosition, endPosition) => AccessibilityDeleteText(startPosition, endPosition),
510                     ScrollToChild = (child) => AccessibilityScrollToChild(this.GetInstanceSafely<View>(child)),
511                     GetSelectedChildrenCount = () => AccessibilityGetSelectedChildrenCount(),
512                     GetSelectedChild = (selectedChildIndex) => View.getCPtr(AccessibilityGetSelectedChild(selectedChildIndex)).Handle,
513                     SelectChild = (childIndex) => AccessibilitySelectChild(childIndex),
514                     DeselectSelectedChild = (selectedChildIndex) => AccessibilityDeselectSelectedChild(selectedChildIndex),
515                     IsChildSelected = (childIndex) => AccessibilityIsChildSelected(childIndex),
516                     SelectAll = () => AccessibilitySelectAll(),
517                     ClearSelection = () => AccessibilityClearSelection(),
518                     DeselectChild = (childIndex) => AccessibilityDeselectChild(childIndex),
519                 };
520
521                 accessibilityDelegatePtr = Marshal.AllocHGlobal(size);
522                 Marshal.StructureToPtr(accessibilityDelegate, accessibilityDelegatePtr, false);
523             }
524
525             Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityConstructor(SwigCPtr, (int)role, (int)accessibilityInterface, accessibilityDelegatePtr, size);
526
527             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
528         }
529
530         /// <summary>
531         /// A helper method to manipulate individual bit flags (e.g. turn them on or off)
532         /// </summary>
533         /// <param name="obj">An object that accumulates combination of bit flags</param>
534         /// <param name="bit">A bit flag to be operated</param>
535         /// <param name="state">A state of the bit flag to be set (0 == off, 1 == on)</param>
536         [EditorBrowsable(EditorBrowsableState.Never)]
537         static public void FlagSetter<T>(ref T obj ,T bit, bool state)
538         {
539             dynamic result = obj;
540             dynamic param = bit;
541             if (state)
542             {
543                 result |= param;
544             }
545             else
546             {
547                 result &= (~param);
548             }
549             obj = result;
550         }
551
552         [EditorBrowsable(EditorBrowsableState.Never)]
553         protected override void Dispose(bool disposing)
554         {
555             if (disposed)
556             {
557                 return;
558             }
559
560             if (disposing == false)
561             {
562                 if (IsNativeHandleInvalid() || SwigCMemOwn == false)
563                 {
564                     // at this case, implicit nor explicit dispose is not required. No native object is made.
565                     disposed = true;
566                     return;
567                 }
568             }
569
570             if (disposing)
571             {
572                 Unparent();
573             }
574
575             if (accessibilityDelegate != null)
576             {
577                 Marshal.DestroyStructure<Interop.ControlDevel.AccessibilityDelegate>(accessibilityDelegatePtr);
578                 Marshal.FreeHGlobal(accessibilityDelegatePtr);
579                 accessibilityDelegate = null;
580             }
581
582             base.Dispose(disposing);
583         }
584
585         [EditorBrowsable(EditorBrowsableState.Never)]
586         protected static readonly string AccessibilityActivateAction = "activate";
587         [EditorBrowsable(EditorBrowsableState.Never)]
588         protected static readonly string AccessibilityReadingSkippedAction = "ReadingSkipped";
589         [EditorBrowsable(EditorBrowsableState.Never)]
590         protected static readonly string AccessibilityReadingCancelledAction = "ReadingCancelled";
591         [EditorBrowsable(EditorBrowsableState.Never)]
592         protected static readonly string AccessibilityReadingStoppedAction = "ReadingStopped";
593         [EditorBrowsable(EditorBrowsableState.Never)]
594         protected static readonly string AccessibilityReadingPausedAction = "ReadingPaused";
595         [EditorBrowsable(EditorBrowsableState.Never)]
596         protected static readonly string AccessibilityReadingResumedAction = "ReadingResumed";
597
598         [EditorBrowsable(EditorBrowsableState.Never)]
599         private static readonly string[] AccessibilityActions = {
600             AccessibilityActivateAction,
601             AccessibilityReadingSkippedAction,
602             AccessibilityReadingCancelledAction,
603             AccessibilityReadingStoppedAction,
604             AccessibilityReadingPausedAction,
605             AccessibilityReadingResumedAction,
606         };
607
608         [EditorBrowsable(EditorBrowsableState.Never)]
609         protected virtual string AccessibilityGetName()
610         {
611             return "";
612         }
613
614         [EditorBrowsable(EditorBrowsableState.Never)]
615         protected virtual string AccessibilityGetDescription()
616         {
617             return "";
618         }
619
620         [EditorBrowsable(EditorBrowsableState.Never)]
621         protected virtual bool AccessibilityDoAction(string name)
622         {
623             return false;
624         }
625
626         [EditorBrowsable(EditorBrowsableState.Never)]
627         protected virtual AccessibilityStates AccessibilityCalculateStates(ulong states)
628         {
629             AccessibilityStates accessibilityStates = (AccessibilityStates)states;
630
631             FlagSetter(ref accessibilityStates, AccessibilityStates.Focused, this.State == States.Focused);
632             FlagSetter(ref accessibilityStates, AccessibilityStates.Enabled, this.State != States.Disabled);
633             FlagSetter(ref accessibilityStates, AccessibilityStates.Sensitive, this.Sensitive);
634
635             return accessibilityStates;
636         }
637
638         [EditorBrowsable(EditorBrowsableState.Never)]
639         protected virtual int AccessibilityGetActionCount()
640         {
641             return AccessibilityActions.Length;
642         }
643
644         [EditorBrowsable(EditorBrowsableState.Never)]
645         protected virtual string AccessibilityGetActionName(int index)
646         {
647             if (index >= 0 && index < AccessibilityActions.Length)
648             {
649                 return AccessibilityActions[index];
650             }
651             else
652             {
653                 return "";
654             }
655         }
656
657         [EditorBrowsable(EditorBrowsableState.Never)]
658         protected virtual bool AccessibilityShouldReportZeroChildren()
659         {
660             return false;
661         }
662
663         [EditorBrowsable(EditorBrowsableState.Never)]
664         protected virtual double AccessibilityGetMinimum()
665         {
666             return 0.0;
667         }
668
669         [EditorBrowsable(EditorBrowsableState.Never)]
670         protected virtual double AccessibilityGetCurrent()
671         {
672             return 0.0;
673         }
674
675         [EditorBrowsable(EditorBrowsableState.Never)]
676         protected virtual double AccessibilityGetMaximum()
677         {
678             return 0.0;
679         }
680
681         [EditorBrowsable(EditorBrowsableState.Never)]
682         protected virtual bool AccessibilitySetCurrent(double value)
683         {
684             return false;
685         }
686
687         [EditorBrowsable(EditorBrowsableState.Never)]
688         protected virtual double AccessibilityGetMinimumIncrement()
689         {
690             return 0.0;
691         }
692
693         [EditorBrowsable(EditorBrowsableState.Never)]
694         protected virtual bool AccessibilityIsScrollable()
695         {
696             return false;
697         }
698
699         [EditorBrowsable(EditorBrowsableState.Never)]
700         protected virtual string AccessibilityGetText(int startOffset, int endOffset)
701         {
702             return "";
703         }
704
705         [EditorBrowsable(EditorBrowsableState.Never)]
706         protected virtual int AccessibilityGetCharacterCount()
707         {
708             return 0;
709         }
710
711         [EditorBrowsable(EditorBrowsableState.Never)]
712         protected virtual int AccessibilityGetCursorOffset()
713         {
714             return 0;
715         }
716
717         [EditorBrowsable(EditorBrowsableState.Never)]
718         protected virtual bool AccessibilitySetCursorOffset(int offset)
719         {
720             return false;
721         }
722
723         [EditorBrowsable(EditorBrowsableState.Never)]
724         protected virtual AccessibilityRange AccessibilityGetTextAtOffset(int offset, AccessibilityTextBoundary boundary)
725         {
726             return new AccessibilityRange();
727         }
728
729         [EditorBrowsable(EditorBrowsableState.Never)]
730         protected virtual AccessibilityRange AccessibilityGetSelection(int selectionNumber)
731         {
732             return new AccessibilityRange();
733         }
734
735         [EditorBrowsable(EditorBrowsableState.Never)]
736         protected virtual bool AccessibilityRemoveSelection(int selectionNumber)
737         {
738             return false;
739         }
740
741         [EditorBrowsable(EditorBrowsableState.Never)]
742         protected virtual bool AccessibilitySetSelection(int selectionNumber, int startOffset, int endOffset)
743         {
744             return false;
745         }
746
747         [EditorBrowsable(EditorBrowsableState.Never)]
748         protected virtual bool AccessibilityCopyText(int startPosition, int endPosition)
749         {
750             return false;
751         }
752
753         [EditorBrowsable(EditorBrowsableState.Never)]
754         protected virtual bool AccessibilityCutText(int startPosition, int endPosition)
755         {
756             return false;
757         }
758
759         [EditorBrowsable(EditorBrowsableState.Never)]
760         protected virtual bool AccessibilityInsertText(int startPosition, string text)
761         {
762             return false;
763         }
764
765         [EditorBrowsable(EditorBrowsableState.Never)]
766         protected virtual bool AccessibilitySetTextContents(string newContents)
767         {
768             return false;
769         }
770
771         [EditorBrowsable(EditorBrowsableState.Never)]
772         protected virtual bool AccessibilityDeleteText(int startPosition, int endPosition)
773         {
774             return false;
775         }
776
777         [EditorBrowsable(EditorBrowsableState.Never)]
778         protected virtual bool AccessibilityScrollToChild(View child)
779         {
780             return false;
781         }
782
783         [EditorBrowsable(EditorBrowsableState.Never)]
784         protected virtual int AccessibilityGetSelectedChildrenCount()
785         {
786             return 0;
787         }
788
789         [EditorBrowsable(EditorBrowsableState.Never)]
790         protected virtual View AccessibilityGetSelectedChild(int selectedChildIndex)
791         {
792             return null;
793         }
794
795         [EditorBrowsable(EditorBrowsableState.Never)]
796         protected virtual bool AccessibilitySelectChild(int childIndex)
797         {
798             return false;
799         }
800
801         [EditorBrowsable(EditorBrowsableState.Never)]
802         protected virtual bool AccessibilityDeselectSelectedChild(int selectedChildIndex)
803         {
804             return false;
805         }
806
807         [EditorBrowsable(EditorBrowsableState.Never)]
808         protected virtual bool AccessibilityIsChildSelected(int childIndex)
809         {
810             return false;
811         }
812
813         [EditorBrowsable(EditorBrowsableState.Never)]
814         protected virtual bool AccessibilitySelectAll()
815         {
816             return false;
817         }
818
819         [EditorBrowsable(EditorBrowsableState.Never)]
820         protected virtual bool AccessibilityClearSelection()
821         {
822             return false;
823         }
824
825         [EditorBrowsable(EditorBrowsableState.Never)]
826         protected virtual bool AccessibilityDeselectChild(int childIndex)
827         {
828             return false;
829         }
830     }
831 }