diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js
index 8ab3d1bbcb..80e4457172 100644
--- a/src/ol/layer/vectorlayer.js
+++ b/src/ol/layer/vectorlayer.js
@@ -1,8 +1,9 @@
goog.provide('ol.layer.Vector');
-goog.provide('ol.layer.VectorLayerEventType');
+goog.provide('ol.layer.VectorEventType');
goog.require('goog.array');
goog.require('goog.asserts');
+goog.require('goog.events.Event');
goog.require('goog.object');
goog.require('ol.Feature');
goog.require('ol.extent');
@@ -127,25 +128,6 @@ ol.layer.FeatureCache.prototype.remove = function(feature) {
};
-/**
- * @enum {string}
- */
-ol.layer.VectorLayerEventType = {
- ADD: 'add',
- CHANGE: 'featurechange',
- REMOVE: 'remove',
- INTENTCHANGE: 'intentchange'
-};
-
-
-/**
- * @typedef {{extent: (ol.Extent|undefined),
- * features: (Array.
|undefined),
- * type: ol.layer.VectorLayerEventType}}
- */
-ol.layer.VectorLayerEventObject;
-
-
/**
* @constructor
@@ -200,11 +182,8 @@ ol.layer.Vector.prototype.addFeatures = function(features) {
ol.extent.extend(extent, geometry.getBounds());
}
}
- this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({
- extent: extent,
- features: features,
- type: ol.layer.VectorLayerEventType.ADD
- }));
+ this.dispatchEvent(new ol.layer.VectorEvent(ol.layer.VectorEventType.ADD,
+ features, [extent]));
};
@@ -213,9 +192,8 @@ ol.layer.Vector.prototype.addFeatures = function(features) {
*/
ol.layer.Vector.prototype.clear = function() {
this.featureCache_.clear();
- this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({
- type: ol.layer.VectorLayerEventType.CHANGE
- }));
+ this.dispatchEvent(
+ new ol.layer.VectorEvent(ol.layer.VectorEventType.CHANGE, [], []));
};
@@ -409,11 +387,8 @@ ol.layer.Vector.prototype.removeFeatures = function(features) {
ol.extent.extend(extent, geometry.getBounds());
}
}
- this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({
- extent: extent,
- features: features,
- type: ol.layer.VectorLayerEventType.REMOVE
- }));
+ this.dispatchEvent(new ol.layer.VectorEvent(ol.layer.VectorEventType.REMOVE,
+ features, [extent]));
};
@@ -437,11 +412,8 @@ ol.layer.Vector.prototype.setRenderIntent =
ol.extent.extend(extent, geometry.getBounds());
}
}
- this.dispatchEvent(/** @type {ol.layer.VectorLayerEventObject} */ ({
- extent: extent,
- features: features,
- type: ol.layer.VectorLayerEventType.INTENTCHANGE
- }));
+ this.dispatchEvent(new ol.layer.VectorEvent(
+ ol.layer.VectorEventType.INTENTCHANGE, features, [extent]));
};
@@ -462,3 +434,40 @@ ol.layer.Vector.uidTransformFeatureInfo = function(features) {
function(feature) { return goog.getUid(feature); });
return uids.join(', ');
};
+
+
+
+/**
+ * @constructor
+ * @extends {goog.events.Event}
+ * @param {string} type Event type.
+ * @param {Array.} features Features associated with the event.
+ * @param {Array.} extents Any extents associated with the event.
+ */
+ol.layer.VectorEvent = function(type, features, extents) {
+
+ goog.base(this, type);
+
+ /**
+ * @type {Array.}
+ */
+ this.features = features;
+
+ /**
+ * @type {Array.}
+ */
+ this.extents = extents;
+
+};
+goog.inherits(ol.layer.VectorEvent, goog.events.Event);
+
+
+/**
+ * @enum {string}
+ */
+ol.layer.VectorEventType = {
+ ADD: 'featureadd',
+ CHANGE: 'featurechange',
+ REMOVE: 'featureremove',
+ INTENTCHANGE: 'intentchange'
+};
diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
index f8e63aa1ee..8c3a1bb5e0 100644
--- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
+++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
@@ -13,7 +13,7 @@ goog.require('ol.ViewHint');
goog.require('ol.extent');
goog.require('ol.geom.GeometryType');
goog.require('ol.layer.Vector');
-goog.require('ol.layer.VectorLayerEventType');
+goog.require('ol.layer.VectorEventType');
goog.require('ol.layer.VectorLayerRenderIntent');
goog.require('ol.renderer.canvas.Layer');
goog.require('ol.renderer.canvas.Vector');
@@ -88,10 +88,10 @@ ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) {
this.tileCache_ = new ol.TileCache(
ol.renderer.canvas.VectorLayer.TILECACHE_SIZE);
goog.events.listen(layer, [
- ol.layer.VectorLayerEventType.ADD,
- ol.layer.VectorLayerEventType.CHANGE,
- ol.layer.VectorLayerEventType.REMOVE,
- ol.layer.VectorLayerEventType.INTENTCHANGE
+ ol.layer.VectorEventType.ADD,
+ ol.layer.VectorEventType.CHANGE,
+ ol.layer.VectorEventType.REMOVE,
+ ol.layer.VectorEventType.INTENTCHANGE
],
this.handleLayerChange_, false, this);
@@ -163,14 +163,18 @@ goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer);
/**
* Get rid cached tiles. If the optional extent is provided, only tiles that
* intersect that extent will be removed.
- * @param {ol.Extent=} opt_extent extent Expire tiles within this extent only.
+ * @param {Array.} extents extent Expire tiles within the provided
+ * extents. If the array is empty, all tiles will be expired.
* @private
*/
-ol.renderer.canvas.VectorLayer.prototype.expireTiles_ = function(opt_extent) {
+ol.renderer.canvas.VectorLayer.prototype.expireTiles_ = function(extents) {
var tileCache = this.tileCache_;
- if (goog.isDef(opt_extent)) {
- var tileRange = this.tileGrid_.getTileRangeForExtentAndZ(opt_extent, 0);
- tileCache.pruneTileRange(tileRange);
+ var length = extents.length;
+ if (length > 0) {
+ for (var i = 0; i < length; ++i) {
+ tileCache.pruneTileRange(
+ this.tileGrid_.getTileRangeForExtentAndZ(extents[i], 0));
+ }
} else {
tileCache.clear();
}
@@ -307,11 +311,11 @@ ol.renderer.canvas.VectorLayer.prototype.getFeaturesForPixel =
/**
- * @param {ol.layer.VectorLayerEventObject} event Layer change event.
+ * @param {ol.layer.VectorEvent} event Vector layer event.
* @private
*/
ol.renderer.canvas.VectorLayer.prototype.handleLayerChange_ = function(event) {
- this.expireTiles_(event.extent);
+ this.expireTiles_(event.extents);
this.requestMapRenderFrame_();
};