From 6897c8ed4d1d8f2a71edd99053585a090dc07ff9 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 30 Jul 2008 22:03:40 +0000 Subject: [PATCH] Adding a beforefeatureselected event to the vector layer events. If a listener returns false, the feature is not selected. The modify feature control now listens for beforefeatureselected and triggers beforefeaturemodified. If a listener returns false, feature modification never begins. r=elemione,ahocevar (closes #1427) git-svn-id: http://svn.openlayers.org/trunk/openlayers@7616 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- examples/modify-feature.html | 25 +++----- lib/OpenLayers/Control/ModifyFeature.js | 18 +++++- lib/OpenLayers/Control/SelectFeature.js | 21 ++++--- lib/OpenLayers/Layer/Vector.js | 2 +- tests/Control/ModifyFeature.html | 79 ++++++++++++++++++++----- 5 files changed, 103 insertions(+), 42 deletions(-) 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(); + } +