Refactor build system

This rather large commit refactors the build system to solve a number of
problems:
- Object literal types are now declared in just one place
- There are no more circular dependencies
- There is no need for concealed subclasses in build-standalone mode

When building in standalone mode, you need to include the source in
build/src/external.  This declares object literal types as externs so
that their properties are not renamed.

When building with the application, you need to include the source in
build/src/internal.  This declares object literal types as typedefs so
that their properties can be renamed and removed.

Note also that ol.MapOptions has been merged into ol.Map, with some
renaming.
This commit is contained in:
Tom Payne
2012-09-29 11:46:10 +02:00
parent 012b8a584a
commit 71e42b2448
20 changed files with 337 additions and 392 deletions

View File

@@ -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

View File

@@ -49,7 +49,7 @@
"mode": "ADVANCED",
"paths": [
"build/src",
"build/src/internal/src",
"src"
],

View File

@@ -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<name>\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<key>\S+):\s+(?P<value>\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())

View File

@@ -5,7 +5,8 @@
"inherits": "../base.json",
"inputs": [
"build/require-all.js"
"build/src/internal/src/requireall.js",
"build/src/internal/src/types.js"
]
}

View File

@@ -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"
]
}

View File

@@ -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');

View File

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

View File

@@ -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');

View File

@@ -2,7 +2,6 @@ goog.provide('ol.control.Control');
goog.provide('ol.control.ControlOptions');
goog.require('goog.Disposable');
goog.require('ol.Map');
/**

View File

@@ -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');

View File

@@ -1,4 +1,4 @@
@externtype ol.MapOptions
@externtype olx.MapOptions
center: ol.Coordinate|undefined
controls: ol.Collection|undefined
doubleClickZoom: boolean|undefined

View File

@@ -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.RendererHint>}
*/
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.<string, *>}}
*/
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.<string, *>}
*/
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.<ol.RendererHint>}
*/
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;
}
};

View File

@@ -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.RendererHint>}
*/
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.<string, *>}}
*/
ol.MapOptionsType;
/**
* @param {ol.MapOptionsLiteral} mapOptionsLiteral Map options.
* @return {ol.MapOptionsType} Map options.
*/
ol.MapOptions.create = function(mapOptionsLiteral) {
/**
* @type {Object.<string, *>}
*/
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.<ol.RendererHint>}
*/
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;
}
};

View File

@@ -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');
/**

View File

@@ -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');

View File

@@ -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');

View File

@@ -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');

View File

@@ -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');

View File

@@ -76,7 +76,7 @@
<script type="text/javascript" src="spec/ol/object.test.js"></script>
<script type="text/javascript" src="spec/ol/tilecoord.test.js"></script>
<script type="text/javascript" src="spec/ol/tilegrid.test.js"></script>
<script type="text/javascript" src="spec/ol/mapoptions.test.js"></script>
<script type="text/javascript" src="spec/ol/map.test.js"></script>
<script type="text/javascript" src="spec/ol/projection.test.js"></script>
<script type="text/javascript" src="spec/ol/rectangle.test.js"></script>
<script type="text/javascript" src="spec/ol/tilerange.test.js"></script>

View File

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