Give the GetFeature control a beforefeaturesselected and featuresselected event. p=komacke, r=me (closes #2442)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@10035 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
ahocevar
2010-02-09 12:30:02 +00:00
parent 777ef007ad
commit 0af99e0de7
2 changed files with 59 additions and 22 deletions

View File

@@ -161,6 +161,14 @@ OpenLayers.Control.GetFeature = OpenLayers.Class(OpenLayers.Control, {
* featureselected - Triggered when <click> is true and a feature is * featureselected - Triggered when <click> is true and a feature is
* selected. The event object has a feature property with the * selected. The event object has a feature property with the
* selected feature * selected feature
* beforefeaturesselected - Triggered when <click> is true before a
* set of features is selected. The event object is an array of
* feature properties with the features about to be selected.
* Return false after receiving this event to discontinue processing
* of all featureselected events and the featuresselected event.
* featuresselected - Triggered when <click> is true and a set of
* features is selected. The event object is an array of feature
* properties of the selected features
* featureunselected - Triggered when <click> is true and a feature is * featureunselected - Triggered when <click> is true and a feature is
* unselected. The event object has a feature property with the * unselected. The event object has a feature property with the
* unselected feature * unselected feature
@@ -171,8 +179,9 @@ OpenLayers.Control.GetFeature = OpenLayers.Class(OpenLayers.Control, {
* outfeature - Triggered when <hover> is true and the mouse moves * outfeature - Triggered when <hover> is true and the mouse moves
* moved away from a hover-selected feature * moved away from a hover-selected feature
*/ */
EVENT_TYPES: ["featureselected", "featureunselected", "clickout", EVENT_TYPES: ["featureselected", "featuresselected", "featureunselected",
"beforefeatureselected", "hoverfeature", "outfeature"], "clickout", "beforefeatureselected", "beforefeaturesselected",
"hoverfeature", "outfeature"],
/** /**
* Constructor: OpenLayers.Control.GetFeature * Constructor: OpenLayers.Control.GetFeature
@@ -435,7 +444,7 @@ OpenLayers.Control.GetFeature = OpenLayers.Class(OpenLayers.Control, {
/** /**
* Method: select * Method: select
* Add feature to the hash of selected features and trigger the * Add feature to the hash of selected features and trigger the
* featureselected event. * featureselected and featuresselected events.
* *
* Parameters: * Parameters:
* features - {<OpenLayers.Feature.Vector>} or an array of features * features - {<OpenLayers.Feature.Vector>} or an array of features
@@ -448,24 +457,34 @@ OpenLayers.Control.GetFeature = OpenLayers.Class(OpenLayers.Control, {
features = [features]; features = [features];
} }
var feature; cont = this.events.triggerEvent("beforefeaturesselected", {
for(var i=0, len=features.length; i<len; ++i) { features: features
feature = features[i]; });
if(this.features[feature.fid || feature.id]) { if(cont !== false) {
if(this.modifiers.toggle) { var selectedFeatures = [];
this.unselect(this.features[feature.fid || feature.id]); var feature;
} for(var i=0, len=features.length; i<len; ++i) {
} else { feature = features[i];
cont = this.events.triggerEvent("beforefeatureselected", { if(this.features[feature.fid || feature.id]) {
feature: feature if(this.modifiers.toggle) {
}); this.unselect(this.features[feature.fid || feature.id]);
if(cont !== false) { }
this.features[feature.fid || feature.id] = feature; } else {
cont = this.events.triggerEvent("beforefeatureselected", {
this.events.triggerEvent("featureselected", feature: feature
{feature: feature}); });
if(cont !== false) {
this.features[feature.fid || feature.id] = feature;
selectedFeatures.push(feature);
this.events.triggerEvent("featureselected",
{feature: feature});
}
} }
} }
this.events.triggerEvent("featuresselected", {
features: selectedFeatures
});
} }
}, },

View File

@@ -22,7 +22,7 @@
} }
function test_Control_GetFeature_select(t) { function test_Control_GetFeature_select(t) {
t.plan(3); t.plan(5);
var map = new OpenLayers.Map("map"); var map = new OpenLayers.Map("map");
var layer = new OpenLayers.Layer.WMS("foo", "wms", { var layer = new OpenLayers.Layer.WMS("foo", "wms", {
layers: "foo" layers: "foo"
@@ -31,11 +31,12 @@
map.setCenter(new OpenLayers.LonLat(1,2)); map.setCenter(new OpenLayers.LonLat(1,2));
var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,2)); var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,2));
var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(2,3)); var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(2,3));
var feature3 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(3,1));
var control = new OpenLayers.Control.GetFeature({ var control = new OpenLayers.Control.GetFeature({
protocol: new OpenLayers.Protocol({ protocol: new OpenLayers.Protocol({
read: function(obj) { read: function(obj) {
obj.callback.call(obj.scope, { obj.callback.call(obj.scope, {
features: [feature1, feature2], features: [feature1, feature2, feature3],
success: function() {return true;} success: function() {return true;}
}); });
} }
@@ -51,13 +52,30 @@
control.selectSingle({xy: new OpenLayers.Pixel(200, 125)}); control.selectSingle({xy: new OpenLayers.Pixel(200, 125)});
control.events.unregister("featureselected", this, singleTest); control.events.unregister("featureselected", this, singleTest);
var features = [] var count = 0;
var beforeFeatureSelected = function(evt) {
count++;
return count < 3;
}
var features = [];
var boxTest = function(evt) { var boxTest = function(evt) {
features.push(evt.feature); features.push(evt.feature);
} }
var beforeFeaturesSelected = function(evt) {
t.eq(evt.features.length, 3, "3 features passed to the beforefeaturesselected handler");
}
var featuresSelected = function(evt) {
t.eq(evt.features.length, 2, "2 features passed to the featuresselected handler");
}
control.events.register("beforefeatureselected", this, beforeFeatureSelected);
control.events.register("featureselected", this, boxTest); control.events.register("featureselected", this, boxTest);
control.events.register("beforefeaturesselected", this, beforeFeaturesSelected);
control.events.register("featuresselected", this, featuresSelected);
control.selectBox(new OpenLayers.Bounds(0,0,4,4)); control.selectBox(new OpenLayers.Bounds(0,0,4,4));
control.events.unregister("beforefeatureselected", this, beforeFeatureSelected);
control.events.unregister("featureselected", this, boxTest); control.events.unregister("featureselected", this, boxTest);
control.events.unregister("beforefeaturesselected", this, beforeFeaturesSelected);
control.events.unregister("featuresselected", this, featuresSelected);
t.eq(features.length, 2, "2 features inside box selected"); t.eq(features.length, 2, "2 features inside box selected");
t.eq(features[1].id, feature2.id, "featureselected callback called with multiple features"); t.eq(features[1].id, feature2.id, "featureselected callback called with multiple features");
} }