este-library-oldschool
Version:
Library for github.com/steida/este.git
187 lines (177 loc) • 5.56 kB
JavaScript
// Generated by github.com/steida/coffee2closure 900.1.18
/**
@fileoverview Powerfull event delegation for este.ui.Component.
@see este.ui.Component
*/
var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.superClass_ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
goog.provide('este.events.EventHandler');
goog.require('este.events.GestureHandler');
goog.require('este.events.SubmitHandler');
goog.require('goog.dom');
goog.require('goog.events.EventHandler');
goog.require('goog.events.FocusHandler');
goog.require('goog.events.InputHandler');
goog.require('goog.events.KeyHandler');
goog.require('goog.events.MouseWheelHandler');
/**
@param {Object=} opt_handler Object in whose scope to call the listeners.
@constructor
@extends {goog.events.EventHandler}
*/
este.events.EventHandler = function(opt_handler) {
este.events.EventHandler.superClass_.constructor.call(this, opt_handler);
}
extend(este.events.EventHandler, superClass);
/**
Global cache for synthetic event handlers. Useful for example when twelve
components use tap event on the same element, GestureHandler is created
only once.
@type {Object}
@private
*/
este.events.EventHandler.handlers = {};
/**
Return event handler for concrete src and type.
@param {goog.events.ListenableType} src
@param {string} type
@return {Function}
@private
*/
este.events.EventHandler.getHandlerClass = function(src, type) {
if (!goog.dom.isElement(src)) {
return null;
}
switch (type) {
case 'tap':
case 'swipeleft':
case 'swiperight':
case 'swipeup':
case 'swipedown':
return este.events.GestureHandler;
case 'submit':
return este.events.SubmitHandler;
case 'focusin':
case 'focusout':
return goog.events.FocusHandler;
case 'input':
return goog.events.InputHandler;
case 'key':
return goog.events.KeyHandler;
case 'mousewheel':
return goog.events.MouseWheelHandler;
default:
return null;
}
};
/**
@param {goog.events.ListenableType} src
@param {Function} handlerClass
@return {goog.events.ListenableType}
@private
*/
este.events.EventHandler.lazyCreateHandler = function(src, handlerClass) {
var base, key;
key = este.events.EventHandler.getKey(src, handlerClass);
if ((base = este.events.EventHandler.handlers)[key] == null) {
base[key] = new handlerClass(src);
}
return este.events.EventHandler.handlers[key];
};
/**
@param {goog.events.ListenableType} src
@param {Function} handlerClass
@return {goog.events.ListenableType}
@private
*/
este.events.EventHandler.getHandler = function(src, handlerClass) {
var key;
key = este.events.EventHandler.getKey(src, handlerClass);
return este.events.EventHandler.handlers[key];
};
/**
@param {goog.events.ListenableType} src
@param {Function} handlerClass
*/
este.events.EventHandler.removeHandler = function(src, handlerClass) {
var handler, key;
key = este.events.EventHandler.getKey(src, handlerClass);
handler = este.events.EventHandler.handlers[key];
delete este.events.EventHandler.handlers[key];
if (!handler) {
return;
}
return handler.dispose();
};
este.events.EventHandler.removeHandlersWithoutListeners = function() {
return este.events.EventHandler.handlers = goog.object.filter(este.events.EventHandler.handlers, function(v, k) {
if (v.hasListener()) {
return true;
}
v.dispose();
return false;
});
};
/**
@param {goog.events.ListenableType} src
@param {Function} handlerClass
@return {string}
@private
*/
este.events.EventHandler.getKey = function(src, handlerClass) {
return [goog.getUid(src), goog.getUid(handlerClass)].toString();
};
/**
@override
*/
este.events.EventHandler.prototype.listen = function(src, type, opt_fn, opt_capture) {
var handlerClass, i, len, t;
if (goog.isArray(type)) {
for (i = 0, len = type.length; i < len; i++) {
t = type[i];
this.listen(src, t, opt_fn, opt_capture);
}
return this;
}
type = /** @type {string} */(type);
handlerClass = este.events.EventHandler.getHandlerClass(src, type);
if (handlerClass) {
src = este.events.EventHandler.lazyCreateHandler(src, handlerClass);
}
return este.events.EventHandler.superClass_.listen.call(this, src, type, opt_fn, opt_capture);
};
/**
@override
*/
este.events.EventHandler.prototype.unlisten = function(src, type, opt_fn, opt_capture) {
var handlerClass, i, len, originalSrc, t;
if (goog.isArray(type)) {
for (i = 0, len = type.length; i < len; i++) {
t = type[i];
this.listen(src, t, opt_fn, opt_capture);
}
return this;
}
type = /** @type {string} */(type);
handlerClass = este.events.EventHandler.getHandlerClass(src, type);
originalSrc = null;
if (handlerClass) {
originalSrc = src;
src = este.events.EventHandler.getHandler(src, handlerClass);
if (!src) {
return this;
}
}
este.events.EventHandler.superClass_.unlisten.call(this, src, type, opt_fn, opt_capture);
if (handlerClass && !src.hasListener()) {
este.events.EventHandler.removeHandler(originalSrc, handlerClass);
}
return this;
};
/**
@override
*/
este.events.EventHandler.prototype.removeAll = function() {
este.events.EventHandler.superClass_.removeAll.call(this);
este.events.EventHandler.removeHandlersWithoutListeners();
};