diff options
Diffstat (limited to 'webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/io/image/Preloader.js')
-rw-r--r-- | webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/io/image/Preloader.js | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/io/image/Preloader.js b/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/io/image/Preloader.js new file mode 100644 index 0000000000..1a3a450fca --- /dev/null +++ b/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/io/image/Preloader.js @@ -0,0 +1,199 @@ +/* ************************************************************************ + + qooxdoo - the new era of web development + + http://qooxdoo.org + + Copyright: + 2004-2007 1&1 Internet AG, Germany, http://www.1and1.org + + License: + LGPL: http://www.gnu.org/licenses/lgpl.html + EPL: http://www.eclipse.org/org/documents/epl-v10.php + See the LICENSE file in the project's top-level directory for details. + + Authors: + * Sebastian Werner (wpbasti) + * Andreas Ecker (ecker) + +************************************************************************ */ + +/* ************************************************************************ + +#module(ui_core) + +************************************************************************ */ + +/** + * This is the preloader used from qx.ui.basic.Image instances. + * + * @event load {qx.event.type.Event} + * @event error {qx.event.type.Event} + */ +qx.OO.defineClass("qx.io.image.Preloader", qx.core.Target, +function(vSource) +{ + if(qx.manager.object.ImagePreloaderManager.getInstance().has(vSource)) + { + this.debug("Reuse qx.io.image.Preloader in old-style!"); + this.debug("Please use qx.manager.object.ImagePreloaderManager.getInstance().create(source) instead!"); + + return qx.manager.object.ImagePreloaderManager.getInstance().get(vSource); + } + + qx.core.Target.call(this); + + // Create Image-Node + // Does not work with document.createElement("img") in Webkit. Interesting. + // Compare this to the bug in qx.ui.basic.Image. + this._element = new Image; + + // This is needed for wrapping event to the object + this._element.qx_ImagePreloader = this; + + // Define handler if image events occurs + if (qx.core.Client.getInstance().isWebkit()) + { + // Webkit as of version 41xxx + // does not get the target right. We need to help out a bit + // ugly closure! + var self = this; + this._element.onload = function(e) { + return self._onload(e); + }; + this._element.onerror = function(e) { + return self._onerror(e); + }; + } + else + { + this._element.onload = qx.io.image.Preloader.__onload; + this._element.onerror = qx.io.image.Preloader.__onerror; + } + + // Set Source + this._source = vSource; + this._element.src = vSource; + + // Set PNG State + if (qx.core.Client.getInstance().isMshtml()) { + this._isPng = /\.png$/i.test(this._element.nameProp); + } + + qx.manager.object.ImagePreloaderManager.getInstance().add(this); +}); + + + + +/* +--------------------------------------------------------------------------- + STATE MANAGERS +--------------------------------------------------------------------------- +*/ + +qx.Proto._source = null; +qx.Proto._isLoaded = false; +qx.Proto._isErroneous = false; + + + + + +/* +--------------------------------------------------------------------------- + CROSSBROWSER GETTERS +--------------------------------------------------------------------------- +*/ + +qx.Proto.getUri = function() { return this._source; }; +qx.Proto.getSource = function() { return this._source; }; +qx.Proto.isLoaded = function() { return this._isLoaded; }; +qx.Proto.isErroneous = function() { return this._isErroneous; }; + +// only used in mshtml: true when the image format is in png +qx.Proto._isPng = false; +qx.Proto.getIsPng = function() { return this._isPng; }; + +if(qx.core.Client.getInstance().isGecko()) +{ + qx.Proto.getWidth = function() { return this._element.naturalWidth; }; + qx.Proto.getHeight = function() { return this._element.naturalHeight; }; +} +else +{ + qx.Proto.getWidth = function() { return this._element.width; }; + qx.Proto.getHeight = function() { return this._element.height; }; +} + + + + + +/* +--------------------------------------------------------------------------- + EVENT MAPPING +--------------------------------------------------------------------------- +*/ + +qx.io.image.Preloader.__onload = function(e) { this.qx_ImagePreloader._onload(); }; +qx.io.image.Preloader.__onerror = function(e) { this.qx_ImagePreloader._onerror(); }; + +qx.Proto._onload = function() +{ + if (this._isLoaded || this._isErroneous) { + return; + } + + this._isLoaded = true; + this._isErroneous = false; + + if (this.hasEventListeners("load")) { + this.dispatchEvent(new qx.event.type.Event("load"), true); + } +} + +qx.Proto._onerror = function() +{ + if (this._isLoaded || this._isErroneous) { + return; + } + + this.debug("Could not load: " + this._source); + + this._isLoaded = false; + this._isErroneous = true; + + if (this.hasEventListeners("error")) { + this.dispatchEvent(new qx.event.type.Event("error"), true); + } +} + + + + + + +/* +--------------------------------------------------------------------------- + DISPOSER +--------------------------------------------------------------------------- +*/ + +qx.Proto.dispose = function() +{ + if(this.getDisposed()) { + return; + } + + if (this._element) + { + this._element.onload = this._element.onerror = null; + this._element.qx_ImagePreloader = null; + this._element = null; + } + + this._isLoaded = this._isErroneous = this._isPng = false; + + return qx.core.Target.prototype.dispose.call(this); +} |