1  /**
     2   * com.sekati.events.Dispatcher
     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.Event;
    11  import com.sekati.events.IDispatchable;
    12  import mx.events.EventDispatcher;
    13  
    14  /**
    15   * A centralized EventDispatcher to decouple event listeners & dispatchers from direct addressing.
    16   * {@code Usage:
    17   * var receiveObj:Object = {_name:"receiveObj"};
    18   * // define a generic method for the reciever object to use
    19   * function onEventReceived (event:Object):Void {
    20   * var str:String = (this._name + " received Event = { type:" + event.type + ", target:" + event.target + ", data: {");
    21   * for (var i in event.data) { str += " " + i + ":" + event.data[i] + ","; }
    22   * trace (str+" }};");
    23   * }
    24   * // add the method to our reciever object as 'testEvent'
    25   * receiveObj.testEvent = onEventReceived;
    26   * // add reciever object as an event listener for "testEvent"
    27   * Dispatcher.getInstance().addEventListener ("testEvent",receiveObj);
    28   * // define sender and data objects (optional)
    29   * var senderObj:Object = this;
    30   * var dataObj:Object = {message:"hello", someNumber:42};
    31   * // Dispatch the event to all 'testEvent' EventListeners
    32   * Dispatcher.getInstance().dispatchEvent (new Event ("testEvent", senderObj, dataObj));
    33   * }
    34   * Some excellent explanations of the AS2/3 event models and broadcasters vs dispatchers
    35   * @see <a href="http://www.communitymx.com/content/article.cfm?page=1&cid=76FDB">http://www.communitymx.com/content/article.cfm?page=1&cid=76FDB</a>
    36   * @see <a href="http://www.kirupa.com/developer/actionscript/eventdispatcher.htm">http://www.kirupa.com/developer/actionscript/eventdispatcher.htm</a>
    37   * @see {@link com.sekati.events.Broadcaster}
    38   */
    39  class com.sekati.events.Dispatcher extends CoreObject implements IDispatchable {
    40  
    41  	private static var _instance:Dispatcher;
    42  	private var _manager:Object;
    43  
    44  	/**
    45  	 * Singleton Private Constructor: initializes centralized management of mx.events.EventDispatcher
    46  	 */
    47  	private function Dispatcher() {
    48  		super( );
    49  		_manager = new Object( );
    50  		EventDispatcher.initialize( _manager );
    51  	}
    52  
    53  	/**
    54  	 * Singleton Accessor
    55  	 * @return Dispatcher
    56  	 */
    57  	public static function getInstance():Dispatcher {
    58  		if (!_instance) _instance = new Dispatcher( );
    59  		return _instance;
    60  	}
    61  
    62  	/**
    63  	 * shorthand singleton accessor getter
    64  	 */
    65  	public static function get $():Dispatcher {
    66  		return Dispatcher.getInstance( );	
    67  	}
    68  
    69  	/**
    70  	 * Add the event listener to the centralized event manager
    71  	 * @param event (String) the name of the event ("click", "change", etc)
    72  	 * @param handler (Object) the function or object that should be called
    73  	 * @return Void
    74  	 */
    75  	public function addEventListener(event:String, handler:Object):Void {
    76  		_manager.addEventListener( event, handler );
    77  	}
    78  
    79  	/**
    80  	 * Remove the event listener from the centralized event manager
    81  	 * @param event (String) the name of the event ("click", "change", etc)
    82  	 * @param handler (Object) the function or object that should be called
    83  	 * @return Void
    84  	 */
    85  	public function removeEventListener(event:String, handler:Object):Void {
    86  		_manager.removeEventListener( event, handler );
    87  	}
    88  
    89  	/**
    90  	 * Dispatch the event to all listeners via the centralized event manager
    91  	 * @param e (Event) an Event or one of its subclasses describing the event
    92  	 * @return Void
    93  	 * {@code Usage:
    94  	 * Dispatcher.getInstance().dispatchEvent(new Event("myEvent", this, {foo:true, bar:false}));
    95  	 * }
    96  	 */
    97  	public function dispatchEvent(e:Event):Void {
    98  		_manager.dispatchEvent( e );
    99  	}
   100  
   101  	/**
   102  	 * Bubbles event up the chain. The target property is added on the route
   103  	 * and then replaced by the new target.
   104  	 * @param e (Event)
   105  	 * @return Void
   106  	 */
   107  	public function bubbleEvent(e:Event):Void {
   108  		e.bubble( this );
   109  		dispatchEvent( e );
   110  	}
   111  
   112  	/**
   113  	 * Wrapper to dispatchEvent: creates an Event object and dispatchs it to all event listeners
   114  	 * {@code Usage:
   115  	 * Dispatcher.getInstance().broadcastEvent("myEvent",targetObject, {param0:value0, param1:value1, paramn:valuen});
   116  	 * }
   117  	 * @param _type (String) type of event
   118  	 * @param _target (Object) he object that dispatched this event. There is a known bug with this property: It always returns as '/'. This may be a flaw in EventDispatcher; if you need to pass the event source use {@link dispatchEvent}.
   119  	 * @param _data (Object) a transport object for any needed data
   120  	 * @return Void
   121  	 */
   122  	public function broadcastEvent(_type:String, _target:Object, _data:Object):Void {
   123  		var event:Event = new Event( _type, _target, _data );
   124  		_manager.dispatchEvent( event );
   125  	}
   126  
   127  	/**
   128  	 * Destroy singleton instance.
   129  	 * @return Void
   130  	 */
   131  	public function destroy():Void {
   132  		delete _manager;
   133  		delete _instance;
   134  		super.destroy( );
   135  	}	
   136  }