@qooxdoo/framework
Version:
The JS Framework for Coders
146 lines (116 loc) • 3.29 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
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)
************************************************************************ */
/**
* Timer, which accelerates after each interval. The initial delay and the
* interval time can be set using the properties {@link #firstInterval}
* and {@link #interval}. The {@link #interval} events will be fired with
* decreasing interval times while the timer is running, until the {@link #minimum}
* is reached. The {@link #decrease} property sets the amount of milliseconds
* which will decreased after every firing.
*
* This class is e.g. used in the {@link qx.ui.form.RepeatButton} and
* {@link qx.ui.form.HoverButton} widgets.
*
* NOTE: Instances of this class must be disposed of after use
*
*/
qx.Class.define("qx.event.AcceleratingTimer",
{
extend : qx.core.Object,
implement : [ qx.core.IDisposable ],
construct : function()
{
this.base(arguments);
this.__timer = new qx.event.Timer(this.getInterval());
this.__timer.addListener("interval", this._onInterval, this);
},
events :
{
/** This event if fired each time the interval time has elapsed */
"interval" : "qx.event.type.Event"
},
properties :
{
/**
* Interval used after the first run of the timer. Usually a smaller value
* than the "firstInterval" property value to get a faster reaction.
*/
interval :
{
check : "Integer",
init : 100
},
/**
* Interval used for the first run of the timer. Usually a greater value
* than the "interval" property value to a little delayed reaction at the first
* time.
*/
firstInterval :
{
check : "Integer",
init : 500
},
/** This configures the minimum value for the timer interval. */
minimum :
{
check : "Integer",
init : 20
},
/** Decrease of the timer on each interval (for the next interval) until minTimer reached. */
decrease :
{
check : "Integer",
init : 2
}
},
members :
{
__timer : null,
__currentInterval : null,
/**
* Reset and start the timer.
*/
start : function()
{
this.__timer.setInterval(this.getFirstInterval());
this.__timer.start();
},
/**
* Stop the timer
*/
stop : function()
{
this.__timer.stop();
this.__currentInterval = null;
},
/**
* Interval event handler
*/
_onInterval : function()
{
this.__timer.stop();
if (this.__currentInterval == null) {
this.__currentInterval = this.getInterval();
}
this.__currentInterval = Math.max(
this.getMinimum(),
this.__currentInterval - this.getDecrease()
);
this.__timer.setInterval(this.__currentInterval);
this.__timer.start();
this.fireEvent("interval");
}
},
destruct : function() {
this._disposeObjects("__timer");
}
});