From c521f92408f12e713ff6e78c1e996deff9274a43 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 5 Mar 2013 18:55:43 +0100 Subject: [PATCH 01/10] Make attribution control options argument optional --- src/ol/control/attributioncontrol.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ol/control/attributioncontrol.js b/src/ol/control/attributioncontrol.js index c6f79717aa..23c5b6d241 100644 --- a/src/ol/control/attributioncontrol.js +++ b/src/ol/control/attributioncontrol.js @@ -21,10 +21,11 @@ goog.require('ol.source.Source'); /** * @constructor * @extends {ol.control.Control} - * @param {ol.control.AttributionOptions} attributionOptions Attribution - * options. + * @param {ol.control.AttributionOptions=} opt_options Options. */ -ol.control.Attribution = function(attributionOptions) { +ol.control.Attribution = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; this.ulElement_ = goog.dom.createElement(goog.dom.TagName.UL); @@ -34,8 +35,8 @@ ol.control.Attribution = function(attributionOptions) { goog.base(this, { element: element, - map: attributionOptions.map, - target: attributionOptions.target + map: options.map, + target: options.target }); /** From f581390655c966a7464eb8c0b90340b24bee6f90 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 5 Mar 2013 18:56:11 +0100 Subject: [PATCH 02/10] Make zoom control options argument optional --- src/ol/control/zoomcontrol.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ol/control/zoomcontrol.js b/src/ol/control/zoomcontrol.js index 63e3345cbf..ca3d316378 100644 --- a/src/ol/control/zoomcontrol.js +++ b/src/ol/control/zoomcontrol.js @@ -19,9 +19,11 @@ ol.control.ZOOM_DURATION = 250; /** * @constructor * @extends {ol.control.Control} - * @param {ol.control.ZoomOptions} zoomOptions Zoom options. + * @param {ol.control.ZoomOptions=} opt_options Options. */ -ol.control.Zoom = function(zoomOptions) { +ol.control.Zoom = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; var inElement = goog.dom.createDom(goog.dom.TagName.A, { 'href': '#zoomIn', @@ -46,15 +48,15 @@ ol.control.Zoom = function(zoomOptions) { goog.base(this, { element: element, - map: zoomOptions.map, - target: zoomOptions.target + map: options.map, + target: options.target }); /** * @type {number} * @private */ - this.delta_ = goog.isDef(zoomOptions.delta) ? zoomOptions.delta : 1; + this.delta_ = goog.isDef(options.delta) ? options.delta : 1; }; goog.inherits(ol.control.Zoom, ol.control.Control); From 1ae20641ef6f239fb807d90586b29c15f7b97e7c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 5 Mar 2013 18:58:29 +0100 Subject: [PATCH 03/10] Make mouse position control options argument optional --- src/ol/control/mousepositioncontrol.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/ol/control/mousepositioncontrol.js b/src/ol/control/mousepositioncontrol.js index 60a667f4a0..fc736fe5a2 100644 --- a/src/ol/control/mousepositioncontrol.js +++ b/src/ol/control/mousepositioncontrol.js @@ -23,10 +23,11 @@ goog.require('ol.projection'); /** * @constructor * @extends {ol.control.Control} - * @param {ol.control.MousePositionOptions} mousePositionOptions Mouse position - * options. + * @param {ol.control.MousePositionOptions=} opt_options Options. */ -ol.control.MousePosition = function(mousePositionOptions) { +ol.control.MousePosition = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; var element = goog.dom.createDom(goog.dom.TagName.DIV, { 'class': 'ol-mouse-position' @@ -34,28 +35,28 @@ ol.control.MousePosition = function(mousePositionOptions) { goog.base(this, { element: element, - map: mousePositionOptions.map, - target: mousePositionOptions.target + map: options.map, + target: options.target }); /** * @private * @type {ol.Projection|undefined} */ - this.projection_ = mousePositionOptions.projection; + this.projection_ = options.projection; /** * @private * @type {ol.CoordinateFormatType|undefined} */ - this.coordinateFormat_ = mousePositionOptions.coordinateFormat; + this.coordinateFormat_ = options.coordinateFormat; /** * @private * @type {string} */ - this.undefinedHTML_ = goog.isDef(mousePositionOptions.undefinedHTML) ? - mousePositionOptions.undefinedHTML : ''; + this.undefinedHTML_ = goog.isDef(options.undefinedHTML) ? + options.undefinedHTML : ''; /** * @private From 8ae009d401603fc1215df3019251974a4a29d328 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 5 Mar 2013 18:59:04 +0100 Subject: [PATCH 04/10] Add ol.control.defaults --- src/objectliterals.exports | 14 ++++--- src/ol/control/defaults.exports | 1 + src/ol/control/defaults.js | 51 +++++++++++++++++++++++++ src/ol/map.js | 68 ++++++--------------------------- 4 files changed, 73 insertions(+), 61 deletions(-) create mode 100644 src/ol/control/defaults.exports create mode 100644 src/ol/control/defaults.js diff --git a/src/objectliterals.exports b/src/objectliterals.exports index 87a20a44c6..862221c424 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -1,5 +1,5 @@ @exportObjectLiteral ol.MapOptions -@exportObjectLiteralProperty ol.MapOptions.attributionControl boolean|undefined +@exportObjectLiteralProperty ol.MapOptions.controls Array.|undefined @exportObjectLiteralProperty ol.MapOptions.doubleClickZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.dragPan boolean|undefined @exportObjectLiteralProperty ol.MapOptions.interactions ol.Collection|undefined @@ -9,16 +9,12 @@ @exportObjectLiteralProperty ol.MapOptions.mouseWheelZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.renderer ol.RendererHint|undefined @exportObjectLiteralProperty ol.MapOptions.renderers Array.|undefined -@exportObjectLiteralProperty ol.MapOptions.scaleLineControl boolean|undefined -@exportObjectLiteralProperty ol.MapOptions.scaleLineUnits ol.control.ScaleLineUnits|undefined @exportObjectLiteralProperty ol.MapOptions.shiftDragZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.target Element|string @exportObjectLiteralProperty ol.MapOptions.touchPan boolean|undefined @exportObjectLiteralProperty ol.MapOptions.touchRotate boolean|undefined @exportObjectLiteralProperty ol.MapOptions.touchZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.view ol.IView|undefined -@exportObjectLiteralProperty ol.MapOptions.zoomControl boolean|undefined -@exportObjectLiteralProperty ol.MapOptions.zoomDelta number|undefined @exportObjectLiteral ol.View2DOptions @exportObjectLiteralProperty ol.View2DOptions.center ol.Coordinate|undefined @@ -59,6 +55,14 @@ @exportObjectLiteralProperty ol.control.AttributionOptions.map ol.Map|undefined @exportObjectLiteralProperty ol.control.AttributionOptions.target Element|undefined +@exportObjectLiteral ol.control.DefaultsOptions +@exportObjectLiteralProperty ol.control.DefaultsOptions.attribution boolean|undefined +@exportObjectLiteralProperty ol.control.DefaultsOptions.attributionOptions ol.control.AttributionOptions|undefined +@exportObjectLiteralProperty ol.control.DefaultsOptions.scaleLine boolean|undefined +@exportObjectLiteralProperty ol.control.DefaultsOptions.scaleLineOptions ol.control.ScaleLineOptions|undefined +@exportObjectLiteralProperty ol.control.DefaultsOptions.zoom boolean|undefined +@exportObjectLiteralProperty ol.control.DefaultsOptions.zoomOptions ol.control.ZoomOptions|undefined + @exportObjectLiteral ol.control.ScaleLineOptions @exportObjectLiteralProperty ol.control.ScaleLineOptions.map ol.Map|undefined @exportObjectLiteralProperty ol.control.ScaleLineOptions.minWidth number|undefined diff --git a/src/ol/control/defaults.exports b/src/ol/control/defaults.exports new file mode 100644 index 0000000000..0023131772 --- /dev/null +++ b/src/ol/control/defaults.exports @@ -0,0 +1 @@ +@exportSymbol ol.control.defaults ol.control.defaults diff --git a/src/ol/control/defaults.js b/src/ol/control/defaults.js new file mode 100644 index 0000000000..983e279be1 --- /dev/null +++ b/src/ol/control/defaults.js @@ -0,0 +1,51 @@ +goog.provide('ol.control.defaults'); + +goog.require('ol.control.Attribution'); +goog.require('ol.control.ScaleLine'); +goog.require('ol.control.Zoom'); + + +/** + * @param {ol.control.DefaultsOptions=} opt_options Options. + * @param {...ol.control.Control} var_args Further controls. + * @return {Array.} Controls. + */ +ol.control.defaults = function(opt_options, var_args) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** @type {Array.} */ + var controls = []; + + var attributionControl = goog.isDef(options.attribution) ? + options.attribution : true; + if (attributionControl) { + var attributionControlOptions = goog.isDef(options.attributionOptions) ? + options.attributionOptions : undefined; + controls.push(new ol.control.Attribution(attributionControlOptions)); + } + + var scaleLineControl = goog.isDef(options.scaleLine) ? + options.scaleLine : false; + if (scaleLineControl) { + var scaleLineOptions = goog.isDef(options.scaleLineOptions) ? + options.scaleLineOptions : undefined; + controls.push(new ol.control.ScaleLine(scaleLineOptions)); + } + + var zoomControl = goog.isDef(options.zoom) ? + options.zoom : true; + if (zoomControl) { + var zoomControlOptions = goog.isDef(options.zoomControlOptions) ? + options.zoomControlOptions : undefined; + controls.push(new ol.control.Zoom(zoomControlOptions)); + } + + var i; + for (i = 1; i < arguments.length; ++i) { + controls.push(arguments[i]); + } + + return controls; + +}; diff --git a/src/ol/map.js b/src/ol/map.js index 0650f66a76..e222431466 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -43,10 +43,7 @@ goog.require('ol.Tile'); goog.require('ol.TileQueue'); goog.require('ol.View'); goog.require('ol.View2D'); -goog.require('ol.control.Attribution'); -goog.require('ol.control.Control'); -goog.require('ol.control.ScaleLine'); -goog.require('ol.control.Zoom'); +goog.require('ol.control.defaults'); goog.require('ol.interaction.DblClickZoom'); goog.require('ol.interaction.DragPan'); goog.require('ol.interaction.DragRotate'); @@ -292,15 +289,15 @@ ol.Map = function(mapOptions) { // this gives the map an initial size this.handleBrowserWindowResize(); - /** @type {Array.} */ - var controls = mapOptionsInternal.controls; - goog.array.forEach(controls, - /** - * @param {ol.control.Control} control Control. - */ - function(control) { - control.setMap(this); - }, this); + if (goog.isDef(mapOptionsInternal.controls)) { + goog.array.forEach(mapOptionsInternal.controls, + /** + * @param {ol.control.Control} control Control. + */ + function(control) { + control.setMap(this); + }, this); + } }; goog.inherits(ol.Map, ol.Object); @@ -881,10 +878,8 @@ ol.Map.createOptionsInternal = function(mapOptions) { } } - /** - * @type {Array.} - */ - var controls = ol.Map.createControls_(mapOptions); + var controls = goog.isDef(mapOptions.controls) ? + mapOptions.controls : ol.control.defaults(); /** * @type {ol.Collection} @@ -912,45 +907,6 @@ ol.Map.createOptionsInternal = function(mapOptions) { }; -/** - * @private - * @param {ol.MapOptions} mapOptions Map options. - * @return {Array.} Controls. - */ -ol.Map.createControls_ = function(mapOptions) { - /** @type {Array.} */ - var controls = []; - - var attributionControl = goog.isDef(mapOptions.attributionControl) ? - mapOptions.attributionControl : true; - if (attributionControl) { - controls.push(new ol.control.Attribution({})); - } - - var scaleLineControl = goog.isDef(mapOptions.scaleLineControl) ? - mapOptions.scaleLineControl : false; - if (scaleLineControl) { - var scaleLineUnits = goog.isDef(mapOptions.scaleLineUnits) ? - mapOptions.scaleLineUnits : undefined; - controls.push(new ol.control.ScaleLine({ - units: scaleLineUnits - })); - } - - var zoomControl = goog.isDef(mapOptions.zoomControl) ? - mapOptions.zoomControl : true; - if (zoomControl) { - var zoomDelta = goog.isDef(mapOptions.zoomDelta) ? - mapOptions.zoomDelta : 1; - controls.push(new ol.control.Zoom({ - delta: zoomDelta - })); - } - - return controls; -}; - - /** * @private * @param {ol.MapOptions} mapOptions Map options. From a94eadf4024a93d387c4a8e698667212e4f8408a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 5 Mar 2013 18:59:17 +0100 Subject: [PATCH 05/10] Port examples to ol.control.defaults --- examples/epsg-4326.js | 9 ++++++-- examples/full-screen.js | 5 +++- examples/side-by-side.js | 49 ++++++++++++++++++++-------------------- examples/stamen.js | 1 - 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/examples/epsg-4326.js b/examples/epsg-4326.js index 303da4c23e..c846d892fa 100644 --- a/examples/epsg-4326.js +++ b/examples/epsg-4326.js @@ -4,6 +4,7 @@ goog.require('ol.Map'); goog.require('ol.RendererHint'); goog.require('ol.View2D'); goog.require('ol.control.ScaleLineUnits'); +goog.require('ol.control.defaults'); goog.require('ol.layer.TileLayer'); goog.require('ol.projection'); goog.require('ol.source.TiledWMS'); @@ -24,11 +25,15 @@ var layers = new ol.Collection([ ]); var map = new ol.Map({ + controls: ol.control.defaults({ + scaleLine: true, + scaleLineOptions: /** @type {ol.control.ScaleLineOptions} */ ({ + units: ol.control.ScaleLineUnits.DEGREES + }) + }), layers: layers, // The OSgeo server does not set cross origin headers, so we cannot use WebGL renderers: [ol.RendererHint.CANVAS, ol.RendererHint.DOM], - scaleLineControl: true, - scaleLineUnits: ol.control.ScaleLineUnits.DEGREES, target: 'map', view: new ol.View2D({ projection: ol.projection.getFromCode('EPSG:4326'), diff --git a/examples/full-screen.js b/examples/full-screen.js index 8ab4ca96ea..fb2e1ecfe7 100644 --- a/examples/full-screen.js +++ b/examples/full-screen.js @@ -5,6 +5,7 @@ goog.require('ol.Geolocation'); goog.require('ol.Map'); goog.require('ol.RendererHints'); goog.require('ol.View2D'); +goog.require('ol.control.defaults'); goog.require('ol.layer.TileLayer'); goog.require('ol.source.MapQuestOpenAerial'); @@ -13,9 +14,11 @@ var layer = new ol.layer.TileLayer({ source: new ol.source.MapQuestOpenAerial() }); var map = new ol.Map({ + controls: ol.control.defaults({ + scaleLine: true + }), layers: new ol.Collection([layer]), renderers: ol.RendererHints.createFromQueryData(), - scaleLineControl: true, target: 'map', view: new ol.View2D({ center: new ol.Coordinate(0, 0), diff --git a/examples/side-by-side.js b/examples/side-by-side.js index 3a02b02e89..8f9e322664 100644 --- a/examples/side-by-side.js +++ b/examples/side-by-side.js @@ -5,6 +5,7 @@ goog.require('ol.RendererHint'); goog.require('ol.View2D'); goog.require('ol.animation'); goog.require('ol.control.MousePosition'); +goog.require('ol.control.defaults'); goog.require('ol.easing'); goog.require('ol.interaction.Keyboard'); goog.require('ol.layer.TileLayer'); @@ -26,22 +27,28 @@ var view = new ol.View2D({ zoom: 1 }); -var domMap = new ol.Map({ - layers: new ol.Collection([layer]), - renderer: ol.RendererHint.DOM, - target: 'domMap', - view: view -}); - var domMousePosition = new ol.control.MousePosition({ coordinateFormat: ol.Coordinate.toStringHDMS, projection: ol.projection.getFromCode('EPSG:4326'), target: document.getElementById('domMousePosition'), undefinedHTML: ' ' }); -domMousePosition.setMap(domMap); +var domMap = new ol.Map({ + controls: ol.control.defaults({}, domMousePosition), + layers: new ol.Collection([layer]), + renderer: ol.RendererHint.DOM, + target: 'domMap', + view: view +}); +var webglMousePosition = new ol.control.MousePosition({ + coordinateFormat: ol.Coordinate.toStringHDMS, + projection: ol.projection.getFromCode('EPSG:4326'), + target: document.getElementById('webglMousePosition'), + undefinedHTML: ' ' +}); var webglMap = new ol.Map({ + controls: ol.control.defaults({}, webglMousePosition), renderer: ol.RendererHint.WEBGL, target: 'webglMap' }); @@ -50,22 +57,6 @@ if (webglMap !== null) { webglMap.bindTo('view', domMap); } -var webglMousePosition = new ol.control.MousePosition({ - coordinateFormat: ol.Coordinate.toStringHDMS, - projection: ol.projection.getFromCode('EPSG:4326'), - target: document.getElementById('webglMousePosition'), - undefinedHTML: ' ' -}); -webglMousePosition.setMap(webglMap); - -var canvasMap = new ol.Map({ - renderer: ol.RendererHint.CANVAS, - target: 'canvasMap' -}); -if (canvasMap !== null) { - canvasMap.bindTo('layers', domMap); - canvasMap.bindTo('view', domMap); -} var canvasMousePosition = new ol.control.MousePosition({ coordinateFormat: ol.Coordinate.toStringHDMS, @@ -73,7 +64,15 @@ var canvasMousePosition = new ol.control.MousePosition({ target: document.getElementById('canvasMousePosition'), undefinedHtml: ' ' }); -canvasMousePosition.setMap(canvasMap); +var canvasMap = new ol.Map({ + controls: ol.control.defaults({}, canvasMousePosition), + renderer: ol.RendererHint.CANVAS, + target: 'canvasMap' +}); +if (canvasMap !== null) { + canvasMap.bindTo('layers', domMap); + canvasMap.bindTo('view', domMap); +} var keyboardInteraction = new ol.interaction.Keyboard(); keyboardInteraction.addCallback('0', function() { diff --git a/examples/stamen.js b/examples/stamen.js index 3c947baf84..233c04cdb8 100644 --- a/examples/stamen.js +++ b/examples/stamen.js @@ -22,7 +22,6 @@ var layers = new ol.Collection([ var map = new ol.Map({ layers: layers, renderers: ol.RendererHints.createFromQueryData(), - scaleLineControl: true, target: 'map', view: new ol.View2D({ center: new ol.Coordinate(0, 0), From 671ee79c7452cb135124d4ed3867b6d8be9407c2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Mar 2013 12:24:05 +0100 Subject: [PATCH 06/10] Add ol.interaction.defaults --- src/objectliterals.exports | 20 +++--- src/ol/interaction/defaults.exports | 1 + src/ol/interaction/defaults.js | 101 +++++++++++++++++++++++++++ src/ol/map.js | 103 +--------------------------- test/spec/ol/map.test.js | 7 +- 5 files changed, 120 insertions(+), 112 deletions(-) create mode 100644 src/ol/interaction/defaults.exports create mode 100644 src/ol/interaction/defaults.js diff --git a/src/objectliterals.exports b/src/objectliterals.exports index 862221c424..7ed3f72d17 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -1,19 +1,10 @@ @exportObjectLiteral ol.MapOptions @exportObjectLiteralProperty ol.MapOptions.controls Array.|undefined -@exportObjectLiteralProperty ol.MapOptions.doubleClickZoom boolean|undefined -@exportObjectLiteralProperty ol.MapOptions.dragPan boolean|undefined @exportObjectLiteralProperty ol.MapOptions.interactions ol.Collection|undefined -@exportObjectLiteralProperty ol.MapOptions.keyboard boolean|undefined -@exportObjectLiteralProperty ol.MapOptions.keyboardPanOffset number|undefined @exportObjectLiteralProperty ol.MapOptions.layers ol.Collection|undefined -@exportObjectLiteralProperty ol.MapOptions.mouseWheelZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.renderer ol.RendererHint|undefined @exportObjectLiteralProperty ol.MapOptions.renderers Array.|undefined -@exportObjectLiteralProperty ol.MapOptions.shiftDragZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.target Element|string -@exportObjectLiteralProperty ol.MapOptions.touchPan boolean|undefined -@exportObjectLiteralProperty ol.MapOptions.touchRotate boolean|undefined -@exportObjectLiteralProperty ol.MapOptions.touchZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.view ol.IView|undefined @exportObjectLiteral ol.View2DOptions @@ -81,6 +72,17 @@ @exportObjectLiteralProperty ol.control.ZoomOptions.map ol.Map|undefined @exportObjectLiteralProperty ol.control.ZoomOptions.target Element|undefined +@exportObjectLiteral ol.interaction.DefaultOptions +@exportObjectLiteralProperty ol.interaction.DefaultOptions.doubleClickZoom boolean|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.dragPan boolean|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.keyboard boolean|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.keyboardPanOffset number|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.mouseWheelZoom boolean|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.shiftDragZoom boolean|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.touchPan boolean|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.touchRotate boolean|undefined +@exportObjectLiteralProperty ol.interaction.DefaultOptions.touchZoom boolean|undefined + @exportObjectLiteral ol.layer.LayerOptions @exportObjectLiteralProperty ol.layer.LayerOptions.brightness number|undefined @exportObjectLiteralProperty ol.layer.LayerOptions.contrast number|undefined diff --git a/src/ol/interaction/defaults.exports b/src/ol/interaction/defaults.exports new file mode 100644 index 0000000000..2ab5e46392 --- /dev/null +++ b/src/ol/interaction/defaults.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.defaults ol.interaction.defaults diff --git a/src/ol/interaction/defaults.js b/src/ol/interaction/defaults.js new file mode 100644 index 0000000000..e593c6642f --- /dev/null +++ b/src/ol/interaction/defaults.js @@ -0,0 +1,101 @@ +goog.provide('ol.interaction.defaults'); + +goog.require('ol.Collection'); +goog.require('ol.Kinetic'); +goog.require('ol.interaction.DblClickZoom'); +goog.require('ol.interaction.DragPan'); +goog.require('ol.interaction.DragRotate'); +goog.require('ol.interaction.DragZoom'); +goog.require('ol.interaction.Interaction'); +goog.require('ol.interaction.KeyboardPan'); +goog.require('ol.interaction.KeyboardZoom'); +goog.require('ol.interaction.MouseWheelZoom'); +goog.require('ol.interaction.TouchPan'); +goog.require('ol.interaction.TouchRotate'); +goog.require('ol.interaction.TouchZoom'); +goog.require('ol.interaction.condition'); + + +/** + * @param {ol.interaction.DefaultOptions=} opt_options Options. + * @param {...ol.interaction.Interaction} var_args Further interactions. + * @return {ol.Collection} Interactions. + */ +ol.interaction.defaults = function(opt_options, var_args) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var interactions = new ol.Collection(); + + var rotate = goog.isDef(options.rotate) ? + options.rotate : true; + if (rotate) { + interactions.push(new ol.interaction.DragRotate( + ol.interaction.condition.altShiftKeysOnly)); + } + + var doubleClickZoom = goog.isDef(options.doubleClickZoom) ? + options.doubleClickZoom : true; + if (doubleClickZoom) { + var zoomDelta = goog.isDef(options.zoomDelta) ? + options.zoomDelta : 1; + interactions.push(new ol.interaction.DblClickZoom(zoomDelta)); + } + + var touchPan = goog.isDef(options.touchPan) ? + options.touchPan : true; + if (touchPan) { + interactions.push(new ol.interaction.TouchPan( + new ol.Kinetic(-0.005, 0.05, 100))); + } + + var touchRotate = goog.isDef(options.touchRotate) ? + options.touchRotate : true; + if (touchRotate) { + interactions.push(new ol.interaction.TouchRotate()); + } + + var touchZoom = goog.isDef(options.touchZoom) ? + options.touchZoom : true; + if (touchZoom) { + interactions.push(new ol.interaction.TouchZoom()); + } + + var dragPan = goog.isDef(options.dragPan) ? + options.dragPan : true; + if (dragPan) { + interactions.push( + new ol.interaction.DragPan(ol.interaction.condition.noModifierKeys, + new ol.Kinetic(-0.005, 0.05, 100))); + } + + var keyboard = goog.isDef(options.keyboard) ? + options.keyboard : true; + var keyboardPanOffset = goog.isDef(options.keyboardPanOffset) ? + options.keyboardPanOffset : 80; + if (keyboard) { + interactions.push(new ol.interaction.KeyboardPan(keyboardPanOffset)); + interactions.push(new ol.interaction.KeyboardZoom()); + } + + var mouseWheelZoom = goog.isDef(options.mouseWheelZoom) ? + options.mouseWheelZoom : true; + if (mouseWheelZoom) { + interactions.push(new ol.interaction.MouseWheelZoom()); + } + + var shiftDragZoom = goog.isDef(options.shiftDragZoom) ? + options.shiftDragZoom : true; + if (shiftDragZoom) { + interactions.push( + new ol.interaction.DragZoom(ol.interaction.condition.shiftKeyOnly)); + } + + var i; + for (i = 1; i < arguments.length; ++i) { + interactions.push(arguments[i]); + } + + return interactions; + +}; diff --git a/src/ol/map.js b/src/ol/map.js index e222431466..066ab6d0b0 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -27,7 +27,6 @@ goog.require('ol.Coordinate'); goog.require('ol.Extent'); goog.require('ol.FrameState'); goog.require('ol.IView'); -goog.require('ol.Kinetic'); goog.require('ol.MapBrowserEvent'); goog.require('ol.MapBrowserEvent.EventType'); goog.require('ol.MapBrowserEventHandler'); @@ -44,18 +43,7 @@ goog.require('ol.TileQueue'); goog.require('ol.View'); goog.require('ol.View2D'); goog.require('ol.control.defaults'); -goog.require('ol.interaction.DblClickZoom'); -goog.require('ol.interaction.DragPan'); -goog.require('ol.interaction.DragRotate'); -goog.require('ol.interaction.DragZoom'); -goog.require('ol.interaction.Interaction'); -goog.require('ol.interaction.KeyboardPan'); -goog.require('ol.interaction.KeyboardZoom'); -goog.require('ol.interaction.MouseWheelZoom'); -goog.require('ol.interaction.TouchPan'); -goog.require('ol.interaction.TouchRotate'); -goog.require('ol.interaction.TouchZoom'); -goog.require('ol.interaction.condition'); +goog.require('ol.interaction.defaults'); goog.require('ol.layer.Layer'); goog.require('ol.projection'); goog.require('ol.projection.addCommonProjections'); @@ -881,15 +869,8 @@ ol.Map.createOptionsInternal = function(mapOptions) { var controls = goog.isDef(mapOptions.controls) ? mapOptions.controls : ol.control.defaults(); - /** - * @type {ol.Collection} - */ - var interactions; - if (goog.isDef(mapOptions.interactions)) { - interactions = mapOptions.interactions; - } else { - interactions = ol.Map.createInteractions_(mapOptions); - } + var interactions = goog.isDef(mapOptions.interactions) ? + mapOptions.interactions : ol.interaction.defaults(); /** * @type {Element} @@ -907,84 +888,6 @@ ol.Map.createOptionsInternal = function(mapOptions) { }; -/** - * @private - * @param {ol.MapOptions} mapOptions Map options. - * @return {ol.Collection} Interactions. - */ -ol.Map.createInteractions_ = function(mapOptions) { - - var interactions = new ol.Collection(); - - var rotate = goog.isDef(mapOptions.rotate) ? - mapOptions.rotate : true; - if (rotate) { - interactions.push(new ol.interaction.DragRotate( - ol.interaction.condition.altShiftKeysOnly)); - } - - var doubleClickZoom = goog.isDef(mapOptions.doubleClickZoom) ? - mapOptions.doubleClickZoom : true; - if (doubleClickZoom) { - var zoomDelta = goog.isDef(mapOptions.zoomDelta) ? - mapOptions.zoomDelta : 1; - interactions.push(new ol.interaction.DblClickZoom(zoomDelta)); - } - - var touchPan = goog.isDef(mapOptions.touchPan) ? - mapOptions.touchPan : true; - if (touchPan) { - interactions.push(new ol.interaction.TouchPan( - new ol.Kinetic(-0.005, 0.05, 100))); - } - - var touchRotate = goog.isDef(mapOptions.touchRotate) ? - mapOptions.touchRotate : true; - if (touchRotate) { - interactions.push(new ol.interaction.TouchRotate()); - } - - var touchZoom = goog.isDef(mapOptions.touchZoom) ? - mapOptions.touchZoom : true; - if (touchZoom) { - interactions.push(new ol.interaction.TouchZoom()); - } - - var dragPan = goog.isDef(mapOptions.dragPan) ? - mapOptions.dragPan : true; - if (dragPan) { - interactions.push( - new ol.interaction.DragPan(ol.interaction.condition.noModifierKeys, - new ol.Kinetic(-0.005, 0.05, 100))); - } - - var keyboard = goog.isDef(mapOptions.keyboard) ? - mapOptions.keyboard : true; - var keyboardPanOffset = goog.isDef(mapOptions.keyboardPanOffset) ? - mapOptions.keyboardPanOffset : 80; - if (keyboard) { - interactions.push(new ol.interaction.KeyboardPan(keyboardPanOffset)); - interactions.push(new ol.interaction.KeyboardZoom()); - } - - var mouseWheelZoom = goog.isDef(mapOptions.mouseWheelZoom) ? - mapOptions.mouseWheelZoom : true; - if (mouseWheelZoom) { - interactions.push(new ol.interaction.MouseWheelZoom()); - } - - var shiftDragZoom = goog.isDef(mapOptions.shiftDragZoom) ? - mapOptions.shiftDragZoom : true; - if (shiftDragZoom) { - interactions.push( - new ol.interaction.DragZoom(ol.interaction.condition.shiftKeyOnly)); - } - - return interactions; - -}; - - /** * @param {goog.Uri.QueryData=} opt_queryData Query data. * @return {Array.} Renderer hints. diff --git a/test/spec/ol/map.test.js b/test/spec/ol/map.test.js index 38e5758437..388ba11a43 100644 --- a/test/spec/ol/map.test.js +++ b/test/spec/ol/map.test.js @@ -87,7 +87,7 @@ describe('ol.Map', function() { describe('create mousewheel interaction', function() { it('creates mousewheel interaction', function() { options.mouseWheelZoom = true; - var interactions = ol.Map.createInteractions_(options); + var interactions = ol.interaction.defaults(options); expect(interactions.getLength()).toEqual(1); expect(interactions.getAt(0)).toBeA(ol.interaction.MouseWheelZoom); }); @@ -101,7 +101,7 @@ describe('ol.Map', function() { describe('default zoomDelta', function() { it('create double click interaction with default delta', function() { - var interactions = ol.Map.createInteractions_(options); + var interactions = ol.interaction.defaults(options); expect(interactions.getLength()).toEqual(1); expect(interactions.getAt(0)).toBeA(ol.interaction.DblClickZoom); expect(interactions.getAt(0).delta_).toEqual(1); @@ -111,7 +111,7 @@ describe('ol.Map', function() { describe('set zoomDelta', function() { it('create double click interaction with set delta', function() { options.zoomDelta = 7; - var interactions = ol.Map.createInteractions_(options); + var interactions = ol.interaction.defaults(options); expect(interactions.getLength()).toEqual(1); expect(interactions.getAt(0)).toBeA(ol.interaction.DblClickZoom); expect(interactions.getAt(0).delta_).toEqual(7); @@ -233,5 +233,6 @@ goog.require('ol.RendererHints'); goog.require('ol.View2D'); goog.require('ol.interaction.DblClickZoom'); goog.require('ol.interaction.MouseWheelZoom'); +goog.require('ol.interaction.defaults'); goog.require('ol.layer.TileLayer'); goog.require('ol.source.XYZ'); From c9cce578952fb73691d242751a4ea9df1b57f4ae Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Mar 2013 13:06:35 +0100 Subject: [PATCH 07/10] Add comment about ugly typecast --- examples/epsg-4326.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/epsg-4326.js b/examples/epsg-4326.js index c846d892fa..5219ed456a 100644 --- a/examples/epsg-4326.js +++ b/examples/epsg-4326.js @@ -27,6 +27,7 @@ var layers = new ol.Collection([ var map = new ol.Map({ controls: ol.control.defaults({ scaleLine: true, + // FIXME The typecast here is only needed if the example is compiled scaleLineOptions: /** @type {ol.control.ScaleLineOptions} */ ({ units: ol.control.ScaleLineUnits.DEGREES }) From 23f00975173fbce2e2f9f49d8d23988bc807990c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Mar 2013 13:18:34 +0100 Subject: [PATCH 08/10] Add ol.Collection.extend --- src/ol/collection.js | 11 +++++++++++ test/spec/ol/collection.test.js | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/ol/collection.js b/src/ol/collection.js index 86c331302f..f8cf78ddab 100644 --- a/src/ol/collection.js +++ b/src/ol/collection.js @@ -99,6 +99,17 @@ ol.Collection.prototype.clear = function() { }; +/** + * @param {Array} arr Array. + */ +ol.Collection.prototype.extend = function(arr) { + var i; + for (i = 0; i < arr.length; ++i) { + this.push(arr[i]); + } +}; + + /** * @param {Function} f Function. * @param {Object=} opt_obj Object. diff --git a/test/spec/ol/collection.test.js b/test/spec/ol/collection.test.js index a5923b540d..81ef412fbb 100644 --- a/test/spec/ol/collection.test.js +++ b/test/spec/ol/collection.test.js @@ -235,6 +235,17 @@ describe('ol.collection', function() { }); }); }); + + describe('extending a collection', function() { + it('adds elements to end of the collection', function() { + collection.extend([1, 2]); + expect(collection.getLength()).toEqual(2); + expect(goog.array.equals(collection.getArray(), [1, 2])).toBeTruthy(); + expect(collection.getAt(0)).toEqual(1); + expect(collection.getAt(1)).toEqual(2); + }); + }); + }); goog.require('goog.array'); From 363cb87e1a510258fefc7bd3b6f97be459241153 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Mar 2013 13:19:34 +0100 Subject: [PATCH 09/10] Use an array to specify additional controls --- examples/side-by-side.js | 6 +++--- src/ol/control/defaults.js | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/side-by-side.js b/examples/side-by-side.js index 8f9e322664..983c8e1528 100644 --- a/examples/side-by-side.js +++ b/examples/side-by-side.js @@ -34,7 +34,7 @@ var domMousePosition = new ol.control.MousePosition({ undefinedHTML: ' ' }); var domMap = new ol.Map({ - controls: ol.control.defaults({}, domMousePosition), + controls: ol.control.defaults({}, [domMousePosition]), layers: new ol.Collection([layer]), renderer: ol.RendererHint.DOM, target: 'domMap', @@ -48,7 +48,7 @@ var webglMousePosition = new ol.control.MousePosition({ undefinedHTML: ' ' }); var webglMap = new ol.Map({ - controls: ol.control.defaults({}, webglMousePosition), + controls: ol.control.defaults({}, [webglMousePosition]), renderer: ol.RendererHint.WEBGL, target: 'webglMap' }); @@ -65,7 +65,7 @@ var canvasMousePosition = new ol.control.MousePosition({ undefinedHtml: ' ' }); var canvasMap = new ol.Map({ - controls: ol.control.defaults({}, canvasMousePosition), + controls: ol.control.defaults({}, [canvasMousePosition]), renderer: ol.RendererHint.CANVAS, target: 'canvasMap' }); diff --git a/src/ol/control/defaults.js b/src/ol/control/defaults.js index 983e279be1..6217c59a7a 100644 --- a/src/ol/control/defaults.js +++ b/src/ol/control/defaults.js @@ -1,5 +1,6 @@ goog.provide('ol.control.defaults'); +goog.require('goog.array'); goog.require('ol.control.Attribution'); goog.require('ol.control.ScaleLine'); goog.require('ol.control.Zoom'); @@ -7,10 +8,10 @@ goog.require('ol.control.Zoom'); /** * @param {ol.control.DefaultsOptions=} opt_options Options. - * @param {...ol.control.Control} var_args Further controls. + * @param {Array.=} opt_controls Additional controls. * @return {Array.} Controls. */ -ol.control.defaults = function(opt_options, var_args) { +ol.control.defaults = function(opt_options, opt_controls) { var options = goog.isDef(opt_options) ? opt_options : {}; @@ -41,9 +42,8 @@ ol.control.defaults = function(opt_options, var_args) { controls.push(new ol.control.Zoom(zoomControlOptions)); } - var i; - for (i = 1; i < arguments.length; ++i) { - controls.push(arguments[i]); + if (goog.isDef(opt_controls)) { + goog.array.extend(controls, opt_controls); } return controls; From 38eaa9cfb2e002da856469e60d1c34267b489cfe Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Mar 2013 13:19:50 +0100 Subject: [PATCH 10/10] Use an array to specify additional interactions --- src/ol/interaction/defaults.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ol/interaction/defaults.js b/src/ol/interaction/defaults.js index e593c6642f..e776f9e1d0 100644 --- a/src/ol/interaction/defaults.js +++ b/src/ol/interaction/defaults.js @@ -18,10 +18,11 @@ goog.require('ol.interaction.condition'); /** * @param {ol.interaction.DefaultOptions=} opt_options Options. - * @param {...ol.interaction.Interaction} var_args Further interactions. + * @param {Array.=} opt_interactions Additional + * interactions. * @return {ol.Collection} Interactions. */ -ol.interaction.defaults = function(opt_options, var_args) { +ol.interaction.defaults = function(opt_options, opt_interactions) { var options = goog.isDef(opt_options) ? opt_options : {}; @@ -91,9 +92,8 @@ ol.interaction.defaults = function(opt_options, var_args) { new ol.interaction.DragZoom(ol.interaction.condition.shiftKeyOnly)); } - var i; - for (i = 1; i < arguments.length; ++i) { - interactions.push(arguments[i]); + if (goog.isDef(opt_interactions)) { + interactions.extend(opt_interactions); } return interactions;