// Copyright 2007. Adobe Systems Incorporated. All Rights Reserved. package fl.accessibility { import flash.accessibility.Accessibility; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import fl.controls.LabelButton; import fl.core.UIComponent; import fl.events.ComponentEvent; /** * The LabelButtonAccImpl class, also called the LabelButton Accessibility Implementation class, * is used to make a LabelButton component accessible. This class enables communication * between a LabelButton component and a screen reader. Screen readers are used to translate * screen content into synthesized speech or braille for visually impaired users. * *
The LabelButtonAccImpl class supports system roles, object-based events, and states.
* *A LabelButton reports the role ROLE_SYSTEM_PUSHBUTTON
(0x2B) to a screen
* reader.
A LabelButton reports the following states to a screen reader:
*STATE_SYSTEM_NORMAL
(0x00000000)STATE_SYSTEM_UNAVAILABLE
(0x00000001)STATE_SYSTEM_FOCUSED
(0x00000004)STATE_SYSTEM_PRESSED
(0x00000008)STATE_SYSTEM_FOCUSABLE
(0x00100000)A LabelButton dispatches the following events to a screen reader:
*EVENT_OBJECT_STATECHANGE
(0x800A)EVENT_OBJECT_NAMECHANGE
(0x800C)hookAccessibility()
method.
* This is used for initializing LabelButtonAccImpl class to hook its
* createAccessibilityImplementation()
method to LabelButton class
* before it gets called from UIComponent.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static var accessibilityHooked:Boolean = hookAccessibility();
/**
* @private
* Static method for swapping the createAccessibilityImplementation()
* method of LabelButton with the LabelButtonAccImpl class.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static function hookAccessibility():Boolean {
LabelButton.createAccessibilityImplementation = createAccessibilityImplementation;
return true;
}
//--------------------------------------------------------------------------
// Class constants
//--------------------------------------------------------------------------
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static const STATE_SYSTEM_PRESSED:uint = 0x00000008;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static const EVENT_OBJECT_NAMECHANGE:uint = 0x800C;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static const EVENT_OBJECT_STATECHANGE:uint = 0x800A;
//--------------------------------------------------------------------------
// Class methods
//--------------------------------------------------------------------------
/**
* @private
* Method for creating the Accessibility class.
* This method is called from UIComponent.
*
* @param component The UIComponent instance that this AccImpl instance
* is making accessible.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public static function createAccessibilityImplementation(component:UIComponent):void {
component.accessibilityImplementation = new LabelButtonAccImpl(component);
}
/**
* Enables accessibility for a LabelButton component.
* This method is required for the compiler to activate
* the accessibility classes for a component.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public static function enableAccessibility():void {
}
//--------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------
/**
* @private
* @internal Nivesh says: I don't think we should document the constructors
* for the accessibility classes. End-users just have to call the
* static enableAccessibility method. They don't really create an
* instance of the classes.
*
* Creates a new LabelButtonAccImpl instance for the specified LabelButton component.
*
* @param component The LabelButton instance that this LabelButtonAccImpl instance
* makes accessible.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function LabelButtonAccImpl(component:UIComponent) {
super(component);
role = 0x2B;
}
//--------------------------------------------------------------------------
// Overridden properties: AccImpl
//--------------------------------------------------------------------------
/**
* @private
* Array of events that we should listen for from the master component.
*
* @return
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override protected function get eventsToHandle():Array {
return super.eventsToHandle.concat([
ComponentEvent.BUTTON_DOWN,
ComponentEvent.LABEL_CHANGE
]);
}
//--------------------------------------------------------------------------
// Overridden methods: AccessibilityImplementation
//--------------------------------------------------------------------------
/**
* @private
* IAccessible method for returning the state of the LabelButton.
* States are predefined for all the components in MSAA.
* Values are assigned to each state.
* Depending upon the button being pressed or released,
* a value is returned.
*
* @param childID The child id.
*
* @return State.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function get_accState(childID:uint):uint {
var accState:uint = getState(childID);
if (LabelButton(master).selected) {
accState |= STATE_SYSTEM_PRESSED;
}
return accState;
}
/**
* @private
* IAccessible method for returning the default action
* of the LabelButton, which is Press.
*
* @param childID The child id
*
* @return DefaultAction
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function get_accDefaultAction(childID:uint):String {
return "Press";
}
/**
* @private
* IAccessible method for performing the default action
* associated with LabelButton, which is Press.
*
* @param childID The child id.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override public function accDoDefaultAction(childID:uint):void {
if (master.enabled) {
var event:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN);
event.keyCode = Keyboard.SPACE;
master.dispatchEvent(event);
event = new KeyboardEvent(KeyboardEvent.KEY_UP);
event.keyCode = Keyboard.SPACE;
master.dispatchEvent(event);
}
}
//--------------------------------------------------------------------------
// Overridden methods: AccImpl
//--------------------------------------------------------------------------
/**
* @private
* method for returning the name of the LabelButton
* which is spoken out by the screen reader
* The LabelButton should return the label inside as the name of the LabelButton.
* The name returned here would take precedence over the name
* specified in the Accessibility panel.
*
* @param childID The child id.
*
* @return Name.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override protected function getName(childID:uint):String {
var label:String = LabelButton(master).label;
return label != null && label != "" ? label : "";
}
//--------------------------------------------------------------------------
// Overridden event handlers: AccImpl
//--------------------------------------------------------------------------
/**
* @private
* Override the generic event handler.
* All AccImpl must implement this to listen for events from its master component.
*
* @param event The event object.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
override protected function eventHandler(event:Event):void {
switch (event.type) {
case ComponentEvent.BUTTON_DOWN:
if(Accessibility.active) {
Accessibility.sendEvent(master, 0, EVENT_OBJECT_STATECHANGE);
Accessibility.updateProperties();
}
break;
case ComponentEvent.LABEL_CHANGE:
if(Accessibility.active) {
Accessibility.sendEvent(master, 0, EVENT_OBJECT_NAMECHANGE);
Accessibility.updateProperties();
}
break;
}
}
}
}