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}