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 * An imagery panel used to add TMS imagery sources
021 */
022public class AddTMSLayerPanel extends AddImageryPanel {
023
024    private final JosmTextField tmsZoom = new JosmTextField();
025    private final JosmTextArea tmsUrl = new JosmTextArea(3, 40).transferFocusOnTab();
026    private final transient KeyAdapter keyAdapter = new KeyAdapter() {
027        @Override
028        public void keyReleased(KeyEvent e) {
029            tmsUrl.setText(buildTMSUrl());
030        }
031    };
032
033    /**
034     * Constructs a new {@code AddTMSLayerPanel}.
035     */
036    public AddTMSLayerPanel() {
037
038        add(new JLabel(tr("{0} Make sure OSM has the permission to use this service", "1.")), GBC.eol());
039        add(new JLabel(tr("{0} Enter URL", "2.")), GBC.eol());
040        add(new JLabel("<html>" + Utils.joinAsHtmlUnorderedList(Arrays.asList(
041                tr("{0} is replaced by tile zoom level, also supported:<br>" +
042                        "offsets to the zoom level: {1} or {2}<br>" +
043                        "reversed zoom level: {3}", "{zoom}", "{zoom+1}", "{zoom-1}", "{19-zoom}"),
044                tr("{0} is replaced by X-coordinate of the tile", "{x}"),
045                tr("{0} is replaced by Y-coordinate of the tile", "{y}"),
046                tr("{0} is replaced by {1} (Yahoo style Y coordinate)", "{!y}", "2<sup>zoom–1</sup> – 1 – Y"),
047                tr("{0} is replaced by {1} (OSGeo Tile Map Service Specification style Y coordinate)", "{-y}", "2<sup>zoom</sup> – 1 – Y"),
048                tr("{0} is replaced by a random selection from the given comma separated list, e.g. {1}", "{switch:...}", "{switch:a,b,c}")
049        )) + "</html>"), GBC.eol().fill());
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        tmsZoom.addKeyListener(keyAdapter);
057        add(tmsZoom, GBC.eop().fill());
058
059        add(new JLabel(tr("{0} Edit generated {1} URL (optional)", "4.", "TMS")), GBC.eol());
060        add(tmsUrl, GBC.eop().fill());
061        tmsUrl.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(tmsUrl);
067    }
068
069    private String buildTMSUrl() {
070        StringBuilder a = new StringBuilder("tms");
071        String z = sanitize(tmsZoom.getText());
072        if (!z.isEmpty()) {
073            a.append('[').append(z).append(']');
074        }
075        a.append(':').append(sanitize(getImageryRawUrl(), ImageryType.TMS));
076        return a.toString();
077    }
078
079    @Override
080    public ImageryInfo getImageryInfo() {
081        ImageryInfo ret = new ImageryInfo(getImageryName(), getTmsUrl());
082        ret.setImageryType(ImageryType.TMS);
083        return ret;
084
085    }
086
087    protected final String getTmsUrl() {
088        return sanitize(tmsUrl.getText());
089    }
090
091    @Override
092    protected boolean isImageryValid() {
093        return !getImageryName().isEmpty() && !getTmsUrl().isEmpty();
094    }
095}