Ignore:
Timestamp:
2009-10-25T23:09:53+01:00 (15 years ago)
Author:
Gubaer
Message:

Added canceling of DownloadOsmTaskLists
Removed error remembering in the progress dialog

File:
1 edited

Legend:

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

    r2273 r2322  
    55
    66import java.awt.EventQueue;
     7import java.awt.event.ActionEvent;
     8import java.awt.event.ActionListener;
    79import java.awt.geom.Area;
    810import java.awt.geom.Rectangle2D;
     
    1012import java.util.Collection;
    1113import java.util.HashSet;
     14import java.util.LinkedHashSet;
    1215import java.util.LinkedList;
    1316import java.util.List;
    1417import java.util.Set;
     18import java.util.concurrent.Future;
    1519
    1620import javax.swing.JOptionPane;
     
    2024import org.openstreetmap.josm.data.osm.DataSet;
    2125import org.openstreetmap.josm.data.osm.OsmPrimitive;
    22 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
    2326import org.openstreetmap.josm.gui.layer.Layer;
    2427import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    2528import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     29import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener;
     30import org.openstreetmap.josm.tools.ExceptionUtil;
    2631
    2732/**
     
    3439public class DownloadOsmTaskList implements Runnable {
    3540    private List<DownloadTask> osmTasks = new LinkedList<DownloadTask>();
     41    private List<Future<?>> osmTaskFutures = new LinkedList<Future<?>>();
    3642    private ProgressMonitor progressMonitor;
    3743
     
    4147     * @param The List of Rectangle2D to download
    4248     */
    43     public void download(boolean newLayer, List<Rectangle2D> rects, ProgressMonitor progressMonitor) {
     49    public Future<?> download(boolean newLayer, List<Rectangle2D> rects, ProgressMonitor progressMonitor) {
    4450        this.progressMonitor = progressMonitor;
    4551        if(newLayer) {
     
    5056
    5157        progressMonitor.beginTask(null, rects.size());
    52         try {
    53             int i = 0;
    54             for(Rectangle2D td : rects) {
    55                 i++;
    56                 DownloadTask dt = new DownloadOsmTask();
    57                 ProgressMonitor childProgress = progressMonitor.createSubTaskMonitor(1, false);
    58                 childProgress.setSilent(true);
    59                 childProgress.setCustomText(tr("Download {0} of {1} ({2} left)", i, rects.size(), rects.size()-i));
    60                 dt.download(null, td.getMinY(), td.getMinX(), td.getMaxY(), td.getMaxX(), childProgress);
    61                 osmTasks.add(dt);
    62             }
    63         } finally {
    64             // If we try to get the error message now the download task will never have been started
    65             // and we'd be stuck in a classical dead lock. Instead attach this to the worker and once
    66             // run() gets called all downloadTasks have finished and we can grab the error messages.
    67             Main.worker.execute(this);
    68         }
     58        int i = 0;
     59        for(Rectangle2D td : rects) {
     60            i++;
     61            DownloadTask dt = new DownloadOsmTask();
     62            ProgressMonitor childProgress = progressMonitor.createSubTaskMonitor(1, false);
     63            childProgress.setSilent(true);
     64            childProgress.setCustomText(tr("Download {0} of {1} ({2} left)", i, rects.size(), rects.size()-i));
     65            Future<?> future = dt.download(null, td.getMinY(), td.getMinX(), td.getMaxY(), td.getMaxX(), childProgress);
     66            osmTaskFutures.add(future);
     67            osmTasks.add(dt);
     68        }
     69        progressMonitor.addCancelListener(
     70                new CancelListener() {
     71                    public void operationCanceled() {
     72                        for (DownloadTask dt: osmTasks) {
     73                            dt.cancel();
     74                        }
     75                    }
     76                }
     77        );
     78        return Main.worker.submit(this);
    6979    }
    7080
     
    93103    public void run() {
    94104        progressMonitor.finishTask();
    95         String errors = "";
    96 
    97         LinkedList<Integer> shown = new LinkedList<Integer>();
     105
     106        // wait for all tasks to finish
     107        //
     108        for (Future<?> future: osmTaskFutures) {
     109            try {
     110                future.get();
     111            } catch(Exception e) {
     112                e.printStackTrace();
     113                return;
     114            }
     115        }
     116        LinkedHashSet<Object> errors = new LinkedHashSet<Object>();
    98117        for(DownloadTask dt : osmTasks) {
    99             String err = dt.getErrorMessage();
    100             // avoid display of identical messages
    101             if (err.equals("") || shown.contains(err.hashCode())) {
    102                 continue;
    103             }
    104             shown.add(err.hashCode());
    105             errors += "<br>* " + err;
    106         }
    107 
    108         if(! errors.equals("")) {
     118            errors.addAll(dt.getErrorObjects());
     119        }
     120        if (!errors.isEmpty()) {
     121            StringBuffer sb = new StringBuffer();
     122            for (Object error:errors) {
     123                if (error instanceof String) {
     124                    sb.append("<li>").append(error).append("</li>").append("<br>");
     125                } else if (error instanceof Exception) {
     126                    sb.append("<li>").append(ExceptionUtil.explainException((Exception)error)).append("</li>").append("<br>");
     127                }
     128            }
     129            sb.insert(0, "<ul>");
     130            sb.append("</ul>");
     131
    109132            JOptionPane.showMessageDialog(
    110133                    Main.parent,
    111                     "<html>"+tr("The following errors occurred during mass download:{0}", errors)
     134                    "<html>"+tr("The following errors occurred during mass download: {0}", sb.toString())
    112135                    +"</html>",
    113136                    tr("Errors during Download"),
Note: See TracChangeset for help on using the changeset viewer.