123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js">Ext.require('Ext.util.DelayedTask', function() {
- <span id='Ext-util-Event'> /**
- </span> * Represents single event type that an Observable object listens to.
- * All actual listeners are tracked inside here. When the event fires,
- * it calls all the registered listener functions.
- *
- * @private
- */
- Ext.util.Event = Ext.extend(Object, (function() {
- var noOptions = {};
- function createTargeted(handler, listener, o, scope){
- return function(){
- if (o.target === arguments[0]){
- handler.apply(scope, arguments);
- }
- };
- }
- function createBuffered(handler, listener, o, scope) {
- listener.task = new Ext.util.DelayedTask();
- return function() {
- listener.task.delay(o.buffer, handler, scope, Ext.Array.toArray(arguments));
- };
- }
- function createDelayed(handler, listener, o, scope) {
- return function() {
- var task = new Ext.util.DelayedTask();
- if (!listener.tasks) {
- listener.tasks = [];
- }
- listener.tasks.push(task);
- task.delay(o.delay || 10, handler, scope, Ext.Array.toArray(arguments));
- };
- }
- function createSingle(handler, listener, o, scope) {
- return function() {
- var event = listener.ev;
- if (event.removeListener(listener.fn, scope) && event.observable) {
- // Removing from a regular Observable-owned, named event (not an anonymous
- // event such as Ext's readyEvent): Decrement the listeners count
- event.observable.hasListeners[event.name]--;
- }
- return handler.apply(scope, arguments);
- };
- }
- return {
- <span id='Ext-util-Event-property-isEvent'> /**
- </span> * @property {Boolean} isEvent
- * `true` in this class to identify an object as an instantiated Event, or subclass thereof.
- */
- isEvent: true,
- constructor: function(observable, name) {
- this.name = name;
- this.observable = observable;
- this.listeners = [];
- },
- addListener: function(fn, scope, options) {
- var me = this,
- listener;
- scope = scope || me.observable;
- //<debug error>
- if (!fn) {
- Ext.Error.raise({
- sourceClass: Ext.getClassName(this.observable),
- sourceMethod: "addListener",
- msg: "The specified callback function is undefined"
- });
- }
- //</debug>
- if (!me.isListening(fn, scope)) {
- listener = me.createListener(fn, scope, options);
- if (me.firing) {
- // if we are currently firing this event, don't disturb the listener loop
- me.listeners = me.listeners.slice(0);
- }
- me.listeners.push(listener);
- }
- },
- createListener: function(fn, scope, options) {
- options = options || noOptions;
- scope = scope || this.observable;
- var listener = {
- fn: fn,
- scope: scope,
- o: options,
- ev: this
- },
- handler = fn;
- // The order is important. The 'single' wrapper must be wrapped by the 'buffer' and 'delayed' wrapper
- // because the event removal that the single listener does destroys the listener's DelayedTask(s)
- if (options.single) {
- handler = createSingle(handler, listener, options, scope);
- }
- if (options.target) {
- handler = createTargeted(handler, listener, options, scope);
- }
- if (options.delay) {
- handler = createDelayed(handler, listener, options, scope);
- }
- if (options.buffer) {
- handler = createBuffered(handler, listener, options, scope);
- }
- listener.fireFn = handler;
- return listener;
- },
- findListener: function(fn, scope) {
- var listeners = this.listeners,
- i = listeners.length,
- listener,
- s;
- while (i--) {
- listener = listeners[i];
- if (listener) {
- s = listener.scope;
- // Compare the listener's scope with *JUST THE PASSED SCOPE* if one is passed, and only fall back to the owning Observable if none is passed.
- // We cannot use the test (s == scope || s == this.observable)
- // Otherwise, if the Observable itself adds Ext.emptyFn as a listener, and then Ext.emptyFn is added under another scope, there will be a false match.
- if (listener.fn == fn && (s == (scope || this.observable))) {
- return i;
- }
- }
- }
- return - 1;
- },
- isListening: function(fn, scope) {
- return this.findListener(fn, scope) !== -1;
- },
- removeListener: function(fn, scope) {
- var me = this,
- index,
- listener,
- k;
- index = me.findListener(fn, scope);
- if (index != -1) {
- listener = me.listeners[index];
- if (me.firing) {
- me.listeners = me.listeners.slice(0);
- }
- // cancel and remove a buffered handler that hasn't fired yet
- if (listener.task) {
- listener.task.cancel();
- delete listener.task;
- }
- // cancel and remove all delayed handlers that haven't fired yet
- k = listener.tasks && listener.tasks.length;
- if (k) {
- while (k--) {
- listener.tasks[k].cancel();
- }
- delete listener.tasks;
- }
- // remove this listener from the listeners array
- Ext.Array.erase(me.listeners, index, 1);
- return true;
- }
- return false;
- },
- // Iterate to stop any buffered/delayed events
- clearListeners: function() {
- var listeners = this.listeners,
- i = listeners.length;
- while (i--) {
- this.removeListener(listeners[i].fn, listeners[i].scope);
- }
- },
- fire: function() {
- var me = this,
- listeners = me.listeners,
- count = listeners.length,
- i,
- args,
- listener;
- if (count > 0) {
- me.firing = true;
- for (i = 0; i < count; i++) {
- listener = listeners[i];
- args = arguments.length ? Array.prototype.slice.call(arguments, 0) : [];
- if (listener.o) {
- args.push(listener.o);
- }
- if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) {
- return (me.firing = false);
- }
- }
- }
- me.firing = false;
- return true;
- }
- };
- }()));
- });
- </pre>
- </body>
- </html>
|