Ignore:
Timestamp:
2009-09-13T19:30:36+02:00 (17 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)

Location:
trunk/src/org/openstreetmap/josm/actions
Files:
1 edited
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}
  • trunk/src/org/openstreetmap/josm/actions/UploadAction.java

    r2096 r2115  
    2828import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    2929import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    30 import org.openstreetmap.josm.io.ChangesetProcessingType;
    3130import org.openstreetmap.josm.io.OsmApi;
    3231import org.openstreetmap.josm.io.OsmApiException;
    … …  
    176175                        Main.map.mapView.getEditLayer(),
    177176                        apiData.getPrimitives(),
    178                         UploadConfirmationHook.getUploadDialog().getChangeset(),
    179                         UploadConfirmationHook.getUploadDialog().getChangesetProcessingType()
     177                        UploadDialog.getUploadDialog().getChangeset(),
     178                        UploadDialog.getUploadDialog().isDoCloseAfterUpload()
    180179                )
    181180        );
    … …  
    244243        );
    245244        switch(ret) {
    246         case JOptionPane.CLOSED_OPTION: return;
    247         case JOptionPane.CANCEL_OPTION: return;
    248         case 0: synchronizePrimitive(primitiveType, id); break;
    249         case 1: synchronizeDataSet(); break;
    250         default:
    251             // should not happen
    252             throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     245            case JOptionPane.CLOSED_OPTION: return;
     246            case JOptionPane.CANCEL_OPTION: return;
     247            case 0: synchronizePrimitive(primitiveType, id); break;
     248            case 1: synchronizeDataSet(); break;
     249            default:
     250                // should not happen
     251                throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    253252        }
    254253    }
    … …  
    284283        );
    285284        switch(ret) {
    286         case JOptionPane.CLOSED_OPTION: return;
    287         case 1: return;
    288         case 0: synchronizeDataSet(); break;
    289         default:
    290             // should not happen
    291             throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     285            case JOptionPane.CLOSED_OPTION: return;
     286            case 1: return;
     287            case 0: synchronizeDataSet(); break;
     288            default:
     289                // should not happen
     290                throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    292291        }
    293292    }
    … …  
    457456
    458457    static public class UploadConfirmationHook implements UploadHook {
    459         static private UploadDialog uploadDialog;
    460 
    461         static public UploadDialog getUploadDialog() {
    462             if (uploadDialog == null) {
    463                 uploadDialog = new UploadDialog();
    464             }
    465             return uploadDialog;
    466         }
    467458
    468459        public boolean checkUpload(APIDataSet apiData) {
    469             final UploadDialog dialog = getUploadDialog();
     460            final UploadDialog dialog = UploadDialog.getUploadDialog();
    470461            dialog.setUploadedPrimitives(apiData.getPrimitivesToAdd(),apiData.getPrimitivesToUpdate(), apiData.getPrimitivesToDelete());
    471462            dialog.setVisible(true);
    … …  
    477468    }
    478469
    479     public UploadDiffTask createUploadTask(OsmDataLayer layer, Collection<OsmPrimitive> toUpload, Changeset changeset, ChangesetProcessingType changesetProcessingType) {
    480         return new UploadDiffTask(layer, toUpload, changeset, changesetProcessingType);
    481     }
    482 
     470    public UploadDiffTask createUploadTask(OsmDataLayer layer, Collection<OsmPrimitive> toUpload, Changeset changeset, boolean closeChangesetAfterUpload) {
     471        return new UploadDiffTask(layer, toUpload, changeset, closeChangesetAfterUpload);
     472    }
     473
     474    /**
     475     * The task for uploading a collection of primitives
     476     *
     477     */
    483478    public class UploadDiffTask extends  PleaseWaitRunnable {
    484479        private boolean uploadCancelled = false;
    … …  
    488483        private OsmDataLayer layer;
    489484        private Changeset changeset;
    490         private ChangesetProcessingType changesetProcessingType;
    491 
    492         private UploadDiffTask(OsmDataLayer layer, Collection <OsmPrimitive> toUpload, Changeset changeset, ChangesetProcessingType changesetProcessingType) {
     485        private boolean closeChangesetAfterUpload;
     486
     487        /**
     488         *
     489         * @param layer  the OSM data layer for which data is uploaded
     490         * @param toUpload the collection of primitives to upload
     491         * @param changeset the changeset to use for uploading
     492         * @param closeChangesetAfterUpload true, if the changeset is to be closed after uploading
     493         */
     494        private UploadDiffTask(OsmDataLayer layer, Collection <OsmPrimitive> toUpload, Changeset changeset, boolean closeChangesetAfterUpload) {
    493495            super(tr("Uploading data for layer ''{0}''", layer.getName()),false /* don't ignore exceptions */);
    494496            this.toUpload = toUpload;
    495497            this.layer = layer;
    496498            this.changeset = changeset;
    497             this.changesetProcessingType = changesetProcessingType == null ? ChangesetProcessingType.USE_NEW_AND_CLOSE : changesetProcessingType;
     499            this.closeChangesetAfterUpload = closeChangesetAfterUpload;
    498500        }
    499501
    … …  
    502504            try {
    503505                ProgressMonitor monitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
    504                 writer.uploadOsm(layer.data.version, toUpload, changeset,changesetProcessingType, monitor);
     506                writer.uploadOsm(layer.data.version, toUpload, changeset,closeChangesetAfterUpload, monitor);
    505507            } catch (Exception sxe) {
    506508                if (uploadCancelled) {
    … …  
    525527                handleFailedUpload(lastException);
    526528            } else {
     529                // run post upload action on the layer
     530                //
    527531                layer.onPostUploadToServer();
     532                // refresh changeset dialog with the updated changeset
     533                //
     534                UploadDialog.getUploadDialog().setOrUpdateChangeset(changeset);
    528535            }
    529536        }
Note: See TracChangeset for help on using the changeset viewer.