Ticket #10058: line-selector.diff

File line-selector.diff, 5.8 KB (added by bastiK, 12 years ago)
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java

     
    2626import org.openstreetmap.josm.data.Version;
    2727import org.openstreetmap.josm.data.osm.Node;
    2828import org.openstreetmap.josm.data.osm.OsmPrimitive;
     29import org.openstreetmap.josm.data.osm.OsmUtils;
    2930import org.openstreetmap.josm.data.osm.Relation;
    3031import org.openstreetmap.josm.data.osm.Way;
    3132import org.openstreetmap.josm.gui.mappaint.Cascade;
     
    5859    public final List<MapCSSRule> rules = new ArrayList<>();
    5960    // rule indices, filtered by primitive type
    6061    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
     62    public final MapCSSRuleIndex wayNoAreaTagRules = new MapCSSRuleIndex(); // ways without the tag area=yes/no
     63    public final MapCSSRuleIndex wayAreaEqYesRules = new MapCSSRuleIndex(); // ways with tag area=yes
     64    public final MapCSSRuleIndex wayAreaEqNoRules = new MapCSSRuleIndex();  // ways with tag area=no
    6365    public final MapCSSRuleIndex relationRules = new MapCSSRuleIndex();     // relations that are not multipolygon relations
    6466    public final MapCSSRuleIndex multipolygonRules = new MapCSSRuleIndex(); // multipolygon relations
    6567    public final MapCSSRuleIndex canvasRules = new MapCSSRuleIndex();       // rules to apply canvas properties
     
    183185        init();
    184186        rules.clear();
    185187        nodeRules.clear();
    186         wayRules.clear();
    187         wayNoAreaRules.clear();
     188        wayNoAreaTagRules.clear();
     189        wayAreaEqYesRules.clear();
     190        wayAreaEqNoRules.clear();
    188191        relationRules.clear();
    189192        multipolygonRules.clear();
    190193        canvasRules.clear();
     
    231234                    nodeRules.add(optRule);
    232235                    break;
    233236                case "way":
    234                     wayNoAreaRules.add(optRule);
    235                     wayRules.add(optRule);
     237                    wayNoAreaTagRules.add(optRule);
     238                    wayAreaEqYesRules.add(optRule);
     239                    wayAreaEqNoRules.add(optRule);
    236240                    break;
     241                case "line":
     242                    wayNoAreaTagRules.add(optRule);
     243                    wayAreaEqNoRules.add(optRule);
     244                    break;
    237245                case "area":
    238                     wayRules.add(optRule);
     246                    wayNoAreaTagRules.add(optRule);
     247                    wayAreaEqYesRules.add(optRule);
    239248                    multipolygonRules.add(optRule);
    240249                    break;
    241250                case "relation":
     
    244253                    break;
    245254                case "*":
    246255                    nodeRules.add(optRule);
    247                     wayRules.add(optRule);
    248                     wayNoAreaRules.add(optRule);
     256                    wayNoAreaTagRules.add(optRule);
     257                    wayAreaEqNoRules.add(optRule);
    249258                    relationRules.add(optRule);
    250259                    multipolygonRules.add(optRule);
    251260                    break;
     
    262271            }
    263272        }
    264273        nodeRules.initIndex();
    265         wayRules.initIndex();
    266         wayNoAreaRules.initIndex();
     274        wayNoAreaTagRules.initIndex();
     275        wayAreaEqYesRules.initIndex();
     276        wayAreaEqNoRules.initIndex();
    267277        relationRules.initIndex();
    268278        multipolygonRules.initIndex();
    269279        canvasRules.initIndex();
     
    363373        if (osm instanceof Node) {
    364374            matchingRuleIndex = nodeRules;
    365375        } else if (osm instanceof Way) {
    366             if (osm.isKeyFalse("area")) {
    367                 matchingRuleIndex = wayNoAreaRules;
     376            String areaValue = osm.get("area");
     377            if (areaValue == null) {
     378                matchingRuleIndex = wayNoAreaTagRules;
     379            } else if (OsmUtils.isTrue(areaValue)) {
     380                matchingRuleIndex = wayAreaEqYesRules;
     381            } else if (OsmUtils.isFalse(areaValue)) {
     382                matchingRuleIndex = wayAreaEqNoRules;
    368383            } else {
    369                 matchingRuleIndex = wayRules;
     384                matchingRuleIndex = wayNoAreaTagRules;
    370385            }
    371386        } else {
    372387            if (((Relation) osm).isMultipolygon()) {
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

     
    450450            } else if (OsmPrimitiveType.NODE.equals(type)) {
    451451                return "node".equals(base);
    452452            } else if (OsmPrimitiveType.WAY.equals(type)) {
    453                 return "way".equals(base) || "area".equals(base);
     453                return "way".equals(base) || "area".equals(base) || "line".equals(base);
    454454            } else if (OsmPrimitiveType.RELATION.equals(type)) {
    455455                return "area".equals(base) || "relation".equals(base) || "canvas".equals(base);
    456456            }
     
    467467                    } else if ("canvas".equals(base)) {
    468468                        return p.get("#canvas") != null;
    469469                    }
     470                } else if (p instanceof Way) {
     471                    if ("area".equals(base)) {
     472                        return !p.isKeyFalse("area");
     473                    } else if ("line".equals(base)) {
     474                        return !p.isKeyTrue("area");
     475                    }
    470476                }
    471477                return true;
    472478            }