From bcf4d9416c4d1c4b7e4e7147755b4d97897d0405 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 19:40:48 +0200 Subject: [PATCH] Add initial ol.MapRenderer skeleton --- src/all.js | 1 + src/ol/maprenderer.js | 215 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 src/ol/maprenderer.js diff --git a/src/all.js b/src/all.js index cf45c42432..5cc23c1d54 100644 --- a/src/all.js +++ b/src/all.js @@ -6,6 +6,7 @@ goog.require('ol.Camera'); goog.require('ol.Extent'); goog.require('ol.Layer'); goog.require('ol.LayerRenderer'); +goog.require('ol.MapRenderer'); goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.Store'); diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js new file mode 100644 index 0000000000..5340c1ac8e --- /dev/null +++ b/src/ol/maprenderer.js @@ -0,0 +1,215 @@ +goog.provide('ol.MapRenderer'); + +goog.require('goog.array'); +goog.require('goog.events'); +goog.require('ol.Array'); +goog.require('ol.Camera'); +goog.require('ol.LayerRenderer'); +goog.require('ol.Object'); +goog.require('ol.Projection'); + + +/** + * @enum {string} + */ +ol.MapRendererProperty = { + CAMERA: 'camera', + LAYERS: 'layers', + PROJECTION: 'projection' +}; + + + +/** + * @constructor + * @extends {ol.Object} + * @param {HTMLDivElement} target Target. + * @param {Object=} opt_values Values. + */ +ol.MapRenderer = function(target, opt_values) { + + goog.base(this); + + /** + * @private + * @type {HTMLDivElement} + */ + this.target_ = target; + + /** + * @private + * @type {Array.} + */ + this.layersListenerKeys_ = null; + + /** + * @private + * @type {Object.} + */ + this.layerRenderers_ = {}; + + goog.events.listen( + this, ol.Object.getChangedEventType(ol.MapRendererProperty.CAMERA), + this.handleCameraChanged, false, this); + + goog.events.listen( + this, ol.Object.getChangedEventType(ol.MapRendererProperty.LAYERS), + this.handleLayersChanged, false, this); + + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } + +}; +goog.inherits(ol.MapRenderer, ol.Object); + + +/** + * @param {ol.Layer} layer Layer. + * @protected + * @return {ol.LayerRenderer} layerRenderer Layer renderer. + */ +ol.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; + + +/** + * @return {ol.Camera} Camera. + */ +ol.MapRenderer.prototype.getCamera = function() { + return /** @type {ol.Camera} */ (this.get(ol.MapRendererProperty.CAMERA)); +}; + + +/** + * @return {ol.Array} Layers. + */ +ol.MapRenderer.prototype.getLayers = function() { + return /** @type {ol.Array} */ (this.get(ol.MapRendererProperty.LAYERS)); +}; + + +/** + * @return {ol.Projection} Projection. + */ +ol.MapRenderer.prototype.getProjection = function() { + return /** @type {ol.Projection} */ ( + this.get(ol.MapRendererProperty.PROJECTION)); +}; + + +/** + * @return {HTMLDivElement} Target. + */ +ol.MapRenderer.prototype.getTarget = function() { + return this.target_; +}; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleCameraChanged = function() { +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.MapRenderer.prototype.handleLayerAdd = function(layer) { + var key = goog.getUid(layer); + var layerRenderer = this.createLayerRenderer(layer); + this.layerRenderers_[key] = layerRenderer; +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.MapRenderer.prototype.handleLayerRemove = function(layer) { + var key = goog.getUid(layer); + goog.asserts.assert(key in this.layerRenderers_); + var layerRenderer = this.layerRenderers_[key]; + delete this.layerRenderers_[key]; + goog.dispose(layerRenderer); +}; + + +/** + * @param {ol.ArrayEvent} event Event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersInsertAt = function(event) { + var layers = /** @type {ol.Array} */ (event.target); + var layer = /** @type {ol.Layer} */ layers.getAt(event.index); + this.handleLayerAdd(layer); +}; + + +/** + * @param {ol.ArrayEvent} event Event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersRemoveAt = function(event) { + var layer = /** @type {ol.Layer} */ (event.prev); + this.handleLayerRemove(layer); +}; + + +/** + * @param {ol.ArrayEvent} event Event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersSetAt = function(event) { + var prevLayer = /** @type {ol.Layer} */ (event.prev); + this.handleLayerRemove(prevLayer); + var layers = /** @type {ol.Array} */ (event.target); + var layer = /** @type {ol.Layer} */ layers.getAt(event.index); + this.handleLayerAdd(layer); +}; + + +/** + */ +ol.MapRenderer.prototype.handleLayersChanged = function() { + if (!goog.isNull(this.layersListenerKeys_)) { + goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); + this.layersListenerKeys_ = null; + } + var layers = this.getLayers(); + if (!goog.isNull(layers)) { + this.layersListenerKeys_ = [ + goog.events.listen(layers, ol.ArrayEventType.INSERT_AT, + this.handleLayersInsertAt, false, this), + goog.events.listen(layers, ol.ArrayEventType.REMOVE_AT, + this.handleLayersRemoveAt, false, this), + goog.events.listen(layers, ol.ArrayEventType.SET_AT, + this.handleLayersSetAt, false, this) + ]; + } +}; + + +/** + * @param {ol.Camera} camera Camera. + */ +ol.MapRenderer.prototype.setCamera = function(camera) { + this.set(ol.MapRendererProperty.CAMERA, camera); +}; + + +/** + * @param {ol.Array} layers Layers. + */ +ol.MapRenderer.prototype.setLayers = function(layers) { + this.set(ol.MapRendererProperty.LAYERS, layers); +}; + + +/** + * @param {ol.Projection} projection Projection. + */ +ol.MapRenderer.prototype.setProjection = function(projection) { + this.set(ol.MapRendererProperty.PROJECTION, projection); +};