package qs.controls { import mx.core.UIComponent; import mx.core.UITextField; import mx.core.IDataRenderer; import flash.geom.*; import flash.display.* import flash.text.TextLineMetrics;; /** * Color of text in the component, including the component label. * The default value is 0x0B333C. */ [Style(name="color", type="uint", format="Color", inherit="yes")] /** * Color of the component if it is disabled. * The default value is 0xAAB3B3. */ [Style(name="disabledColor", type="uint", format="Color", inherit="yes")] /** * Name of the font to use. * Unlike in a full CSS implementation, * comma-separated lists are not supported. * You can use any font family name. * If you specify a generic font name, * it is converted to an appropriate device font. * The default value is "Verdana". */ [Style(name="fontFamily", type="String", inherit="yes")] /** * Height of the text in pixels. * The default value is 10. */ [Style(name="fontSize", type="Number", format="Length", inherit="yes")] /** * Determines whether the text is italic font. * Recognized values are "normal" and "italic". * The default value is normal. */ [Style(name="fontStyle", type="String", enumeration="normal,italic", inherit="yes")] /** * Determines whether the text is boldface. * Recognized values are "normal" and "bold". * The default value is normal. */ [Style(name="fontWeight", type="String", enumeration="normal,bold", inherit="yes")] /** * Alignment of text within a container. * Possible values are "left", "right", * or "center". * The default value is "left".
* For the Button, LinkButton, and AccordionHeader components, * the default value is "center". * For these components, this property is only recognized when the * labelPlacement property is set to "left" or * "right". * If labelPlacement is set to "top" or * "bottom", the text and any icon are centered. */ [Style(name="textAlign", type="String", enumeration="left,center,right", inherit="yes")] /** * Determines whether the text is underlined. * Possible values are "none" and "underline". * The default value is none. */ [Style(name="qs_textDecoration", type="String", enumeration="none,underline", inherit="no")] /** * Offset of first line of text from the left side of the container. * The default value is 0. */ [Style(name="textIndent", type="Number", format="Length", inherit="yes")] public class actionscript_extra_fisheye_qs_controls_CachedLabel extends UIComponent implements IDataRenderer { private var _label:UITextField; private var _bitmap:Bitmap; private var _capturedText:BitmapData; private static var xUnit:Point = new Point(1,0); private static var origin:Point = new Point(0,0); private var _data:Object; private var _text:String = ""; private var _cachePolicy:String = "auto"; public function actionscript_extra_fisheye_qs_controls_CachedLabel() { super(); } public function set useCache(value:String):void { _cachePolicy = value; invalidateDisplayList(); } public function get useCache():String { return _cachePolicy; } override protected function createChildren():void { super.createChildren(); _label = new UITextField(); _label.multiline = true; _label.selectable = false; _label.autoSize = "left"; _label.text = _text; addChild(_label); } override protected function measure():void { _label.validateNow(); if(_label.embedFonts) { measuredWidth = _label.measuredWidth + 6; measuredHeight = _label.measuredHeight + 4; } else { var metrics:TextLineMetrics = measureText(_text); measuredWidth = metrics.width + 6; measuredHeight = metrics.height + 4; } } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { _label.validateNow(); _label.setActualSize(unscaledWidth, unscaledHeight ); var localX:Point; var localO:Point; var useLabel:Boolean = true; switch(_cachePolicy) { case "off": useLabel = true; break; case "on": useLabel = false; break; case "auto": if(_label.embedFonts == false && unscaledWidth > 0 && unscaledHeight > 0) { localX = globalToLocal(xUnit); localO = globalToLocal(origin); useLabel = (localX.x - localO.x) == 1 && (localX.y - localO.y) == 0; } } if(unscaledHeight <= 1 || unscaledWidth <= 1) useLabel = true; if(useLabel) { if(_bitmap != null) { removeChild(_bitmap); _bitmap = null; } _label.visible = true; } else { _label.visible = false; if(_capturedText == null || _capturedText.width != unscaledWidth || _capturedText.height != unscaledHeight ) { _capturedText = new BitmapData(unscaledWidth,unscaledHeight); if(_bitmap != null) { removeChild(_bitmap); _bitmap = null; } } if(_bitmap == null) { _bitmap = new Bitmap(_capturedText); _bitmap.smoothing = true; addChild(_bitmap); } _capturedText.fillRect(new Rectangle(0,0,unscaledWidth,unscaledHeight),0); _capturedText.draw(_label); } } [Inspectable(environment="none")] public function get data():Object { return _data; } /** * @private */ public function set data(value:Object):void { if( value == _data) return; _data = value; _text = String(value); if(_label != null) _label.text = (_text == null)? "":_text; invalidateSize(); invalidateDisplayList(); } override public function invalidateSize():void { super.invalidateSize(); } } }