Changeset 5978
- Timestamp:
- 02/03/08 12:48:19 (1 year ago)
- Files:
-
- trunk/openlayers/examples/georss-flickr.html (modified) (3 diffs)
- trunk/openlayers/lib/OpenLayers/Format/SLD.js (modified) (1 diff)
- trunk/openlayers/lib/OpenLayers/Rule.js (modified) (1 diff)
- trunk/openlayers/lib/OpenLayers/Style.js (modified) (3 diffs)
- trunk/openlayers/tests/test_Style.html (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/openlayers/examples/georss-flickr.html
r5964 r5978 42 42 // If the above rule does not apply, use a smaller pointRadius. 43 43 var elseRule = new OpenLayers.Rule({ 44 elseFilter: true, 44 45 symbolizer: {"Point": {pointRadius: 20}}}); 45 46 … … 70 71 popupControl.activate(); 71 72 72 OpenLayers.loadURL("xml/georss-flickr.xml", "", null, afterload);73 OpenLayers.loadURL("xml/georss-flickr.xml", null, window, afterload); 73 74 74 75 } … … 89 90 createFeatureFromItem: createFeatureFromItem}); 90 91 91 rss = store.read(req.response XML);92 rss = store.read(req.responseText); 92 93 93 // get the title of the RSS feed 94 var title = req.responseXML.getElementsByTagName("title")[0] 95 .firstChild.nodeValue; 96 97 markerLayer.setName(title); 94 markerLayer.setName("Some images from Flickr"); 98 95 markerLayer.addFeatures(rss); 99 96 } trunk/openlayers/lib/OpenLayers/Format/SLD.js
r5964 r5978 208 208 var rule = this.parseFilter(filter[0]); 209 209 } else { 210 // rule applies to all features (no filter or ElseFilter)210 // start with an empty rule that always applies 211 211 var rule = new OpenLayers.Rule(); 212 } 212 // and check if the rule is an ElseFilter 213 var elseFilter = this.getElementsByTagNameNS(xmlNode, this.ogcns, 214 "ElseFilter"); 215 if (elseFilter && elseFilter.length > 0) { 216 rule.elseFilter = true; 217 } 218 } 219 213 220 rule.name = name; 214 221 trunk/openlayers/lib/OpenLayers/Rule.js
r5964 r5978 21 21 name: 'default', 22 22 23 /** 24 * Property: elseFilter 25 * {Boolean} Determines whether this rule is only to be applied only if 26 * no other rules match (ElseFilter according to the SLD specification). 27 * Default is false. For instances of OpenLayers.Rule, if elseFilter is 28 * false, the rule will always apply. For subclasses, the else property is 29 * ignored. 30 */ 31 elseFilter: false, 32 23 33 /** 24 34 * Property: symbolizer trunk/openlayers/lib/OpenLayers/Style.js
r5964 r5978 112 112 113 113 var rules = this.rules; 114 var draw = rules.length == 0 ? true : false;115 114 116 115 var rule; 117 for (var i=0; i<rules.length; i++) { 116 var elseRules = []; 117 var appliedRules = false; 118 for(var i=0; i<rules.length; i++) { 118 119 rule = rules[i]; 119 // does the rule apply? 120 // does the rule apply? 120 121 var applies = rule.evaluate(feature); 121 122 … … 133 134 rule.maxScaleDenominator, feature); 134 135 } 135 136 if (draw && rule.CLASS_NAME == "OpenLayers.Rule") { 137 // apply plain rules only if no other applied (ElseFilter) 138 applies = false; 139 } 140 141 if (applies) { 142 draw = true; 143 144 // determine which symbolizer (Point, Line, Polygon) to use 145 var symbolizerPrefix = feature.geometry ? 146 this.getSymbolizerPrefix(feature.geometry) : 147 OpenLayers.Style.SYMBOLIZER_PREFIXES[0]; 148 149 // merge the style with the current style 150 var symbolizer = this.rules[i].symbolizer[symbolizerPrefix]; 151 OpenLayers.Util.extend(style, symbolizer); 136 137 if(applies) { 138 if(rule instanceof OpenLayers.Rule && rule.elseFilter) { 139 elseRules.push(rule); 140 } else { 141 appliedRules = true; 142 this.applySymbolizer(rule, style, feature); 143 } 144 } 145 } 146 147 // if no other rules apply, apply the rules with else filters 148 if(appliedRules == false && elseRules.length > 0) { 149 appliedRules = true; 150 for(var i=0; i<elseRules.length; i++) { 151 this.applySymbolizer(elseRules[i], style, feature); 152 152 } 153 153 } … … 155 155 // calculate literals for all styles in the propertyStyles cache 156 156 this.createLiterals(style, feature); 157 style.display = draw ? "" : "none"; 157 158 // don't display if there were rules but none applied 159 if(rules.length > 0 && appliedRules == false) { 160 style.display = "none"; 161 } else { 162 style.display = ""; 163 } 158 164 159 165 return style; 166 }, 167 168 /** 169 * Method: applySymbolizer 170 * 171 * Parameters: 172 * rule - {OpenLayers.Rule} 173 * style - {Object} 174 * feature - {<OpenLayer.Feature.Vector>} 175 * 176 * Returns: 177 * {Object} A style with new symbolizer applied. 178 */ 179 applySymbolizer: function(rule, style, feature) { 180 var symbolizerPrefix = feature.geometry ? 181 this.getSymbolizerPrefix(feature.geometry) : 182 OpenLayers.Style.SYMBOLIZER_PREFIXES[0]; 183 184 // merge the style with the current style 185 var symbolizer = rule.symbolizer[symbolizerPrefix]; 186 return OpenLayers.Util.extend(style, symbolizer); 160 187 }, 161 188 trunk/openlayers/tests/test_Style.html
r5964 r5978 88 88 t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\"."); 89 89 } 90 91 function test_Style_createStyle(t) { 92 t.plan(2); 93 var style = new OpenLayers.Style(); 94 var rule = new OpenLayers.Rule({ 95 id: Math.random() 96 }); 97 var elseRule = new OpenLayers.Rule({ 98 id: Math.random(), 99 elseFilter: true 100 }); 101 style.addRules([rule, elseRule]); 102 103 // test that applySymbolizer is only called with rule 104 style.applySymbolizer = function(r) { 105 t.eq(r.id, rule.id, "(plain) applySymbolizer called with correct rule"); 106 } 107 style.createStyle(new OpenLayers.Feature.Vector()); 108 109 rule.evaluate = function() {return false;}; 110 style.applySymbolizer = function(r) { 111 t.eq(r.id, elseRule.id, "(else) applySymbolizer called with correct rule"); 112 } 113 style.createStyle(new OpenLayers.Feature.Vector()); 114 115 116 } 90 117 91 118 function test_Style_destroy(t) {
