00001 import gugga.collections.HashTable;
00002 import gugga.common.IEventDispatcher;
00003 import gugga.utils.DebugUtils;
00004 import gugga.utils.DoLaterUtil;
00005
00009 class gugga.events.EventDispatcher implements IEventDispatcher
00010 {
00011 private static var mEventDispatcher : EventDispatcher;
00012
00013 private var mBroadcasters : HashTable;
00014
00015 public function dispatchEventLater(aEventObject : Object) : Void
00016 {
00017 DoLaterUtil.doLater(this, dispatchEvent, [aEventObject], 1);
00018 }
00019
00020 public function dispatchEvent(aEventObject : Object) : Void
00021 {
00022 var eventType : String = aEventObject["type"];
00023 mBroadcasters[eventType].broadcastMessage("handler", aEventObject);
00024 }
00025
00026 public function addEventListener(aEventName:String, aHandler) : Void
00027 {
00028 if(!mBroadcasters)
00029 {
00030 mBroadcasters = new HashTable();
00031 }
00032
00033 if(!mBroadcasters[aEventName])
00034 {
00035 mBroadcasters[aEventName] = new Object();
00036 AsBroadcaster.initialize(mBroadcasters[aEventName]);
00037 }
00038
00039 var handlerWrapper : Object = { handler: aHandler };
00040 aHandler.handlerWrapper = handlerWrapper;
00041
00042 mBroadcasters[aEventName].addListener(handlerWrapper);
00043 }
00044
00045 public function removeEventListener(aEventName:String, aHandler) : Void
00046 {
00047 var handlerWrapper : Function = aHandler.handlerWrapper;
00048 handlerWrapper.handler = null;
00049
00050 mBroadcasters[aEventName].removeListener(handlerWrapper);
00051 }
00052
00053 private function removeAllEventListeners() : Void
00054 {
00055 delete mBroadcasters;
00056 }
00057
00058 public static function initialize(object:Object):Void
00059 {
00060 if (!mEventDispatcher)
00061 {
00062 mEventDispatcher = new EventDispatcher();
00063 }
00064
00065 object.addEventListener = mEventDispatcher.addEventListener;
00066 object.removeEventListener = mEventDispatcher.removeEventListener;
00067 object.dispatchEvent = mEventDispatcher.dispatchEvent;
00068 object.dispatchEventLater = mEventDispatcher.dispatchEventLater;
00069 }
00070 }