/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for * full list of contributors). Published under the 2-clause BSD license. * See license.txt in the OpenLayers distribution or repository for the * full text of the license. */ /** * @requires OpenLayers/Control/ZoomBox.js * @requires OpenLayers/Control/DragPan.js * @requires OpenLayers/Handler/MouseWheel.js * @requires OpenLayers/Handler/Click.js */ /** * Class: OpenLayers.Control.Navigation * The navigation control handles map browsing with mouse events (dragging, * double-clicking, and scrolling the wheel). Create a new navigation * control with the control. * * Note that this control is added to the map by default (if no controls * array is sent in the options object to the * constructor). * * Inherits: * - */ OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, { /** * Property: dragPan * {} */ dragPan: null, /** * APIProperty: dragPanOptions * {Object} Options passed to the DragPan control. */ dragPanOptions: null, /** * Property: pinchZoom * {} */ pinchZoom: null, /** * APIProperty: pinchZoomOptions * {Object} Options passed to the PinchZoom control. */ pinchZoomOptions: null, /** * APIProperty: documentDrag * {Boolean} Allow panning of the map by dragging outside map viewport. * Default is false. */ documentDrag: false, /** * Property: zoomBox * {} */ zoomBox: null, /** * APIProperty: zoomBoxEnabled * {Boolean} Whether the user can draw a box to zoom */ zoomBoxEnabled: true, /** * APIProperty: zoomWheelEnabled * {Boolean} Whether the mousewheel should zoom the map */ zoomWheelEnabled: true, /** * Property: mouseWheelOptions * {Object} Options passed to the MouseWheel control (only useful if * is set to true). Default is no options for maps * with fractionalZoom set to true, otherwise * {cumulative: false, interval: 50, maxDelta: 6} */ mouseWheelOptions: null, /** * APIProperty: handleRightClicks * {Boolean} Whether or not to handle right clicks. Default is false. */ handleRightClicks: false, /** * APIProperty: zoomBoxKeyMask * {Integer} key code of the key, which has to be * pressed, while drawing the zoom box with the mouse on the screen. * You should probably set handleRightClicks to true if you use this * with MOD_CTRL, to disable the context menu for machines which use * CTRL-Click as a right click. * Default: */ zoomBoxKeyMask: OpenLayers.Handler.MOD_SHIFT, /** * APIProperty: autoActivate * {Boolean} Activate the control when it is added to a map. Default is * true. */ autoActivate: true, /** * Constructor: OpenLayers.Control.Navigation * Create a new navigation control * * Parameters: * options - {Object} An optional object whose properties will be set on * the control */ initialize: function(options) { this.handlers = {}; OpenLayers.Control.prototype.initialize.apply(this, arguments); }, /** * Method: destroy * The destroy method is used to perform any clean up before the control * is dereferenced. Typically this is where event listeners are removed * to prevent memory leaks. */ destroy: function() { this.deactivate(); if (this.dragPan) { this.dragPan.destroy(); } this.dragPan = null; if (this.zoomBox) { this.zoomBox.destroy(); } this.zoomBox = null; if (this.pinchZoom) { this.pinchZoom.destroy(); } this.pinchZoom = null; OpenLayers.Control.prototype.destroy.apply(this,arguments); }, /** * Method: activate */ activate: function() { this.dragPan.activate(); if (this.zoomWheelEnabled) { this.handlers.wheel.activate(); } this.handlers.click.activate(); if (this.zoomBoxEnabled) { this.zoomBox.activate(); } if (this.pinchZoom) { this.pinchZoom.activate(); } return OpenLayers.Control.prototype.activate.apply(this,arguments); }, /** * Method: deactivate */ deactivate: function() { if (this.pinchZoom) { this.pinchZoom.deactivate(); } this.zoomBox.deactivate(); this.dragPan.deactivate(); this.handlers.click.deactivate(); this.handlers.wheel.deactivate(); return OpenLayers.Control.prototype.deactivate.apply(this,arguments); }, /** * Method: draw */ draw: function() { // disable right mouse context menu for support of right click events if (this.handleRightClicks) { this.map.viewPortDiv.oncontextmenu = OpenLayers.Function.False; } var clickCallbacks = { 'click': this.defaultClick, 'dblclick': this.defaultDblClick, 'dblrightclick': this.defaultDblRightClick }; var clickOptions = { 'double': true, 'stopDouble': true }; this.handlers.click = new OpenLayers.Handler.Click( this, clickCallbacks, clickOptions ); this.dragPan = new OpenLayers.Control.DragPan( OpenLayers.Util.extend({ map: this.map, documentDrag: this.documentDrag }, this.dragPanOptions) ); this.zoomBox = new OpenLayers.Control.ZoomBox( {map: this.map, keyMask: this.zoomBoxKeyMask}); this.dragPan.draw(); this.zoomBox.draw(); var wheelOptions = this.map.fractionalZoom ? {} : { cumulative: false, interval: 50, maxDelta: 6 }; this.handlers.wheel = new OpenLayers.Handler.MouseWheel( this, {up : this.wheelUp, down: this.wheelDown}, OpenLayers.Util.extend(wheelOptions, this.mouseWheelOptions) ); if (OpenLayers.Control.PinchZoom) { this.pinchZoom = new OpenLayers.Control.PinchZoom( OpenLayers.Util.extend( {map: this.map}, this.pinchZoomOptions)); } }, /** * Method: defaultClick * * Parameters: * evt - {Event} */ defaultClick: function (evt) { if (evt.lastTouches && evt.lastTouches.length == 2) { this.map.zoomOut(); } }, /** * Method: defaultDblClick * * Parameters: * evt - {Event} */ defaultDblClick: function (evt) { this.map.zoomTo(this.map.zoom + 1, evt.xy); }, /** * Method: defaultDblRightClick * * Parameters: * evt - {Event} */ defaultDblRightClick: function (evt) { this.map.zoomTo(this.map.zoom - 1, evt.xy); }, /** * Method: wheelChange * * Parameters: * evt - {Event} * deltaZ - {Integer} */ wheelChange: function(evt, deltaZ) { if (!this.map.fractionalZoom) { deltaZ = Math.round(deltaZ); } var currentZoom = this.map.getZoom(), newZoom = currentZoom + deltaZ; newZoom = Math.max(newZoom, 0); newZoom = Math.min(newZoom, this.map.getNumZoomLevels()); if (newZoom === currentZoom) { return; } this.map.zoomTo(newZoom, evt.xy); }, /** * Method: wheelUp * User spun scroll wheel up * * Parameters: * evt - {Event} * delta - {Integer} */ wheelUp: function(evt, delta) { this.wheelChange(evt, delta || 1); }, /** * Method: wheelDown * User spun scroll wheel down * * Parameters: * evt - {Event} * delta - {Integer} */ wheelDown: function(evt, delta) { this.wheelChange(evt, delta || -1); }, /** * Method: disableZoomBox */ disableZoomBox : function() { this.zoomBoxEnabled = false; this.zoomBox.deactivate(); }, /** * Method: enableZoomBox */ enableZoomBox : function() { this.zoomBoxEnabled = true; if (this.active) { this.zoomBox.activate(); } }, /** * Method: disableZoomWheel */ disableZoomWheel : function() { this.zoomWheelEnabled = false; this.handlers.wheel.deactivate(); }, /** * Method: enableZoomWheel */ enableZoomWheel : function() { this.zoomWheelEnabled = true; if (this.active) { this.handlers.wheel.activate(); } }, CLASS_NAME: "OpenLayers.Control.Navigation" });