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

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

Location:
trunk/src/org/openstreetmap/josm/actions
Files:
5 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        }
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/AbstractDownloadTask.java

    r11658 r11774  
    55import java.util.List;
    66
     7import org.openstreetmap.josm.data.ProjectionBounds;
    78import org.openstreetmap.josm.io.XmlWriter;
    89
     
    170171        return new String[]{};
    171172    }
     173
     174    /**
     175     * Returns the projection bounds of downloaded data.
     176     * @return the projection bounds of downloaded data or {@code null}
     177     * @since 11774
     178     */
     179    public ProjectionBounds getDownloadProjectionBounds() {
     180        return null;
     181    }
    172182}
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java

    r11658 r11774  
    1515import org.openstreetmap.josm.data.Bounds;
    1616import org.openstreetmap.josm.data.Bounds.ParseMethod;
     17import org.openstreetmap.josm.data.ProjectionBounds;
    1718import org.openstreetmap.josm.data.ViewportData;
    1819import org.openstreetmap.josm.data.gpx.GpxData;
     
    3940
    4041    private DownloadTask downloadTask;
     42    private GpxLayer gpxLayer;
    4143
    4244    private static final String PATTERN_TRACE_ID = "https?://.*(osm|openstreetmap).org/trace/\\p{Digit}+/data";
     
    114116    }
    115117
     118    @Override
     119    public ProjectionBounds getDownloadProjectionBounds() {
     120        return gpxLayer != null ? gpxLayer.getViewProjectionBounds() : null;
     121    }
     122
    116123    class DownloadTask extends PleaseWaitRunnable {
    117124        private final OsmServerReader reader;
     
    130137                if (isCanceled())
    131138                    return;
    132                 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
    133                 rawData = reader.parseRawGps(subMonitor);
     139                rawData = reader.parseRawGps(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
    134140            } catch (OsmTransferException e) {
    135141                if (isCanceled())
     
    149155                    tr("Markers from {0}", name));
    150156
    151             GpxLayer gpxLayer = addOrMergeLayer(layers.getGpxLayer(), findGpxMergeLayer());
     157            gpxLayer = addOrMergeLayer(layers.getGpxLayer(), findGpxMergeLayer());
    152158            addOrMergeLayer(layers.getMarkerLayer(), findMarkerMergeLayer(gpxLayer));
    153159
     
    158164            if (layer == null) return null;
    159165            if (newLayer || mergeLayer == null) {
    160                 Main.getLayerManager().addLayer(layer);
     166                Main.getLayerManager().addLayer(layer, zoomAfterDownload);
    161167                return layer;
    162168            } else {
    163169                mergeLayer.mergeFrom(layer);
    164170                mergeLayer.invalidate();
    165                 if (Main.map != null && zoomAfterDownload) {
     171                if (Main.map != null && zoomAfterDownload && layer instanceof GpxLayer) {
    166172                    Main.map.mapView.scheduleZoomTo(new ViewportData(layer.getViewProjectionBounds()));
    167173                }
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java

    r11658 r11774  
    1414import org.openstreetmap.josm.Main;
    1515import org.openstreetmap.josm.data.Bounds;
     16import org.openstreetmap.josm.data.ProjectionBounds;
    1617import org.openstreetmap.josm.data.ViewportData;
    1718import org.openstreetmap.josm.data.notes.Note;
     
    4041
    4142    private DownloadTask downloadTask;
     43    private NoteLayer noteLayer;
    4244
    4345    /**
     
    9698    }
    9799
     100    @Override
     101    public ProjectionBounds getDownloadProjectionBounds() {
     102        return noteLayer != null ? noteLayer.getViewProjectionBounds() : null;
     103    }
     104
    98105    abstract class DownloadTask extends PleaseWaitRunnable {
    99106        protected OsmServerReader reader;
     
    117124            List<NoteLayer> noteLayers = Main.getLayerManager().getLayersOfType(NoteLayer.class);
    118125            if (!noteLayers.isEmpty()) {
    119                 noteLayers.get(0).getNoteData().addNotes(notesData);
     126                noteLayer = noteLayers.get(0);
     127                noteLayer.getNoteData().addNotes(notesData);
    120128                if (Main.map != null && zoomAfterDownload) {
    121                     Main.map.mapView.scheduleZoomTo(new ViewportData(noteLayers.get(0).getViewProjectionBounds()));
     129                    Main.map.mapView.scheduleZoomTo(new ViewportData(noteLayer.getViewProjectionBounds()));
    122130                }
    123131            } else {
    124                 Main.getLayerManager().addLayer(new NoteLayer(notesData, tr("Notes")));
     132                Main.getLayerManager().addLayer(new NoteLayer(notesData, tr("Notes")), zoomAfterDownload);
    125133            }
    126134        }
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java

    r11735 r11774  
    1919import org.openstreetmap.josm.data.DataSource;
    2020import org.openstreetmap.josm.data.ProjectionBounds;
     21import org.openstreetmap.josm.data.ViewportData;
    2122import org.openstreetmap.josm.data.coor.LatLon;
    2223import org.openstreetmap.josm.data.osm.DataSet;
     
    175176    }
    176177
     178    @Override
     179    public ProjectionBounds getDownloadProjectionBounds() {
     180        return downloadTask != null ? downloadTask.computeBbox(currentBounds) : null;
     181    }
     182
    177183    /**
    178184     * Superclass of internal download task.
     
    253259        }
    254260
    255         protected void computeBboxAndCenterScale(Bounds bounds) {
    256             ProjectionBounds pb = computeBbox(bounds);
    257             BoundingXYVisitor v = new BoundingXYVisitor();
    258             v.visit(pb);
    259             Main.map.mapView.zoomTo(v);
    260         }
    261 
    262261        protected OsmDataLayer addNewLayerIfRequired(String newLayerName) {
    263262            int numDataLayers = getNumDataLayers();
     
    268267                final OsmDataLayer layer = createNewLayer(newLayerName);
    269268                if (Main.main != null)
    270                     Main.getLayerManager().addLayer(layer);
     269                    Main.getLayerManager().addLayer(layer, zoomAfterDownload);
    271270                return layer;
    272271            }
     
    280279                Collection<OsmPrimitive> primitivesToUpdate = searchPrimitivesToUpdate(bounds, layer.data);
    281280                layer.mergeFrom(dataSet);
    282                 if (zoomAfterDownload) {
    283                     computeBboxAndCenterScale(bounds);
     281                if (Main.map != null && zoomAfterDownload) {
     282                    Main.map.mapView.zoomTo(new ViewportData(computeBbox(bounds)));
    284283                }
    285284                if (!primitivesToUpdate.isEmpty()) {
Note: See TracChangeset for help on using the changeset viewer.