source: josm/src/org/openstreetmap/josm/actions/UploadAction.java@ 283

Last change on this file since 283 was 283, checked in by imi, 17 years ago
  • fixed lots of typos (thanks Bruce)
File size: 5.5 KB
Line 
1package org.openstreetmap.josm.actions;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4
5import java.awt.GridBagLayout;
6import java.awt.event.ActionEvent;
7import java.awt.event.InputEvent;
8import java.awt.event.KeyEvent;
9import java.util.Collection;
10import java.util.LinkedList;
11
12import javax.swing.JLabel;
13import javax.swing.JList;
14import javax.swing.JOptionPane;
15import javax.swing.JPanel;
16import javax.swing.JScrollPane;
17
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.data.osm.OsmPrimitive;
20import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
21import org.openstreetmap.josm.gui.PleaseWaitRunnable;
22import org.openstreetmap.josm.io.OsmServerWriter;
23import org.openstreetmap.josm.tools.GBC;
24import org.xml.sax.SAXException;
25
26/**
27 * Action that opens a connection to the osm server and upload all changes.
28 *
29 * An dialog is displayed asking the user to specify a rectangle to grab.
30 * The url and account settings from the preferences are used.
31 *
32 * @author imi
33 */
34public class UploadAction extends JosmAction {
35
36 /** Upload Hook */
37 public interface UploadHook {
38 /**
39 * Checks the upload.
40 * @param add The added primitives
41 * @param update The updated primitives
42 * @param delete The deleted primitives
43 * @return true, if the upload can continue
44 */
45 public boolean checkUpload(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update, Collection<OsmPrimitive> delete);
46 }
47
48 /**
49 * The list of upload hooks. These hooks will be called one after the other
50 * when the user wants to upload data. Plugins can insert their own hooks here
51 * if they want to be able to veto an upload.
52 *
53 * Be dafault, the standard upload dialog is the only element in the list.
54 * Plugins shold normally insert their code before that, so that the upload
55 * dialog is the last thing shown before upload really starts; on occasion
56 * however, a plugin might also want to insert something after that.
57 */
58 public final LinkedList<UploadHook> uploadHooks = new LinkedList<UploadHook>();
59
60 public UploadAction() {
61 super(tr("Upload to OSM"), "upload", tr("Upload all changes to the OSM server."), KeyEvent.VK_U, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK, true);
62
63 /**
64 * Displays a screen where the actions that would be taken are displayed and
65 * give the user the possibility to cancel the upload.
66 */
67 uploadHooks.add(new UploadHook() {
68 public boolean checkUpload(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update, Collection<OsmPrimitive> delete) {
69
70 JPanel p = new JPanel(new GridBagLayout());
71
72 OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
73
74 if (!add.isEmpty()) {
75 p.add(new JLabel(tr("Objects to add:")), GBC.eol());
76 JList l = new JList(add.toArray());
77 l.setCellRenderer(renderer);
78 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
79 p.add(new JScrollPane(l), GBC.eol().fill());
80 }
81
82 if (!update.isEmpty()) {
83 p.add(new JLabel(tr("Objects to modify:")), GBC.eol());
84 JList l = new JList(update.toArray());
85 l.setCellRenderer(renderer);
86 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
87 p.add(new JScrollPane(l), GBC.eol().fill());
88 }
89
90 if (!delete.isEmpty()) {
91 p.add(new JLabel(tr("Objects to delete:")), GBC.eol());
92 JList l = new JList(delete.toArray());
93 l.setCellRenderer(renderer);
94 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
95 p.add(new JScrollPane(l), GBC.eol().fill());
96 }
97
98 return JOptionPane.showConfirmDialog(Main.parent, p, tr("Upload these changes?"),
99 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
100 }
101 });
102 }
103
104 public void actionPerformed(ActionEvent e) {
105 if (Main.map == null) {
106 JOptionPane.showMessageDialog(Main.parent,tr("Nothing to upload. Get some data first."));
107 return;
108 }
109
110 if (!Main.map.conflictDialog.conflicts.isEmpty()) {
111 JOptionPane.showMessageDialog(Main.parent,tr("There are unresolved conflicts. You have to resolve these first."));
112 Main.map.conflictDialog.action.button.setSelected(true);
113 Main.map.conflictDialog.action.actionPerformed(null);
114 return;
115 }
116
117 final LinkedList<OsmPrimitive> add = new LinkedList<OsmPrimitive>();
118 final LinkedList<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
119 final LinkedList<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
120 for (OsmPrimitive osm : Main.ds.allPrimitives()) {
121 if (osm.get("josm/ignore") != null)
122 continue;
123 if (osm.id == 0 && !osm.deleted)
124 add.addLast(osm);
125 else if (osm.modified && !osm.deleted)
126 update.addLast(osm);
127 else if (osm.deleted && osm.id != 0)
128 delete.addFirst(osm);
129 }
130
131 if (add.isEmpty() && update.isEmpty() && delete.isEmpty()) {
132 JOptionPane.showMessageDialog(Main.parent,tr("No changes to upload."));
133 return;
134 }
135
136 // Call all upload hooks in sequence. The upload confirmation dialog
137 // is one of these.
138 for(UploadHook hook : uploadHooks)
139 if(!hook.checkUpload(add, update, delete))
140 return;
141
142 final OsmServerWriter server = new OsmServerWriter();
143 final Collection<OsmPrimitive> all = new LinkedList<OsmPrimitive>();
144 all.addAll(add);
145 all.addAll(update);
146 all.addAll(delete);
147
148 PleaseWaitRunnable uploadTask = new PleaseWaitRunnable(tr("Uploading data")){
149 @Override protected void realRun() throws SAXException {
150 server.uploadOsm(all);
151 }
152 @Override protected void finish() {
153 Main.main.editLayer().cleanData(server.processed, !add.isEmpty());
154 }
155 @Override protected void cancel() {
156 server.cancel();
157 }
158 };
159 Main.worker.execute(uploadTask);
160 }
161}
Note: See TracBrowser for help on using the repository browser.