Index: tests/Control/test_MouseDefaults.html =================================================================== --- tests/Control/test_MouseDefaults.html (Revision 0) +++ tests/Control/test_MouseDefaults.html (Revision 0) @@ -0,0 +1,115 @@ + +
+ + + + + + + Index: tests/Control/test_MouseToolbar.html =================================================================== --- tests/Control/test_MouseToolbar.html (Revision 2907) +++ tests/Control/test_MouseToolbar.html (Arbeitskopie) @@ -45,7 +45,9 @@ control.defaultMouseDown(evt); evt.xy = new OpenLayers.Size(15,15); control.defaultMouseUp(evt); - t.eq(map.getZoom(), 6, "Map zoom set correctly after zoombox"); + t.delay_call( 1, function() { + t.eq(map.getZoom(), 6, "Map zoom set correctly after zoombox"); + }); } else { t.ok(true, "IE does not run this test.") } Index: lib/OpenLayers/Control/MouseToolbar.js =================================================================== --- lib/OpenLayers/Control/MouseToolbar.js (Revision 2907) +++ lib/OpenLayers/Control/MouseToolbar.js (Arbeitskopie) @@ -112,12 +112,24 @@ * @param {Event} evt */ defaultDblClick: function (evt) { - this.switchModeTo("pan"); - this.performedDrag = false; - var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); - this.map.setCenter(newCenter, this.map.zoom + 1); - OpenLayers.Event.stop(evt); - return false; + if (!this.map.zoomanimationActive){ + this.switchModeTo("pan"); + this.performedDrag = false; + + // convert the (old) center of the map in pixel + var centerPx = this.map.getPixelFromLonLat(this.map.getCenter()); + + // pan to new center + var deltaX = evt.xy.x - centerPx.x; + var deltaY = evt.xy.y - centerPx.y; + this.map.pan(deltaX, deltaY,true); + + // zoom to new level + this.map.zoomIn(); + + OpenLayers.Event.stop(evt); + return false; + } }, /** Index: lib/OpenLayers/Control/MouseDefaults.js =================================================================== --- lib/OpenLayers/Control/MouseDefaults.js (Revision 2907) +++ lib/OpenLayers/Control/MouseDefaults.js (Arbeitskopie) @@ -71,10 +71,21 @@ * @param {Event} evt */ defaultDblClick: function (evt) { - var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); - this.map.setCenter(newCenter, this.map.zoom + 1); - OpenLayers.Event.stop(evt); - return false; + if (!this.map.zoomanimationActive){ + // convert the (old) center of the map in pixel + var centerPx = this.map.getPixelFromLonLat(this.map.getCenter()); + + // pan to new center + var deltaX = evt.xy.x - centerPx.x; + var deltaY = evt.xy.y - centerPx.y; + this.map.pan(deltaX, deltaY,true); + + // zoom to new level + this.map.zoomIn(); + + OpenLayers.Event.stop(evt); + return false; + } }, /** @@ -173,8 +184,28 @@ */ defaultWheelUp: function(evt) { if (this.map.getZoom() <= this.map.getNumZoomLevels()) { - this.map.setCenter(this.map.getLonLatFromPixel(evt.xy), - this.map.getZoom() + 1); + if (!this.map.zoomanimationActive) { + // convert the current center of the map in pixel + var centerPx = this.map.getPixelFromLonLat(this.map.getCenter()); + + // determine lonlat from target (mouse position) + var targetLonLat = this.map.getLonLatFromViewPortPx( evt.xy ); + + // determine offset target-center in pixel + var offset = new OpenLayers.Pixel(); + offset.x = evt.xy.x - centerPx.x; + offset.y = evt.xy.y - centerPx.y; + + // convert offset of zoomlevel n to zoomlevel n+1 + offset.x = offset.x / 2; + offset.y = offset.y / 2; + + // pan to new center + this.map.pan(offset.x, offset.y, true); + + // zoom to new level + this.map.zoomIn(); + } } }, @@ -183,8 +214,28 @@ */ defaultWheelDown: function(evt) { if (this.map.getZoom() > 0) { - this.map.setCenter(this.map.getLonLatFromPixel(evt.xy), - this.map.getZoom() - 1); + if (!this.map.zoomanimationActive) { + // convert the current center of the map in pixel + var centerPx = this.map.getPixelFromLonLat(this.map.getCenter()); + + // determine lonlat from target (mouse position) + var targetLonLat = this.map.getLonLatFromViewPortPx( evt.xy ); + + // determine offset target-center in pixel... + var offset = new OpenLayers.Pixel(); + offset.x = evt.xy.x - centerPx.x; + offset.y = evt.xy.y - centerPx.y; + + // convert offset of zoomlevel n to zoomlevel n-1 + offset.x = -offset.x; + offset.y = -offset.y; + + // pan to new center + this.map.pan(offset.x, offset.y, true); + + // zoom to new level + this.map.zoomOut(); + } } }, @@ -193,25 +244,31 @@ */ zoomBoxEnd: function(evt) { if (this.mouseDragStart != null) { - if (Math.abs(this.mouseDragStart.x - evt.xy.x) > 5 || - Math.abs(this.mouseDragStart.y - evt.xy.y) > 5) { - var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart ); - var end = this.map.getLonLatFromViewPortPx( evt.xy ); - var top = Math.max(start.lat, end.lat); - var bottom = Math.min(start.lat, end.lat); - var left = Math.min(start.lon, end.lon); - var right = Math.max(start.lon, end.lon); - var bounds = new OpenLayers.Bounds(left, bottom, right, top); - this.map.zoomToExtent(bounds); - } else { - var end = this.map.getLonLatFromViewPortPx( evt.xy ); - this.map.setCenter(new OpenLayers.LonLat( - (end.lon), - (end.lat) - ), this.map.getZoom() + 1); - } + if (!this.map.zoomanimationActive) { + if (Math.abs(this.mouseDragStart.x - evt.xy.x) > 5 || + Math.abs(this.mouseDragStart.y - evt.xy.y) > 5) { + var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart ); + var end = this.map.getLonLatFromViewPortPx( evt.xy ); + var top = Math.max(start.lat, end.lat); + var bottom = Math.min(start.lat, end.lat); + var left = Math.min(start.lon, end.lon); + var right = Math.max(start.lon, end.lon); + var bounds = new OpenLayers.Bounds(left, bottom, right, top); + this.map.zoomToExtent(bounds); + } else { + // convert the (old) center of the map in pixel + var centerPx = this.map.getPixelFromLonLat(this.map.getCenter()) + // pan to new center + var deltaX = evt.xy.x - centerPx.x; + var deltaY = evt.xy.y - centerPx.y; + this.map.pan(deltaX, deltaY,true); + + // zoom to new level + this.map.zoomIn(); + } + } this.removeZoomBox(); - } + } }, /** Index: examples/controls.html =================================================================== --- examples/controls.html (Revision 2907) +++ examples/controls.html (Arbeitskopie) @@ -14,7 +14,7 @@ var map = new OpenLayers.Map('map', { controls: [] }); map.addControl(new OpenLayers.Control.PanZoomBar()); - map.addControl(new OpenLayers.Control.MouseToolbar()); + map.addControl(new OpenLayers.Control.MouseDefaults()); map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false})); map.addControl(new OpenLayers.Control.Permalink()); map.addControl(new OpenLayers.Control.Permalink('permalink'));