Ticket #20130: 20130.patch

File 20130.patch, 4.6 KB (added by GerdP, 5 years ago)
  • resources/data/validator/geometry.mapcss

     
    200200  throwWarning: tr("Water area inside water area");
    201201}
    202202
     203area:closed:areaStyle[landuse=residential] ⧉o area[building][building!~/no|entrance/] {
     204  throwWarning: tr("Building partly outside of residential area");
     205}
     206
    203207area:closed:areaStyle ⧉ area:closed:areaStyle {
    204208  throwOther: tr("Overlapping Areas");
    205209}
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj

     
    217217|   < SUPERSET_OR_EQUAL: "⊇" >
    218218|   < NOT_SUPERSET_OR_EQUAL: "⊉" >
    219219|   < CROSSING: "⧉" >
     220|   < CROSSING_OUTSIDE: "⧉o" >
    220221|   < PERCENT: "%" >
    221222|   < COMMENT_START: "/*" > : COMMENT
    222223|   < UNEXPECTED_CHAR : ~[] > // avoid TokenMgrErrors because they are hard to recover from
     
    633634                <NOT_SUPERSET_OR_EQUAL> { type = Selector.ChildOrParentSelectorType.NOT_SUPERSET_OR_EQUAL; }
    634635            |
    635636                <CROSSING> { type = Selector.ChildOrParentSelectorType.CROSSING; }
     637            |
     638                <CROSSING_OUTSIDE> { type = Selector.ChildOrParentSelectorType.CROSSING_OUTSIDE; }
    636639            )
    637640            w()
    638641        |
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

     
    126126     * @see ChildOrParentSelector
    127127     */
    128128    enum ChildOrParentSelectorType {
    129         CHILD, PARENT, SUBSET_OR_EQUAL, NOT_SUBSET_OR_EQUAL, SUPERSET_OR_EQUAL, NOT_SUPERSET_OR_EQUAL, CROSSING, SIBLING,
     129        CHILD, PARENT, SUBSET_OR_EQUAL, NOT_SUBSET_OR_EQUAL, SUPERSET_OR_EQUAL, NOT_SUPERSET_OR_EQUAL, CROSSING, SIBLING, CROSSING_OUTSIDE,
    130130    }
    131131
    132132    /**
     
    318318            };
    319319        }
    320320
    321         private final class CrossingFinder extends AbstractFinder {
     321        private class CrossingFinder extends AbstractFinder {
    322322
    323323            private final String layer;
    324324            private Area area;
    325325            /** Will contain all way segments, grouped by cells */
    326326            Map<Point2D, List<WaySegment>> cellSegments;
     327            private final boolean markOutsideArea;
    327328
    328             private CrossingFinder(Environment e) {
     329            private CrossingFinder(Environment e, boolean markOutside) {
    329330                super(e);
    330331                CheckParameterUtil.ensureThat(isArea(e.osm), "Only areas are supported");
    331332                layer = OsmUtils.getLayer(e.osm);
     333                this.markOutsideArea = markOutside;
    332334            }
    333335
    334336            private Area getAreaEastNorth(IPrimitive p, Environment e) {
     
    398400                        if (e.intersections == null) {
    399401                            e.intersections = new HashMap<>();
    400402                        }
    401                         e.intersections.put(p, is.b);
     403                        final Area hiliteArea;
     404                        if (markOutsideArea) {
     405                            hiliteArea = new Area(area);
     406                            hiliteArea.subtract(is.b);
     407                        } else {
     408                            hiliteArea = is.b;
     409                        }
     410                        e.intersections.put(p, hiliteArea);
    402411                    }
    403412                }
    404 
    405413            }
    406414
    407415            private void useFindCrossings(IPrimitive p) {
     
    545553                visitBBox(e, insideOrEqualFinder);
    546554                return ChildOrParentSelectorType.SUPERSET_OR_EQUAL == type ? e.children != null : e.children == null;
    547555
    548             } else if (ChildOrParentSelectorType.CROSSING == type) {
     556            } else if (ChildOrParentSelectorType.CROSSING == type || ChildOrParentSelectorType.CROSSING_OUTSIDE == type) {
    549557                e.parent = e.osm;
    550558                if (e.osm.getDataSet() != null && isArea(e.osm)) {
    551                     final CrossingFinder crossingFinder = new CrossingFinder(e);
     559                    boolean markOutside = ChildOrParentSelectorType.CROSSING_OUTSIDE == type;
     560                    final CrossingFinder crossingFinder = new CrossingFinder(e, markOutside);
    552561                    visitBBox(e, crossingFinder);
    553562                    return e.children != null;
    554563                }