UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

269 lines (222 loc) 6.84 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2009 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Fabian Jakobs (fjakobs) ************************************************************************ */ /** * EXPERIMENTAL! * * Abstract base class for layers of a virtual pane. * * This class queues calls to {@link #fullUpdate}, {@link #updateLayerWindow} * and {@link #updateLayerData} and only performs the absolute necessary * actions. Concrete implementation of this class must at least implement * the {@link #_fullUpdate} method. Additionally the two methods * {@link #_updateLayerWindow} and {@link #_updateLayerData} may be implemented * to increase the performance. */ qx.Class.define("qx.ui.virtual.layer.Abstract", { extend : qx.ui.core.Widget, type : "abstract", implement : [qx.ui.virtual.core.ILayer], /* ***************************************************************************** CONSTRUCTOR ***************************************************************************** */ construct : function() { this.base(arguments); this.__jobs = {}; }, /* ***************************************************************************** PROPERTIES ***************************************************************************** */ properties : { // overridden anonymous : { refine: true, init: true } }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { __jobs : null, __arguments : null, __firstRow : null, __firstColumn : null, __rowSizes : null, __columnSizes : null, /** * Get the first rendered row * * @return {Integer} The first rendered row */ getFirstRow : function() { return this.__firstRow; }, /** * Get the first rendered column * * @return {Integer} The first rendered column */ getFirstColumn : function() { return this.__firstColumn; }, /** * Get the sizes of the rendered rows * * @return {Integer[]} List of row heights */ getRowSizes : function() { return this.__rowSizes || []; }, /** * Get the sizes of the rendered column * * @return {Integer[]} List of column widths */ getColumnSizes : function() { return this.__columnSizes || []; }, // overridden syncWidget : function(jobs) { // return if the layer is not yet rendered // it will rendered in the appear event if (!this.getContentElement().getDomElement()) { return; } if ( this.__jobs.fullUpdate || this.__jobs.updateLayerWindow && this.__jobs.updateLayerData ) { this._fullUpdate.apply(this, this.__arguments); } else if (this.__jobs.updateLayerWindow) { this._updateLayerWindow.apply(this, this.__arguments); } else if (this.__jobs.updateLayerData && this.__rowSizes) { this._updateLayerData(); } if (this.__jobs.fullUpdate || this.__jobs.updateLayerWindow) { var args = this.__arguments; this.__firstRow = args[0]; this.__firstColumn = args[1]; this.__rowSizes = args[2]; this.__columnSizes = args[3]; } this.__jobs = {}; }, /** * Update the layer to reflect changes in the data the layer displays. * * Note: It is guaranteed that this method is only called after the layer * has been rendered. */ _updateLayerData : function() { this._fullUpdate( this.__firstRow, this.__firstColumn, this.__rowSizes, this.__columnSizes ); }, /** * Do a complete update of the layer. All cached data should be discarded. * This method is called e.g. after changes to the grid geometry * (row/column sizes, row/column count, ...). * * Note: It is guaranteed that this method is only called after the layer * has been rendered. * * @param firstRow {Integer} Index of the first row to display * @param firstColumn {Integer} Index of the first column to display * @param rowSizes {Integer[]} Array of heights for each row to display * @param columnSizes {Integer[]} Array of widths for each column to display */ _fullUpdate : function( firstRow, firstColumn, rowSizes, columnSizes ) { throw new Error("Abstract method '_fullUpdate' called!"); }, /** * Update the layer to display a different window of the virtual grid. * This method is called if the pane is scrolled, resized or cells * are prefetched. The implementation can assume that no other grid * data has been changed since the last "fullUpdate" of "updateLayerWindow" * call. * * Note: It is guaranteed that this method is only called after the layer * has been rendered. * * @param firstRow {Integer} Index of the first row to display * @param firstColumn {Integer} Index of the first column to display * @param rowSizes {Integer[]} Array of heights for each row to display * @param columnSizes {Integer[]} Array of widths for each column to display */ _updateLayerWindow : function( firstRow, firstColumn, rowSizes, columnSizes ) { this._fullUpdate( firstRow, firstColumn, rowSizes, columnSizes ); }, // interface implementation updateLayerData : function() { this.__jobs.updateLayerData = true; qx.ui.core.queue.Widget.add(this); }, // interface implementation fullUpdate : function( firstRow, firstColumn, rowSizes, columnSizes ) { this.__arguments = arguments; this.__jobs.fullUpdate = true; qx.ui.core.queue.Widget.add(this); }, // interface implementation updateLayerWindow : function( firstRow, firstColumn, rowSizes, columnSizes ) { this.__arguments = arguments; this.__jobs.updateLayerWindow = true; qx.ui.core.queue.Widget.add(this); } }, /* ***************************************************************************** DESTRUCTOR ***************************************************************************** */ destruct : function() { this.__jobs = this.__arguments = this.__rowSizes = this.__columnSizes = null; } });