| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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 |
| { |
| import flash.display.DisplayObject; |
| import flash.display.DisplayObjectContainer; |
| import flash.display.Loader; |
| import flash.display.MovieClip; |
| import flash.events.Event; |
| |
| import mx.core.MovieClipLoaderAsset; |
| import mx.managers.ISystemManager; |
| |
| /** |
| * The MovieClipSWFLoader control extends SWFLoader to provide convenience |
| * methods for manipulating a SWF which has a MovieClip as its root content, |
| * provided that the MovieClip is not a Flex application. |
| * |
| * Note that for all other SWF content types, this class will return null |
| * for the movieClip getter and will result in a no-op for function calls. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public class MovieClipSWFLoader extends SWFLoader |
| { |
| include "../core/Version.as"; |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Constructor |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Constructor |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function MovieClipSWFLoader() |
| { |
| super(); |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Properties |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * When the content of the SWF is a MovieClip, if autoStop is true then |
| * the MovieClip is stopped immediately after loading. |
| * |
| * @default true |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public var autoStop:Boolean = true; |
| |
| |
| /** |
| * Handle to the underlying MovieClip of the loaded SWF. If the SWF is not |
| * rooted in a MovieClip, this property will be null. |
| * |
| * @return MovieClip if the content is of type MovieClip; otherwise, |
| * return null |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function get movieClip():MovieClip |
| { |
| var content:DisplayObject = this.content; |
| |
| if (content is MovieClipLoaderAsset) |
| { |
| // Obtain child MovieClip |
| if (DisplayObjectContainer(content).numChildren > 0) |
| content = |
| Loader(DisplayObjectContainer(content).getChildAt(0)).content; |
| } |
| |
| if (content is MovieClip && !(content is ISystemManager)) |
| return MovieClip(content); |
| |
| return null; |
| } |
| |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Methods |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Begins playing the SWF content. If the content is not a MovieClip, |
| * this results in a no-op. |
| * |
| * @see flash.display.MovieClip#play |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function play():void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.play(); |
| } |
| |
| /** |
| * Stops the SWF content. If the content is not a MovieClip, |
| * this results in a no-op. |
| * |
| * @see flash.display.MovieClip#stop |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function stop():void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.stop(); // stop at current frame |
| } |
| |
| /** |
| * Starts playing the SWF file at the specified frame. If the |
| * content is not a MovieClip, this results in a no-op. |
| * |
| * @see flash.display.MovieClip#gotoAndPlay |
| * |
| * @param frame A number representing the frame number, |
| * or a string representing the label of the frame, |
| * to which the playhead is sent. |
| * If you specify a number, it is relative to the scene you specify. |
| * If you do not specify a scene, the current scene determines the |
| * global frame number to play. |
| * If you do specify a scene, the playhead jumps to the frame number in the specified scene. |
| * |
| * @param scene The name of the scene to play. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| |
| public function gotoAndPlay(frame:Object, scene:String = null):void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.gotoAndPlay(frame, scene); |
| } |
| |
| /** |
| * Resets the playhead to the first frame of the first scene and stops the MovieClip. |
| * If the content is not a MovieClip, this results in a no-op. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function gotoFirstFrameAndStop():void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| { |
| var scenes:Array = movieClip.scenes; |
| var sceneHasName:Boolean = (scenes && |
| scenes.length > 0 && |
| scenes[0].name != ""); |
| |
| var scene:String = (sceneHasName ? scenes[0].name : null); |
| |
| movieClip.gotoAndStop(0, scene); // go to first frame and stop |
| } |
| } |
| |
| /** |
| * Stops playing the SWF and resets the playhead to the specified frame. |
| * If the content is not a MovieClip, this results in a no-op. |
| * |
| * @see flash.display.MovieClip#gotoAndStop |
| * |
| * @param frame A number representing the frame number, |
| * or a string representing the label of the frame, |
| * to which the playhead is sent. |
| * If you specify a number, it is relative to the scene you specify. |
| * If you do not specify a scene, the current scene determines the |
| * global frame number to play. |
| * If you do specify a scene, the playhead jumps to the frame number in the specified scene. |
| * |
| * @param scene The name of the scene to play. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function gotoAndStop(frame:Object, scene:String = null):void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.gotoAndStop(frame, scene); |
| } |
| |
| /** |
| * Go to the next frame. No-op if content is not a MovieClip. |
| * |
| * @see flash.display.MovieClip#nextFrame |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function nextFrame():void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.nextFrame(); |
| } |
| |
| /** |
| * Go to the next scene. No-op if content is not a MovieClip. |
| * |
| * @see flash.display.MovieClip#nextScene |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function nextScene():void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.nextScene(); |
| } |
| |
| /** |
| * Go to the previous frame. No-op if content is not a MovieClip. |
| * |
| * @see flash.display.MovieClip#prevFrame |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function prevFrame():void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.prevFrame(); |
| } |
| |
| /** |
| * Go to the previous scene. No-op if content is not a MovieClip. |
| * |
| * @see flash.display.MovieClip#prevScene |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function prevScene():void |
| { |
| var movieClip:MovieClip = this.movieClip; |
| if (movieClip) |
| movieClip.prevScene(); |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Overridden methods |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * @private |
| * On completion of SWF loading, explicitly stop the SWF |
| * (i.e. prevent auto-play) if autoStop is true. |
| */ |
| override protected function contentLoaded():void |
| { |
| super.contentLoaded(); |
| if (autoStop) |
| stop(); |
| |
| // Special case for embeds where our embed class loader |
| // may not be complete just yet. |
| if (content is MovieClipLoaderAsset) |
| { |
| if (DisplayObjectContainer(content).numChildren > 0) |
| { |
| var childContent:DisplayObject = DisplayObjectContainer(content).getChildAt(0); |
| if (childContent is Loader && Loader(childContent).content == null) |
| content.addEventListener(Event.ADDED, content_addedHandler, false, 0, true); |
| } |
| } |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Event Handlers |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * @private |
| * Helper method used to auto-stop embedded SWF content that may not |
| * have been fully loaded at the time contentLoaded() was invoked. |
| */ |
| private function content_addedHandler(event:Event):void |
| { |
| if (autoStop) |
| stop(); |
| |
| content.removeEventListener(Event.ADDED, content_addedHandler); |
| } |
| } |
| } |