001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.layer; 003 004import static org.openstreetmap.josm.tools.I18n.trn; 005 006import java.awt.Graphics2D; 007import java.util.ArrayList; 008import java.util.Collection; 009 010import javax.swing.Action; 011import javax.swing.Icon; 012 013import org.openstreetmap.josm.data.Bounds; 014import org.openstreetmap.josm.data.gpx.GpxRoute; 015import org.openstreetmap.josm.data.gpx.Line; 016import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; 017import org.openstreetmap.josm.gui.MapView; 018import org.openstreetmap.josm.gui.layer.gpx.GpxDrawHelper; 019import org.openstreetmap.josm.tools.Utils; 020 021/** 022 * A layer that displays {@linkplain org.openstreetmap.josm.data.gpx.GpxData#routes} from a GPX file. 023 */ 024public class GpxRouteLayer extends AbstractModifiableLayer { 025 026 public final GpxLayer fromLayer; 027 private final Collection<GpxRoute> routes = new ArrayList<>(); 028 029 public GpxRouteLayer() { 030 this(null, null); 031 } 032 033 public GpxRouteLayer(String name, GpxLayer fromLayer) { 034 super(name); 035 this.fromLayer = fromLayer; 036 if (fromLayer != null) { 037 this.routes.addAll(fromLayer.data.routes); 038 } 039 } 040 041 @Override 042 public boolean isModified() { 043 return fromLayer.isModified(); 044 } 045 046 @Override 047 public Icon getIcon() { 048 return null; 049 } 050 051 @Override 052 public String getToolTipText() { 053 final String tooltip = trn("{0} route, ", "{0} routes, ", routes.size(), routes.size()); 054 return Utils.strip(tooltip, " ,"); 055 } 056 057 @Override 058 public void mergeFrom(Layer from) { 059 if (from instanceof GpxRouteLayer) { 060 routes.addAll(((GpxRouteLayer) from).routes); 061 } 062 } 063 064 @Override 065 public boolean isMergable(Layer other) { 066 return other instanceof GpxRouteLayer; 067 } 068 069 @Override 070 public void visitBoundingBox(BoundingXYVisitor v) { 071 fromLayer.visitBoundingBox(v); 072 } 073 074 @Override 075 public Object getInfoComponent() { 076 return null; 077 } 078 079 @Override 080 public Action[] getMenuEntries() { 081 return new Action[0]; 082 } 083 084 @Override 085 public void paint(Graphics2D g, MapView mv, Bounds bbox) { 086 // unused - we use a painter so this is not called. 087 } 088 089 @Override 090 protected LayerPainter createMapViewPainter(MapViewEvent event) { 091 return new GpxDrawHelper(fromLayer) { 092 @Override 093 protected Iterable<Line> getLinesIterable(boolean[] trackVisibility) { 094 return () -> routes.stream().map(Line::new).iterator(); 095 } 096 }; 097 } 098}