[NUI] Rebase develnui (DevelNUI only patches --> master) (#3910)
[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.Highlightable, this.AccessibilityHighlightable);
632             FlagSetter(ref accessibilityStates, AccessibilityStates.Focusable, this.Focusable);
633             FlagSetter(ref accessibilityStates, AccessibilityStates.Focused, this.State == States.Focused);
634             FlagSetter(ref accessibilityStates, AccessibilityStates.Highlighted, this.IsHighlighted);
635             FlagSetter(ref accessibilityStates, AccessibilityStates.Enabled, this.State != States.Disabled);
636             FlagSetter(ref accessibilityStates, AccessibilityStates.Sensitive, this.Sensitive);
637             FlagSetter(ref accessibilityStates, AccessibilityStates.Visible, true);
638             FlagSetter(ref accessibilityStates, AccessibilityStates.Defunct, !this.IsOnWindow);
639
640             return accessibilityStates;
641         }
642
643         [EditorBrowsable(EditorBrowsableState.Never)]
644         protected virtual int AccessibilityGetActionCount()
645         {
646             return AccessibilityActions.Length;
647         }
648
649         [EditorBrowsable(EditorBrowsableState.Never)]
650         protected virtual string AccessibilityGetActionName(int index)
651         {
652             if (index >= 0 && index < AccessibilityActions.Length)
653             {
654                 return AccessibilityActions[index];
655             }
656             else
657             {
658                 return "";
659             }
660         }
661
662         [EditorBrowsable(EditorBrowsableState.Never)]
663         protected virtual bool AccessibilityShouldReportZeroChildren()
664         {
665             return false;
666         }
667
668         [EditorBrowsable(EditorBrowsableState.Never)]
669         protected virtual double AccessibilityGetMinimum()
670         {
671             return 0.0;
672         }
673
674         [EditorBrowsable(EditorBrowsableState.Never)]
675         protected virtual double AccessibilityGetCurrent()
676         {
677             return 0.0;
678         }
679
680         [EditorBrowsable(EditorBrowsableState.Never)]
681         protected virtual double AccessibilityGetMaximum()
682         {
683             return 0.0;
684         }
685
686         [EditorBrowsable(EditorBrowsableState.Never)]
687         protected virtual bool AccessibilitySetCurrent(double value)
688         {
689             return false;
690         }
691
692         [EditorBrowsable(EditorBrowsableState.Never)]
693         protected virtual double AccessibilityGetMinimumIncrement()
694         {
695             return 0.0;
696         }
697
698         [EditorBrowsable(EditorBrowsableState.Never)]
699         protected virtual bool AccessibilityIsScrollable()
700         {
701             return false;
702         }
703
704         [EditorBrowsable(EditorBrowsableState.Never)]
705         protected virtual string AccessibilityGetText(int startOffset, int endOffset)
706         {
707             return "";
708         }
709
710         [EditorBrowsable(EditorBrowsableState.Never)]
711         protected virtual int AccessibilityGetCharacterCount()
712         {
713             return 0;
714         }
715
716         [EditorBrowsable(EditorBrowsableState.Never)]
717         protected virtual int AccessibilityGetCursorOffset()
718         {
719             return 0;
720         }
721
722         [EditorBrowsable(EditorBrowsableState.Never)]
723         protected virtual bool AccessibilitySetCursorOffset(int offset)
724         {
725             return false;
726         }
727
728         [EditorBrowsable(EditorBrowsableState.Never)]
729         protected virtual AccessibilityRange AccessibilityGetTextAtOffset(int offset, AccessibilityTextBoundary boundary)
730         {
731             return new AccessibilityRange();
732         }
733
734         [EditorBrowsable(EditorBrowsableState.Never)]
735         protected virtual AccessibilityRange AccessibilityGetSelection(int selectionNumber)
736         {
737             return new AccessibilityRange();
738         }
739
740         [EditorBrowsable(EditorBrowsableState.Never)]
741         protected virtual bool AccessibilityRemoveSelection(int selectionNumber)
742         {
743             return false;
744         }
745
746         [EditorBrowsable(EditorBrowsableState.Never)]
747         protected virtual bool AccessibilitySetSelection(int selectionNumber, int startOffset, int endOffset)
748         {
749             return false;
750         }
751
752         [EditorBrowsable(EditorBrowsableState.Never)]
753         protected virtual bool AccessibilityCopyText(int startPosition, int endPosition)
754         {
755             return false;
756         }
757
758         [EditorBrowsable(EditorBrowsableState.Never)]
759         protected virtual bool AccessibilityCutText(int startPosition, int endPosition)
760         {
761             return false;
762         }
763
764         [EditorBrowsable(EditorBrowsableState.Never)]
765         protected virtual bool AccessibilityInsertText(int startPosition, string text)
766         {
767             return false;
768         }
769
770         [EditorBrowsable(EditorBrowsableState.Never)]
771         protected virtual bool AccessibilitySetTextContents(string newContents)
772         {
773             return false;
774         }
775
776         [EditorBrowsable(EditorBrowsableState.Never)]
777         protected virtual bool AccessibilityDeleteText(int startPosition, int endPosition)
778         {
779             return false;
780         }
781
782         [EditorBrowsable(EditorBrowsableState.Never)]
783         protected virtual bool AccessibilityScrollToChild(View child)
784         {
785             return false;
786         }
787
788         [EditorBrowsable(EditorBrowsableState.Never)]
789         protected virtual int AccessibilityGetSelectedChildrenCount()
790         {
791             return 0;
792         }
793
794         [EditorBrowsable(EditorBrowsableState.Never)]
795         protected virtual View AccessibilityGetSelectedChild(int selectedChildIndex)
796         {
797             return null;
798         }
799
800         [EditorBrowsable(EditorBrowsableState.Never)]
801         protected virtual bool AccessibilitySelectChild(int childIndex)
802         {
803             return false;
804         }
805
806         [EditorBrowsable(EditorBrowsableState.Never)]
807         protected virtual bool AccessibilityDeselectSelectedChild(int selectedChildIndex)
808         {
809             return false;
810         }
811
812         [EditorBrowsable(EditorBrowsableState.Never)]
813         protected virtual bool AccessibilityIsChildSelected(int childIndex)
814         {
815             return false;
816         }
817
818         [EditorBrowsable(EditorBrowsableState.Never)]
819         protected virtual bool AccessibilitySelectAll()
820         {
821             return false;
822         }
823
824         [EditorBrowsable(EditorBrowsableState.Never)]
825         protected virtual bool AccessibilityClearSelection()
826         {
827             return false;
828         }
829
830         [EditorBrowsable(EditorBrowsableState.Never)]
831         protected virtual bool AccessibilityDeselectChild(int childIndex)
832         {
833             return false;
834         }
835     }
836 }