UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

180 lines (153 loc) 5.02 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2006 STZ-IDA, Germany, http://www.stz-ida.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Til Schneider (til132) * Carsten Lergenmueller (carstenl) * Jonathan Weiß (jonathan_rass) ************************************************************************ */ /** * Abstract base class for image cell renderer. */ qx.Class.define("qx.ui.virtual.cell.AbstractImage", { extend: qx.ui.virtual.cell.Cell, type: "abstract", /* ***************************************************************************** CONSTRUCTOR ***************************************************************************** */ construct() { super(); this._aliasManager = qx.util.AliasManager.getInstance(); }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members: { __defaultWidth: 16, __defaultHeight: 16, _aliasManager: null, /** * Compute the size of the given image * * @param source {String} the image URL * @return {Map} A map containing the image's <code>width</code> and * <code>height</code> */ __getImageSize(source) { var ResourceManager = qx.util.ResourceManager.getInstance(); var ImageLoader = qx.io.ImageLoader; var width, height; // Detect if the image registry knows this image if (ResourceManager.has(source)) { width = ResourceManager.getImageWidth(source); height = ResourceManager.getImageHeight(source); } else if (ImageLoader.isLoaded(source)) { width = ImageLoader.getWidth(source); height = ImageLoader.getHeight(source); } else { width = this.__defaultWidth; height = this.__defaultHeight; } return { width: width, height: height }; }, /** * Compute image meta data * * @param imageData {Object|String} Either a string containing the image URL * or a map, which describes the image. Map keys: * <ul> * <li>url (required)</li> * <li>width</li> * <li>height</li> * <li>tooltip</li> * </ul> * @return {Object} A map describing the image. Map keys: * <ul> * <li>url</li> * <li>width</li> * <li>height</li> * <li>tooltip (optional)</li> * </ul> */ __createImage(imageData) { if (typeof imageData == "string") { imageData = { url: imageData }; } var url = this._aliasManager.resolve(imageData.url || null); var sizes; if (imageData.width && imageData.height) { sizes = { width: imageData.width, height: imageData.height }; } else { sizes = this.__getImageSize(url); } return { width: sizes.width, height: sizes.height, url: url, tooltip: imageData.tooltip }; }, /** * Identifies the Image to show. This is a template method, which must be * implements by sub classes. * * @abstract * @param value {var} The cell's data value * @return {Map} A map having the following attributes: * <ul> * <li>"url": (type string) must be the URL of the image to show.</li> * <li>"width": (type int) the width of the image in pixels.</li> * <li>"height": (type int) the height of the image in pixels.</li> * <li>"tooltip": (type string) must be the image tooltip text.</li> * </ul> */ _identifyImage(value) { throw new Error("_identifyImage is abstract"); }, // overridden getContent(value, states) { if (value === null) { return ""; } var content = ""; var imageData = this.__createImage(this._identifyImage(value)); var tooltip = imageData.tooltip ? 'title="' + imageData.tooltip + '"' : ""; var styles = { width: imageData.width + "px", height: imageData.height + "px", display: "inline-block", verticalAlign: "top", position: "static" }; var tag = qx.bom.element.Decoration.getTagName( "no-repeat", imageData.url ); var ret = qx.bom.element.Decoration.getAttributes( imageData.url, "no-repeat", styles ); var css = qx.bom.element.Style.compile(ret.style); if (tag === "img") { content = '<img src="' + ret.src + '" style="' + css + '" '; content += tooltip + "/>"; } else { content = '<div style="' + css + '" '; content += tooltip + "></div>"; } return content; } } });