/** * Abstract base class for event publishers * @private */Ext.define('Ext.event.publisher.Publisher', { isEventPublisher: true, $vetoClearingPrototypeOnDestroy: true, /** * @property {Array} handledEvents * An array of events that this publisher handles. */ handledEvents: [], statics: { /** * @property {Object} publishers * A map of all publisher singleton instances. Publishers register themselves * in this map as soon as they are constructed. */ publishers: {}, /** * @property publishersByEvent * A map of handled event names to the publisher that handles each event. * Provides a convenient way for looking up the publisher that handles any given * event, for example: * * // get the publisher that handles click: * var publisher = Ext.event.publisher.Publisher.publishersByEvent.click; */ publishersByEvent: {} }, constructor: function() { var me = this, type = me.type; /** * @property {Object} handles * @private * A map for conveniently checking if this publisher handles a given event */ me.handles = {}; //<debug> if (!type) { Ext.raise("Event publisher '" + me.$className + "' defined without a 'type' property."); } if (me.self.instance) { Ext.raise("Cannot create multiple instances of '" + me.$className + "'. " + "Use '" + me.$className + ".instance' to retrieve the singleton instance."); } //</debug> me.registerEvents(); Ext.event.publisher.Publisher.publishers[type] = me; }, /** * Registers all {@link #handledEvents} in the * {@link Ext.event.publisher.Publisher#publishersByEvent} map. * @param {String[]} [events] optional events to register instead of handledEvents. * @protected */ registerEvents: function(events) { var me = this, publishersByEvent = Ext.event.publisher.Publisher.publishersByEvent, handledEvents = events || me.handledEvents, ln = handledEvents.length, eventName, i; for (i = 0; i < ln; i++) { eventName = handledEvents[i]; me.handles[eventName] = 1; publishersByEvent[eventName] = me; } }, //<debug> subscribe: function() { Ext.raise("Ext.event.publisher.Publisher subclass '" + this.$className + '" has no subscribe method.'); }, unsubscribe: function() { Ext.raise("Ext.event.publisher.Publisher subclass '" + this.$className + '" has no unsubscribe method.'); }, //</debug> fire: function(element, eventName, args) { var event; if (element.hasListeners[eventName]) { event = element.events[eventName]; if (event) { event.fire.apply(event, args); } } }});