Ticket #7151: hiking-demo.patch

File hiking-demo.patch, 12.2 KB (added by ikonor, 12 years ago)

demo patch, not intended to be committed

  • src/org/openstreetmap/josm/gui/mappaint/BoxTextElemStyle.java

     
    77import java.awt.Rectangle;
    88import org.openstreetmap.josm.data.osm.Node;
    99import org.openstreetmap.josm.data.osm.OsmPrimitive;
     10import org.openstreetmap.josm.data.osm.Way;
    1011import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
    1112import org.openstreetmap.josm.data.osm.visitor.paint.MapPainter;
    1213import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
     
    102103    public void paintPrimitive(OsmPrimitive osm, MapPaintSettings settings, MapPainter painter, boolean selected, boolean member) {
    103104        if (osm instanceof Node) {
    104105            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);
    105111        }
    106112    }
    107113
  • src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java

     
    311311                addIfNotNull(sl, LinePatternElemStyle.create(env));
    312312                addIfNotNull(sl, LineElemStyle.createLine(env));
    313313                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                }
    315323            } else if (osm instanceof Node) {
    316324                NodeElemStyle nodeStyle = NodeElemStyle.create(env);
    317325                if (nodeStyle != null) {
  • src/org/openstreetmap/josm/gui/mappaint/NodeElemStyle.java

     
    1515import org.openstreetmap.josm.data.osm.Node;
    1616import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1717import org.openstreetmap.josm.data.osm.Relation;
     18import org.openstreetmap.josm.data.osm.Way;
    1819import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
    1920import org.openstreetmap.josm.data.osm.visitor.paint.MapPainter;
    2021import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.IconReference;
     
    238239
    239240    @Override
    240241    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
    243252            if (icon != null && painter.isShowIcons()) {
    244253                painter.drawNodeIcon(n, (painter.isInactiveMode() || n.isDisabled()) ? getDisabledIcon() : icon,
    245254                        Utils.color_int2float(iconAlpha), selected, member);
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Expression.java

     
    1010import java.util.ArrayList;
    1111import java.util.Arrays;
    1212import java.util.List;
     13import java.util.regex.Matcher;
     14import java.util.regex.Pattern;
    1315
    1416import org.openstreetmap.josm.Main;
    1517import org.openstreetmap.josm.actions.search.SearchCompiler;
     
    1820import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1921import org.openstreetmap.josm.gui.mappaint.Cascade;
    2022import org.openstreetmap.josm.gui.mappaint.Environment;
     23import org.openstreetmap.josm.gui.mappaint.Keyword;
    2124import org.openstreetmap.josm.tools.CheckParameterUtil;
    2225import org.openstreetmap.josm.tools.Utils;
    2326
     
    139142                return prop(key, null);
    140143            }
    141144
     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
    142170            public Object prop(String key, String layer) {
    143171                Cascade c;
    144172                if (layer == null) {
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java

     
    1818import org.openstreetmap.josm.gui.mappaint.MultiCascade;
    1919import org.openstreetmap.josm.gui.mappaint.Range;
    2020import org.openstreetmap.josm.gui.mappaint.StyleSource;
     21import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelector;
    2122import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector;
    2223import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser;
    2324import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
     
    154155        for (MapCSSRule r : rules) {
    155156            for (Selector s : r.selectors) {
    156157                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);
    163162                    }
     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    }
    164169
    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        }
    169177
    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;
    181188                }
     189                r.execute(env);
    182190            }
    183191        }
     192        env.layer = sub;
     193        r.execute(env);
    184194    }
    185195
    186196    @Override
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

     
    55
    66import org.openstreetmap.josm.data.osm.Node;
    77import org.openstreetmap.josm.data.osm.OsmPrimitive;
    8 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    98import org.openstreetmap.josm.data.osm.Relation;
    109import org.openstreetmap.josm.data.osm.RelationMember;
    1110import org.openstreetmap.josm.data.osm.Way;
     
    5352         */
    5453        private final boolean parentSelector;
    5554
     55        private int iterationIndex = -1;
     56
    5657        /**
    5758         *
    5859         * @param a the first selector
     
    7980         */
    8081        private  class MatchingReferrerFinder extends AbstractVisitor{
    8182            private Environment e;
     83            public boolean matched = false;
    8284
    8385            /**
    8486             * Constructor
     
    122124                 * If e.parent is already set to the first matching referrer. We skip any following
    123125                 * referrer injected into the visitor.
    124126                 */
    125                 if (e.parent != null) return;
     127                //if (e.parent != null) return;
     128                if (matched) return;
    126129
     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
    127138                if (!left.matches(e.withPrimitive(r)))
    128139                    return;
    129140                for (int i=0; i < r.getMembersCount(); i++) {
     
    132143                        if (link.matches(e.withParent(r).withIndex(i).withLinkContext())) {
    133144                            e.parent = r;
    134145                            e.index = i;
     146                            matched = true;
    135147                            return;
    136148                        }
    137149                    }
     
    147159            if (!parentSelector) {
    148160                MatchingReferrerFinder collector = new MatchingReferrerFinder(e);
    149161                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;
    152170            } else {
    153171                if (e.osm instanceof Way) {
    154172                    List<Node> wayNodes = ((Way) e.osm).getNodes();
     
    182200
    183201        @Override
    184202        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;
    186206        }
    187207
    188208        @Override