1  /**
     2   * com.sekati.ui.FauxView
     3   * @version 1.3.0
     4   * @author jason m horwitz | sekati.com | tendercreative.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.App;
    10  import com.sekati.core.CoreObject;
    11  import com.sekati.core.FWDepth;
    12  import com.sekati.draw.Rectangle;
    13  import com.sekati.display.StageDisplay;
    14  import com.sekati.events.Broadcaster;
    15  import com.sekati.events.Dispatcher;
    16  import com.sekati.geom.Point;
    17  import com.sekati.utils.ClassUtils;
    18  import com.sekati.utils.Delegate;
    19  
    20  /**
    21   * FauxView singleton creates a set of {@link com.sekati.display.BaseClip} rectangles on stage for use in tracking and broadcast
    22   * a 16:9 content viewport scaled proportionally to the Stage.
    23   * 
    24   * This wraps and simplifies the {@link com.sekati.display.StageDisplay} dispatched events and 
    25   * pushes them thru {@link com.sekati.events.Broadcaster} using the {@code onPropcast} event after 
    26   * updating the tracking clip so that the information may be used in liquid layouts that require 
    27   * positional relationships.
    28   */
    29  class com.sekati.ui.FauxView extends CoreObject {
    30  
    31  	private static var _instance:FauxView;
    32  	private static var onFauxViewUpdateEVENT:String = "onFauxViewUpdate";
    33  	private static var _proportionW:Number = 16;
    34  	private static var _proportionH:Number = 9;
    35  	private static var RATIO:Number = (_proportionH / _proportionW);
    36  	private var _this:FauxView;
    37  	private var _viewport:MovieClip;
    38  	private var _tbox:MovieClip;
    39  	private var _bbox:MovieClip;
    40  
    41  	/**
    42  	 * Singleton Constructor - create a tracker clip, set to proper ratio and listen for stage events.
    43  	 */
    44  	private function FauxView() {
    45  		super( );
    46  		App.log.status(_instance, "*** - FauxView Initialized ..." );
    47  		_this = this;
    48  
    49  		var target:MovieClip = ClassUtils.createEmptyMovieClip( com.sekati.display.BaseClip, _root, "fauxView", {_x:0, _y:0, _depth:FWDepth.FauxView} );
    50  
    51  		_viewport = ClassUtils.createEmptyMovieClip( com.sekati.display.BaseClip, target, "__viewport_center_area__", {_x:0, _y:0, _visible:false} );
    52  		Rectangle.draw( _viewport, new Point( 0, 0 ), new Point( _proportionW, _proportionH ), 0xFFFF00, 25, 0 );
    53  		
    54  		_tbox = ClassUtils.createEmptyMovieClip( com.sekati.display.BaseClip, target, "__viewport_top_letterbox__", {_x:0, _y:0, _visible:true} );
    55  		Rectangle.draw( _tbox, new Point( 0, 0 ), new Point( _proportionW, _proportionH ), 0x000000, 100, 0 );
    56  		
    57  		_bbox = ClassUtils.createEmptyMovieClip( com.sekati.display.BaseClip, target, "__viewport_bot_letterbox__", {_x:0, _y:0, _visible:true} );
    58  		Rectangle.draw( _bbox, new Point( 0, 0 ), new Point( _proportionW, _proportionH ), 0x000000, 100, 0 );
    59  
    60  		Dispatcher.$.addEventListener( StageDisplay.onStageResizeEVENT, Delegate.create( _this, update ) );
    61  		Dispatcher.$.addEventListener( StageDisplay.onStageResizeCompleteEVENT, Delegate.create( _this, update ) );
    62  		Dispatcher.$.addEventListener( StageDisplay.onStageFullScreenEVENT, Delegate.create( _this, update ) );
    63  		
    64  		update( );
    65  	}
    66  
    67  	/**
    68  	 * Singleton Accessor
    69  	 * @return Proportioncaster
    70  	 */
    71  	public static function getInstance():FauxView {
    72  		if (!_instance) {
    73  			_instance = new FauxView( );
    74  		}
    75  		return _instance;
    76  	}
    77  
    78  	/**
    79  	 * shorthand singleton accessor getter
    80  	 */
    81  	public static function get $():FauxView {
    82  		return FauxView.getInstance( );	
    83  	}
    84  
    85  	/**
    86  	 * Set a new proportion to scale by.
    87  	 * @param w (Number)
    88  	 * @param h (Number)
    89  	 * @return Void
    90  	 */
    91  	public function setProp(w:Number, h:Number):Void {
    92  		_proportionW = w;
    93  		_proportionH = h;
    94  		update( );
    95  	}
    96  
    97  	/**
    98  	 * Proportionally scale the tracker to fit Stage.
    99  	 * @return Void
   100  	 */
   101  	private function update():Void {
   102  		var w:Number = Stage.width;
   103  		var h:Number = int( w * RATIO );
   104  		var y:Number = int( Stage.height / 2 - h / 2 );
   105  		var bh:Number = (int( Stage.height - h - y ) < 23) ? 23 : int( Stage.height - h - y );
   106  		// place positions		
   107  		_viewport._width = _tbox._width = _bbox._width = w;
   108  		_viewport._height = h;
   109  		_viewport._y = y;
   110  		_tbox._height = y;
   111  		_bbox._height = bh;
   112  		_bbox._y = Stage.height - bh;
   113  		Broadcaster.$.broadcast( onFauxViewUpdateEVENT, p );
   114  	}
   115  
   116  	public function get panoramic_height():Number {
   117  		return int( Stage.width * RATIO );
   118  	}
   119  
   120  	/**
   121  	 * _x getter
   122  	 * @return Number
   123  	 */
   124  	public function get x():Number {
   125  		return _viewport._x;	
   126  	}
   127  
   128  	public function get _x():Number {
   129  		return _viewport._x;	
   130  	}	
   131  
   132  	/**
   133  	 * _y getter
   134  	 * @return Number
   135  	 */
   136  	public function get y():Number {
   137  		return _viewport._y;	
   138  	}
   139  
   140  	public function get _y():Number {
   141  		return _viewport._y;	
   142  	}	
   143  
   144  	/**
   145  	 * _width getter
   146  	 * @return Number
   147  	 */	
   148  	public function get w():Number {
   149  		return _viewport._width;	
   150  	}
   151  
   152  	public function get _width():Number {
   153  		return _viewport._width;	
   154  	}	
   155  
   156  	/**
   157  	 * _height getter
   158  	 * @return Number
   159  	 */	
   160  	public function get h():Number {
   161  		return _viewport._height;
   162  	}
   163  
   164  	public function get _height():Number {
   165  		return _viewport._height;	
   166  	}	
   167  
   168  	/**
   169  	 * center x
   170  	 * @return Number
   171  	 */
   172  	public function get cx():Number {
   173  		return (w / 2);
   174  	}
   175  
   176  	/**
   177  	 * center y
   178  	 * @return Number
   179  	 */
   180  	public function get cy():Number {
   181  		return (h / 2) + y;
   182  	}
   183  
   184  	/**
   185  	 * return bottom of "viewport"
   186  	 * @return Number
   187  	 */
   188  	public function get bottom():Number {
   189  		return y + h;
   190  	}
   191  
   192  	/**
   193  	 * return the tracker object
   194  	 * @return MovieClip
   195  	 */
   196  	public function get shape():MovieClip {
   197  		return _viewport;	
   198  	}
   199  
   200  	/**
   201  	 * return the top letter box object
   202  	 * @return MovieClip
   203  	 */
   204  	public function get topShape():MovieClip {
   205  		return _tbox;	
   206  	}
   207  
   208  	/**
   209  	 * return the bottom letterbox object
   210  	 * @return MovieClip
   211  	 */
   212  	public function get botShape():MovieClip {
   213  		return _bbox;
   214  	}
   215  
   216  	/**
   217  	 * proportion getter
   218  	 * @return Object
   219  	 */
   220  	public function get p():Object {
   221  		return {x:x, y:y, w:w, h:h, b:bottom};
   222  	}
   223  }
   224