Merge remote-tracking branch 'origin/master' into tizen
[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.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         /// In essence, this is equivalent to calling EmitAccessibilityStateChangedEvent in a loop for all specified states.
333         /// If recursive mode is specified, all children of the Accessibility object will also re-emit the states.
334         /// </remarks>
335         /// <param name="states">Accessibility States</param>
336         /// <param name="notifyMode">Controls the notification strategy</param>
337         [EditorBrowsable(EditorBrowsableState.Never)]
338         public void NotifyAccessibilityStatesChange(AccessibilityStates states, AccessibilityStatesNotifyMode notifyMode)
339         {
340             if (states is null)
341             {
342                 throw new ArgumentNullException(nameof(states));
343             }
344
345             Interop.ControlDevel.DaliToolkitDevelControlNotifyAccessibilityStateChange(SwigCPtr, states.BitMask, (int)notifyMode);
346             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
347         }
348
349         /// <summary>
350         /// Gets Accessibility States.
351         /// </summary>
352         /// <returns>Accessibility States</returns>
353         [EditorBrowsable(EditorBrowsableState.Never)]
354         public AccessibilityStates GetAccessibilityStates()
355         {
356             var result = new AccessibilityStates {BitMask = Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityStates(SwigCPtr)};
357             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
358             return result;
359         }
360
361         ///////////////////////////////////////////////////////////////////
362         // ************************ Accessible ************************* //
363         ///////////////////////////////////////////////////////////////////
364
365         /// <summary>
366         /// Emits accessibility property changed event.
367         /// </summary>
368         /// <param name="changeEvent">Property changed event</param>
369         [EditorBrowsable(EditorBrowsableState.Never)]
370         public void EmitAccessibilityEvent(AccessibilityPropertyChangeEvent changeEvent)
371         {
372             Interop.ControlDevel.DaliAccessibilityEmitAccessibilityEvent(SwigCPtr, Convert.ToInt32(changeEvent));
373             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
374         }
375
376         /// <summary>
377         /// Emits accessibility states changed event.
378         /// </summary>
379         /// <param name="state">Accessibility state</param>
380         /// <param name="equal">True if the state is set or enabled, otherwise false</param>
381         [EditorBrowsable(EditorBrowsableState.Never)]
382         public void EmitAccessibilityStateChangedEvent(AccessibilityState state, bool equal)
383         {
384             Interop.ControlDevel.DaliAccessibilityEmitAccessibilityStateChangedEvent(SwigCPtr, (int)state, Convert.ToInt32(equal));
385             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
386         }
387
388         /// <summary>
389         /// Emits accessibility text inserted event.
390         /// </summary>
391         /// <param name="cursorPosition">Text cursor position</param>
392         /// <param name="length">Text length</param>
393         /// <param name="content">Inserted text content</param>
394         [EditorBrowsable(EditorBrowsableState.Never)]
395         public void EmitTextInsertedEvent(int cursorPosition, int length, string content)
396         {
397             Interop.ControlDevel.DaliAccessibilityEmitTextInsertedEvent(SwigCPtr, cursorPosition, length, content);
398             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
399         }
400
401         /// <summary>
402         /// Emits accessibility text deleted event.
403         /// </summary>
404         /// <param name="cursorPosition">Text cursor position</param>
405         /// <param name="length">Text length</param>
406         /// <param name="content">Inserted text content</param>
407         [EditorBrowsable(EditorBrowsableState.Never)]
408         public void EmitTextDeletedEvent(int cursorPosition, int length, string content)
409         {
410             Interop.ControlDevel.DaliAccessibilityEmitTextDeletedEvent(SwigCPtr, cursorPosition, length, content);
411             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
412         }
413
414         /// <summary>
415         /// Emits accessibility text cursor moved event.
416         /// </summary>
417         /// <param name="cursorPosition">The new cursor position</param>
418         [EditorBrowsable(EditorBrowsableState.Never)]
419         public void EmitTextCursorMovedEvent(int cursorPosition)
420         {
421             Interop.ControlDevel.DaliAccessibilityEmitTextCursorMovedEvent(SwigCPtr, cursorPosition);
422             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
423         }
424
425         ///////////////////////////////////////////////////////////////////
426         // ************************** Bridge *************************** //
427         ///////////////////////////////////////////////////////////////////
428
429         /// <summary>
430         /// Registers component as a source of an accessibility "default label".
431         /// The "Default label" is a text that could be read by screen-reader immediately
432         /// after the navigation context has changed (window activates, popup shows up, tab changes)
433         /// and before first UI element is highlighted.
434         /// </summary>
435         [EditorBrowsable(EditorBrowsableState.Never)]
436         public void RegisterDefaultLabel()
437         {
438             Interop.ControlDevel.DaliAccessibilityBridgeRegisterDefaultLabel(SwigCPtr);
439             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
440         }
441
442         /// <summary>
443         /// Unregisters component that has been registered previously as a source of an accessibility "default label".
444         /// The "Default label" is a text that could be read by screen-reader immediately
445         /// after the navigation context has changed (window activates, popup shows up, tab changes)
446         /// and before first UI element is highlighted.
447         /// </summary>
448         [EditorBrowsable(EditorBrowsableState.Never)]
449         public void UnregisterDefaultLabel()
450         {
451             Interop.ControlDevel.DaliAccessibilityBridgeUnregisterDefaultLabel(SwigCPtr);
452             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
453         }
454
455         /// <summary>
456         /// Sets the specific constructor for creating accessibility structure with its role and interface.
457         /// </summary>
458         /// <remarks>
459         /// The method should be called inside OnInitialize method of all classes inheriting from View.
460         /// </remarks>
461         /// <param name="role">Accessibility role</param>
462         /// <param name="accessibilityInterface">Accessibility interface</param>
463         [EditorBrowsable(EditorBrowsableState.Never)]
464         public void SetAccessibilityConstructor(Role role, AccessibilityInterface accessibilityInterface = AccessibilityInterface.None)
465         {
466             // We have to store the interface flags until we remove SetAccessibilityConstructor and switch to native C# interfaces
467             AtspiInterfaceFlags = (1U << (int)accessibilityInterface);
468             Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityConstructor(SwigCPtr, (int)role);
469             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
470         }
471
472         [EditorBrowsable(EditorBrowsableState.Never)]
473         protected override void Dispose(bool disposing)
474         {
475             if (disposed)
476             {
477                 return;
478             }
479
480             if (disposing == false)
481             {
482                 if (IsNativeHandleInvalid() || SwigCMemOwn == false)
483                 {
484                     // at this case, implicit nor explicit dispose is not required. No native object is made.
485                     disposed = true;
486                     return;
487                 }
488             }
489
490             if (disposing)
491             {
492                 Unparent();
493             }
494
495             base.Dispose(disposing);
496         }
497
498         [EditorBrowsable(EditorBrowsableState.Never)]
499         protected static readonly string AccessibilityActivateAction = "activate";
500         [EditorBrowsable(EditorBrowsableState.Never)]
501         protected static readonly string AccessibilityReadingSkippedAction = "ReadingSkipped";
502         [EditorBrowsable(EditorBrowsableState.Never)]
503         protected static readonly string AccessibilityReadingCancelledAction = "ReadingCancelled";
504         [EditorBrowsable(EditorBrowsableState.Never)]
505         protected static readonly string AccessibilityReadingStoppedAction = "ReadingStopped";
506         [EditorBrowsable(EditorBrowsableState.Never)]
507         protected static readonly string AccessibilityReadingPausedAction = "ReadingPaused";
508         [EditorBrowsable(EditorBrowsableState.Never)]
509         protected static readonly string AccessibilityReadingResumedAction = "ReadingResumed";
510
511         [EditorBrowsable(EditorBrowsableState.Never)]
512         private static readonly string[] AccessibilityActions = {
513             AccessibilityActivateAction,
514             AccessibilityReadingSkippedAction,
515             AccessibilityReadingCancelledAction,
516             AccessibilityReadingStoppedAction,
517             AccessibilityReadingPausedAction,
518             AccessibilityReadingResumedAction,
519         };
520
521         [EditorBrowsable(EditorBrowsableState.Never)]
522         protected virtual string AccessibilityGetName()
523         {
524             return "";
525         }
526
527         [EditorBrowsable(EditorBrowsableState.Never)]
528         protected virtual string AccessibilityGetDescription()
529         {
530             return "";
531         }
532
533         [EditorBrowsable(EditorBrowsableState.Never)]
534         protected virtual bool AccessibilityDoAction(string name)
535         {
536             return false;
537         }
538
539         [EditorBrowsable(EditorBrowsableState.Never)]
540         protected virtual AccessibilityStates AccessibilityCalculateStates()
541         {
542             var states = AccessibilityInitialStates;
543
544             states[AccessibilityState.Focused] = this.State == States.Focused;
545             states[AccessibilityState.Enabled] = this.State != States.Disabled;
546             states[AccessibilityState.Sensitive] = this.Sensitive;
547
548             return states;
549         }
550
551         [EditorBrowsable(EditorBrowsableState.Never)]
552         protected virtual int AccessibilityGetActionCount()
553         {
554             return AccessibilityActions.Length;
555         }
556
557         [EditorBrowsable(EditorBrowsableState.Never)]
558         protected virtual string AccessibilityGetActionName(int index)
559         {
560             if (index >= 0 && index < AccessibilityActions.Length)
561             {
562                 return AccessibilityActions[index];
563             }
564             else
565             {
566                 return "";
567             }
568         }
569
570         [EditorBrowsable(EditorBrowsableState.Never)]
571         protected virtual bool AccessibilityShouldReportZeroChildren()
572         {
573             return false;
574         }
575
576         [EditorBrowsable(EditorBrowsableState.Never)]
577         protected virtual double AccessibilityGetMinimum()
578         {
579             return 0.0;
580         }
581
582         [EditorBrowsable(EditorBrowsableState.Never)]
583         protected virtual double AccessibilityGetCurrent()
584         {
585             return 0.0;
586         }
587
588         [EditorBrowsable(EditorBrowsableState.Never)]
589         protected virtual double AccessibilityGetMaximum()
590         {
591             return 0.0;
592         }
593
594         [EditorBrowsable(EditorBrowsableState.Never)]
595         protected virtual bool AccessibilitySetCurrent(double value)
596         {
597             return false;
598         }
599
600         [EditorBrowsable(EditorBrowsableState.Never)]
601         protected virtual double AccessibilityGetMinimumIncrement()
602         {
603             return 0.0;
604         }
605
606         [EditorBrowsable(EditorBrowsableState.Never)]
607         protected virtual bool AccessibilityIsScrollable()
608         {
609             return false;
610         }
611
612         [EditorBrowsable(EditorBrowsableState.Never)]
613         protected virtual string AccessibilityGetText(int startOffset, int endOffset)
614         {
615             return "";
616         }
617
618         [EditorBrowsable(EditorBrowsableState.Never)]
619         protected virtual int AccessibilityGetCharacterCount()
620         {
621             return 0;
622         }
623
624         [EditorBrowsable(EditorBrowsableState.Never)]
625         protected virtual int AccessibilityGetCursorOffset()
626         {
627             return 0;
628         }
629
630         [EditorBrowsable(EditorBrowsableState.Never)]
631         protected virtual bool AccessibilitySetCursorOffset(int offset)
632         {
633             return false;
634         }
635
636         [EditorBrowsable(EditorBrowsableState.Never)]
637         protected virtual AccessibilityRange AccessibilityGetTextAtOffset(int offset, AccessibilityTextBoundary boundary)
638         {
639             return new AccessibilityRange();
640         }
641
642         [EditorBrowsable(EditorBrowsableState.Never)]
643         protected virtual AccessibilityRange AccessibilityGetSelection(int selectionNumber)
644         {
645             return new AccessibilityRange();
646         }
647
648         [EditorBrowsable(EditorBrowsableState.Never)]
649         protected virtual bool AccessibilityRemoveSelection(int selectionNumber)
650         {
651             return false;
652         }
653
654         [EditorBrowsable(EditorBrowsableState.Never)]
655         protected virtual bool AccessibilitySetSelection(int selectionNumber, int startOffset, int endOffset)
656         {
657             return false;
658         }
659
660         [EditorBrowsable(EditorBrowsableState.Never)]
661         protected virtual bool AccessibilityCopyText(int startPosition, int endPosition)
662         {
663             return false;
664         }
665
666         [EditorBrowsable(EditorBrowsableState.Never)]
667         protected virtual bool AccessibilityCutText(int startPosition, int endPosition)
668         {
669             return false;
670         }
671
672         [EditorBrowsable(EditorBrowsableState.Never)]
673         protected virtual bool AccessibilityInsertText(int startPosition, string text)
674         {
675             return false;
676         }
677
678         [EditorBrowsable(EditorBrowsableState.Never)]
679         protected virtual bool AccessibilitySetTextContents(string newContents)
680         {
681             return false;
682         }
683
684         [EditorBrowsable(EditorBrowsableState.Never)]
685         protected virtual bool AccessibilityDeleteText(int startPosition, int endPosition)
686         {
687             return false;
688         }
689
690         [EditorBrowsable(EditorBrowsableState.Never)]
691         protected virtual bool AccessibilityScrollToChild(View child)
692         {
693             return false;
694         }
695
696         [EditorBrowsable(EditorBrowsableState.Never)]
697         protected virtual int AccessibilityGetSelectedChildrenCount()
698         {
699             return 0;
700         }
701
702         [EditorBrowsable(EditorBrowsableState.Never)]
703         protected virtual View AccessibilityGetSelectedChild(int selectedChildIndex)
704         {
705             return null;
706         }
707
708         [EditorBrowsable(EditorBrowsableState.Never)]
709         protected virtual bool AccessibilitySelectChild(int childIndex)
710         {
711             return false;
712         }
713
714         [EditorBrowsable(EditorBrowsableState.Never)]
715         protected virtual bool AccessibilityDeselectSelectedChild(int selectedChildIndex)
716         {
717             return false;
718         }
719
720         [EditorBrowsable(EditorBrowsableState.Never)]
721         protected virtual bool AccessibilityIsChildSelected(int childIndex)
722         {
723             return false;
724         }
725
726         [EditorBrowsable(EditorBrowsableState.Never)]
727         protected virtual bool AccessibilitySelectAll()
728         {
729             return false;
730         }
731
732         [EditorBrowsable(EditorBrowsableState.Never)]
733         protected virtual bool AccessibilityClearSelection()
734         {
735             return false;
736         }
737
738         [EditorBrowsable(EditorBrowsableState.Never)]
739         protected virtual bool AccessibilityDeselectChild(int childIndex)
740         {
741             return false;
742         }
743     }
744 }