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