source: josm/trunk/src/org/openstreetmap/josm/actions/CopyAction.java@ 2198

Last change on this file since 2198 was 2070, checked in by Gubaer, 15 years ago

new: rewrite of CombineWay action
new: conflict resolution dialog for CombineWay, including conflicts for different relation memberships
cleanup: cleanup in OsmReader, reduces memory footprint and reduces parsing time
cleanup: made most of the public fields in OsmPrimitive @deprecated, added accessors and changed the code
cleanup: replaced usages of @deprecated constructors for ExtendedDialog
fixed #3208: Combine ways brokes relation order

WARNING: this changeset touches a lot of code all over the code base. "latest" might become slightly unstable in the next days. Also experience incompatibility issues with plugins in the next few days.

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2// Author: David Earl
3package org.openstreetmap.josm.actions;
4
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.event.ActionEvent;
8import java.awt.event.KeyEvent;
9import java.util.ArrayList;
10import java.util.Collection;
11import java.util.HashMap;
12import java.util.LinkedList;
13import java.util.List;
14
15import javax.swing.JOptionPane;
16
17import org.openstreetmap.josm.Main;
18import org.openstreetmap.josm.data.osm.DataSet;
19import org.openstreetmap.josm.data.osm.Node;
20import org.openstreetmap.josm.data.osm.OsmPrimitive;
21import org.openstreetmap.josm.data.osm.Relation;
22import org.openstreetmap.josm.data.osm.RelationMember;
23import org.openstreetmap.josm.data.osm.Way;
24import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
25import org.openstreetmap.josm.tools.Shortcut;
26
27public final class CopyAction extends JosmAction {
28
29 private LinkedList<JosmAction> listeners;
30
31 public CopyAction() {
32 super(tr("Copy"), "copy",
33 tr("Copy selected objects to paste buffer."),
34 Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.GROUP_MENU), true);
35 listeners = new LinkedList<JosmAction>();
36 }
37
38 @Override public void addListener(JosmAction a) {
39 listeners.add(a);
40 }
41
42 public void actionPerformed(ActionEvent e) {
43 if(isEmptySelection()) return;
44
45 Main.pasteBuffer = copyData();
46 Main.pasteSource = getEditLayer();
47 Main.main.menu.paste.setEnabled(true); /* now we have a paste buffer we can make paste available */
48
49 for(JosmAction a : listeners) {
50 a.pasteBufferChanged(Main.pasteBuffer);
51 }
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 the
68 * 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 List<Node> nodes = new ArrayList<Node>();
82 for (Node n : w.getNodes()) {
83 if (! map.containsKey(n)) {
84 n.visit(this);
85 }
86 nodes.add((Node)map.get(n));
87 }
88 wnew.setNodes(nodes);
89 pasteBuffer.addPrimitive(wnew);
90 }
91 public void visit(Relation e) {
92 if (map.containsKey(e))
93 return;
94 Relation enew = new Relation(e);
95 List<RelationMember> members = new ArrayList<RelationMember>();
96 for (RelationMember m : e.getMembers()) {
97 if (! map.containsKey(m.getMember())) {
98 m.getMember().visit(this);
99 }
100 RelationMember mnew = new RelationMember(m.getRole(), map.get(m.getMember()));
101 members.add(mnew);
102 }
103 enew.setMembers(members);
104 pasteBuffer.addPrimitive(enew);
105 }
106 public void visitAll() {
107 for (OsmPrimitive osm : getCurrentDataSet().getSelected()) {
108 osm.visit(this);
109 }
110 }
111 }.visitAll();
112
113 return pasteBuffer;
114 }
115
116 @Override
117 protected void updateEnabledState() {
118 setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
119 }
120
121 private boolean isEmptySelection() {
122 Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
123 if (sel.isEmpty()) {
124 JOptionPane.showMessageDialog(
125 Main.parent,
126 tr("Please select something to copy."),
127 tr("Information"),
128 JOptionPane.INFORMATION_MESSAGE
129 );
130 return true;
131 }
132 return false;
133 }
134}
Note: See TracBrowser for help on using the repository browser.