Changeset 1169 in josm for trunk/src/org/openstreetmap/josm/actions/CopyAction.java
- Timestamp:
- 2008-12-23T15:07:05+01:00 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/actions/CopyAction.java
r1084 r1169 28 28 public final class CopyAction extends JosmAction implements SelectionChangedListener { 29 29 30 private LinkedList<JosmAction> listeners;30 private LinkedList<JosmAction> listeners; 31 31 32 public CopyAction() {33 super(tr("Copy"), "copy",34 tr("Copy selected objects to paste buffer."),35 Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.GROUP_MENU), true);36 setEnabled(false);37 DataSet.selListeners.add(this);38 listeners = new LinkedList<JosmAction>();39 }32 public CopyAction() { 33 super(tr("Copy"), "copy", 34 tr("Copy selected objects to paste buffer."), 35 Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.GROUP_MENU), true); 36 setEnabled(false); 37 DataSet.selListeners.add(this); 38 listeners = new LinkedList<JosmAction>(); 39 } 40 40 41 @Override public void addListener(JosmAction a) {42 listeners.add(a);43 }41 @Override public void addListener(JosmAction a) { 42 listeners.add(a); 43 } 44 44 45 public void actionPerformed(ActionEvent e) {46 Collection<OsmPrimitive> sel = Main.ds.getSelected();47 if (sel.isEmpty()) {48 JOptionPane.showMessageDialog(Main.parent,49 tr("Please select something to copy."));50 return;51 }45 public void actionPerformed(ActionEvent e) { 46 Collection<OsmPrimitive> sel = Main.ds.getSelected(); 47 if (sel.isEmpty()) { 48 JOptionPane.showMessageDialog(Main.parent, 49 tr("Please select something to copy.")); 50 return; 51 } 52 52 53 /* New pasteBuffer - will be assigned to the global one at the end */54 final DataSet pasteBuffer = new DataSet();55 final HashMap<OsmPrimitive,OsmPrimitive> map = new HashMap<OsmPrimitive,OsmPrimitive>();56 /* temporarily maps old nodes to new so we can do a true deep copy */53 /* New pasteBuffer - will be assigned to the global one at the end */ 54 final DataSet pasteBuffer = new DataSet(); 55 final HashMap<OsmPrimitive,OsmPrimitive> map = new HashMap<OsmPrimitive,OsmPrimitive>(); 56 /* temporarily maps old nodes to new so we can do a true deep copy */ 57 57 58 /* scan the selected objects, mapping them to copies; when copying a way or relation,59 * the copy references the copies of their child objects */60 new Visitor(){61 public void visit(Node n) {62 /* check if already in pasteBuffer - e.g. two ways are selected which share a node;63 * or a way and a node in that way is selected, we'll see it twice, once via the64 * way and once directly; and so on. */65 if (map.containsKey(n)) { return; }66 Node nnew = new Node(n);67 map.put(n, nnew);68 pasteBuffer.addPrimitive(nnew);69 }70 public void visit(Way w) {71 /* check if already in pasteBuffer - could have come from a relation, and directly etc. */72 if (map.containsKey(w)) { return; }73 Way wnew = new Way();74 wnew.cloneFrom(w);75 wnew.nodes.clear();76 List<Node> nodes = new ArrayList<Node>();77 for (Node n : w.nodes) {78 if (! map.containsKey(n)) {79 n.visit(this);80 }81 nodes.add((Node)map.get(n));82 }83 wnew.nodes.clear();84 wnew.nodes.addAll(nodes);85 pasteBuffer.addPrimitive(wnew);86 }87 public void visit(Relation e) {88 if (map.containsKey(e)) { return; }89 Relation enew = new Relation(e);90 List<RelationMember> members = new ArrayList<RelationMember>();91 for (RelationMember m : e.members) {92 if (! map.containsKey(m.member)) {93 m.member.visit(this);94 }95 RelationMember mnew = new RelationMember(m);96 mnew.member = map.get(m.member);97 members.add(mnew);98 }99 enew.members.addAll(members);100 pasteBuffer.addPrimitive(enew);101 }102 public void visitAll() {103 for (OsmPrimitive osm : Main.ds.getSelected())104 osm.visit(this);105 }106 }.visitAll();58 /* scan the selected objects, mapping them to copies; when copying a way or relation, 59 * the copy references the copies of their child objects */ 60 new Visitor(){ 61 public void visit(Node n) { 62 /* check if already in pasteBuffer - e.g. two ways are selected which share a node; 63 * or a way and a node in that way is selected, we'll see it twice, once via the 64 * way and once directly; and so on. */ 65 if (map.containsKey(n)) { return; } 66 Node nnew = new Node(n); 67 map.put(n, nnew); 68 pasteBuffer.addPrimitive(nnew); 69 } 70 public void visit(Way w) { 71 /* check if already in pasteBuffer - could have come from a relation, and directly etc. */ 72 if (map.containsKey(w)) { return; } 73 Way wnew = new Way(); 74 wnew.cloneFrom(w); 75 wnew.nodes.clear(); 76 List<Node> nodes = new ArrayList<Node>(); 77 for (Node n : w.nodes) { 78 if (! map.containsKey(n)) { 79 n.visit(this); 80 } 81 nodes.add((Node)map.get(n)); 82 } 83 wnew.nodes.clear(); 84 wnew.nodes.addAll(nodes); 85 pasteBuffer.addPrimitive(wnew); 86 } 87 public void visit(Relation e) { 88 if (map.containsKey(e)) { return; } 89 Relation enew = new Relation(e); 90 List<RelationMember> members = new ArrayList<RelationMember>(); 91 for (RelationMember m : e.members) { 92 if (! map.containsKey(m.member)) { 93 m.member.visit(this); 94 } 95 RelationMember mnew = new RelationMember(m); 96 mnew.member = map.get(m.member); 97 members.add(mnew); 98 } 99 enew.members.addAll(members); 100 pasteBuffer.addPrimitive(enew); 101 } 102 public void visitAll() { 103 for (OsmPrimitive osm : Main.ds.getSelected()) 104 osm.visit(this); 105 } 106 }.visitAll(); 107 107 108 Main.pasteBuffer = pasteBuffer;109 Main.main.menu.paste.setEnabled(true); /* now we have a paste buffer we can make paste available */108 Main.pasteBuffer = pasteBuffer; 109 Main.main.menu.paste.setEnabled(true); /* now we have a paste buffer we can make paste available */ 110 110 111 for(JosmAction a : listeners) {112 a.pasteBufferChanged(Main.pasteBuffer);113 }114 }111 for(JosmAction a : listeners) { 112 a.pasteBufferChanged(Main.pasteBuffer); 113 } 114 } 115 115 116 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {117 setEnabled(! newSelection.isEmpty());118 }116 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { 117 setEnabled(! newSelection.isEmpty()); 118 } 119 119 }
Note:
See TracChangeset
for help on using the changeset viewer.
