diff --git a/Makefile b/Makefile index 244819f532..68f9762a1c 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ PHANTOMJS = phantomjs PLOVR_JAR = bin/plovr-b254c26318c5.jar SPEC = $(shell find test/spec -name \*.js) SRC = $(shell find exports externs src/ol -name \*.js) +INTERNAL_SRC = build/src/internal/src/requireall.js build/src/internal/src/types.js EXAMPLES = $(shell find examples -maxdepth 1 -name \*.html) comma := , empty := @@ -20,7 +21,7 @@ build: build/ol.css build/ol.js build/ol.css: build/ol.js touch $@ -build/ol.js: $(PLOVR_JAR) $(SRC) base.json build/ol.json build/src/externs.js build/src/literals.js +build/ol.js: $(PLOVR_JAR) $(SRC) base.json build/ol.json build/src/external/externs/types.js java -jar $(PLOVR_JAR) build build/ol.json >$@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes @@ -28,25 +29,26 @@ build/ol.js: $(PLOVR_JAR) $(SRC) base.json build/ol.json build/src/externs.js bu .PHONY: build-all build-all: build/ol-all.js -build/ol-all.js: $(PLOVR_JAR) $(SRC) base.json build/ol-all.json build/require-all.js build/src/externs.js build/src/literals.js +build/ol-all.js: $(PLOVR_JAR) $(SRC) $(INTERNAL_SRC) base.json build/ol-all.json java -jar $(PLOVR_JAR) build build/ol-all.json >$@ || ( rm -f $@ ; false ) -build/require-all.js: $(SRC) +build/src/external/externs/types.js: bin/generate-src src/ol/literals.txt + mkdir -p $(dir $@) + bin/generate-src --externs src/ol/literals.txt >$@ + +build/src/internal/src/requireall.js: $(SRC) + mkdir -p $(dir $@) ( echo "goog.require('goog.dom');" ; find src/ol -name \*.js | xargs grep -rh ^goog.provide | sort | uniq | sed -e 's/provide/require/g' ) >$@ -build/src/externs.js: bin/generate-externs src/ol/literals.txt +build/src/internal/src/types.js: bin/generate-src src/ol/literals.txt mkdir -p $(dir $@) - bin/generate-externs --externs src/ol/literals.txt >$@ - -build/src/literals.js: bin/generate-externs src/ol/literals.txt - mkdir -p $(dir $@) - bin/generate-externs --typedef src/ol/literals.txt >$@ + bin/generate-src --typedef src/ol/literals.txt >$@ .PHONY: examples examples: $(subst .html,.json,$(EXAMPLES)) -examples/%.json: base.json - @echo "{\"id\": \"$(basename $(notdir $@))\", \"inherits\": \"../base.json\", \"inputs\": \"$(subst .json,.js,$@)\"}" > $@ +examples/%.json: Makefile base.json + echo "{\"id\": \"$(basename $(notdir $@))\", \"inherits\": \"../base.json\", \"inputs\": [\"$(subst .json,.js,$@)\", \"build/src/internal/src/types.js\"]}" > $@ examples/%.combined.js: $(PLOVR_JAR) base.json examples/%.js java -jar $(PLOVR_JAR) build $(subst .combined.js,.json,$@) >$@ @@ -54,18 +56,18 @@ examples/%.combined.js: $(PLOVR_JAR) base.json examples/%.js @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes .PHONY: serve -serve: $(PLOVR_JAR) build/require-all.js examples +serve: $(PLOVR_JAR) $(INTERNAL_SRC) examples java -jar $(PLOVR_JAR) serve build/*.json examples/*.json .PHONY: serve-precommit -serve-precommit: $(PLOVR_JAR) +serve-precommit: $(PLOVR_JAR) $(INTERNAL_SRC) java -jar $(PLOVR_JAR) serve build/ol.json .PHONY: lint lint: build/lint-src-timestamp build/lint-spec-timestamp -build/lint-src-timestamp: $(SRC) - gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC) $(filter-out $(shell find examples -name \*.combined.js),$(shell find examples -name \*.js)) && touch $@ +build/lint-src-timestamp: $(SRC) $(INTERNAL_SRC) + gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC) $(INTERNAL_SRC) $(filter-out $(shell find examples -name \*.combined.js),$(shell find examples -name \*.js)) && touch $@ build/lint-spec-timestamp: $(SPEC) gjslint $(SPEC) && touch $@ @@ -86,7 +88,7 @@ doc: $(JSDOC) -t doc/template -r src -d build/gh-pages/$(shell git rev-parse --abbrev-ref HEAD)/apidoc .PHONY: test -test: +test: $(INTERNAL_SRC) $(PHANTOMJS) test/phantom-jasmine/run_jasmine_test.coffee test/ol.html clean: @@ -95,8 +97,7 @@ clean: rm -f build/ol.css rm -f build/ol.js rm -f build/ol-all.js - rm -f build/require-all.js - rm -f build/src/* + rm -rf build/src rm -f examples/*.json rm -f examples/*.combined.js rm -rf build/apidoc diff --git a/base.json b/base.json index f33513673d..e0f8102db4 100644 --- a/base.json +++ b/base.json @@ -49,7 +49,7 @@ "mode": "ADVANCED", "paths": [ - "build/src", + "build/src/internal/src", "src" ], diff --git a/bin/generate-externs b/bin/generate-src similarity index 88% rename from bin/generate-externs rename to bin/generate-src index cdc93c3281..3b4c0a1595 100755 --- a/bin/generate-externs +++ b/bin/generate-src @@ -1,6 +1,7 @@ #!/usr/bin/env python import fileinput +from operator import attrgetter from optparse import OptionParser import re import sys @@ -29,7 +30,7 @@ class Type(object): return ''.join(lines) def provide(self): - return 'goog.provide(\'%s\');\n' % (self.name,) + return 'goog.provide(\'%sType\');\n' % (self.name,) def typedef(self): lines = [] @@ -61,12 +62,7 @@ def main(argv): continue m = re.match('@externtype\s*(?P\S+)\Z', line) if m: - name = m.group('name') - if options.externs: - name = re.sub('\Aol\.', 'olx.', name + 'Extern') - if options.typedef: - name = name + 'Literal' - type = Type(name) + type = Type(m.group('name')) types.append(type) continue m = re.match('(?P\S+):\s+(?P\S+)', line) @@ -74,6 +70,7 @@ def main(argv): type.members[m.group('key')] = m.group('value') continue raise RuntimeError(line) + types = sorted(types, key=attrgetter('name')) if options.externs: sys.stdout.write('/**\n') @@ -91,7 +88,8 @@ def main(argv): sys.stdout.write(type.extern()) if options.typedef: - sys.stdout.write(''.join(type.provide() for type in types)) + for type in types: + sys.stdout.write(type.provide()) for type in types: sys.stdout.write('\n\n') sys.stdout.write(type.typedef()) diff --git a/build/ol-all.json b/build/ol-all.json index 0a7bb8e5a5..c0d94fd4e6 100644 --- a/build/ol-all.json +++ b/build/ol-all.json @@ -5,7 +5,8 @@ "inherits": "../base.json", "inputs": [ - "build/require-all.js" + "build/src/internal/src/requireall.js", + "build/src/internal/src/types.js" ] } diff --git a/build/ol.json b/build/ol.json index f9c8f085f3..36c7de3596 100644 --- a/build/ol.json +++ b/build/ol.json @@ -13,7 +13,7 @@ "css-output-file": "build/ol.css", "externs": [ - "build/src/externs.js", + "build/src/external/externs/types.js", "externs/bingmaps.js", "externs/proj4js.js", "externs/tilejson.js" @@ -22,7 +22,6 @@ "inherits": "../base.json", "inputs": [ - "src/ol/mapoptions.js", "exports/ol/collection.js", "exports/ol/coordinate.js", "exports/ol/extent.js", @@ -36,6 +35,10 @@ "exports/ol/source/stamen.js" ], - "output-wrapper": "(function(){%output%})();" + "output-wrapper": "(function(){%output%})();", + + "paths": [ + "src" + ] } diff --git a/examples/full-screen.js b/examples/full-screen.js index 9e7a96e25e..17393d47b0 100644 --- a/examples/full-screen.js +++ b/examples/full-screen.js @@ -5,7 +5,6 @@ goog.require('ol.Collection'); goog.require('ol.Coordinate'); goog.require('ol.CoordinateFormat'); goog.require('ol.Map'); -goog.require('ol.MapOptions'); // FIXME this should not be required goog.require('ol.overlay.Overlay'); goog.require('ol.source.MapQuestOpenAerial'); diff --git a/exports/ol/map.js b/exports/ol/map.js index 763ebd1468..87284b96ad 100644 --- a/exports/ol/map.js +++ b/exports/ol/map.js @@ -1,41 +1,3 @@ goog.require('ol.Map'); - - -/** - * @constructor - * @extends {ol.Map} - * @param {Element} container Container. - * @param {olx.MapOptionsExtern} mapOptionsExtern Map options literal. - */ -ol.MapExport = function(container, mapOptionsExtern) { - - goog.base(this, container, { - center: mapOptionsExtern.center, - controls: mapOptionsExtern.controls, - doubleClickZoom: mapOptionsExtern.doubleClickZoom, - dragPan: mapOptionsExtern.dragPan, - interactions: mapOptionsExtern.interactions, - keyboard: mapOptionsExtern.keyboard, - keyboardPanOffset: mapOptionsExtern.keyboardPanOffset, - layers: mapOptionsExtern.layers, - maxResolution: mapOptionsExtern.maxResolution, - mouseWheelZoom: mapOptionsExtern.mouseWheelZoom, - mouseWheelZoomDelta: mapOptionsExtern.mouseWheelZoomDelta, - projection: mapOptionsExtern.projection, - renderer: mapOptionsExtern.renderer, - renderers: mapOptionsExtern.renderers, - resolution: mapOptionsExtern.resolution, - resolutions: mapOptionsExtern.resolutions, - rotate: mapOptionsExtern.rotate, - shiftDragZoom: mapOptionsExtern.shiftDragZoom, - userProjection: mapOptionsExtern.userProjection, - zoom: mapOptionsExtern.zoom, - zoomDelta: mapOptionsExtern.zoomDelta, - zoomFactor: mapOptionsExtern.zoomFactor - }); - -}; -goog.inherits(ol.MapExport, ol.Map); - -goog.exportSymbol('ol.Map', ol.MapExport); +goog.exportSymbol('ol.Map', ol.Map); diff --git a/src/ol/control/attribution.js b/src/ol/control/attribution.js index 2822fadc5c..872ad7d921 100644 --- a/src/ol/control/attribution.js +++ b/src/ol/control/attribution.js @@ -14,7 +14,6 @@ goog.require('goog.object'); goog.require('goog.style'); goog.require('ol.Collection'); goog.require('ol.CoverageArea'); -goog.require('ol.MapProperty'); goog.require('ol.TileCoverageArea'); goog.require('ol.control.Control'); goog.require('ol.layer.Layer'); diff --git a/src/ol/control/control.js b/src/ol/control/control.js index e4f239c536..a640b2beca 100644 --- a/src/ol/control/control.js +++ b/src/ol/control/control.js @@ -2,7 +2,6 @@ goog.provide('ol.control.Control'); goog.provide('ol.control.ControlOptions'); goog.require('goog.Disposable'); -goog.require('ol.Map'); /** diff --git a/src/ol/control/mouseposition.js b/src/ol/control/mouseposition.js index 83d9189bba..be50da0ee7 100644 --- a/src/ol/control/mouseposition.js +++ b/src/ol/control/mouseposition.js @@ -6,7 +6,6 @@ goog.provide('ol.control.MousePositionOptions'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.style'); -goog.require('ol.MapProperty'); goog.require('ol.Object'); goog.require('ol.Pixel'); goog.require('ol.Projection'); diff --git a/src/ol/literals.txt b/src/ol/literals.txt index baa36464ef..3bd1a15325 100644 --- a/src/ol/literals.txt +++ b/src/ol/literals.txt @@ -1,4 +1,4 @@ -@externtype ol.MapOptions +@externtype olx.MapOptions center: ol.Coordinate|undefined controls: ol.Collection|undefined doubleClickZoom: boolean|undefined diff --git a/src/ol/map.js b/src/ol/map.js index 876e29a147..c24cb388b8 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -5,6 +5,7 @@ goog.provide('ol.Map'); goog.provide('ol.MapEventType'); goog.provide('ol.MapProperty'); +goog.provide('ol.RendererHint'); goog.require('goog.array'); goog.require('goog.debug.Logger'); @@ -34,10 +35,56 @@ goog.require('ol.MapBrowserEvent'); goog.require('ol.Object'); goog.require('ol.Pixel'); goog.require('ol.Projection'); +goog.require('ol.ResolutionConstraint'); +goog.require('ol.RotationConstraint'); goog.require('ol.Size'); goog.require('ol.TransformFunction'); +goog.require('ol.control.Attribution'); +goog.require('ol.control.Zoom'); +goog.require('ol.interaction.AltDragRotate'); +goog.require('ol.interaction.DblClickZoom'); +goog.require('ol.interaction.DragPan'); goog.require('ol.interaction.Interaction'); +goog.require('ol.interaction.KeyboardPan'); +goog.require('ol.interaction.KeyboardZoom'); +goog.require('ol.interaction.MouseWheelZoom'); +goog.require('ol.interaction.ShiftDragZoom'); goog.require('ol.renderer.Layer'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.dom'); +goog.require('ol.renderer.dom.Map'); +goog.require('ol.renderer.webgl'); +goog.require('ol.renderer.webgl.Map'); + + +/** + * @define {boolean} Whether to enable DOM. + */ +ol.ENABLE_DOM = true; + + +/** + * @define {boolean} Whether to enable WebGL. + */ +ol.ENABLE_WEBGL = true; + + +/** + * @enum {string} + */ +ol.RendererHint = { + DOM: 'dom', + WEBGL: 'webgl' +}; + + +/** + * @type {Array.} + */ +ol.DEFAULT_RENDERER_HINTS = [ + ol.RendererHint.WEBGL, + ol.RendererHint.DOM +]; /** @@ -48,6 +95,16 @@ ol.MapEventType = { }; +/** + * @typedef {{controls: ol.Collection, + * constraints: ol.Constraints, + * rendererConstructor: + * function(new: ol.renderer.Map, Element, ol.Map), + * values: Object.}} + */ +ol.MapOptionsInternal; + + /** * @enum {string} */ @@ -70,9 +127,9 @@ ol.MapProperty = { * @extends {ol.Object} * @implements {goog.fx.anim.Animated} * @param {Element} container Container. - * @param {ol.MapOptionsLiteral} mapOptionsLiteral Map options literal. + * @param {olx.MapOptions} mapOptions Map options. */ -ol.Map = function(container, mapOptionsLiteral) { +ol.Map = function(container, mapOptions) { goog.base(this); @@ -84,7 +141,7 @@ ol.Map = function(container, mapOptionsLiteral) { this.logger = goog.debug.Logger.getLogger('ol.map.' + goog.getUid(this)); } - var mapOptions = ol.MapOptions.create(mapOptionsLiteral); + var mapOptionsInternal = ol.Map.createOptionsInternal(mapOptions); /** * @type {ol.TransformFunction} @@ -132,7 +189,7 @@ ol.Map = function(container, mapOptionsLiteral) { * @private * @type {ol.Constraints} */ - this.constraints_ = mapOptions.constraints; + this.constraints_ = mapOptionsInternal.constraints; /** * @private @@ -184,7 +241,7 @@ ol.Map = function(container, mapOptionsLiteral) { * @type {ol.Collection} * @private */ - this.controls_ = mapOptions.controls; + this.controls_ = mapOptionsInternal.controls; goog.events.listen(this.controls_, ol.CollectionEventType.ADD, this.handleControlsAdd_, false, this); @@ -195,7 +252,8 @@ ol.Map = function(container, mapOptionsLiteral) { * @type {ol.renderer.Map} * @private */ - this.renderer_ = new mapOptions.rendererConstructor(this.viewport_, this); + this.renderer_ = + new mapOptionsInternal.rendererConstructor(this.viewport_, this); this.registerDisposable(this.renderer_); /** @@ -214,7 +272,7 @@ ol.Map = function(container, mapOptionsLiteral) { this, ol.Object.getChangedEventType(ol.MapProperty.USER_PROJECTION), this.handleUserProjectionChanged, false, this); - this.setValues(mapOptions.values); + this.setValues(mapOptionsInternal.values); this.handleBrowserWindowResize(); @@ -903,3 +961,229 @@ ol.Map.prototype.zoomToResolution = function(resolution, opt_anchor) { resolution = this.constraints_.resolution(resolution, 0); this.zoom_(resolution, opt_anchor); }; + + +/** + * @param {olx.MapOptions} mapOptions Map options. + * @return {ol.MapOptionsInternal} Map options. + */ +ol.Map.createOptionsInternal = function(mapOptions) { + + /** + * @type {Object.} + */ + var values = {}; + + if (goog.isDef(mapOptions.center)) { + values[ol.MapProperty.CENTER] = mapOptions.center; + } + + values[ol.MapProperty.INTERACTIONS] = + goog.isDef(mapOptions.interactions) ? + mapOptions.interactions : + ol.Map.createInteractions_(mapOptions); + + values[ol.MapProperty.LAYERS] = goog.isDef(mapOptions.layers) ? + mapOptions.layers : new ol.Collection(); + + values[ol.MapProperty.PROJECTION] = ol.Map.createProjection_( + mapOptions.projection, 'EPSG:3857'); + + if (goog.isDef(mapOptions.resolution)) { + values[ol.MapProperty.RESOLUTION] = mapOptions.resolution; + } else if (goog.isDef(mapOptions.zoom)) { + values[ol.MapProperty.RESOLUTION] = + ol.Projection.EPSG_3857_HALF_SIZE / (128 << mapOptions.zoom); + } + + values[ol.MapProperty.USER_PROJECTION] = ol.Map.createProjection_( + mapOptions.userProjection, 'EPSG:4326'); + + /** + * @type {function(new: ol.renderer.Map, Element, ol.Map)} + */ + var rendererConstructor = ol.renderer.Map; + + /** + * @type {Array.} + */ + var rendererHints; + if (goog.isDef(mapOptions.renderers)) { + rendererHints = mapOptions.renderers; + } else if (goog.isDef(mapOptions.renderer)) { + rendererHints = [mapOptions.renderer]; + } else { + rendererHints = ol.DEFAULT_RENDERER_HINTS; + } + + var i, rendererHint; + for (i = 0; i < rendererHints.length; ++i) { + rendererHint = rendererHints[i]; + if (rendererHint == ol.RendererHint.DOM) { + if (ol.ENABLE_DOM && ol.renderer.dom.isSupported()) { + rendererConstructor = ol.renderer.dom.Map; + break; + } + } else if (rendererHint == ol.RendererHint.WEBGL) { + if (ol.ENABLE_WEBGL && ol.renderer.webgl.isSupported()) { + rendererConstructor = ol.renderer.webgl.Map; + break; + } + } + } + + /** + * @type {ol.Constraints} + */ + var constraints = ol.Map.createConstraints_(mapOptions); + + /** + * @type {ol.Collection} + */ + var controls; + if (goog.isDef(mapOptions.controls)) { + controls = mapOptions.controls; + } else { + controls = ol.Map.createControls_(mapOptions); + } + + return { + constraints: constraints, + controls: controls, + rendererConstructor: rendererConstructor, + values: values + }; + +}; + + +/** + * @private + * @param {olx.MapOptions} mapOptions Map options. + * @return {ol.Constraints} Map constraints. + */ +ol.Map.createConstraints_ = function(mapOptions) { + var resolutionConstraint; + if (goog.isDef(mapOptions.resolutions)) { + resolutionConstraint = ol.ResolutionConstraint.createSnapToResolutions( + mapOptions.resolutions); + } else { + var maxResolution, numZoomLevels, zoomFactor; + if (goog.isDef(mapOptions.maxResolution) && + goog.isDef(mapOptions.numZoomLevels) && + goog.isDef(mapOptions.zoomFactor)) { + maxResolution = mapOptions.maxResolution; + numZoomLevels = mapOptions.numZoomLevels; + zoomFactor = mapOptions.zoomFactor; + } else { + maxResolution = ol.Projection.EPSG_3857_HALF_SIZE / 128; + // number of steps we want between two data resolutions + var numSteps = 4; + numZoomLevels = 29 * numSteps; + zoomFactor = Math.exp(Math.log(2) / numSteps); + } + resolutionConstraint = ol.ResolutionConstraint.createSnapToPower( + zoomFactor, maxResolution, numZoomLevels - 1); + } + // FIXME rotation constraint is not configurable at the moment + var rotationConstraint = ol.RotationConstraint.none; + return new ol.Constraints(resolutionConstraint, rotationConstraint); +}; + + +/** + * @private + * @param {olx.MapOptions} mapOptions Map options. + * @return {ol.Collection} Controls. + */ +ol.Map.createControls_ = function(mapOptions) { + + var controls = new ol.Collection(); + + controls.push(new ol.control.Attribution({})); + + var zoomDelta = goog.isDef(mapOptions.zoomDelta) ? + mapOptions.zoomDelta : 4; + controls.push(new ol.control.Zoom({ + delta: zoomDelta + })); + + return controls; + +}; + + +/** + * @private + * @param {olx.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.AltDragRotate()); + } + + var doubleClickZoom = goog.isDef(mapOptions.doubleClickZoom) ? + mapOptions.doubleClickZoom : true; + if (doubleClickZoom) { + var zoomDelta = goog.isDef(mapOptions.zoomDelta) ? + mapOptions.zoomDelta : 4; + interactions.push(new ol.interaction.DblClickZoom(zoomDelta)); + } + + var dragPan = goog.isDef(mapOptions.dragPan) ? + mapOptions.dragPan : true; + if (dragPan) { + interactions.push(new ol.interaction.DragPan()); + } + + 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) { + var mouseWheelZoomDelta = + goog.isDef(mapOptions.mouseWheelZoomDelta) ? + mapOptions.mouseWheelZoomDelta : 1; + interactions.push(new ol.interaction.MouseWheelZoom(mouseWheelZoomDelta)); + } + + var shiftDragZoom = goog.isDef(mapOptions.shiftDragZoom) ? + mapOptions.shiftDragZoom : true; + if (shiftDragZoom) { + interactions.push(new ol.interaction.ShiftDragZoom()); + } + + return interactions; + +}; + + +/** + * @private + * @param {ol.Projection|string|undefined} projection Projection. + * @param {string} defaultCode Default code. + * @return {ol.Projection} Projection. + */ +ol.Map.createProjection_ = function(projection, defaultCode) { + if (!goog.isDefAndNotNull(projection)) { + return ol.Projection.getFromCode(defaultCode); + } else if (goog.isString(projection)) { + return ol.Projection.getFromCode(projection); + } else { + goog.asserts.assert(projection instanceof ol.Projection); + return projection; + } +}; diff --git a/src/ol/mapoptions.js b/src/ol/mapoptions.js deleted file mode 100644 index 7fd20a4b62..0000000000 --- a/src/ol/mapoptions.js +++ /dev/null @@ -1,293 +0,0 @@ -// FIXME rotation constraint is not configurable at the moment -// FIXME MapOptions should create a Zoom control - -goog.provide('ol.MapOptions'); -goog.provide('ol.MapOptionsType'); -goog.provide('ol.RendererHint'); - -goog.require('ol.Collection'); -goog.require('ol.Constraints'); -goog.require('ol.MapOptionsLiteral'); -goog.require('ol.Projection'); -goog.require('ol.ResolutionConstraint'); -goog.require('ol.RotationConstraint'); -goog.require('ol.control.Attribution'); -goog.require('ol.control.Zoom'); -goog.require('ol.interaction.AltDragRotate'); -goog.require('ol.interaction.DblClickZoom'); -goog.require('ol.interaction.DragPan'); -goog.require('ol.interaction.KeyboardPan'); -goog.require('ol.interaction.KeyboardZoom'); -goog.require('ol.interaction.MouseWheelZoom'); -goog.require('ol.interaction.ShiftDragZoom'); -goog.require('ol.renderer.Map'); -goog.require('ol.renderer.dom'); -goog.require('ol.renderer.dom.Map'); -goog.require('ol.renderer.webgl'); -goog.require('ol.renderer.webgl.Map'); - - -/** - * @define {boolean} Whether to enable DOM. - */ -ol.ENABLE_DOM = true; - - -/** - * @define {boolean} Whether to enable WebGL. - */ -ol.ENABLE_WEBGL = true; - - -/** - * @enum {string} - */ -ol.RendererHint = { - DOM: 'dom', - WEBGL: 'webgl' -}; - - -/** - * @type {Array.} - */ -ol.DEFAULT_RENDERER_HINTS = [ - ol.RendererHint.WEBGL, - ol.RendererHint.DOM -]; - - -/** - * @typedef {{controls: ol.Collection, - * constraints: ol.Constraints, - * rendererConstructor: - * function(new: ol.renderer.Map, Element, ol.Map), - * values: Object.}} - */ -ol.MapOptionsType; - - -/** - * @param {ol.MapOptionsLiteral} mapOptionsLiteral Map options. - * @return {ol.MapOptionsType} Map options. - */ -ol.MapOptions.create = function(mapOptionsLiteral) { - - /** - * @type {Object.} - */ - var values = {}; - - if (goog.isDef(mapOptionsLiteral.center)) { - values[ol.MapProperty.CENTER] = mapOptionsLiteral.center; - } - - values[ol.MapProperty.INTERACTIONS] = - goog.isDef(mapOptionsLiteral.interactions) ? - mapOptionsLiteral.interactions : - ol.MapOptions.createInteractions_(mapOptionsLiteral); - - values[ol.MapProperty.LAYERS] = goog.isDef(mapOptionsLiteral.layers) ? - mapOptionsLiteral.layers : new ol.Collection(); - - values[ol.MapProperty.PROJECTION] = ol.MapOptions.createProjection_( - mapOptionsLiteral.projection, 'EPSG:3857'); - - if (goog.isDef(mapOptionsLiteral.resolution)) { - values[ol.MapProperty.RESOLUTION] = mapOptionsLiteral.resolution; - } else if (goog.isDef(mapOptionsLiteral.zoom)) { - values[ol.MapProperty.RESOLUTION] = - ol.Projection.EPSG_3857_HALF_SIZE / (128 << mapOptionsLiteral.zoom); - } - - values[ol.MapProperty.USER_PROJECTION] = ol.MapOptions.createProjection_( - mapOptionsLiteral.userProjection, 'EPSG:4326'); - - /** - * @type {function(new: ol.renderer.Map, Element, ol.Map)} - */ - var rendererConstructor = ol.renderer.Map; - - /** - * @type {Array.} - */ - var rendererHints; - if (goog.isDef(mapOptionsLiteral.renderers)) { - rendererHints = mapOptionsLiteral.renderers; - } else if (goog.isDef(mapOptionsLiteral.renderer)) { - rendererHints = [mapOptionsLiteral.renderer]; - } else { - rendererHints = ol.DEFAULT_RENDERER_HINTS; - } - - var i, rendererHint; - for (i = 0; i < rendererHints.length; ++i) { - rendererHint = rendererHints[i]; - if (rendererHint == ol.RendererHint.DOM) { - if (ol.ENABLE_DOM && ol.renderer.dom.isSupported()) { - rendererConstructor = ol.renderer.dom.Map; - break; - } - } else if (rendererHint == ol.RendererHint.WEBGL) { - if (ol.ENABLE_WEBGL && ol.renderer.webgl.isSupported()) { - rendererConstructor = ol.renderer.webgl.Map; - break; - } - } - } - - /** - * @type {ol.Constraints} - */ - var constraints = ol.MapOptions.createConstraints_(mapOptionsLiteral); - - /** - * @type {ol.Collection} - */ - var controls; - if (goog.isDef(mapOptionsLiteral.controls)) { - controls = mapOptionsLiteral.controls; - } else { - controls = ol.MapOptions.createControls_(mapOptionsLiteral); - } - - return { - constraints: constraints, - controls: controls, - rendererConstructor: rendererConstructor, - values: values - }; - -}; - - -/** - * @private - * @param {ol.MapOptionsLiteral} mapOptionsLiteral Map options literal. - * @return {ol.Constraints} Map constraints. - */ -ol.MapOptions.createConstraints_ = function(mapOptionsLiteral) { - var resolutionConstraint; - if (goog.isDef(mapOptionsLiteral.resolutions)) { - resolutionConstraint = ol.ResolutionConstraint.createSnapToResolutions( - mapOptionsLiteral.resolutions); - } else { - var maxResolution, numZoomLevels, zoomFactor; - if (goog.isDef(mapOptionsLiteral.maxResolution) && - goog.isDef(mapOptionsLiteral.numZoomLevels) && - goog.isDef(mapOptionsLiteral.zoomFactor)) { - maxResolution = mapOptionsLiteral.maxResolution; - numZoomLevels = mapOptionsLiteral.numZoomLevels; - zoomFactor = mapOptionsLiteral.zoomFactor; - } else { - maxResolution = ol.Projection.EPSG_3857_HALF_SIZE / 128; - // number of steps we want between two data resolutions - var numSteps = 4; - numZoomLevels = 29 * numSteps; - zoomFactor = Math.exp(Math.log(2) / numSteps); - } - resolutionConstraint = ol.ResolutionConstraint.createSnapToPower( - zoomFactor, maxResolution, numZoomLevels - 1); - } - // FIXME rotation constraint is not configurable at the moment - var rotationConstraint = ol.RotationConstraint.none; - return new ol.Constraints(resolutionConstraint, rotationConstraint); -}; - - -/** - * @private - * @param {ol.MapOptionsLiteral} mapOptionsLiteral Map options literal. - * @return {ol.Collection} Controls. - */ -ol.MapOptions.createControls_ = function(mapOptionsLiteral) { - - var controls = new ol.Collection(); - - controls.push(new ol.control.Attribution({})); - - var zoomDelta = goog.isDef(mapOptionsLiteral.zoomDelta) ? - mapOptionsLiteral.zoomDelta : 4; - controls.push(new ol.control.Zoom({ - delta: zoomDelta - })); - - return controls; - -}; - - -/** - * @private - * @param {ol.MapOptionsLiteral} mapOptionsLiteral Map options literal. - * @return {ol.Collection} Interactions. - */ -ol.MapOptions.createInteractions_ = function(mapOptionsLiteral) { - - var interactions = new ol.Collection(); - - var rotate = goog.isDef(mapOptionsLiteral.rotate) ? - mapOptionsLiteral.rotate : true; - if (rotate) { - interactions.push(new ol.interaction.AltDragRotate()); - } - - var doubleClickZoom = goog.isDef(mapOptionsLiteral.doubleClickZoom) ? - mapOptionsLiteral.doubleClickZoom : true; - if (doubleClickZoom) { - var zoomDelta = goog.isDef(mapOptionsLiteral.zoomDelta) ? - mapOptionsLiteral.zoomDelta : 4; - interactions.push(new ol.interaction.DblClickZoom(zoomDelta)); - } - - var dragPan = goog.isDef(mapOptionsLiteral.dragPan) ? - mapOptionsLiteral.dragPan : true; - if (dragPan) { - interactions.push(new ol.interaction.DragPan()); - } - - var keyboard = goog.isDef(mapOptionsLiteral.keyboard) ? - mapOptionsLiteral.keyboard : true; - var keyboardPanOffset = goog.isDef(mapOptionsLiteral.keyboardPanOffset) ? - mapOptionsLiteral.keyboardPanOffset : 80; - if (keyboard) { - interactions.push(new ol.interaction.KeyboardPan(keyboardPanOffset)); - interactions.push(new ol.interaction.KeyboardZoom()); - } - - var mouseWheelZoom = goog.isDef(mapOptionsLiteral.mouseWheelZoom) ? - mapOptionsLiteral.mouseWheelZoom : true; - if (mouseWheelZoom) { - var mouseWheelZoomDelta = - goog.isDef(mapOptionsLiteral.mouseWheelZoomDelta) ? - mapOptionsLiteral.mouseWheelZoomDelta : 1; - interactions.push(new ol.interaction.MouseWheelZoom(mouseWheelZoomDelta)); - } - - var shiftDragZoom = goog.isDef(mapOptionsLiteral.shiftDragZoom) ? - mapOptionsLiteral.shiftDragZoom : true; - if (shiftDragZoom) { - interactions.push(new ol.interaction.ShiftDragZoom()); - } - - return interactions; - -}; - - -/** - * @private - * @param {ol.Projection|string|undefined} projection Projection. - * @param {string} defaultCode Default code. - * @return {ol.Projection} Projection. - */ -ol.MapOptions.createProjection_ = function(projection, defaultCode) { - if (!goog.isDefAndNotNull(projection)) { - return ol.Projection.getFromCode(defaultCode); - } else if (goog.isString(projection)) { - return ol.Projection.getFromCode(projection); - } else { - goog.asserts.assert(projection instanceof ol.Projection); - return projection; - } -}; diff --git a/src/ol/overlay/overlay.js b/src/ol/overlay/overlay.js index 7af05098ef..e348b4dcb2 100644 --- a/src/ol/overlay/overlay.js +++ b/src/ol/overlay/overlay.js @@ -4,8 +4,6 @@ goog.provide('ol.overlay.OverlayPositioning'); goog.require('goog.events'); goog.require('goog.style'); -goog.require('ol.Map'); -goog.require('ol.MapProperty'); /** diff --git a/src/ol/renderer/dom/map.js b/src/ol/renderer/dom/map.js index aba6758894..48737a6d9d 100644 --- a/src/ol/renderer/dom/map.js +++ b/src/ol/renderer/dom/map.js @@ -8,7 +8,6 @@ goog.require('goog.events.Event'); goog.require('goog.functions'); goog.require('goog.style'); goog.require('ol.Coordinate'); -goog.require('ol.Map'); goog.require('ol.layer.TileLayer'); goog.require('ol.renderer.Map'); goog.require('ol.renderer.dom.TileLayer'); diff --git a/src/ol/renderer/map.js b/src/ol/renderer/map.js index 2668654b02..b0ed2ce188 100644 --- a/src/ol/renderer/map.js +++ b/src/ol/renderer/map.js @@ -5,8 +5,6 @@ goog.require('goog.events'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('goog.vec.Mat4'); -goog.require('ol.Map'); -goog.require('ol.MapProperty'); diff --git a/src/ol/renderer/webgl/map.js b/src/ol/renderer/webgl/map.js index e41e79a838..3b628321ef 100644 --- a/src/ol/renderer/webgl/map.js +++ b/src/ol/renderer/webgl/map.js @@ -17,7 +17,6 @@ goog.require('goog.events.EventType'); goog.require('goog.functions'); goog.require('goog.style'); goog.require('goog.webgl'); -goog.require('ol.Map'); goog.require('ol.layer.Layer'); goog.require('ol.layer.TileLayer'); goog.require('ol.renderer.webgl.FragmentShader'); diff --git a/src/ol/renderer/webgl/tilelayer.js b/src/ol/renderer/webgl/tilelayer.js index a92abc0274..35cf4f36c0 100644 --- a/src/ol/renderer/webgl/tilelayer.js +++ b/src/ol/renderer/webgl/tilelayer.js @@ -15,7 +15,6 @@ goog.require('goog.vec.Mat4'); goog.require('goog.vec.Vec4'); goog.require('goog.webgl'); goog.require('ol.Coordinate'); -goog.require('ol.MapEventType'); goog.require('ol.Size'); goog.require('ol.TileState'); goog.require('ol.layer.TileLayer'); diff --git a/test/ol.html b/test/ol.html index 35f98a39a2..c294c116cf 100644 --- a/test/ol.html +++ b/test/ol.html @@ -76,7 +76,7 @@ - + diff --git a/test/spec/ol/mapoptions.test.js b/test/spec/ol/map.test.js similarity index 85% rename from test/spec/ol/mapoptions.test.js rename to test/spec/ol/map.test.js index be840417a3..80fe996677 100644 --- a/test/spec/ol/mapoptions.test.js +++ b/test/spec/ol/map.test.js @@ -1,6 +1,6 @@ -goog.require('ol.MapOptions'); +goog.require('ol.Map'); -describe('ol.MapOptions', function() { +describe('ol.Map', function() { describe('create constraints', function() { @@ -9,7 +9,7 @@ describe('ol.MapOptions', function() { describe('with no options', function() { it('gives a correct resolution constraint function', function() { var options = {}; - var fn = ol.MapOptions.createConstraints_(options).resolution; + var fn = ol.Map.createConstraints_(options).resolution; expect(fn(156543.03392804097, 0)) .toRoughlyEqual(156543.03392804097, 1e-9); expect(fn(78271.51696402048, 0)) @@ -25,7 +25,7 @@ describe('ol.MapOptions', function() { numZoomLevels: 4, zoomFactor: 3 }; - var fn = ol.MapOptions.createConstraints_(options).resolution; + var fn = ol.Map.createConstraints_(options).resolution; expect(fn(82, 0)).toEqual(81); expect(fn(81, 0)).toEqual(81); expect(fn(27, 0)).toEqual(27); @@ -40,7 +40,7 @@ describe('ol.MapOptions', function() { var options = { resolutions: [97, 76, 65, 54, 0.45] }; - var fn = ol.MapOptions.createConstraints_(options).resolution; + var fn = ol.Map.createConstraints_(options).resolution; expect(fn(97, 0), 97); expect(fn(76, 0), 76); expect(fn(65, 0), 65); @@ -75,7 +75,7 @@ describe('ol.MapOptions', function() { describe('default mouseWheelZoomDelta', function() { it('create mousewheel interaction with default delta', function() { - var interactions = ol.MapOptions.createInteractions_(options); + var interactions = ol.Map.createInteractions_(options); expect(interactions.getLength()).toEqual(1); expect(interactions.getAt(0)).toBeA(ol.interaction.MouseWheelZoom); expect(interactions.getAt(0).delta_).toEqual(1); @@ -85,7 +85,7 @@ describe('ol.MapOptions', function() { describe('set mouseWheelZoomDelta', function() { it('create mousewheel interaction with set delta', function() { options.mouseWheelZoomDelta = 7; - var interactions = ol.MapOptions.createInteractions_(options); + var interactions = ol.Map.createInteractions_(options); expect(interactions.getLength()).toEqual(1); expect(interactions.getAt(0)).toBeA(ol.interaction.MouseWheelZoom); expect(interactions.getAt(0).delta_).toEqual(7); @@ -101,7 +101,7 @@ describe('ol.MapOptions', function() { describe('default zoomDelta', function() { it('create double click interaction with default delta', function() { - var interactions = ol.MapOptions.createInteractions_(options); + var interactions = ol.Map.createInteractions_(options); expect(interactions.getLength()).toEqual(1); expect(interactions.getAt(0)).toBeA(ol.interaction.DblClickZoom); expect(interactions.getAt(0).delta_).toEqual(4); @@ -111,7 +111,7 @@ describe('ol.MapOptions', function() { describe('set mouseWheelZoomDelta', function() { it('create double click interaction with set delta', function() { options.zoomDelta = 7; - var interactions = ol.MapOptions.createInteractions_(options); + var interactions = ol.Map.createInteractions_(options); expect(interactions.getLength()).toEqual(1); expect(interactions.getAt(0)).toBeA(ol.interaction.DblClickZoom); expect(interactions.getAt(0).delta_).toEqual(7);