package com.github.pfichtner.jrunalyser.ui.map.painter;
import static com.google.common.collect.Iterables.filter;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.Point2D;
import java.util.List;
import org.jdesktop.swingx.JXMapViewer;
import org.jdesktop.swingx.mapviewer.util.GeoUtil;
import org.jdesktop.swingx.painter.Painter;
import com.github.pfichtner.jrunalyser.base.data.LinkedTrackPoint;
import com.github.pfichtner.jrunalyser.base.data.WayPoint;
import com.github.pfichtner.jrunalyser.base.data.segment.Segment;
import com.github.pfichtner.jrunalyser.base.data.stat.Predicates;
import com.github.pfichtner.jrunalyser.base.data.track.Track;
import com.github.pfichtner.jrunalyser.ui.map.theme.Theme;
public abstract class AbstractTrackPainter implements Painter<JXMapViewer> {
private final Track track;
private final Theme theme;
public AbstractTrackPainter(Track track, Theme theme) {
this.track = track;
this.theme = theme;
}
public Track getTrack() {
return this.track;
}
public Theme getTheme() {
return this.theme;
}
public final void paint(Graphics2D g, JXMapViewer jxMapViewer, int w, int h) {
Rectangle rect = jxMapViewer.getViewportBounds();
g.translate(-rect.x, -rect.y);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
drawSegments(g, this.track.getSegments(), jxMapViewer);
g.translate(rect.x, rect.y);
}
protected void drawSegments(Graphics2D g, List<Segment> segments,
JXMapViewer jxMapViewer) {
for (Segment segment : segments) {
drawSegment(g, segment, jxMapViewer);
}
}
protected void drawSegment(Graphics2D g, Segment segment,
JXMapViewer jxMapViewer) {
for (LinkedTrackPoint wp : filter(segment.getTrackpoints(),
Predicates.LinkedWayPoints.hasLink())) {
drawWaypoint(g, segment, wp, jxMapViewer);
}
}
protected void drawWaypoint(Graphics2D g, Segment segment,
LinkedTrackPoint wp, JXMapViewer jxMapViewer) {
drawWaypoint(g, toPoint2D(wp, jxMapViewer),
toPoint2D(wp.getLink().getNext(), jxMapViewer));
}
protected abstract void drawWaypoint(Graphics2D g, Point2D p1, Point2D p2);
private static Point2D toPoint2D(WayPoint trackPoint,
JXMapViewer jxMapViewer) {
return GeoUtil.getBitmapCoordinate(trackPoint.getLatitude(), trackPoint
.getLongitude(), jxMapViewer.getZoom(), jxMapViewer
.getTileFactory().getInfo());
}
}