Changeset 7057 in josm for trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
- Timestamp:
- 2014-05-04T12:55:06+02:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
r7056 r7057 58 58 private ZipFile zipFile; 59 59 60 private static int usedId = 1;61 62 60 public MapCSSStyleSource(String url, String name, String shortdescription) { 63 61 super(url, name, shortdescription); … … 120 118 // optimization: filter rules for different primitive types 121 119 for (MapCSSRule r: rules) { 122 // find the rightmost selector, this must be a GeneralSelector 123 Selector selRightmost = r.selector; 124 while (selRightmost instanceof ChildOrParentSelector) { 125 selRightmost = ((ChildOrParentSelector) selRightmost).right; 126 } 127 MapCSSRule optRule = new MapCSSRule(r.selector.optimizedBaseCheck(), r.declaration); 128 switch (((GeneralSelector) selRightmost).getBase()) { 129 case "node": 130 nodeRules.add(optRule); 131 break; 132 case "way": 133 wayRules.add(optRule); 134 break; 135 case "area": 136 wayRules.add(optRule); 137 multipolygonRules.add(optRule); 138 break; 139 case "relation": 140 relationRules.add(optRule); 141 multipolygonRules.add(optRule); 142 break; 143 case "*": 144 nodeRules.add(optRule); 145 wayRules.add(optRule); 146 relationRules.add(optRule); 147 multipolygonRules.add(optRule); 148 break; 149 } 120 List<Selector> nodeSel = new ArrayList<>(); 121 List<Selector> waySel = new ArrayList<>(); 122 List<Selector> relationSel = new ArrayList<>(); 123 List<Selector> multipolygonSel = new ArrayList<>(); 124 for (Selector sel : r.selectors) { 125 // find the rightmost selector, this must be a GeneralSelector 126 Selector selRightmost = sel; 127 while (selRightmost instanceof ChildOrParentSelector) { 128 selRightmost = ((ChildOrParentSelector) selRightmost).right; 129 } 130 Selector optimizedSel = sel.optimizedBaseCheck(); 131 switch (((GeneralSelector) selRightmost).getBase()) { 132 case "node": 133 nodeSel.add(optimizedSel); 134 break; 135 case "way": 136 waySel.add(optimizedSel); 137 break; 138 case "area": 139 waySel.add(optimizedSel); 140 multipolygonSel.add(optimizedSel); 141 break; 142 case "relation": 143 relationSel.add(optimizedSel); 144 multipolygonSel.add(optimizedSel); 145 break; 146 case "*": 147 nodeSel.add(optimizedSel); 148 waySel.add(optimizedSel); 149 relationSel.add(optimizedSel); 150 multipolygonSel.add(optimizedSel); 151 break; 152 } 153 } 154 nodeRules.add(new MapCSSRule(nodeSel, r.declaration)); 155 wayRules.add(new MapCSSRule(waySel, r.declaration)); 156 relationRules.add(new MapCSSRule(relationSel, r.declaration)); 157 multipolygonRules.add(new MapCSSRule(multipolygonSel, r.declaration)); 150 158 } 151 159 rules.clear(); … … 211 219 NEXT_RULE: 212 220 for (MapCSSRule r : rules) { 213 if ((r.selector instanceof GeneralSelector)) { 214 GeneralSelector gs = (GeneralSelector) r.selector; 215 if (gs.getBase().equals(type)) { 216 if (!gs.matchesConditions(env)) { 217 continue NEXT_RULE; 221 for (Selector s : r.selectors) { 222 if ((s instanceof GeneralSelector)) { 223 GeneralSelector gs = (GeneralSelector) s; 224 if (gs.getBase().equals(type)) { 225 if (!gs.matchesConditions(env)) { 226 continue NEXT_RULE; 227 } 228 r.execute(env); 218 229 } 219 r.execute(env);220 230 } 221 231 } … … 244 254 } 245 255 } 246 usedId++;247 256 RULE: for (MapCSSRule r : matchingRules) { 248 env.clearSelectorMatchingInformation(); 249 if (r.selector.matches(env)) { // as side effect env.parent will be set (if s is a child selector) 250 Selector s = r.selector; 251 if (s.getRange().contains(scale)) { 252 mc.range = Range.cut(mc.range, s.getRange()); 253 } else { 254 mc.range = mc.range.reduceAround(scale, s.getRange()); 255 continue; 257 for (Selector s : r.selectors) { 258 env.clearSelectorMatchingInformation(); 259 if (s.matches(env)) { // as side effect env.parent will be set (if s is a child selector) 260 if (s.getRange().contains(scale)) { 261 mc.range = Range.cut(mc.range, s.getRange()); 262 } else { 263 mc.range = mc.range.reduceAround(scale, s.getRange()); 264 continue; 265 } 266 267 String sub = s.getSubpart(); 268 if (sub == null) { 269 sub = "default"; 270 } 271 else if ("*".equals(sub)) { 272 for (Entry<String, Cascade> entry : mc.getLayers()) { 273 env.layer = entry.getKey(); 274 if (Utils.equal(env.layer, "*")) { 275 continue; 276 } 277 r.execute(env); 278 } 279 } 280 env.layer = sub; 281 r.execute(env); 282 continue RULE; 256 283 } 257 258 if (r.declaration.usedId == usedId) continue; // don't apply a declaration block more than once259 r.declaration.usedId = usedId;260 String sub = s.getSubpart();261 if (sub == null) {262 sub = "default";263 }264 else if ("*".equals(sub)) {265 for (Entry<String, Cascade> entry : mc.getLayers()) {266 env.layer = entry.getKey();267 if (Utils.equal(env.layer, "*")) {268 continue;269 }270 r.execute(env);271 }272 }273 env.layer = sub;274 r.execute(env);275 continue RULE;276 284 } 277 285 }
Note:
See TracChangeset
for help on using the changeset viewer.
