// Copyright 2005 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Listener object.
* @see ../demos/events.html
*/
/**
* Namespace for events
*/
goog.provide('goog.events.Listener');
/**
* Simple class that stores information about a listener
* @constructor
*/
goog.events.Listener = function() {
};
/**
* Counter used to create a unique key
* @type {number}
* @private
*/
goog.events.Listener.counter_ = 0;
/**
* Whether the listener is a function or an object that implements handleEvent.
* @type {boolean}
* @private
*/
goog.events.Listener.prototype.isFunctionListener_;
/**
* Call back function or an object with a handleEvent function.
* @type {Function|Object|null}
*/
goog.events.Listener.prototype.listener;
/**
* Proxy for callback that passes through {@link goog.events#HandleEvent_}
* @type {Function}
*/
goog.events.Listener.prototype.proxy;
/**
* Object or node that callback is listening to
* @type {Object|goog.events.EventTarget}
*/
goog.events.Listener.prototype.src;
/**
* Type of event
* @type {string}
*/
goog.events.Listener.prototype.type;
/**
* Whether the listener is being called in the capture or bubble phase
* @type {boolean}
*/
goog.events.Listener.prototype.capture;
/**
* Optional object whose context to execute the listener in
* @type {Object|undefined}
*/
goog.events.Listener.prototype.handler;
/**
* The key of the listener.
* @type {number}
*/
goog.events.Listener.prototype.key = 0;
/**
* Whether the listener has been removed.
* @type {boolean}
*/
goog.events.Listener.prototype.removed = false;
/**
* Whether to remove the listener after it has been called.
* @type {boolean}
*/
goog.events.Listener.prototype.callOnce = false;
/**
* Initializes the listener.
* @param {Function|Object} listener Callback function, or an object with a
* handleEvent function.
* @param {Function} proxy Wrapper for the listener that patches the event.
* @param {Object} src Source object for the event.
* @param {string} type Event type.
* @param {boolean} capture Whether in capture or bubble phase.
* @param {Object=} opt_handler Object in whose context to execute the callback.
*/
goog.events.Listener.prototype.init = function(listener, proxy, src, type,
capture, opt_handler) {
// we do the test of the listener here so that we do not need to
// continiously do this inside handleEvent
if (goog.isFunction(listener)) {
this.isFunctionListener_ = true;
} else if (listener && listener.handleEvent &&
goog.isFunction(listener.handleEvent)) {
this.isFunctionListener_ = false;
} else {
throw Error('Invalid listener argument');
}
this.listener = listener;
this.proxy = proxy;
this.src = src;
this.type = type;
this.capture = !!capture;
this.handler = opt_handler;
this.callOnce = false;
this.key = ++goog.events.Listener.counter_;
this.removed = false;
};
/**
* Calls the internal listener
* @param {Object} eventObject Event object to be passed to listener.
* @return {boolean} The result of the internal listener call.
*/
goog.events.Listener.prototype.handleEvent = function(eventObject) {
if (this.isFunctionListener_) {
return this.listener.call(this.handler || this.src, eventObject);
}
return this.listener.handleEvent.call(this.listener, eventObject);
};