// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.mappaint; import java.awt.event.ActionEvent; import java.util.Arrays; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import org.openstreetmap.josm.Main; /** * Setting to customize a MapPaint style. * * Can be changed by the user in the right click menu of the mappaint style * dialog. * * Defined in the MapCSS style, e.g. * <pre> * setting::highway_casing { * type: boolean; * label: tr("Draw highway casing"); * default: true; * } * * way[highway][setting("highway_casing")] { * casing-width: 2; * casing-color: white; * } * </pre> */ public interface StyleSetting { void addMenuEntry(JMenu menu); Object getValue(); /** * A style setting for boolean value (yes / no). */ class BooleanStyleSetting implements StyleSetting { public final StyleSource parentStyle; public final String prefKey; public final String label; public final boolean def; public BooleanStyleSetting(StyleSource parentStyle, String prefKey, String label, boolean def) { this.parentStyle = parentStyle; this.prefKey = prefKey; this.label = label; this.def = def; } @Override public void addMenuEntry(JMenu menu) { final JCheckBoxMenuItem item = new JCheckBoxMenuItem(); Action a = new AbstractAction(label) { @Override public void actionPerformed(ActionEvent e) { setValue(item.isSelected()); Main.worker.submit(new MapPaintStyles.MapPaintStyleLoader(Arrays.asList(parentStyle))); } }; item.setAction(a); item.setSelected((boolean) getValue()); menu.add(item); } public static BooleanStyleSetting create(Cascade c, StyleSource parentStyle, String key) { String label = c.get("label", null, String.class); if (label == null) { Main.warn("property 'label' required for boolean style setting"); return null; } Boolean def = c.get("default", null, Boolean.class); if (def == null) { Main.warn("property 'default' required for boolean style setting"); return null; } String prefKey = parentStyle.url + ":boolean:" + key; return new BooleanStyleSetting(parentStyle, prefKey, label, def); } @Override public Object getValue() { String val = Main.pref.get(prefKey, null); if (val == null) return def; return Boolean.valueOf(val); } public void setValue(Object o) { if (!(o instanceof Boolean)) { throw new IllegalArgumentException(); } boolean b = (Boolean) o; if (b == def) { Main.pref.put(prefKey, null); } else { Main.pref.put(prefKey, b); } } } }