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

Last change on this file since 14628 was 14397, checked in by Don-vip, 5 years ago

fix #16935 - simplify/cleanup help topics of ToggleDialog/ToggleDialogAction

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