//////////////////////////////////////////////////////////////////////////////// // // 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.preloaders { import flash.display.DisplayObject; import flash.display.Graphics; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.geom.ColorTransform; import flash.geom.Matrix; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.system.LoaderContext; import flash.text.TextField; import flash.text.TextFormat; import flash.utils.getDefinitionByName; import flash.utils.getTimer; import mx.events.FlexEvent; import mx.events.RSLEvent; import mx.graphics.RectangularDropShadow; import mx.managers.ISystemManager; /** * The SparkDownloadProgressBar class displays download progress. * It is used by the Preloader control to provide user feedback * while the application is downloading and loading. * *

The download progress bar displays information about * two different phases of the application: * the download phase and the initialization phase.

* *

In the Application container, use the * the preloader property to specify the name of your subclass.

* *

You can implement a custom download progress bar component * by creating a subclass of the SparkDownloadProgressBar class. * Do not implement a download progress bar as an MXML component * because it loads too slowly.

* * @see mx.core.Application * @see mx.preloaders.IPreloaderDisplay * @see mx.preloaders.Preloader * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public class SparkDownloadProgressBar extends Sprite implements IPreloaderDisplay { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function SparkDownloadProgressBar() { super(); } //-------------------------------------------------------------------------- // // Variables // //-------------------------------------------------------------------------- /** * @private */ private var _barWidth:Number; /** * @private */ private var _bgSprite:Sprite; /** * @private */ private var _barSprite:Sprite; /** * @private */ private var _barFrameSprite:Sprite; /** * @private */ private var _startTime:int; /** * @private */ private var _showingDisplay:Boolean = false; /** * @private */ private var _downloadComplete:Boolean = false; /** * @private */ private var _displayStartCount:uint = 0; /** * @private */ private var _initProgressCount:uint = 0; /** * The total number of validation events you expect to get * in the initializing phase. This should be an integer * greater or equal to 4 (and note that if it is greater than 4 * you might have an inefficiency in your initialization code) * * @default 6 * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected var initProgressTotal:uint = 6; //-------------------------------------------------------------------------- // // Overridden properties // //-------------------------------------------------------------------------- //---------------------------------- // visible //---------------------------------- /** * @private * Storage for the visible property. */ private var _visible:Boolean = false; /** * Specifies whether the download progress bar is visible. * *

When the Preloader control determines that the progress bar should be displayed, * it sets this value to true. When the Preloader control determines that * the progress bar should be hidden, it sets the value to false.

* *

A subclass of the SparkDownloadProgressBar class should never modify this property. * Instead, you can override the setter method to recognize when * the Preloader control modifies it, and perform any necessary actions.

* * @default false * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ override public function get visible():Boolean { return _visible; } /** * @private */ override public function set visible(value:Boolean):void { if (!_visible && value) show(); else if (_visible && !value ) hide(); _visible = value; } //-------------------------------------------------------------------------- // // Properties: IPreloaderDisplay // //-------------------------------------------------------------------------- //---------------------------------- // backgroundAlpha //---------------------------------- /** * @private * Storage for the backgroundAlpha property. */ private var _backgroundAlpha:Number = 1; /** * Alpha level of the SWF file or image defined by * the backgroundImage property, or the color defined by * the backgroundColor property. * Valid values range from 0 to 1.0. * Override this property to set your own value in a custom class. * *

You can specify either a backgroundColor * or a backgroundImage, but not both.

* * @default 1.0 * * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function get backgroundAlpha():Number { if (!isNaN(_backgroundAlpha)) return _backgroundAlpha; else return 1; } /** * @private */ public function set backgroundAlpha(value:Number):void { _backgroundAlpha = value; } //---------------------------------- // backgroundColor //---------------------------------- /** * @private * Storage for the backgroundColor property. */ private var _backgroundColor:uint; /** * Background color of a download progress bar. * Override this property to set your own value in a custom class. * *

You can specify either a backgroundColor * or a backgroundImage, but not both.

* * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function get backgroundColor():uint { return _backgroundColor; } /** * @private */ public function set backgroundColor(value:uint):void { _backgroundColor = value; } //---------------------------------- // backgroundImage //---------------------------------- /** * @private * Storage for the backgroundImage property. */ private var _backgroundImage:Object; /** * The background image of the application, * which is passed in by the preloader. * Override this property to set your own value in a custom class. * *

You can specify either a backgroundColor * or a backgroundImage, but not both.

* *

A value of null means "not set". * If this style and the backgroundColor style are undefined, * the component has a transparent background.

* *

The preloader does not display embedded images. * You can only use images loaded at runtime.

* * @default null * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function get backgroundImage():Object { return _backgroundImage; } /** * @private */ public function set backgroundImage(value:Object):void { _backgroundImage = value; } //---------------------------------- // backgroundSize //---------------------------------- /** * @private * Storage for the backgroundSize property. */ private var _backgroundSize:String = ""; /** * Scales the image specified by backgroundImage * to different percentage sizes. * A value of "100%" stretches the image * to fit the entire component. * To specify a percentage value, you must include the percent sign (%). * A value of "auto", maintains * the original size of the image. * * @default "auto" * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function get backgroundSize():String { return _backgroundSize; } /** * @private */ public function set backgroundSize(value:String):void { _backgroundSize = value; } //---------------------------------- // preloader //---------------------------------- /** * @private * Storage for the preloader property. */ private var _preloader:Sprite; /** * The Preloader class passes in a reference to itself to the display class * so that it can listen for events from the preloader. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function set preloader(value:Sprite):void { _preloader = value; value.addEventListener(ProgressEvent.PROGRESS, progressHandler); value.addEventListener(Event.COMPLETE, completeHandler); value.addEventListener(RSLEvent.RSL_PROGRESS, rslProgressHandler); value.addEventListener(RSLEvent.RSL_COMPLETE, rslCompleteHandler); value.addEventListener(RSLEvent.RSL_ERROR, rslErrorHandler); value.addEventListener(FlexEvent.INIT_PROGRESS, initProgressHandler); value.addEventListener(FlexEvent.INIT_COMPLETE, initCompleteHandler); } //---------------------------------- // stageHeight //---------------------------------- /** * @private * Storage for the stageHeight property. */ private var _stageHeight:Number = 375; /** * The height of the stage, * which is passed in by the Preloader class. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function get stageHeight():Number { return _stageHeight; } /** * @private */ public function set stageHeight(value:Number):void { _stageHeight = value; } //---------------------------------- // stageWidth //---------------------------------- /** * @private * Storage for the stageHeight property. */ private var _stageWidth:Number = 500; /** * The width of the stage, * which is passed in by the Preloader class. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function get stageWidth():Number { return _stageWidth; } /** * @private */ public function set stageWidth(value:Number):void { _stageWidth = value; } //-------------------------------------------------------------------------- // // Methods:IPreloaderDisplay // //-------------------------------------------------------------------------- /** * Called by the Preloader after the download progress bar * has been added as a child of the Preloader. * This should be the starting point for configuring your download progress bar. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ public function initialize():void { _startTime = getTimer(); } //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- /** * Creates the subcomponents of the display. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function createChildren():void { var g:Graphics = graphics; // Draw the background first // Same value as StyleManager.NOT_A_COLOR. However, we don't want to bring in StyleManager at this point. if (backgroundColor != 0xFFFFFFFF) { g.beginFill(backgroundColor, backgroundAlpha); g.drawRect(0, 0, stageWidth, stageHeight); } if (backgroundImage != null) loadBackgroundImage(backgroundImage); // Determine the size var totalWidth:Number = Math.min(stageWidth - 10, 207); var totalHeight:Number = 19; var startX:Number = Math.round((stageWidth - totalWidth) / 2); var startY:Number = Math.round((stageHeight - totalHeight) / 2); _barWidth = totalWidth - 10; _bgSprite = new Sprite(); _barFrameSprite = new Sprite(); _barSprite = new Sprite(); addChild(_bgSprite); addChild(_barFrameSprite); addChild(_barSprite); _barFrameSprite.x = _barSprite.x = startX + 5; _barFrameSprite.y = _barSprite.y = startY + 5; // Draw the background/shadow g = _bgSprite.graphics; g.lineStyle(1, 0x636363); g.beginFill(0xE8E8E8); g.drawRect(startX, startY, totalWidth, totalHeight); g.endFill(); g.lineStyle(); g = graphics; var ds:RectangularDropShadow = new RectangularDropShadow(); ds.color = 0x000000; ds.angle = 90; ds.alpha = .6; ds.distance = 2; ds.drawShadow(g, startX, startY, totalWidth, totalHeight); var chromeColor:uint = getPreloaderChromeColor(); if (chromeColor != DEFAULT_COLOR) { var colorTransform:ColorTransform = new ColorTransform(); colorTransform.redOffset = ((chromeColor & (0xFF << 16)) >> 16) - DEFAULT_COLOR_VALUE; colorTransform.greenOffset = ((chromeColor & (0xFF << 8)) >> 8) - DEFAULT_COLOR_VALUE; colorTransform.blueOffset = (chromeColor & 0xFF) - DEFAULT_COLOR_VALUE; _bgSprite.transform.colorTransform = colorTransform; _barFrameSprite.transform.colorTransform = colorTransform; _barSprite.transform.colorTransform = colorTransform; } } private static const DEFAULT_COLOR:uint = 0xCCCCCC; private static const DEFAULT_COLOR_VALUE:uint = 0xCC; /** * @private * We don't have a reliable way to get the system manager for the currently * loading application. During normal progres bar instantiation, the parent.parent * is the system manager loading the app, so that is what we'll use. * This is only needed to grab the "preloaderChromeColor" property from the info() * structure. */ private function getPreloaderChromeColor():uint { const sm:ISystemManager = parent.parent as ISystemManager; const valueObject:Object = (sm) ? sm.info()["preloaderChromeColor"] : null; var valueString:String = valueObject as String; if (valueString && (valueString.charAt(0) == "#")) valueString = "0x" + valueString.substring(1); return (valueString) ? uint(valueString) : DEFAULT_COLOR; } private var lastBarWidth:Number = 0; /** * Updates the outer portion of the download progress bar to * indicate download progress. * * @param completed Number of bytes of the application SWF file * that have been downloaded. * * @param total Size of the application SWF file in bytes. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function setDownloadProgress(completed:Number, total:Number):void { if (!_barFrameSprite) return; const outerHighlightColors:Array = [0xFFFFFF, 0xFFFFFF]; const outerHighlightAlphas:Array = [0.12, 0.80]; const fillColors:Array = [0xA9A9A9, 0xBDBDBD]; const fillAlphas:Array = [1, 1]; const ratios:Array = [0, 255]; var w:Number = Math.round(_barWidth * Math.min(completed / total, 1)); var h:Number = 9; var g:Graphics = _barFrameSprite.graphics; var m:Matrix = new Matrix(); // Make sure the download progress bar never regresses in size. w = Math.max(w, lastBarWidth); lastBarWidth = w; m.createGradientBox(w, h, 90); g.clear(); // Outer highlight g.lineStyle(1); g.lineGradientStyle("linear", outerHighlightColors, outerHighlightAlphas, ratios, m); g.drawRect(0, 0, w, h); // border/fill g.lineStyle(1, 0x636363); g.beginGradientFill("linear", fillColors, fillAlphas, ratios, m); g.drawRect(1, 1, w - 2, h - 2); g.endFill(); // highlight g.lineStyle(1, 0, 0.12); g.moveTo(2, h - 1); g.lineTo(2, 2); g.lineTo(w - 2, 2); g.lineTo(w - 2, h - 1); if (completed == total) _downloadComplete = true } /** * Updates the inner portion of the download progress bar to * indicate initialization progress. * * @param completed Number of initialization steps that * have been completed * * @param total Total number of initialization steps * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function setInitProgress(completed:Number, total:Number):void { const highlightColors:Array = [0xFFFFFF, 0xEAEAEA]; const fillColors:Array = [0xFFFFFF, 0xD8D8D8]; const alphas:Array = [1, 1]; const ratios:Array = [0, 255]; var w:Number = Math.round(_barWidth * Math.min(completed / total, 1)); var h:Number = 9; var g:Graphics = _barSprite.graphics; var m:Matrix = new Matrix(); m.createGradientBox(w - 6, h - 2, 90, 2, 2); g.clear(); // highlight/fill g.lineStyle(1); g.lineGradientStyle("linear", highlightColors, alphas, ratios, m); g.beginGradientFill("linear", fillColors, alphas, ratios, m); g.drawRect(2, 2, w - 4, h - 4); g.endFill(); // divider line g.lineStyle(1, 0, 0.55); g.moveTo(w - 1, 2); g.lineTo(w - 1, h - 1); } /** * @private * Make the display class visible. */ private function show():void { // swfobject reports 0 sometimes at startup // if we get zero, wait and try on next attempt if (stageWidth == 0 && stageHeight == 0) { try { stageWidth = stage.stageWidth; stageHeight = stage.stageHeight } catch (e:Error) { stageWidth = loaderInfo.width; stageHeight = loaderInfo.height; } if (stageWidth == 0 && stageHeight == 0) return; } _showingDisplay = true; createChildren(); } /** * @private */ private function hide():void { } /** * Defines the algorithm for determining whether to show * the download progress bar while in the download phase. * * @param elapsedTime Number of milliseconds that have elapsed * since the start of the download phase. * * @param event The ProgressEvent object that contains * the bytesLoaded and bytesTotal properties. * * @return If the return value is true, then show the * download progress bar. * The default behavior is to show the download progress bar * if more than 700 milliseconds have elapsed * and if Flex has downloaded less than half of the bytes of the SWF file. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function showDisplayForDownloading(elapsedTime:int, event:ProgressEvent):Boolean { // trace("showDisplayForDownloading: elapsedTime = " + elapsedTime); // trace("showDisplayForDownloading:" + event.bytesLoaded + " " + event.bytesTotal + " " + (event.bytesLoaded < event.bytesTotal / 2)); return elapsedTime > 700 && event.bytesLoaded < event.bytesTotal / 2; } /** * Defines the algorithm for determining whether to show the download progress bar * while in the initialization phase, assuming that the display * is not currently visible. * * @param elapsedTime Number of milliseconds that have elapsed * since the start of the download phase. * * @param count number of times that the initProgress event * has been received from the application. * * @return If true, then show the download progress bar. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function showDisplayForInit(elapsedTime:int, count:int):Boolean { // trace("showDisplayForInit: elapsedTime = " + elapsedTime + " count = " + count); return elapsedTime > 300 && count == 2; } /** * @private */ private function loadBackgroundImage(classOrString:Object):void { var cls:Class; // The "as" operator checks to see if classOrString // can be coerced to a Class if (classOrString && classOrString as Class) { // Load background image given a class pointer cls = Class(classOrString); initBackgroundImage(new cls()); } else if (classOrString && classOrString is String) { try { cls = Class(getDefinitionByName(String(classOrString))); } catch(e:Error) { // ignore } if (cls) { var newStyleObj:DisplayObject = new cls(); initBackgroundImage(newStyleObj); } else { // Loading the image is slightly different // than in Loader.loadContent()... is this on purpose? // Load background image from external URL var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener( Event.COMPLETE, loader_completeHandler); loader.contentLoaderInfo.addEventListener( IOErrorEvent.IO_ERROR, loader_ioErrorHandler); var loaderContext:LoaderContext = new LoaderContext(); loaderContext.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); loader.load(new URLRequest(String(classOrString)), loaderContext); } } } /** * @private */ private function initBackgroundImage(image:DisplayObject):void { addChildAt(image,0); var backgroundImageWidth:Number = image.width; var backgroundImageHeight:Number = image.height; // Scale according to backgroundSize var percentage:Number = calcBackgroundSize(); if (isNaN(percentage)) { var sX:Number = 1.0; var sY:Number = 1.0; } else { var scale:Number = percentage * 0.01; sX = scale * stageWidth / backgroundImageWidth; sY = scale * stageHeight / backgroundImageHeight; } image.scaleX = sX; image.scaleY = sY; // Center everything. // Use a scrollRect to position and clip the image. var offsetX:Number = Math.round(0.5 * (stageWidth - backgroundImageWidth * sX)); var offsetY:Number = Math.round(0.5 * (stageHeight - backgroundImageHeight * sY)); image.x = offsetX; image.y = offsetY; // Adjust alpha to match backgroundAlpha if (!isNaN(backgroundAlpha)) image.alpha = backgroundAlpha; } /** * @private */ private function calcBackgroundSize():Number { var percentage:Number = NaN; if (backgroundSize) { var index:int = backgroundSize.indexOf("%"); if (index != -1) percentage = Number(backgroundSize.substr(0, index)); } return percentage; } //-------------------------------------------------------------------------- // // Event handlers // //-------------------------------------------------------------------------- /** * Event listener for the ProgressEvent.PROGRESS event. * This implementation updates the progress bar * with the percentage of bytes downloaded. * * @param event The event object. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function progressHandler(event:ProgressEvent):void { var loaded:uint = event.bytesLoaded; var total:uint = event.bytesTotal; var elapsedTime:int = getTimer() - _startTime; // Only show the Loading phase if it will appear for awhile. if (!_showingDisplay && showDisplayForDownloading(elapsedTime, event)) show(); if (_showingDisplay) setDownloadProgress(event.bytesLoaded, event.bytesTotal); } /** * Event listener for the Event.COMPLETE event. * The default implementation does nothing. * * @param event The event object. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function completeHandler(event:Event):void { } /** * Event listener for the RSLEvent.RSL_PROGRESS event. * The default implementation does nothing. * * @param event The event object. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function rslProgressHandler(event:RSLEvent):void { } /** * Event listener for the RSLEvent.RSL_COMPLETE event. * * @param event The event object. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function rslCompleteHandler(event:RSLEvent):void { //trace("rsl " + event.rslIndex + " of " + event.rslTotal); } /** * Event listener for the RSLEvent.RSL_ERROR event. * This event listner handles any errors detected when downloading an RSL. * * @param event The event object. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function rslErrorHandler(event:RSLEvent):void { _preloader.removeEventListener(ProgressEvent.PROGRESS, progressHandler); _preloader.removeEventListener(Event.COMPLETE, completeHandler); _preloader.removeEventListener(RSLEvent.RSL_PROGRESS, rslProgressHandler); _preloader.removeEventListener(RSLEvent.RSL_COMPLETE, rslCompleteHandler); _preloader.removeEventListener(RSLEvent.RSL_ERROR, rslErrorHandler); _preloader.removeEventListener(FlexEvent.INIT_PROGRESS, initProgressHandler); _preloader.removeEventListener(FlexEvent.INIT_COMPLETE, initCompleteHandler); if (!_showingDisplay) { show(); // Call setDownloadProgress here to draw // the progress bar background. setDownloadProgress(100, 100); } var errorField:ErrorField = new ErrorField(this); errorField.show(event.errorText); } /** * Event listener for the FlexEvent.INIT_PROGRESS event. * This implementation updates the progress bar * each time the event is dispatched. * * @param event The event object. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function initProgressHandler(event:Event):void { // make elapsed time relative the time we started init. if (_initProgressCount == 0) _startTime = getTimer(); var elapsedTime:int = getTimer() - _startTime; _initProgressCount++; if (!_showingDisplay && showDisplayForInit(elapsedTime, _initProgressCount)) { _displayStartCount = _initProgressCount; show(); // If we are showing the progress for the first // time here, we need to call setDownloadProgress() once to draw // the progress bar background. setDownloadProgress(100, 100); } if (_showingDisplay) { // if show() did not actually show because of SWFObject bug // then we may need to draw the download bar background here if (!_downloadComplete) setDownloadProgress(100, 100); setInitProgress(_initProgressCount, initProgressTotal); } } /** * Event listener for the FlexEvent.INIT_COMPLETE event. * This implementation dispatches a Event.COMPLETE event. * * @param event The event object * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion Flex 4 */ protected function initCompleteHandler(event:Event):void { dispatchEvent(new Event(Event.COMPLETE)); } /** * @private */ private function loader_completeHandler(event:Event):void { var target:DisplayObject = DisplayObject(LoaderInfo(event.target).loader); initBackgroundImage(target); } /** * @private */ private function loader_ioErrorHandler(event:IOErrorEvent):void { // Swallow the error } } } import flash.display.DisplayObject; import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormat; import flash.system.Capabilities; import flash.text.TextFieldAutoSize; import flash.display.DisplayObjectContainer; import flash.display.Stage; import mx.preloaders.SparkDownloadProgressBar; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * @private * * Area to display error messages to help debug startup problems. * */ class ErrorField extends Sprite { private var downloadProgressBar:SparkDownloadProgressBar; private const MIN_WIDTH_INCHES:int = 2; // min width of error message in inches private const MAX_WIDTH_INCHES:int = 6; // max width of error message in inches private const TEXT_MARGIN_PX:int = 10; //---------------------------------- // labelFormat //---------------------------------- /** * The TextFormat object of the TextField component of the label. * This is a read-only property which you must override * if you need to change it. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ protected function get labelFormat():TextFormat { var tf:TextFormat = new TextFormat(); tf.color = 0x000000; tf.font = "Arial"; tf.size = 12; return tf; } /** * @private * * @param - parent - parent of the error field. */ public function ErrorField(downloadProgressBar:SparkDownloadProgressBar) { super(); this.downloadProgressBar = downloadProgressBar; } /** * Create and show the error message. * * @param errorText - text for error message. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function show(errorText:String):void { if (errorText == null || errorText.length == 0) return; var screenWidth:Number = downloadProgressBar.stageWidth; var screenHeight:Number = downloadProgressBar.stageHeight; // create the text field for the message and // add it to the parent. var textField:TextField = new TextField(); textField.autoSize = TextFieldAutoSize.LEFT; textField.multiline = true; textField.wordWrap = true; textField.background = true; textField.defaultTextFormat = labelFormat; textField.text = errorText; textField.width = Math.max(MIN_WIDTH_INCHES * Capabilities.screenDPI, screenWidth - (TEXT_MARGIN_PX * 2)); textField.width = Math.min(MAX_WIDTH_INCHES * Capabilities.screenDPI, textField.width); textField.y = Math.max(0, screenHeight - TEXT_MARGIN_PX - textField.height); // center field horizontally textField.x = (screenWidth - textField.width) / 2; downloadProgressBar.parent.addChild(this); this.addChild(textField); } }