diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index ad0878ce80..fa584f9332 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -43,8 +43,8 @@ /** * Object literal with config options for the map. * @typedef {Object} ol.MapOptions - * @property {Array.|undefined} controls Controls initially - * added to the map. + * @property {ol.Collection|Array.|undefined} controls + * Controls initially added to the map. * @property {ol.Collection|undefined} interactions Interactions. * @property {Array.|ol.Collection|undefined} layers Layers. * @property {ol.RendererHint|undefined} renderer Renderer. diff --git a/src/ol/control/controldefaults.js b/src/ol/control/controldefaults.js index af50c5c524..0d8c818b62 100644 --- a/src/ol/control/controldefaults.js +++ b/src/ol/control/controldefaults.js @@ -1,6 +1,6 @@ goog.provide('ol.control.defaults'); -goog.require('goog.array'); +goog.require('ol.Collection'); goog.require('ol.control.Attribution'); goog.require('ol.control.Logo'); goog.require('ol.control.Zoom'); @@ -9,14 +9,13 @@ goog.require('ol.control.Zoom'); /** * @param {ol.control.DefaultsOptions=} opt_options Defaults options. * @param {Array.=} opt_controls Additional controls. - * @return {Array.} Controls. + * @return {ol.Collection} Controls. */ ol.control.defaults = function(opt_options, opt_controls) { var options = goog.isDef(opt_options) ? opt_options : {}; - /** @type {Array.} */ - var controls = []; + var controls = new ol.Collection(); var attributionControl = goog.isDef(options.attribution) ? options.attribution : true; @@ -43,7 +42,7 @@ ol.control.defaults = function(opt_options, opt_controls) { } if (goog.isDef(opt_controls)) { - goog.array.extend(controls, opt_controls); + controls.extend(opt_controls); } return controls; diff --git a/src/ol/map.exports b/src/ol/map.exports index 8523ff1658..71fe519081 100644 --- a/src/ol/map.exports +++ b/src/ol/map.exports @@ -1,4 +1,5 @@ @exportClass ol.Map ol.MapOptions +@exportProperty ol.Map.prototype.addControl @exportProperty ol.Map.prototype.addLayer @exportProperty ol.Map.prototype.addPreRenderFunction @exportProperty ol.Map.prototype.addPreRenderFunctions @@ -6,6 +7,7 @@ @exportProperty ol.Map.prototype.getFeatures @exportProperty ol.Map.prototype.getInteractions @exportProperty ol.Map.prototype.getRenderer +@exportProperty ol.Map.prototype.removeControl @exportProperty ol.Map.prototype.removeLayer @exportProperty ol.Map.prototype.updateSize diff --git a/src/ol/map.js b/src/ol/map.js index c1864078e5..eb8632d0f6 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -247,6 +247,12 @@ ol.Map = function(options) { this.handleBrowserEvent, false, this); this.registerDisposable(mouseWheelHandler); + /** + * @type {ol.Collection} + * @private + */ + this.controls_ = optionsInternal.controls; + /** * @type {ol.Collection} * @private @@ -320,20 +326,30 @@ ol.Map = function(options) { // is "defined" already. this.setValues(optionsInternal.values); - if (goog.isDef(optionsInternal.controls)) { - goog.array.forEach(optionsInternal.controls, - /** - * @param {ol.control.Control} control Control. - */ - function(control) { - control.setMap(this); - }, this); - } + this.controls_.forEach( + /** + * @param {ol.control.Control} control Control. + */ + function(control) { + control.setMap(this); + }, this); }; goog.inherits(ol.Map, ol.Object); +/** + * Add the given control to the map. + * @param {ol.control.Control} control Control. + */ +ol.Map.prototype.addControl = function(control) { + var controls = this.getControls(); + goog.asserts.assert(goog.isDef(controls)); + controls.push(control); + control.setMap(this); +}; + + /** * Adds the given layer to the top of this map. * @param {ol.layer.Layer} layer Layer. @@ -434,6 +450,14 @@ ol.Map.prototype.getCoordinateFromPixel = function(pixel) { }; +/** + * @return {ol.Collection} Controls. + */ +ol.Map.prototype.getControls = function() { + return this.controls_; +}; + + /** * Get feature information for a pixel on the map. * @@ -797,6 +821,23 @@ ol.Map.prototype.requestRenderFrame = function() { }; +/** + * Remove the given control from the map. + * @param {ol.control.Control} control Control. + * @return {ol.control.Control|undefined} The removed control of undefined + * if the control was not found. + */ +ol.Map.prototype.removeControl = function(control) { + var controls = this.getControls(); + goog.asserts.assert(goog.isDef(controls)); + if (goog.isDef(controls.remove(control))) { + control.setMap(null); + return control; + } + return undefined; +}; + + /** * Removes the given layer from the map. * @param {ol.layer.Layer} layer Layer. @@ -997,7 +1038,7 @@ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { /** - * @typedef {{controls: Array., + * @typedef {{controls: ol.Collection, * interactions: ol.Collection, * rendererConstructor: * function(new: ol.renderer.Map, Element, ol.Map), @@ -1074,8 +1115,17 @@ ol.Map.createOptionsInternal = function(options) { } } - var controls = goog.isDef(options.controls) ? - options.controls : ol.control.defaults(); + var controls; + if (goog.isDef(options.controls)) { + if (goog.isArray(options.controls)) { + controls = new ol.Collection(goog.array.clone(options.controls)); + } else { + goog.asserts.assertInstanceof(options.controls, ol.Collection); + controls = options.controls; + } + } else { + controls = ol.control.defaults(); + } var interactions = goog.isDef(options.interactions) ? options.interactions : ol.interaction.defaults();