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();