Ticket #6367: JOSM.patch

File JOSM.patch, 5.6 KB (added by landwirt@…, 12 years ago)

patch for undoing Follow Line

  • src/org/openstreetmap/josm/actions/FollowLineAction.java

     
    77import java.awt.event.KeyEvent;
    88import java.util.Collection;
    99import java.util.Iterator;
     10import java.util.LinkedList;
    1011import java.util.List;
    1112import java.util.Set;
    1213
    1314import org.openstreetmap.josm.Main;
    1415import org.openstreetmap.josm.actions.mapmode.DrawAction;
    1516import org.openstreetmap.josm.command.ChangeCommand;
     17import org.openstreetmap.josm.command.Command;
     18import org.openstreetmap.josm.command.SelectCommand;
     19import org.openstreetmap.josm.command.SequenceCommand;
    1620import org.openstreetmap.josm.data.osm.Node;
    1721import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1822import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     
    3842                "followline.png",
    3943                tr("Continues drawing a line that shares nodes with another line."),
    4044                Shortcut.registerShortcut("tools:followline", tr(
    41                 "Tool: {0}", tr("Follow")),
    42                 KeyEvent.VK_F, Shortcut.GROUP_EDIT), true);
     45                        "Tool: {0}", tr("Follow")),
     46                        KeyEvent.VK_F, Shortcut.GROUP_EDIT), true);
    4347    }
    4448
    4549    @Override
     
    6266        if (osmLayer == null)
    6367            return;
    6468        if (!(Main.map.mapMode instanceof DrawAction)) return; // We are not on draw mode
    65        
     69
    6670        Collection<Node> selectedPoints = osmLayer.data.getSelectedNodes();
    6771        Collection<Way> selectedLines = osmLayer.data.getSelectedWays();
    6872        if ((selectedPoints.size() > 1) || (selectedLines.size() != 1)) // Unsuitable selection
    6973            return;
    70        
     74
    7175        Node last = ((DrawAction) Main.map.mapMode).getCurrentBaseNode();
    7276        if (last == null)
    7377            return;
     
    8286        }
    8387        List<OsmPrimitive> referrers = last.getReferrers();
    8488        if (referrers.size() < 2) return; // There's nothing to follow
    85        
    86         Node newPoint = null;       
     89
     90        Node newPoint = null;
    8791        Iterator<OsmPrimitive> i = referrers.iterator();
    8892        while (i.hasNext()) {
    8993            OsmPrimitive referrer = i.next();
     
    9599                continue;
    96100            }
    97101            Set<Node> points = toFollow.getNeighbours(last);
    98             if (!points.remove(prev) || (points.size() == 0))
     102            if (!points.remove(prev) || (points.size() == 0)) {
    99103                continue;
     104            }
    100105            if (points.size() > 1)    // Ambiguous junction?
    101106                return;
    102107
     
    114119            } else {
    115120                newFollower.addNode(newPoint);
    116121            }
    117             Main.main.undoRedo.add(new ChangeCommand(follower, newFollower));
    118             osmLayer.data.clearSelection();
    119             osmLayer.data.addSelected(newFollower);
    120             osmLayer.data.addSelected(newPoint);
    121             // "viewport following" mode for tracing long features
    122             // from aerial imagery or GPS tracks.
     122
     123            Collection<OsmPrimitive> newSelection = new LinkedList<OsmPrimitive>();
     124
     125            newSelection.add(newFollower);
     126            newSelection.add(newPoint);
     127
     128            Collection<Command> cmds = new LinkedList<Command>();
     129
     130            cmds.add(new ChangeCommand(follower, newFollower));
     131            cmds.add(new SelectCommand(newSelection));
     132
     133            Main.main.undoRedo.add(new SequenceCommand(tr("Follow line"), cmds));
     134
     135            // "viewport following" mode for tracing long features
     136            // from aerial imagery or GPS tracks.
    123137            if (Main.map.mapView.viewportFollowing) {
    124138                Main.map.mapView.smoothScrollTo(newPoint.getEastNorth());
    125139            };
  • src/org/openstreetmap/josm/command/SelectCommand.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.command;
     3
     4import static org.openstreetmap.josm.tools.I18n.trn;
     5
     6import java.util.Collection;
     7
     8import javax.swing.JLabel;
     9
     10import org.openstreetmap.josm.Main;
     11import org.openstreetmap.josm.data.osm.OsmPrimitive;
     12
     13/**
     14 * Command that selects OSM primitives
     15 *
     16 * @author Landwirt
     17 */
     18public class SelectCommand extends Command {
     19
     20    private final Collection<OsmPrimitive> osm;
     21
     22    private Collection<OsmPrimitive> oldSelection;
     23
     24    public SelectCommand(Collection<OsmPrimitive> osm) {
     25        this.osm = osm;
     26    }
     27
     28    @Override
     29    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
     30            Collection<OsmPrimitive> added) {
     31    }
     32
     33    @Override
     34    public void undoCommand() {
     35        Main.map.mapView.getEditLayer().data.setSelected(oldSelection);
     36    }
     37
     38    @Override public boolean executeCommand() {
     39        oldSelection = Main.map.mapView.getEditLayer().data.getSelected();
     40
     41        Main.map.mapView.getEditLayer().data.setSelected(osm);
     42        return true;
     43    }
     44
     45    @Override public JLabel getDescription() {
     46        int size = osm != null ? osm.size() : 0;
     47        return new JLabel(trn("Selected {0} object", "Selected {0} objects", size, size), null,
     48                JLabel.HORIZONTAL
     49                );
     50    }
     51}