blob: 7a01e51a56868b1187c650bb8f6d35f0d5670a93 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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);
}
}
}