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

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

new: reading open changesets from the server
new: reading user info from the server
new: any open changeset can be used when uploading
new: generic dialog for closing changesets
fixed #3427: JOSM can't keep many changesets open at once
fixed #3408: Allow continuing opened changeset even after restarting JOSM
fixed #3476: Default selection in upload dialog should be different for unclosed changesets. (Upload dialog now looks different)

File size: 5.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.io.IOException;
9import java.util.Collection;
10import java.util.List;
11
12import javax.swing.JOptionPane;
13import javax.swing.SwingUtilities;
14
15import org.openstreetmap.josm.Main;
16import org.openstreetmap.josm.data.osm.Changeset;
17import org.openstreetmap.josm.data.osm.UserInfo;
18import org.openstreetmap.josm.gui.ExceptionDialogUtil;
19import org.openstreetmap.josm.gui.PleaseWaitRunnable;
20import org.openstreetmap.josm.gui.io.CloseChangesetDialog;
21import org.openstreetmap.josm.gui.io.CloseChangesetTask;
22import org.openstreetmap.josm.io.ChangesetQuery;
23import org.openstreetmap.josm.io.OsmServerChangesetReader;
24import org.openstreetmap.josm.io.OsmServerUserInfoReader;
25import org.openstreetmap.josm.io.OsmTransferException;
26import org.openstreetmap.josm.tools.Shortcut;
27import org.xml.sax.SAXException;
28
29public class CloseChangesetAction extends JosmAction{
30
31 public CloseChangesetAction() {
32 super(tr("Close open changesets"),
33 "closechangeset",
34 tr("Closes open changesets"),
35 Shortcut.registerShortcut(
36 "system:closechangeset",
37 tr("File: {0}", tr("Closes open changesets")),
38 KeyEvent.VK_Q,
39 Shortcut.GROUP_HOTKEY + Shortcut.GROUPS_ALT2
40 ),
41 true
42 );
43
44 }
45 public void actionPerformed(ActionEvent e) {
46 Main.worker.submit(new DownloadOpenChangesetsTask());
47 }
48
49
50 protected void onPostDownloadOpenChangesets(DownloadOpenChangesetsTask task) {
51 if (task.isCancelled() || task.getLastException() != null) return;
52
53 List<Changeset> openChangesets = task.getChangesets();
54 if (openChangesets.isEmpty()) {
55 JOptionPane.showMessageDialog(
56 Main.parent,
57 tr("There are no open changesets"),
58 tr("No open changesets"),
59 JOptionPane.INFORMATION_MESSAGE
60 );
61 return;
62 }
63
64 CloseChangesetDialog dialog = new CloseChangesetDialog();
65 dialog.setChangesets(openChangesets);
66 dialog.setVisible(true);
67 if (dialog.isCanceled())
68 return;
69
70 Collection<Changeset> changesetsToClose = dialog.getSelectedChangesets();
71 CloseChangesetTask closeChangesetTask = new CloseChangesetTask(changesetsToClose);
72 Main.worker.submit(closeChangesetTask);
73 }
74
75
76 private class DownloadOpenChangesetsTask extends PleaseWaitRunnable {
77
78 private boolean cancelled;
79 private OsmServerChangesetReader reader;
80 private List<Changeset> changesets;
81 private Exception lastException;
82 private UserInfo userInfo;
83
84 /**
85 *
86 * @param model provides the user id of the current user and accepts the changesets
87 * after download
88 */
89 public DownloadOpenChangesetsTask() {
90 super(tr("Downloading open changesets ...", false /* don't ignore exceptions */));
91 }
92
93 @Override
94 protected void cancel() {
95 this.cancelled = true;
96 reader.cancel();
97 }
98
99 @Override
100 protected void finish() {
101 SwingUtilities.invokeLater(
102 new Runnable() {
103 public void run() {
104 if (lastException != null) {
105 ExceptionDialogUtil.explainException(lastException);
106 }
107 onPostDownloadOpenChangesets(DownloadOpenChangesetsTask.this);
108 }
109 }
110 );
111 }
112
113 /**
114 * Fetch the user info from the server. This is necessary if we don't know
115 * the users id yet
116 *
117 * @return the user info
118 * @throws OsmTransferException thrown in case of any communication exception
119 */
120 protected UserInfo fetchUserInfo() throws OsmTransferException {
121 OsmServerUserInfoReader reader = new OsmServerUserInfoReader();
122 return reader.fetchUserInfo(getProgressMonitor().createSubTaskMonitor(1, false));
123 }
124
125 @Override
126 protected void realRun() throws SAXException, IOException, OsmTransferException {
127 try {
128 userInfo = fetchUserInfo();
129 if (cancelled)
130 return;
131 reader = new OsmServerChangesetReader();
132 ChangesetQuery query = new ChangesetQuery().forUser(userInfo.getId()).beingOpen();
133 changesets = reader.queryChangesets(
134 query,
135 getProgressMonitor().createSubTaskMonitor(1, false /* not internal */)
136 );
137 } catch(Exception e) {
138 if (cancelled)
139 return;
140 lastException = e;
141 }
142 }
143
144 public boolean isCancelled() {
145 return cancelled;
146 }
147
148 public List<Changeset> getChangesets() {
149 return changesets;
150 }
151
152 public Exception getLastException() {
153 return lastException;
154 }
155 }
156}
Note: See TracBrowser for help on using the repository browser.