Changeset 2305 in josm for trunk/src/org/openstreetmap/josm/actions/CopyAction.java
- Timestamp:
- 2009-10-24T21:22:49+02:00 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/actions/CopyAction.java
r2283 r2305 7 7 import java.awt.event.ActionEvent; 8 8 import java.awt.event.KeyEvent; 9 import java.util.ArrayList;10 9 import java.util.Collection; 11 import java.util.HashMap;12 10 import java.util.LinkedList; 13 import java.util.List;14 11 15 12 import javax.swing.JOptionPane; 16 13 17 14 import org.openstreetmap.josm.Main; 18 import org.openstreetmap.josm.data.osm.DataSet;19 import org.openstreetmap.josm.data.osm.Node;20 15 import org.openstreetmap.josm.data.osm.OsmPrimitive; 21 import org.openstreetmap.josm.data.osm.Relation;22 import org.openstreetmap.josm.data.osm.RelationMember;23 import org.openstreetmap.josm.data.osm.Way;24 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;25 16 import org.openstreetmap.josm.tools.Shortcut; 26 17 … … 43 34 if(isEmptySelection()) return; 44 35 45 Main.pasteBuffer = copyData();36 Main.pasteBuffer.makeCopy(getCurrentDataSet().getSelected()); 46 37 Main.pasteSource = getEditLayer(); 47 38 Main.main.menu.paste.setEnabled(true); /* now we have a paste buffer we can make paste available */ … … 50 41 a.pasteBufferChanged(Main.pasteBuffer); 51 42 } 52 }53 54 public DataSet copyData() {55 /* New pasteBuffer - will be assigned to the global one at the end */56 final DataSet pasteBuffer = new DataSet();57 final HashMap<OsmPrimitive,OsmPrimitive> map = new HashMap<OsmPrimitive,OsmPrimitive>();58 /* temporarily maps old nodes to new so we can do a true deep copy */59 60 if(isEmptySelection()) return pasteBuffer;61 62 /* scan the selected objects, mapping them to copies; when copying a way or relation,63 * the copy references the copies of their child objects */64 new AbstractVisitor() {65 public void visit(Node n) {66 /* check if already in pasteBuffer - e.g. two ways are selected which share a node;67 * or a way and a node in that way is selected, we'll see it twice, once via the68 * way and once directly; and so on. */69 if (map.containsKey(n))70 return;71 Node nnew = new Node(n);72 map.put(n, nnew);73 pasteBuffer.addPrimitive(nnew);74 }75 public void visit(Way w) {76 /* check if already in pasteBuffer - could have come from a relation, and directly etc. */77 if (map.containsKey(w))78 return;79 Way wnew = new Way();80 wnew.cloneFrom(w);81 map.put(w, wnew);82 List<Node> nodes = new ArrayList<Node>();83 for (Node n : w.getNodes()) {84 if (! map.containsKey(n)) {85 n.visit(this);86 }87 nodes.add((Node)map.get(n));88 }89 wnew.setNodes(nodes);90 pasteBuffer.addPrimitive(wnew);91 }92 public void visit(Relation e) {93 if (map.containsKey(e))94 return;95 Relation enew = new Relation(e);96 map.put(e, enew);97 List<RelationMember> members = new ArrayList<RelationMember>();98 for (RelationMember m : e.getMembers()) {99 if (! map.containsKey(m.getMember())) {100 m.getMember().visit(this);101 }102 RelationMember mnew = new RelationMember(m.getRole(), map.get(m.getMember()));103 members.add(mnew);104 }105 enew.setMembers(members);106 pasteBuffer.addPrimitive(enew);107 }108 public void visitAll() {109 for (OsmPrimitive osm : getCurrentDataSet().getSelected()) {110 osm.visit(this);111 }112 }113 }.visitAll();114 115 return pasteBuffer;116 43 } 117 44
Note:
See TracChangeset
for help on using the changeset viewer.