SelectFeature control can now select across multiple vector
layers when passed an array of layers instead of a single layer with the constructor. This changeset also introduces a new layer type, Layer.Vector.RootContainer, which will be set as the topmost layer by the SelectFeature control and collect the svg/vml/canvas roots of multiple vector layers. r=crschmidt (closes #1666) git-svn-id: http://svn.openlayers.org/trunk/openlayers@9116 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
* @requires OpenLayers/Control.js
|
||||
* @requires OpenLayers/Feature/Vector.js
|
||||
* @requires OpenLayers/Handler/Feature.js
|
||||
* @requires OpenLayers/Layer/Vector/RootContainer.js
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -103,10 +104,17 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
|
||||
/**
|
||||
* Property: layer
|
||||
* {<OpenLayers.Layer.Vector>}
|
||||
* {<OpenLayers.Layer.Vector>} The vector layer with a common renderer
|
||||
* root for all layers this control is configured with.
|
||||
*/
|
||||
layer: null,
|
||||
|
||||
/**
|
||||
* Property: layers
|
||||
* {Array(<OpenLayers.Layer.Vector>} The layers this control will work on.
|
||||
*/
|
||||
layers: null,
|
||||
|
||||
/**
|
||||
* APIProperty: callbacks
|
||||
* {Object} The functions that are sent to the handlers.feature for callback
|
||||
@@ -137,12 +145,20 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
* Constructor: <OpenLayers.Control.SelectFeature>
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer.Vector>}
|
||||
* layers - {<OpenLayers.Layer.Vector>}, or an array of vector layers
|
||||
* options - {Object}
|
||||
*/
|
||||
initialize: function(layer, options) {
|
||||
initialize: function(layers, options) {
|
||||
OpenLayers.Control.prototype.initialize.apply(this, [options]);
|
||||
this.layer = layer;
|
||||
if(!(layers instanceof Array)) {
|
||||
layers = [layers];
|
||||
}
|
||||
this.layers = layers;
|
||||
this.layer = new OpenLayers.Layer.Vector.RootContainer(
|
||||
this.id + "_container", {
|
||||
layers: layers
|
||||
}
|
||||
);
|
||||
var callbacks = {
|
||||
click: this.clickFeature,
|
||||
clickout: this.clickoutFeature
|
||||
@@ -155,7 +171,8 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
this.callbacks = OpenLayers.Util.extend(callbacks, this.callbacks);
|
||||
this.handlers = {
|
||||
feature: new OpenLayers.Handler.Feature(
|
||||
this, layer, this.callbacks, {geometryTypes: this.geometryTypes}
|
||||
this, this.layer, this.callbacks,
|
||||
{geometryTypes: this.geometryTypes}
|
||||
)
|
||||
};
|
||||
|
||||
@@ -166,6 +183,14 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: destroy
|
||||
*/
|
||||
destroy: function() {
|
||||
OpenLayers.Control.prototype.destroy.apply(this, arguments);
|
||||
this.layer.destroy();
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: activate
|
||||
@@ -176,6 +201,7 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
*/
|
||||
activate: function () {
|
||||
if (!this.active) {
|
||||
this.map.addLayer(this.layer);
|
||||
this.handlers.feature.activate();
|
||||
if(this.box && this.handlers.box) {
|
||||
this.handlers.box.activate();
|
||||
@@ -199,6 +225,9 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
if(this.handlers.box) {
|
||||
this.handlers.box.deactivate();
|
||||
}
|
||||
this.map.events.unregister("changelayer", this.layer,
|
||||
this.layer.handleChangeLayer);
|
||||
this.map.removeLayer(this.layer);
|
||||
}
|
||||
return OpenLayers.Control.prototype.deactivate.apply(
|
||||
this, arguments
|
||||
@@ -215,11 +244,14 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
*/
|
||||
unselectAll: function(options) {
|
||||
// we'll want an option to supress notification here
|
||||
var feature;
|
||||
for(var i=this.layer.selectedFeatures.length-1; i>=0; --i) {
|
||||
feature = this.layer.selectedFeatures[i];
|
||||
if(!options || options.except != feature) {
|
||||
this.unselect(feature);
|
||||
var layer, feature;
|
||||
for(var l=0; l<this.layers.length; ++l) {
|
||||
layer = this.layers[l];
|
||||
for(var i=layer.selectedFeatures.length-1; i>=0; --i) {
|
||||
feature = layer.selectedFeatures[i];
|
||||
if(!options || options.except != feature) {
|
||||
this.unselect(feature);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -234,8 +266,8 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
*/
|
||||
clickFeature: function(feature) {
|
||||
if(!this.hover) {
|
||||
var selected = (OpenLayers.Util.indexOf(this.layer.selectedFeatures,
|
||||
feature) > -1);
|
||||
var selected = (OpenLayers.Util.indexOf(
|
||||
feature.layer.selectedFeatures, feature) > -1);
|
||||
if(selected) {
|
||||
if(this.toggleSelect()) {
|
||||
this.unselect(feature);
|
||||
@@ -301,7 +333,7 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
*/
|
||||
overFeature: function(feature) {
|
||||
if(this.hover &&
|
||||
(OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) == -1)) {
|
||||
(OpenLayers.Util.indexOf(feature.layer.selectedFeatures, feature) == -1)) {
|
||||
this.select(feature);
|
||||
}
|
||||
},
|
||||
@@ -330,17 +362,19 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
*/
|
||||
select: function(feature) {
|
||||
var cont = this.onBeforeSelect.call(this.scope, feature);
|
||||
var layer = feature.layer;
|
||||
if(cont !== false) {
|
||||
cont = this.layer.events.triggerEvent("beforefeatureselected", {
|
||||
cont = layer.events.triggerEvent("beforefeatureselected", {
|
||||
feature: feature
|
||||
});
|
||||
if(cont !== false) {
|
||||
this.layer.selectedFeatures.push(feature);
|
||||
|
||||
layer.selectedFeatures.push(feature);
|
||||
this.layerData = {};
|
||||
|
||||
var selectStyle = this.selectStyle || this.renderIntent;
|
||||
|
||||
this.layer.drawFeature(feature, selectStyle);
|
||||
this.layer.events.triggerEvent("featureselected", {feature: feature});
|
||||
layer.drawFeature(feature, selectStyle);
|
||||
layer.events.triggerEvent("featureselected", {feature: feature});
|
||||
this.onSelect.call(this.scope, feature);
|
||||
}
|
||||
}
|
||||
@@ -355,10 +389,11 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
* feature - {<OpenLayers.Feature.Vector>}
|
||||
*/
|
||||
unselect: function(feature) {
|
||||
var layer = feature.layer;
|
||||
// Store feature style for restoration later
|
||||
this.layer.drawFeature(feature, "default");
|
||||
OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature);
|
||||
this.layer.events.triggerEvent("featureunselected", {feature: feature});
|
||||
layer.drawFeature(feature, "default");
|
||||
OpenLayers.Util.removeItem(layer.selectedFeatures, feature);
|
||||
layer.events.triggerEvent("featureunselected", {feature: feature});
|
||||
this.onUnselect.call(this.scope, feature);
|
||||
},
|
||||
|
||||
@@ -390,13 +425,17 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
// because we're using a box, we consider we want multiple selection
|
||||
var prevMultiple = this.multiple;
|
||||
this.multiple = true;
|
||||
for(var i=0, len = this.layer.features.length; i<len; ++i) {
|
||||
var feature = this.layer.features[i];
|
||||
if (this.geometryTypes == null || OpenLayers.Util.indexOf(
|
||||
this.geometryTypes, feature.geometry.CLASS_NAME) > -1) {
|
||||
if (bounds.toGeometry().intersects(feature.geometry)) {
|
||||
if (OpenLayers.Util.indexOf(this.layer.selectedFeatures, feature) == -1) {
|
||||
this.select(feature);
|
||||
var layer;
|
||||
for(var l=0; l<this.layers.length; ++l) {
|
||||
layer = this.layers[l];
|
||||
for(var i=0, len = layer.features.length; i<len; ++i) {
|
||||
var feature = layer.features[i];
|
||||
if (this.geometryTypes == null || OpenLayers.Util.indexOf(
|
||||
this.geometryTypes, feature.geometry.CLASS_NAME) > -1) {
|
||||
if (bounds.toGeometry().intersects(feature.geometry)) {
|
||||
if (OpenLayers.Util.indexOf(layer.selectedFeatures, feature) == -1) {
|
||||
this.select(feature);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -419,6 +458,6 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
|
||||
}
|
||||
OpenLayers.Control.prototype.setMap.apply(this, arguments);
|
||||
},
|
||||
|
||||
|
||||
CLASS_NAME: "OpenLayers.Control.SelectFeature"
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user