001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.preferences.imagery;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.KeyAdapter;
007import java.awt.event.KeyEvent;
008import java.util.Arrays;
009
010import javax.swing.JLabel;
011
012import org.openstreetmap.josm.data.imagery.ImageryInfo;
013import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
014import org.openstreetmap.josm.gui.widgets.JosmTextArea;
015import org.openstreetmap.josm.gui.widgets.JosmTextField;
016import org.openstreetmap.josm.tools.GBC;
017import org.openstreetmap.josm.tools.Utils;
018
019/**
020 * A panel for adding Mapbox Vector Tile layers
021 * @author Taylor Smock
022 * @since 17862
023 */
024public class AddMVTLayerPanel extends AddImageryPanel {
025    private final JosmTextField mvtZoom = new JosmTextField();
026    private final JosmTextArea mvtUrl = new JosmTextArea(3, 40).transferFocusOnTab();
027
028    /**
029     * Constructs a new {@code AddMVTLayerPanel}.
030     */
031    public AddMVTLayerPanel() {
032
033        add(new JLabel(tr("{0} Make sure OSM has the permission to use this service", "1.")), GBC.eol());
034        add(new JLabel(tr("{0} Enter URL (may be a style sheet url)", "2.")), GBC.eol());
035        add(new JLabel("<html>" + Utils.joinAsHtmlUnorderedList(Arrays.asList(
036                tr("{0} is replaced by tile zoom level, also supported:<br>" +
037                        "offsets to the zoom level: {1} or {2}<br>" +
038                        "reversed zoom level: {3}", "{zoom}", "{zoom+1}", "{zoom-1}", "{19-zoom}"),
039                tr("{0} is replaced by X-coordinate of the tile", "{x}"),
040                tr("{0} is replaced by Y-coordinate of the tile", "{y}"),
041                tr("{0} is replaced by a random selection from the given comma separated list, e.g. {1}", "{switch:...}", "{switch:a,b,c}")
042        )) + "</html>"), GBC.eol().fill());
043
044        final KeyAdapter keyAdapter = new KeyAdapter() {
045            @Override
046            public void keyReleased(KeyEvent e) {
047                mvtUrl.setText(buildMvtUrl());
048            }
049        };
050
051        add(rawUrl, GBC.eop().fill());
052        rawUrl.setLineWrap(true);
053        rawUrl.addKeyListener(keyAdapter);
054
055        add(new JLabel(tr("{0} Enter maximum zoom (optional)", "3.")), GBC.eol());
056        mvtZoom.addKeyListener(keyAdapter);
057        add(mvtZoom, GBC.eop().fill());
058
059        add(new JLabel(tr("{0} Edit generated {1} URL (optional)", "4.", "MVT")), GBC.eol());
060        add(mvtUrl, GBC.eop().fill());
061        mvtUrl.setLineWrap(true);
062
063        add(new JLabel(tr("{0} Enter name for this layer", "5.")), GBC.eol());
064        add(name, GBC.eop().fill());
065
066        registerValidableComponent(mvtUrl);
067    }
068
069    private String buildMvtUrl() {
070        StringBuilder a = new StringBuilder("mvt");
071        String z = sanitize(mvtZoom.getText());
072        if (!z.isEmpty()) {
073            a.append('[').append(z).append(']');
074        }
075        a.append(':').append(sanitize(getImageryRawUrl(), ImageryType.MVT));
076        return a.toString();
077    }
078
079    @Override
080    public ImageryInfo getImageryInfo() {
081        final ImageryInfo generated = new ImageryInfo(getImageryName(), getMvtUrl());
082        generated.setImageryType(ImageryType.MVT);
083        return generated;
084    }
085
086    protected final String getMvtUrl() {
087        return sanitize(mvtUrl.getText());
088    }
089
090    @Override
091    protected boolean isImageryValid() {
092        return !getImageryName().isEmpty() && !getMvtUrl().isEmpty();
093    }
094}