| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- local Event = class("Event")
- local EXPORTED_METHODS = {
- "addEventListener",
- "dispatchEvent",
- "removeEventListener",
- "removeEventListenersByTag",
- "removeEventListenersByEvent",
- "removeAllEventListeners",
- "hasEventListener",
- "dumpAllEventListeners",
- }
- function Event:init_()
- self.target_ = nil
- self.listeners_ = {}
- self.nextListenerHandleIndex_ = 0
- end
- function Event:bind(target)
- self:init_()
- cc.setmethods(target, self, EXPORTED_METHODS)
- self.target_ = target
- end
- function Event:unbind(target)
- cc.unsetmethods(target, EXPORTED_METHODS)
- self:init_()
- end
- function Event:on(eventName, listener, tag)
- assert(type(eventName) == "string" and eventName ~= "",
- "Event:addEventListener() - invalid eventName")
- eventName = string.upper(eventName)
- if self.listeners_[eventName] == nil then
- self.listeners_[eventName] = {}
- end
- self.nextListenerHandleIndex_ = self.nextListenerHandleIndex_ + 1
- local handle = tostring(self.nextListenerHandleIndex_)
- tag = tag or ""
- self.listeners_[eventName][handle] = {listener, tag}
- if DEBUG > 1 then
- printInfo("%s [Event] addEventListener() - event: %s, handle: %s, tag: \"%s\"",
- tostring(self.target_), eventName, handle, tostring(tag))
- end
- return self.target_, handle
- end
- Event.addEventListener = Event.on
- function Event:dispatchEvent(event)
- event.name = string.upper(tostring(event.name))
- local eventName = event.name
- if DEBUG > 1 then
- printInfo("%s [Event] dispatchEvent() - event %s", tostring(self.target_), eventName)
- end
- if self.listeners_[eventName] == nil then return end
- event.target = self.target_
- event.stop_ = false
- event.stop = function(self)
- self.stop_ = true
- end
- for handle, listener in pairs(self.listeners_[eventName]) do
- if DEBUG > 1 then
- printInfo("%s [Event] dispatchEvent() - dispatching event %s to listener %s", tostring(self.target_), eventName, handle)
- end
- -- listener[1] = listener
- -- listener[2] = tag
- event.tag = listener[2]
- listener[1](event)
- if event.stop_ then
- if DEBUG > 1 then
- printInfo("%s [Event] dispatchEvent() - break dispatching for event %s", tostring(self.target_), eventName)
- end
- break
- end
- end
- return self.target_
- end
- function Event:removeEventListener(handleToRemove)
- for eventName, listenersForEvent in pairs(self.listeners_) do
- for handle, _ in pairs(listenersForEvent) do
- if handle == handleToRemove then
- listenersForEvent[handle] = nil
- if DEBUG > 1 then
- printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName)
- end
- return self.target_
- end
- end
- end
- return self.target_
- end
- function Event:removeEventListenersByTag(tagToRemove)
- for eventName, listenersForEvent in pairs(self.listeners_) do
- for handle, listener in pairs(listenersForEvent) do
- -- listener[1] = listener
- -- listener[2] = tag
- if listener[2] == tagToRemove then
- listenersForEvent[handle] = nil
- if DEBUG > 1 then
- printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName)
- end
- end
- end
- end
- return self.target_
- end
- function Event:removeEventListenersByEvent(eventName)
- self.listeners_[string.upper(eventName)] = nil
- if DEBUG > 1 then
- printInfo("%s [Event] removeAllEventListenersForEvent() - remove all listeners for event %s", tostring(self.target_), eventName)
- end
- return self.target_
- end
- function Event:removeAllEventListeners()
- self.listeners_ = {}
- if DEBUG > 1 then
- printInfo("%s [Event] removeAllEventListeners() - remove all listeners", tostring(self.target_))
- end
- return self.target_
- end
- function Event:hasEventListener(eventName)
- eventName = string.upper(tostring(eventName))
- local t = self.listeners_[eventName]
- for _, __ in pairs(t) do
- return true
- end
- return false
- end
- function Event:dumpAllEventListeners()
- print("---- Event:dumpAllEventListeners() ----")
- for name, listeners in pairs(self.listeners_) do
- printf("-- event: %s", name)
- for handle, listener in pairs(listeners) do
- printf("-- listener: %s, handle: %s", tostring(listener[1]), tostring(handle))
- end
- end
- return self.target_
- end
- return Event
|