// License: GPL. See LICENSE file for details.
package org.openstreetmap.josm.gui;
import java.util.concurrent.CopyOnWriteArrayList;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.beboj.CanvasView;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.ProjectionBounds;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.projection.Projection;
/**
* GWT
*
* This class is not in the JOSM code base.
*/
/**
* Abstract base class for different type of NavigationSupport.
*/
public abstract class AbstractNavigationSupport implements NavigationSupport {
/**
* Center n/e coordinate of the desired screen center.
*/
protected EastNorth center = calculateDefaultCenter();
protected CanvasView view;
public AbstractNavigationSupport(CanvasView view) {
this.view = view;
}
/**
* the zoom listeners
*/
private final CopyOnWriteArrayList<ZoomChangeListener> zoomChangeListeners = new CopyOnWriteArrayList<ZoomChangeListener>();
/**
* Removes a zoom change listener
*
* @param listener the listener. Ignored if null or already absent
*/
public void removeZoomChangeListener(ZoomChangeListener listener) {
zoomChangeListeners.remove(listener);
}
protected void fireZoomChanged() {
for (ZoomChangeListener l : zoomChangeListeners) {
l.zoomChanged();
}
}
/**
* Adds a zoom change listener
*
* @param listener the listener. Ignored if null or already registered.
*/
public void addZoomChangeListener(ZoomChangeListener listener) {
if (listener != null) {
zoomChangeListeners.addIfAbsent(listener);
}
}
/**
* @return Returns the center point. A copy is returned, so users cannot
* change the center by accessing the return value. Use zoomTo instead.
*/
public EastNorth getCenter() {
return center;
}
@Override
abstract public double getScale();
@Override
abstract public void zoomTo(EastNorth newCenter);
@Override
abstract public void zoomTo(ProjectionBounds box);
@Override
abstract public boolean isReady();
private EastNorth calculateDefaultCenter() {
Bounds b = Main.proj.getWorldBoundsLatLon();
double lat = (b.getMax().lat() + b.getMin().lat())/2;
double lon = (b.getMax().lon() + b.getMin().lon())/2;
return Main.proj.latlon2eastNorth(new LatLon(lat, lon));
}
/**
* @return The projection to be used in calculating stuff.
*/
public Projection getProjection() {
return Main.proj;
}
}