| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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 org.apache.royale.core |
| { |
| import flash.display.DisplayObject; |
| import flash.display.SimpleButton; |
| |
| import org.apache.royale.core.addBeadsToStrand; |
| import org.apache.royale.core.registerBeadOnStrand; |
| import org.apache.royale.core.IBead; |
| import org.apache.royale.core.IBeadModel; |
| import org.apache.royale.core.IMeasurementBead; |
| import org.apache.royale.core.IStrand; |
| import org.apache.royale.core.IUIBase; |
| import org.apache.royale.core.ValuesManager; |
| import org.apache.royale.events.Event; |
| import org.apache.royale.events.utils.MouseEventConverter; |
| import org.apache.royale.events.IEventDispatcher; |
| |
| //-------------------------------------- |
| // Events |
| //-------------------------------------- |
| |
| /** |
| * Set a different class for click events so that |
| * there aren't dependencies on the flash classes |
| * on the JS side. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| [Event(name="click", type="org.apache.royale.events.MouseEvent")] |
| |
| /** |
| * The UIButtonBase class is the base class for most Buttons in a Royale |
| * application. In Flash, these buttons extend SimpleButton and therefore |
| * do not support all of the Sprite APIs. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| COMPILE::SWF |
| public class UIButtonBase extends SimpleButton implements IStrandWithModel, IEventDispatcher, IUIBase, IStyleableObject, ILayoutChild, IRoyaleElement |
| { |
| /** |
| * Constructor. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function UIButtonBase(upState:DisplayObject=null, overState:DisplayObject=null, downState:DisplayObject=null, hitTestState:DisplayObject=null) |
| { |
| super(upState, overState, downState, hitTestState); |
| // mouseChildren = true; |
| // mouseEnabled = true; |
| MouseEventConverter.setupInstanceConverters(this); |
| } |
| |
| [SWFOverride(returns="flash.display.DisplayObjectContainer")] |
| override public function get parent():IParent |
| { |
| return super.parent as IParent; |
| } |
| |
| public function get $displayObject():DisplayObject |
| { |
| return this; |
| } |
| |
| public function get royale_wrapper():Object |
| { |
| return this; |
| } |
| public function set royale_wrapper(value:Object):void |
| { |
| |
| } |
| |
| private var _x:Number; |
| |
| /** |
| * @private |
| */ |
| override public function set x(value:Number):void |
| { |
| super.x = _x = value; |
| if (!style) |
| style = { left: value }; |
| else |
| style.left = value; |
| dispatchEvent(new Event("xChanged")); |
| } |
| |
| private var _y:Number; |
| |
| /** |
| * @private |
| */ |
| override public function set y(value:Number):void |
| { |
| super.y = _y = value; |
| if (!style) |
| style = { top: value }; |
| else |
| style.top = value; |
| dispatchEvent(new Event("yChanged")); |
| } |
| |
| /** |
| * Retrieve the low-level bounding box y. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| protected function get $y():Number |
| { |
| return super.y; |
| } |
| |
| private var _explicitWidth:Number; |
| |
| /** |
| * The explicitly set width (as opposed to measured width |
| * or percentage width). |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get explicitWidth():Number |
| { |
| if (isNaN(_explicitWidth)) |
| { |
| var value:* = ValuesManager.valuesImpl.getValue(this, "width"); |
| if (value !== undefined) { |
| _explicitWidth = Number(value); |
| } |
| } |
| |
| return _explicitWidth; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set explicitWidth(value:Number):void |
| { |
| if (_explicitWidth == value) |
| return; |
| |
| // width can be pixel or percent not both |
| if (!isNaN(value)) |
| _percentWidth = NaN; |
| |
| _explicitWidth = value; |
| |
| dispatchEvent(new Event("explicitWidthChanged")); |
| } |
| |
| private var _explicitHeight:Number; |
| |
| /** |
| * The explicitly set width (as opposed to measured width |
| * or percentage width). |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get explicitHeight():Number |
| { |
| if (isNaN(_explicitHeight)) |
| { |
| var value:* = ValuesManager.valuesImpl.getValue(this, "height"); |
| if (value !== undefined) { |
| _explicitHeight = Number(value); |
| } |
| } |
| |
| return _explicitHeight; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set explicitHeight(value:Number):void |
| { |
| if (_explicitHeight == value) |
| return; |
| |
| // height can be pixel or percent not both |
| if (!isNaN(value)) |
| _percentHeight = NaN; |
| |
| _explicitHeight = value; |
| |
| dispatchEvent(new Event("explicitHeightChanged")); |
| } |
| |
| private var _percentWidth:Number; |
| |
| /** |
| * The requested percentage width this component |
| * should have in the parent container. Note that |
| * the actual percentage may be different if the |
| * total is more than 100% or if there are other |
| * components with explicitly set widths. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get percentWidth():Number |
| { |
| return _percentWidth; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set percentWidth(value:Number):void |
| { |
| if (_percentWidth == value) |
| return; |
| |
| if (!isNaN(value)) |
| _explicitWidth = NaN; |
| |
| _percentWidth = value; |
| |
| dispatchEvent(new Event("percentWidthChanged")); |
| } |
| |
| private var _percentHeight:Number; |
| |
| /** |
| * The requested percentage height this component |
| * should have in the parent container. Note that |
| * the actual percentage may be different if the |
| * total is more than 100% or if there are other |
| * components with explicitly set heights. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get percentHeight():Number |
| { |
| return _percentHeight; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set percentHeight(value:Number):void |
| { |
| if (_percentHeight == value) |
| return; |
| |
| if (!isNaN(value)) |
| _explicitHeight = NaN; |
| |
| _percentHeight = value; |
| |
| dispatchEvent(new Event("percentHeightChanged")); |
| } |
| |
| private var _width:Number; |
| |
| [Bindable("widthChanged")] |
| [PercentProxy("percentWidth")] |
| /** |
| * @copy org.apache.royale.core.UIBase#width |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| override public function get width():Number |
| { |
| if (isNaN(explicitWidth)) |
| { |
| var w:Number = _width; |
| if (isNaN(w)) w = $width; |
| return w; |
| } |
| else |
| return explicitWidth; |
| } |
| |
| /** |
| * @private |
| */ |
| override public function set width(value:Number):void |
| { |
| if (explicitWidth != value) |
| { |
| explicitWidth = value; |
| } |
| |
| setWidth(value); |
| } |
| |
| /** |
| * Retrieve the low-level bounding box width. |
| * Not implemented in JS. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get $width():Number |
| { |
| return super.width; |
| } |
| |
| private var _height:Number; |
| |
| [Bindable("heightChanged")] |
| [PercentProxy("percentHeight")] |
| /** |
| * @copy org.apache.royale.core.UIBase#width |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| override public function get height():Number |
| { |
| if (isNaN(explicitHeight)) |
| { |
| var h:Number = _height; |
| if (isNaN(h)) h = $height; |
| return h; |
| } |
| else |
| return explicitHeight; |
| } |
| |
| /** |
| * @private |
| */ |
| override public function set height(value:Number):void |
| { |
| if (explicitHeight != value) |
| { |
| explicitHeight = value; |
| } |
| |
| setHeight(value); |
| } |
| |
| /** |
| * Retrieve the low-level bounding box height. |
| * Not implemented in JS. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get $height():Number |
| { |
| return super.height; |
| } |
| |
| /** |
| * @copy org.apache.royale.core.IUIBase#setHeight |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function setHeight(value:Number, noEvent:Boolean = false):void |
| { |
| if (_height != value) |
| { |
| _height = value; |
| if (!noEvent) |
| dispatchEvent(new Event("heightChanged")); |
| } |
| } |
| |
| /** |
| * @copy org.apache.royale.core.IUIBase#setWidth |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function setWidth(value:Number, noEvent:Boolean = false):void |
| { |
| if (_width != value) |
| { |
| _width = value; |
| if (!noEvent) |
| dispatchEvent(new Event("widthChanged")); |
| } |
| } |
| |
| /** |
| * @copy org.apache.royale.core.IUIBase#setWidthAndHeight |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function setWidthAndHeight(newWidth:Number, newHeight:Number, noEvent:Boolean = false):void |
| { |
| if (_width != newWidth) |
| { |
| _width = newWidth; |
| if (_height == newHeight) |
| if (!noEvent) |
| dispatchEvent(new Event("widthChanged")); |
| } |
| if (_height != newHeight) |
| { |
| _height = newHeight; |
| if (!noEvent) |
| dispatchEvent(new Event("heightChanged")); |
| } |
| dispatchEvent(new Event("sizeChanged")); |
| } |
| |
| /** |
| * @copy org.apache.royale.core.ILayoutChild#isWidthSizedToContent |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function isWidthSizedToContent():Boolean |
| { |
| return (isNaN(_explicitWidth) && isNaN(_percentWidth)); |
| } |
| |
| /** |
| * @copy org.apache.royale.core.ILayoutChild#setX |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function setX(value:Number):void |
| { |
| super.x = value; |
| } |
| |
| /** |
| * @copy org.apache.royale.core.ILayoutChild#setY |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function setY(value:Number):void |
| { |
| super.y = value; |
| } |
| |
| /** |
| * @private |
| */ |
| [Bindable("visibleChanged")] |
| override public function set visible(value:Boolean):void |
| { |
| super.visible = value; |
| dispatchEvent(new Event(value?"show":"hide")); |
| dispatchEvent(new Event("visibleChanged")); |
| } |
| |
| /** |
| * @copy org.apache.royale.core.ILayoutChild#isHeightSizedToContent |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function isHeightSizedToContent():Boolean |
| { |
| return (isNaN(_explicitHeight) && isNaN(_percentHeight)); |
| } |
| |
| private var _model:IBeadModel; |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#model |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get model():Object |
| { |
| if (_model == null) |
| { |
| // addbead will set _model |
| addBead(new (ValuesManager.valuesImpl.getValue(this, "iBeadModel")) as IBead); |
| } |
| return _model; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set model(value:Object):void |
| { |
| if (_model != value) |
| { |
| addBead(value as IBead); |
| dispatchEvent(new Event("modelChanged")); |
| } |
| } |
| |
| private var _view:IBeadView; |
| |
| /** |
| * An IBeadView that serves as the view for the component. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get view():IBeadView |
| { |
| if (_view == null) |
| { |
| var c:Class = ValuesManager.valuesImpl.getValue(this, "iBeadView") as Class; |
| if (c) |
| { |
| _view = (new c()) as IBeadView; |
| addBead(_view); |
| } |
| } |
| return _view; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set view(value:IBeadView):void |
| { |
| if (_view != value) |
| { |
| addBead(value as IBead); |
| dispatchEvent(new Event("viewChanged")); |
| } |
| } |
| |
| private var _id:String; |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#id |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get id():String |
| { |
| return _id; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set id(value:String):void |
| { |
| if (_id != value) |
| { |
| _id = value; |
| dispatchEvent(new Event("idChanged")); |
| } |
| } |
| |
| private var _styles:Object; |
| |
| /** |
| * The object that contains |
| * "styles" and other associated |
| * name-value pairs. You can |
| * also specify a string in |
| * HTML style attribute format. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get style():Object |
| { |
| return _styles; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set style(value:Object):void |
| { |
| if (value is String) |
| _styles = ValuesManager.valuesImpl.parseStyles(value as String); |
| else |
| _styles = value; |
| if (!isNaN(_y)) |
| _styles.top = _y; |
| if (!isNaN(_x)) |
| _styles.left = _x; |
| dispatchEvent(new Event("stylesChanged")); |
| } |
| |
| /** |
| * The styles for this object formatted |
| * as an HTML style attribute. While this |
| * may be a convenient and less verbose |
| * way of specifying styles than using |
| * the style object, you run the risk of |
| * having a typo. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function set styleString(value:String):void |
| { |
| _styles = JSON.parse("{" + value + "}"); |
| } |
| |
| /** |
| * A list of type names. Often used for CSS |
| * type selector lookups. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public var typeNames:String; |
| |
| private var _className:String; |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#className |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get className():String |
| { |
| return _className; |
| } |
| |
| /** |
| * @private |
| */ |
| public function set className(value:String):void |
| { |
| if (_className != value) |
| { |
| _className = value; |
| dispatchEvent(new Event("classNameChanged")); |
| } |
| } |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#element |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get element():IRoyaleElement |
| { |
| return this; |
| } |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#beads |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public var beads:Array; |
| |
| private var strand:Vector.<IBead>; |
| |
| /** |
| * @copy org.apache.royale.core.IStrand#registerBead() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.9 |
| */ |
| public function registerBead(bead:IBead):void |
| { |
| registerBeadOnStrand(bead, this); |
| } |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#addBead() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function addBead(bead:IBead):void |
| { |
| if (!strand) |
| strand = new Vector.<IBead>; |
| strand.push(bead); |
| if (bead is IBeadModel) |
| _model = bead as IBeadModel; |
| else if (bead is IBeadView) |
| _view = bead as IBeadView; |
| bead.strand = this; // super.addBead already did this! |
| } |
| |
| /** |
| * @copy org.apache.royale.core.IStrand#addBeads() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.9 |
| */ |
| public function addBeads(dispatch:Boolean=true):void |
| { |
| addBeadsToStrand(this,beads,dispatch); |
| } |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#getBeadByType() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function getBeadByType(classOrInterface:Class):IBead |
| { |
| for each (var bead:IBead in strand) |
| { |
| if (bead is classOrInterface) |
| return bead; |
| } |
| return null; |
| } |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#removeBead() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function removeBead(value:IBead):IBead |
| { |
| var n:int = strand.length; |
| for (var i:int = 0; i < n; i++) |
| { |
| var bead:IBead = strand[i]; |
| if (bead == value) |
| { |
| strand.splice(i, 1); |
| return bead; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#addToParent() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function addedToParent():void |
| { |
| var c:Class; |
| |
| for each (var bead:IBead in beads) |
| addBead(bead); |
| |
| if (getBeadByType(IBeadModel) == null) |
| { |
| c = ValuesManager.valuesImpl.getValue(this, "iBeadModel") as Class; |
| if (c) |
| { |
| var model:IBeadModel = new c as IBeadModel; |
| if (model) |
| addBead(model); |
| } |
| } |
| if (getBeadByType(IBeadView) == null) |
| { |
| c = ValuesManager.valuesImpl.getValue(this, "iBeadView") as Class; |
| if (c) |
| { |
| var view:IBeadView = new c as IBeadView; |
| if (view) |
| addBead(view); |
| } |
| } |
| if (getBeadByType(IBeadController) == null) |
| { |
| c = ValuesManager.valuesImpl.getValue(this, "iBeadController") as Class; |
| if (c) |
| { |
| var controller:IBeadController = new c as IBeadController; |
| if (controller) |
| addBead(controller); |
| } |
| } |
| |
| dispatchEvent(new Event("beadsAdded")); |
| |
| } |
| |
| /** |
| * @copy org.apache.royale.core.UIBase#measurementBead |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get measurementBead() : IMeasurementBead |
| { |
| var measurementBead:IMeasurementBead = getBeadByType(IMeasurementBead) as IMeasurementBead; |
| if( measurementBead == null ) { |
| addBead(measurementBead = new (ValuesManager.valuesImpl.getValue(this, "iMeasurementBead")) as IMeasurementBead); |
| } |
| |
| return measurementBead; |
| } |
| |
| /** |
| * @copy org.apache.royale.core.IUIBase#topMostEventDispatcher |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10.2 |
| * @playerversion AIR 2.6 |
| * @productversion Royale 0.0 |
| */ |
| public function get topMostEventDispatcher():IEventDispatcher |
| { |
| if (!parent) |
| return null; |
| return IUIBase(parent).topMostEventDispatcher; |
| } |
| |
| |
| } |
| } |