// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.roadsigns;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* Information about one road sign.
*
*/
public class Sign {
public String id;
public ParametrizedString ref;
public ParametrizedString traffic_sign_tag;
public String iconURL;
public ImageIcon icon;
public ImageIcon disabledIcon;
public String name;
public String long_name;
public List<Tag> tags = new ArrayList<>();
public List<Sign> supplements = new ArrayList<>();
public List<SignParameter> params = new ArrayList<>();
public boolean isSupplementing;
public String loc_wiki;
public String wiki;
public String help;
public Boolean useful;
public JLabel label; // FIXME: don't put gui stuff here
public static class Tag {
public ParametrizedString key;
public ParametrizedString value;
public String ident;
public String tag_ref;
public ParametrizedString append_value;
public ParametrizedString condition;
@Override
public String toString() {
return "<TAG key="+key+" value="+value+" ident="+ident+" tag_ref="+tag_ref+
" append_value="+append_value+" condition="+condition+">";
}
}
public static class SignParameter {
public enum Input { TEXTFIELD, COMBO }
public String ident;
public Input input;
String deflt;
String prefix;
String suffix;
Integer fieldWidth;
public SignParameter(String inputType) {
if (inputType.equals("textfield")) {
input = Input.TEXTFIELD;
} else if (inputType.equals("combo")) {
input = Input.COMBO;
} else
throw new IllegalArgumentException("unknown input type: "+inputType);
}
public String getDefault() {
return deflt == null ? "" : deflt;
}
public String getPrefix() {
return prefix == null ? "" : prefix;
}
public String getSuffix() {
return suffix == null ? "" : suffix;
}
}
public ImageIcon getIcon() {
if (icon == null) {
icon = new ImageProvider(iconURL).setDirs(RoadSignsPlugin.iconDirs).setId("plugin.sign."+id).setOptional(true).get();
}
return icon;
}
/**
* Creates a generic form of the traffic sign ref.
* It strips osm specific syntax so it can be
* used in documentation and help texts.
* @return null if the format is unknown
*/
public String getDefaultRef() {
if (ref == null)
return null;
String r = ref.toString();
/* strip parameters */
r = r.replaceAll("\\[.*\\]", "");
if (r.startsWith("DE:")) {
r = r.replaceAll("DE:", "");
/* normal sign: starts with 3 digits, then a non-digit */
Pattern p1 = Pattern.compile("^\\d{3}(\\D|$)");
Matcher m1 = p1.matcher(r);
if (m1.find())
return tr("Sign {0}", r);
/* supplementary sign: starts with 4 digits, then a non-digit */
Pattern p2 = Pattern.compile("^\\d{4}(\\D|$)");
Matcher m2 = p2.matcher(r);
if (m2.find())
return tr("Additional sign {0}", r);
return null;
}
return null;
}
public boolean isUseful() {
if (useful != null) return useful;
return !tags.isEmpty();
}
@Override
public String toString() {
return id+" - "+name;
}
}