Ignore:
Timestamp:
2017-03-25T17:33:06+01:00 (7 years ago)
Author:
Don-vip
Message:

fix #13922 - zoom only once when downloading several data types

File:
1 edited

Legend:

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

    r11658 r11774  
    77import java.awt.event.ActionEvent;
    88import java.awt.event.KeyEvent;
     9import java.util.ArrayList;
     10import java.util.List;
     11import java.util.concurrent.ExecutionException;
    912import java.util.concurrent.Future;
    1013
    1114import org.openstreetmap.josm.Main;
     15import org.openstreetmap.josm.actions.downloadtasks.AbstractDownloadTask;
    1216import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
    1317import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
     
    1519import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
    1620import org.openstreetmap.josm.data.Bounds;
     21import org.openstreetmap.josm.data.ProjectionBounds;
     22import org.openstreetmap.josm.data.ViewportData;
    1723import org.openstreetmap.josm.gui.download.DownloadDialog;
     24import org.openstreetmap.josm.gui.util.GuiHelper;
     25import org.openstreetmap.josm.tools.Pair;
    1826import org.openstreetmap.josm.tools.Shortcut;
    1927
     
    4553        if (!dialog.isCanceled()) {
    4654            dialog.rememberSettings();
    47             Bounds area = dialog.getSelectedDownloadArea();
     55            final Bounds area = dialog.getSelectedDownloadArea();
     56            final boolean zoom = dialog.isZoomToDownloadedDataRequired();
     57            final List<Pair<AbstractDownloadTask<?>, Future<?>>> tasks = new ArrayList<>();
    4858            if (dialog.isDownloadOsmData()) {
    4959                DownloadOsmTask task = new DownloadOsmTask();
    50                 task.setZoomAfterDownload(dialog.isZoomToDownloadedDataRequired());
     60                task.setZoomAfterDownload(zoom && !dialog.isDownloadGpxData() && !dialog.isDownloadNotes());
    5161                Future<?> future = task.download(dialog.isNewLayerRequired(), area, null);
    5262                Main.worker.submit(new PostDownloadHandler(task, future));
     63                if (zoom) {
     64                    tasks.add(new Pair<>(task, future));
     65                }
    5366            }
    5467            if (dialog.isDownloadGpxData()) {
    5568                DownloadGpsTask task = new DownloadGpsTask();
    56                 task.setZoomAfterDownload(dialog.isZoomToDownloadedDataRequired());
     69                task.setZoomAfterDownload(zoom && !dialog.isDownloadOsmData() && !dialog.isDownloadNotes());
    5770                Future<?> future = task.download(dialog.isNewLayerRequired(), area, null);
    5871                Main.worker.submit(new PostDownloadHandler(task, future));
     72                if (zoom) {
     73                    tasks.add(new Pair<>(task, future));
     74                }
    5975            }
    6076            if (dialog.isDownloadNotes()) {
    6177                DownloadNotesTask task = new DownloadNotesTask();
    62                 task.setZoomAfterDownload(dialog.isZoomToDownloadedDataRequired());
     78                task.setZoomAfterDownload(zoom && !dialog.isDownloadOsmData() && !dialog.isDownloadGpxData());
    6379                Future<?> future = task.download(false, area, null);
    6480                Main.worker.submit(new PostDownloadHandler(task, future));
     81                if (zoom) {
     82                    tasks.add(new Pair<>(task, future));
     83                }
     84            }
     85            if (zoom && tasks.size() > 1) {
     86                Main.worker.submit(() -> {
     87                    ProjectionBounds bounds = null;
     88                    // Wait for completion of download jobs
     89                    for (Pair<AbstractDownloadTask<?>, Future<?>> p : tasks) {
     90                        try {
     91                            p.b.get();
     92                            ProjectionBounds b = p.a.getDownloadProjectionBounds();
     93                            if (bounds == null) {
     94                                bounds = b;
     95                            } else if (b != null) {
     96                                bounds.extend(b);
     97                            }
     98                        } catch (InterruptedException | ExecutionException ex) {
     99                            Main.warn(ex);
     100                        }
     101                    }
     102                    // Zoom to the larger download bounds
     103                    if (Main.map != null && bounds != null) {
     104                        final ProjectionBounds pb = bounds;
     105                        GuiHelper.runInEDTAndWait(() -> Main.map.mapView.zoomTo(new ViewportData(pb)));
     106                    }
     107                });
    65108            }
    66109        }
Note: See TracChangeset for help on using the changeset viewer.