diff --git a/examples/modify-feature.html b/examples/modify-feature.html
index a6f88885eb..8ed9f12b37 100644
--- a/examples/modify-feature.html
+++ b/examples/modify-feature.html
@@ -29,20 +29,14 @@
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
- var modifyOptions = {
- onModificationStart: function(feature) {
- OpenLayers.Console.log("start modifying", feature.id);
- },
- onModification: function(feature) {
- OpenLayers.Console.log("modified", feature.id);
- },
- onModificationEnd: function(feature) {
- OpenLayers.Console.log("end modifying", feature.id);
- },
- onDelete: function(feature) {
- OpenLayers.Console.log("delete", feature.id);
- }
- };
+ function report(event) {
+ OpenLayers.Console.log(event.type, event.feature.id);
+ }
+ vectors.events.on({
+ "beforefeaturemodified": report,
+ "featuremodified": report,
+ "afterfeaturemodified": report
+ });
controls = {
point: new OpenLayers.Control.DrawFeature(vectors,
OpenLayers.Handler.Point),
@@ -53,8 +47,7 @@
regular: new OpenLayers.Control.DrawFeature(vectors,
OpenLayers.Handler.RegularPolygon,
{handlerOptions: {sides: 5}}),
- modify: new OpenLayers.Control.ModifyFeature(vectors,
- modifyOptions)
+ modify: new OpenLayers.Control.ModifyFeature(vectors)
};
for(var key in controls) {
diff --git a/lib/OpenLayers/Control/ModifyFeature.js b/lib/OpenLayers/Control/ModifyFeature.js
index 5be518cc35..424362cf04 100644
--- a/lib/OpenLayers/Control/ModifyFeature.js
+++ b/lib/OpenLayers/Control/ModifyFeature.js
@@ -201,6 +201,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
layer, selectOptions
);
this.layer.events.on({
+ "beforefeatureselected": this.beforeSelectFeature,
"featureselected": this.selectFeature,
"featureunselected": this.unselectFeature,
scope: this
@@ -239,6 +240,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
*/
destroy: function() {
this.layer.events.un({
+ "beforefeatureselected": this.beforeSelectFeature,
"featureselected": this.selectFeature,
"featureunselected": this.unselectFeature,
scope: this
@@ -287,6 +289,20 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
}
return deactivated;
},
+
+ /**
+ * Method: beforeSelectFeature
+ * Called before a feature is selected.
+ *
+ * Parameters:
+ * object - {Object} Object with a feature property referencing the
+ * selected feature.
+ */
+ beforeSelectFeature: function(object) {
+ return this.layer.events.triggerEvent(
+ "beforefeaturemodified", {feature: object.feature}
+ );
+ },
/**
* Method: selectFeature
@@ -301,8 +317,6 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
this.resetVertices();
this.dragControl.activate();
this.onModificationStart(this.feature);
- this.layer.events.triggerEvent("beforefeaturemodified",
- {feature: this.feature});
},
/**
diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js
index b638cd26ec..8c4d3e2616 100644
--- a/lib/OpenLayers/Control/SelectFeature.js
+++ b/lib/OpenLayers/Control/SelectFeature.js
@@ -308,13 +308,18 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
* feature - {}
*/
select: function(feature) {
- this.layer.selectedFeatures.push(feature);
-
- var selectStyle = this.selectStyle || this.renderIntent;
-
- this.layer.drawFeature(feature, selectStyle);
- this.layer.events.triggerEvent("featureselected", {feature: feature});
- this.onSelect(feature);
+ var cont = this.layer.events.triggerEvent("beforefeatureselected", {
+ feature: feature
+ });
+ if(cont !== false) {
+ this.layer.selectedFeatures.push(feature);
+
+ var selectStyle = this.selectStyle || this.renderIntent;
+
+ this.layer.drawFeature(feature, selectStyle);
+ this.layer.events.triggerEvent("featureselected", {feature: feature});
+ this.onSelect(feature);
+ }
},
/**
@@ -323,7 +328,7 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
* normal, and call the onUnselect function.
*
* Parameters:
- * feature - {}
+ * feature - {}
*/
unselect: function(feature) {
// Store feature style for restoration later
diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js
index d12db0eeb8..6cc6b66040 100644
--- a/lib/OpenLayers/Layer/Vector.js
+++ b/lib/OpenLayers/Layer/Vector.js
@@ -72,7 +72,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
*/
EVENT_TYPES: ["beforefeatureadded", "featureadded", "featuresadded",
"beforefeatureremoved", "featureremoved", "featuresremoved",
- "featureselected", "featureunselected",
+ "beforefeatureselected", "featureselected", "featureunselected",
"beforefeaturemodified", "featuremodified", "afterfeaturemodified"],
/**
diff --git a/tests/Control/ModifyFeature.html b/tests/Control/ModifyFeature.html
index 2912aeaf9c..cc0d3735f0 100644
--- a/tests/Control/ModifyFeature.html
+++ b/tests/Control/ModifyFeature.html
@@ -164,22 +164,25 @@
}
function test_selectFeature(t) {
- t.plan(15);
- var layer = new OpenLayers.Layer.Vector();
+ t.plan(12);
+ var map = new OpenLayers.Map('map');
+ var layer = new OpenLayers.Layer.Vector("Vectors!", {isBaseLayer: true});
+ map.addLayer(layer);
+ map.setCenter(new OpenLayers.LonLat(0, 0));
var control = new OpenLayers.Control.ModifyFeature(layer);
control.vertices = [];
control.virtualVertices = [];
- layer.events.on({"beforefeaturemodified": function(event) {
- t.eq(event.feature, fakeFeature, "beforefeaturemodified triggered");
- }});
+ var callback = function(obj) {
+ t.ok(obj.feature == fakeFeature, "beforefeaturemodified triggered");
+ };
+ layer.events.on({"beforefeaturemodified": callback});
control.dragControl.activate = function() { t.ok(true, "drag Control activated"); }
control.onModificationStart = function(feature) { t.eq(feature.id, fakeFeature.id, "On Modification Start called with correct feature."); }
-
// Start of testing
control.collectVertices = function() { t.fail("Collect vertices called when geom is a point"); }
- var fakeFeature = {'id':'myFakeFeature','geometry':{'CLASS_NAME':'OpenLayers.Geometry.Point'}};
+ var fakeFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0, 0));
// Points don't call collectVertices
control.selectFeature({feature: fakeFeature});
@@ -195,7 +198,13 @@
layer.addFeatures = function(features) {
t.ok(features == 'a' || features == 'd', "features passed correctly");
}
- fakeFeature.geometry.CLASS_NAME='OpenLayers.Geometry.Polygon';
+
+ fakeFeature.geometry = new OpenLayers.Geometry.Polygon([
+ new OpenLayers.Geometry.LinearRing([
+ new OpenLayers.Geometry.Point(0, 0),
+ new OpenLayers.Geometry.Point(1, 1)
+ ])
+ ]);
// OnSelect calls collectVertices and passes features to layer
control.selectFeature({feature: fakeFeature});
@@ -359,7 +368,7 @@
}
function test_onModificationStart(t) {
- t.plan(2);
+ t.plan(1);
var map = new OpenLayers.Map("map");
var layer = new OpenLayers.Layer.Vector();
map.addLayer(layer);
@@ -367,12 +376,6 @@
map.addControl(control);
control.activate();
- // test that beforefeaturemodified is triggered
- layer.events.on({"beforefeaturemodified": function(event) {
- t.eq(event.feature.id, testFeature.id,
- "beforefeaturemodified is triggered with correct feature");
- }});
-
// make sure onModificationStart is called on feature selection
var testFeature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(Math.random(), Math.random())
@@ -455,6 +458,52 @@
map.destroy();
}
+
+ function test_events(t) {
+ t.plan(2);
+ var map = new OpenLayers.Map("map");
+ var layer = new OpenLayers.Layer.Vector();
+ map.addLayer(layer);
+ var control = new OpenLayers.Control.ModifyFeature(layer);
+ map.addControl(control);
+ control.activate();
+
+ // make sure onModificationStart is called on feature selection
+ var testFeature = new OpenLayers.Feature.Vector(
+ new OpenLayers.Geometry.Point(Math.random(), Math.random())
+ );
+
+ // test that beforefeatureselected is triggered
+ function handle_beforefeatureselected(event) {
+ t.ok(event.feature == testFeature, "beforefeatureselected called with the correct feature");
+ }
+ layer.events.on({
+ "beforefeatureselected": handle_beforefeatureselected
+ });
+ layer.events.triggerEvent("beforefeatureselected", {
+ feature: testFeature
+ });
+ layer.events.un({
+ "beforefeatureselected": handle_beforefeatureselected
+ });
+
+ // test that beforefeatureselected is triggered
+ function handle_featureselected(event) {
+ t.ok(event.feature == testFeature, "featureselected called with the correct feature");
+ }
+ layer.events.on({
+ "featureselected": handle_featureselected
+ });
+ layer.events.triggerEvent("featureselected", {
+ feature: testFeature
+ });
+ layer.events.un({
+ "featureselected": handle_featureselected
+ });
+
+ map.destroy();
+ }
+