1  /**
     2   * com.sekati.transitions.MousePan
     3   * @version 1.1.1
     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.CoreObject;
    10  import com.sekati.display.StageDisplay;
    11  import com.sekati.events.Dispatcher;
    12  import com.sekati.events.FramePulse;
    13  import com.sekati.except.FatalArgumentException;
    14  import com.sekati.utils.Delegate;
    15  
    16  /**
    17   * MousePan supporting fullscreen
    18   */
    19  class com.sekati.transitions.MousePan extends CoreObject {
    20  
    21  	private var _this:MousePan;
    22  	private var _target:MovieClip;
    23  	private var _mListener:Object;
    24  	private var _destX:Number;
    25  	private var SPEED:Number;
    26  
    27  	/**
    28  	 * Constructor
    29  	 * @param target (MovieClip)
    30  	 * @return Void
    31  	 * @throws FatalArgumentException
    32  	 */
    33  	public function MousePan(target:MovieClip, speed:Number) {
    34  		super( );
    35  		if (!target) {
    36  			throw new FatalArgumentException( _this, "Constructor requires 'target' argument", arguments );
    37  		}
    38  		SPEED = (!speed) ? 4 : speed;
    39  		_target = target;
    40  		_this = this;
    41  		_mListener = new Object();
    42  		FramePulse.$.addFrameListener( _this );
    43  		_mListener.onMouseMove = Delegate.create(_this, _onMouseMove);
    44  		Mouse.addListener( _mListener );
    45  		
    46  		Dispatcher.$.addEventListener(StageDisplay.onStageResizeEVENT, Delegate.create (_this, _onResize));
    47  		Dispatcher.$.addEventListener(StageDisplay.onStageResizeCompleteEVENT, Delegate.create (_this, _onResizeComplete));
    48  		Dispatcher.$.addEventListener(StageDisplay.onStageFullScreenEVENT, Delegate.create (_this, _onResize));	
    49  			
    50  	}
    51  	
    52  	/**
    53  	 * Pan the image based on users mouse
    54  	 * @return Void
    55  	 */
    56  	private function _onEnterFrame():Void {
    57  	    if (_destX < -_target._width || _destX > _target._width || _target._x == _destX || _destX < -_target._width || _destX > _target._width) { 
    58  	    	return;
    59  		} else if (_target._x > _destX) { 
    60  			_target._x -= Math.ceil((_target._x-_destX)*(SPEED/100)); 
    61  		} else if (_target._x< _destX) { 
    62  			_target._x += Math.ceil((_destX-_target._x)*(SPEED/100)); 
    63  		} 	
    64  	}
    65  	
    66  	private function _onMouseMove():Void {
    67  		constrainMove(0);
    68  	}
    69  	 
    70  	private function constrainMove(dir:Number):Void { 
    71  		if (_xmouse < 0 || _xmouse > Stage.width || isNaN(_xmouse)) {
    72  			return;
    73  		}
    74  		var mousePercent:Number = _xmouse/Stage.width;
    75  		var mSpeed:Number = (dir == 1) ? 1-mousePercent : mousePercent; 
    76  		_destX = Math.round(-((_target._width-Stage.width)*mSpeed));
    77  		//App.log.status(_this, "MOUSEPAN._destX: "+_destX);
    78  	}
    79  	
    80  	private function _onResize():Void {
    81  		FramePulse.$.removeFrameListener(_this);	
    82  	}
    83  	
    84  	private function _onResizeComplete():Void {
    85  		_destX = _target._x;
    86  		FramePulse.$.addFrameListener(_this);
    87  	}
    88  
    89  	public function destroy():Void {
    90  		FramePulse.$.removeFrameListener( _this );
    91  		Mouse.removeListener( _mListener );
    92  		Dispatcher.$.removeEventListener(StageDisplay.onStageResizeEVENT, _this);	
    93  		Dispatcher.$.removeEventListener(StageDisplay.onStageResizeCompleteEVENT, _this);
    94  		Dispatcher.$.removeEventListener(StageDisplay.onStageFullScreenEVENT, _this);		
    95  		super.destroy();
    96  	}
    97  }
    98