Difference between revisions of "LCL Accessibility"
Sekelsenmat (talk | contribs) |
Sekelsenmat (talk | contribs) |
||
Line 12: | Line 12: | ||
<delphi> | <delphi> | ||
+ | TLazAccessibilityRole = ( | ||
+ | larAlertMessage, // An object that is used to alert the user. | ||
+ | larAnimation, // An object that displays an animation. | ||
+ | larButton, // A button. | ||
+ | larButtonDropDown, // A button that drops down a list of items or drops down something else | ||
+ | larCell, // A cell in a table. | ||
+ | larChart, // An object that displays a graphical representation of data. | ||
+ | larCheckBox, // An object that can be checked or unchecked, or sometimes in an intermediary state | ||
+ | larClock, // A clock displaying time. | ||
+ | larComboBox, // A list of choices that the user can select from. | ||
+ | larGrid, // A grid control which displays cells | ||
+ | larIgnore, // Something to be ignored. For example a blank space between other objects. | ||
+ | larImage, // A graphic or picture or an icon. | ||
+ | larHotkeyField, // A hotkey field that allows the user to enter a key sequence. | ||
+ | larHotLink, // A link to something else. | ||
+ | larLabel, // A text label as usually placed near other widgets. | ||
+ | larListView, // A list of items, from which the user can select one or more items. | ||
+ | larListItem, // An item in a list of items. | ||
+ | larResizeGrip, // A grip that the user can drag to change the size of widgets. | ||
+ | larTextEditorMultiline, // A multi-line text editor (for example: TMemo, SynEdit) | ||
+ | larTextEditorSingleline, // A single-line text editor (for example: TEdit) | ||
+ | larTreeView, // A list of items in a tree structure. | ||
+ | larTreeItem, // An item in a tree structure. | ||
+ | larWindow // A top level window. | ||
+ | ); | ||
+ | |||
{ TLazAccessibleObject } | { TLazAccessibleObject } | ||
Revision as of 12:45, 20 January 2012
Accessibility means planning and developing applications in a way in which everyone will be able to use them, including blind, persons with low vision, with motion disorders, etc.
LCL Accessibility Introduction
The LCL should automatically provide accessibility for all of its standard controls, or allow the underlying widgetset to provide its own accessibility for the controls utilized directly from the widgetset. LCL users need to provide accessibility only for TCustomControl descendents introduced in the application. LCL developers need to provide accessibility for all TCustomControl descendents in the LCL and also for all non-windowed controls in the LCL (such as TLabel).
The accessibility information provided is a tree of accessible objects which represents the controls hierarchy in the application and which can cover both windowed and non-windowed controls. What the screen reader does exactly with this information is theorically up to him to decide, but of course that it is necessary to test to verify if the most popular screen readers are actually using the information provided in the expected way. The LCL is responsible for making this bridges, since it provides a quite simple accessibility interface and platform APIs, in special the one from Mac OS X, are more complex.
TControl will automatically create an accessible object and place it correctly in the accessible objects tree, so it is not necessary to manually create accessible objects unless a control has sub-items which should be represented individually and are not TControl-descendents. One typical example are the items of the TTreeView control. They are not controls, but can be selected individually and therefore each item should be an accessible object on its own.
<delphi>
TLazAccessibilityRole = ( larAlertMessage, // An object that is used to alert the user. larAnimation, // An object that displays an animation. larButton, // A button. larButtonDropDown, // A button that drops down a list of items or drops down something else larCell, // A cell in a table. larChart, // An object that displays a graphical representation of data. larCheckBox, // An object that can be checked or unchecked, or sometimes in an intermediary state larClock, // A clock displaying time. larComboBox, // A list of choices that the user can select from. larGrid, // A grid control which displays cells larIgnore, // Something to be ignored. For example a blank space between other objects. larImage, // A graphic or picture or an icon. larHotkeyField, // A hotkey field that allows the user to enter a key sequence. larHotLink, // A link to something else. larLabel, // A text label as usually placed near other widgets. larListView, // A list of items, from which the user can select one or more items. larListItem, // An item in a list of items. larResizeGrip, // A grip that the user can drag to change the size of widgets. larTextEditorMultiline, // A multi-line text editor (for example: TMemo, SynEdit) larTextEditorSingleline, // A single-line text editor (for example: TEdit) larTreeView, // A list of items in a tree structure. larTreeItem, // An item in a tree structure. larWindow // A top level window. );
{ TLazAccessibleObject }
TLazAccessibleObject = class private FHandle: PtrInt; function GetHandle: PtrInt; protected FChildren: TFPList; // of TLazAccessibleObject class procedure WSRegisterClass; virtual;//override; public // Primary information AccessibleDescription: TCaption; AccessibleValue: TCaption; AccessibleRole: TLazAccessibilityRole; // Secondary information for notifications SelectedText: string; // OwnerControl: TControl; Parent: TLazAccessibleObject; DataObject: TObject; // Available to be used to connect to an object SecondaryHandle: PtrInt; // Available for Widgetsets to use constructor Create(AOwner: TControl); virtual; destructor Destroy; override; procedure SetAccesibilityFields(const ADescription, AValue: string; const ARole: TLazAccessibilityRole); function FindOwnerWinControl: TWinControl; function AddChildAccessibleObject: TLazAccessibleObject; virtual; procedure ClearChildAccessibleObjects; procedure RemoveChildAccessibleObject(AObject: TLazAccessibleObject); function GetChildAccessibleObject(AIndex: Integer): TLazAccessibleObject; function GetChildAccessibleObjectWithDataObject(ADataObject: TObject): TLazAccessibleObject; function GetChildAccessibleObjectsCount: Integer; function GetSelectedChildAccessibleObject: TLazAccessibleObject; virtual; function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; virtual; procedure SendNotification(ANotification: TLazAccessibilityNotification); property Handle: PtrInt read GetHandle; end;
TControl = class(TLCLComponent) private
...
// accessibility procedure SetAccesibilityFields(const ADescription, AValue: string; const ARole: TLazAccessibilityRole); function GetAccessibleObject: TLazAccessibleObject; function CreateAccessibleObject: TLazAccessibleObject; virtual; function GetSelectedChildAccessibleObject: TLazAccessibleObject; virtual; function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; virtual; public // standard properties, which should be supported by all descendants property AccessibleDescription: TCaption read GetAccessibleDescription write SetAccessibleDescription; property AccessibleValue: TCaption read GetAccessibleValue write SetAccessibleValue; property AccessibleRole: TLazAccessibilityRole read GetAccessibleRole write SetAccessibleRole;
...
end;
</delphi>
Screen Readers=
The first step in testing screen reader support is installing one and being able to use it to check what users will see when using your application.
Mac OS X VoiceOver
The screen reader for the vast majority of users in Mac OS X is VoiceOver which comes pre-installed in Mac OS X. To activate it go to Settings->Universal Access and turn VoiceOver on. It couldnt be any simpler. Using it is also mostly easy and intuitive.
Orca for Linux
Orca is currently the most popular screen reader in Linux for both GNOME and KDE. See: http://en.wikipedia.org/wiki/Orca_(assistive_technology)
Accessibility Inspector Tools
Accessibility inspectors can help a lot at checking if the application is giving correct information.
Mac OS X
In /Developer/Applications/Utilities/Accessibility Tools/ there is an Accessibility Inspector which will be very useful when developing in this platform.
Accessibility APIs
Carbon
Search Google for:
site:developer.apple.com carbon accessibility
Cocoa
Microsoft Active Accessibility
See: http://en.wikipedia.org/wiki/Microsoft_Active_Accessibility
Also: http://www.stevetrefethen.com/blog/UsingtheMSAAIAccessibleinterfacewithinaDelphiApplication.aspx
AT-SPI for Linux
See: http://en.wikipedia.org/wiki/AT-SPI
Qt
See: http://doc.qt.nokia.com/4.3/qaccessiblewidget.html
Also: http://doc.qt.nokia.com/4.3/qaccessible.html#Role-enum
Also: http://doc.qt.nokia.com/qq/qq24-accessibility.html
Concepts mapping
TLazAccessibleObject | Qt | Mac OS X | MSAA | AT-SPI | Comments |
---|---|---|---|---|---|
Role | QAccessible::Role | AXRole | Role | ? | - |
Description | QAccessibleWidget::setDescription | AXRoleDescription and AXDescription | ? | ? | - |
Value | QAccessibleWidget::setValue | AXTitle, AXValue | Value, Name, State | ? | - |