Ticket #2645: rolecorrection2.diff

File rolecorrection2.diff, 4.9 KB (added by Teemu Koskinen <teemu.koskinen@…>, 16 years ago)
  • src/org/openstreetmap/josm/corrector/TagCorrector.java

     
    2020
    2121import org.openstreetmap.josm.Main;
    2222import org.openstreetmap.josm.command.ChangeCommand;
     23import org.openstreetmap.josm.command.ChangeRelationMemberRoleCommand;
    2324import org.openstreetmap.josm.command.Command;
    2425import org.openstreetmap.josm.data.osm.Node;
    2526import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    167168                for (OsmPrimitive primitive : roleCorrectionMap.keySet()) {
    168169                    List<RoleCorrection> roleCorrections = roleCorrectionMap
    169170                            .get(primitive);
    170                     for (Relation relation : Main.ds.relations) {
    171                         Relation newRelation = new Relation(relation);
    172                         Boolean changed = false;
    173171
    174                         for (int i = 0; i < roleCorrections.size(); i++) {
    175                             RoleCorrection roleCorrection = roleCorrections.get(i);
    176                             if (roleCorrection.relation == relation &&
    177                                     roleTableMap.get(primitive).getCorrectionTableModel().getApply(i)) {
    178 
    179                                 RelationMember member = newRelation.members.get(roleCorrection.position);
    180 
    181                                 if (member.equals(roleCorrection.member)) {
    182                                     member.role = roleCorrection.newRole;
    183                                     changed = true;
    184                                 }
    185                             }
     172                    for (int i = 0; i < roleCorrections.size(); i++) {
     173                        RoleCorrection roleCorrection = roleCorrections.get(i);
     174                        if (roleTableMap.get(primitive).getCorrectionTableModel().getApply(i)) {
     175                            commands.add(new ChangeRelationMemberRoleCommand(roleCorrection.relation, roleCorrection.position, roleCorrection.newRole));
    186176                        }
    187                         if (changed)
    188                             commands.add(new ChangeCommand(relation, newRelation));
    189177                    }
    190178                }
    191179            } else if (answer != JOptionPane.NO_OPTION) {
  • src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.command;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.util.Collection;
     7
     8import javax.swing.JLabel;
     9import javax.swing.tree.DefaultMutableTreeNode;
     10import javax.swing.tree.MutableTreeNode;
     11
     12import org.openstreetmap.josm.Main;
     13import org.openstreetmap.josm.data.osm.OsmPrimitive;
     14import org.openstreetmap.josm.data.osm.Relation;
     15import org.openstreetmap.josm.data.osm.RelationMember;
     16
     17import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
     18
     19/**
     20 * Command that changes the role of a relation member
     21 *
     22 * @author Teemu Koskinen <teemu.koskinen@mbnet.fi>
     23 */
     24public class ChangeRelationMemberRoleCommand extends Command {
     25
     26    // The relation to be changed
     27    private final Relation relation;
     28    // Position of the member
     29    private int position = -1;
     30    // The new role
     31    private final String newRole;
     32    // The old role
     33    private String oldRole;
     34    // Old value of modified;
     35    private Boolean oldModified;
     36
     37    public ChangeRelationMemberRoleCommand(Relation relation, int position, String newRole) {
     38        this.relation = relation;
     39        this.position = position;
     40        this.newRole = newRole;
     41    }
     42
     43    @Override public boolean executeCommand() {
     44        if (position < 0 || position >= relation.members.size()) {
     45            Main.debug("error changing the role");
     46            return false;
     47        }
     48
     49        oldRole = relation.members.get(position).role;
     50        relation.members.get(position).role = newRole;
     51
     52        oldModified = relation.modified;
     53        relation.modified = true;
     54        return true;
     55    }
     56
     57    @Override public void undoCommand() {
     58        relation.members.get(position).role = oldRole;
     59        relation.modified = oldModified;
     60    }
     61
     62    @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
     63        modified.add(relation);
     64    }
     65
     66    @Override public MutableTreeNode description() {
     67        NameVisitor v = new NameVisitor();
     68        relation.visit(v);
     69        return new DefaultMutableTreeNode(new JLabel(tr("ChangeRelationMemberRole")+" "+tr(v.className)+" "+v.name, v.icon, JLabel.HORIZONTAL));
     70    }
     71}