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}