Changeset 3440 in josm


Ignore:
Timestamp:
2010-08-15T17:31:20+02:00 (11 years ago)
Author:
jttt
Message:

Fix #5333 "Merge selection" tool is broken

Location:
trunk/src/org/openstreetmap/josm
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java

    r3262 r3440  
    1212
    1313import org.openstreetmap.josm.data.osm.Node;
     14import org.openstreetmap.josm.data.osm.NodeData;
    1415import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1516import org.openstreetmap.josm.data.osm.PrimitiveData;
     
    2324    }
    2425
     26    @SuppressWarnings("null")
    2527    @Override public boolean executeCommand() {
    2628
     
    2830
    2931        for (PrimitiveData pd:data) {
    30             createdPrimitives.add(getLayer().data.getPrimitiveById(pd, true));
     32            OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
     33            boolean created = primitive == null;
     34            if (created) {
     35                primitive = pd.getType().newInstance(pd.getUniqueId(), true);
     36            }
     37            if (pd instanceof NodeData) { // Load nodes immediately because they can't be added to dataset without coordinates
     38                primitive.load(pd);
     39            }
     40            if (created) {
     41                getLayer().data.addPrimitive(primitive);
     42            }
     43            createdPrimitives.add(primitive);
    3144        }
    3245
    33         // Load nodes first to prevent ways with null coordinates
    34         for (int i=0; i<createdPrimitives.size(); i++) {
    35             if (createdPrimitives.get(i) instanceof Node) {
    36                 createdPrimitives.get(i).load(data.get(i));
    37             }
    38         }
    39 
    40         // Now load ways and relations
     46        //Then load ways and relations
    4147        for (int i=0; i<createdPrimitives.size(); i++) {
    4248            if (!(createdPrimitives.get(i) instanceof Node)) {
     
    5763    @Override public JLabel getDescription() {
    5864        return new JLabel(trn("Added {0} object", "Added {0} objects", data.size(), data.size()), null,
    59                             JLabel.HORIZONTAL
     65                JLabel.HORIZONTAL
    6066        );
    6167    }
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r3432 r3440  
    283283                success = ways.remove((Way) primitive);
    284284            } else if (primitive instanceof Relation) {
    285                 success = relations.remove((Relation) primitive);
     285                success = relations.remove(primitive);
    286286            }
    287287            if (!success)
     
    609609     */
    610610    public OsmPrimitive getPrimitiveById(long id, OsmPrimitiveType type) {
    611         return getPrimitiveById(new SimplePrimitiveId(id, type), false);
     611        return getPrimitiveById(new SimplePrimitiveId(id, type));
    612612    }
    613613
    614614    public OsmPrimitive getPrimitiveById(PrimitiveId primitiveId) {
    615         return getPrimitiveById(primitiveId, false);
    616     }
    617 
     615        return primitivesMap.get(primitiveId);
     616    }
     617
     618    /**
     619     *
     620     * @param primitiveId
     621     * @param createNew
     622     * @return
     623     * @deprecated This method can created inconsistent dataset when called for node with id < 0 and createNew=true. That will add
     624     * complete node without coordinates to dataset which is not allowed.
     625     */
     626    @Deprecated
    618627    public OsmPrimitive getPrimitiveById(PrimitiveId primitiveId, boolean createNew) {
    619628        OsmPrimitive result = primitivesMap.get(primitiveId);
     
    734743     */
    735744    public boolean isModified() {
    736         for (Node n: nodes) {
    737             if (n.isModified()) return true;
    738         }
    739         for (Way w: ways) {
    740             if (w.isModified()) return true;
    741         }
    742         for (Relation r: relations) {
    743             if (r.isModified()) return true;
     745        for (OsmPrimitive p: allPrimitives) {
     746            if (p.isModified())
     747                return true;
    744748        }
    745749        return false;
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveType.java

    r3083 r3440  
    7272    }
    7373
     74    public OsmPrimitive newInstance(long uniqueId, boolean allowNegative) {
     75        switch (this) {
     76        case NODE:
     77            return new Node(uniqueId, allowNegative);
     78        case WAY:
     79            return new Way(uniqueId, allowNegative);
     80        case RELATION:
     81            return new Relation(uniqueId, allowNegative);
     82        default:
     83            throw new AssertionError();
     84        }
     85    }
     86
    7487    @Override
    7588    public String toString() {
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java

    r3265 r3440  
    163163        // Create all primitives first
    164164        for (PrimitiveData primitive: mappedPrimitives.values()) {
    165             hull.getPrimitiveById(primitive, true);
    166         }
    167         // Then fill nodes with data
    168         for (PrimitiveData primitive : mappedPrimitives.values()) {
    169             if (primitive instanceof NodeData) {
    170                 if (!primitive.isIncomplete()) {
    171                     hull.getPrimitiveById(primitive).load(primitive);
    172                 }
     165            OsmPrimitive newPrimitive = hull.getPrimitiveById(primitive);
     166            boolean created = newPrimitive == null;
     167            if (created) {
     168                newPrimitive = primitive.getType().newInstance(primitive.getUniqueId(), true);
     169            }
     170            if (newPrimitive instanceof Node && !primitive.isIncomplete()) {
     171                newPrimitive.load(primitive);
     172            }
     173            if (created) {
     174                hull.addPrimitive(newPrimitive);
    173175            }
    174176        }
    175177        // Then ways and relations
    176178        for (PrimitiveData primitive : mappedPrimitives.values()) {
    177             if (!(primitive instanceof NodeData)) {
    178                 if (!primitive.isIncomplete()) {
    179                     hull.getPrimitiveById(primitive).load(primitive);
    180                 }
     179            if (!(primitive instanceof NodeData) && !primitive.isIncomplete()) {
     180                hull.getPrimitiveById(primitive).load(primitive);
    181181            }
    182182        }
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r3384 r3440  
    14811481                        toAdd.add(primitiveInDs);
    14821482                    } else if (!primitive.isNew()) {
    1483                         toAdd.add(ds.getPrimitiveById(primitive, true));
     1483                        OsmPrimitive p = primitive.getType().newInstance(primitive.getUniqueId(), true);
     1484                        ds.addPrimitive(p);
     1485                        toAdd.add(p);
    14841486                    } else {
    14851487                        hasNewInOtherLayer = true;
Note: See TracChangeset for help on using the changeset viewer.