Ignore:
Timestamp:
2009-09-02T21:17:52+02:00 (15 years ago)
Author:
Gubaer
Message:

new: improved dialog for uploading/saving modified layers on exit
new: improved dialog for uploading/saving modified layers if layers are deleted
new: new progress monitor which can delegate rendering to any Swing component
more setters/getters for properties in OSM data classes (fields are @deprecated); started to update references in the code base

File:
1 edited

Legend:

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

    r2005 r2025  
    2626
    2727import org.openstreetmap.josm.Main;
     28import org.openstreetmap.josm.data.APIDataSet;
    2829import org.openstreetmap.josm.data.conflict.ConflictCollection;
    2930import org.openstreetmap.josm.data.osm.DataSet;
     
    3435import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    3536import org.openstreetmap.josm.gui.historycombobox.SuggestingJHistoryComboBox;
     37import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    3638import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    3739import org.openstreetmap.josm.io.OsmApi;
     
    108110    }
    109111
     112    public boolean checkPreUploadConditions(OsmDataLayer layer) {
     113        return checkPreUploadConditions(layer, new APIDataSet(layer.data));
     114    }
     115
     116    public boolean checkPreUploadConditions(OsmDataLayer layer, APIDataSet apiData) {
     117        ConflictCollection conflicts = layer.getConflicts();
     118        if (conflicts !=null && !conflicts.isEmpty()) {
     119            JOptionPane.showMessageDialog(
     120                    Main.parent,
     121                    tr("<html>There are unresolved conflicts in layer ''{0}''.<br>"
     122                            + "You have to resolve them first.<html>", layer.getName()),
     123                            tr("Warning"),
     124                            JOptionPane.WARNING_MESSAGE
     125            );
     126            return false;
     127        }
     128        // Call all upload hooks in sequence. The upload confirmation dialog
     129        // is one of these.
     130        for(UploadHook hook : uploadHooks)
     131            if(!hook.checkUpload(apiData.getPrimitivesToAdd(), apiData.getPrimitivesToUpdate(), apiData.getPrimitivesToDelete()))
     132                return false;
     133
     134        return true;
     135    }
     136
    110137    public void actionPerformed(ActionEvent e) {
    111138        if (!isEnabled())
     
    121148        }
    122149
    123         ConflictCollection conflicts = Main.map.mapView.getEditLayer().getConflicts();
    124         if (conflicts !=null && !conflicts.isEmpty()) {
    125             JOptionPane.showMessageDialog(
    126                     Main.parent,
    127                     tr("There are unresolved conflicts. You have to resolve these first."),
    128                     tr("Warning"),
    129                     JOptionPane.WARNING_MESSAGE
    130             );
    131             Main.map.conflictDialog.showDialog();
    132             return;
    133         }
    134 
    135         final LinkedList<OsmPrimitive> add = new LinkedList<OsmPrimitive>();
    136         final LinkedList<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
    137         final LinkedList<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
    138         for (OsmPrimitive osm : getCurrentDataSet().allPrimitives()) {
    139             if (osm.get("josm/ignore") != null) {
    140                 continue;
    141             }
    142             if (osm.id == 0 && !osm.deleted) {
    143                 add.addLast(osm);
    144             } else if (osm.modified && !osm.deleted) {
    145                 update.addLast(osm);
    146             } else if (osm.deleted && osm.id != 0) {
    147                 delete.addFirst(osm);
    148             }
    149         }
    150 
    151         if (add.isEmpty() && update.isEmpty() && delete.isEmpty()) {
     150        APIDataSet apiData = new APIDataSet(Main.main.getCurrentDataSet());
     151        if (apiData.isEmpty()) {
    152152            JOptionPane.showMessageDialog(
    153153                    Main.parent,
    154154                    tr("No changes to upload."),
    155155                    tr("Warning"),
    156                     JOptionPane.WARNING_MESSAGE
     156                    JOptionPane.INFORMATION_MESSAGE
    157157            );
    158158            return;
    159159        }
    160 
    161         // Call all upload hooks in sequence. The upload confirmation dialog
    162         // is one of these.
    163         for(UploadHook hook : uploadHooks)
    164             if(!hook.checkUpload(add, update, delete))
    165                 return;
    166 
    167         final Collection<OsmPrimitive> all = new LinkedList<OsmPrimitive>();
    168         all.addAll(add);
    169         all.addAll(update);
    170         all.addAll(delete);
    171 
    172         Main.worker.execute(new UploadDiffTask(all));
     160        if (!checkPreUploadConditions(Main.map.mapView.getEditLayer(), apiData))
     161            return;
     162        Main.worker.execute(createUploadTask(Main.map.mapView.getEditLayer(), apiData.getPrimitives()));
    173163    }
    174164
     
    235225        );
    236226        switch(ret) {
    237         case JOptionPane.CLOSED_OPTION: return;
    238         case JOptionPane.CANCEL_OPTION: return;
    239         case 0: synchronizePrimitive(id); break;
    240         case 1: synchronizeDataSet(); break;
    241         default:
    242             // should not happen
    243             throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     227            case JOptionPane.CLOSED_OPTION: return;
     228            case JOptionPane.CANCEL_OPTION: return;
     229            case 0: synchronizePrimitive(id); break;
     230            case 1: synchronizeDataSet(); break;
     231            default:
     232                // should not happen
     233                throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    244234        }
    245235    }
     
    275265        );
    276266        switch(ret) {
    277         case JOptionPane.CLOSED_OPTION: return;
    278         case 1: return;
    279         case 0: synchronizeDataSet(); break;
    280         default:
    281             // should not happen
    282             throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     267            case JOptionPane.CLOSED_OPTION: return;
     268            case 1: return;
     269            case 0: synchronizeDataSet(); break;
     270            default:
     271                // should not happen
     272                throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    283273        }
    284274    }
     
    522512    }
    523513
    524 
    525     class UploadDiffTask extends  PleaseWaitRunnable {
     514    public UploadDiffTask createUploadTask(OsmDataLayer layer, Collection<OsmPrimitive> toUpload) {
     515        return new UploadDiffTask(layer, toUpload);
     516    }
     517
     518    public class UploadDiffTask extends  PleaseWaitRunnable {
    526519        private boolean uploadCancelled = false;
    527520        private Exception lastException = null;
    528521        private Collection <OsmPrimitive> toUpload;
    529522        private OsmServerWriter writer;
    530 
    531         public UploadDiffTask(Collection <OsmPrimitive> toUpload) {
    532             super(tr("Uploading"),false /* don't ignore exceptions */);
     523        private OsmDataLayer layer;
     524
     525        private UploadDiffTask(OsmDataLayer layer, Collection <OsmPrimitive> toUpload) {
     526            super(tr("Uploading data for layer ''{0}''", layer.getName()),false /* don't ignore exceptions */);
    533527            this.toUpload = toUpload;
     528            this.layer = layer;
    534529        }
    535530
     
    537532            writer = new OsmServerWriter();
    538533            try {
    539                 writer.uploadOsm(getCurrentDataSet().version, toUpload, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
     534                ProgressMonitor monitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
     535                writer.uploadOsm(layer.data.version, toUpload, monitor);
    540536            } catch (Exception sxe) {
    541537                if (uploadCancelled) {
     
    554550            // partially uploaded
    555551            //
    556             getEditLayer().cleanupAfterUpload(writer.getProcessedPrimitives());
    557             DataSet.fireSelectionChanged(getEditLayer().data.getSelected());
    558             getEditLayer().fireDataChange();
     552            layer.cleanupAfterUpload(writer.getProcessedPrimitives());
     553            DataSet.fireSelectionChanged(layer.data.getSelected());
     554            layer.fireDataChange();
    559555            if (lastException != null) {
    560556                handleFailedUpload(lastException);
     557            } else {
     558                layer.onPostUploadToServer();
    561559            }
    562560        }
     
    568566            }
    569567        }
     568
     569        public boolean isSuccessful() {
     570            return !isCancelled() && !isFailed();
     571        }
     572
     573        public boolean isCancelled() {
     574            return uploadCancelled;
     575        }
     576
     577        public boolean isFailed() {
     578            return lastException != null;
     579        }
    570580    }
    571581}
Note: See TracChangeset for help on using the changeset viewer.