package com.github.pfichtner.jrunalyser.ui.map.painter;
import static com.github.pfichtner.jrunalyser.ui.map.util.GeoUtil.toGeoPoint;
import static com.google.common.collect.Iterables.getFirst;
import static com.google.common.collect.Iterables.getLast;
import java.util.List;
import java.util.Set;
import org.jdesktop.swingx.JXMapViewer;
import org.jdesktop.swingx.mapviewer.Waypoint;
import org.jdesktop.swingx.mapviewer.WaypointPainter;
import com.github.pfichtner.jrunalyser.base.data.LinkedTrackPoint;
import com.github.pfichtner.jrunalyser.base.data.SegmentationUnit;
import com.github.pfichtner.jrunalyser.base.data.segment.Segment;
import com.github.pfichtner.jrunalyser.base.data.stat.Orderings;
import com.github.pfichtner.jrunalyser.base.data.track.Track;
import com.github.pfichtner.jrunalyser.ui.map.wp.SegmentBorderWaypoint;
import com.github.pfichtner.jrunalyser.ui.map.wp.SelectedWaypoint;
import com.github.pfichtner.jrunalyser.ui.map.wp.TrackEndWaypoint;
import com.github.pfichtner.jrunalyser.ui.map.wp.TrackStartWaypoint;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class SegmentBorderWaypointPainter extends WaypointPainter<JXMapViewer> {
private final SegmentationUnit segmentationUnit;
/**
* Creates a new SegmentBorderWaypointPainter. A
* SegmentBorderWaypointPainter gets its Waypoints from the segments found
* in the passed Track.
*
* @param segmentationUnit
*
* @param addTrack
*/
public SegmentBorderWaypointPainter(Track track,
SegmentationUnit segmentationUnit) {
this.segmentationUnit = segmentationUnit;
setWaypoints(getSegmentBorders(track));
}
private Set<Waypoint> getSegmentBorders(Track track) {
List<Waypoint> waypoints = Lists.newArrayList();
int cnt = 0;
for (Segment segment : track.getSegments()) {
if (cnt == 0) {
waypoints.add(new TrackStartWaypoint(toGeoPoint(getFirst(
segment.getTrackpoints(), null))));
}
LinkedTrackPoint last = getLast(segment.getTrackpoints());
if (last != null && last.getLink() != null) {
waypoints.add(new SegmentBorderWaypoint(toGeoPoint(last
.getLink().getNext()), ++cnt, this.segmentationUnit));
} else {
waypoints.add(new TrackEndWaypoint(toGeoPoint(last)));
}
}
return Sets.newLinkedHashSet(Orderings.classTypeOrdering(
ImmutableList.<Class<? extends Waypoint>> of(
SegmentBorderWaypoint.class, TrackStartWaypoint.class,
TrackEndWaypoint.class, SelectedWaypoint.class))
.sortedCopy(waypoints));
}
}