//////////////////////////////////////////////////////////////////////////////// // // 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.core { import flash.display.MovieClip; import flash.display.Loader; import flash.events.Event; import flash.system.ApplicationDomain; import flash.system.LoaderContext; import flash.utils.ByteArray; /** * Dispatched after the SWF asset has been fully loaded. * * @eventType flash.events.Event.COMPLETE * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ [Event(name="complete", type="flash.events.Event")] /** * MovieClipLoaderAsset is a subclass of the MovieClipAsset class * which represents SWF files that you embed in a Flex application. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public class MovieClipLoaderAsset extends MovieClipAsset implements IFlexAsset, IFlexDisplayObject { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function MovieClipLoaderAsset() { super(); var loaderContext:LoaderContext = new LoaderContext(); loaderContext.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); // in AIR... // when embedding a SWF using @Embed, you are actively asking for the SWF // to be executed, otherwise the SWF will fail loading due to // Loader.allowLoadBytesCodeExecution. // // this property prevents accidentally loading a potentially dangerous // SWF into the application sandbox. // // since this property is indirectly accessed, this should be revisited // after AIR 1.x, as it may become deprecated if ("allowLoadBytesCodeExecution" in loaderContext) loaderContext["allowLoadBytesCodeExecution"] = true; loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); loader.loadBytes(movieClipData, loaderContext); addChild(loader); } //-------------------------------------------------------------------------- // // Variables // //-------------------------------------------------------------------------- /** * @private */ private var loader:Loader = null; /** * @private */ private var initialized:Boolean = false; /** * @private */ private var requestedWidth:Number; /** * @private */ private var requestedHeight:Number; /** * Backing storage for the measuredWidth property. * Subclasses should set this value in the constructor. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ protected var initialWidth:Number = 0; /** * Backing storage for the measuredHeight property. * Subclasses should set this value in the constructor. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ protected var initialHeight:Number = 0; //-------------------------------------------------------------------------- // // Overridden properties // //-------------------------------------------------------------------------- //---------------------------------- // height //---------------------------------- /** * @private */ override public function get height():Number { if (!initialized) return initialHeight; return super.height; } /** * @private */ override public function set height(value:Number):void { if (!initialized) requestedHeight = value; else loader.height = value; } //---------------------------------- // measuredHeight //---------------------------------- /** * @private * The default height, in pixels. */ override public function get measuredHeight():Number { return initialHeight; } //---------------------------------- // measuredWidth //---------------------------------- /** * @private * The default width, in pixels. */ override public function get measuredWidth():Number { return initialWidth; } //---------------------------------- // width //---------------------------------- /** * @private */ override public function get width():Number { if (!initialized) return initialWidth; return super.width; } /** * @private */ override public function set width(value:Number):void { if (!initialized) requestedWidth = value; else loader.width = value; } //-------------------------------------------------------------------------- // // Properties // //-------------------------------------------------------------------------- //---------------------------------- // movieClipData //---------------------------------- /** * A ByteArray containing the inner content. * Overridden in subclasses. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get movieClipData():ByteArray { return null; } //-------------------------------------------------------------------------- // // Event handlers // //-------------------------------------------------------------------------- /** * @private * The event handler for the complete event. */ private function completeHandler(event:Event):void { initialized = true; initialWidth = loader.contentLoaderInfo.width; initialHeight = loader.contentLoaderInfo.height; if (!isNaN(requestedWidth)) loader.width = requestedWidth; if (!isNaN(requestedHeight)) loader.height = requestedHeight; // Forward the event dispatchEvent(event); } } }