diff options
Diffstat (limited to 'webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/core/Target.js')
-rw-r--r-- | webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/core/Target.js | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/core/Target.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/core/Target.js new file mode 100644 index 0000000000..891ac44426 --- /dev/null +++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/core/Target.js @@ -0,0 +1,299 @@ +/* ************************************************************************ + + qooxdoo - the new era of web development + + http://qooxdoo.org + + Copyright: + 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org + + License: + LGPL 2.1: http://www.gnu.org/licenses/lgpl.html + + Authors: + * Sebastian Werner (wpbasti) + * Andreas Ecker (ecker) + +************************************************************************ */ + +/* ************************************************************************ + +#module(core) + +************************************************************************ */ + +/** + * This is the main constructor for all objects that need to be connected to qx.event.type.Event objects. + * + * In objects created with this constructor, you find functions to addEventListener or + * removeEventListener to or from the created object. Each event to connect to has a type in + * form of an identification string. This type could be the name of a regular dom event like "click" or + * something self-defined like "ready". + * + * @param vAutoDispose {boolean ? true} wether the object should be disposed automatically by qooxdoo + */ +qx.OO.defineClass("qx.core.Target", qx.core.Object, +function(vAutoDispose) { + qx.core.Object.call(this, vAutoDispose); +}); + +/** + * @private + */ +qx.Class.EVENTPREFIX = "evt"; + + + + +/* +--------------------------------------------------------------------------- + EVENT CONNECTION +--------------------------------------------------------------------------- +*/ + +/** + * Add event listener to an object. + * + * @param vType {string} name of the event type + * @param vFunction {Function} event callback function + * @param vObject {object ? window} reference to the 'this' variable inside the callback + */ +qx.Proto.addEventListener = function(vType, vFunction, vObject) +{ + if(this._disposed) { + return; + } + + if(typeof vFunction !== "function") { + throw new Error("qx.core.Target: addEventListener(" + vType + "): '" + vFunction + "' is not a function!"); + } + + // If this is the first event of given type, we need to create a subobject + // that contains all the actions that will be assigned to this type + if (typeof this._listeners === "undefined") + { + this._listeners = {}; + this._listeners[vType] = {}; + } + else if(typeof this._listeners[vType] === "undefined") + { + this._listeners[vType] = {}; + } + + // Create a special vKey string to allow identification of each bound action + var vKey = qx.core.Target.EVENTPREFIX + qx.core.Object.toHashCode(vFunction) + (vObject ? "_" + qx.core.Object.toHashCode(vObject) : ""); + + // Finally set up the listeners object + this._listeners[vType][vKey] = + { + handler : vFunction, + object : vObject + } +} + + +/** + * Remove event listener from object + * + * @param vType {string} name of the event type + * @param vFunction {Function} event callback function + * @param vObject {object ? window} reference to the 'this' variable inside the callback + */ +qx.Proto.removeEventListener = function(vType, vFunction, vObject) +{ + if(this._disposed) { + return; + } + + var vListeners = this._listeners; + if (!vListeners || typeof vListeners[vType] === "undefined") { + return; + } + + if(typeof vFunction !== "function") { + throw new Error("qx.core.Target: removeEventListener(" + vType + "): '" + vFunction + "' is not a function!"); + } + + // Create a special vKey string to allow identification of each bound action + var vKey = qx.core.Target.EVENTPREFIX + qx.core.Object.toHashCode(vFunction) + (vObject ? "_" + qx.core.Object.toHashCode(vObject) : ""); + + // Delete object entry for this action + delete this._listeners[vType][vKey]; +} + + + +/* +--------------------------------------------------------------------------- + EVENT CONNECTION UTILITIES +--------------------------------------------------------------------------- +*/ + +/** + * Check if there are one or more listeners for an event type. + * + * @param vType {string} name of the event type + */ +qx.Proto.hasEventListeners = function(vType) { + return this._listeners && typeof this._listeners[vType] !== "undefined" && !qx.lang.Object.isEmpty(this._listeners[vType]); +} + + +/** + * Checks if the event is registered. If so it creates an event object and dispatches it. + * + * @param vType {string} name of the event type + */ +qx.Proto.createDispatchEvent = function(vType) +{ + if (this.hasEventListeners(vType)) { + this.dispatchEvent(new qx.event.type.Event(vType), true); + } +} + + +/** + * Checks if the event is registered. If so it creates an event object and dispatches it. + * + * @param vType {string} name of the event type + * @param vData {Object} user defined data attached to the event object + */ +qx.Proto.createDispatchDataEvent = function(vType, vData) +{ + if (this.hasEventListeners(vType)) { + this.dispatchEvent(new qx.event.type.DataEvent(vType, vData), true); + } +} + + + +/* +--------------------------------------------------------------------------- + EVENT DISPATCH +--------------------------------------------------------------------------- +*/ + +/** + * Dispatch an event + * + * @param vEvent {qx.event.type.Event} event to dispatch + * @param vEnableDispose {boolean} wether the event object should be disposed after all event handlers run. + * @return {boolean} wether the event default was prevented or not. Returns true, when the event was NOT prevented. + */ +qx.Proto.dispatchEvent = function(vEvent, vEnableDispose) +{ + // Ignore event if eventTarget is disposed + if(this.getDisposed() && this.getEnabled()) { + return; + } + + if (vEvent.getTarget() == null) { + vEvent.setTarget(this); + } + + if (vEvent.getCurrentTarget() == null) { + vEvent.setCurrentTarget(this); + } + + // Dispatch Event + this._dispatchEvent(vEvent, vEnableDispose); + + // Read default prevented + var defaultPrevented = vEvent._defaultPrevented; + + // enable dispose for event? + vEnableDispose && vEvent.dispose(); + + return !defaultPrevented; +} + + +/** + * Internal event dispatch method + * + * @param vEvent {qx.event.type.Event} event to dispatch + */ +qx.Proto._dispatchEvent = function(vEvent) +{ + var vListeners = this._listeners; + if (vListeners) + { + // Setup current target + vEvent.setCurrentTarget(this); + + // Shortcut for listener data + var vTypeListeners = vListeners[vEvent.getType()]; + + if(vTypeListeners) + { + var vFunction, vObject; + + // Handle all events for the specified type + for (var vHashCode in vTypeListeners) + { + // Shortcuts for handler and object + vFunction = vTypeListeners[vHashCode].handler; + vObject = vTypeListeners[vHashCode].object; + + // Call object function + try + { + if(typeof vFunction === "function") { + vFunction.call(qx.util.Validation.isValid(vObject) ? vObject : this, vEvent); + } + } + catch(ex) + { + this.error("Could not dispatch event of type \"" + vEvent.getType() + "\"", ex); + } + } + } + } + + // Bubble event to parents + // TODO: Move this to Parent or Widget? + if(vEvent.getBubbles() && !vEvent.getPropagationStopped() && this.getParent) + { + var vParent = this.getParent(); + if (vParent && !vParent.getDisposed() && vParent.getEnabled()) { + vParent._dispatchEvent(vEvent); + } + } +} + + + + +/* +--------------------------------------------------------------------------- + DISPOSER +--------------------------------------------------------------------------- +*/ + +/** + * Destructor. + */ +qx.Proto.dispose = function() +{ + if(this.getDisposed()) { + return; + } + + if (typeof this._listeners === "object") + { + for (var vType in this._listeners) + { + var listener = this._listeners[vType]; + for (var vKey in listener) + { + listener[vKey] = null; + } + + this._listeners[vType] = null; + } + } + + this._listeners = null; + + return qx.core.Object.prototype.dispose.call(this); +} |