Changeset 2354 in josm for trunk/src


Ignore:
Timestamp:
2009-10-30T22:36:16+01:00 (14 years ago)
Author:
Gubaer
Message:

applied #3781: patch by hansendc: Selected ways of multipolygons drawn before other ways

File:
1 edited

Legend:

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

    r2350 r2354  
    2727import java.util.LinkedList;
    2828import java.util.List;
     29import java.util.TreeSet;
     30import java.util.Comparator;
    2931
    3032import javax.swing.ImageIcon;
     
    5355    protected boolean useRealWidth;
    5456    protected boolean zoomLevelDisplay;
    55     protected int fillAreas;
    5657    protected boolean drawMultipolygon;
    5758    protected boolean drawRestriction;
     
    7475    protected double dist;
    7576    protected Collection<String> regionalNameOrder;
    76     protected Boolean selectedCall;
    7777    protected Boolean useStyleCache;
    7878    private static int paintid = 0;
     
    140140     */
    141141    @Override
    142     public void visit(Node n) {
     142    public void visit(Node n) {}
     143    public void drawNode(Node n) {
    143144        /* check, if the node is visible at all */
    144145        if((n.getEastNorth().east()  > maxEN.east() ) ||
     
    177178     */
    178179    @Override
    179     public void visit(Way w) {
     180    public void visit(Way w) {}
     181    public void drawWay(Way w, int fillAreas) {
    180182        if(w.getNodesCount() < 2)
    181183        {
     
    492494            PolyData pd = new PolyData(w);
    493495            pd.selected = selected;
    494             res.add(new PolyData(w));
     496            res.add(pd);
    495497        } /* while(left != 0) */
    496498
     
    503505        if(osm instanceof Way)
    504506        {
     507            Way w = (Way)osm;
    505508            if(style instanceof AreaElemStyle)
    506509            {
     
    529532    }
    530533
    531     @Override
    532     public void visit(Relation r) {
    533 
     534    public void visit(Relation r) {};
     535    public void paintUnselectedRelation(Relation r) {
    534536        r.mappaintVisibleCode = 0;
    535537
    536         /* TODO: is it possible to do this like the nodes/ways code? */
    537         //if(profilerOmitDraw)
    538         //    return;
    539 
    540         if(selectedCall)
    541         {
    542             for (RelationMember m : r.getMembers())
    543             {
    544                 if (m.isNode() && !m.getMember().incomplete && !m.getMember().isDeleted() && !m.getMember().isFiltered())
    545                 {
    546                     drawSelectedMember(m.getMember(), styles != null ? getPrimitiveStyle(m.getMember()) : null, true, true);
    547                 }
    548             }
    549             return;
    550         }
    551         else if (drawMultipolygon && "multipolygon".equals(r.get("type")))
     538        if (drawMultipolygon && "multipolygon".equals(r.get("type")))
    552539        {
    553540            if(drawMultipolygon(r))
     
    563550            for (RelationMember m : r.getMembers())
    564551            {
    565                 if (m.isWay() && !m.getMember().incomplete && !m.getMember().isDeleted()) /* nodes drawn on second call */
     552                if (m.isWay() && drawable(m.getMember()))
    566553                {
    567554                    drawSelectedMember(m.getMember(), styles != null ? getPrimitiveStyle(m.getMember())
     
    953940            } else if(m.getMember().incomplete) {
    954941                incomplete = true;
    955             } else
    956             {
    957                 if(m.isWay())
    958                 {
     942            } else {
     943                if(m.isWay()) {
    959944                    Way w = m.getWay();
    960                     if(w.getNodesCount() < 2)
    961                     {
     945                    if(w.getNodesCount() < 2) {
    962946                        r.putError(tr("Way ''{0}'' with less than two points.",
    963947                                w.getDisplayName(DefaultNameFormatter.getInstance())), true);
     
    967951                    } else if("outer".equals(m.getRole())) {
    968952                        outer.add(w);
    969                     } else
    970                     {
     953                    } else {
    971954                        r.putError(tr("No useful role ''{0}'' for Way ''{1}''.",
    972955                                m.getRole(), w.getDisplayName(DefaultNameFormatter.getInstance())), true);
     
    10311014            else if(zoomok)
    10321015            {
    1033                 LinkedList<PolyData> poly = new LinkedList<PolyData>();
     1016                LinkedList<PolyData> outerPoly = new LinkedList<PolyData>();
    10341017                for (Way w : outerclosed) {
    1035                     poly.add(new PolyData(w));
    1036                 }
    1037                 poly.addAll(joinWays(outerjoin, incomplete ? null : r));
     1018                    outerPoly.add(new PolyData(w));
     1019                }
     1020                outerPoly.addAll(joinWays(outerjoin, incomplete ? null : r));
    10381021                for (Way wInner : innerclosed)
    10391022                {
    10401023                    PolyData pdInner = new PolyData(wInner);
    10411024                    // incomplete is probably redundant
    1042                     addInnerToOuters(r, incomplete, pdInner, poly);
     1025                    addInnerToOuters(r, incomplete, pdInner, outerPoly);
    10431026                }
    10441027                for (PolyData pdInner : joinWays(innerjoin, incomplete ? null : r)) {
    1045                     addInnerToOuters(r, incomplete, pdInner, poly);
     1028                    addInnerToOuters(r, incomplete, pdInner, outerPoly);
    10461029                }
    10471030                AreaElemStyle areaStyle = (AreaElemStyle)wayStyle;
    1048                 for (PolyData pd : poly)
    1049                 {
     1031                for (PolyData pd : outerPoly) {
    10501032                    Polygon p = pd.get();
    1051                     if(isPolygonVisible(p))
    1052                     {
    1053                         boolean selected = (data.isSelected(pd.way) || data.isSelected(r));
    1054                         drawAreaPolygon(p, selected ? selectedColor : areaStyle.color);
    1055                         visible = true;
    1056                     }
     1033                    if(!isPolygonVisible(p))
     1034                        continue;
     1035
     1036                    boolean selected = pd.selected || data.isSelected(pd.way) || data.isSelected(r);
     1037                    drawAreaPolygon(p, selected ? selectedColor : areaStyle.color);
     1038                    visible = true;
    10571039                }
    10581040            }
     
    10731055                if(innerStyle == null)
    10741056                {
     1057                    if (data.isSelected(wInner))
     1058                        continue;
    10751059                    if(zoomok && (wInner.mappaintDrawnCode != paintid
    10761060                            || outer.size() == 0))
     
    11041088                if(outerStyle == null)
    11051089                {
     1090                    // Selected ways are drawn at the very end
     1091                    if (data.isSelected(wOuter))
     1092                        continue;
    11061093                    if(zoomok)
    11071094                    {
     
    14041391    }
    14051392
     1393    boolean drawable(OsmPrimitive osm)
     1394    {
     1395        return !osm.isDeleted() && !osm.isFiltered() && !osm.incomplete;
     1396    }
     1397
    14061398    @Override
    14071399    public void getColors()
     
    14151407    DataSet data;
    14161408
     1409    <T extends OsmPrimitive> Collection<T> selectedLast(final DataSet data, Collection <T> prims) {
     1410        ArrayList<T> sorted = new ArrayList<T>(prims);
     1411        Collections.sort(sorted,
     1412            new Comparator<T>() {
     1413                public int compare(T o1, T o2) {
     1414                    boolean s1 = data.isSelected(o1);
     1415                    boolean s2 = data.isSelected(o2);
     1416                    if (s1 && !s2)
     1417                        return 1;
     1418                    if (!s1 && s2)
     1419                        return -1;
     1420                    return o1.compareTo(o2);
     1421                }
     1422            });
     1423        return sorted;
     1424    }
     1425
    14171426    /* Shows areas before non-areas */
    14181427    @Override
     
    14231432
    14241433        useStyleCache = Main.pref.getBoolean("mappaint.cache",true);
    1425         fillAreas = Main.pref.getInteger("mappaint.fillareas", 10000000);
     1434        int fillAreas = Main.pref.getInteger("mappaint.fillareas", 10000000);
    14261435        fillAlpha = Math.min(255, Math.max(0, Integer.valueOf(Main.pref.getInteger("mappaint.fillalpha", 50))));
    14271436        showNames = Main.pref.getInteger("mappaint.shownames", 10000000);
     
    14581467
    14591468
    1460         selectedCall = false;
    14611469        ++paintid;
    14621470        viewid = nc.getViewID();
     
    14811489            for (final Relation osm : data.relations)
    14821490            {
    1483                 if(!osm.isDeleted() && !osm.isFiltered() && !osm.incomplete && osm.mappaintVisibleCode != viewid)
    1484                 {
    1485                     osm.visit(this);
     1491                if(drawable(osm) && osm.mappaintVisibleCode != viewid)
     1492                {
     1493                    paintUnselectedRelation(osm);
    14861494                    //            profilerN++;
    14871495                }
     
    14961504            /*** AREAS ***/
    14971505            //    profilerN = 0;
    1498             for (final Way osm : data.ways)
    1499             {
    1500                 if (!osm.incomplete && !osm.isDeleted() && !osm.isFiltered()
     1506            for (final Way osm : selectedLast(data, data.ways)) {
     1507                if (drawable(osm)
    15011508                        && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid)
    15021509                {
    15031510                    if(isPrimitiveArea(osm) && osm.mappaintDrawnAreaCode != paintid)
    15041511                    {
    1505                         osm.visit(this);
     1512                        drawWay(osm, fillAreas);
    15061513                        //                profilerN++;
    1507                     } else {
     1514                    }// else {
    15081515                        noAreaWays.add(osm);
    1509                     }
     1516                    //}
    15101517                }
    15111518            }
     
    15201527            /*** WAYS ***/
    15211528            //    profilerN = 0;
    1522             fillAreas = 0;
    1523             for (final OsmPrimitive osm : noAreaWays)
    1524             {
    1525                 osm.visit(this);
     1529            for (final Way osm : noAreaWays)
     1530            {
     1531                drawWay(osm, 0);
    15261532                //        profilerN++;
    15271533            }
     
    15381544            /*** WAYS (filling disabled)  ***/
    15391545            //    profilerN = 0;
    1540             for (final OsmPrimitive osm : data.ways)
    1541                 if (!osm.incomplete && !osm.isDeleted() && !osm.isFiltered() && !data.isSelected(osm)
    1542                         && osm.mappaintVisibleCode != viewid )
    1543                 {
    1544                     osm.visit(this);
     1546            for (final Way way : data.ways)
     1547                if (drawable(way) && !data.isSelected(way)
     1548                        && way.mappaintVisibleCode != viewid )
     1549                {
     1550                    drawWay(way, 0);
    15451551                    //            profilerN++;
    15461552                }
     
    15551561
    15561562        /*** SELECTED  ***/
    1557         selectedCall = true;
    15581563        //profilerN = 0;
    15591564        for (final OsmPrimitive osm : data.getSelected()) {
    15601565            if (!osm.incomplete && !osm.isDeleted() && !(osm instanceof Node)
    1561                     && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid)
    1562             {
    1563                 osm.visit(this);
     1566                    && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid
     1567                    )
     1568            {
     1569                osm.visit(new AbstractVisitor() {
     1570                    public void visit(Way w) {
     1571                        drawWay(w, 0);
     1572                    }
     1573                    public void visit(Node n) {
     1574                        drawNode(n);
     1575                    }
     1576                    public void visit(Relation r) {
     1577                        /* TODO: is it possible to do this like the nodes/ways code? */
     1578                        //if(profilerOmitDraw)
     1579                        //    return;
     1580                        r.mappaintVisibleCode = 0;
     1581                        for (RelationMember m : r.getMembers()) {
     1582                            if (m.isNode() && drawable(m.getMember())) {
     1583                                drawSelectedMember(m.getMember(), styles != null ? getPrimitiveStyle(m.getMember()) : null, true, true);
     1584                            }
     1585                        }
     1586                    }
     1587                });
    15641588                //        profilerN++;
    15651589            }
     
    15771601        /*** NODES ***/
    15781602        //profilerN = 0;
    1579         for (final OsmPrimitive osm : data.nodes)
     1603        for (final Node osm : data.nodes)
    15801604            if (!osm.incomplete && !osm.isDeleted() && (data.isSelected(osm) || !osm.isFiltered())
    15811605                    && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid)
    15821606            {
    1583                 osm.visit(this);
     1607                drawNode(osm);
    15841608                //        profilerN++;
    15851609            }
Note: See TracChangeset for help on using the changeset viewer.