@qooxdoo/framework
Version:
The JS Framework for Coders
142 lines (115 loc) • 2.82 kB
JavaScript
/**
* Abstract base class for widget based cell renderer.
*/
qx.Class.define("qx.ui.virtual.cell.AbstractWidget",
{
extend : qx.core.Object,
implement : [qx.ui.virtual.cell.IWidgetCell],
construct : function()
{
this.base(arguments);
this.__pool = [];
},
events :
{
/** Fired when a new <code>LayoutItem</code> is created. */
"created" : "qx.event.type.Data"
},
members :
{
__pool : null,
/**
* Creates the widget instance.
*
* @abstract
* @return {qx.ui.core.LayoutItem} The widget used to render a cell
*/
_createWidget : function() {
throw new Error("abstract method call");
},
// interface implementation
updateData : function(widget, data) {
throw new Error("abstract method call");
},
// interface implementation
updateStates : function(widget, states)
{
var oldStates = widget.getUserData("cell.states");
// remove old states
if (oldStates)
{
var newStates = states || {};
for (var state in oldStates)
{
if (!newStates[state]) {
widget.removeState(state);
}
}
}
else
{
oldStates = {};
}
// apply new states
if (states)
{
for (var state in states)
{
if (!oldStates.state) {
widget.addState(state);
}
}
}
widget.setUserData("cell.states", states);
},
// interface implementation
getCellWidget : function(data, states)
{
var widget = this.__getWidgetFromPool();
this.updateStates(widget, states);
this.updateData(widget, data);
return widget;
},
// interface implementation
pool : function(widget) {
this.__pool.push(widget);
},
/**
* Cleanup all <code>LayoutItem</code> and destroy them.
*/
_cleanupPool : function() {
var widget = this.__pool.pop();
while(widget)
{
widget.destroy();
widget = this.__pool.pop();
}
},
/**
* Returns a <code>LayoutItem</code> from the pool, when the pool is empty
* a new <code>LayoutItem</code> is created.
*
* @return {qx.ui.core.LayoutItem} The cell widget
*/
__getWidgetFromPool : function()
{
var widget = this.__pool.shift();
if (widget == null)
{
widget = this._createWidget();
this.fireDataEvent("created", widget);
}
return widget;
}
},
/*
*****************************************************************************
DESTRUCT
*****************************************************************************
*/
destruct : function()
{
this._cleanupPool();
this.__pool = null;
}
});