diff --git a/examples/select-feature.html b/examples/select-feature.html
index c0cad3b457..f50b2ed930 100644
--- a/examples/select-feature.html
+++ b/examples/select-feature.html
@@ -21,6 +21,15 @@
);
var vectors = new OpenLayers.Layer.Vector("Vector Layer");
+ vectors.events.on({
+ 'featureselected': function(feature) {
+ $('counter').innerHTML = this.selectedFeatures.length;
+ },
+ 'featureunselected': function(feature) {
+ $('counter').innerHTML = this.selectedFeatures.length;
+ },
+ });
+
map.addLayers([wmsLayer, vectors]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
@@ -125,7 +134,7 @@
-
+
-
-1) {
if (bounds.toGeometry().intersects(feature.geometry)) {
diff --git a/lib/OpenLayers/Feature/Vector.js b/lib/OpenLayers/Feature/Vector.js
index 47016ce53b..0a1b7695b7 100644
--- a/lib/OpenLayers/Feature/Vector.js
+++ b/lib/OpenLayers/Feature/Vector.js
@@ -166,6 +166,27 @@ OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
}
return onScreen;
},
+
+ /**
+ * Method: getVisibility
+ * Determine whether the feature is displayed or not. It may not displayed
+ * because:
+ * - its style display property is set to 'none',
+ * - it doesn't belong to any layer,
+ * - the styleMap creates a symbolizer with display property set to 'none'
+ * for it,
+ * - the layer which it belongs to is not visible.
+ *
+ * Returns:
+ * {Boolean} The feature is currently displayed.
+ */
+ getVisibility: function() {
+ return !(this.style && this.style.display == 'none' ||
+ !this.layer ||
+ this.layer && this.layer.styleMap &&
+ this.layer.styleMap.createSymbolizer(this, this.renderIntent).display == 'none' ||
+ this.layer && !this.layer.getVisibility());
+ },
/**
* Method: createMarker
diff --git a/tests/Feature/Vector.html b/tests/Feature/Vector.html
index 7ceffcc8c7..2cf0d18b26 100644
--- a/tests/Feature/Vector.html
+++ b/tests/Feature/Vector.html
@@ -58,6 +58,40 @@
}
+ function test_Feature_getVisibility(t) {
+ t.plan(5);
+ var feature = new OpenLayers.Feature.Vector();
+ feature.layer = {
+ getVisibility: function() {return true}
+ };
+
+ t.ok(feature.getVisibility(),
+ "returns true in a not specific case");
+
+ feature.style = {display: 'none'};
+ t.eq(feature.getVisibility(), false,
+ "returns false when feature style display property is set to 'none'");
+
+ feature.style = null;
+ feature.layer.styleMap = {
+ createSymbolizer: function() {
+ return {display: 'none'}
+ }
+ }
+ t.eq(feature.getVisibility(), false,
+ "returns false when layer styleMap is configured so that the feature" +
+ "should not be displayed");
+
+ delete feature.layer.styleMap;
+ feature.layer.getVisibility = function() {return false}
+ t.eq(feature.getVisibility(), false,
+ "returns false when layer it belongs to is not visible");
+
+ feature.layer = null;
+ t.eq(feature.getVisibility(), false,
+ "returns false when it doesn't belong to any layer");
+ }
+
function test_Feature_Vector_clone(t) {
t.plan(6);