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
This commit is contained in:
Tim Schaub
2008-07-30 22:03:40 +00:00
parent 61c528f3af
commit 6897c8ed4d
5 changed files with 103 additions and 42 deletions

View File

@@ -29,20 +29,14 @@
map.addControl(new OpenLayers.Control.LayerSwitcher()); map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition()); map.addControl(new OpenLayers.Control.MousePosition());
var modifyOptions = { function report(event) {
onModificationStart: function(feature) { OpenLayers.Console.log(event.type, event.feature.id);
OpenLayers.Console.log("start modifying", feature.id); }
}, vectors.events.on({
onModification: function(feature) { "beforefeaturemodified": report,
OpenLayers.Console.log("modified", feature.id); "featuremodified": report,
}, "afterfeaturemodified": report
onModificationEnd: function(feature) { });
OpenLayers.Console.log("end modifying", feature.id);
},
onDelete: function(feature) {
OpenLayers.Console.log("delete", feature.id);
}
};
controls = { controls = {
point: new OpenLayers.Control.DrawFeature(vectors, point: new OpenLayers.Control.DrawFeature(vectors,
OpenLayers.Handler.Point), OpenLayers.Handler.Point),
@@ -53,8 +47,7 @@
regular: new OpenLayers.Control.DrawFeature(vectors, regular: new OpenLayers.Control.DrawFeature(vectors,
OpenLayers.Handler.RegularPolygon, OpenLayers.Handler.RegularPolygon,
{handlerOptions: {sides: 5}}), {handlerOptions: {sides: 5}}),
modify: new OpenLayers.Control.ModifyFeature(vectors, modify: new OpenLayers.Control.ModifyFeature(vectors)
modifyOptions)
}; };
for(var key in controls) { for(var key in controls) {

View File

@@ -201,6 +201,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
layer, selectOptions layer, selectOptions
); );
this.layer.events.on({ this.layer.events.on({
"beforefeatureselected": this.beforeSelectFeature,
"featureselected": this.selectFeature, "featureselected": this.selectFeature,
"featureunselected": this.unselectFeature, "featureunselected": this.unselectFeature,
scope: this scope: this
@@ -239,6 +240,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
*/ */
destroy: function() { destroy: function() {
this.layer.events.un({ this.layer.events.un({
"beforefeatureselected": this.beforeSelectFeature,
"featureselected": this.selectFeature, "featureselected": this.selectFeature,
"featureunselected": this.unselectFeature, "featureunselected": this.unselectFeature,
scope: this scope: this
@@ -287,6 +289,20 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
} }
return deactivated; 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 * Method: selectFeature
@@ -301,8 +317,6 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
this.resetVertices(); this.resetVertices();
this.dragControl.activate(); this.dragControl.activate();
this.onModificationStart(this.feature); this.onModificationStart(this.feature);
this.layer.events.triggerEvent("beforefeaturemodified",
{feature: this.feature});
}, },
/** /**

View File

@@ -308,13 +308,18 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
* feature - {<OpenLayers.Feature.Vector>} * feature - {<OpenLayers.Feature.Vector>}
*/ */
select: function(feature) { select: function(feature) {
this.layer.selectedFeatures.push(feature); var cont = this.layer.events.triggerEvent("beforefeatureselected", {
feature: feature
var selectStyle = this.selectStyle || this.renderIntent; });
if(cont !== false) {
this.layer.drawFeature(feature, selectStyle); this.layer.selectedFeatures.push(feature);
this.layer.events.triggerEvent("featureselected", {feature: feature});
this.onSelect(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. * normal, and call the onUnselect function.
* *
* Parameters: * Parameters:
* feature - {<OpenLayers.Feature.Vector>} * feature - {<OpenLayers.Feature.Vector>}
*/ */
unselect: function(feature) { unselect: function(feature) {
// Store feature style for restoration later // Store feature style for restoration later

View File

@@ -72,7 +72,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
*/ */
EVENT_TYPES: ["beforefeatureadded", "featureadded", "featuresadded", EVENT_TYPES: ["beforefeatureadded", "featureadded", "featuresadded",
"beforefeatureremoved", "featureremoved", "featuresremoved", "beforefeatureremoved", "featureremoved", "featuresremoved",
"featureselected", "featureunselected", "beforefeatureselected", "featureselected", "featureunselected",
"beforefeaturemodified", "featuremodified", "afterfeaturemodified"], "beforefeaturemodified", "featuremodified", "afterfeaturemodified"],
/** /**

View File

@@ -164,22 +164,25 @@
} }
function test_selectFeature(t) { function test_selectFeature(t) {
t.plan(15); t.plan(12);
var layer = new OpenLayers.Layer.Vector(); 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); var control = new OpenLayers.Control.ModifyFeature(layer);
control.vertices = []; control.vertices = [];
control.virtualVertices = []; control.virtualVertices = [];
layer.events.on({"beforefeaturemodified": function(event) { var callback = function(obj) {
t.eq(event.feature, fakeFeature, "beforefeaturemodified triggered"); t.ok(obj.feature == fakeFeature, "beforefeaturemodified triggered");
}}); };
layer.events.on({"beforefeaturemodified": callback});
control.dragControl.activate = function() { t.ok(true, "drag Control activated"); } 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."); } control.onModificationStart = function(feature) { t.eq(feature.id, fakeFeature.id, "On Modification Start called with correct feature."); }
// Start of testing // Start of testing
control.collectVertices = function() { t.fail("Collect vertices called when geom is a point"); } 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 // Points don't call collectVertices
control.selectFeature({feature: fakeFeature}); control.selectFeature({feature: fakeFeature});
@@ -195,7 +198,13 @@
layer.addFeatures = function(features) { layer.addFeatures = function(features) {
t.ok(features == 'a' || features == 'd', "features passed correctly"); 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 // OnSelect calls collectVertices and passes features to layer
control.selectFeature({feature: fakeFeature}); control.selectFeature({feature: fakeFeature});
@@ -359,7 +368,7 @@
} }
function test_onModificationStart(t) { function test_onModificationStart(t) {
t.plan(2); t.plan(1);
var map = new OpenLayers.Map("map"); var map = new OpenLayers.Map("map");
var layer = new OpenLayers.Layer.Vector(); var layer = new OpenLayers.Layer.Vector();
map.addLayer(layer); map.addLayer(layer);
@@ -367,12 +376,6 @@
map.addControl(control); map.addControl(control);
control.activate(); 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 // make sure onModificationStart is called on feature selection
var testFeature = new OpenLayers.Feature.Vector( var testFeature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(Math.random(), Math.random()) new OpenLayers.Geometry.Point(Math.random(), Math.random())
@@ -455,6 +458,52 @@
map.destroy(); 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();
}
</script> </script>