Changeset 7816 in josm for trunk/src/org


Ignore:
Timestamp:
2014-12-17T01:49:45+01:00 (10 years ago)
Author:
bastiK
Message:

fixed #10860 - set initial viewport correctly when mapview is opened

Location:
trunk/src/org/openstreetmap/josm
Files:
9 edited

Legend:

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

    r7802 r7816  
    6565import org.openstreetmap.josm.data.Bounds;
    6666import org.openstreetmap.josm.data.Preferences;
     67import org.openstreetmap.josm.data.ProjectionBounds;
    6768import org.openstreetmap.josm.data.UndoRedoHandler;
    6869import org.openstreetmap.josm.data.ViewportData;
     
    7273import org.openstreetmap.josm.data.osm.OsmPrimitive;
    7374import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy;
     75import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    7476import org.openstreetmap.josm.data.projection.Projection;
    7577import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
     
    692694
    693695    /**
    694      * Add a new layer to the map. If no map exists, create one.
    695      */
    696     public final synchronized void addLayer(final Layer layer) {
     696     * Add a new layer to the map.
     697     *
     698     * If no map exists, create one.
     699     *
     700     * @param layer the layer
     701     *
     702     * @see #addLayer(org.openstreetmap.josm.gui.layer.Layer, org.openstreetmap.josm.data.ProjectionBounds)
     703     * @see #addLayer(org.openstreetmap.josm.gui.layer.Layer, org.openstreetmap.josm.data.ViewportData)
     704     */
     705    public final void addLayer(final Layer layer) {
     706        BoundingXYVisitor v = new BoundingXYVisitor();
     707        layer.visitBoundingBox(v);
     708        addLayer(layer, v.getBounds());
     709    }
     710
     711    /**
     712     * Add a new layer to the map.
     713     *
     714     * If no map exists, create one.
     715     *
     716     * @param layer the layer
     717     * @param bounds the bounds of the layer (target zoom area)
     718     */
     719    public final synchronized void addLayer(final Layer layer, ProjectionBounds bounds) {
     720        addLayer(layer, new ViewportData(bounds));
     721    }
     722
     723    /**
     724     * Add a new layer to the map.
     725     *
     726     * If no map exists, create one.
     727     *
     728     * @param layer the layer
     729     * @param viewport the viewport to zoom to
     730     */
     731    public final synchronized void addLayer(final Layer layer, ViewportData viewport) {
    697732        boolean noMap = map == null;
    698733        if (noMap) {
    699             createMapFrame(layer, null);
     734            createMapFrame(layer, viewport);
    700735        }
    701736        layer.hookUpMapView();
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java

    r7749 r7816  
    1515import org.openstreetmap.josm.data.Bounds;
    1616import org.openstreetmap.josm.data.DataSource;
     17import org.openstreetmap.josm.data.ProjectionBounds;
    1718import org.openstreetmap.josm.data.coor.LatLon;
    1819import org.openstreetmap.josm.data.osm.DataSet;
     
    250251        }
    251252
    252         protected void computeBboxAndCenterScale(Bounds bounds) {
     253        protected ProjectionBounds computeBbox(Bounds bounds) {
    253254            BoundingXYVisitor v = new BoundingXYVisitor();
    254255            if (bounds != null) {
     
    257258                v.computeBoundingBox(dataSet.getNodes());
    258259            }
     260            return v.getBounds();
     261        }
     262
     263        protected void computeBboxAndCenterScale(Bounds bounds) {
     264            ProjectionBounds pb = computeBbox(bounds);
     265            BoundingXYVisitor v = new BoundingXYVisitor();
     266            v.visit(pb);
    259267            Main.map.mapView.recalculateCenterScale(v);
    260268        }
     
    267275                //
    268276                final OsmDataLayer layer = createNewLayer(newLayerName);
    269                 final boolean isDisplayingMapView = Main.isDisplayingMapView();
    270 
    271                 Main.main.addLayer(layer);
    272 
    273                 // If the mapView is not there yet, we cannot calculate the bounds (see constructor of MapView).
    274                 // Otherwise jump to the current download.
    275                 if (isDisplayingMapView) {
    276                     computeBboxAndCenterScale(bounds);
    277                 }
     277                Main.main.addLayer(layer, computeBbox(bounds));
    278278                return layer;
    279279            }
  • trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java

    r6830 r7816  
    8484    }
    8585
     86    public boolean hasExtend() {
     87        return minEast != maxEast || minNorth != maxNorth;
     88    }
    8689}
  • trunk/src/org/openstreetmap/josm/data/ViewportData.java

    r6992 r7816  
    55
    66/**
    7  * Simple data class that keeps map center and scale in one object.
     7 * Data class to keep viewport information.
     8 *
     9 * This can be either a combination of map center and map scale or
     10 * a rectangle in east-north coordinate space.
     11 *
     12 * Either of those will be null, so the consumer of the ViewportData
     13 * object has to check, which one is set.
     14 *
    815 * @since 5670 (creation)
    9  * @since 6992 (extraction in this package) 
     16 * @since 6992 (extraction in this package)
    1017 */
    1118public class ViewportData {
    12     private EastNorth center;
    13     private Double scale;
     19    private final EastNorth center;
     20    private final Double scale;
     21
     22    private final ProjectionBounds bounds;
    1423
    1524    /**
     
    2130        this.center = center;
    2231        this.scale = scale;
     32        this.bounds = null;
     33    }
     34
     35    public ViewportData(ProjectionBounds bounds) {
     36        this.center = null;
     37        this.scale = null;
     38        this.bounds = bounds;
    2339    }
    2440
     
    3854        return scale;
    3955    }
     56
     57    /**
     58     * Return the bounds in east-north coordinate space.
     59     * @return the bounds
     60     */
     61    public ProjectionBounds getBounds() {
     62        return bounds;
     63    }
    4064}
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r7714 r7816  
    2626import org.openstreetmap.josm.data.Data;
    2727import org.openstreetmap.josm.data.DataSource;
     28import org.openstreetmap.josm.data.ProjectionBounds;
    2829import org.openstreetmap.josm.data.SelectionChangedListener;
    2930import org.openstreetmap.josm.data.coor.EastNorth;
     
    3940import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
    4041import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
     42import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    4143import org.openstreetmap.josm.data.projection.Projection;
    4244import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
     
    13481350        invalidateEastNorthCache();
    13491351    }
     1352
     1353    public ProjectionBounds getDataSourceBoundingBox() {
     1354        BoundingXYVisitor bbox = new BoundingXYVisitor();
     1355        for (DataSource source : dataSources) {
     1356            bbox.visit(source.bounds);
     1357        }
     1358        if (bbox.hasExtend()) {
     1359            return bbox.getBounds();
     1360        }
     1361        return null;
     1362    }
     1363
    13501364}
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java

    r7509 r7816  
    8585    }
    8686
    87     public boolean hasExtend()
    88     {
    89         return bounds != null && !bounds.getMin().equals(bounds.getMax());
     87    public boolean hasExtend() {
     88        return bounds != null && bounds.hasExtend();
    9089    }
    9190
  • trunk/src/org/openstreetmap/josm/gui/MapView.java

    r7575 r7816  
    3737
    3838import org.openstreetmap.josm.Main;
    39 import org.openstreetmap.josm.actions.AutoScaleAction;
    4039import org.openstreetmap.josm.actions.mapmode.MapMode;
    4140import org.openstreetmap.josm.data.Bounds;
    4241import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
    4342import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
    44 import org.openstreetmap.josm.data.DataSource;
    4543import org.openstreetmap.josm.data.SelectionChangedListener;
    4644import org.openstreetmap.josm.data.ViewportData;
     
    233231     */
    234232    public MapView(final JPanel contentPane, final ViewportData viewportData) {
     233        initialViewport = viewportData;
    235234        Main.pref.addPreferenceChangeListener(this);
    236235        final boolean unregisterTab = Shortcut.findShortcut(KeyEvent.VK_TAB, 0)!=null;
     
    250249
    251250                mapMover = new MapMover(MapView.this, contentPane);
    252                 if (viewportData != null) {
    253                     zoomTo(viewportData.getCenter(), viewportData.getScale());
    254                 } else {
    255                     OsmDataLayer layer = getEditLayer();
    256                     if (layer != null) {
    257                         if (!zoomToDataSetBoundingBox(layer.data)) {
    258                             // no bounding box defined
    259                             AutoScaleAction.autoScale("data");
    260                         }
    261                     } else {
    262                         AutoScaleAction.autoScale("layer");
    263                     }
    264                 }
    265251            }
    266252        });
     
    542528     */
    543529    @Override public void paint(Graphics g) {
     530        if (initialViewport != null) {
     531            if (initialViewport.getBounds() != null) {
     532                BoundingXYVisitor box = new BoundingXYVisitor();
     533                box.visit(initialViewport.getBounds());
     534                recalculateCenterScale(box);
     535            } else {
     536                zoomTo(initialViewport.getCenter(), initialViewport.getScale(), true);
     537            }
     538            initialViewport = null;
     539        }
    544540        if (BugReportExceptionHandler.exceptionHandlingInProgress())
    545541            return;
     
    868864    }
    869865
    870     /**
    871      * Tries to zoom to the download boundingbox[es] of the current edit layer
    872      * (aka {@link OsmDataLayer}). If the edit layer has multiple download bounding
    873      * boxes it zooms to a large virtual bounding box containing all smaller ones.
    874      *
    875      * @return <code>true</code> if a zoom operation has been performed
    876      */
    877     public boolean zoomToDataSetBoundingBox(DataSet ds) {
    878         // In case we already have an existing data layer ...
    879         OsmDataLayer layer= getEditLayer();
    880         if (layer == null)
    881             return false;
    882         Collection<DataSource> dataSources = ds.dataSources;
    883         // ... with bounding box[es] of data loaded from OSM or a file...
    884         BoundingXYVisitor bbox = new BoundingXYVisitor();
    885         for (DataSource source : dataSources) {
    886             bbox.visit(source.bounds);
    887         }
    888         if (bbox.hasExtend()) {
    889             // ... we zoom to it's bounding box
    890             recalculateCenterScale(bbox);
    891             return true;
    892         }
    893         return false;
    894     }
    895 
    896866    public boolean addTemporaryLayer(MapViewPaintable mvp) {
    897867        if (temporaryLayers.contains(mvp)) return false;
  • trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java

    r7448 r7816  
    3232import org.openstreetmap.josm.data.ProjectionBounds;
    3333import org.openstreetmap.josm.data.SystemOfMeasurement;
     34import org.openstreetmap.josm.data.ViewportData;
    3435import org.openstreetmap.josm.data.coor.CachedLatLon;
    3536import org.openstreetmap.josm.data.coor.EastNorth;
     
    182183    private Polygon paintPoly = null;
    183184
     185    protected ViewportData initialViewport;
     186
    184187    /**
    185188     * Constructs a new {@code NavigatableComponent}.
     
    406409
    407410    /**
    408      * Zoom to the given coordinate.
     411     * Zoom to the given coordinate and scale.
     412     *
    409413     * @param newCenter The center x-value (easting) to zoom to.
    410414     * @param newScale The scale to use.
    411415     */
    412416    public void zoomTo(EastNorth newCenter, double newScale) {
     417        zoomTo(newCenter, newScale, false);
     418    }
     419
     420    /**
     421     * Zoom to the given coordinate and scale.
     422     *
     423     * @param newCenter The center x-value (easting) to zoom to.
     424     * @param newScale The scale to use.
     425     * @param initial true if this call initializes the viewport.
     426     */
     427    public void zoomTo(EastNorth newCenter, double newScale, boolean initial) {
    413428        Bounds b = getProjection().getWorldBoundsLatLon();
    414429        LatLon cl = Projections.inverseProject(newCenter);
     
    446461
    447462        if (!newCenter.equals(center) || (scale != newScale)) {
    448             pushZoomUndo(center, scale);
    449             zoomNoUndoTo(newCenter, newScale);
     463            if (!initial) {
     464                pushZoomUndo(center, scale);
     465            }
     466            zoomNoUndoTo(newCenter, newScale, initial);
    450467        }
    451468    }
     
    453470    /**
    454471     * Zoom to the given coordinate without adding to the zoom undo buffer.
     472     *
    455473     * @param newCenter The center x-value (easting) to zoom to.
    456474     * @param newScale The scale to use.
    457      */
    458     private void zoomNoUndoTo(EastNorth newCenter, double newScale) {
     475     * @param initial true if this call initializes the viewport.
     476     */
     477    private void zoomNoUndoTo(EastNorth newCenter, double newScale, boolean intial) {
    459478        if (!newCenter.equals(center)) {
    460479            EastNorth oldCenter = center;
    461480            center = newCenter;
    462             firePropertyChange(PROPNAME_CENTER, oldCenter, newCenter);
     481            if (!intial) {
     482                firePropertyChange(PROPNAME_CENTER, oldCenter, newCenter);
     483            }
    463484        }
    464485        if (scale != newScale) {
    465486            double oldScale = scale;
    466487            scale = newScale;
    467             firePropertyChange(PROPNAME_SCALE, oldScale, newScale);
    468         }
    469 
    470         repaint();
    471         fireZoomChanged();
     488            if (!intial) {
     489                firePropertyChange(PROPNAME_SCALE, oldScale, newScale);
     490            }
     491        }
     492
     493        if (!intial) {
     494            repaint();
     495            fireZoomChanged();
     496        }
    472497    }
    473498
     
    595620            ZoomData zoom = zoomUndoBuffer.pop();
    596621            zoomRedoBuffer.push(new ZoomData(center, scale));
    597             zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale());
     622            zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
    598623        }
    599624    }
     
    603628            ZoomData zoom = zoomRedoBuffer.pop();
    604629            zoomUndoBuffer.push(new ZoomData(center, scale));
    605             zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale());
     630            zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
    606631        }
    607632    }
  • trunk/src/org/openstreetmap/josm/io/OsmImporter.java

    r7392 r7816  
    1414import org.openstreetmap.josm.actions.ExtensionFileFilter;
    1515import org.openstreetmap.josm.data.osm.DataSet;
     16import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    1617import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    1718import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
     
    3233    public static class OsmImporterData {
    3334
    34         private OsmDataLayer layer;
    35         private Runnable postLayerTask;
     35        private final OsmDataLayer layer;
     36        private final Runnable postLayerTask;
    3637
    3738        public OsmImporterData(OsmDataLayer layer, Runnable postLayerTask) {
     
    102103            @Override
    103104            public void run() {
    104                 Main.main.addLayer(data.layer);
    105                 data.postLayerTask.run();
    106                 data.layer.onPostLoadFromFile();
     105                OsmDataLayer layer = data.getLayer();
     106                BoundingXYVisitor v = new BoundingXYVisitor();
     107                v.visit(layer.data.getDataSourceBoundingBox());
     108                if (!v.hasExtend()) {
     109                    v.computeBoundingBox(layer.data.getNodes());
     110                }
     111                Main.main.addLayer(layer, v.getBounds());
     112                data.getPostLayerTask().run();
     113                data.getLayer().onPostLoadFromFile();
    107114            }
    108115        });
Note: See TracChangeset for help on using the changeset viewer.