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}