Changeset 11774 in josm for trunk/src/org/openstreetmap/josm


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

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

Location:
trunk/src/org/openstreetmap/josm
Files:
9 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()) {
  • trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java

    r10300 r11774  
    9797
    9898    /**
     99     * Extends bounds to include bounds {@code b}.
     100     * @param b bounds to include
     101     * @since 11774
     102     */
     103    public void extend(ProjectionBounds b) {
     104        if (b.minEast < minEast) {
     105            minEast = b.minEast;
     106        }
     107        if (b.maxEast > maxEast) {
     108            maxEast = b.maxEast;
     109        }
     110        if (b.minNorth < minNorth) {
     111            minNorth = b.minNorth;
     112        }
     113        if (b.maxNorth > maxNorth) {
     114            maxNorth = b.maxNorth;
     115        }
     116    }
     117
     118    /**
    99119     * Returns the center east/north.
    100120     * @return the center east/north
  • trunk/src/org/openstreetmap/josm/gui/MapView.java

    r11765 r11774  
    343343                registeredLayers.put(layer, painter);
    344344
    345                 ProjectionBounds viewProjectionBounds = layer.getViewProjectionBounds();
    346                 if (viewProjectionBounds != null) {
    347                     scheduleZoomTo(new ViewportData(viewProjectionBounds));
     345                if (e.isZoomRequired()) {
     346                    ProjectionBounds viewProjectionBounds = layer.getViewProjectionBounds();
     347                    if (viewProjectionBounds != null) {
     348                        scheduleZoomTo(new ViewportData(viewProjectionBounds));
     349                    }
    348350                }
    349351
  • trunk/src/org/openstreetmap/josm/gui/layer/LayerManager.java

    r11746 r11774  
    7171        }
    7272
     73        /**
     74         * Returns the {@code LayerManager} at the origin of this event.
     75         * @return the {@code LayerManager} at the origin of this event
     76         */
    7377        public LayerManager getSource() {
    7478            return source;
     
    8286    public static class LayerAddEvent extends LayerManagerEvent {
    8387        private final Layer addedLayer;
    84 
    85         LayerAddEvent(LayerManager source, Layer addedLayer) {
     88        private final boolean requiresZoom;
     89
     90        LayerAddEvent(LayerManager source, Layer addedLayer, boolean requiresZoom) {
    8691            super(source);
    8792            this.addedLayer = addedLayer;
     93            this.requiresZoom = requiresZoom;
    8894        }
    8995
     
    94100        public Layer getAddedLayer() {
    95101            return addedLayer;
     102        }
     103
     104        /**
     105         * Determines if an initial zoom is required.
     106         * @return {@code true} if a zoom is required when this layer is added
     107         * @since 11774
     108         */
     109        public final boolean isZoomRequired() {
     110            return requiresZoom;
    96111        }
    97112
     
    182197
    183198    /**
     199     * Add a layer. The layer will be added at a given position and the mapview zoomed at its projection bounds.
     200     * @param layer The layer to add
     201     */
     202    public void addLayer(final Layer layer) {
     203        addLayer(layer, true);
     204    }
     205
     206    /**
    184207     * Add a layer. The layer will be added at a given position.
    185208     * @param layer The layer to add
    186      */
    187     public void addLayer(final Layer layer) {
     209     * @param initialZoom whether if the mapview must be zoomed at layer projection bounds
     210     */
     211    public void addLayer(final Layer layer, final boolean initialZoom) {
    188212        // we force this on to the EDT Thread to make events fire from there.
    189213        // The synchronization lock needs to be held by the EDT.
    190         GuiHelper.runInEDTAndWaitWithException(() -> realAddLayer(layer));
    191     }
    192 
    193     protected synchronized void realAddLayer(Layer layer) {
     214        GuiHelper.runInEDTAndWaitWithException(() -> realAddLayer(layer, initialZoom));
     215    }
     216
     217    protected synchronized void realAddLayer(Layer layer, boolean initialZoom) {
    194218        if (containsLayer(layer)) {
    195219            throw new IllegalArgumentException("Cannot add a layer twice: " + layer);
     
    199223        checkPosition(position);
    200224        insertLayerAt(layer, position);
    201         fireLayerAdded(layer);
     225        fireLayerAdded(layer, initialZoom);
    202226        if (Main.map != null) {
    203227            layer.hookUpMapView(); // needs to be after fireLayerAdded
     
    366390        if (fireAdd) {
    367391            for (Layer l : getLayers()) {
    368                 listener.layerAdded(new LayerAddEvent(this, l));
     392                listener.layerAdded(new LayerAddEvent(this, l, true));
    369393            }
    370394        }
     
    399423    }
    400424
    401     private void fireLayerAdded(Layer layer) {
     425    private void fireLayerAdded(Layer layer, boolean initialZoom) {
    402426        GuiHelper.assertCallFromEdt();
    403         LayerAddEvent e = new LayerAddEvent(this, layer);
     427        LayerAddEvent e = new LayerAddEvent(this, layer, initialZoom);
    404428        for (LayerChangeListener l : layerChangeListeners) {
    405429            try {
  • trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java

    r10999 r11774  
    242242
    243243    @Override
    244     protected synchronized void realAddLayer(Layer layer) {
     244    protected synchronized void realAddLayer(Layer layer, boolean initialZoom) {
    245245        if (getLayers().isEmpty()) {
    246246            LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, true);
     
    249249            }
    250250        }
    251         super.realAddLayer(layer);
     251        super.realAddLayer(layer, initialZoom);
    252252
    253253        // update the active layer automatically.
Note: See TracChangeset for help on using the changeset viewer.