adds a new getVisibility method in the Feature.Vector class, used in the SelectFeature control this method now allows us to tell the select feature box handler wether to select or not the features, r=ahocevar, (Closes #2418)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@10064 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
pgiraud
2010-02-15 09:05:49 +00:00
parent 6b7fd781ee
commit 7179166603
4 changed files with 70 additions and 1 deletions

View File

@@ -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 @@
<li>
<input type="radio" name="type" value="select" id="selectToggle"
onclick="toggleControl(this);" />
<label for="selectToggle">select feature</label>
<label for="selectToggle">select feature (<span id="counter">0</span> features selected)</label>
<ul>
<li>
<input id="box" type="checkbox" checked="checked"

View File

@@ -548,6 +548,11 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
layer = layers[l];
for(var i=0, len = layer.features.length; i<len; ++i) {
var feature = layer.features[i];
// check if the feature is displayed
if (!feature.getVisibility()) {
continue;
}
if (this.geometryTypes == null || OpenLayers.Util.indexOf(
this.geometryTypes, feature.geometry.CLASS_NAME) > -1) {
if (bounds.toGeometry().intersects(feature.geometry)) {

View File

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

View File

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