Ignore:
Timestamp:
2008-12-31T00:36:58+01:00 (17 years ago)
Author:
stoecker
Message:

fixed relation handling, applied language patches

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java

    r1193 r1195  
    3838    protected boolean zoomLevelDisplay;
    3939    protected boolean fillAreas;
     40    protected boolean drawMultipolygon;
    4041    protected int fillAlpha;
    4142    protected Color untaggedColor;
     
    4849    protected double circum;
    4950    protected String regionalNameOrder[];
    50     protected Collection<Way> alreadyDrawnWays = new LinkedList<Way>();
    51     protected Collection<Way> alreadyDrawnAreas = new LinkedList<Way>();
     51    protected Boolean selectedCall;
     52    protected Collection<OsmPrimitive> alreadyDrawn;
     53    protected Collection<Way> alreadyDrawnAreas;
    5254
    5355    protected boolean isZoomOk(ElemStyle e) {
     
    7375     */
    7476    public void visit(Node n) {
    75         IconElemStyle nodeStyle = styles.get(n);
     77        IconElemStyle nodeStyle = (IconElemStyle)styles.get(n);
    7678        if (nodeStyle != null && isZoomOk(nodeStyle))
    77             drawNode(n, nodeStyle.icon, nodeStyle.annotate);
     79            drawNode(n, nodeStyle.icon, nodeStyle.annotate, n.selected);
    7880        else if (n.selected)
    7981            drawNode(n, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
     
    114116        }
    115117
    116         drawWay(w, l, areacolor);
    117     }
    118 
    119     public void drawWay(Way w, LineElemStyle l, Color color) {
     118        drawWay(w, l, areacolor, w.selected);
     119    }
     120
     121    public void drawWay(Way w, LineElemStyle l, Color color, Boolean selected) {
    120122        // show direction arrows, if draw.segment.relevant_directions_only is not set,
    121123        // the way is tagged with a direction key
     
    134136            dashed = l.dashed;
    135137        }
     138        if(selected)
     139            color = selectedColor;
    136140        if (realWidth > 0 && useRealWidth && !showDirection)
    137141        {
     
    294298    }
    295299
     300    public void drawSelected(OsmPrimitive osm, ElemStyle style, Boolean area,
     301    Boolean areaselected)
     302    {
     303        if(osm instanceof Way)
     304        {
     305            if(style instanceof AreaElemStyle)
     306            {
     307                drawWay((Way)osm, ((AreaElemStyle)style).line, selectedColor, true);
     308                if(area)
     309                    drawWayAsArea((Way)osm, areaselected ? selectedColor
     310                    : ((AreaElemStyle)style).color);
     311            }
     312            else
     313            {
     314                drawWay((Way)osm, (LineElemStyle)style, selectedColor, true);
     315            }
     316        }
     317        else if(osm instanceof Node)
     318        {
     319            if(style != null && isZoomOk(style))
     320                drawNode((Node)osm, ((IconElemStyle)style).icon,
     321                ((IconElemStyle)style).annotate, true);
     322            else
     323                drawNode((Node)osm, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
     324        }
     325    }
     326
    296327    public void visit(Relation r) {
    297328        // draw multipolygon relations including their ways
    298         // other relations are not (yet?) drawn.
    299         if (r.incomplete) return;
    300 
    301         if(!Main.pref.getBoolean("mappaint.multipolygon",false)) return;
    302 
    303         if(!"multipolygon".equals(r.keys.get("type"))) return;
     329        // other relations are only drawn when selected
     330        if(r.selected)
     331        {
     332            if(selectedCall)
     333            {
     334                for (RelationMember m : r.members)
     335                {
     336                    /* second call - draw nodes */
     337                    if (!m.member.incomplete && !m.member.deleted
     338                    && m.member instanceof Node)
     339                    {
     340                        drawSelected(m.member, styles.get(m.member), true, true);
     341                        alreadyDrawn.add(m.member);
     342                    }
     343                }
     344                return;
     345            }
     346        }
     347        Boolean isMultipolygon = "multipolygon".equals(r.keys.get("type"));
     348        if (!drawMultipolygon || !isMultipolygon)
     349        {
     350            if(r.selected && !isMultipolygon)
     351            {
     352                for (RelationMember m : r.members)
     353                {
     354                    if (!m.member.incomplete && !m.member.deleted
     355                    && !(m.member instanceof Relation))
     356                    {
     357                        /* nodes drawn on second call */
     358                        if(!(m.member instanceof Node))
     359                            drawSelected(m.member, styles.get(m.member), true, true);
     360                        alreadyDrawn.add(m.member);
     361                    }
     362                }
     363            }
     364            return;
     365        }
    304366
    305367        Collection<Way> inner = new LinkedList<Way>();
     
    328390                        if(m.role == null || m.role.length() == 0)
    329391                            outer.add(w);
     392                        else if(r.selected)
     393                            drawSelected(m.member, styles.get(m.member), true, true);
    330394                    }
    331395                }
    332396                else
    333397                {
     398                    /* nodes drawn on second call */
    334399System.out.println("ERROR: Non-Way in multipolygon " + m.member);
    335400                }
     
    385450                for (Way w : outerclosed)
    386451                {
    387                     Color color = w.selected ? selectedColor
     452                    Color color = (w.selected || r.selected) ? selectedColor
    388453                    : ((AreaElemStyle)wayStyle).color;
    389454                    Polygon polygon = new Polygon();
     
    423488                {
    424489                    if(zoomok)
     490                    {
    425491                        drawWay(wInner, ((AreaElemStyle)wayStyle).line,
    426                         ((AreaElemStyle)wayStyle).color);
    427                     alreadyDrawnWays.add(wInner);
    428                 }
    429                 else if(wayStyle.equals(innerStyle))
    430                 {
     492                        ((AreaElemStyle)wayStyle).color, wInner.selected
     493                        || r.selected);
     494                    }
     495                    alreadyDrawn.add(wInner);
     496                }
     497                else
     498                {
     499                    if(r.selected)
     500                    {
     501                        drawSelected(wInner, innerStyle,
     502                        !wayStyle.equals(innerStyle), wInner.selected);
     503                        alreadyDrawn.add(wInner);
     504                    }
     505                    if(wayStyle.equals(innerStyle))
     506                    {
    431507System.out.println("WARNING: Inner waystyle equals multipolygon for way " + wInner);
    432                     alreadyDrawnAreas.add(wInner);
     508                        if(!r.selected)
     509                            alreadyDrawnAreas.add(wInner);
     510                    }
    433511                }
    434512            }
     
    439517                {
    440518                    if(zoomok)
     519                    {
    441520                        drawWay(wOuter, ((AreaElemStyle)wayStyle).line,
    442                         ((AreaElemStyle)wayStyle).color);
    443                     alreadyDrawnWays.add(wOuter);
     521                        ((AreaElemStyle)wayStyle).color, wOuter.selected
     522                        || r.selected);
     523                    }
     524                    alreadyDrawn.add(wOuter);
    444525                }
    445526                else
    446527                {
    447                     if(!wayStyle.equals(outerStyle))
     528                    if(outerStyle instanceof AreaElemStyle
     529                    && !wayStyle.equals(outerStyle))
     530                    {
    448531System.out.println("ERROR: Outer waystyle does not match multipolygon for way " + wOuter);
    449                     alreadyDrawnAreas.add(wOuter);
     532                    }
     533                    if(r.selected)
     534                    {
     535                        drawSelected(wOuter, outerStyle, false, false);
     536                        alreadyDrawn.add(wOuter);
     537                    }
     538//                    else if(outerStyle instanceof AreaElemStyle)
     539                        alreadyDrawnAreas.add(wOuter);
    450540                }
    451541            }
     
    470560    }
    471561
    472     // NEW
    473     protected void drawNode(Node n, ImageIcon icon, boolean annotate) {
     562    protected void drawNode(Node n, ImageIcon icon, boolean annotate, Boolean selected) {
    474563        Point p = nc.getPoint(n.eastNorth);
    475564        if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return;
     
    485574            g.setFont(defaultFont);
    486575        }
    487         if (n.selected)
     576        if (selected)
    488577        {
    489578            g.setColor (  selectedColor );
     
    582671        circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter
    583672        styles = MapPaintStyles.getStyles();
     673        drawMultipolygon = Main.pref.getBoolean("mappaint.multipolygon",false);
    584674        orderFont = new Font(Main.pref.get("mappaint.font","Helvetica"), Font.PLAIN, Main.pref.getInteger("mappaint.fontsize", 8));
    585675        String currentLocale = Locale.getDefault().getLanguage();
    586676        regionalNameOrder = Main.pref.get("mappaint.nameOrder", "name:"+currentLocale+";name;int_name").split(";");
    587677
     678        alreadyDrawn = new LinkedList<OsmPrimitive>();
     679        alreadyDrawnAreas = new LinkedList<Way>();
     680        selectedCall = false;
     681
    588682        if (fillAreas && styles.hasAreas()) {
    589683            Collection<Way> noAreaWays = new LinkedList<Way>();
     
    591685            for (final Relation osm : data.relations)
    592686            {
    593                 if (!osm.deleted && !osm.selected)
    594                 {
     687                if(!osm.deleted && !osm.incomplete)
    595688                    osm.visit(this);
    596                 }
    597689            }
    598690
    599691            for (final Way osm : data.ways)
    600692            {
    601                 if (!osm.incomplete && !osm.deleted && !alreadyDrawnWays.contains(osm))
     693                if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm))
    602694                {
    603695                    if(styles.isArea((Way)osm) && !alreadyDrawnAreas.contains(osm))
     
    607699                }
    608700            }
    609             // free that stuff
    610             alreadyDrawnWays = null;
    611701            alreadyDrawnAreas = null;
    612702
     
    618708        {
    619709            for (final OsmPrimitive osm : data.ways)
    620                 if (!osm.incomplete && !osm.deleted)
     710                if (!osm.incomplete && !osm.deleted && !osm.selected)
    621711                    osm.visit(this);
    622712        }
    623713
    624         for (final OsmPrimitive osm : data.getSelected())
    625             if (!osm.incomplete && !osm.deleted){
     714        selectedCall = true;
     715        for (final OsmPrimitive osm : data.getSelected()) {
     716            if (!osm.incomplete && !osm.deleted
     717            && !(osm instanceof Node) && !alreadyDrawn.contains(osm))
    626718                osm.visit(this);
    627             }
     719        }
    628720
    629721        displaySegments();
    630722
    631723        for (final OsmPrimitive osm : data.nodes)
    632             if (!osm.incomplete && !osm.deleted)
     724            if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm))
    633725                osm.visit(this);
     726
     727        alreadyDrawn = null;
    634728
    635729        if (virtualNodeSize != 0)
     
    637731            currentColor = nodeColor;
    638732            for (final OsmPrimitive osm : data.ways)
    639                 if (!osm.deleted)
     733                if (!osm.incomplete && !osm.deleted)
    640734                    visitVirtual((Way)osm);
    641735            displaySegments(null);
Note: See TracChangeset for help on using the changeset viewer.