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

Last change on this file since 12581 was 12581, checked in by bastiK, 7 years ago

see #14794 - javadoc

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