From e390ff80eaa5932fbd71c75ea08aeeb3e9c4a9bf Mon Sep 17 00:00:00 2001 From: ahocevar Date: Wed, 26 Sep 2012 18:27:45 +0200 Subject: [PATCH] Adding zoom control --- demos/full-screen/full-screen.js | 2 + src/ol/control/zoom.js | 125 +++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/ol/control/zoom.js diff --git a/demos/full-screen/full-screen.js b/demos/full-screen/full-screen.js index a6b6bfac09..e333655538 100644 --- a/demos/full-screen/full-screen.js +++ b/demos/full-screen/full-screen.js @@ -5,6 +5,7 @@ goog.require('ol.Collection'); goog.require('ol.Coordinate'); goog.require('ol.Map'); goog.require('ol.RendererHint'); +goog.require('ol.control.Zoom'); goog.require('ol.layer.MapQuestOpenAerial'); @@ -20,3 +21,4 @@ var map = new ol.Map(document.getElementById('map'), { layers: new ol.Collection([layer]), zoom: 0 }); +var zoom = new ol.control.Zoom(map, layer.getStore().getResolutions()); diff --git a/src/ol/control/zoom.js b/src/ol/control/zoom.js new file mode 100644 index 0000000000..e9c12956b0 --- /dev/null +++ b/src/ol/control/zoom.js @@ -0,0 +1,125 @@ +goog.provide('ol.control.Zoom'); + +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('ol.Projection'); +goog.require('ol.control.Control'); + + + +/** + * @constructor + * @extends {ol.control.Control} + * @param {ol.Map} map Map. + * @param {Array.=} opt_resolutions The resolutions to zoom to. + */ +ol.control.Zoom = function(map, opt_resolutions) { + + goog.base(this, map); + + if (!goog.isDef(opt_resolutions)) { + opt_resolutions = new Array(19); + for (var z = 0; z <= 18; ++z) { + opt_resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z); + } + } + + /** + * @type {Function} + * @private + */ + this.constraint_ = + ol.interaction.ResolutionConstraint.createSnapToResolutions( + opt_resolutions); + + /** + * @type {Element} + * @private + */ + this.divElement_ = goog.dom.createDom(goog.dom.TagName.DIV, 'ol-zoom'); + + /** + * @type {Element} + * @private + */ + this.inButton_ = goog.dom.createDom(goog.dom.TagName.DIV, 'ol-zoom-in', + goog.dom.createDom(goog.dom.TagName.A, {'href': '#zoomIn'})); + + /** + * @type {Element} + * @private + */ + this.outButton_ = goog.dom.createDom(goog.dom.TagName.DIV, 'ol-zoom-out', + goog.dom.createDom(goog.dom.TagName.A, {'href': '#zoomOut'})); + + goog.dom.setTextContent( + /** @type {Element} */ (this.inButton_.firstChild), '+'); + goog.dom.setTextContent( + /** @type {Element} */ (this.outButton_.firstChild), '\u2212'); + goog.dom.append(this.divElement_, this.inButton_, this.outButton_); + goog.dom.append(/** @type {!Node} */ (map.getViewport()), this.divElement_); + + goog.events.listen(this.inButton_, goog.events.EventType.CLICK, + this.handleIn_, false, this); + goog.events.listen(this.outButton_, goog.events.EventType.CLICK, + this.handleOut_, false, this); + +}; +goog.inherits(ol.control.Zoom, ol.control.Control); + + +/** + * @inheritDoc + */ +ol.control.Zoom.prototype.getElement = function() { + return this.divElement_; +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent The browser event to handle. + * @private + */ +ol.control.Zoom.prototype.handleIn_ = function(browserEvent) { + browserEvent.stopPropagation(); + browserEvent.preventDefault(); + this.zoom_(1); +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent The browser event to handle. + * @private + */ +ol.control.Zoom.prototype.handleOut_ = function(browserEvent) { + browserEvent.stopPropagation(); + browserEvent.preventDefault(); + this.zoom_(-1); +}; + + +/** + * @param {number} delta Delta. + * @private + */ +ol.control.Zoom.prototype.zoom_ = function(delta) { + var map = this.getMap(); + var resolution = this.constraint_(map.getResolution(), delta); + map.setResolution(resolution); +}; + + +/** + * @inheritDoc + */ +ol.control.Zoom.prototype.disposeInternal = function() { + goog.dom.removeNode(this.inButton_); + goog.dom.removeNode(this.outButton_); + goog.dom.removeNode(this.divElement_); + delete this.inButton_; + delete this.outButton_; + delete this.divElement_; + goog.base(this, 'disposeInternal'); +};