@qooxdoo/framework
Version:
The JS Framework for Coders
193 lines (169 loc) • 5.47 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2014 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:
* Martin Wittemann (martinwittemann)
************************************************************************ */
/**
* Util for mouse wheel normalization.
*/
qx.Bootstrap.define("qx.util.Wheel", {
statics: {
/**
* The maximal measured scroll wheel delta.
* @internal
*/
MAXSCROLL: null,
/**
* The minimal measured scroll wheel delta.
* @internal
*/
MINSCROLL: null,
/**
* The normalization factor for the speed calculation.
* @internal
*/
FACTOR: 1,
/**
* Is the Wheel actually a touchpad ?
* @internal
*/
IS_TOUCHPAD: false,
/**
* Get the amount the wheel has been scrolled
*
* @param domEvent {Event} The native wheel event.
* @param axis {String?} Optional parameter which defines the scroll axis.
* The value can either be <code>"x"</code> or <code>"y"</code>.
* @return {Integer} Scroll wheel movement for the given axis. If no axis
* is given, the y axis is used.
*/
getDelta: function (domEvent, axis) {
// default case
if (axis === undefined) {
// default case
var delta = 0;
if (domEvent.wheelDelta !== undefined) {
delta = -domEvent.wheelDelta;
} else if (domEvent.detail !== 0) {
delta = domEvent.detail;
} else if (domEvent.deltaY !== undefined) {
// use deltaY as default for firefox
delta = domEvent.deltaY;
}
return this.__normalize(delta);
}
// get the x scroll delta
if (axis === "x") {
var x = 0;
if (domEvent.wheelDelta !== undefined) {
if (domEvent.wheelDeltaX !== undefined) {
x = domEvent.wheelDeltaX ? this.__normalize(-domEvent.wheelDeltaX) : 0;
}
} else {
if (domEvent.axis && domEvent.axis == domEvent.HORIZONTAL_AXIS &&
(domEvent.detail !== undefined) && (domEvent.detail > 0)
) {
x = this.__normalize(domEvent.detail);
} else if (domEvent.deltaX !== undefined) {
x = this.__normalize(domEvent.deltaX);
}
}
return x;
}
// get the y scroll delta
if (axis === "y") {
var y = 0;
if (domEvent.wheelDelta !== undefined) {
if (domEvent.wheelDeltaY !== undefined) {
y = domEvent.wheelDeltaY ? this.__normalize(-domEvent.wheelDeltaY) : 0;
} else {
y = this.__normalize(-domEvent.wheelDelta);
}
} else {
if (!(domEvent.axis && domEvent.axis == domEvent.HORIZONTAL_AXIS) &&
(domEvent.detail !== undefined) && (domEvent.detail > 0)
) {
y = this.__normalize(domEvent.detail);
} else if (domEvent.deltaY !== undefined) {
y = this.__normalize(domEvent.deltaY);
}
}
return y;
}
// default case, return 0
return 0;
},
/**
* Normalizer for the mouse wheel data.
*
* @param delta {Number} The mouse delta.
* @return {Number} The normalized delta value
*/
__normalize: function (delta) {
if (qx.util.Wheel.IS_TOUCHPAD) {
// Reset normalization values that may be re-computed once a real mouse is plugged.
qx.util.Wheel.MINSCROLL = null;
qx.util.Wheel.MAXSCROLL = null;
qx.util.Wheel.FACTOR = 1;
return delta;
}
var absDelta = Math.abs(delta);
if (absDelta === 0) {
return 0;
}
// store the min value
if (
qx.util.Wheel.MINSCROLL == null ||
qx.util.Wheel.MINSCROLL > absDelta
) {
qx.util.Wheel.MINSCROLL = absDelta;
this.__recalculateMultiplicator();
}
// store the max value
if (
qx.util.Wheel.MAXSCROLL == null ||
qx.util.Wheel.MAXSCROLL < absDelta
) {
qx.util.Wheel.MAXSCROLL = absDelta;
this.__recalculateMultiplicator();
}
// special case for systems not speeding up
if (
qx.util.Wheel.MAXSCROLL === absDelta &&
qx.util.Wheel.MINSCROLL === absDelta
) {
return 2 * (delta / absDelta);
}
var range =
qx.util.Wheel.MAXSCROLL - qx.util.Wheel.MINSCROLL;
var ret = (delta / range) * Math.log(range) * qx.util.Wheel.FACTOR;
// return at least 1 or -1
return ret < 0 ? Math.min(ret, -1) : Math.max(ret, 1);
},
/**
* Recalculates the factor with which the calculated delta is normalized.
*/
__recalculateMultiplicator: function () {
var max = qx.util.Wheel.MAXSCROLL || 0;
var min = qx.util.Wheel.MINSCROLL || max;
if (max <= min) {
return;
}
var range = max - min;
var maxRet = (max / range) * Math.log(range);
if (maxRet == 0) {
maxRet = 1;
}
qx.util.Wheel.FACTOR = 6 / maxRet;
if (qx.core.Environment.get("qx.debug.touchpad.detection")) {
qx.log.Logger.debug(this, "FACTOR : " + qx.util.Wheel.FACTOR);
}
}
}
});