3 This file is part of Ext JS 4
5 Copyright (c) 2011 Sencha Inc
7 Contact: http://www.sencha.com/contact
9 GNU General Public License Usage
10 This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
12 If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
15 Ext.require('Ext.util.DelayedTask', function() {
17 Ext.util.Event = Ext.extend(Object, (function() {
18 function createBuffered(handler, listener, o, scope) {
19 listener.task = new Ext.util.DelayedTask();
21 listener.task.delay(o.buffer, handler, scope, Ext.Array.toArray(arguments));
25 function createDelayed(handler, listener, o, scope) {
27 var task = new Ext.util.DelayedTask();
28 if (!listener.tasks) {
31 listener.tasks.push(task);
32 task.delay(o.delay || 10, handler, scope, Ext.Array.toArray(arguments));
36 function createSingle(handler, listener, o, scope) {
38 listener.ev.removeListener(listener.fn, scope);
39 return handler.apply(scope, arguments);
46 constructor: function(observable, name) {
48 this.observable = observable;
52 addListener: function(fn, scope, options) {
55 scope = scope || me.observable;
60 sourceClass: Ext.getClassName(this.observable),
61 sourceMethod: "addListener",
62 msg: "The specified callback function is undefined"
67 if (!me.isListening(fn, scope)) {
68 listener = me.createListener(fn, scope, options);
70 // if we are currently firing this event, don't disturb the listener loop
71 me.listeners = me.listeners.slice(0);
73 me.listeners.push(listener);
77 createListener: function(fn, scope, o) {
79 scope = scope || this.observable;
89 // The order is important. The 'single' wrapper must be wrapped by the 'buffer' and 'delayed' wrapper
90 // because the event removal that the single listener does destroys the listener's DelayedTask(s)
92 handler = createSingle(handler, listener, o, scope);
95 handler = createDelayed(handler, listener, o, scope);
98 handler = createBuffered(handler, listener, o, scope);
101 listener.fireFn = handler;
105 findListener: function(fn, scope) {
106 var listeners = this.listeners,
107 i = listeners.length,
112 listener = listeners[i];
115 if (listener.fn == fn && (s == scope || s == this.observable)) {
124 isListening: function(fn, scope) {
125 return this.findListener(fn, scope) !== -1;
128 removeListener: function(fn, scope) {
133 index = me.findListener(fn, scope);
135 listener = me.listeners[index];
138 me.listeners = me.listeners.slice(0);
141 // cancel and remove a buffered handler that hasn't fired yet
143 listener.task.cancel();
144 delete listener.task;
147 // cancel and remove all delayed handlers that haven't fired yet
148 k = listener.tasks && listener.tasks.length;
151 listener.tasks[k].cancel();
153 delete listener.tasks;
156 // remove this listener from the listeners array
157 Ext.Array.erase(me.listeners, index, 1);
164 // Iterate to stop any buffered/delayed events
165 clearListeners: function() {
166 var listeners = this.listeners,
167 i = listeners.length;
170 this.removeListener(listeners[i].fn, listeners[i].scope);
176 listeners = me.listeners,
177 count = listeners.length,
184 for (i = 0; i < count; i++) {
185 listener = listeners[i];
186 args = arguments.length ? Array.prototype.slice.call(arguments, 0) : [];
188 args.push(listener.o);
190 if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) {
191 return (me.firing = false);