accessibility - The practice of making software usable by all people regardless of their abilities or disabilities. For Flex applications, a primary concern is whether they can be used by visually impaired users.
MSAA - Microsoft Active Accessibility, a specification by which MSAA client applications such as JAWS, a screen reader, communicate with MSAA server applications such as Flash Player.
IAccessible - A COM interface defined by MSAA so that MSAA clients can talk to MSAA servers.
ISimpleTextSelection - Another COM interface defined by Adobe to supplement IAccessible by providing information about text selection in components with editable text, since MSAA does not include this information.
accessibility implementation class - A subclass of flash.accessibility.AccessibilityImplementation which provides default MSAA behavior for a component.
accessibility properties - Information set into the flash.accessibility.AccessibilityProperties instance associated with a component, which customizes the default behavior of the accessibility implementation class for a particular component instance.
Most of the MX components had long had corresponding accessibility implementation classes. In Flex 4 we will provide accessibility implementaton classes for the new Spark components.
We will make it easier to write such classes by documenting the new Spark accessibility implementation classes in detail, and by providing and documenting the MSAA constants used in such classes.
We will make it easier to set the accessibility properties for a component by adding accessibilityName and accessibilityDescription properties to UIComponent.
Finally, we will turn on accessibility by default, so that unless a Flex application is compiled with -accessible=false it will automatically provide MSAA information to screen readers, when executing on Flash runtimes supporting MSAA.
Same as for MX components.
The following Spark components will be made accessible by writing a corresponding accessibility implementation class (e.g., spark.accessibility.ButtonAccImpl to go with spark.components.Button). The MSAA behavior provided by these classes is described in each link below.
Spark Component
Accessibility Implementation Class
mx.accessibility.AccImpl
mx.accessibility.AccImpl
spark.components.Button
spark.accessibility.ButtonBaseAccImpl
spark.components.ButtonBar
spark.accessibility.ButtonBarBaseAccImpl
spark.components.CheckBox
spark.accessibility.CheckBoxAccImpl
spark.components.ComboBox
spark.accessibility.ComboBoxAccImpl
spark.components.DropDownList
spark.accessibility.DropDownListAccImpl
spark.components.HSlider
spark.accessibility.SliderBaseAccImpl
spark.components.Label
spark.accessibility.TextBaseAccImpl
spark.components.List
spark.accessibility.ListBaseAccImpl
spark.components.NumericStepper
spark.accessibility.NumericStepperAccImpl
spark.components.Panel
spark.accessibility.PanelAccImpl
spark.components.RadioButton
spark.accessibility.RadioButtonAccImpl
spark.components.RichEditableText
spark.accessibility.RichEditableTextAccImpl
spark.components.RichText
spark.accessibility.TextBaseAccImpl
spark.components.Spinner
spark.accessibility.SpinnerAccImpl
spark.components.TabBar
spark.accessibility.TabBarAccImpl
spark.components.TitleWindow
spark.accessibility.TitleWindowAccImpl
spark.components.ToggleButton
spark.accessibility.ToggleButtonAccImpl
spark.components.VideoPlayer
spark.accessibility.VideoPlayerAccImpl
spark.components.VSlider
spark.accessibility.SliderBaseAccImpl
spark.components.DataGrid
spark.accessibility.DataGridAccImpl
The Spark accessibility implementation classes, like the MX ones, will extend the existing mx.accessibility.AccImpl class, which itself extends flash.accessibility.AccessibilityImplementation. A description of AccImpl is here:
The Spark accessibility implementation classes will live in spark.swc in the spark.accessibility package.
private static const STATE_SYSTEM_NORMAL:uint = 0×0;
private static const STATE_SYSTEM_UNAVAILABLE:uint = 0×00000001;
private static const STATE_SYSTEM_SELECTED:uint = 0×00000002;
private static const STATE_SYSTEM_FOCUSED:uint = 0×00000004;
private static const STATE_SYSTEM_PRESSED:uint = 0×00000008;
private static const STATE_SYSTEM_CHECKED:uint = 0×00000010;
private static const STATE_SYSTEM_MIXED:uint = 0×00000020;
private static const STATE_SYSTEM_INDETERMINATE:uint = 0×00000020;
private static const STATE_SYSTEM_READONLY:uint = 0×00000040;
private static const STATE_SYSTEM_HOTTRACKED:uint = 0×00000080;
private static const STATE_SYSTEM_DEFAULT:uint = 0×00000100;
private static const STATE_SYSTEM_EXPANDED:uint = 0×00000200;
private static const STATE_SYSTEM_COLLAPSED:uint = 0×00000400;
private static const STATE_SYSTEM_BUSY:uint = 0×00000800;
private static const STATE_SYSTEM_MARQUEED:uint = 0×00002000;
private static const STATE_SYSTEM_ANIMATED:uint = 0×00004000;
private static const STATE_SYSTEM_INVISIBLE:uint = 0×00008000;
private static const STATE_SYSTEM_OFFSCREEN:uint = 0×00010000;
private static const STATE_SYSTEM_SIZEABLE:uint = 0×00020000;
private static const STATE_SYSTEM_MOVEABLE:uint = 0×00040000;
private static const STATE_SYSTEM_SELFVOICING:uint = 0×00080000;
private static const STATE_SYSTEM_FOCUSABLE:uint = 0×00100000;
private static const STATE_SYSTEM_SELECTABLE:uint = 0×00200000;
private static const STATE_SYSTEM_LINKED:uint = 0×00400000;
private static const STATE_SYSTEM_TRAVERSED:uint = 0×00800000;
private static const STATE_SYSTEM_MULTISELECTABLE:uint = 0×01000000;
private static const STATE_SYSTEM_EXTSELECTABLE:uint = 0×02000000;
private static const STATE_SYSTEM_PROTECTED:uint = 0×20000000;
private static const STATE_SYSTEM_VALID:uint = 0×3fffffff;
private static const STATE_SYSTEM_HASPOPUP:uint = 0×40000000;
Predefined role constants (possible values of o.accRole(childId))
private static const ROLE_SYSTEM_TITLEBAR:uint = 0×1;
private static const ROLE_SYSTEM_MENUBAR:uint = 0×2;
private static const ROLE_SYSTEM_SCROLLBAR:uint = 0×3;
private static const ROLE_SYSTEM_GRIP:uint = 0×4;
private static const ROLE_SYSTEM_SOUND:uint = 0×5;
private static const ROLE_SYSTEM_CURSOR:uint = 0×6;
private static const ROLE_SYSTEM_CARET:uint = 0×7;
private static const ROLE_SYSTEM_ALERT:uint = 0×8;
private static const ROLE_SYSTEM_WINDOW:uint = 0×9;
private static const ROLE_SYSTEM_CLIENT:uint = 0xa;
private static const ROLE_SYSTEM_MENUPOPUP:uint = 0xb;
private static const ROLE_SYSTEM_MENUITEM:uint = 0xc;
private static const ROLE_SYSTEM_TOOLTIP:uint = 0xd;
private static const ROLE_SYSfTEM_APPLICATION:uint = 0xe;
private static const ROLE_SYSTEM_DOCUMENT:uint = 0xf;
private static const ROLE_SYSTEM_PANE:uint = 0×10;
private static const ROLE_SYSTEM_CHART:uint = 0×11;
private static const ROLE_SYSTEM_DIALOG:uint = 0×12;
private static const ROLE_SYSTEM_BORDER:uint = 0×13;
private static const ROLE_SYSTEM_GROUPING:uint = 0×14;
private static const ROLE_SYSTEM_SEPARATOR:uint = 0×15;
private static const ROLE_SYSTEM_TOOLBAR:uint = 0×16;
private static const ROLE_SYSTEM_STATUSBAR:uint = 0×17;
private static const ROLE_SYSTEM_TABLE:uint = 0×18;
private static const ROLE_SYSTEM_COLUMNHEADER:uint = 0×19;
private static const ROLE_SYSTEM_ROWHEADER:uint = 0×1a;
private static const ROLE_SYSTEM_COLUMN:uint = 0×1b;
private static const ROLE_SYSTEM_ROW:uint = 0×1c;
private static const ROLE_SYSTEM_CELL:uint = 0×1d;
private static const ROLE_SYSTEM_LINK:uint = 0×1e;
private static const ROLE_SYSTEM_HELPBALLOON:uint = 0×1f;
private static const ROLE_SYSTEM_CHARACTER:uint = 0×20;
private static const ROLE_SYSTEM_LIST:uint = 0×21;
private static const ROLE_SYSTEM_LISTITEM:uint = 0×22;
private static const ROLE_SYSTEM_OUTLINE:uint = 0×23;
private static const ROLE_SYSTEM_OUTLINEITEM:uint = 0×24;
private static const ROLE_SYSTEM_PAGETAB:uint = 0×25;
private static const ROLE_SYSTEM_PROPERTYPAGE:uint = 0×26;
private static const ROLE_SYSTEM_INDICATOR:uint = 0×27;
private static const ROLE_SYSTEM_GRAPHIC:uint = 0×28;
private static const ROLE_SYSTEM_STATICTEXT:uint = 0×29;
private static const ROLE_SYSTEM_TEXT:uint = 0×2a;
private static const ROLE_SYSTEM_PUSHBUTTON:uint = 0×2b;
private static const ROLE_SYSTEM_CHECKBUTTON:uint = 0×2c;
private static const ROLE_SYSTEM_RADIOBUTTON:uint = 0×2d;
private static const ROLE_SYSTEM_COMBOBOX:uint = 0×2e;
private static const ROLE_SYSTEM_DROPLIST:uint = 0×2f;
private static const ROLE_SYSTEM_PROGRESSBAR:uint = 0×30;
private static const ROLE_SYSTEM_DIAL:uint = 0×31;
private static const ROLE_SYSTEM_HOTKEYFIELD:uint = 0×32;
private static const ROLE_SYSTEM_SLIDER:uint = 0×33;
private static const ROLE_SYSTEM_SPINBUTTON:uint = 0×34;
private static const ROLE_SYSTEM_DIAGRAM:uint = 0×35;
private static const ROLE_SYSTEM_ANIMATION:uint = 0×36;
private static const ROLE_SYSTEM_EQUATION:uint = 0×37;
private static const ROLE_SYSTEM_BUTTONDROPDOWN:uint = 0×38;
private static const ROLE_SYSTEM_BUTTONMENU:uint = 0×39;
private static const ROLE_SYSTEM_BUTTONDROPDOWNGRID:uint = 0×3a;
private static const ROLE_SYSTEM_WHITESPACE:uint = 0×3b;
private static const ROLE_SYSTEM_PAGETABLIST:uint = 0×3c;
private static const ROLE_SYSTEM_CLOCK:uint = 0×3d;
private static const ROLE_SYSTEM_SPLITBUTTON:uint = 0×3e;
private static const ROLE_SYSTEM_IPADDRESS:uint = 0×3f;
private static const ROLE_SYSTEM_OUTLINEBUTTON:uint = 0×40;
private static const EVENT_MIN:uint = 0×00000001;
private static const EVENT_MAX:uint = 0×7FFFFFFF;
private static const EVENT_SYSTEM_SOUND:uint = 0×0001;
private static const EVENT_SYSTEM_ALERT:uint = 0×0002;
private static const EVENT_SYSTEM_FOREGROUND:uint = 0×0003;
private static const EVENT_SYSTEM_MENUSTART:uint = 0×0004;
private static const EVENT_SYSTEM_MENUEND:uint = 0×0005;
private static const EVENT_SYSTEM_MENUPOPUPSTART:uint = 0×0006;
private static const EVENT_SYSTEM_MENUPOPUPEND:uint = 0×0007;
private static const EVENT_SYSTEM_CAPTURESTART:uint = 0×0008;
private static const EVENT_SYSTEM_CAPTUREEND:uint = 0×0009;
private static const EVENT_SYSTEM_MOVESIZESTART:uint = 0×000A;
private static const EVENT_SYSTEM_MOVESIZEEND:uint = 0×000B;
private static const EVENT_SYSTEM_CONTEXTHELPSTART:uint = 0×000C;
private static const EVENT_SYSTEM_CONTEXTHELPEND:uint = 0×000D;
private static const EVENT_SYSTEM_DRAGDROPSTART:uint = 0×000E;
private static const EVENT_SYSTEM_DRAGDROPEND:uint = 0×000F;
private static const EVENT_SYSTEM_DIALOGSTART:uint = 0×0010;
private static const EVENT_SYSTEM_DIALOGEND:uint = 0×0011;
private static const EVENT_SYSTEM_SCROLLINGSTART:uint = 0×0012;
private static const EVENT_SYSTEM_SCROLLINGEND:uint = 0×0013;
private static const EVENT_SYSTEM_SWITCHSTART:uint = 0×0014;
private static const EVENT_SYSTEM_SWITCHEND:uint = 0×0015;
private static const EVENT_SYSTEM_MINIMIZESTART:uint = 0×0016;
private static const EVENT_SYSTEM_MINIMIZEEND:uint = 0×0017;
private static const EVENT_OBJECT_CREATE:uint = 0×8000
private static const EVENT_OBJECT_DESTROY:uint = 0×8001
private static const EVENT_OBJECT_SHOW:uint = 0×8002
private static const EVENT_OBJECT_HIDE:uint = 0×8003
private static const EVENT_OBJECT_REORDER:uint = 0×8004
private static const EVENT_OBJECT_FOCUS:uint = 0×8005
private static const EVENT_OBJECT_SELECTION:uint = 0×8006
private static const EVENT_OBJECT_SELECTIONADD:uint = 0×8007
private static const EVENT_OBJECT_SELECTIONREMOVE:uint = 0×8008
private static const EVENT_OBJECT_SELECTIONWITHIN:uint = 0×8009
private static const EVENT_OBJECT_STATECHANGE:uint = 0×800A
private static const EVENT_OBJECT_LOCATIONCHANGE:uint = 0×800B
private static const EVENT_OBJECT_NAMECHANGE:uint = 0×800C
private static const EVENT_OBJECT_DESCRIPTIONCHANGE:uint = 0×800D;
private static const EVENT_OBJECT_VALUECHANGE:uint = 0×800E;
private static const EVENT_OBJECT_PARENTCHANGE:uint = 0×800F;
private static const EVENT_OBJECT_HELPCHANGE:uint = 0×8010 ;
private static const EVENT_OBJECT_DEFACTIONCHANGE:uint = 0×8011;
private static const EVENT_OBJECT_ACCELERATORCHANGE:uint = 0×8012;
TBD
To make it easier to set per-instance accessibility properties in MXML, we will add four new convenience getter/setters to UIComponent:
AccessibilityProperties property
UIComponent convenience accessor
description
accessibilityDescription
name
accessibilityName
shortcut
accessibilityShortcut
silent
accessibilityEnabled
The getters will simply return the relevant property of the UIComponent's accessibilityProperties object, or the default value if accessibilityProperties is null.
The setters will create the accessibilityProperties object if it does not yet exist, and then set the relevant property.
We will not expose convenience accessors for forceSimple or noAutoLabeling because Flex applications should not set these. Flash Player only supports a two-level hierarchy of IAccessible objects, and setting forceSimple to true in order to ignore the grandchildren doesn't seem useful. The Flash Player's auto-labeling algorithm is inappropriate for Flex apps, especially when we support "mirrored" layout for right-to-left locales.
The mxmlc compiler will default to using the option -accessible=true. This results in the required accessibility implementation classes being linked in and initialized, so that each UIComponent's accessibilityImplementation is non-null.
The AccImpl name for a control is only part of the ultimate name of that control if the control is in a form. The full MSAA name of such a control consists of the following parts, in this order, with a space between parts:
The new accessibility implementation classes live in the spark.accessibility package. Each one extends either mx.accessibility.AccImpl or another Spark acc impl:
New accessibility implementation class
Extends
spark.accessibility.ButtonAccImpl
mx.accessibility.AccImpl
They do not introduce any new properties or methods.
The ASDoc for each new class will be the description in the component links above.
TBD
The following getter/setters will be added to UIComponent:
/**
* A convenience accessor for the 'silent' property
* in this UIComponent's accessibilityProperties object.
*
* Note that accessibilityEnabled has the opposite sense from silent;
* accessibilityEnabled is true when silent is false and vice versa.
*
* The getter simply returns accessibilityProperties.silent,
* or true if accessibilityProperties is null.
* The setter first checks whether accessibilityProperties is null, and if it is,
* sets it to a new AccessibilityProperties instance;
* then it sets accessibilityProperties.silent.
*/
public function get accessibilityEnabled():Boolean
public function set accessibilityEnabled(value:Boolean):void
/**
* A convenience accessor for the 'name' property
* in this UIComponent's accessibilityProperties object.
*
* The getter simply returns accessibilityProperties.name,
* or "" if accessibilityProperties is null.
* The setter first checks whether accessibilityProperties is null, and if it is,
* sets it to a new AccessibilityProperties instance;
* then it sets accessibilityProperties.name.
*/
public function get accessibilityName():String
public function set accessibilityName(value:String):void
/**
* A convenience accessor for the 'description' property
* in this UIComponent's accessibilityProperties object.
*
* The getter simply returns accessibilityProperties.description,
* or "" if accessibilityProperties is null.
* The setter first checks whether accessibilityProperties is null, and if it is,
* sets it to a new AccessibilityProperties instance;
* then it sets accessibilityProperties.description.
*/
public function get accessibilityDescription():String
public function set accessibilityDescription(value:String):void
/**
* A convenience accessor for the 'shortcut' property
* in this UIComponent's accessibilityProperties object.
*
* The getter simply returns accessibilityProperties.shortcut,
* or "" if accessibilityProperties is null.
* The setter first checks whether accessibilityProperties is null, and if it is,
* sets it to a new AccessibilityProperties instance;
* then it sets accessibilityProperties.shortcut.
*/
public function get accessibilityShortcut():String
public function set accessibilityShortcut(value:String):void
None.
TBD
TBD
None.
None.
None.
None.
None.
None.
None.
That's what this feature is all about!
No performance issue.
None.
None.
TBD.
None.
None.
TBD
TBD
[[include site:open_commentlogin (not found)]]
Wiki: Flex 4
Wiki: MX AccImpl
Wiki: Spark ButtonBarBaseAccImpl
Wiki: Spark ButtonBaseAccImpl
Wiki: Spark CheckBoxAccImpl
Wiki: Spark ComboBoxAccImpl
Wiki: Spark DataGridAccImpl
Wiki: Spark DropDownListAccImpl
Wiki: Spark ListBaseAccImpl
Wiki: Spark NumericStepperAccImpl
Wiki: Spark PanelAccImpl
Wiki: Spark RadioButtonAccImpl
Wiki: Spark RichEditableTextAccImpl
Wiki: Spark SliderBaseAccImpl
Wiki: Spark SpinnerAccImpl
Wiki: Spark TextBaseAccImpl
Wiki: Spark TitleWindowAccImpl
Wiki: Spark ToggleButtonAccImpl
Wiki: Spark VideoPlayerAccImpl