Ticket #7151: hiking-demo.patch
File hiking-demo.patch, 12.2 KB (added by , 12 years ago) |
---|
-
src/org/openstreetmap/josm/gui/mappaint/BoxTextElemStyle.java
7 7 import java.awt.Rectangle; 8 8 import org.openstreetmap.josm.data.osm.Node; 9 9 import org.openstreetmap.josm.data.osm.OsmPrimitive; 10 import org.openstreetmap.josm.data.osm.Way; 10 11 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings; 11 12 import org.openstreetmap.josm.data.osm.visitor.paint.MapPainter; 12 13 import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors; … … 102 103 public void paintPrimitive(OsmPrimitive osm, MapPaintSettings settings, MapPainter painter, boolean selected, boolean member) { 103 104 if (osm instanceof Node) { 104 105 painter.drawBoxText((Node) osm, this); 106 } else if (osm instanceof Way) { 107 // DEMO: use middle node for displaying way symbol text (shield) 108 Way way = (Way)osm; 109 Node node = way.getNode((int)Math.floor(way.getNodesCount() / 2)); 110 painter.drawBoxText(node, this); 105 111 } 106 112 } 107 113 -
src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
311 311 addIfNotNull(sl, LinePatternElemStyle.create(env)); 312 312 addIfNotNull(sl, LineElemStyle.createLine(env)); 313 313 addIfNotNull(sl, LineElemStyle.createCasing(env)); 314 addIfNotNull(sl, LineTextElemStyle.create(env)); 314 315 // DEMO: allow node styles (icon or symbol) on ways, handling in NodeElemStyle.paintPrimitive 316 NodeElemStyle nodeStyle = NodeElemStyle.create(env); 317 if (nodeStyle != null) { 318 addIfNotNull(sl, NodeElemStyle.create(env)); 319 addIfNotNull(sl, BoxTextElemStyle.create(env, nodeStyle.getBox())); 320 } else { 321 addIfNotNull(sl, LineTextElemStyle.create(env)); 322 } 315 323 } else if (osm instanceof Node) { 316 324 NodeElemStyle nodeStyle = NodeElemStyle.create(env); 317 325 if (nodeStyle != null) { -
src/org/openstreetmap/josm/gui/mappaint/NodeElemStyle.java
15 15 import org.openstreetmap.josm.data.osm.Node; 16 16 import org.openstreetmap.josm.data.osm.OsmPrimitive; 17 17 import org.openstreetmap.josm.data.osm.Relation; 18 import org.openstreetmap.josm.data.osm.Way; 18 19 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings; 19 20 import org.openstreetmap.josm.data.osm.visitor.paint.MapPainter; 20 21 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.IconReference; … … 238 239 239 240 @Override 240 241 public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings settings, MapPainter painter, boolean selected, boolean member) { 241 if (primitive instanceof Node) { 242 Node n = (Node) primitive; 242 if (primitive instanceof Node || primitive instanceof Way) { 243 Node n; 244 if (primitive instanceof Way) { 245 // DEMO: use middle node for displaying way icon/symbol (shield) 246 Way way = (Way) primitive; 247 n = way.getNode((int)Math.floor(way.getNodesCount() / 2)); 248 } else { 249 n = (Node) primitive; 250 } 251 243 252 if (icon != null && painter.isShowIcons()) { 244 253 painter.drawNodeIcon(n, (painter.isInactiveMode() || n.isDisabled()) ? getDisabledIcon() : icon, 245 254 Utils.color_int2float(iconAlpha), selected, member); -
src/org/openstreetmap/josm/gui/mappaint/mapcss/Expression.java
10 10 import java.util.ArrayList; 11 11 import java.util.Arrays; 12 12 import java.util.List; 13 import java.util.regex.Matcher; 14 import java.util.regex.Pattern; 13 15 14 16 import org.openstreetmap.josm.Main; 15 17 import org.openstreetmap.josm.actions.search.SearchCompiler; … … 18 20 import org.openstreetmap.josm.data.osm.OsmPrimitive; 19 21 import org.openstreetmap.josm.gui.mappaint.Cascade; 20 22 import org.openstreetmap.josm.gui.mappaint.Environment; 23 import org.openstreetmap.josm.gui.mappaint.Keyword; 21 24 import org.openstreetmap.josm.tools.CheckParameterUtil; 22 25 import org.openstreetmap.josm.tools.Utils; 23 26 … … 139 142 return prop(key, null); 140 143 } 141 144 145 public Keyword color(String color) { 146 return new Keyword(color); 147 } 148 149 public String regex(String pattern, Object value) { 150 Pattern p = Pattern.compile(pattern); 151 Matcher m = p.matcher((String)value); 152 if (m.find()) 153 return m.group(1); 154 else 155 return null; 156 } 157 158 // allows global properties by setting properties of a different layer 159 public Object set_prop(String key, String layer, Object value) { 160 Cascade c; 161 if (layer == null) { 162 c = env.mc.getCascade(env.layer); 163 } else { 164 c = env.mc.getCascade(layer); 165 } 166 c.put(key, value); 167 return value; 168 } 169 142 170 public Object prop(String key, String layer) { 143 171 Cascade c; 144 172 if (layer == null) { -
src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
18 18 import org.openstreetmap.josm.gui.mappaint.MultiCascade; 19 19 import org.openstreetmap.josm.gui.mappaint.Range; 20 20 import org.openstreetmap.josm.gui.mappaint.StyleSource; 21 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelector; 21 22 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector; 22 23 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser; 23 24 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException; … … 154 155 for (MapCSSRule r : rules) { 155 156 for (Selector s : r.selectors) { 156 157 env.clearSelectorMatchingInformation(); 157 if (s.matches(env)) { // as side effect env.parent will be set (if s is a child selector) 158 if (s.getRange().contains(scale)) { 159 mc.range = Range.cut(mc.range, s.getRange()); 160 } else { 161 mc.range = mc.range.reduceAround(scale, s.getRange()); 162 continue; 158 if (s instanceof ChildOrParentSelector) { 159 // loop allows selector to iterate over all matching parents/children and execute for each 160 while(s.matches(env)) { 161 execute(r, s, env, mc, scale); 163 162 } 163 } else if (s.matches(env)) { // as side effect env.parent will be set (if s is a child selector) 164 execute(r, s, env, mc, scale); 165 } 166 } 167 } 168 } 164 169 165 String sub = s.getSubpart(); 166 if (sub == null) { 167 sub = "default"; 168 } 170 private void execute(MapCSSRule r, Selector s, Environment env, MultiCascade mc, double scale) { 171 if (s.getRange().contains(scale)) { 172 mc.range = Range.cut(mc.range, s.getRange()); 173 } else { 174 mc.range = mc.range.reduceAround(scale, s.getRange()); 175 return; 176 } 169 177 170 if (sub.equals("*")) { 171 for (Entry<String, Cascade> entry : mc.getLayers()) { 172 env.layer = entry.getKey(); 173 if (Utils.equal(env.layer, "*")) { 174 continue; 175 } 176 r.execute(env); 177 } 178 } 179 env.layer = sub; 180 r.execute(env); 178 String sub = s.getSubpart(); 179 if (sub == null) { 180 sub = "default"; 181 } 182 183 if (sub.equals("*")) { 184 for (Entry<String, Cascade> entry : mc.getLayers()) { 185 env.layer = entry.getKey(); 186 if (Utils.equal(env.layer, "*")) { 187 continue; 181 188 } 189 r.execute(env); 182 190 } 183 191 } 192 env.layer = sub; 193 r.execute(env); 184 194 } 185 195 186 196 @Override -
src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
5 5 6 6 import org.openstreetmap.josm.data.osm.Node; 7 7 import org.openstreetmap.josm.data.osm.OsmPrimitive; 8 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;9 8 import org.openstreetmap.josm.data.osm.Relation; 10 9 import org.openstreetmap.josm.data.osm.RelationMember; 11 10 import org.openstreetmap.josm.data.osm.Way; … … 53 52 */ 54 53 private final boolean parentSelector; 55 54 55 private int iterationIndex = -1; 56 56 57 /** 57 58 * 58 59 * @param a the first selector … … 79 80 */ 80 81 private class MatchingReferrerFinder extends AbstractVisitor{ 81 82 private Environment e; 83 public boolean matched = false; 82 84 83 85 /** 84 86 * Constructor … … 122 124 * If e.parent is already set to the first matching referrer. We skip any following 123 125 * referrer injected into the visitor. 124 126 */ 125 if (e.parent != null) return; 127 //if (e.parent != null) return; 128 if (matched) return; 126 129 130 // skip until after previous match 131 if (e.parent != null) { 132 if (e.parent.equals(r)) { 133 e.parent = null; 134 } 135 return; 136 } 137 127 138 if (!left.matches(e.withPrimitive(r))) 128 139 return; 129 140 for (int i=0; i < r.getMembersCount(); i++) { … … 132 143 if (link.matches(e.withParent(r).withIndex(i).withLinkContext())) { 133 144 e.parent = r; 134 145 e.index = i; 146 matched = true; 135 147 return; 136 148 } 137 149 } … … 147 159 if (!parentSelector) { 148 160 MatchingReferrerFinder collector = new MatchingReferrerFinder(e); 149 161 e.osm.visitReferrers(collector); 150 if (e.parent != null) 151 return true; 162 163 if (collector.matched) { 164 iterationIndex++; 165 } else { 166 iterationIndex = -1; 167 } 168 169 return collector.matched; 152 170 } else { 153 171 if (e.osm instanceof Way) { 154 172 List<Node> wayNodes = ((Way) e.osm).getNodes(); … … 182 200 183 201 @Override 184 202 public String getSubpart() { 185 return right.getSubpart(); 203 // dynamic layer names for multiple declaration executions 204 String result = (iterationIndex > -1 ? right.getSubpart() + iterationIndex : right.getSubpart()); 205 return result; 186 206 } 187 207 188 208 @Override