Zerotorescue@0: --- AceEvent-3.0 provides event registration and secure dispatching. Zerotorescue@0: -- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around Zerotorescue@0: -- CallbackHandler, and dispatches all game events or addon message to the registrees. Zerotorescue@0: -- Zerotorescue@0: -- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by Zerotorescue@0: -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object Zerotorescue@0: -- and can be accessed directly, without having to explicitly call AceEvent itself.\\ Zerotorescue@0: -- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you Zerotorescue@0: -- make into AceEvent. Zerotorescue@0: -- @class file Zerotorescue@0: -- @name AceEvent-3.0 Zerotorescue@0: -- @release $Id: AceEvent-3.0.lua 877 2009-11-02 15:56:50Z nevcairiel $ Zerotorescue@0: local MAJOR, MINOR = "AceEvent-3.0", 3 Zerotorescue@0: local AceEvent = LibStub:NewLibrary(MAJOR, MINOR) Zerotorescue@0: Zerotorescue@0: if not AceEvent then return end Zerotorescue@0: Zerotorescue@0: -- Lua APIs Zerotorescue@0: local pairs = pairs Zerotorescue@0: Zerotorescue@0: local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") Zerotorescue@0: Zerotorescue@0: AceEvent.frame = AceEvent.frame or CreateFrame("Frame", "AceEvent30Frame") -- our event frame Zerotorescue@0: AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib Zerotorescue@0: Zerotorescue@0: -- APIs and registry for blizzard events, using CallbackHandler lib Zerotorescue@0: if not AceEvent.events then Zerotorescue@0: AceEvent.events = CallbackHandler:New(AceEvent, Zerotorescue@0: "RegisterEvent", "UnregisterEvent", "UnregisterAllEvents") Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function AceEvent.events:OnUsed(target, eventname) Zerotorescue@0: AceEvent.frame:RegisterEvent(eventname) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function AceEvent.events:OnUnused(target, eventname) Zerotorescue@0: AceEvent.frame:UnregisterEvent(eventname) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: Zerotorescue@0: -- APIs and registry for IPC messages, using CallbackHandler lib Zerotorescue@0: if not AceEvent.messages then Zerotorescue@0: AceEvent.messages = CallbackHandler:New(AceEvent, Zerotorescue@0: "RegisterMessage", "UnregisterMessage", "UnregisterAllMessages" Zerotorescue@0: ) Zerotorescue@0: AceEvent.SendMessage = AceEvent.messages.Fire Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: --- embedding and embed handling Zerotorescue@0: local mixins = { Zerotorescue@0: "RegisterEvent", "UnregisterEvent", Zerotorescue@0: "RegisterMessage", "UnregisterMessage", Zerotorescue@0: "SendMessage", Zerotorescue@0: "UnregisterAllEvents", "UnregisterAllMessages", Zerotorescue@0: } Zerotorescue@0: Zerotorescue@0: --- Register for a Blizzard Event. Zerotorescue@0: -- The callback will always be called with the event as the first argument, and if supplied, the `arg` as second argument. Zerotorescue@0: -- Any arguments to the event will be passed on after that. Zerotorescue@0: -- @name AceEvent:RegisterEvent Zerotorescue@0: -- @class function Zerotorescue@0: -- @paramsig event[, callback [, arg]] Zerotorescue@0: -- @param event The event to register for Zerotorescue@0: -- @param callback The callback function to call when the event is triggered (funcref or method, defaults to a method with the event name) Zerotorescue@0: -- @param arg An optional argument to pass to the callback function Zerotorescue@0: Zerotorescue@0: --- Unregister an event. Zerotorescue@0: -- @name AceEvent:UnregisterEvent Zerotorescue@0: -- @class function Zerotorescue@0: -- @paramsig event Zerotorescue@0: -- @param event The event to unregister Zerotorescue@0: Zerotorescue@0: --- Register for a custom AceEvent-internal message. Zerotorescue@0: -- The callback will always be called with the event as the first argument, and if supplied, the `arg` as second argument. Zerotorescue@0: -- Any arguments to the event will be passed on after that. Zerotorescue@0: -- @name AceEvent:RegisterMessage Zerotorescue@0: -- @class function Zerotorescue@0: -- @paramsig message[, callback [, arg]] Zerotorescue@0: -- @param message The message to register for Zerotorescue@0: -- @param callback The callback function to call when the message is triggered (funcref or method, defaults to a method with the event name) Zerotorescue@0: -- @param arg An optional argument to pass to the callback function Zerotorescue@0: Zerotorescue@0: --- Unregister a message Zerotorescue@0: -- @name AceEvent:UnregisterMessage Zerotorescue@0: -- @class function Zerotorescue@0: -- @paramsig message Zerotorescue@0: -- @param message The message to unregister Zerotorescue@0: Zerotorescue@0: --- Send a message over the AceEvent-3.0 internal message system to other addons registered for this message. Zerotorescue@0: -- @name AceEvent:SendMessage Zerotorescue@0: -- @class function Zerotorescue@0: -- @paramsig message, ... Zerotorescue@0: -- @param message The message to send Zerotorescue@0: -- @param ... Any arguments to the message Zerotorescue@0: Zerotorescue@0: Zerotorescue@0: -- Embeds AceEvent into the target object making the functions from the mixins list available on target:.. Zerotorescue@0: -- @param target target object to embed AceEvent in Zerotorescue@0: function AceEvent:Embed(target) Zerotorescue@0: for k, v in pairs(mixins) do Zerotorescue@0: target[v] = self[v] Zerotorescue@0: end Zerotorescue@0: self.embeds[target] = true Zerotorescue@0: return target Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- AceEvent:OnEmbedDisable( target ) Zerotorescue@0: -- target (object) - target object that is being disabled Zerotorescue@0: -- Zerotorescue@0: -- Unregister all events messages etc when the target disables. Zerotorescue@0: -- this method should be called by the target manually or by an addon framework Zerotorescue@0: function AceEvent:OnEmbedDisable(target) Zerotorescue@0: target:UnregisterAllEvents() Zerotorescue@0: target:UnregisterAllMessages() Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Script to fire blizzard events into the event listeners Zerotorescue@0: local events = AceEvent.events Zerotorescue@0: AceEvent.frame:SetScript("OnEvent", function(this, event, ...) Zerotorescue@0: events:Fire(event, ...) Zerotorescue@0: end) Zerotorescue@0: Zerotorescue@0: --- Finally: upgrade our old embeds Zerotorescue@0: for target, v in pairs(AceEvent.embeds) do Zerotorescue@0: AceEvent:Embed(target) Zerotorescue@0: end