// Copyright 2007. Adobe Systems Incorporated. All Rights Reserved.
package fl.controls {
import fl.controls.RadioButton;
import flash.utils.Dictionary;
import flash.events.EventDispatcher;
import flash.events.Event;
//--------------------------------------
// Events
//--------------------------------------
/**
* Dispatched when the selected RadioButton instance in a group changes.
*
* @includeExample examples/student_ar_fl_controls_RadioButtonGroup.change.1.as -noswf
* @eventType flash.events.Event.CHANGE
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Event(name="change", type="flash.events.Event")]
/**
* Dispatched when a RadioButton instance is clicked.
*
* @eventType flash.events.MouseEvent.CLICK
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
[Event(name="click", type="flash.events.MouseEvent")]
//--------------------------------------
// Class description
//--------------------------------------
/**
* The student_ar_fl_controls_RadioButtonGroup class defines a group of RadioButton components
* to act as a single component. When one radio button is selected, no other
* radio buttons from the same group can be selected.
*
* @see RadioButton
* @see RadioButton#group RadioButton.group
*
* @includeExample examples/student_ar_fl_controls_RadioButtonGroupExample.as
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public class student_ar_fl_controls_RadioButtonGroup extends EventDispatcher {
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static var groups:Object;
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static var groupCount:uint = 0;
/**
* Retrieves a reference to the specified radio button group.
*
* @param name The name of the group for which to retrieve a reference.
*
* @return A reference to the specified student_ar_fl_controls_RadioButtonGroup.
*
* @includeExample examples/student_ar_fl_controls_RadioButtonGroup.getGroup.1.as -noswf
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public static function getGroup(name:String):student_ar_fl_controls_RadioButtonGroup {
if (groups == null) { groups = {}; }
var group:student_ar_fl_controls_RadioButtonGroup = groups[name] as student_ar_fl_controls_RadioButtonGroup;
if (group == null) {
group = new student_ar_fl_controls_RadioButtonGroup(name);
// every so often, we should clean up old groups:
if ((++groupCount)%20 == 0) {
cleanUpGroups();
}
}
return group;
}
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static function registerGroup(group:student_ar_fl_controls_RadioButtonGroup):void {
if(groups == null){groups = {}}
groups[group.name] = group;
}
/**
* @private
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
private static function cleanUpGroups():void {
for (var n:String in groups) {
var group:student_ar_fl_controls_RadioButtonGroup = groups[n] as student_ar_fl_controls_RadioButtonGroup;
if (group.radioButtons.length == 0) {
delete(groups[n]);
}
}
}
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var _name:String;
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var radioButtons:Array;
/**
* @private (protected)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
protected var _selection:RadioButton;
// Should be a private constructor, but not allowed in AS3,
// so instead we'll make it work properly if you create a new
// student_ar_fl_controls_RadioButtonGroup manually.
/**
* Creates a new student_ar_fl_controls_RadioButtonGroup instance.
* This is usually done automatically when a radio button is instantiated.
*
* @param name The name of the radio button group.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function student_ar_fl_controls_RadioButtonGroup(name:String) {
_name = name;
radioButtons = [];
registerGroup(this);
}
/**
* Gets the instance name of the radio button.
*
* @default "student_ar_fl_controls_RadioButtonGroup"
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get name():String {
return _name;
}
/**
* Adds a radio button to the internal radio button array for use with
* radio button group indexing, which allows for the selection of a single radio button
* in a group of radio buttons. This method is used automatically by radio buttons,
* but can also be manually used to explicitly add a radio button to a group.
*
* @param radioButton The RadioButton instance to be added to the current radio button group.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function addRadioButton(radioButton:RadioButton):void {
if (radioButton.groupName != name) {
radioButton.groupName = name;
return;
}
radioButtons.push(radioButton);
if (radioButton.selected) { selection = radioButton; }
}
/**
* Clears the RadioButton instance from the internal list of radio buttons.
*
* @param radioButton The RadioButton instance to remove.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function removeRadioButton(radioButton:RadioButton):void {
var i:int = getRadioButtonIndex(radioButton);
if (i != -1) {
radioButtons.splice(i, 1);
}
if (_selection == radioButton) { _selection = null; }
}
/**
* Gets or sets a reference to the radio button that is currently selected
* from the radio button group.
*
* @includeExample examples/student_ar_fl_controls_RadioButtonGroup.selection.1.as -noswf
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get selection():RadioButton {
return _selection;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set selection(value:RadioButton):void {
if (_selection == value || value == null || getRadioButtonIndex(value) == -1) { return; }
_selection = value;
dispatchEvent(new Event(Event.CHANGE, true));
}
/**
* Gets or sets the selected radio button's value
property.
* If no radio button is currently selected, this property is null
.
*
* @includeExample examples/student_ar_fl_controls_RadioButtonGroup.selectedData.1.as -noswf
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get selectedData():Object {
var s:RadioButton = _selection;
return (s==null) ? null : s.value;
}
/**
* @private (setter)
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function set selectedData(value:Object):void {
for (var i:int = 0; i < radioButtons.length; i++) {
var rb:RadioButton = radioButtons[i] as RadioButton;
if (rb.value == value) {
selection = rb;
return;
}
}
}
/**
* Returns the index of the specified RadioButton instance.
*
* @param radioButton The RadioButton instance to locate in the current student_ar_fl_controls_RadioButtonGroup.
*
* @return The index of the specified RadioButton component, or -1 if the specified RadioButton was not found.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function getRadioButtonIndex(radioButton:RadioButton):int {
for (var i:int = 0; i < radioButtons.length; i++) {
var rb:RadioButton = radioButtons[i] as RadioButton;
if(rb == radioButton) {
return i;
}
}
return -1;
}
/**
* Retrieves the RadioButton component at the specified index location.
*
* @param index The index of the RadioButton component in the student_ar_fl_controls_RadioButtonGroup component,
* where the index of the first component is 0.
*
* @return The specified RadioButton component.
*
* @throws RangeError The specified index is less than 0 or greater than or equal to the length of the data provider.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function getRadioButtonAt(index:int):RadioButton {
return RadioButton(radioButtons[index]);
}
/**
* Gets the number of radio buttons in this radio button group.
*
* @default 0
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/
public function get numRadioButtons():int {
return radioButtons.length;
}
}
}