diff --git a/examples/symbolizers-fill-stroke-graphic.html b/examples/symbolizers-fill-stroke-graphic.html index 387ac2e313..848512b590 100644 --- a/examples/symbolizers-fill-stroke-graphic.html +++ b/examples/symbolizers-fill-stroke-graphic.html @@ -25,7 +25,8 @@ new OpenLayers.Rule({ symbolizer: { graphic: false, - label: "Label for invisible point" + label: "Label for invisible point", + labelSelect: true }, filter: new OpenLayers.Filter.Comparison({ type: "==", @@ -105,6 +106,13 @@ vectorLayer.drawFeature(multiFeature); map.setCenter(new OpenLayers.LonLat(point.x, point.y), 4); vectorLayer.addFeatures([pointFeature, polygonFeature, multiFeature]); + var select = new OpenLayers.Control.SelectFeature(vectorLayer, { + selectStyle: OpenLayers.Util.extend( + {fill: true, stroke: true}, + OpenLayers.Feature.Vector.style["select"]) + }); + map.addControl(select); + select.activate(); } @@ -117,6 +125,8 @@
This example shows how to use symbolizers with defaults for stroke, fill, and graphic. + This also allows to create labels for a feature without the feature rendered. Click on + the label in the middle to see selection of features with labelSelect set to true.
diff --git a/lib/OpenLayers/Feature/Vector.js b/lib/OpenLayers/Feature/Vector.js index ecb7ccb087..d8064bdc30 100644 --- a/lib/OpenLayers/Feature/Vector.js +++ b/lib/OpenLayers/Feature/Vector.js @@ -349,6 +349,8 @@ OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, { * alignment. Valid values for horizontal alignment: "l"=left, "c"=center, "r"=right. Valid values for vertical * alignment: "t"=top, "m"=middle, "b"=bottom. Example values: "lt", "cm", "rb". The canvas renderer does not * support vertical alignment, it will always use "b". + * labelSelect - {Boolean} If set to true, labels will be selectable using SelectFeature or similar controls. + * Default is false. * fontColor - {String} The font color for the label, to be provided like CSS. * fontFamily - {String} The font family for the label, to be provided like in CSS. * fontSize - {String} The font size for the label, to be provided like in CSS. diff --git a/lib/OpenLayers/Renderer/SVG.js b/lib/OpenLayers/Renderer/SVG.js index 640447ebbf..14bc03f6b5 100644 --- a/lib/OpenLayers/Renderer/SVG.js +++ b/lib/OpenLayers/Renderer/SVG.js @@ -673,7 +673,6 @@ OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, { label.setAttributeNS(null, "x", x); label.setAttributeNS(null, "y", -y); - label.setAttributeNS(null, "pointer-events", "none"); if (style.fontColor) { label.setAttributeNS(null, "fill", style.fontColor); @@ -687,6 +686,15 @@ OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, { if (style.fontWeight) { label.setAttributeNS(null, "font-weight", style.fontWeight); } + if(style.labelSelect === true) { + label.setAttributeNS(null, "pointer-events", "visible"); + label._featureId = featureId; + tspan._featureId = featureId; + tspan._geometry = location; + tspan._geometryClass = location.CLASS_NAME; + } else { + label.setAttributeNS(null, "pointer-events", "none"); + } var align = style.labelAlign || "cm"; label.setAttributeNS(null, "text-anchor", OpenLayers.Renderer.SVG.LABEL_ALIGN[align[0]] || "middle"); diff --git a/lib/OpenLayers/Renderer/VML.js b/lib/OpenLayers/Renderer/VML.js index bf85306a86..874365b351 100644 --- a/lib/OpenLayers/Renderer/VML.js +++ b/lib/OpenLayers/Renderer/VML.js @@ -818,6 +818,12 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { if (style.fontWeight) { textbox.style.fontWeight = style.fontWeight; } + if(style.labelSelect === true) { + label._featureId = featureId; + textbox._featureId = featureId; + textbox._geometry = location; + textbox._geometryClass = location.CLASS_NAME; + } textbox.style.whiteSpace = "nowrap"; // fun with IE: IE7 in standards compliant mode does not display any // text with a left inset of 0. So we set this to 1px and subtract one @@ -836,6 +842,7 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { (OpenLayers.Renderer.VML.LABEL_SHIFT[align.substr(1,1)]); label.style.left = parseInt(label.style.left)-xshift-1+"px"; label.style.top = parseInt(label.style.top)+yshift+"px"; + }, /**