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

Last change on this file since 74 was 74, checked in by imi, 18 years ago

changed Preferences system to more flexible one.

File size: 5.0 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.io.IOException;
8import java.util.Collection;
9import java.util.LinkedList;
10
11import javax.swing.JLabel;
12import javax.swing.JList;
13import javax.swing.JOptionPane;
14import javax.swing.JPanel;
15import javax.swing.JScrollPane;
16import javax.swing.KeyStroke;
17
18import org.jdom.JDOMException;
19import org.openstreetmap.josm.Main;
20import org.openstreetmap.josm.data.osm.OsmPrimitive;
21import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
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
42 String osmDataServer = Main.pref.get("osmDataServer");
43 //TODO: Remove this in later versions (temporary only)
44 if (osmDataServer.endsWith("/0.2") || osmDataServer.endsWith("/0.2/")) {
45 int answer = JOptionPane.showConfirmDialog(Main.main,
46 "You seem to have an outdated server entry in your preferences.\n" +
47 "\n" +
48 "As of JOSM Release 1.2, you must no longer specify the API version in\n" +
49 "the osm url. For the OSM standard server, use http://www.openstreetmap.org/api" +
50 "\n" +
51 "Fix settings and continue?", "Outdated server url detected.", JOptionPane.YES_NO_OPTION);
52 if (answer != JOptionPane.YES_OPTION)
53 return;
54 int cutPos = osmDataServer.endsWith("/0.2") ? 4 : 5;
55 Main.pref.put("osmDataServer", osmDataServer.substring(0, osmDataServer.length()-cutPos));
56 try {
57 Main.pref.save();
58 } catch (IOException x) {
59 x.printStackTrace();
60 JOptionPane.showMessageDialog(Main.main, "Could not save the preferences change:\n" + x.getMessage());
61 }
62 }
63
64 final Collection<OsmPrimitive> add = new LinkedList<OsmPrimitive>();
65 final Collection<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
66 final Collection<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
67 for (OsmPrimitive osm : Main.main.ds.allPrimitives()) {
68 if (osm.id == 0 && !osm.isDeleted())
69 add.add(osm);
70 else if ((osm.modified || osm.modifiedProperties) && !osm.isDeleted())
71 update.add(osm);
72 else if (osm.isDeleted() && osm.id != 0)
73 delete.add(osm);
74 }
75
76 if (!displayUploadScreen(add, update, delete))
77 return;
78
79 final OsmServerWriter server = new OsmServerWriter();
80 final Collection<OsmPrimitive> all = new LinkedList<OsmPrimitive>();
81 all.addAll(add);
82 all.addAll(update);
83 all.addAll(delete);
84
85 new Thread(new PleaseWaitRunnable("Uploading data"){
86 @Override
87 public void realRun() {
88 try {
89 server.uploadOsm(all);
90 } catch (JDOMException x) {
91 closeDialog();
92 x.printStackTrace();
93 JOptionPane.showMessageDialog(Main.main, x.getMessage());
94 }
95 Main.main.getMapFrame().mapView.editLayer().cleanData(server.processed, !add.isEmpty());
96 }
97 }).start();
98 }
99
100 /**
101 * Displays a screen where the actions that would be taken are displayed and
102 * give the user the possibility to cancel the upload.
103 * @return <code>true</code>, if the upload should continue. <code>false</code>
104 * if the user requested cancel.
105 */
106 private boolean displayUploadScreen(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update, Collection<OsmPrimitive> delete) {
107 if (add.isEmpty() && update.isEmpty() && delete.isEmpty()) {
108 JOptionPane.showMessageDialog(Main.main, "No changes to upload.");
109 return false;
110 }
111
112 JPanel p = new JPanel(new GridBagLayout());
113
114 OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
115
116 if (!add.isEmpty()) {
117 p.add(new JLabel("Objects to add:"), GBC.eol());
118 JList l = new JList(add.toArray());
119 l.setCellRenderer(renderer);
120 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
121 p.add(new JScrollPane(l), GBC.eol().fill());
122 }
123
124 if (!update.isEmpty()) {
125 p.add(new JLabel("Objects to modify:"), GBC.eol());
126 JList l = new JList(update.toArray());
127 l.setCellRenderer(renderer);
128 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
129 p.add(new JScrollPane(l), GBC.eol().fill());
130 }
131
132 if (!delete.isEmpty()) {
133 p.add(new JLabel("Objects to delete:"), GBC.eol());
134 JList l = new JList(delete.toArray());
135 l.setCellRenderer(renderer);
136 l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
137 p.add(new JScrollPane(l), GBC.eol().fill());
138 }
139
140 return JOptionPane.showConfirmDialog(Main.main, p, "Upload this changes?",
141 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
142 }
143}
Note: See TracBrowser for help on using the repository browser.