From 7c0fadd14aa11f516caf4fd402ab51de7006adcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 7 Nov 2008 08:46:02 +0000 Subject: [PATCH] ModifyFeature makes SelectFeature control behave/become like ModifyFeature, patch=bjornharrtell,tschaub, r=tschaub,me (closes #1741) git-svn-id: http://svn.openlayers.org/trunk/openlayers@8302 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Control/ModifyFeature.js | 41 +++++++++-------------- lib/OpenLayers/Control/SelectFeature.js | 43 +++++++++++++++++-------- tests/Control/ModifyFeature.html | 12 +++---- 3 files changed, 51 insertions(+), 45 deletions(-) diff --git a/lib/OpenLayers/Control/ModifyFeature.js b/lib/OpenLayers/Control/ModifyFeature.js index 35282aa893..186add7583 100644 --- a/lib/OpenLayers/Control/ModifyFeature.js +++ b/lib/OpenLayers/Control/ModifyFeature.js @@ -195,17 +195,15 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { var selectOptions = { geometryTypes: this.geometryTypes, clickout: this.clickout, - toggle: this.toggle + toggle: this.toggle, + onBeforeSelect: this.beforeSelectFeature, + onSelect: this.selectFeature, + onUnselect: this.unselectFeature, + scope: this }; this.selectControl = new OpenLayers.Control.SelectFeature( layer, selectOptions ); - this.layer.events.on({ - "beforefeatureselected": this.beforeSelectFeature, - "featureselected": this.selectFeature, - "featureunselected": this.unselectFeature, - scope: this - }); // configure the drag control var dragOptions = { @@ -239,12 +237,6 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { * Take care of things that are not handled in superclass. */ destroy: function() { - this.layer.events.un({ - "beforefeatureselected": this.beforeSelectFeature, - "featureselected": this.selectFeature, - "featureunselected": this.unselectFeature, - scope: this - }); this.layer = null; this.selectControl.destroy(); this.dragControl.destroy(); @@ -295,12 +287,11 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { * Called before a feature is selected. * * Parameters: - * object - {Object} Object with a feature property referencing the - * selected feature. + * feature - {} The feature about to be selected. */ - beforeSelectFeature: function(object) { + beforeSelectFeature: function(feature) { return this.layer.events.triggerEvent( - "beforefeaturemodified", {feature: object.feature} + "beforefeaturemodified", {feature: feature} ); }, @@ -309,11 +300,10 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { * Called when the select feature control selects a feature. * * Parameters: - * object - {Object} Object with a feature property referencing the - * selected feature. + * feature - {} the selected feature. */ - selectFeature: function(object) { - this.feature = object.feature; + selectFeature: function(feature) { + this.feature = feature; this.resetVertices(); this.dragControl.activate(); this.onModificationStart(this.feature); @@ -324,10 +314,9 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { * Called when the select feature control unselects a feature. * * Parameters: - * object - {Object} Object with a feature property referencing the - * unselected feature. + * feature - {} The unselected feature. */ - unselectFeature: function(object) { + unselectFeature: function(feature) { this.layer.removeFeatures(this.vertices, {silent: true}); this.vertices = []; this.layer.destroyFeatures(this.virtualVertices, {silent: true}); @@ -342,9 +331,9 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { } this.feature = null; this.dragControl.deactivate(); - this.onModificationEnd(object.feature); + this.onModificationEnd(feature); this.layer.events.triggerEvent("afterfeaturemodified", - {feature: object.feature}); + {feature: feature}); }, /** diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js index 92f8a80f1a..6f2ac2faa7 100644 --- a/lib/OpenLayers/Control/SelectFeature.js +++ b/lib/OpenLayers/Control/SelectFeature.js @@ -65,19 +65,33 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { */ box: false, + /** + * Property: onBeforeSelect + * {Function} Optional function to be called before a feature is selected. + * The function should expect to be called with a feature. + */ + onBeforeSelect: function() {}, + /** * APIProperty: onSelect * {Function} Optional function to be called when a feature is selected. - * The function should expect to be called with a feature. + * The function should expect to be called with a feature. */ onSelect: function() {}, /** * APIProperty: onUnselect * {Function} Optional function to be called when a feature is unselected. - * The function should expect to be called with a feature. + * The function should expect to be called with a feature. */ onUnselect: function() {}, + + /** + * Property: scope + * {Object} The scope to use with the onBeforeSelect, onSelect, onUnselect + * callbacks. If null the scope will be this control. + */ + scope: this, /** * APIProperty: geometryTypes @@ -312,17 +326,20 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { * feature - {} */ select: function(feature) { - var cont = this.layer.events.triggerEvent("beforefeatureselected", { - feature: feature - }); + var cont = this.onBeforeSelect.call(this.scope, 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); + 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.call(this.scope, feature); + } } }, @@ -339,7 +356,7 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { this.layer.drawFeature(feature, "default"); OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature); this.layer.events.triggerEvent("featureunselected", {feature: feature}); - this.onUnselect(feature); + this.onUnselect.call(this.scope, feature); }, /** diff --git a/tests/Control/ModifyFeature.html b/tests/Control/ModifyFeature.html index fbc6611746..6d497b1750 100644 --- a/tests/Control/ModifyFeature.html +++ b/tests/Control/ModifyFeature.html @@ -155,7 +155,7 @@ layer.destroyFeatures = function(verts) { t.ok(verts == 'b', "Virtual verts destroyed correctly"); } - control.unselectFeature({feature: fakeFeature}); + control.unselectFeature(fakeFeature); t.eq(control.feature, null, "feature is set to null"); layer.destroyFeatures = function() {}; @@ -225,7 +225,7 @@ var fakeFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0, 0)); // Points don't call collectVertices - control.selectFeature({feature: fakeFeature}); + control.selectFeature(fakeFeature); control.collectVertices = function() { t.ok(true, "collectVertices called"); @@ -247,7 +247,7 @@ ]); // OnSelect calls collectVertices and passes features to layer - control.selectFeature({feature: fakeFeature}); + control.selectFeature(fakeFeature); control.vertices = ['a']; control.virtualVertices = ['b']; @@ -259,7 +259,7 @@ } // Features are removed whenever they exist - control.selectFeature({feature: fakeFeature}); + control.selectFeature(fakeFeature); control.destroy(); @@ -424,7 +424,7 @@ t.eq(feature.id, testFeature.id, "onModificationStart called with the right feature"); }; - control.selectFeature({feature: testFeature}); + control.selectFeature(testFeature); map.destroy(); } @@ -494,7 +494,7 @@ t.eq(feature.id, testFeature.id, "onModificationEnd called with the right feature"); }; - control.unselectFeature({feature: testFeature}); + control.unselectFeature(testFeature); map.destroy(); }