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:
@@ -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) {
|
||||||
|
|||||||
@@ -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});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"],
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user