| 1 | // License: GPL. For details, see LICENSE file.
|
|---|
| 2 | package org.openstreetmap.josm.gui.mappaint;
|
|---|
| 3 |
|
|---|
| 4 | import java.awt.Color;
|
|---|
| 5 | import java.util.function.BiFunction;
|
|---|
| 6 |
|
|---|
| 7 | import org.openstreetmap.josm.data.preferences.BooleanProperty;
|
|---|
| 8 | import org.openstreetmap.josm.data.preferences.DoubleProperty;
|
|---|
| 9 | import org.openstreetmap.josm.data.preferences.NamedColorProperty;
|
|---|
| 10 | import org.openstreetmap.josm.data.preferences.StringProperty;
|
|---|
| 11 | import org.openstreetmap.josm.tools.Logging;
|
|---|
| 12 |
|
|---|
| 13 | /**
|
|---|
| 14 | * Factory to create matching {@link StyleSetting} instances.
|
|---|
| 15 | * @since 15731
|
|---|
| 16 | */
|
|---|
| 17 | public final class StyleSettingFactory {
|
|---|
| 18 |
|
|---|
| 19 | private StyleSettingFactory() {
|
|---|
| 20 | // private constructor for factory classes
|
|---|
| 21 | }
|
|---|
| 22 |
|
|---|
| 23 | /**
|
|---|
| 24 | * Creates a new {@code StyleSetting} based on the specified type by {@code c}.
|
|---|
| 25 | * The type must be supported by {@link Cascade#convertTo} as well as {@link org.openstreetmap.josm.data.preferences.AbstractProperty}.
|
|---|
| 26 | * @param c cascade
|
|---|
| 27 | * @param parentStyle parent style source
|
|---|
| 28 | * @param key setting identifier
|
|---|
| 29 | * @return newly created {@code StyleSetting}
|
|---|
| 30 | */
|
|---|
| 31 | public static StyleSetting create(Cascade c, StyleSource parentStyle, String key) {
|
|---|
| 32 | final String type = c.get("type", null, String.class);
|
|---|
| 33 | final String qualifiedKey = String.join(":", parentStyle.url, type, key);
|
|---|
| 34 | switch (type) {
|
|---|
| 35 | case "boolean":
|
|---|
| 36 | return forLabelAndDefault(c, Boolean.class, (label, defaultValue) -> {
|
|---|
| 37 | final BooleanProperty property = new BooleanProperty(qualifiedKey, defaultValue);
|
|---|
| 38 | return new StyleSetting.BooleanStyleSetting(parentStyle, label, property);
|
|---|
| 39 | });
|
|---|
| 40 | case "double":
|
|---|
| 41 | return forLabelAndDefault(c, Double.class, (label, defaultValue) -> {
|
|---|
| 42 | final DoubleProperty property = new DoubleProperty(qualifiedKey, defaultValue);
|
|---|
| 43 | return new StyleSetting.PropertyStyleSetting<>(parentStyle, label, Double.class, property);
|
|---|
| 44 | });
|
|---|
| 45 | case "string":
|
|---|
| 46 | return forLabelAndDefault(c, String.class, (label, defaultValue) -> {
|
|---|
| 47 | final StringProperty property = new StringProperty(qualifiedKey, defaultValue);
|
|---|
| 48 | return new StyleSetting.PropertyStyleSetting<>(parentStyle, label, String.class, property);
|
|---|
| 49 | });
|
|---|
| 50 | case "color":
|
|---|
| 51 | return forLabelAndDefault(c, Color.class, (label, defaultValue) -> {
|
|---|
| 52 | final NamedColorProperty property = new NamedColorProperty(NamedColorProperty.COLOR_CATEGORY_MAPPAINT,
|
|---|
| 53 | parentStyle.title == null ? "MapCSS" : parentStyle.title, label, defaultValue);
|
|---|
| 54 | return new StyleSetting.ColorStyleSetting(parentStyle, label, property);
|
|---|
| 55 | });
|
|---|
| 56 | default:
|
|---|
| 57 | Logging.warn("Unknown setting type {0} for style {1}", type, parentStyle.url);
|
|---|
| 58 | return null;
|
|---|
| 59 | }
|
|---|
| 60 | }
|
|---|
| 61 |
|
|---|
| 62 | private static <T> StyleSetting forLabelAndDefault(Cascade c, final Class<T> type, BiFunction<String, T, StyleSetting> function) {
|
|---|
| 63 | String label = c.get("label", null, String.class);
|
|---|
| 64 | if (label == null) {
|
|---|
| 65 | Logging.warn("property 'label' required for style setting of type " + type);
|
|---|
| 66 | return null;
|
|---|
| 67 | }
|
|---|
| 68 | T defaultValue = c.get("default", null, type);
|
|---|
| 69 | if (defaultValue == null) {
|
|---|
| 70 | Logging.warn("property 'default' required for style setting of type " + type);
|
|---|
| 71 | return null;
|
|---|
| 72 | }
|
|---|
| 73 | return function.apply(label, defaultValue);
|
|---|
| 74 | }
|
|---|
| 75 | }
|
|---|