Ticket #10058: 10058.patch

File 10058.patch, 6.8 KB (added by simon04, 11 years ago)
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
    index 3ab46fc..51c1de5 100644
    a b public class MapCSSStyleSource extends StyleSource {  
    5858    public final List<MapCSSRule> rules = new ArrayList<>();
    5959    // rule indices, filtered by primitive type
    6060    public final MapCSSRuleIndex nodeRules = new MapCSSRuleIndex();         // nodes
    61     public final MapCSSRuleIndex wayRules = new MapCSSRuleIndex();          // ways without tag area=no
    62     public final MapCSSRuleIndex wayNoAreaRules = new MapCSSRuleIndex();    // ways with tag area=no
     61    public final MapCSSRuleIndex wayRules = new MapCSSRuleIndex();          // ways
     62    /**
     63     * Ways which are considered as line.
     64     * @see GeneralSelector#isLineAccordingToMapCSS(Way)
     65     */
     66    public final MapCSSRuleIndex wayLineRules = new MapCSSRuleIndex();
     67    /**
     68     * Ways which are considered as area.
     69     * @see GeneralSelector#isAreaAccordingToMapCSS(Way)
     70     */
     71    public final MapCSSRuleIndex wayAreaRules = new MapCSSRuleIndex();
    6372    public final MapCSSRuleIndex relationRules = new MapCSSRuleIndex();     // relations that are not multipolygon relations
    6473    public final MapCSSRuleIndex multipolygonRules = new MapCSSRuleIndex(); // multipolygon relations
    6574    public final MapCSSRuleIndex canvasRules = new MapCSSRuleIndex();       // rules to apply canvas properties
    public class MapCSSStyleSource extends StyleSource {  
    184193        rules.clear();
    185194        nodeRules.clear();
    186195        wayRules.clear();
    187         wayNoAreaRules.clear();
     196        wayLineRules.clear();
     197        wayAreaRules.clear();
    188198        relationRules.clear();
    189199        multipolygonRules.clear();
    190200        canvasRules.clear();
    public class MapCSSStyleSource extends StyleSource {  
    231241                    nodeRules.add(optRule);
    232242                    break;
    233243                case "way":
    234                     wayNoAreaRules.add(optRule);
    235244                    wayRules.add(optRule);
     245                    wayLineRules.add(optRule);
     246                    wayAreaRules.add(optRule);
     247                    break;
     248                case "line":
     249                    wayLineRules.add(optRule);
    236250                    break;
    237251                case "area":
    238                     wayRules.add(optRule);
     252                    wayAreaRules.add(optRule);
    239253                    multipolygonRules.add(optRule);
    240254                    break;
    241255                case "relation":
    public class MapCSSStyleSource extends StyleSource {  
    245259                case "*":
    246260                    nodeRules.add(optRule);
    247261                    wayRules.add(optRule);
    248                     wayNoAreaRules.add(optRule);
     262                    wayLineRules.add(optRule);
     263                    wayAreaRules.add(optRule);
    249264                    relationRules.add(optRule);
    250265                    multipolygonRules.add(optRule);
    251266                    break;
    public class MapCSSStyleSource extends StyleSource {  
    263278        }
    264279        nodeRules.initIndex();
    265280        wayRules.initIndex();
    266         wayNoAreaRules.initIndex();
     281        wayLineRules.initIndex();
     282        wayAreaRules.initIndex();
    267283        relationRules.initIndex();
    268284        multipolygonRules.initIndex();
    269285        canvasRules.initIndex();
    public class MapCSSStyleSource extends StyleSource {  
    358374
    359375    @Override
    360376    public void apply(MultiCascade mc, OsmPrimitive osm, double scale, OsmPrimitive multipolyOuterWay, boolean pretendWayIsClosed) {
    361         Environment env = new Environment(osm, mc, null, this);
    362         MapCSSRuleIndex matchingRuleIndex;
     377        final Environment env = new Environment(osm, mc, null, this);
     378        final MapCSSRuleIndex matchingRuleIndex;
    363379        if (osm instanceof Node) {
    364380            matchingRuleIndex = nodeRules;
    365381        } else if (osm instanceof Way) {
    366             if (osm.isKeyFalse("area")) {
    367                 matchingRuleIndex = wayNoAreaRules;
     382            if (GeneralSelector.isLineAccordingToMapCSS((Way) osm)) {
     383                matchingRuleIndex = wayLineRules;
     384            } else if (GeneralSelector.isAreaAccordingToMapCSS((Way) osm)) {
     385                matchingRuleIndex = wayAreaRules;
    368386            } else {
    369387                matchingRuleIndex = wayRules;
    370388            }
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
    index 18e687e..a9db6be 100644
    a b public interface Selector {  
    443443        public GeneralSelector(String base, Pair<Integer, Integer> zoom, List<Condition> conds, String subpart) {
    444444            super(base, zoom, conds, subpart);
    445445        }
     446
     447        /**
     448         * Determines whether the way is an area according to the MapCSS standard, i.e.,
     449         * "A way where the start and finish nodes are the same node, or area=yes has been set."
     450         */
     451        public static boolean isAreaAccordingToMapCSS(Way w) {
     452            return w.isClosed() || w.isKeyTrue("area");
     453        }
     454
     455        /**
     456         * Determines whether the way is an line according to the MapCSS standard, i.e.,
     457         * "A way where the start and finish nodes are not the same node, or area=no has been set."
     458         */
     459        public static boolean isLineAccordingToMapCSS(Way w) {
     460            return !w.isClosed() || w.isKeyFalse("area");
     461        }
    446462       
    447463        public boolean matchesBase(OsmPrimitiveType type) {
    448464            if ("*".equals(base)) {
    public interface Selector {  
    450466            } else if (OsmPrimitiveType.NODE.equals(type)) {
    451467                return "node".equals(base);
    452468            } else if (OsmPrimitiveType.WAY.equals(type)) {
    453                 return "way".equals(base) || "area".equals(base);
     469                return "way".equals(base) || "area".equals(base) || "line".equals(base);
    454470            } else if (OsmPrimitiveType.RELATION.equals(type)) {
    455471                return "area".equals(base) || "relation".equals(base) || "canvas".equals(base);
    456472            }
    public interface Selector {  
    467483                    } else if ("canvas".equals(base)) {
    468484                        return p.get("#canvas") != null;
    469485                    }
     486                } else if (p instanceof Way && "area".equals(base)) {
     487                    return isAreaAccordingToMapCSS((Way) p);
     488                } else if (p instanceof Way && "line".equals(base)) {
     489                    return isLineAccordingToMapCSS((Way) p);
    470490                }
    471491                return true;
    472492            }