diff --git a/examples/openmnnd.html b/examples/openmnnd.html index 63c702c23d..30a0c17ec6 100644 --- a/examples/openmnnd.html +++ b/examples/openmnnd.html @@ -29,15 +29,42 @@ map.addLayer(wms); wfs = new OpenLayers.Layer.WFS("Minnesota Streams (WFS)", wfs_url, {'typename':'streams'}, {ratio:1.25, minZoomLevel:4}); - wfs.onFeatureInsert= function(feature) { feature.style.strokeWidth="3"; feature.style.strokeColor="blue"; feature.layer.renderer.drawGeometry(feature.geometry,feature.style); $('stream_features').innerHTML = feature.layer.features.length;} + + // preFeatureInsert can be used to set style before the feature is drawn + wfs.preFeatureInsert= function(feature) { feature.style.strokeWidth="3"; feature.style.strokeColor="blue"; + } + wfs.onFeatureInsert = function() { + $('stream_features').innerHTML = feature.layer.features.length; + } map.addLayer(wfs); - pwfs = new OpenLayers.Layer.WFS("Minnesota Plat (WFS)", wfs_url, {'typename':'plat'}, {ratio:1.25, minZoomLevel:8, extractAttributes: true}); - pwfs.onFeatureInsert= function(feature) { feature.style.fillColor="green"; feature.layer.renderer.drawGeometry(feature.geometry,feature.style); $('plat_features').innerHTML = feature.layer.features.length;} + // Or a style can be set on the layer. + pwfsstyle = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); + OpenLayers.Util.extend(pwfsstyle, {'fillColor': 'green'}); + + pwfs = new OpenLayers.Layer.WFS("Minnesota Plat (WFS)", wfs_url, + {'typename':'plat'}, + { + ratio:1.25, + minZoomLevel:8, + extractAttributes: true, + style: pwfsstyle + }); + + pwfs.onFeatureInsert= function(feature) { + $('plat_features').innerHTML = feature.layer.features.length; + } map.addLayer(pwfs); - rwfs = new OpenLayers.Layer.WFS("Minnesota Roads (WFS)", wfs_url, {'typename':'roads'}, {ratio:1.25, minZoomLevel:7, extractAttributes: true}); - rwfs.onFeatureInsert= function(feature) { feature.style.strokeColor="white"; feature.style.strokeWidth="4"; feature.layer.renderer.drawGeometry(feature.geometry,feature.style); $('road_features').innerHTML = feature.layer.features.length; } + rstyle = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); + OpenLayers.Util.extend(rstyle, {'strokeColor': 'white', strokeWIdth: "4"}); + rwfs = new OpenLayers.Layer.WFS("Minnesota Roads (WFS)", wfs_url, {'typename':'roads'}, + {ratio:1.25, minZoomLevel:7, extractAttributes: true, style:rstyle}); + + rwfs.onFeatureInsert= function(feature) { + $('road_features').innerHTML = feature.layer.features.length; + } + map.addLayer(rwfs); map.events.register('moveend', null, function() { diff --git a/lib/OpenLayers/Feature/Vector.js b/lib/OpenLayers/Feature/Vector.js index 386591596c..5bf186eb7f 100644 --- a/lib/OpenLayers/Feature/Vector.js +++ b/lib/OpenLayers/Feature/Vector.js @@ -51,7 +51,7 @@ OpenLayers.Feature.Vector.prototype = if (data) { OpenLayers.Util.extend(this.attributes, data); } - this.style = style ? style : OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); + this.style = style ? style : null; }, diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js index 829e427c0d..484b7bbe83 100644 --- a/lib/OpenLayers/Layer/Vector.js +++ b/lib/OpenLayers/Layer/Vector.js @@ -36,6 +36,9 @@ OpenLayers.Layer.Vector.prototype = /** @type {Boolean} */ reportError: true, + /** @type {Object} */ + style: null, + /** * List of supported Renderer classes. Add to this list to * add support for additional renderers. This list is ordered: @@ -224,6 +227,16 @@ OpenLayers.Layer.Vector.prototype = //give feature reference to its layer feature.layer = this; + if (!feature.style) { + if (this.style) { + feature.style = OpenLayers.Util.extend({}, this.style); + } else { + feature.style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); + } + } + + this.preFeatureInsert(feature); + if (this.drawn) { this.renderer.drawGeometry(feature.geometry, feature.style); } @@ -315,6 +328,17 @@ OpenLayers.Layer.Vector.prototype = */ onFeatureInsert: function(feature) { }, + + /** + * method called before a feature is inserted. + * Does nothing by default. Override this if you + * need to do something when features are first added to the + * layer, but before they are drawn, such as adjust the style. + * + * @param {OpenLayers.Feature.Vector} feature + */ + preFeatureInsert: function(feature) { + }, /** @final @type String */ CLASS_NAME: "OpenLayers.Layer.Vector" diff --git a/tests/Layer/test_Vector.html b/tests/Layer/test_Vector.html index ecc4b4ad41..32ebd938ff 100644 --- a/tests/Layer/test_Vector.html +++ b/tests/Layer/test_Vector.html @@ -44,6 +44,17 @@ t.ok(layer.features.length == 1, "OpenLayers.Layer.Vector.removeFeatures removes a feature from the features array"); } + + function test_Layer_Vector_addsStyle (t) { + t.plan(2); + layer = new OpenLayers.Layer.Vector(name); + var map = new OpenLayers.Map('map'); + map.addLayer(layer); + f = new OpenLayers.Feature.Vector(); + t.eq( f.style, null, "Feature style is null by default."); + layer.addFeatures(f); + t.ok( f.style != null, "Feature style is set by layer."); + } function test_99_Layer_Vector_destroy (t) { t.plan(1);