[NUI] Add SetUnderline, GetUnderline to Text Components
[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 popup component to accessibility tree.
428         /// </summary>
429         [EditorBrowsable(EditorBrowsableState.Never)]
430         public void RegisterPopup()
431         {
432             Interop.ControlDevel.DaliAccessibilityBridgeRegisterPopup(SwigCPtr);
433             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
434         }
435
436         /// <summary>
437         /// Removes the previously added popup to accessibility tree.
438         /// </summary>
439         [EditorBrowsable(EditorBrowsableState.Never)]
440         public void RemovePopup()
441         {
442             Interop.ControlDevel.DaliAccessibilityBridgeRemovePopup(SwigCPtr);
443             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
444         }
445
446         private IntPtr DuplicateString(string value)
447         {
448             return Interop.ControlDevel.DaliToolkitDevelControlAccessibleImplNUIDuplicateString(value ?? "");
449         }
450
451         private IntPtr DuplicateStates(AccessibilityStates states)
452         {
453             return Interop.ControlDevel.DaliToolkitDevelControlConvertState((ulong)states);
454         }
455
456         private IntPtr DuplicateRange(AccessibilityRange range)
457         {
458             return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content);
459         }
460
461         private Interop.ControlDevel.AccessibilityDelegate accessibilityDelegate = null;
462         private IntPtr accessibilityDelegatePtr;
463
464         /// <summary>
465         /// Sets the specific constructor for creating accessibility structure with its role and interface.
466         /// </summary>
467         /// <remarks>
468         /// The method should be called inside OnInitialize method of all classes inheriting from View.
469         /// </remarks>
470         /// <param name="role">Accessibility role</param>
471         /// <param name="accessibilityInterface">Accessibility interface</param>
472         [EditorBrowsable(EditorBrowsableState.Never)]
473         public void SetAccessibilityConstructor(Role role, AccessibilityInterface accessibilityInterface = AccessibilityInterface.None)
474         {
475             var size = Marshal.SizeOf<Interop.ControlDevel.AccessibilityDelegate>();
476
477             if (accessibilityDelegate == null)
478             {
479                 accessibilityDelegate = new Interop.ControlDevel.AccessibilityDelegate()
480                 {
481                     GetName = () => DuplicateString(AccessibilityGetName()),
482                     GetDescription = () => DuplicateString(AccessibilityGetDescription()),
483                     DoAction = (name) => AccessibilityDoAction(Marshal.PtrToStringAnsi(name)),
484                     CalculateStates = () => DuplicateStates(AccessibilityCalculateStates()),
485                     GetActionCount = () => AccessibilityGetActionCount(),
486                     GetActionName = (index) => DuplicateString(AccessibilityGetActionName(index)),
487                     ShouldReportZeroChildren = () => AccessibilityShouldReportZeroChildren(),
488                     GetMinimum = () => AccessibilityGetMinimum(),
489                     GetCurrent = () => AccessibilityGetCurrent(),
490                     GetMaximum = () => AccessibilityGetMaximum(),
491                     SetCurrent = (value) => AccessibilitySetCurrent(value),
492                     GetMinimumIncrement = () => AccessibilityGetMinimumIncrement(),
493                     IsScrollable = () => AccessibilityIsScrollable(),
494                     GetText = (startOffset, endOffset) => DuplicateString(AccessibilityGetText(startOffset, endOffset)),
495                     GetCharacterCount = () => AccessibilityGetCharacterCount(),
496                     GetCursorOffset = () => AccessibilityGetCursorOffset(),
497                     SetCursorOffset = (offset) => AccessibilitySetCursorOffset(offset),
498                     GetTextAtOffset = (offset, boundary) => DuplicateRange(AccessibilityGetTextAtOffset(offset, (AccessibilityTextBoundary)boundary)),
499                     GetSelection = (selectionNumber) => DuplicateRange(AccessibilityGetSelection(selectionNumber)),
500                     RemoveSelection = (selectionNumber) => AccessibilityRemoveSelection(selectionNumber),
501                     SetSelection = (selectionNumber, startOffset, endOffset) => AccessibilitySetSelection(selectionNumber, startOffset, endOffset),
502                     CopyText = (startPosition, endPosition) => AccessibilityCopyText(startPosition, endPosition),
503                     CutText = (startPosition, endPosition) => AccessibilityCutText(startPosition, endPosition),
504                     InsertText = (startPosition, text) => AccessibilityInsertText(startPosition, Marshal.PtrToStringAnsi(text)),
505                     SetTextContents = (newContents) => AccessibilitySetTextContents(Marshal.PtrToStringAnsi(newContents)),
506                     DeleteText = (startPosition, endPosition) => AccessibilityDeleteText(startPosition, endPosition),
507                     ScrollToChild = (child) => {
508                         using (var view = new View(child, true))
509                         {
510                             return AccessibilityScrollToChild(view);
511                         }
512                     },
513                     GetSelectedChildrenCount = () => AccessibilityGetSelectedChildrenCount(),
514                     GetSelectedChild = (selectedChildIndex) => View.getCPtr(AccessibilityGetSelectedChild(selectedChildIndex)).Handle,
515                     SelectChild = (childIndex) => AccessibilitySelectChild(childIndex),
516                     DeselectSelectedChild = (selectedChildIndex) => AccessibilityDeselectSelectedChild(selectedChildIndex),
517                     IsChildSelected = (childIndex) => AccessibilityIsChildSelected(childIndex),
518                     SelectAll = () => AccessibilitySelectAll(),
519                     ClearSelection = () => AccessibilityClearSelection(),
520                     DeselectChild = (childIndex) => AccessibilityDeselectChild(childIndex),
521                 };
522
523                 accessibilityDelegatePtr = Marshal.AllocHGlobal(size);
524                 Marshal.StructureToPtr(accessibilityDelegate, accessibilityDelegatePtr, false);
525             }
526
527             Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityConstructor(SwigCPtr, (int)role, (int)accessibilityInterface, accessibilityDelegatePtr, size);
528
529             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
530         }
531
532         /// <summary>
533         /// A helper method to manipulate individual bit flags (e.g. turn them on or off)
534         /// </summary>
535         /// <param name="obj">An object that accumulates combination of bit flags</param>
536         /// <param name="bit">A bit flag to be operated</param>
537         /// <param name="state">A state of the bit flag to be set (0 == off, 1 == on)</param>
538         [EditorBrowsable(EditorBrowsableState.Never)]
539         static public void FlagSetter<T>(ref T obj ,T bit, bool state)
540         {
541             dynamic result = obj;
542             dynamic param = bit;
543             if (state)
544             {
545                 result |= param;
546             }
547             else
548             {
549                 result &= (~param);
550             }
551             obj = result;
552         }
553
554         [EditorBrowsable(EditorBrowsableState.Never)]
555         protected override void Dispose(bool disposing)
556         {
557             base.Dispose(disposing);
558
559             if (accessibilityDelegate != null)
560             {
561                 Marshal.DestroyStructure<Interop.ControlDevel.AccessibilityDelegate>(accessibilityDelegatePtr);
562                 Marshal.FreeHGlobal(accessibilityDelegatePtr);
563                 accessibilityDelegate = null;
564             }
565         }
566
567         [EditorBrowsable(EditorBrowsableState.Never)]
568         protected static readonly string AccessibilityActivateAction = "activate";
569         [EditorBrowsable(EditorBrowsableState.Never)]
570         protected static readonly string AccessibilityReadingSkippedAction = "ReadingSkipped";
571         [EditorBrowsable(EditorBrowsableState.Never)]
572         protected static readonly string AccessibilityReadingCancelledAction = "ReadingCancelled";
573         [EditorBrowsable(EditorBrowsableState.Never)]
574         protected static readonly string AccessibilityReadingStoppedAction = "ReadingStopped";
575         [EditorBrowsable(EditorBrowsableState.Never)]
576         protected static readonly string AccessibilityReadingPausedAction = "ReadingPaused";
577         [EditorBrowsable(EditorBrowsableState.Never)]
578         protected static readonly string AccessibilityReadingResumedAction = "ReadingResumed";
579
580         [EditorBrowsable(EditorBrowsableState.Never)]
581         private static readonly string[] AccessibilityActions = {
582             AccessibilityActivateAction,
583             AccessibilityReadingSkippedAction,
584             AccessibilityReadingCancelledAction,
585             AccessibilityReadingStoppedAction,
586             AccessibilityReadingPausedAction,
587             AccessibilityReadingResumedAction,
588         };
589
590         [EditorBrowsable(EditorBrowsableState.Never)]
591         protected virtual string AccessibilityGetName()
592         {
593             return "";
594         }
595
596         [EditorBrowsable(EditorBrowsableState.Never)]
597         protected virtual string AccessibilityGetDescription()
598         {
599             return "";
600         }
601
602         [EditorBrowsable(EditorBrowsableState.Never)]
603         protected virtual bool AccessibilityDoAction(string name)
604         {
605             return false;
606         }
607
608         [EditorBrowsable(EditorBrowsableState.Never)]
609         protected virtual AccessibilityStates AccessibilityCalculateStates()
610         {
611             AccessibilityStates states = 0;
612
613             FlagSetter(ref states, AccessibilityStates.Highlightable, this.AccessibilityHighlightable);
614             FlagSetter(ref states, AccessibilityStates.Focusable, this.Focusable);
615             FlagSetter(ref states, AccessibilityStates.Focused, this.State == States.Focused);
616             FlagSetter(ref states, AccessibilityStates.Highlighted, this.IsHighlighted);
617             FlagSetter(ref states, AccessibilityStates.Enabled, this.State != States.Disabled);
618             FlagSetter(ref states, AccessibilityStates.Sensitive, this.Sensitive);
619             FlagSetter(ref states, AccessibilityStates.Visible, true);
620             FlagSetter(ref states, AccessibilityStates.Showing, this.Visibility);
621             FlagSetter(ref states, AccessibilityStates.Defunct, !this.IsOnWindow);
622
623             return states;
624         }
625
626         [EditorBrowsable(EditorBrowsableState.Never)]
627         protected virtual int AccessibilityGetActionCount()
628         {
629             return AccessibilityActions.Length;
630         }
631
632         [EditorBrowsable(EditorBrowsableState.Never)]
633         protected virtual string AccessibilityGetActionName(int index)
634         {
635             if (index >= 0 && index < AccessibilityActions.Length)
636             {
637                 return AccessibilityActions[index];
638             }
639             else
640             {
641                 return "";
642             }
643         }
644
645         [EditorBrowsable(EditorBrowsableState.Never)]
646         protected virtual bool AccessibilityShouldReportZeroChildren()
647         {
648             return false;
649         }
650
651         [EditorBrowsable(EditorBrowsableState.Never)]
652         protected virtual double AccessibilityGetMinimum()
653         {
654             return 0.0;
655         }
656
657         [EditorBrowsable(EditorBrowsableState.Never)]
658         protected virtual double AccessibilityGetCurrent()
659         {
660             return 0.0;
661         }
662
663         [EditorBrowsable(EditorBrowsableState.Never)]
664         protected virtual double AccessibilityGetMaximum()
665         {
666             return 0.0;
667         }
668
669         [EditorBrowsable(EditorBrowsableState.Never)]
670         protected virtual bool AccessibilitySetCurrent(double value)
671         {
672             return false;
673         }
674
675         [EditorBrowsable(EditorBrowsableState.Never)]
676         protected virtual double AccessibilityGetMinimumIncrement()
677         {
678             return 0.0;
679         }
680
681         [EditorBrowsable(EditorBrowsableState.Never)]
682         protected virtual bool AccessibilityIsScrollable()
683         {
684             return false;
685         }
686
687         [EditorBrowsable(EditorBrowsableState.Never)]
688         protected virtual string AccessibilityGetText(int startOffset, int endOffset)
689         {
690             return "";
691         }
692
693         [EditorBrowsable(EditorBrowsableState.Never)]
694         protected virtual int AccessibilityGetCharacterCount()
695         {
696             return 0;
697         }
698
699         [EditorBrowsable(EditorBrowsableState.Never)]
700         protected virtual int AccessibilityGetCursorOffset()
701         {
702             return 0;
703         }
704
705         [EditorBrowsable(EditorBrowsableState.Never)]
706         protected virtual bool AccessibilitySetCursorOffset(int offset)
707         {
708             return false;
709         }
710
711         [EditorBrowsable(EditorBrowsableState.Never)]
712         protected virtual AccessibilityRange AccessibilityGetTextAtOffset(int offset, AccessibilityTextBoundary boundary)
713         {
714             return new AccessibilityRange();
715         }
716
717         [EditorBrowsable(EditorBrowsableState.Never)]
718         protected virtual AccessibilityRange AccessibilityGetSelection(int selectionNumber)
719         {
720             return new AccessibilityRange();
721         }
722
723         [EditorBrowsable(EditorBrowsableState.Never)]
724         protected virtual bool AccessibilityRemoveSelection(int selectionNumber)
725         {
726             return false;
727         }
728
729         [EditorBrowsable(EditorBrowsableState.Never)]
730         protected virtual bool AccessibilitySetSelection(int selectionNumber, int startOffset, int endOffset)
731         {
732             return false;
733         }
734
735         [EditorBrowsable(EditorBrowsableState.Never)]
736         protected virtual bool AccessibilityCopyText(int startPosition, int endPosition)
737         {
738             return false;
739         }
740
741         [EditorBrowsable(EditorBrowsableState.Never)]
742         protected virtual bool AccessibilityCutText(int startPosition, int endPosition)
743         {
744             return false;
745         }
746
747         [EditorBrowsable(EditorBrowsableState.Never)]
748         protected virtual bool AccessibilityInsertText(int startPosition, string text)
749         {
750             return false;
751         }
752
753         [EditorBrowsable(EditorBrowsableState.Never)]
754         protected virtual bool AccessibilitySetTextContents(string newContents)
755         {
756             return false;
757         }
758
759         [EditorBrowsable(EditorBrowsableState.Never)]
760         protected virtual bool AccessibilityDeleteText(int startPosition, int endPosition)
761         {
762             return false;
763         }
764
765         [EditorBrowsable(EditorBrowsableState.Never)]
766         protected virtual bool AccessibilityScrollToChild(View child)
767         {
768             return false;
769         }
770
771         [EditorBrowsable(EditorBrowsableState.Never)]
772         protected virtual int AccessibilityGetSelectedChildrenCount()
773         {
774             return 0;
775         }
776
777         [EditorBrowsable(EditorBrowsableState.Never)]
778         protected virtual View AccessibilityGetSelectedChild(int selectedChildIndex)
779         {
780             return null;
781         }
782
783         [EditorBrowsable(EditorBrowsableState.Never)]
784         protected virtual bool AccessibilitySelectChild(int childIndex)
785         {
786             return false;
787         }
788
789         [EditorBrowsable(EditorBrowsableState.Never)]
790         protected virtual bool AccessibilityDeselectSelectedChild(int selectedChildIndex)
791         {
792             return false;
793         }
794
795         [EditorBrowsable(EditorBrowsableState.Never)]
796         protected virtual bool AccessibilityIsChildSelected(int childIndex)
797         {
798             return false;
799         }
800
801         [EditorBrowsable(EditorBrowsableState.Never)]
802         protected virtual bool AccessibilitySelectAll()
803         {
804             return false;
805         }
806
807         [EditorBrowsable(EditorBrowsableState.Never)]
808         protected virtual bool AccessibilityClearSelection()
809         {
810             return false;
811         }
812
813         [EditorBrowsable(EditorBrowsableState.Never)]
814         protected virtual bool AccessibilityDeselectChild(int childIndex)
815         {
816             return false;
817         }
818     }
819 }