git-svn-id: http://svn.openlayers.org/trunk/openlayers@3767 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
159 lines
4.9 KiB
JavaScript
159 lines
4.9 KiB
JavaScript
/* Copyright (c) 2006 MetaCarta, Inc., published under a modified BSD license.
|
|
* See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
|
|
* for the full text of the license. */
|
|
|
|
/**
|
|
* @requires OpenLayers/Handler.js
|
|
*
|
|
* Class: OpenLayers.Handler.MouseWheel
|
|
* Handler for wheel up/down events.
|
|
*
|
|
* Inherits from:
|
|
* - <OpenLayers.Handler>
|
|
*/
|
|
OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, {
|
|
/**
|
|
* Property: wheelListener
|
|
* {function}
|
|
*/
|
|
wheelListener: null,
|
|
|
|
/**
|
|
* Property: mousePosition
|
|
* {<OpenLayers.Pixel>} mousePosition is necessary because
|
|
* evt.clientX/Y is buggy in Moz on wheel events, so we cache and use the
|
|
* value from the last mousemove.
|
|
*/
|
|
mousePosition: null,
|
|
|
|
/**
|
|
* Constructor: OpenLayers.Handler.MouseWheel
|
|
*
|
|
* Parameters:
|
|
* control - {<OpenLayers.Control>}
|
|
* callbacks - {Object} An object containing a single function to be
|
|
* called when the drag operation is finished.
|
|
* The callback should expect to recieve a single
|
|
* argument, the point geometry.
|
|
* options - {Object}
|
|
*/
|
|
initialize: function(control, callbacks, options) {
|
|
OpenLayers.Handler.prototype.initialize.apply(this, arguments);
|
|
this.wheelListener = this.onWheelEvent.bindAsEventListener(this);
|
|
},
|
|
|
|
/**
|
|
* Method: destroy
|
|
*/
|
|
destroy: function() {
|
|
this.deactivate();
|
|
this.wheelListener = null;
|
|
OpenLayers.Handler.prototype.destroy.apply(this, arguments);
|
|
},
|
|
|
|
/**
|
|
* Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
|
|
*/
|
|
|
|
/**
|
|
* Method: onWheelEvent
|
|
* Catch the wheel event and handle it xbrowserly
|
|
*
|
|
* Parameters:
|
|
* e - {Event}
|
|
*/
|
|
onWheelEvent: function(e){
|
|
// first check keyboard modifiers
|
|
if (!this.checkModifiers(e)) return;
|
|
|
|
// first determine whether or not the wheeling was inside the map
|
|
var inMap = false;
|
|
var elem = OpenLayers.Event.element(e);
|
|
while(elem != null) {
|
|
if (this.map && elem == this.map.div) {
|
|
inMap = true;
|
|
break;
|
|
}
|
|
elem = elem.parentNode;
|
|
}
|
|
|
|
if (inMap) {
|
|
var delta = 0;
|
|
if (!e) {
|
|
e = window.event;
|
|
}
|
|
if (e.wheelDelta) {
|
|
delta = e.wheelDelta/120;
|
|
if (window.opera) {
|
|
delta = -delta;
|
|
}
|
|
} else if (e.detail) {
|
|
delta = -e.detail / 3;
|
|
}
|
|
if (delta) {
|
|
// add the mouse position to the event because mozilla has a bug
|
|
// with clientX and clientY (see https://bugzilla.mozilla.org/show_bug.cgi?id=352179)
|
|
// getLonLatFromViewPortPx(e) returns wrong values
|
|
e.xy = this.mousePosition;
|
|
if (delta < 0) {
|
|
this.callback("down", [e, delta]);
|
|
} else {
|
|
this.callback("up", [e, delta]);
|
|
}
|
|
}
|
|
|
|
//only wheel the map, not the window
|
|
OpenLayers.Event.stop(e);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Method: mousemove
|
|
* Update the stored mousePosition on every move.
|
|
*
|
|
* Parameters:
|
|
* evt - {Event} The browser event
|
|
*
|
|
* Return:
|
|
* {Boolean} Allow event propagation
|
|
*/
|
|
mousemove: function (evt) {
|
|
this.mousePosition = evt.xy;
|
|
},
|
|
|
|
/**
|
|
* Method: activate
|
|
*/
|
|
activate: function (evt) {
|
|
if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
|
|
//register mousewheel events specifically on the window and document
|
|
var wheelListener = this.wheelListener;
|
|
OpenLayers.Event.observe(window, "DOMMouseScroll", wheelListener);
|
|
OpenLayers.Event.observe(window, "mousewheel", wheelListener);
|
|
OpenLayers.Event.observe(document, "mousewheel", wheelListener);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Method: deactivate
|
|
*/
|
|
deactivate: function (evt) {
|
|
if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
|
|
// unregister mousewheel events specifically on the window and document
|
|
var wheelListener = this.wheelListener;
|
|
OpenLayers.Event.stopObserving(window, "DOMMouseScroll", wheelListener);
|
|
OpenLayers.Event.stopObserving(window, "mousewheel", wheelListener);
|
|
OpenLayers.Event.stopObserving(document, "mousewheel", wheelListener);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
},
|
|
|
|
/** @final @type String */
|
|
CLASS_NAME: "OpenLayers.Handler.MouseWheel"
|
|
});
|