Ignore:
Timestamp:
13.09.2009 19:30:36 (3 years ago)
Author:
Gubaer
Message:

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:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/CloseChangesetAction.java

    r2113 r2115  
    11// License: GPL. For details, see LICENSE file. 
    22package org.openstreetmap.josm.actions; 
     3 
     4import static org.openstreetmap.josm.tools.I18n.tr; 
    35 
    46import java.awt.event.ActionEvent; 
    57import java.awt.event.KeyEvent; 
    68import java.io.IOException; 
     9import java.util.Collection; 
     10import java.util.List; 
    711 
    812import javax.swing.JOptionPane; 
     13import javax.swing.SwingUtilities; 
    914 
    1015import org.openstreetmap.josm.Main; 
     16import org.openstreetmap.josm.data.osm.Changeset; 
     17import org.openstreetmap.josm.data.osm.UserInfo; 
    1118import org.openstreetmap.josm.gui.ExceptionDialogUtil; 
    1219import org.openstreetmap.josm.gui.PleaseWaitRunnable; 
    13 import org.openstreetmap.josm.io.ChangesetProcessingType; 
    14 import org.openstreetmap.josm.io.OsmApi; 
     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; 
    1525import org.openstreetmap.josm.io.OsmTransferException; 
    1626import org.openstreetmap.josm.tools.Shortcut; 
    1727import org.xml.sax.SAXException; 
    1828 
    19 import static org.openstreetmap.josm.tools.I18n.tr; 
     29public class CloseChangesetAction extends JosmAction{ 
    2030 
    21 public class StopChangesetAction extends JosmAction{ 
    22  
    23     public StopChangesetAction() { 
    24         super(tr("Close current changeset"), 
     31    public CloseChangesetAction() { 
     32        super(tr("Close open changesets"), 
    2533                "closechangeset", 
    26                 tr("Close the current changeset ..."), 
     34                tr("Closes open changesets"), 
    2735                Shortcut.registerShortcut( 
    2836                        "system:closechangeset", 
    29                         tr("File: {0}", tr("Close the current changeset ...")), 
     37                        tr("File: {0}", tr("Closes open changesets")), 
    3038                        KeyEvent.VK_Q, 
    3139                        Shortcut.GROUP_HOTKEY + Shortcut.GROUPS_ALT2 
     
    3644    } 
    3745    public void actionPerformed(ActionEvent e) { 
    38         if (OsmApi.getOsmApi().getCurrentChangeset() == null) { 
     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()) { 
    3955            JOptionPane.showMessageDialog( 
    4056                    Main.parent, 
    41                     tr("There is currently no changeset open."), 
    42                     tr("No open changeset"), 
     57                    tr("There are no open changesets"), 
     58                    tr("No open changesets"), 
    4359                    JOptionPane.INFORMATION_MESSAGE 
    4460            ); 
    4561            return; 
    4662        } 
    47         Main.worker.submit(new StopChangesetActionTask()); 
     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); 
    4873    } 
    4974 
    50     @Override 
    51     protected void updateEnabledState() { 
    52         setEnabled(Main.map != null && OsmApi.getOsmApi().getCurrentChangeset() != null); 
    53     } 
    5475 
    55     static class StopChangesetActionTask extends PleaseWaitRunnable { 
     76    private class DownloadOpenChangesetsTask extends PleaseWaitRunnable { 
     77 
    5678        private boolean cancelled; 
     79        private OsmServerChangesetReader reader; 
     80        private List<Changeset> changesets; 
    5781        private Exception lastException; 
     82        private UserInfo userInfo; 
    5883 
    59         public StopChangesetActionTask() { 
    60             super(tr("Closing changeset"), false /* don't ignore exceptions */); 
     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 */)); 
    6191        } 
     92 
    6293        @Override 
    6394        protected void cancel() { 
    6495            this.cancelled = true; 
    65             OsmApi.getOsmApi().cancel(); 
    66  
     96            reader.cancel(); 
    6797        } 
    6898 
    6999        @Override 
    70100        protected void finish() { 
    71             if (cancelled) 
    72                 return; 
    73             if (lastException != null) { 
    74                 ExceptionDialogUtil.explainException(lastException); 
    75             } 
     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)); 
    76123        } 
    77124 
     
    79126        protected void realRun() throws SAXException, IOException, OsmTransferException { 
    80127            try { 
    81                 OsmApi.getOsmApi().stopChangeset(ChangesetProcessingType.USE_EXISTING_AND_CLOSE, getProgressMonitor().createSubTaskMonitor(1, false)); 
     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                ); 
    82137            } catch(Exception e) { 
    83138                if (cancelled) 
     
    86141            } 
    87142        } 
     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        } 
    88155    } 
    89156} 
Note: See TracChangeset for help on using the changeset viewer.