You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by pe...@apache.org on 2018/03/07 21:27:17 UTC
[royale-asjs] branch feature/MXRoyale updated: Added RadioButton
and RadioButtonGroup
This is an automated email from the ASF dual-hosted git repository.
pent pushed a commit to branch feature/MXRoyale
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/feature/MXRoyale by this push:
new 234ba18 Added RadioButton and RadioButtonGroup
234ba18 is described below
commit 234ba18740d00eec36bb265687553b2219b1cfbb
Author: Peter Ent <pe...@apache.org>
AuthorDate: Wed Mar 7 16:27:14 2018 -0500
Added RadioButton and RadioButtonGroup
---
.../MXRoyale/src/main/royale/mx/controls/Button.as | 6 +-
.../src/main/royale/mx/controls/RadioButton.as | 528 ++++++++++++++++++
.../main/royale/mx/controls/RadioButtonGroup.as | 596 +++++++++++++++++++++
3 files changed, 1127 insertions(+), 3 deletions(-)
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/Button.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/Button.as
index e8450aa..f8490cc 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/Button.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/Button.as
@@ -332,9 +332,9 @@ use namespace mx_internal;
* @productversion Flex 3
*/
public class Button extends UIComponent
- implements IDataRenderer, IDropInListItemRenderer,
- IFocusManagerComponent, IListItemRenderer,
- IFontContextComponent, IButton
+ implements IDataRenderer,
+ IListItemRenderer,
+ IButton
{
//--------------------------------------------------------------------------
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RadioButton.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RadioButton.as
new file mode 100644
index 0000000..427337a
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RadioButton.as
@@ -0,0 +1,528 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.controls
+{
+COMPILE::JS {
+ import goog.DEBUG;
+}
+COMPILE::SWF
+{
+ import flash.display.DisplayObject;
+ import flash.events.MouseEvent;
+ import flash.utils.Dictionary;
+ import org.apache.royale.core.UIButtonBase;
+}
+
+COMPILE::JS
+{
+ import org.apache.royale.core.UIBase;
+ import org.apache.royale.core.WrappedHTMLElement;
+ import org.apache.royale.html.supportClasses.RadioButtonIcon;
+ import org.apache.royale.html.util.addElementToWrapper;
+}
+
+import org.apache.royale.core.IStrand;
+import org.apache.royale.core.IUIBase;
+import org.apache.royale.core.IValueToggleButtonModel;
+import org.apache.royale.events.Event;
+import org.apache.royale.events.MouseEvent;
+import org.apache.royale.core.ISelectable;
+/*
+import flash.events.Event;
+import flash.events.KeyboardEvent;
+import flash.events.MouseEvent;
+import flash.ui.Keyboard;
+import mx.core.IFlexDisplayObject;
+import mx.core.IFlexModuleFactory;
+import mx.core.mx_internal;
+import mx.events.FlexEvent;
+import mx.core.FlexVersion;
+import mx.core.IToggleButton;
+import mx.events.ItemClickEvent;
+import mx.managers.IFocusManager;
+import mx.managers.IFocusManagerGroup;
+import mx.core.UITextField;
+import mx.styles.CSSStyleDeclaration;
+import mx.styles.StyleManager;
+import flash.text.TextLineMetrics;
+import flash.utils.getQualifiedClassName;
+
+use namespace mx_internal;
+*/
+
+
+/**
+ * The RadioButton control lets the user make a single choice
+ * within a set of mutually exclusive choices.
+ * A RadioButton group is composed of two or more RadioButton controls
+ * with the same <code>groupName</code> property. While grouping RadioButton instances
+ * in a RadioButtonGroup is optional, a group lets you do things
+ * like set a single event handler on a group of buttons, rather than
+ * on each individual button. The RadioButton group can refer to a group created by the
+ * <code><mx:RadioButtonGroup></code> tag.
+ * The user selects only one member of the group at a time.
+ * Selecting an unselected group member deselects the currently selected
+ * RadioButton control within that group.
+ *
+ * <p>The RadioButton control has the following default characteristics:</p>
+ * <table class="innertable">
+ * <tr>
+ * <th>Characteristic</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Default size</td>
+ * <td>Wide enough to display the text label of the control</td>
+ * </tr>
+ * <tr>
+ * <td>Minimum size</td>
+ * <td>0 pixels</td>
+ * </tr>
+ * <tr>
+ * <td>Maximum size</td>
+ * <td>Undefined</td>
+ * </tr>
+ * </table>
+ *
+ * @mxml
+ *
+ * <p>The <code><mx:RadioButton></code> tag inherits all of the tag
+ * attributes of its superclass, and adds the following tag attributes:</p>
+ *
+ * <pre>
+ * <mx:RadioButton
+ * <strong>Properties</strong>
+ * groupName=""
+ * labelPlacement="right|left|top|bottom"
+ *
+ * <strong>Styles</strong>
+ * disabledIconColor="0x999999"
+ * iconColor="0x2B333C"
+ * />
+ * </pre>
+ *
+ * @includeExample examples/RadioButtonExample.mxml
+ *
+ * @see mx.controls.RadioButtonGroup
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+COMPILE::SWF
+public class RadioButton extends Button
+{
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructor.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function RadioButton()
+ {
+ super();
+
+ addEventListener(org.apache.royale.events.MouseEvent.CLICK, internalMouseHandler);
+ }
+
+
+
+ protected static var dict:Dictionary = new Dictionary(true);
+
+ private var _groupName:String;
+
+ /**
+ * The name of the group. Only one RadioButton in a group is selected.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function get groupName() : String
+ {
+ return IValueToggleButtonModel(model).groupName;
+ }
+ public function set groupName(value:String) : void
+ {
+ IValueToggleButtonModel(model).groupName = value;
+ }
+
+
+ /**
+ * @private
+ * Storage for the group property.
+ */
+ private var _group:RadioButtonGroup;
+
+ /**
+ * The RadioButtonGroup object to which this RadioButton belongs.
+ *
+ * @default "undefined"
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get group():RadioButtonGroup
+ {
+ if (goog.DEBUG)
+ trace("RadioButtonGroup not implemented for RadioButton");
+ return _group;
+ }
+
+ public function set group(value:RadioButtonGroup):void
+ {
+ _group = value;
+ }
+
+ /**
+ * The string used as a label for the RadioButton.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function get text():String
+ {
+ return IValueToggleButtonModel(model).text;
+ }
+ public function set text(value:String):void
+ {
+ IValueToggleButtonModel(model).text = value;
+ }
+
+ /**
+ * Whether or not the RadioButton instance is selected. Setting this property
+ * causes the currently selected RadioButton in the same group to lose the
+ * selection.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function get selected():Boolean
+ {
+ return IValueToggleButtonModel(model).selected;
+ }
+ public function set selected(selValue:Boolean):void
+ {
+ IValueToggleButtonModel(model).selected = selValue;
+
+ // if this button is being selected, its value should become
+ // its group's selectedValue
+ if( selValue ) {
+ for each(var rb:RadioButton in dict)
+ {
+ if( rb.groupName == groupName )
+ {
+ rb.selectedValue = value;
+ }
+ }
+ }
+ }
+
+ /**
+ * The value associated with the RadioButton. For example, RadioButtons with labels,
+ * "Red", "Green", and "Blue" might have the values 0, 1, and 2 respectively.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function get value():Object
+ {
+ return IValueToggleButtonModel(model).value;
+ }
+ public function set value(newValue:Object):void
+ {
+ IValueToggleButtonModel(model).value = newValue;
+ }
+
+ /**
+ * The group's currently selected value.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function get selectedValue():Object
+ {
+ return IValueToggleButtonModel(model).selectedValue;
+ }
+ public function set selectedValue(newValue:Object):void
+ {
+ // a radio button is really selected when its value matches that of the group's value
+ IValueToggleButtonModel(model).selected = (newValue == value);
+ IValueToggleButtonModel(model).selectedValue = newValue;
+ }
+
+ /**
+ * @private
+ */
+ override public function addedToParent():void
+ {
+ super.addedToParent();
+
+ // if this instance is selected, set the local selectedValue to
+ // this instance's value
+ if( selected ) selectedValue = value;
+
+ else {
+
+ // make sure this button's selectedValue is set from its group's selectedValue
+ // to keep it in sync with the rest of the buttons in its group.
+ for each(var rb:RadioButton in dict)
+ {
+ if( rb.groupName == groupName )
+ {
+ selectedValue = rb.selectedValue;
+ break;
+ }
+ }
+ }
+
+ dict[this] = this;
+ }
+
+ /**
+ * @private
+ */
+ private function internalMouseHandler(event:org.apache.royale.events.MouseEvent) : void
+ {
+ // prevent radiobutton from being turned off by a click
+ if( !selected ) {
+ selected = !selected;
+ dispatchEvent(new Event("change"));
+ }
+ }
+}
+
+
+COMPILE::JS
+public class RadioButton extends Button
+{
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructor.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function RadioButton()
+ {
+ super();
+ }
+
+ /**
+ * @private
+ *
+ * @royalesuppresspublicvarwarning
+ */
+ public static var radioCounter:int = 0;
+
+ private var labelFor:HTMLLabelElement;
+ private var textNode:Text;
+ private var icon:RadioButtonIcon;
+
+ /**
+ * @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
+ * @royaleignorecoercion HTMLInputElement
+ * @royaleignorecoercion HTMLLabelElement
+ * @royaleignorecoercion Text
+ */
+ override protected function createElement():WrappedHTMLElement
+ {
+ icon = new RadioButtonIcon()
+ icon.id = '_radio_' + RadioButton.radioCounter++;
+
+ textNode = document.createTextNode('') as Text;
+
+ labelFor = addElementToWrapper(this,'label') as HTMLLabelElement;
+ labelFor.appendChild(icon.element);
+ labelFor.appendChild(textNode);
+
+ (textNode as WrappedHTMLElement).royale_wrapper = this;
+ (icon.element as WrappedHTMLElement).royale_wrapper = this;
+
+ typeNames = 'RadioButton';
+
+ return element;
+ }
+
+ override public function set id(value:String):void
+ {
+ super.id = value;
+ labelFor.id = value;
+ icon.element.id = value;
+ }
+
+ /**
+ * @royaleignorecoercion HTMLInputElement
+ */
+ public function get groupName():String
+ {
+ return (icon.element as HTMLInputElement).name as String;
+ }
+ /**
+ * @royaleignorecoercion HTMLInputElement
+ */
+ public function set groupName(value:String):void
+ {
+ (icon.element as HTMLInputElement).name = value;
+ }
+
+ /**
+ * @private
+ * Storage for the group property.
+ */
+ private var _group:RadioButtonGroup;
+
+ /**
+ * The RadioButtonGroup object to which this RadioButton belongs.
+ *
+ * @default "undefined"
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get group():RadioButtonGroup
+ {
+ if (goog.DEBUG)
+ trace("RadioButtonGroup not implemented for RadioButton");
+ return _group;
+ }
+
+ public function set group(value:RadioButtonGroup):void
+ {
+ _group = value;
+ }
+
+ public function get text():String
+ {
+ return textNode.nodeValue as String;
+ }
+ public function set text(value:String):void
+ {
+ textNode.nodeValue = value;
+ }
+
+ /**
+ * @royaleignorecoercion HTMLInputElement
+ * @export
+ */
+ public function get selected():Boolean
+ {
+ return (icon.element as HTMLInputElement).checked;
+ }
+ /**
+ * @royaleignorecoercion HTMLInputElement
+ */
+ public function set selected(value:Boolean):void
+ {
+ (icon.element as HTMLInputElement).checked = value;
+ }
+
+ /**
+ * @royaleignorecoercion HTMLInputElement
+ */
+ public function get value():String
+ {
+ return (icon.element as HTMLInputElement).value;
+ }
+ /**
+ * @royaleignorecoercion HTMLInputElement
+ */
+ public function set value(v:String):void
+ {
+ (icon.element as HTMLInputElement).value = "" + v;
+ }
+
+ /**
+ * @royaleignorecoercion HTMLInputElement
+ */
+ public function get selectedValue():Object
+ {
+ var buttons:NodeList;
+ var groupName:String;
+ var i:int;
+ var n:int;
+
+ groupName = (icon.element as HTMLInputElement).name;
+ buttons = document.getElementsByName(groupName);
+ n = buttons.length;
+
+ for (i = 0; i < n; i++) {
+ if (buttons[i].checked) {
+ return buttons[i].value;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @royaleignorecoercion Array
+ * @royaleignorecoercion HTMLInputElement
+ */
+ public function set selectedValue(value:Object):void
+ {
+ var buttons:NodeList;
+ var groupName:String;
+ var i:int;
+ var n:int;
+
+ groupName = (icon.element as HTMLInputElement).name;
+ buttons = document.getElementsByName(groupName);
+ n = buttons.length;
+ for (i = 0; i < n; i++) {
+ if (buttons[i].value === value) {
+ buttons[i].checked = true;
+ break;
+ }
+ }
+ }
+}
+
+}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RadioButtonGroup.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RadioButtonGroup.as
new file mode 100644
index 0000000..397d003
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RadioButtonGroup.as
@@ -0,0 +1,596 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.controls
+{
+COMPILE::JS {
+ import goog.DEBUG;
+}
+import org.apache.royale.core.IDocument;
+import org.apache.royale.events.EventDispatcher;
+/*
+import flash.display.DisplayObject;
+import flash.display.DisplayObjectContainer;
+import flash.display.InteractiveObject;
+import flash.events.Event;
+import flash.events.EventDispatcher;
+
+import mx.core.FlexGlobals;
+import mx.core.IFlexDisplayObject;
+import mx.core.IMXMLObject;
+import mx.core.IRawChildrenContainer;
+import mx.core.UIComponent;
+import mx.core.mx_internal;
+import mx.events.FlexEvent;
+import mx.events.ItemClickEvent;
+
+use namespace mx_internal;
+*/
+
+//--------------------------------------
+// Events
+//--------------------------------------
+
+/**
+ * Dispatched when the value of the selected RadioButton control in
+ * this group changes.
+ *
+ * @eventType flash.events.Event.CHANGE
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+[Event(name="change", type="org.apache.royale.events.Event")]
+
+/**
+ * Dispatched when a user selects a RadioButton control in the group.
+ * You can also set a handler for individual RadioButton controls.
+ *
+ * @eventType mx.events.ItemClickEvent.ITEM_CLICK
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+[Event(name="itemClick", type="org.apache.royale.events.ItemClickEvent")]
+
+/**
+ * The RadioButtonGroup control defines a group of RadioButton controls
+ * that act as a single mutually exclusive control; therefore,
+ * a user can select only one RadioButton control at a time. While grouping
+ * RadioButton instances
+ * in a RadioButtonGroup is optional, a group lets you do things
+ * like set a single event handler on a group of buttons, rather than
+ * on each individual button.
+ *
+ * <p>The <code>id</code> property is required when you use the
+ * <code><mx:RadioButtonGroup></code> tag to define the name
+ * of the group.</p>
+ *
+ * <p>Notice that the RadioButtonGroup control is a subclass of EventDispatcher, not UIComponent,
+ * and implements the IMXMLObject interface.
+ * All other Flex visual components are subclasses of UIComponent, which implements
+ * the IUIComponent interface.
+ * The RadioButtonGroup control has support built into the Flex compiler
+ * that allows you to use the RadioButtonGroup control as a child of a Flex container,
+ * even though it does not implement IUIComponent.
+ * All other container children must implement the IUIComponent interface.</p>
+ *
+ * <p>Therefore, if you try to define a visual component as a subclass of
+ * EventDispatcher that implements the IMXMLObject interface,
+ * you will not be able to use it as the child of a container.</p>
+ *
+ * @mxml
+ *
+ * <p>The <code><mx:RadioButtonGroup></code> tag inherits all of the
+ * tag attributes of its superclass, and adds the following tag attributes:</p>
+ *
+ * <pre>
+ * <mx:RadioButtonGroup
+ * <strong>Properties</strong>
+ * enabled="true|false"
+ * id="<i>No default</i>"
+ * labelPlacement="right|left|top|bottom"
+ *
+ * <strong>Events</strong>
+ * change="<i>No default</i>"
+ * itemClick="<i>No default</i>"
+ * />
+ * </pre>
+ *
+ * @includeExample examples/RadioButtonGroupExample.mxml
+ *
+ * @see mx.controls.RadioButton
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+public class RadioButtonGroup extends EventDispatcher
+{
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructor.
+ *
+ * @param document In simple cases where a class extends EventDispatcher,
+ * the <code>document</code> parameter should not be used.
+ *
+ * @see flash.events.EventDispatcher
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function RadioButtonGroup(document:IDocument = null)
+ {
+ super();
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ * The document containing a reference to this RadioButtonGroup.
+ */
+ private var document:IDocument;
+
+ /**
+ * @private
+ * An Array of the RadioButtons that belong to this group.
+ */
+ private var radioButtons:Array /* of RadioButton */ = [];
+
+ //--------------------------------------------------------------------------
+ //
+ // Properties
+ //
+ //--------------------------------------------------------------------------
+
+ //----------------------------------
+ // enabled
+ //----------------------------------
+
+ [Bindable("enabledChanged")]
+ [Inspectable(category="General", defaultValue="true")]
+
+ /**
+ * Determines whether selection is allowed.
+ *
+ * @default true
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get enabled():Boolean
+ {
+ var s:Number = 0;
+
+ var n:int = numRadioButtons;
+ for (var i:int = 0; i < n; i++)
+ {
+ s = s + getRadioButtonAt(i).enabled;
+ }
+
+ if (s == 0)
+ return false;
+
+ if (s == n)
+ return true;
+
+ return false;
+ }
+
+ /**
+ * @private
+ */
+ public function set enabled(value:Boolean):void
+ {
+ var n:int = numRadioButtons;
+ for (var i:int = 0; i < n; i++)
+ {
+ getRadioButtonAt(i).enabled = value;
+ }
+
+ dispatchEvent(new Event("enabledChanged"));
+ }
+
+ //----------------------------------
+ // labelPlacement
+ //----------------------------------
+
+ /**
+ * @private
+ * Storage for the labelPlacement property.
+ */
+ private var _labelPlacement:String = "right";
+
+ [Bindable("labelPlacementChanged")]
+ [Inspectable(category="General", enumeration="left,right,top,bottom", defaultValue="right")]
+
+ /**
+ * Position of the RadioButton label relative to the RadioButton icon
+ * for each control in the group.
+ * You can override this setting for the individual controls.
+ *
+ * <p>Valid values in MXML are <code>"right"</code>, <code>"left"</code>,
+ * <code>"bottom"</code>, and <code>"top"</code>. </p>
+ *
+ * <p>In ActionScript, you use the following constants to set this property:
+ * <code>ButtonLabelPlacement.RIGHT</code>, <code>ButtonLabelPlacement.LEFT</code>,
+ * <code>ButtonLabelPlacement.BOTTOM</code>, and <code>ButtonLabelPlacement.TOP</code>.</p>
+ *
+ * @default "right"
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get labelPlacement():String
+ {
+ return _labelPlacement;
+ }
+
+ /**
+ * @private
+ */
+ public function set labelPlacement(value:String):void
+ {
+ _labelPlacement = value;
+
+ var n:int = numRadioButtons;
+ for (var i:int = 0; i < n; i++)
+ {
+ getRadioButtonAt(i).labelPlacement = value;
+ }
+ }
+
+ //----------------------------------
+ // numRadioButtons
+ //----------------------------------
+
+ [Bindable("numRadioButtonsChanged")]
+
+ /**
+ * The number of RadioButtons that belong to this RadioButtonGroup.
+ *
+ * @default "undefined"
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get numRadioButtons():int
+ {
+ return radioButtons.length;
+ }
+
+ //----------------------------------
+ // selectedValue
+ //----------------------------------
+
+ /**
+ * @private
+ * Storage for the selectedValue property.
+ */
+ private var _selectedValue:Object;
+
+ [Bindable("change")]
+ [Bindable("valueCommit")]
+ [Inspectable(category="General")]
+
+ /**
+ * The value of the <code>value</code> property of the selected
+ * RadioButton control in the group, if this has been set
+ * to be something other than <code>null</code> (the default value).
+ * Otherwise, <code>selectedValue</code> is the value of the
+ * <code>label</code> property of the selected RadioButton.
+ * If no RadioButton is selected, this property is <code>null</code>.
+ *
+ * <p>If you set <code>selectedValue</code>, Flex selects the
+ * RadioButton control whose <code>value</code> or
+ * <code>label</code> property matches this value.</p>
+ *
+ * @default null
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get selectedValue():Object
+ {
+ if (selection)
+ {
+ return selection.value != null ?
+ selection.value :
+ selection.label;
+ }
+
+ return null;
+ }
+
+ /**
+ * @private.
+ */
+ public function set selectedValue(value:Object):void
+ {
+ _selectedValue = value;
+
+ // Clear the exisiting selecton if there is one.
+ if (value == null)
+ {
+ setSelection(null, false);
+ return;
+ }
+
+ // Find the radio button value specified.
+ var n:int = numRadioButtons;
+ for (var i:int = 0; i < n; i++)
+ {
+ var radioButton:RadioButton = getRadioButtonAt(i);
+ if (radioButton.value == value ||
+ radioButton.label == value)
+ {
+ changeSelection(i, false);
+ break;
+ }
+ }
+
+ dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
+ }
+
+ //----------------------------------
+ // selection
+ //----------------------------------
+
+ /**
+ * @private
+ * Reference to the selected radio button.
+ */
+ private var _selection:RadioButton;
+
+ [Bindable("change")]
+ [Bindable("valueCommit")]
+ [Inspectable(category="General")]
+
+ /**
+ * Contains a reference to the currently selected
+ * RadioButton control in the group.
+ * You can access the property in ActionScript only;
+ * it is not settable in MXML.
+ * Setting this property to <code>null</code> deselects the currently selected RadioButton control.
+ *
+ * @default null
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function get selection():RadioButton
+ {
+ return _selection;
+ }
+
+ /**
+ * @private
+ */
+ public function set selection(value:RadioButton):void
+ {
+ // Going through the selection setter should never fire a change event.
+ setSelection(value, false);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Methods
+ //
+ //--------------------------------------------------------------------------
+
+
+ /**
+ * Returns the RadioButton control at the specified index.
+ *
+ * @param index The index of the RadioButton control in the
+ * RadioButtonGroup control, where the index of the first control is 0.
+ *
+ * @return The specified RadioButton control.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function getRadioButtonAt(index:int):RadioButton
+ {
+ return RadioButton(radioButtons[index]);
+ }
+
+ /**
+ * @private
+ * Add a radio button to the group.
+ */
+ mx_internal function addInstance(instance:RadioButton):void
+ {
+ instance.addEventListener(Event.REMOVED, radioButton_removedHandler);
+ radioButtons.push(instance);
+
+ // Apply group indices in "tab order" or "breadth-first" order.
+ radioButtons.sort(readOrderCompare);
+ for (var i:int = 0; i < radioButtons.length; i++)
+ radioButtons[i].indexNumber = i;
+
+ if (_selectedValue != null)
+ selectedValue = _selectedValue;
+
+ dispatchEvent(new Event("numRadioButtonsChanged"));
+ }
+
+ /**
+ * @private
+ * Remove a radio button from the group.
+ */
+ mx_internal function removeInstance(instance:RadioButton):void
+ {
+ if (instance)
+ {
+
+ var foundInstance:Boolean = false;
+ for (var i:int = 0; i < numRadioButtons; i++)
+ {
+ var rb:RadioButton = getRadioButtonAt(i);
+
+ if (foundInstance)
+ {
+ // Decrement the indexNumber for each button after the removed button.
+ rb.indexNumber--;
+ }
+ else if (rb == instance)
+ {
+ rb.group = null;
+
+ if (instance == _selection)
+ {
+ _selection = null;
+ }
+ // Remove the radio button from the internal array
+ radioButtons.splice(i,1);
+ foundInstance = true;
+ // redo the same index because we removed the previous item at this index
+ i--;
+ }
+ }
+
+ if (foundInstance)
+ dispatchEvent(new Event("numRadioButtonsChanged"));
+ }
+ }
+
+ /**
+ * @private
+ * Return the value or the label value
+ * of the selected radio button.
+ */
+ private function getValue():String
+ {
+ if (selection)
+ {
+ return selection.value &&
+ selection.value is String &&
+ String(selection.value).length != 0 ?
+ String(selection.value) :
+ selection.label;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @private
+ */
+ mx_internal function setSelection(value:RadioButton, fireChange:Boolean = true):void
+ {
+ if (value == null)
+ {
+ if (selection != null)
+ {
+ _selection.selected = false;
+ _selection = null;
+ if (fireChange)
+ dispatchEvent(new Event(Event.CHANGE));
+ }
+ }
+ else
+ {
+ var n:int = numRadioButtons;
+ for (var i:int = 0; i < n; i++)
+ {
+ if (value == getRadioButtonAt(i))
+ {
+ changeSelection(i, fireChange);
+ break;
+ }
+ }
+ }
+
+ //dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
+ }
+
+ /**
+ * @private
+ */
+ private function changeSelection(index:int, fireChange:Boolean = true):void
+ {
+ if (getRadioButtonAt(index))
+ {
+ // Unselect the currently selected radio
+ if (selection)
+ selection.selected = false;
+
+ // Change the focus to the new radio.
+ // Set the state of the new radio to true.
+ // Fire a click event for the new radio.
+ // Fire a click event for the radio group.
+ _selection = getRadioButtonAt(index);
+ _selection.selected = true;
+ if (fireChange)
+ dispatchEvent(new Event(Event.CHANGE));
+ }
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Event Handlers
+ //
+ //--------------------------------------------------------------------------
+ /**
+ * @private
+ */
+ private function radioButton_removedHandler(event:Event):void
+ {
+ var rb:RadioButton = event.target as RadioButton;
+ if (rb)
+ {
+ rb.removeEventListener(Event.REMOVED, radioButton_removedHandler);
+ removeInstance(RadioButton(event.target));
+ }
+ }
+}
+
+}
--
To stop receiving notification emails like this one, please contact
pent@apache.org.