[OpenLayers-Dev] PanZoomBar tries to zoom outside the range (plus bad events)

Andreas Hocevar ahocevar at opengeo.org
Thu Mar 24 06:45:08 EDT 2011


Can you please provide an example that shows the problem? The best place to do this (and attach a patch with your fixes) would be a ticket on http://trac.osgeo.org/openlayers/.

Thanks,
Andreas.

On Mar 16, 2011, at 13:14 , Martin Saturka wrote:

> Hi,
> when you drag the bar at the PanZoomBar too up or down, the control
> tries to zoom to levels outside the map zoom range, e.g. to -1 or 22,
> ...
> 
> It would be nice if we had a hook for checking / modifying that
> targeted zoom number. We use some hook by now, as below at the
> "zoomBarUp" method.
> 
> Together with it, the mouse click event stopping does not work
> correctly (at MSIE, and OL 2.10), thus we had to put some external
> dealing there (otherwise it ended up with adding new points as we have
> it for mouse click events).
> 
> 
> OpenLayers.Control.PanZoomBarMod =
> OpenLayers.Class(OpenLayers.Control.PanZoomBar, {
>    // msie does not stops the event, and does not preserves its
> properties either
>    divClick: function (evt) {
> 	if (!OpenLayers.Event.isLeftClick(evt)) {
> 		return;
> 	}
> 	var levels = evt.xy.y / this.zoomStopHeight;
> 	if (this.forceFixedZoomLevel || !this.map.fractionalZoom) {
> 		levels = Math.floor(levels);
> 	}
> 	var zoom = this.map.getNumZoomLevels() - 1 - levels;
> 	zoom = Math.min(Math.max(zoom, 0), this.map.getNumZoomLevels() - 1);
> 	this.map.zoomTo(zoom);
> 
>        var stop_event = OpenLayers.Hooks.PanZoomBar.divClick(this);
>        if (stop_event)
>        {
>            OpenLayers.Event.stop(evt);
>        }
> 
>    },
> 
>    buttonDown: function(evt) {
>        if (!OpenLayers.Event.isLeftClick(evt)) {
>            return;
>        }
>        OpenLayers.Hooks.PanZoomBar.buttonDown(this);
> 
>        switch (this.action) {
>          case "panup":
>            this.map.pan(0, - this.getSlideFactor("h"));
>            break;
>          case "pandown":
>            this.map.pan(0, this.getSlideFactor("h"));
>            break;
>          case "panleft":
>            this.map.pan(- this.getSlideFactor("w"), 0);
>            break;
>          case "panright":
>            this.map.pan(this.getSlideFactor("w"), 0);
>            break;
>          case "zoomin":
>            this.map.zoomIn();
>            break;
>          case "zoomout":
>            this.map.zoomOut();
>            break;
>          case "zoomworld":
>            this.map.zoomToMaxExtent();
>            break;
>          default:;
>        }
> 
>        OpenLayers.Event.stop(evt);
>    },
> 
>    zoomBarUp: function(evt) {
>        if (!OpenLayers.Event.isLeftClick(evt)) {
>            return;
>        }
>        if (this.mouseDragStart) {
>            this.div.style.cursor="";
>            this.map.events.un({
>                "mouseup": this.passEventToSlider,
>                "mousemove": this.passEventToSlider,
>                scope: this
>            });
>            var deltaY = this.zoomStart.y - evt.xy.y;
>            var zoomLevel = this.map.zoom;
>            if (!this.forceFixedZoomLevel && this.map.fractionalZoom) {
>                zoomLevel += deltaY/this.zoomStopHeight;
>                zoomLevel = Math.min(Math.max(zoomLevel, 0),
>                                     this.map.getNumZoomLevels() - 1);
>            } else {
>                zoomLevel += Math.round(deltaY/this.zoomStopHeight);
>            }
> 
>            var max_layer_zoom = OpenLayers.Hooks.Zooms.maxZoom(this);
>            var min_layer_zoom = OpenLayers.Hooks.Zooms.minZoom(this);
> 
>            if ((max_layer_zoom !== undefined) && (typeof
> max_layer_zoom === "number")) {
>                if (max_layer_zoom < zoomLevel) {zoomLevel = max_layer_zoom;}
>            }
>            if ((min_layer_zoom !== undefined) && (typeof
> min_layer_zoom === "number")) {
>                if (min_layer_zoom > zoomLevel) {zoomLevel = min_layer_zoom;}
>            }
> 
>            this.map.zoomTo(zoomLevel);
>            this.mouseDragStart = null;
>            this.zoomStart = null;
> 
>            var stop_event = OpenLayers.Hooks.PanZoomBar.zoomBarUp(this);
>            if (stop_event) {
>                OpenLayers.Event.stop(evt);
>            }
>        }
>    },
> 
>    CLASS_NAME: "OpenLayers.Control.PanZoomBar"
> });
> 
> M.
> 
> -- 
> Martin Saturka
> Software Engineer, Sourcefabric
> www.sourcefabric.org
> _______________________________________________
> Dev mailing list
> Dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/openlayers-dev

-- 
Andreas Hocevar
OpenGeo - http://opengeo.org/
Expert service straight from the developers.



More information about the Dev mailing list