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

Last change on this file since 99 was 99, checked in by imi, 18 years ago
  • added GeoImage feature (showing images on a tracklog)
  • added zoom slider
  • added Escape cancels selection rectangle
  • added "Save password" option to Auth-dialog
  • fixed that redo/undo buttons were not enabled
  • fixed hotkeys beeing inaccessible when no data is loaded
File size: 5.3 KB
Line 
1package org.openstreetmap.josm.actions;
2
3import java.awt.GridBagLayout;
4import java.awt.event.ActionEvent;
5import java.awt.event.InputEvent;
6import java.awt.event.KeyEvent;
7import java.util.Collection;
8import java.util.LinkedList;
9
10import javax.swing.JLabel;
11import javax.swing.JList;
12import javax.swing.JOptionPane;
13import javax.swing.JPanel;
14import javax.swing.JScrollPane;
15import javax.swing.KeyStroke;
16
17import org.jdom.JDOMException;
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;
24
25/**
26 * Action that opens a connection to the osm server and upload all changes.
27 *
28 * An dialog is displayed asking the user to specify a rectangle to grab.
29 * The url and account settings from the preferences are used.
30 *
31 * @author imi
32 */
33public class UploadAction extends JosmAction {
34
35 public UploadAction() {
36 super("Upload to OSM", "upload", "Upload all changes to the OSM server.", "Ctrl-Shift-U",
37 KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
38 }
39
40 public void actionPerformed(ActionEvent e) {
41 if (Main.map == null) {
42 JOptionPane.showMessageDialog(Main.parent, "Nothing to upload. Get some data first.");
43 return;
44 }
45
46 String osmDataServer = Main.pref.get("osm-server.url");
47 //TODO: Remove this in later versions (temporary only)
48 if (osmDataServer.endsWith("/0.2") || osmDataServer.endsWith("/0.2/")) {
49 int answer = JOptionPane.showConfirmDialog(Main.parent,
50 "You seem to have an outdated server entry in your preferences.\n" +
51 "\n" +
52 "As of JOSM Release 1.2, you must no longer specify the API version in\n" +
53 "the osm url. For the OSM standard server, use http://www.openstreetmap.org/api" +
54 "\n" +
55 "Fix settings and continue?", "Outdated server url detected.", JOptionPane.YES_NO_OPTION);
56 if (answer != JOptionPane.YES_OPTION)
57 return;
58 int cutPos = osmDataServer.endsWith("/0.2") ? 4 : 5;
59 Main.pref.put("osm-server.url", osmDataServer.substring(0, osmDataServer.length()-cutPos));
60 }
61
62 if (!Main.map.conflictDialog.conflicts.isEmpty()) {
63 JOptionPane.showMessageDialog(Main.parent, "There are unresolved conflicts. You have to resolve these first.");
64 Main.map.conflictDialog.action.button.setSelected(true);
65 Main.map.conflictDialog.action.actionPerformed(null);
66 return;
67 }
68
69 final Collection<OsmPrimitive> add = new LinkedList<OsmPrimitive>();
70 final Collection<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
71 final Collection<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
72 for (OsmPrimitive osm : Main.ds.allPrimitives()) {
73 if (osm.id == 0 && !osm.deleted)
74 add.add(osm);
75 else if (osm.modified && !osm.deleted)
76 update.add(osm);
77 else if (osm.deleted && osm.id != 0)
78 delete.add(osm);
79 }
80
81 if (!displayUploadScreen(add, update, delete))
82 return;
83
84 final OsmServerWriter server = new OsmServerWriter();
85 final Collection<OsmPrimitive> all = new LinkedList<OsmPrimitive>();
86 all.addAll(add);
87 all.addAll(update);
88 all.addAll(delete);
89
90 PleaseWaitRunnable uploadTask = new PleaseWaitRunnable("Uploading data"){
91 @Override protected void realRun() throws JDOMException {
92 server.setProgressInformation(currentAction, progress);
93 server.uploadOsm(all);
94 }
95 @Override protected void finish() {
96 Main.main.editLayer().cleanData(server.processed, !add.isEmpty());
97 }
98 @Override protected void cancel() {
99 server.cancel();
100 }
101 };
102 Main.worker.execute(uploadTask);
103 uploadTask.pleaseWaitDlg.setVisible(true);
104 }
105
106 /**
107 * Displays a screen where the actions that would be taken are displayed and
108 * give the user the possibility to cancel the upload.
109 * @return <code>true</code>, if the upload should continue. <code>false</code>
110 * if the user requested cancel.
111 */
112 private boolean displayUploadScreen(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update, Collection<OsmPrimitive> delete) {
113 if (add.isEmpty() && update.isEmpty() && delete.isEmpty()) {
114 JOptionPane.showMessageDialog(Main.parent, "No changes to upload.");
115 return false;
116 }
117
118 JPanel p = new JPanel(new GridBagLayout());
119
120 OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
121
122 if (!add.isEmpty()) {
123 p.add(new JLabel("Objects to add:"), GBC.eol());
124 JList l = new JList(add.toArray());
125 l.setCellRenderer(renderer);
126 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
127 p.add(new JScrollPane(l), GBC.eol().fill());
128 }
129
130 if (!update.isEmpty()) {
131 p.add(new JLabel("Objects to modify:"), GBC.eol());
132 JList l = new JList(update.toArray());
133 l.setCellRenderer(renderer);
134 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
135 p.add(new JScrollPane(l), GBC.eol().fill());
136 }
137
138 if (!delete.isEmpty()) {
139 p.add(new JLabel("Objects to delete:"), GBC.eol());
140 JList l = new JList(delete.toArray());
141 l.setCellRenderer(renderer);
142 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
143 p.add(new JScrollPane(l), GBC.eol().fill());
144 }
145
146 return JOptionPane.showConfirmDialog(Main.parent, p, "Upload this changes?",
147 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
148 }
149}
Note: See TracBrowser for help on using the repository browser.