Changeset 31 in josm for src/org/openstreetmap/josm/command


Ignore:
Timestamp:
2005-12-06T23:23:20+01:00 (20 years ago)
Author:
imi
Message:
  • fixed broken stuff from last checkin
  • complete undo and redo
  • futher simplification in DeleteAction
Location:
src/org/openstreetmap/josm/command
Files:
1 added
1 deleted
5 edited

Legend:

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

    r30 r31  
    11package org.openstreetmap.josm.command;
    22
    3 import java.awt.Component;
    43import java.util.Collection;
    54
    6 import javax.swing.JLabel;
    7 
    85import org.openstreetmap.josm.data.osm.DataSet;
    9 import org.openstreetmap.josm.data.osm.Key;
    10 import org.openstreetmap.josm.data.osm.LineSegment;
    11 import org.openstreetmap.josm.data.osm.Node;
    126import org.openstreetmap.josm.data.osm.OsmPrimitive;
    13 import org.openstreetmap.josm.data.osm.Track;
    14 import org.openstreetmap.josm.data.osm.visitor.SelectionComponentVisitor;
    15 import org.openstreetmap.josm.data.osm.visitor.Visitor;
     7import org.openstreetmap.josm.data.osm.visitor.AddVisitor;
     8import org.openstreetmap.josm.data.osm.visitor.DeleteVisitor;
    169
    1710/**
     
    2619         * The dataset this command operates on.
    2720         */
    28         DataSet ds;
     21        private DataSet ds;
    2922
    30         /**
    31          * Helper that adds the object
    32          * @author imi
    33          */
    34         private final class AddVisitor implements Visitor {
    35                 public void visit(Node n) {ds.nodes.add(n);}
    36                 public void visit(LineSegment ls) {ds.lineSegments.add(ls);}
    37                 public void visit(Track t) {ds.tracks.add(t);}
    38                 public void visit(Key k) {throw new IllegalStateException("Keys are added by using ChangeKeyValueCommand");}
    39         }
    40 
    41         /**
    42          * Helper that deletes the object (for undo)
    43          * @author imi
    44          */
    45         private final class RemoveVisitor implements Visitor {
    46                 public void visit(Node n) {ds.nodes.remove(n);}
    47                 public void visit(LineSegment ls) {ds.lineSegments.remove(ls);}
    48                 public void visit(Track t) {ds.tracks.remove(t);}
    49                 public void visit(Key k) {throw new IllegalStateException("Keys are added by using ChangeKeyValueCommand");}
    50         }
    51        
    5223        /**
    5324         * The primitive to add to the dataset.
     
    6435
    6536        public void executeCommand() {
    66                 osm.visit(new AddVisitor());
     37                osm.visit(new AddVisitor(ds));
    6738        }
    6839
    6940        public void undoCommand() {
    70                 osm.visit(new RemoveVisitor());
     41                osm.visit(new DeleteVisitor(ds));
    7142        }
    7243
    73         public Component commandDescription() {
    74                 SelectionComponentVisitor v = new SelectionComponentVisitor();
    75                 osm.visit(v);
    76                 return new JLabel("Add "+v.name, v.icon, JLabel.LEADING);
    77         }
    78        
    7944        public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
    8045                added.add(osm);
  • src/org/openstreetmap/josm/command/ChangeKeyValueCommand.java

    r30 r31  
    11package org.openstreetmap.josm.command;
    22
    3 import java.awt.Component;
    43import java.util.Collection;
    54import java.util.HashMap;
     
    87import java.util.List;
    98import java.util.Map;
    10 
    11 import javax.swing.JLabel;
    129
    1310import org.openstreetmap.josm.data.osm.Key;
     
    7774        }
    7875
    79         public Component commandDescription() {
    80                 String objStr = objects.size()+" object" + (objects.size()==1?"":"s");
    81                 if (value == null)
    82                         return new JLabel("Delete the key '"+key+"' of "+objStr);
    83                 return new JLabel("Change the key '"+key+"' of "+objStr+" to '"+value+"'");
    84         }
    85 
    8676        public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
    8777                modified.addAll(objects);
  • src/org/openstreetmap/josm/command/Command.java

    r30 r31  
    11package org.openstreetmap.josm.command;
    22
    3 import java.awt.Component;
    43import java.util.Collection;
    54
     
    3231       
    3332        /**
    34          * Give a description of the command as component to draw
    35          */
    36         Component commandDescription();
    37        
    38         /**
    3933         * Fill in the changed data this command operates on.
    4034         * Add to the lists, don't clear them.
  • src/org/openstreetmap/josm/command/DeleteCommand.java

    r30 r31  
    11package org.openstreetmap.josm.command;
    22
    3 import java.awt.Component;
    43import java.util.Collection;
    5 
    6 import javax.swing.JLabel;
     4import java.util.HashSet;
    75
    86import org.openstreetmap.josm.data.osm.DataSet;
    9 import org.openstreetmap.josm.data.osm.Key;
    10 import org.openstreetmap.josm.data.osm.LineSegment;
    11 import org.openstreetmap.josm.data.osm.Node;
    127import org.openstreetmap.josm.data.osm.OsmPrimitive;
    13 import org.openstreetmap.josm.data.osm.Track;
     8import org.openstreetmap.josm.data.osm.visitor.AddVisitor;
     9import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
     10import org.openstreetmap.josm.data.osm.visitor.DeleteVisitor;
    1411import org.openstreetmap.josm.data.osm.visitor.Visitor;
    1512
     
    2320         * The dataset this command operates on.
    2421         */
    25         DataSet ds;
     22        final DataSet ds;
     23        /**
     24         * The primitive that get deleted.
     25         */
     26        final Collection<OsmPrimitive> data = new HashSet<OsmPrimitive>();
    2627
    27         /**
    28          * Helper that adds the object.
    29          * @author imi
    30          */
    31         private final class AddVisitor implements Visitor {
    32                 public void visit(Node n) {ds.nodes.add(n);}
    33                 public void visit(LineSegment ls) {ds.lineSegments.add(ls);}
    34                 public void visit(Track t) {ds.tracks.add(t);}
    35                 public void visit(Key k) {throw new IllegalStateException("Keys are added by using ChangeKeyValueCommand");}
    36         }
    37 
    38         /**
    39          * Helper that deletes the object. Does not respect back reference cache.
    40          * @author imi
    41          */
    42         private final class DeleteVisitor implements Visitor {
    43                 public void visit(Node n) {ds.nodes.remove(n);}
    44                 public void visit(LineSegment ls) {ds.lineSegments.remove(ls);}
    45                 public void visit(Track t) {ds.tracks.remove(t);}
    46                 public void visit(Key k) {throw new IllegalStateException("Keys are added by using ChangeKeyValueCommand");}
    47         }
    48        
    49        
    50        
    51         /**
    52          * The primitives that are going to deleted.
    53          */
    54         private final Collection<OsmPrimitive> data;
    55        
    56         public DeleteCommand(DataSet ds, Collection<OsmPrimitive> data) {
     28        public DeleteCommand(DataSet ds, OsmPrimitive osm) {
    5729                this.ds = ds;
    58                 this.data = data;
     30                CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(ds);
     31                osm.visit(v);
     32                data.addAll(v.data);
     33                data.add(osm);
    5934        }
    6035       
    6136        public void executeCommand() {
    62                 Visitor v = new DeleteVisitor();
     37                Visitor v = new DeleteVisitor(ds);
    6338                for (OsmPrimitive osm : data)
    6439                        osm.visit(v);
     
    6641
    6742        public void undoCommand() {
    68                 Visitor v = new AddVisitor();
     43                Visitor v = new AddVisitor(ds);
    6944                for (OsmPrimitive osm : data)
    7045                        osm.visit(v);
    71         }
    72 
    73         public Component commandDescription() {
    74                 return new JLabel("Delete "+data.size()+" primitives");
    7546        }
    7647
  • src/org/openstreetmap/josm/command/MoveCommand.java

    r30 r31  
    11package org.openstreetmap.josm.command;
    22
    3 import java.awt.Component;
    43import java.awt.geom.Point2D;
    54import java.util.Collection;
     
    76import java.util.LinkedList;
    87import java.util.List;
    9 
    10 import javax.swing.JLabel;
    118
    129import org.openstreetmap.josm.data.osm.Node;
     
    2522         * The objects that should be moved.
    2623         */
    27         private List<OsmPrimitive> objects;
     24        public List<Node> objects = new LinkedList<Node>();
    2825        /**
    2926         * x difference movement. Coordinates are in northern/eastern
     
    3835         * x/y List of all old positions of the objects.
    3936         */
    40         private List<Point2D.Double> oldPositions;
    41        
     37        private List<Point2D.Double> oldPositions = new LinkedList<Point2D.Double>();
     38
    4239        /**
    4340         * Create a MoveCommand and assign the initial object set and movement vector.
    4441         */
    4542        public MoveCommand(Collection<OsmPrimitive> objects, double x, double y) {
    46                 this.objects = new LinkedList<OsmPrimitive>(objects);
    4743                this.x = x;
    4844                this.y = y;
     45                this.objects = getAffectedNodes(objects);
     46                for (Node n : this.objects)
     47                        oldPositions.add(new Point2D.Double(n.coor.x, n.coor.y));
    4948        }
    5049
    51         public void executeCommand() {
     50        /**
     51         * @return a list of all nodes that will be moved if using the given set of
     52         * objects.
     53         */
     54        public static List<Node> getAffectedNodes(Collection<OsmPrimitive> objects) {
    5255                AllNodesVisitor visitor = new AllNodesVisitor();
    5356                for (OsmPrimitive osm : objects)
    5457                        osm.visit(visitor);
    55                 for (Node n : visitor.nodes) {
     58                return new LinkedList<Node>(visitor.nodes);
     59        }
     60       
     61        /**
     62         * Move the same set of objects again by the specified vector. The vectors
     63         * are added together and so the resulting will be moved to the previous
     64         * vector plus this one.
     65         *
     66         * The move is immediatly executed and any undo will undo both vectors to
     67         * the original position the objects had before first moving.
     68         */
     69        public void moveAgain(double x, double y) {
     70                for (Node n : objects) {
     71                        n.coor.x += x;
     72                        n.coor.y += y;
     73                }
     74                this.x += x;
     75                this.y += y;
     76        }
     77       
     78        public void executeCommand() {
     79                for (Node n : objects) {
    5680                        n.coor.x += x;
    5781                        n.coor.y += y;
     
    6084
    6185        public void undoCommand() {
    62                 AllNodesVisitor visitor = new AllNodesVisitor();
    63                 for (OsmPrimitive osm : objects)
    64                         osm.visit(visitor);
    6586                Iterator<Point2D.Double> it = oldPositions.iterator();
    66                 for (Node n : visitor.nodes) {
     87                for (Node n : objects) {
    6788                        Point2D.Double p = it.next();
    6889                        n.coor.x = p.x;
     
    7192        }
    7293
    73         public Component commandDescription() {
    74                 String xstr = Math.abs(x) + (x < 0 ? "W" : "E");
    75                 String ystr = Math.abs(y) + (y < 0 ? "S" : "N");
    76                 return new JLabel("Move "+objects.size()+" primitives "+xstr+" "+ystr);
    77         }
    78 
    7994        public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
    8095                for (OsmPrimitive osm : objects)
    81                         if (!modified.contains(osm))
    82                                 modified.add(osm);
     96                        modified.add(osm);
    8397        }
    8498}
Note: See TracChangeset for help on using the changeset viewer.