@qooxdoo/framework
Version:
The JS Framework for Coders
269 lines (222 loc) • 6.84 kB
JavaScript
/* ************************************************************************
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;
}
});