1 Ext.require('Ext.util.DelayedTask', function() {
3 Ext.util.Event = Ext.extend(Object, (function() {
4 function createBuffered(handler, listener, o, scope) {
5 listener.task = new Ext.util.DelayedTask();
7 listener.task.delay(o.buffer, handler, scope, Ext.Array.toArray(arguments));
11 function createDelayed(handler, listener, o, scope) {
13 var task = new Ext.util.DelayedTask();
14 if (!listener.tasks) {
17 listener.tasks.push(task);
18 task.delay(o.delay || 10, handler, scope, Ext.Array.toArray(arguments));
22 function createSingle(handler, listener, o, scope) {
24 listener.ev.removeListener(listener.fn, scope);
25 return handler.apply(scope, arguments);
32 constructor: function(observable, name) {
34 this.observable = observable;
38 addListener: function(fn, scope, options) {
41 scope = scope || me.observable;
46 sourceClass: Ext.getClassName(this.observable),
47 sourceMethod: "addListener",
48 msg: "The specified callback function is undefined"
53 if (!me.isListening(fn, scope)) {
54 listener = me.createListener(fn, scope, options);
56 // if we are currently firing this event, don't disturb the listener loop
57 me.listeners = me.listeners.slice(0);
59 me.listeners.push(listener);
63 createListener: function(fn, scope, o) {
65 scope = scope || this.observable;
75 // The order is important. The 'single' wrapper must be wrapped by the 'buffer' and 'delayed' wrapper
76 // because the event removal that the single listener does destroys the listener's DelayedTask(s)
78 handler = createSingle(handler, listener, o, scope);
81 handler = createDelayed(handler, listener, o, scope);
84 handler = createBuffered(handler, listener, o, scope);
87 listener.fireFn = handler;
91 findListener: function(fn, scope) {
92 var listeners = this.listeners,
98 listener = listeners[i];
101 if (listener.fn == fn && (s == scope || s == this.observable)) {
110 isListening: function(fn, scope) {
111 return this.findListener(fn, scope) !== -1;
114 removeListener: function(fn, scope) {
119 index = me.findListener(fn, scope);
121 listener = me.listeners[index];
124 me.listeners = me.listeners.slice(0);
127 // cancel and remove a buffered handler that hasn't fired yet
129 listener.task.cancel();
130 delete listener.task;
133 // cancel and remove all delayed handlers that haven't fired yet
134 k = listener.tasks && listener.tasks.length;
137 listener.tasks[k].cancel();
139 delete listener.tasks;
142 // remove this listener from the listeners array
143 me.listeners.splice(index, 1);
150 // Iterate to stop any buffered/delayed events
151 clearListeners: function() {
152 var listeners = this.listeners,
153 i = listeners.length;
156 this.removeListener(listeners[i].fn, listeners[i].scope);
162 listeners = me.listeners,
163 count = listeners.length,
170 for (i = 0; i < count; i++) {
171 listener = listeners[i];
172 args = arguments.length ? Array.prototype.slice.call(arguments, 0) : [];
174 args.push(listener.o);
176 if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) {
177 return (me.firing = false);