/* * Copyright(c) 2021 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ using System; using System.ComponentModel; using System.Runtime.InteropServices; using Tizen.NUI; namespace Tizen.NUI.BaseComponents { /// /// Address represents an unique object address on accessibility bus. /// [EditorBrowsable(EditorBrowsableState.Never)] public class Address { /// /// Creates an initialized Address. /// /// Accessibility bus /// Accessibility path [EditorBrowsable(EditorBrowsableState.Never)] public Address(string bus, string path) { Bus = bus; Path = path; } /// /// Gets or sets accessibility bus. /// [EditorBrowsable(EditorBrowsableState.Never)] public string Bus { get; set; } /// /// Gets or sets accessibility path. /// [EditorBrowsable(EditorBrowsableState.Never)] public string Path { get; set; } } /// /// AddressCollection. /// [EditorBrowsable(EditorBrowsableState.Never)] public class AddressCollection : SafeHandle { /// /// Creates an initialized AddressCollection. /// /// Initialized AddressCollection [EditorBrowsable(EditorBrowsableState.Never)] public AddressCollection(IntPtr collection) : base(collection, true) { } /// /// Checks whether this handle is invalid or not. /// [EditorBrowsable(EditorBrowsableState.Never)] public override bool IsInvalid { get { return this.handle == IntPtr.Zero; } } /// /// Gets the size of accessibility relation. /// /// Accessibility relation /// The size of relation, which means the number of elements [EditorBrowsable(EditorBrowsableState.Never)] public uint GetRelationSize(AccessibilityRelationType relation) { uint result = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsRelationSize(this, Convert.ToInt32(relation)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return result; } /// /// Gets Address object using contained bus and path. /// /// Accessibility relation /// Position /// Accessibility Adress [EditorBrowsable(EditorBrowsableState.Never)] public Address GetAddressAt(AccessibilityRelationType relation, int position) { var bus = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 0); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); var path = Interop.ControlDevel.DaliToolkitDevelControlAccessibilityRelationsAt(this, Convert.ToInt32(relation), position, 1); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return new Address(bus, path); } /// /// Releases handle itself. /// /// true when released successfully. [EditorBrowsable(EditorBrowsableState.Never)] protected override bool ReleaseHandle() { Interop.ControlDevel.DaliToolkitDevelControlDeleteAccessibilityRelations(handle); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); this.SetHandle(IntPtr.Zero); return true; } } /// /// AccessibilityRange is used to store data related with Text. /// [EditorBrowsable(EditorBrowsableState.Never)] public class AccessibilityRange { /// /// Start position in stored text. /// public int StartOffset { get; set; } = 0; /// /// End position in stored text. /// public int EndOffset { get; set; } = 0; /// /// Text content in stored text. /// public string Content { get; set; } = ""; } /// /// View is the base class for all views. /// /// 3 public partial class View { /////////////////////////////////////////////////////////////////// // ****************** Accessibility Attributes ****************** // /////////////////////////////////////////////////////////////////// /// /// Adds or modifies the value matched with given key. /// /// /// Modification takes place if key was previously set. /// /// The key to insert /// The value to insert [EditorBrowsable(EditorBrowsableState.Never)] public void AppendAccessibilityAttribute(string key, string value) { Interop.ControlDevel.DaliToolkitDevelControlAppendAccessibilityAttribute(SwigCPtr, key, value); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Erases a key with its value from accessibility attributes. /// /// The key to remove [EditorBrowsable(EditorBrowsableState.Never)] public void RemoveAccessibilityAttribute(string key) { Interop.ControlDevel.DaliToolkitDevelControlRemoveAccessibilityAttribute(SwigCPtr, key); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Clears accessibility attributes. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ClearAccessibilityAttributes() { Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityAttributes(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /////////////////////////////////////////////////////////////////// // ************************** Highlight ************************ // /////////////////////////////////////////////////////////////////// /// /// Clears accessibility highlight. /// /// True if cleared, otherwise false when it is not possible [EditorBrowsable(EditorBrowsableState.Never)] public bool ClearAccessibilityHighlight() { bool result = Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityHighlight(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return result; } /// /// Grabs accessibility highlight. /// /// True if cleared, otherwise false when it is not possible [EditorBrowsable(EditorBrowsableState.Never)] public bool GrabAccessibilityHighlight() { bool result = Interop.ControlDevel.DaliToolkitDevelControlGrabAccessibilityHighlight(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return result; } /// /// Flag to check whether this view is highlighted or not. /// [EditorBrowsable(EditorBrowsableState.Never)] protected bool IsHighlighted { get { using (View view = Accessibility.Accessibility.Instance.GetCurrentlyHighlightedView()) { return view == this; } } } /////////////////////////////////////////////////////////////////// // ****************** Accessibility Relations ******************* // /////////////////////////////////////////////////////////////////// /// /// Creates relation between objects. /// /// Object which will be in relation. /// Relation type. /// You must pass valid object. NULL could not be in relation. [EditorBrowsable(EditorBrowsableState.Never)] public void AppendAccessibilityRelation(View second, AccessibilityRelationType relation) { if (second is null) { throw new ArgumentNullException(nameof(second)); } Interop.ControlDevel.DaliToolkitDevelControlAppendAccessibilityRelation(SwigCPtr, second.SwigCPtr, (int)relation); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Removes accessibility relation. /// /// Object which will be removed in relation /// Relation type [EditorBrowsable(EditorBrowsableState.Never)] public void RemoveAccessibilityRelation(View second, AccessibilityRelationType relation) { if (second is null) { throw new ArgumentNullException(nameof(second)); } Interop.ControlDevel.DaliToolkitDevelControlRemoveAccessibilityRelation(SwigCPtr, second.SwigCPtr, (int)relation); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Removes all previously appended relations. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ClearAccessibilityRelations() { Interop.ControlDevel.DaliToolkitDevelControlClearAccessibilityRelations(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Gets accessibility collection connected with the current object. /// /// AddressCollection [EditorBrowsable(EditorBrowsableState.Never)] public AddressCollection GetAccessibilityRelations() { var result = new AddressCollection(Interop.ControlDevel.DaliToolkitDevelControlNewGetAccessibilityRelations(SwigCPtr)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return result; } /////////////////////////////////////////////////////////////////// // ********************* ReadingInfoType *********************** // /////////////////////////////////////////////////////////////////// /// /// Sets accessibility reading information. /// /// Reading information type [EditorBrowsable(EditorBrowsableState.Never)] public void SetAccessibilityReadingInfoTypes(AccessibilityReadingInfoTypes type) { Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityReadingInfoTypes(SwigCPtr, (int)type); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Gets accessibility reading information. /// /// Reading information type [EditorBrowsable(EditorBrowsableState.Never)] public AccessibilityReadingInfoTypes GetAccessibilityReadingInfoTypes() { AccessibilityReadingInfoTypes result = (AccessibilityReadingInfoTypes)Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityReadingInfoTypes(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return result; } /////////////////////////////////////////////////////////////////// // ******************** Accessibility States ******************* // /////////////////////////////////////////////////////////////////// /// /// Notifies sending notifications about the current states to accessibility clients. /// /// /// If recursive is true, all children of the Accessibility object will also re-emit the states. /// /// Accessibility States /// Flag to point if notifications of children's state would be sent [EditorBrowsable(EditorBrowsableState.Never)] public void NotifyAccessibilityStatesChange(AccessibilityStates states, bool recursive) { Interop.ControlDevel.DaliToolkitDevelControlNotifyAccessibilityStatesChange(SwigCPtr, (ulong)states, Convert.ToInt32(recursive)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Gets Accessibility States. /// /// Accessibility States [EditorBrowsable(EditorBrowsableState.Never)] public AccessibilityStates GetAccessibilityStates() { AccessibilityStates result = (AccessibilityStates) Interop.ControlDevel.DaliToolkitDevelControlGetAccessibilityStates(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return result; } /////////////////////////////////////////////////////////////////// // ************************ Accessible ************************* // /////////////////////////////////////////////////////////////////// /// /// Emits accessibility property changed event. /// /// Property changed event [EditorBrowsable(EditorBrowsableState.Never)] public void EmitAccessibilityEvent(AccessibilityPropertyChangeEvent changeEvent) { Interop.ControlDevel.DaliAccessibilityEmitAccessibilityEvent(SwigCPtr, Convert.ToInt32(changeEvent)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Emits accessibility states changed event. /// /// Accessibility state /// True if the state is set or enabled, otherwise false [EditorBrowsable(EditorBrowsableState.Never)] public void EmitAccessibilityStatesChangedEvent(AccessibilityStates state, bool equal) { Interop.ControlDevel.DaliAccessibilityEmitAccessibilityStatesChangedEvent(SwigCPtr, (ulong)state, Convert.ToInt32(equal)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Emits accessibility text inserted event. /// /// Text cursor position /// Text length /// Inserted text content [EditorBrowsable(EditorBrowsableState.Never)] public void EmitTextInsertedEvent(int cursorPosition, int length, string content) { Interop.ControlDevel.DaliAccessibilityEmitTextInsertedEvent(SwigCPtr, cursorPosition, length, content); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Emits accessibility text deleted event. /// /// Text cursor position /// Text length /// Inserted text content [EditorBrowsable(EditorBrowsableState.Never)] public void EmitTextDeletedEvent(int cursorPosition, int length, string content) { Interop.ControlDevel.DaliAccessibilityEmitTextDeletedEvent(SwigCPtr, cursorPosition, length, content); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Emits accessibility text cursor moved event. /// /// The new cursor position [EditorBrowsable(EditorBrowsableState.Never)] public void EmitTextCursorMovedEvent(int cursorPosition) { Interop.ControlDevel.DaliAccessibilityEmitTextCursorMovedEvent(SwigCPtr, cursorPosition); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /////////////////////////////////////////////////////////////////// // ************************** Bridge *************************** // /////////////////////////////////////////////////////////////////// /// /// Registers component as a source of an accessibility "default label". /// The "Default label" is a text that could be read by screen-reader immediately /// after the navigation context has changed (window activates, popup shows up, tab changes) /// and before first UI element is highlighted. /// [EditorBrowsable(EditorBrowsableState.Never)] public void RegisterDefaultLabel() { Interop.ControlDevel.DaliAccessibilityBridgeRegisterDefaultLabel(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Unregisters component that has been registered previously as a source of an accessibility "default label". /// The "Default label" is a text that could be read by screen-reader immediately /// after the navigation context has changed (window activates, popup shows up, tab changes) /// and before first UI element is highlighted. /// [EditorBrowsable(EditorBrowsableState.Never)] public void UnregisterDefaultLabel() { Interop.ControlDevel.DaliAccessibilityBridgeUnregisterDefaultLabel(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } private IntPtr DuplicateString(string value) { return Interop.ControlDevel.DaliToolkitDevelControlAccessibleImplNUIDuplicateString(value ?? ""); } private IntPtr DuplicateStates(AccessibilityStates states) { return Interop.ControlDevel.DaliToolkitDevelControlConvertState((ulong)states); } private IntPtr DuplicateRange(AccessibilityRange range) { return Interop.ControlDevel.DaliAccessibilityNewRange(range.StartOffset, range.EndOffset, range.Content); } private Interop.ControlDevel.AccessibilityDelegate accessibilityDelegate = null; private IntPtr accessibilityDelegatePtr; /// /// Sets the specific constructor for creating accessibility structure with its role and interface. /// /// /// The method should be called inside OnInitialize method of all classes inheriting from View. /// /// Accessibility role /// Accessibility interface [EditorBrowsable(EditorBrowsableState.Never)] public void SetAccessibilityConstructor(Role role, AccessibilityInterface accessibilityInterface = AccessibilityInterface.None) { var size = Marshal.SizeOf(); if (accessibilityDelegate == null) { accessibilityDelegate = new Interop.ControlDevel.AccessibilityDelegate() { GetName = () => DuplicateString(AccessibilityGetName()), GetDescription = () => DuplicateString(AccessibilityGetDescription()), DoAction = (name) => AccessibilityDoAction(Marshal.PtrToStringAnsi(name)), CalculateStates = (states) => DuplicateStates(AccessibilityCalculateStates(states)), GetActionCount = () => AccessibilityGetActionCount(), GetActionName = (index) => DuplicateString(AccessibilityGetActionName(index)), ShouldReportZeroChildren = () => AccessibilityShouldReportZeroChildren(), GetMinimum = () => AccessibilityGetMinimum(), GetCurrent = () => AccessibilityGetCurrent(), GetMaximum = () => AccessibilityGetMaximum(), SetCurrent = (value) => AccessibilitySetCurrent(value), GetMinimumIncrement = () => AccessibilityGetMinimumIncrement(), IsScrollable = () => AccessibilityIsScrollable(), GetText = (startOffset, endOffset) => DuplicateString(AccessibilityGetText(startOffset, endOffset)), GetCharacterCount = () => AccessibilityGetCharacterCount(), GetCursorOffset = () => AccessibilityGetCursorOffset(), SetCursorOffset = (offset) => AccessibilitySetCursorOffset(offset), GetTextAtOffset = (offset, boundary) => DuplicateRange(AccessibilityGetTextAtOffset(offset, (AccessibilityTextBoundary)boundary)), GetSelection = (selectionNumber) => DuplicateRange(AccessibilityGetSelection(selectionNumber)), RemoveSelection = (selectionNumber) => AccessibilityRemoveSelection(selectionNumber), SetSelection = (selectionNumber, startOffset, endOffset) => AccessibilitySetSelection(selectionNumber, startOffset, endOffset), CopyText = (startPosition, endPosition) => AccessibilityCopyText(startPosition, endPosition), CutText = (startPosition, endPosition) => AccessibilityCutText(startPosition, endPosition), InsertText = (startPosition, text) => AccessibilityInsertText(startPosition, Marshal.PtrToStringAnsi(text)), SetTextContents = (newContents) => AccessibilitySetTextContents(Marshal.PtrToStringAnsi(newContents)), DeleteText = (startPosition, endPosition) => AccessibilityDeleteText(startPosition, endPosition), ScrollToChild = (child) => { using (var view = new View(child, true)) { return AccessibilityScrollToChild(view); } }, GetSelectedChildrenCount = () => AccessibilityGetSelectedChildrenCount(), GetSelectedChild = (selectedChildIndex) => View.getCPtr(AccessibilityGetSelectedChild(selectedChildIndex)).Handle, SelectChild = (childIndex) => AccessibilitySelectChild(childIndex), DeselectSelectedChild = (selectedChildIndex) => AccessibilityDeselectSelectedChild(selectedChildIndex), IsChildSelected = (childIndex) => AccessibilityIsChildSelected(childIndex), SelectAll = () => AccessibilitySelectAll(), ClearSelection = () => AccessibilityClearSelection(), DeselectChild = (childIndex) => AccessibilityDeselectChild(childIndex), }; accessibilityDelegatePtr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(accessibilityDelegate, accessibilityDelegatePtr, false); } Interop.ControlDevel.DaliToolkitDevelControlSetAccessibilityConstructor(SwigCPtr, (int)role, (int)accessibilityInterface, accessibilityDelegatePtr, size); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// A helper method to manipulate individual bit flags (e.g. turn them on or off) /// /// An object that accumulates combination of bit flags /// A bit flag to be operated /// A state of the bit flag to be set (0 == off, 1 == on) [EditorBrowsable(EditorBrowsableState.Never)] static public void FlagSetter(ref T obj ,T bit, bool state) { dynamic result = obj; dynamic param = bit; if (state) { result |= param; } else { result &= (~param); } obj = result; } [EditorBrowsable(EditorBrowsableState.Never)] protected override void Dispose(bool disposing) { if (disposed) { return; } if (disposing == false) { if (IsNativeHandleInvalid() || SwigCMemOwn == false) { // at this case, implicit nor explicit dispose is not required. No native object is made. disposed = true; return; } } if (disposing) { Unparent(); } if (accessibilityDelegate != null) { Marshal.DestroyStructure(accessibilityDelegatePtr); Marshal.FreeHGlobal(accessibilityDelegatePtr); accessibilityDelegate = null; } base.Dispose(disposing); } [EditorBrowsable(EditorBrowsableState.Never)] protected static readonly string AccessibilityActivateAction = "activate"; [EditorBrowsable(EditorBrowsableState.Never)] protected static readonly string AccessibilityReadingSkippedAction = "ReadingSkipped"; [EditorBrowsable(EditorBrowsableState.Never)] protected static readonly string AccessibilityReadingCancelledAction = "ReadingCancelled"; [EditorBrowsable(EditorBrowsableState.Never)] protected static readonly string AccessibilityReadingStoppedAction = "ReadingStopped"; [EditorBrowsable(EditorBrowsableState.Never)] protected static readonly string AccessibilityReadingPausedAction = "ReadingPaused"; [EditorBrowsable(EditorBrowsableState.Never)] protected static readonly string AccessibilityReadingResumedAction = "ReadingResumed"; [EditorBrowsable(EditorBrowsableState.Never)] private static readonly string[] AccessibilityActions = { AccessibilityActivateAction, AccessibilityReadingSkippedAction, AccessibilityReadingCancelledAction, AccessibilityReadingStoppedAction, AccessibilityReadingPausedAction, AccessibilityReadingResumedAction, }; [EditorBrowsable(EditorBrowsableState.Never)] protected virtual string AccessibilityGetName() { return ""; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual string AccessibilityGetDescription() { return ""; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityDoAction(string name) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual AccessibilityStates AccessibilityCalculateStates(ulong states) { AccessibilityStates accessibilityStates = (AccessibilityStates)states; FlagSetter(ref accessibilityStates, AccessibilityStates.Highlightable, this.AccessibilityHighlightable); FlagSetter(ref accessibilityStates, AccessibilityStates.Focusable, this.Focusable); FlagSetter(ref accessibilityStates, AccessibilityStates.Focused, this.State == States.Focused); FlagSetter(ref accessibilityStates, AccessibilityStates.Highlighted, this.IsHighlighted); FlagSetter(ref accessibilityStates, AccessibilityStates.Enabled, this.State != States.Disabled); FlagSetter(ref accessibilityStates, AccessibilityStates.Sensitive, this.Sensitive); FlagSetter(ref accessibilityStates, AccessibilityStates.Visible, true); FlagSetter(ref accessibilityStates, AccessibilityStates.Defunct, !this.IsOnWindow); return accessibilityStates; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual int AccessibilityGetActionCount() { return AccessibilityActions.Length; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual string AccessibilityGetActionName(int index) { if (index >= 0 && index < AccessibilityActions.Length) { return AccessibilityActions[index]; } else { return ""; } } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityShouldReportZeroChildren() { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual double AccessibilityGetMinimum() { return 0.0; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual double AccessibilityGetCurrent() { return 0.0; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual double AccessibilityGetMaximum() { return 0.0; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilitySetCurrent(double value) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual double AccessibilityGetMinimumIncrement() { return 0.0; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityIsScrollable() { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual string AccessibilityGetText(int startOffset, int endOffset) { return ""; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual int AccessibilityGetCharacterCount() { return 0; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual int AccessibilityGetCursorOffset() { return 0; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilitySetCursorOffset(int offset) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual AccessibilityRange AccessibilityGetTextAtOffset(int offset, AccessibilityTextBoundary boundary) { return new AccessibilityRange(); } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual AccessibilityRange AccessibilityGetSelection(int selectionNumber) { return new AccessibilityRange(); } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityRemoveSelection(int selectionNumber) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilitySetSelection(int selectionNumber, int startOffset, int endOffset) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityCopyText(int startPosition, int endPosition) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityCutText(int startPosition, int endPosition) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityInsertText(int startPosition, string text) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilitySetTextContents(string newContents) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityDeleteText(int startPosition, int endPosition) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityScrollToChild(View child) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual int AccessibilityGetSelectedChildrenCount() { return 0; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual View AccessibilityGetSelectedChild(int selectedChildIndex) { return null; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilitySelectChild(int childIndex) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityDeselectSelectedChild(int selectedChildIndex) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityIsChildSelected(int childIndex) { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilitySelectAll() { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityClearSelection() { return false; } [EditorBrowsable(EditorBrowsableState.Never)] protected virtual bool AccessibilityDeselectChild(int childIndex) { return false; } } }