Ignore:
Timestamp:
2009-01-20T18:26:59+01:00 (15 years ago)
Author:
stoecker
Message:

fix #2047

Location:
trunk/src/org/openstreetmap/josm/data/osm
Files:
3 edited

Legend:

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

    r1270 r1313  
    5656        errors = null;
    5757    }
     58    /* This should not be called from outside. Fixing the UI to add relevant
     59       get/set functions calling this implecitely is prefered, so we can have
     60       transparent cache handling in the future. */
     61    protected void clearCached()
     62    {
     63        mappaintVisibleCode = 0;
     64        mappaintDrawnCode = 0;
     65        mappaintStyle = null;
     66    }
    5867    /* end of mappaint data */
    5968
     
    279288        tagged = osm.tagged;
    280289        incomplete = osm.incomplete;
    281         mappaintStyle = null;
     290        clearCached();
     291        clearErrors();
    282292    }
    283293
  • trunk/src/org/openstreetmap/josm/data/osm/Way.java

    r1270 r1313  
    3030    public Integer mappaintDrawnAreaCode = 0;
    3131    /* end of mappaint data */
    32    
     32    @Override protected void clearCached()
     33    {
     34        super.clearCached();
     35        isMappaintArea = false;
     36        mappaintDrawnAreaCode = 0;
     37    }
     38
    3339    public void visitNodes(Visitor v) {
    3440        for (Node n : this.nodes)
     
    126132    }
    127133
     134    public void addNode(Node n)
     135    {
     136        clearCached();
     137        nodes.add(n);
     138    }
     139
     140    public void addNode(int offs, Node n)
     141    {
     142        clearCached();
     143        nodes.add(offs, n);
     144    }
     145
    128146    public Boolean isClosed() {
    129147        int s = nodes.size();
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java

    r1310 r1313  
    9393    public ElemStyle getPrimitiveStyle(OsmPrimitive osm) {
    9494        if(!useStyleCache)
    95             return (styles != null) ? (IconElemStyle)styles.get(osm) : null;
     95            return (styles != null) ? styles.get(osm) : null;
    9696
    9797        if(osm.mappaintStyle == null && styles != null) {
    98             osm.mappaintStyle =  styles.get(osm);
     98            osm.mappaintStyle = styles.get(osm);
    9999            if(osm instanceof Way)
    100100                ((Way)osm).isMappaintArea = styles.isArea(osm);
    101101        }
    102102        return osm.mappaintStyle;
     103    }
     104
     105    public IconElemStyle getPrimitiveNodeStyle(OsmPrimitive osm) {
     106        if(!useStyleCache)
     107            return (styles != null) ? styles.getIcon(osm) : null;
     108
     109        if(osm.mappaintStyle == null && styles != null)
     110            osm.mappaintStyle = styles.getIcon(osm);
     111
     112        return (IconElemStyle)osm.mappaintStyle;
    103113    }
    104114
     
    417427    }
    418428
    419     public void drawSelectedRelation(Relation r)
    420     {
    421         for (RelationMember m : r.members)
    422         {
    423             if (m.member != null && !m.member.incomplete && !m.member.deleted
    424             && !(m.member instanceof Relation))
    425             {
    426                 /* nodes drawn on second call */
    427                 if(!(m.member instanceof Node))
    428                     drawSelectedMember(m.member, styles != null ? styles.get(m.member)
    429                     : null, true, true);
    430             }
    431         }
    432     }
    433 
    434429    public void drawSelectedMember(OsmPrimitive osm, ElemStyle style, Boolean area,
    435430    Boolean areaselected)
     
    463458
    464459        r.mappaintVisibleCode = 0;
    465         /* TODO implement visible handling for relations too */
    466460
    467461        // TODO: is it possible to do this like the nodes/ways code?
     
    469463            return;
    470464
    471         // draw multipolygon relations including their ways
    472         // other relations are only drawn when selected
    473 
    474         // we are in the "draw selected" phase
    475         // TODO: is it necessary to check for r.selected?
    476         if(r.selected && selectedCall)
     465        if(selectedCall)
    477466        {
    478467            for (RelationMember m : r.members)
    479468            {
    480469                if (m.member != null && !m.member.incomplete && !m.member.deleted
    481                 && (drawRestriction || m.member instanceof Node))
    482                 {
    483                     drawSelectedMember(m.member, styles != null ? styles.get(m.member) : null, true, true);
     470                && m.member instanceof Node)
     471                {
     472                    drawSelectedMember(m.member, styles != null ? getPrimitiveStyle(m.member) : null, true, true);
    484473                }
    485474            }
    486475            return;
    487476        }
    488 
    489         if (drawMultipolygon && r.keys != null && "multipolygon".equals(r.keys.get("type")))
    490         {
    491             drawMultipolygon(r);
    492             return;
    493         }
    494 
    495         if (drawRestriction && r.keys != null && "restriction".equals(r.keys.get("type")))
     477        else if (drawMultipolygon && r.keys != null && "multipolygon".equals(r.keys.get("type")))
     478        {
     479            if(drawMultipolygon(r))
     480              return;
     481        }
     482        else if (drawRestriction && r.keys != null && "restriction".equals(r.keys.get("type")))
    496483        {
    497484            drawRestriction(r);
    498             return;
    499         }
    500 
    501         if(r.selected)
    502             drawSelectedRelation(r);
    503     }
    504 
     485        }
     486
     487        if(r.selected) /* draw ways*/
     488        {
     489            for (RelationMember m : r.members)
     490            {
     491                if (m.member != null && !m.member.incomplete && !m.member.deleted
     492                && m.member instanceof Way) /* nodes drawn on second call */
     493                {
     494                    drawSelectedMember(m.member, styles != null ? getPrimitiveStyle(m.member)
     495                    : null, true, true);
     496                }
     497            }
     498        }
     499    }
    505500
    506501    // this current experimental implementation will only work for standard restrictions:
     
    724719        }
    725720
    726         IconElemStyle nodeStyle = (IconElemStyle)getPrimitiveStyle(r);
     721        IconElemStyle nodeStyle = getPrimitiveNodeStyle(r);
    727722
    728723        if (nodeStyle == null) {
     
    748743    }
    749744
    750     public void drawMultipolygon(Relation r) {
     745    public Boolean drawMultipolygon(Relation r) {
    751746        Collection<Way> inner = new LinkedList<Way>();
    752747        Collection<Way> outer = new LinkedList<Way>();
     
    754749        Collection<Way> outerclosed = new LinkedList<Way>();
    755750        Boolean incomplete = false;
     751        Boolean drawn = false;
    756752
    757753        r.clearErrors();
     
    787783                            outer.add(w);
    788784                        else if(r.selected)
    789                             drawSelectedMember(m.member, styles != null ? styles.get(m.member) : null, true, true);
     785                            drawSelectedMember(m.member, styles != null
     786                            ? getPrimitiveStyle(m.member) : null, true, true);
    790787                    }
    791788                }
     
    798795        }
    799796
    800         ElemStyle wayStyle = styles != null ? styles.get(r) : null;
     797        ElemStyle wayStyle = styles != null ? getPrimitiveStyle(r) : null;
    801798        if(styles != null && (wayStyle == null || !(wayStyle instanceof AreaElemStyle)))
    802799        {
     
    806803                   wayStyle = styles.get(w);
    807804            }
     805            r.mappaintStyle = wayStyle;
    808806        }
    809807
     
    814812            Collection<Way> join = new LinkedList<Way>();
    815813
     814            drawn = true;
    816815            for (Way w : outer)
    817816            {
     
    954953                for (Way wOuter : outer)
    955954                    wOuter.mappaintVisibleCode = viewid;
    956                 return;
     955                return drawn;
    957956            }
    958957            for (Way wInner : inner)
    959958            {
    960                 ElemStyle innerStyle = styles.get(wInner);
     959                ElemStyle innerStyle = getPrimitiveStyle(wInner);
    961960                if(innerStyle == null)
    962961                {
     
    988987            for (Way wOuter : outer)
    989988            {
    990                 ElemStyle outerStyle = styles.get(wOuter);
     989                ElemStyle outerStyle = getPrimitiveStyle(wOuter);
    991990                if(outerStyle == null)
    992991                {
     
    10161015            }
    10171016        }
    1018         else if(r.selected)
    1019             drawSelectedRelation(r);
     1017        return drawn;
    10201018    }
    10211019
Note: See TracChangeset for help on using the changeset viewer.