001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.actions; 003 004 import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 005 import static org.openstreetmap.josm.tools.I18n.tr; 006 007 import java.awt.event.ActionEvent; 008 import java.awt.event.KeyEvent; 009 import java.io.IOException; 010 import java.util.Collection; 011 import java.util.List; 012 013 import javax.swing.JOptionPane; 014 import javax.swing.SwingUtilities; 015 016 import org.openstreetmap.josm.Main; 017 import org.openstreetmap.josm.data.osm.Changeset; 018 import org.openstreetmap.josm.data.osm.ChangesetCache; 019 import org.openstreetmap.josm.data.osm.UserInfo; 020 import org.openstreetmap.josm.gui.ExceptionDialogUtil; 021 import org.openstreetmap.josm.gui.PleaseWaitRunnable; 022 import org.openstreetmap.josm.gui.io.CloseChangesetDialog; 023 import org.openstreetmap.josm.gui.io.CloseChangesetTask; 024 import org.openstreetmap.josm.io.ChangesetQuery; 025 import org.openstreetmap.josm.io.OsmServerChangesetReader; 026 import org.openstreetmap.josm.io.OsmServerUserInfoReader; 027 import org.openstreetmap.josm.io.OsmTransferException; 028 import org.openstreetmap.josm.tools.Shortcut; 029 import org.xml.sax.SAXException; 030 031 public class CloseChangesetAction extends JosmAction{ 032 033 public CloseChangesetAction() { 034 super(tr("Close open changesets"), 035 "closechangeset", 036 tr("Closes open changesets"), 037 Shortcut.registerShortcut("system:closechangeset", 038 tr("File: {0}", tr("Closes open changesets")), 039 KeyEvent.VK_Q, Shortcut.ALT_CTRL), 040 true 041 ); 042 putValue("help", ht("/Action/CloseChangeset")); 043 044 } 045 public void actionPerformed(ActionEvent e) { 046 Main.worker.submit(new DownloadOpenChangesetsTask()); 047 } 048 049 protected void onPostDownloadOpenChangesets() { 050 List<Changeset> openChangesets = ChangesetCache.getInstance().getOpenChangesets(); 051 if (openChangesets.isEmpty()) { 052 JOptionPane.showMessageDialog( 053 Main.parent, 054 tr("There are no open changesets"), 055 tr("No open changesets"), 056 JOptionPane.INFORMATION_MESSAGE 057 ); 058 return; 059 } 060 061 CloseChangesetDialog dialog = new CloseChangesetDialog(); 062 dialog.setChangesets(openChangesets); 063 dialog.setVisible(true); 064 if (dialog.isCanceled()) 065 return; 066 067 Collection<Changeset> changesetsToClose = dialog.getSelectedChangesets(); 068 CloseChangesetTask closeChangesetTask = new CloseChangesetTask(changesetsToClose); 069 Main.worker.submit(closeChangesetTask); 070 } 071 072 private class DownloadOpenChangesetsTask extends PleaseWaitRunnable { 073 074 private boolean canceled; 075 private OsmServerChangesetReader reader; 076 private List<Changeset> changesets; 077 private Exception lastException; 078 private UserInfo userInfo; 079 080 /** 081 * 082 * @param model provides the user id of the current user and accepts the changesets 083 * after download 084 */ 085 public DownloadOpenChangesetsTask() { 086 super(tr("Downloading open changesets ...", false /* don't ignore exceptions */)); 087 } 088 089 @Override 090 protected void cancel() { 091 this.canceled = true; 092 reader.cancel(); 093 } 094 095 @Override 096 protected void finish() { 097 SwingUtilities.invokeLater( 098 new Runnable() { 099 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 }