From c5dd8ada2c1ff146d37c5e529ba49a0ac81910e2 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 12 Feb 2008 23:05:47 +0000 Subject: [PATCH] "users should be able to customize the select style per feature": Created a !StyleMap class which stores all styles that are needed for a layer. Controls that need to render features differently can now just give a render intent (e.g. "default", "select" or "temporary") to the layer's drawFeature method, instead of having extra style informations like Control.!SelectFeature.selectStyle. Existing application that set layer.style or feature.style are still supported, but both of these style properties are now null by default. r=crschmidt,elemoine,tschaub (closes #1120) git-svn-id: http://svn.openlayers.org/trunk/openlayers@6240 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- examples/georss-flickr.html | 8 +- examples/openmnnd.html | 4 +- examples/osm-layer.html | 2 +- examples/sld.html | 37 +++----- examples/wfs-scribble.html | 2 +- lib/OpenLayers.js | 1 + lib/OpenLayers/Control/ModifyFeature.js | 7 +- lib/OpenLayers/Control/SelectFeature.js | 34 +++---- lib/OpenLayers/Feature/Vector.js | 6 ++ lib/OpenLayers/Format/SLD.js | 4 - lib/OpenLayers/Layer/Vector.js | 33 +++---- lib/OpenLayers/Style.js | 11 ++- lib/OpenLayers/StyleMap.js | 115 ++++++++++++++++++++++++ tests/Control/test_ModifyFeature.html | 3 +- tests/Control/test_SelectFeature.html | 36 ++------ tests/Layer/test_Vector.html | 26 ++---- tests/list-tests.html | 1 + tests/test_Style.html | 25 +++--- tests/test_StyleMap.html | 44 +++++++++ 19 files changed, 257 insertions(+), 142 deletions(-) create mode 100644 lib/OpenLayers/StyleMap.js create mode 100644 tests/test_StyleMap.html diff --git a/examples/georss-flickr.html b/examples/georss-flickr.html index c9ba0dbc25..7e8d3037e9 100644 --- a/examples/georss-flickr.html +++ b/examples/georss-flickr.html @@ -31,6 +31,9 @@ // the thumbail attribute of the rss item style = new OpenLayers.Style({externalGraphic: "${thumbnail}"}); + // make the thumbnails larger when we select them + selectStyle = new OpenLayers.Style({pointRadius: 35}); + // create a rule with a point symbolizer that will make the thumbnail // larger if the title of the rss item conatins "powder" var rule = new OpenLayers.Rule.Comparison({ @@ -47,12 +50,13 @@ style.addRules([rule, elseRule]); - markerLayer = new OpenLayers.Layer.Vector("", {style: style}); + markerLayer = new OpenLayers.Layer.Vector("", {styleMap: new OpenLayers.StyleMap({ + "default": style, + "select": selectStyle})}); map.addLayer(markerLayer); // control that will show a popup when clicking on a thumbnail var popupControl = new OpenLayers.Control.SelectFeature(markerLayer, { - selectStyle: style, onSelect: function(feature) { var pos = feature.geometry; if (popup) { diff --git a/examples/openmnnd.html b/examples/openmnnd.html index fc560d1741..c189e75074 100644 --- a/examples/openmnnd.html +++ b/examples/openmnnd.html @@ -28,7 +28,7 @@ map.addLayer(wms); - wfs = new OpenLayers.Layer.WFS("Minnesota Streams (WFS)", wfs_url, {'typename':'streams'}, {ratio:1.25, minZoomLevel:4}); + wfs = new OpenLayers.Layer.WFS("Minnesota Streams (WFS)", wfs_url, {'typename':'streams'}, {ratio:1.25, minZoomLevel:4, style: OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default'])}); // preFeatureInsert can be used to set style before the feature is drawn wfs.preFeatureInsert= function(feature) { feature.style.strokeWidth="3"; feature.style.strokeColor="blue"; @@ -57,7 +57,7 @@ map.addLayer(pwfs); rstyle = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); - OpenLayers.Util.extend(rstyle, {'strokeColor': 'white', strokeWIdth: "4"}); + OpenLayers.Util.extend(rstyle, {'strokeColor': 'white', strokeWidth: "4"}); rwfs = new OpenLayers.Layer.WFS("Minnesota Roads (WFS)", wfs_url, {'typename':'roads'}, {ratio:1.25, minZoomLevel:7, extractAttributes: true, style:rstyle}); diff --git a/examples/osm-layer.html b/examples/osm-layer.html index fa640c607d..77499350fa 100644 --- a/examples/osm-layer.html +++ b/examples/osm-layer.html @@ -47,7 +47,7 @@ gml.loadGML(); } function style_osm_feature(feature) { - feature.style.fill = "black"; + feature.style = OpenLayers.Util.extend({'fill':'black'}, OpenLayers.Feature.Vector.style['default']); if (feature.attributes.highway == "motorway") { feature.style.strokeColor = "blue"; feature.style.strokeWidth = 5; diff --git a/examples/sld.html b/examples/sld.html index 24f6e2b6ce..0a23159f2d 100644 --- a/examples/sld.html +++ b/examples/sld.html @@ -32,41 +32,33 @@ styles = sld[1]; - waterStyle = styles["WaterBodies"]; + // for the hover style, we do not want to use the SLD default as + // base style + styles["WaterBodies"]["Hover Styler"].defaultStyle = OpenLayers.Util.extend({}, + OpenLayers.Feature.Vector.style["select"]); gmlLayers = [ // use the sld UserStyle named "Default Styler" new OpenLayers.Layer.GML("StateBoundaries", "tasmania/TasmaniaStateBoundaries.xml", { - style: waterStyle["default"]}), + styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}), new OpenLayers.Layer.GML("Roads", "tasmania/TasmaniaRoads.xml", { - style: waterStyle["default"]}), + styleMap: new OpenLayers.StyleMap(styles["Roads"])}), new OpenLayers.Layer.GML("WaterBodies", "tasmania/TasmaniaWaterBodies.xml", { - style: waterStyle["default"]}), + styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}), new OpenLayers.Layer.GML("Cities", "tasmania/TasmaniaCities.xml", { - style: waterStyle["default"]})]; + styleMap: new OpenLayers.StyleMap(styles["Cities"])})]; - // add the first layer with the style passed to the constructor - map.addLayer(gmlLayers[0]); - // add the other layers after setting the style using the - // setStyle() method, which will pick the correct default style - // from the styles hash we got back from - // OpenLayers.Format.SLD.read() - for (var i=1; i diff --git a/examples/wfs-scribble.html b/examples/wfs-scribble.html index 479a5db714..9e1bdb57df 100644 --- a/examples/wfs-scribble.html +++ b/examples/wfs-scribble.html @@ -35,7 +35,7 @@ df = new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Path, {handlerOptions: {'freehand': false}, 'displayClass': 'olControlDrawFeaturePath'}); df.featureAdded = function(feature) { feature.state = OpenLayers.State.INSERT; - feature.style['strokeColor'] = "#ff0000"; + feature.style = OpenLayers.Util.extend({'strokeColor': '#ff0000'}, OpenLayers.Feature.Vector.style['default']); feature.layer.drawFeature(feature); } p.addControls([ new OpenLayers.Control.Navigation(), df ]); diff --git a/lib/OpenLayers.js b/lib/OpenLayers.js index 6ff0068a2b..ebc8f120bb 100644 --- a/lib/OpenLayers.js +++ b/lib/OpenLayers.js @@ -177,6 +177,7 @@ "OpenLayers/Layer/PointTrack.js", "OpenLayers/Layer/GML.js", "OpenLayers/Style.js", + "OpenLayers/StyleMap.js", "OpenLayers/Rule.js", "OpenLayers/Rule/FeatureId.js", "OpenLayers/Rule/Logical.js", diff --git a/lib/OpenLayers/Control/ModifyFeature.js b/lib/OpenLayers/Control/ModifyFeature.js index 9ee2dcb1fc..29f206380a 100644 --- a/lib/OpenLayers/Control/ModifyFeature.js +++ b/lib/OpenLayers/Control/ModifyFeature.js @@ -167,7 +167,8 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { this.layer = layer; this.vertices = []; this.virtualVertices = []; - this.styleVirtual = OpenLayers.Util.extend({}, this.layer.style); + this.styleVirtual = OpenLayers.Util.extend({}, + this.layer.style || this.layer.styleMap.createSymbolizer()); this.styleVirtual.fillOpacity = 0.3; this.styleVirtual.strokeOpacity = 0.3; this.deleteCodes = [46, 100]; @@ -409,7 +410,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { this.layer.destroyFeatures(this.virtualVertices); this.virtualVertices = []; } - this.layer.drawFeature(this.feature, this.selectControl.selectStyle); + this.layer.drawFeature(this.feature, this.selectControl.renderIntent); } // keep the vertex on top so it gets the mouseout after dragging // this should be removed in favor of an option to draw under or @@ -496,7 +497,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { // remove the vertex vertex.geometry.parent.removeComponent(vertex.geometry); this.layer.drawFeature(this.feature, - this.selectControl.selectStyle); + this.selectControl.renderIntent); this.resetVertices(); this.onModification(this.feature); } diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js index 5e2292bf2b..039ef7e8c9 100644 --- a/lib/OpenLayers/Control/SelectFeature.js +++ b/lib/OpenLayers/Control/SelectFeature.js @@ -95,7 +95,14 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { * APIProperty: selectStyle * {Object} Hash of styles */ - selectStyle: OpenLayers.Feature.Vector.style['select'], + selectStyle: null, + + /** + * Property: renderIntent + * {String} key used to retrieve the select style from the layer's + * style map. + */ + renderIntent: "select", /** * Property: handler @@ -247,25 +254,11 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { * feature - {} */ select: function(feature) { - // Store feature style for restoration later - if(feature.originalStyle != feature.style) { - feature.originalStyle = feature.style; - } this.layer.selectedFeatures.push(feature); - var selectStyle = this.selectStyle; - - if (feature.style.CLASS_NAME == "OpenLayers.Style") { - feature.style = feature.style.createStyle(feature); - } else { - feature.style = OpenLayers.Util.extend({}, feature.style); - } - if (selectStyle.CLASS_NAME == "OpenLayers.Style") { - selectStyle = selectStyle.createStyle(feature); - } - OpenLayers.Util.extend(feature.style, selectStyle); - - this.layer.drawFeature(feature); + var selectStyle = this.selectStyle || this.renderIntent; + + this.layer.drawFeature(feature, selectStyle); this.layer.events.triggerEvent("featureselected", {feature: feature}); this.onSelect(feature); }, @@ -280,10 +273,7 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { */ unselect: function(feature) { // Store feature style for restoration later - if(feature.originalStyle != null) { - feature.style = feature.originalStyle; - } - this.layer.drawFeature(feature); + this.layer.drawFeature(feature, "default"); OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature); this.layer.events.triggerEvent("featureunselected", {feature: feature}); this.onUnselect(feature); diff --git a/lib/OpenLayers/Feature/Vector.js b/lib/OpenLayers/Feature/Vector.js index 094cbe4eae..998d312e0e 100644 --- a/lib/OpenLayers/Feature/Vector.js +++ b/lib/OpenLayers/Feature/Vector.js @@ -59,6 +59,12 @@ OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, { */ style: null, + /** + * Property: renderIntent + * {String} rendering intent currently being used + */ + renderIntent: "default", + /** * Constructor: OpenLayers.Feature.Vector * Create a vector feature. diff --git a/lib/OpenLayers/Format/SLD.js b/lib/OpenLayers/Format/SLD.js index 92980ac6f5..49223ee90e 100644 --- a/lib/OpenLayers/Format/SLD.js +++ b/lib/OpenLayers/Format/SLD.js @@ -195,7 +195,6 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, { * * Parameters: * xmlNode - {} - * name - {String} The name of the returned rule. * * Returns: * {Object} Hash of rule properties @@ -567,9 +566,6 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, { * xmlNodeList - {Array()} list to search * attributeName - {String} name of the attribute to match * attributeValue - {String} optional value of the attribute - * - * Returns: - * {DOMElement} */ getNodeWithAttribute: function(xmlNodeList, attributeName, attributeValue) { for (var i=0; i} + */ + styleMap: null, /** * Property: renderers @@ -147,9 +153,6 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { OpenLayers.Layer.prototype.EVENT_TYPES ); - var defaultStyle = OpenLayers.Feature.Vector.style['default']; - this.style = OpenLayers.Util.extend({}, defaultStyle); - OpenLayers.Layer.prototype.initialize.apply(this, arguments); // allow user-set renderer, otherwise assign one @@ -163,6 +166,10 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { this.displayError(); } + if (!this.styleMap) { + this.styleMap = new OpenLayers.StyleMap(); + } + this.features = []; this.selectedFeatures = []; }, @@ -312,7 +319,7 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { //give feature reference to its layer feature.layer = this; - if (!feature.style) { + if (!feature.style && this.style) { feature.style = OpenLayers.Util.extend({}, this.style); } @@ -403,21 +410,17 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { * * Parameters: * feature - {} - * style - {Object} + * style - {Object} Symbolizer hash or {String} renderIntent */ drawFeature: function(feature, style) { - if(style == null) { - if(feature.style) { - style = feature.style; - } else { - style = this.style; + if (typeof style != "object") { + var renderIntent = typeof style == "string" ? + style : feature.renderIntent; + style = feature.style || this.style; + if (!style) { + style = this.styleMap.createSymbolizer(feature, renderIntent); } } - - if (style && style.CLASS_NAME && - style.CLASS_NAME == "OpenLayers.Style") { - style = style.createStyle(feature); - } this.renderer.drawFeature(feature, style); }, diff --git a/lib/OpenLayers/Style.js b/lib/OpenLayers/Style.js index 941c6c2bdd..61294d3920 100644 --- a/lib/OpenLayers/Style.js +++ b/lib/OpenLayers/Style.js @@ -43,8 +43,8 @@ OpenLayers.Style = OpenLayers.Class({ /** * Property: defaultStyle * {Object} hash of style properties to use as default for merging - * rule-based style symbolizers onto. If no rules are defined, createStyle - * will return this style. + * rule-based style symbolizers onto. If no rules are defined, + * createSymbolizer will return this style. */ defaultStyle: null, @@ -96,18 +96,17 @@ OpenLayers.Style = OpenLayers.Class({ }, /** - * APIMethod: createStyle + * Method: createSymbolizer * creates a style by applying all feature-dependent rules to the base * style. * * Parameters: * feature - {} feature to evaluate rules for - * baseStyle - {Object} hash of styles feature styles to extend * * Returns: - * {} hash of feature styles + * {Object} symbolizer hash */ - createStyle: function(feature) { + createSymbolizer: function(feature) { var style = OpenLayers.Util.extend({}, this.defaultStyle); var rules = this.rules; diff --git a/lib/OpenLayers/StyleMap.js b/lib/OpenLayers/StyleMap.js new file mode 100644 index 0000000000..ec4ddbbb13 --- /dev/null +++ b/lib/OpenLayers/StyleMap.js @@ -0,0 +1,115 @@ +/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD + * license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the + * full text of the license. */ + +/** + * @requires OpenLayers/Style.js + * @requires OpenLayers/Feature/Vector.js + */ + +/** + * Class: OpenLayers.StyleMap + */ +OpenLayers.StyleMap = OpenLayers.Class({ + + /** + * Property: styles + * Hash of {}, keyed by names of well known + * rendering intents (e.g. "default", "temporary", "select"). + */ + styles: null, + + /** + * Property: extendDefault + * {Boolean} if true, every render intent will extend the symbolizers + * specified for the "default" intent. Otherwise, every rendering intent + * is treated as a completely independent symbolizer. + */ + extendDefault: true, + + /** + * Constructor: OpenLayers.StyleMap + * + * Parameters: + * style - {Object} Optional. Either a style hash, or a style object, or + * a hash of style objects (style hashes) keyed by rendering + * intent + * options - {Object} optional hash of additional options for this + * instance + */ + initialize: function (style, options) { + this.styles = { + "default": new OpenLayers.Style( + OpenLayers.Feature.Vector.style["default"]), + "select": new OpenLayers.Style( + OpenLayers.Feature.Vector.style["select"]), + "temporary": new OpenLayers.Style( + OpenLayers.Feature.Vector.style["temporary"]) + }; + + // take whatever the user passed as style parameter and convert it + // into parts of stylemap. + if(style instanceof OpenLayers.Style) { + // user passed a style object + this.styles["default"] = style; + } else if(typeof style == "object") { + for(var key in style) { + if(style[key] instanceof OpenLayers.Style) { + // user passed a hash of style objects + this.styles[key] = style[key]; + } else if(typeof style[key] == "object") { + // user passsed a hash of style hashes + this.styles[key] = new OpenLayers.Style(style[key]); + } else { + // user passed a style hash (i.e. symbolizer) + this.styles["default"] = new OpenLayers.Style(style); + break; + } + } + } + OpenLayers.Util.extend(this, options); + }, + + /** + * Method: destroy + */ + destroy: function() { + for(var key in this.styles) { + this.styles[key].destroy(); + } + this.styles = null; + }, + + /** + * Method: createSymbolizer + * Creates the symbolizer for a feature for a render intent. + * + * Parameters: + * feature - {} The feature to evaluate the rules + * of the intended style against. + * intent - {String} The intent determines the symbolizer that will be + * used to draw the feature. Well known intents are "default" + * (for just drawing the features), "select" (for selected + * features) and "temporary" (for drawing features). + * + * Returns: + * {Object} symbolizer hash + */ + createSymbolizer: function(feature, intent) { + if(!feature) { + feature = new OpenLayers.Feature.Vector(); + } + if(!this.styles[intent]) { + intent = "default"; + } + feature.renderIntent = intent; + var defaultSymbolizer = {}; + if(this.extendDefault && intent != "default") { + defaultSymbolizer = this.styles["default"].createSymbolizer(feature); + } + return OpenLayers.Util.extend(defaultSymbolizer, + this.styles[intent].createSymbolizer(feature)); + }, + + CLASS_NAME: "OpenLayers.StyleMap" +}); diff --git a/tests/Control/test_ModifyFeature.html b/tests/Control/test_ModifyFeature.html index 855011d4e1..268ce26424 100644 --- a/tests/Control/test_ModifyFeature.html +++ b/tests/Control/test_ModifyFeature.html @@ -6,6 +6,7 @@ function test_ModifyFeature_constructor(t) { t.plan(3); var layer = { + styleMap: {createSymbolizer: function(){}}, events: { on: function() {} } @@ -77,7 +78,7 @@ */ var control = new OpenLayers.Control.ModifyFeature({ - style: null, + styleMap: {createSymbolizer: function(){}}, events: { on: function() {} } diff --git a/tests/Control/test_SelectFeature.html b/tests/Control/test_SelectFeature.html index 6ba8573c1f..f6cf6e2cd0 100644 --- a/tests/Control/test_SelectFeature.html +++ b/tests/Control/test_SelectFeature.html @@ -33,44 +33,20 @@ } function test_Control_SelectFeature_select(t) { - t.plan(7); + t.plan(2); var map = new OpenLayers.Map("map"); var layer = new OpenLayers.Layer.Vector(); map.addLayer(layer); var control = new OpenLayers.Control.SelectFeature(layer); var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0)); layer.addFeatures(feature); - layer.drawFeature = function() { } + layer.drawFeature = function(feature, style) { + layer.styleMap.createSymbolizer(feature, style); + } control.select(feature); - t.eq(feature.style.strokeColor, OpenLayers.Feature.Vector.style['select'].strokeColor, "feature style is set to select style"); + t.eq(feature.renderIntent, "select", "render intent is set to select"); control.unselect(feature); - t.eq(feature.style.strokeColor, OpenLayers.Feature.Vector.style['default'].strokeColor, "feature style is set back to old style"); - - // Don't ever overwrite my feature style with undefined properties from the selectStyle - feature.style = {externalGraphic: "foo.png", pointRadius: 39}; - control.selectStyle.pointRadius = undefined; - control.select(feature); - t.eq(feature.style.pointRadius, 39, "undefined style property inherited from original feature style"); - control.unselect(feature); - - // Ok, that one went well. But I'm sure you cannot handle OL.Style. - feature.style = new OpenLayers.Style({externalGraphic: "foo.png", pointRadius: 39}); - control.select(feature); - t.eq(feature.style.pointRadius, 39, "undefined style property inherited from original feature style object"); - control.unselect(feature); - - // Wow, but using OL.Style as selectStyle will break you. - control.selectStyle = new OpenLayers.Style({strokeColor: "green"}); - control.select(feature); - t.eq(feature.style.strokeColor, "green", "style correct if both feature.style and selectStyle are OL.Style"); - control.unselect(feature); - - // Not bad, not bad. And what if I set feature.style back to a style hash? - feature.style = layer.style; - control.select(feature); - t.eq(feature.style.strokeColor, "green", "style still correct with only selectStyle being OL.Style"); - control.unselect(feature); - t.eq(feature.style.strokeColor, OpenLayers.Feature.Vector.style["default"].strokeColor, "style set back to original correctly"); + t.eq(feature.renderIntent, "default", "render intent is set back to default"); } function test_Control_SelectFeature_clickFeature(t) { diff --git a/tests/Layer/test_Vector.html b/tests/Layer/test_Vector.html index 45d7834bcb..b2c6a1697c 100644 --- a/tests/Layer/test_Vector.html +++ b/tests/Layer/test_Vector.html @@ -69,18 +69,6 @@ "OpenLayers.Layer.Vector.removeFeatures(layer.features) removes all feature from the features array"); } - function test_Layer_Vector_addStyle (t) { - t.plan(2); - var layer = new OpenLayers.Layer.Vector(name); - var map = new OpenLayers.Map('map'); - map.addLayer(layer); - var g = new OpenLayers.Geometry.Point(0, 0); - var f = new OpenLayers.Feature.Vector(g); - t.eq( f.style, null, "Feature style is null by default."); - layer.addFeatures(f); - t.ok( f.style != null, "Feature style is set by layer."); - } - function test_Layer_Vector_drawFeature(t) { t.plan(4); var layer = new OpenLayers.Layer.Vector("Test Layer"); @@ -106,22 +94,22 @@ t.ok(geometry.equals(f.geometry), "calls layer.renderer.drawFeature() with feature.geometry"); - feature.style = 'exists'; + feature.style = {foo: "bar"}; layer.drawFeature(feature); t.eq(feature.style, s, "calls layer.renderer.drawFeature() with feature.style"); feature.style = null; - layer.style = 'exists'; + layer.style = {foo: "bar"}; layer.drawFeature(feature); - t.eq(layer.style, s, + t.eq(layer.style.foo, s.foo, "given null feature style, uses layer style"); - feature.style = 'exists'; - layer.style = 'exists'; - var customStyle = 'custom'; + feature.style = {foo1: "bar1"}; + layer.style = {foo2: "bar2"}; + var customStyle = {foo: "bar"}; layer.drawFeature(feature, customStyle); - t.eq(customStyle, s, + t.eq(customStyle.foo, s.foo, "given a custom style, renders with that"); } diff --git a/tests/list-tests.html b/tests/list-tests.html index 158c2ddb4e..89bdc61e98 100644 --- a/tests/list-tests.html +++ b/tests/list-tests.html @@ -42,6 +42,7 @@
  • test_Feature.html
  • Feature/test_Vector.html
  • test_Style.html
  • +
  • test_StyleMap.html
  • test_Rule.html
  • Rule/test_Comparison.html
  • Rule/test_FeatureId.html
  • diff --git a/tests/test_Style.html b/tests/test_Style.html index 8523c11ca7..c0a5762ab8 100644 --- a/tests/test_Style.html +++ b/tests/test_Style.html @@ -11,7 +11,7 @@ t.ok(style instanceof OpenLayers.Style, "new OpenLayers.Style returns object" ); t.eq(style.foo, "bar", "constructor sets options correctly"); - t.eq(typeof style.createStyle, "function", "style has a createStyle function"); + t.eq(typeof style.createSymbolizer, "function", "style has a createSymbolizer function"); } function test_Style_create(t) { @@ -45,11 +45,12 @@ var feature = new OpenLayers.Feature.Vector( new OpenLayers.Geometry.Point(3,5), - {"foo": "bar"}, - style); + {"foo": "bar"}); feature.fid = "1"; // for this fid, the above rule should apply + + layer.styleMap = new OpenLayers.StyleMap(style); layer.addFeatures([feature]); map.addLayer(layer); @@ -58,37 +59,37 @@ map.setCenter(new OpenLayers.LonLat(3,5), 10); // at this scale, the feature should be green - var createdStyle = style.createStyle(feature); + var createdStyle = style.createSymbolizer(feature); t.eq(createdStyle.externalGraphic, "barbar.png", "Calculated property style correctly."); t.eq(createdStyle.display, "", "Feature is visible at scale "+map.getScale()); t.eq(createdStyle.fillColor, "green", "Point symbolizer from rule applied correctly."); map.setCenter(new OpenLayers.LonLat(3,5), 9); // at this scale, the feature should be red - createdStyle = style.createStyle(feature); + createdStyle = style.createSymbolizer(feature); t.eq(createdStyle.display, "", "Feature is visible at scale "+map.getScale()); t.eq(createdStyle.fillColor, "yellow", "Point symbolizer from rule applied correctly."); map.setCenter(new OpenLayers.LonLat(3,5), 8); // at this scale, the feature should be yellow - createdStyle = style.createStyle(feature); + createdStyle = style.createSymbolizer(feature); t.eq(createdStyle.display, "", "Feature is visible at scale "+map.getScale()); t.eq(createdStyle.fillColor, "red", "Point symbolizer from rule applied correctly."); map.setCenter(new OpenLayers.LonLat(3,5), 7); // at this scale, the feature should be invisible - createdStyle = style.createStyle(feature); + createdStyle = style.createSymbolizer(feature); t.eq(createdStyle.display, "none", "Feature is invisible at scale "+map.getScale()); t.eq(createdStyle.fillColor, baseStyle.fillColor, "Point symbolizer from base style applied correctly."); feature.fid = "2"; // now the rule should not apply - createdStyle = style.createStyle(feature); + createdStyle = style.createSymbolizer(feature); t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\"."); } - function test_Style_createStyle(t) { + function test_Style_createSymbolizer(t) { t.plan(2); var style = new OpenLayers.Style(); var rule = new OpenLayers.Rule({ @@ -104,13 +105,13 @@ style.applySymbolizer = function(r) { t.eq(r.id, rule.id, "(plain) applySymbolizer called with correct rule"); } - style.createStyle(new OpenLayers.Feature.Vector()); + style.createSymbolizer(new OpenLayers.Feature.Vector()); rule.evaluate = function() {return false;}; style.applySymbolizer = function(r) { t.eq(r.id, elseRule.id, "(else) applySymbolizer called with correct rule"); } - style.createStyle(new OpenLayers.Feature.Vector()); + style.createSymbolizer(new OpenLayers.Feature.Vector()); } function test_Style_context(t) { @@ -126,7 +127,7 @@ symbolizer: {"Point": {externalGraphic: "${foo}.png"}}}); var style = new OpenLayers.Style(); style.addRules([rule]); - var styleHash = style.createStyle(new OpenLayers.Feature.Vector()); + var styleHash = style.createSymbolizer(new OpenLayers.Feature.Vector()); t.eq(styleHash.externalGraphic, "bar.png", "correctly evaluated rule against a custom context"); } diff --git a/tests/test_StyleMap.html b/tests/test_StyleMap.html new file mode 100644 index 0000000000..221335221a --- /dev/null +++ b/tests/test_StyleMap.html @@ -0,0 +1,44 @@ + + + + + + +
    + +