@qooxdoo/framework
Version:
The JS Framework for Coders
241 lines (202 loc) • 6.97 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)
************************************************************************ */
/**
* Behavior to support pre-rendering of invisible areas of a virtual scroller.
* If applied to a scroller it will start a timer and increase the rendered area
* of the scroller after a certain period of time. Subsequent scrolling will not
* have to render this pre-computed area again.
*
* EXPERIMENTAL!
*/
qx.Class.define("qx.ui.virtual.behavior.Prefetch",
{
extend : qx.core.Object,
/*
*****************************************************************************
CONSTRUCTOR
*****************************************************************************
*/
/**
* @param scroller {qx.ui.virtual.core.Scroller} The scroller to prefetch
* @param settings {Map} This map contains minimum and maximum pixels to
* prefetch near the view port.
* <ul>
* <li>minLeft: minimum pixels to prefetch left to the view port</li>
* <li>maxLeft: maximum pixels to prefetch left to the view port</li>
* <li>minRight: minimum pixels to prefetch right to the view port</li>
* <li>maxRight: maximum pixels to prefetch right to the view port</li>
* <li>minAbove: minimum pixels to prefetch above the view port</li>
* <li>maxAbove: maximum pixels to prefetch above the view port</li>
* <li>minBelow: minimum pixels to prefetch below the view port</li>
* <li>maxBelow: maximum pixels to prefetch below the view port</li>
* </ul>
*/
construct : function(scroller, settings)
{
if (qx.core.Environment.get("qx.debug"))
{
this.assertObject(settings);
this.assertPositiveInteger(settings.minLeft);
this.assertPositiveInteger(settings.maxLeft);
this.assertPositiveInteger(settings.minRight);
this.assertPositiveInteger(settings.maxRight);
this.assertPositiveInteger(settings.minAbove);
this.assertPositiveInteger(settings.maxAbove);
this.assertPositiveInteger(settings.minBelow);
this.assertPositiveInteger(settings.maxBelow);
}
this.base(arguments);
this.setPrefetchX(settings.minLeft, settings.maxLeft, settings.minRight, settings.maxRight);
this.setPrefetchY(settings.minAbove, settings.maxAbove, settings.minBelow, settings.maxBelow);
this.__timer = new qx.event.Timer(this.getInterval());
this.__timer.addListener("interval", this._onInterval, this);
if (scroller) {
this.setScroller(scroller);
}
},
/*
*****************************************************************************
PROPERTIES
*****************************************************************************
*/
properties :
{
/** @type {qx.ui.virtual.core.Scroller} The scroller to prefetch */
scroller :
{
check : "qx.ui.virtual.core.Scroller",
nullable : true,
init : null,
apply : "_applyScroller"
},
/** @type {Integer} Polling interval */
interval :
{
check : "Integer",
init : 200,
apply : "_applyInterval"
}
},
/*
*****************************************************************************
MEMBERS
*****************************************************************************
*/
members :
{
__prefetchX : null,
__prefetchY : null,
__timer : null,
__onScrollXId : null,
__onScrollYId : null,
/**
* Configure horizontal prefetching
*
* @param minLeft {Integer} minimum pixels to prefetch left to the view port
* @param maxLeft {Integer} maximum pixels to prefetch left to the view port
* @param minRight {Integer} minimum pixels to prefetch right to the view port
* @param maxRight {Integer} maximum pixels to prefetch right to the view port
*/
setPrefetchX : function(minLeft, maxLeft, minRight, maxRight) {
this.__prefetchX = [minLeft, maxLeft, minRight, maxRight];
},
/**
* Configure vertical prefetching
*
* @param minAbove {Integer} minimum pixels to prefetch above the view port
* @param maxAbove {Integer} maximum pixels to prefetch above the view port
* @param minBelow {Integer} minimum pixels to prefetch below the view port
* @param maxBelow {Integer} maximum pixels to prefetch below the view port
*/
setPrefetchY : function(minAbove, maxAbove, minBelow, maxBelow) {
this.__prefetchY = [minAbove, maxAbove, minBelow, maxBelow];
},
/**
* Update prefetching
*/
_onInterval : function()
{
var px = this.__prefetchX;
if (px[1] && px[3])
{
this.getScroller().getPane().prefetchX(px[0], px[1], px[2], px[3]);
qx.ui.core.queue.Manager.flush();
}
var py = this.__prefetchY;
if (py[1] && py[3])
{
this.getScroller().getPane().prefetchY(py[0], py[1], py[2], py[3]);
qx.ui.core.queue.Manager.flush();
}
},
// property apply
_applyScroller : function(value, old)
{
if (old)
{
if (this.__onScrollXId) {
old.getChildControl("scrollbar-x").removeListenerById(this.__onScrollXId);
}
if (this.__onScrollYId) {
old.getChildControl("scrollbar-y").removeListenerById(this.__onScrollYId);
}
}
if (value)
{
if (!value.getContentElement().getDomElement())
{
this.__timer.stop();
value.addListenerOnce("appear", this.__timer.start, this.__timer);
}
else
{
this.__timer.restart();
}
// if (value.hasChildControl("scrollbar-x"))
// {
this.__onScrollXId = value.getChildControl("scrollbar-x").addListener(
"scroll",
this.__timer.restart,
this.__timer
);
// }
// if (value.hasChildControl("scrollbar-y"))
// {
this.__onScrollYId = value.getChildControl("scrollbar-y").addListener(
"scroll",
this.__timer.restart,
this.__timer
);
// }
}
else
{
this.__timer.stop();
}
},
// property apply
_applyInterval : function(value, old) {
this.__timer.setInterval(value);
}
},
/*
*****************************************************************************
DESTRUCT
*****************************************************************************
*/
destruct : function()
{
this.setScroller(null);
this.__prefetchX = this.__prefetchY = null;
this._disposeObjects("__timer");
}
});