// License: GPL. For details, see LICENSE file.
package seachart;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Double;
import javax.swing.Action;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.imagery.ImageryInfo;
import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
import org.openstreetmap.josm.gui.MapView;
import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
import org.openstreetmap.josm.gui.layer.ImageryLayer;
import render.ChartContext;
import render.Renderer;
import s57.S57map;
import s57.S57map.Feature;
import s57.S57map.GeomIterator;
import s57.S57map.Pflag;
import s57.S57map.Snode;
import s57.S57obj.Obj;
import symbols.Symbols;
/**
* @author Malcolm Herring
*/
public class ChartImage extends ImageryLayer implements ZoomChangeListener, ChartContext {
double top;
double bottom;
double left;
double right;
double width;
double height;
int zoom;
public ChartImage(ImageryInfo info) {
super(info);
MapView.addZoomChangeListener(this);
zoomChanged();
}
@Override
public Action[] getMenuEntries() {
return null;
}
@Override
public String getToolTipText() {
return null;
}
@Override
protected Action getAdjustAction() {
return null;
}
@Override
public void visitBoundingBox(BoundingXYVisitor arg0) {
}
@Override
public void paint(Graphics2D g2, MapView mv, Bounds bb) {
Rectangle rect = Main.map.mapView.getBounds();
Renderer.reRender(g2, rect, zoom, Math.pow(2, (zoom-12)), SeachartAction.map, this);
g2.setPaint(Color.black);
g2.setFont(new Font("Arial", Font.BOLD, 20));
Rectangle crect = g2.getClipBounds();
if ((crect.y + crect.height) < (rect.y + rect.height - 10)) {
g2.drawString(("Z" + zoom), (crect.x + crect.width - 40), (crect.y + crect.height - 10));
} else {
g2.drawString(("Z" + zoom), (rect.x + rect.width - 40), (rect.y + rect.height - 10));
}
}
@Override
public void zoomChanged() {
if ((Main.map != null) && (Main.map.mapView != null)) {
Bounds bounds = Main.map.mapView.getRealBounds();
top = bounds.getMax().lat();
bottom = bounds.getMin().lat();
left = bounds.getMin().lon();
right = bounds.getMax().lon();
width = Main.map.mapView.getBounds().getWidth();
height = Main.map.mapView.getBounds().getHeight();
zoom = ((int) Math.min(18, Math.max(9, Math.round(Math.floor(Math.log(1024 / bounds.asRect().height) / Math.log(2))))));
}
}
@Override
public Point2D.Double getPoint(Snode coord) {
return (Double) Main.map.mapView.getPoint2D(new LatLon(Math.toDegrees(coord.lat), Math.toDegrees(coord.lon)));
}
@Override
public double mile(Feature feature) {
return 185000 / Main.map.mapView.getDist100Pixel();
}
@Override
public boolean clip() {
return true;
}
@Override
public Color background(S57map map) {
if (map.features.containsKey(Obj.COALNE)) {
for (Feature feature : map.features.get(Obj.COALNE)) {
if (feature.geom.prim == Pflag.POINT) {
break;
}
GeomIterator git = map.new GeomIterator(feature.geom);
git.nextComp();
while (git.hasEdge()) {
git.nextEdge();
while (git.hasNode()) {
Snode node = git.next();
if (node == null)
continue;
if ((node.lat >= map.bounds.minlat) && (node.lat <= map.bounds.maxlat)
&& (node.lon >= map.bounds.minlon) && (node.lon <= map.bounds.maxlon)) {
return Symbols.Bwater;
}
}
}
}
return Symbols.Yland;
} else {
if (map.features.containsKey(Obj.ROADWY) || map.features.containsKey(Obj.RAILWY)
|| map.features.containsKey(Obj.LAKARE) || map.features.containsKey(Obj.RIVERS) || map.features.containsKey(Obj.CANALS)) {
return Symbols.Yland;
} else {
return Symbols.Bwater;
}
}
}
@Override
public RuleSet ruleset() {
return RuleSet.ALL;
}
}