UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

228 lines (195 loc) 6.52 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) ************************************************************************ */ /** * 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() { super(); 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() { return this.__firstRow; }, /** * Get the first rendered column * * @return {Integer} The first rendered column */ getFirstColumn() { return this.__firstColumn; }, /** * Get the sizes of the rendered rows * * @return {Integer[]} List of row heights */ getRowSizes() { return this.__rowSizes || []; }, /** * Get the sizes of the rendered column * * @return {Integer[]} List of column widths */ getColumnSizes() { return this.__columnSizes || []; }, // overridden syncWidget(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() { 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(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(firstRow, firstColumn, rowSizes, columnSizes) { this._fullUpdate(firstRow, firstColumn, rowSizes, columnSizes); }, // interface implementation updateLayerData() { this.__jobs.updateLayerData = true; qx.ui.core.queue.Widget.add(this); }, // interface implementation fullUpdate(firstRow, firstColumn, rowSizes, columnSizes) { this.__arguments = arguments; this.__jobs.fullUpdate = true; qx.ui.core.queue.Widget.add(this); }, // interface implementation updateLayerWindow(firstRow, firstColumn, rowSizes, columnSizes) { this.__arguments = arguments; this.__jobs.updateLayerWindow = true; qx.ui.core.queue.Widget.add(this); } }, /* ***************************************************************************** DESTRUCTOR ***************************************************************************** */ destruct() { this.__jobs = this.__arguments = this.__rowSizes = this.__columnSizes = null; } });