1  /**
     2   * com.sekati.display.StageDisplay
     3   * @version 1.1.5
     4   * @author jason m horwitz | sekati.com
     5   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     6   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     7   */
     8   
     9  import com.sekati.core.CoreObject;
    10  import com.sekati.events.Dispatcher;
    11  import com.sekati.events.Event;
    12  import com.sekati.events.FramePulse;
    13  import com.sekati.geom.Point;
    14  import com.sekati.utils.Delegate;
    15  
    16  /**
    17   * StageDisplay eases Stage interfacing with added/simplified methods and properties. 
    18   * Note {@link _fullscreen()} requires Flash Player >=9.0.28
    19   */
    20  class com.sekati.display.StageDisplay extends CoreObject {
    21  
    22  	private static var _instance:StageDisplay;
    23  	public static var onStageResizeEVENT:String = "onStageResize";
    24  	public static var onStageResizeCompleteEVENT:String = "onStageResizeComplete";
    25  	public static var onStageFullScreenEVENT:String = "onStageFullScreen";
    26  	public static var onStageReadyEVENT:String = "onStageReady";
    27  	private static var _resizeDelayMs:Number = 500;
    28  	private static var _resizeIntervalId:Number;		
    29  
    30  	/**
    31  	 * Singleton Private Constructor
    32  	 */
    33  	private function StageDisplay() {
    34  		super( );
    35  		Stage.addListener( this );
    36  		FramePulse.$.addFrameListener( this );
    37  	}
    38  
    39  	/**
    40  	 * Singleton Accessor
    41  	 * @return StageDisplay
    42  	 */
    43  	public static function getInstance():StageDisplay {
    44  		if (!_instance) _instance = new StageDisplay( );
    45  		return _instance;
    46  	}
    47  
    48  	/**
    49  	 * Shorthand singleton accessor getter
    50  	 * @return StageDisplay
    51  	 */
    52  	public static function get $():StageDisplay {
    53  		return StageDisplay.getInstance( );	
    54  	}
    55  
    56  	/**
    57  	 * Stage.onResize dispatches onStageResize event.
    58  	 * @return Void 
    59  	 */
    60  	 
    61  	public function onResize():Void {
    62  		if (_resizeIntervalId != null) clearResizeInt( );
    63  		_resizeIntervalId = setInterval( Delegate.create( this, onResizeComplete ), _resizeDelayMs );
    64  		Dispatcher.$.dispatchEvent( new Event( onStageResizeEVENT, _instance, {_width:_width, _height:_height} ) );	
    65  	}
    66  
    67  	/**
    68  	 * Fires when an onResize event has not been fired in the time defined by {@link _resizeDelayMs}.
    69  	 * @return Void
    70  	 */
    71  	public function onResizeComplete():Void {
    72  		trace( "@@@ onResizeComplete Fired! (" + _resizeDelayMs + "ms expired since last resize)" );
    73  		Dispatcher.$.dispatchEvent( new Event( onStageResizeCompleteEVENT, _instance, {_width:_width, _height:_height} ) );
    74  		clearResizeInt( );
    75  	}	
    76  
    77  	/**
    78  	 * Stage.onFullScreen dispatches onStageFullscreen event.
    79  	 * @return Void
    80  	 */
    81  	public function onFullScreen(bFull:Boolean):Void {
    82  		trace( "@@@ onFullScreen Fired! (" + bFull + ")" );
    83  		Dispatcher.$.dispatchEvent( new Event( onStageFullScreenEVENT, _instance, {isFullscreen:bFull} ) );
    84  	}
    85  
    86  	/**
    87  	 * Handle resizeInterval resets
    88  	 * @return Void
    89  	 */
    90  	private function clearResizeInt():Void {
    91  		clearInterval( _resizeIntervalId );
    92  		_resizeIntervalId = null;		
    93  	}
    94  
    95  	/**
    96  	 * Listen to {@link com.sekati.events.FramePulse} and dispatch an onStageReadyEVENT once the Stage has initialized.
    97  	 * @return Void
    98  	 */
    99  	private function _onEnterFrame():Void {
   100  		if (isReady) {
   101  			FramePulse.$.removeFrameListener( this );
   102  			Dispatcher.$.dispatchEvent( new Event( onStageReadyEVENT, _instance, {isReady:isReady} ) );	
   103  		}
   104  	}	
   105  
   106  	/**
   107  	 * StageDisplay.isReady getter to indicate if Stage has been fully initialized.
   108  	 * @return Boolean 
   109  	 */
   110  	public function get isReady():Boolean {
   111  		return (_width > 0 && _height > 0);	
   112  	}
   113  
   114  	/**
   115  	 * Stage.width getter.
   116  	 * @return Number
   117  	 */
   118  	public function get _width():Number {
   119  		return Stage.width;	
   120  	}
   121  
   122  	/**
   123  	 * Stage.height getter.
   124  	 * @return Number
   125  	 */
   126  	public function get _height():Number {
   127  		return Stage.height;
   128  	}
   129  
   130  	/**
   131  	 * Stage size getter.
   132  	 * @return Point - containing right, bottom.
   133  	 */
   134  	public function get _size():Point {
   135  		return new Point( _width, _height );	
   136  	}
   137  
   138  	/**
   139  	 * Stage center _x getter.
   140  	 * @return Number
   141  	 */
   142  	public function get _centerx():Number {
   143  		return Math.round( _width / 2 );
   144  	}
   145  
   146  	/**
   147  	 * Stage center _y getter.
   148  	 * @return Number
   149  	 */
   150  	public function get _centery():Number {
   151  		return Math.round( _height / 2 );
   152  	}
   153  
   154  	/**
   155  	 * Stage center getter.
   156  	 * @return Point
   157  	 */
   158  	public function get _center():Point {
   159  		return new Point( _centerx, _centery );	
   160  	}
   161  
   162  	/**
   163  	 * Stage.displayState fullscreen getter
   164  	 * @return Boolean - true if fullscreen, false if normal.
   165  	 */	 
   166  	public function get _fullscreen():Boolean {
   167  		return (Stage["displayState"] == "fullScreen") ? true : false;
   168  	}
   169  
   170  	/**
   171  	 * Stage.displayState fullscreen setter - dispatches "onStageFullscreen" event.
   172  	 * @param b (Boolean) true sets fullscreen, false sets normal.
   173  	 */
   174  	public function set _fullscreen(b:Boolean):Void {
   175  		var state:String = (!b) ? "normal" : "fullScreen";
   176  		Stage["displayState"] = state;
   177  	}
   178  
   179  	/**
   180  	 * toggle Stage.displayState between "normal" and "fullScreen".
   181  	 * @return Void
   182  	 */
   183  	public function toggleFullScreen():Void {	
   184  		_fullscreen = !_fullscreen;
   185  	}
   186  
   187  	/**
   188  	 * Destroy Singleton instance.
   189  	 * @return Void
   190  	 */
   191  	public function destroy():Void {
   192  		FramePulse.$.removeFrameListener( this );
   193  		super.destroy( );
   194  	}
   195  }