package org.openstreetmap.josm.plugins.rasterfilters.model;
import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import org.openstreetmap.josm.plugins.rasterfilters.values.BooleanValue;
import org.openstreetmap.josm.plugins.rasterfilters.values.ColorValue;
import org.openstreetmap.josm.plugins.rasterfilters.values.SelectValue;
import org.openstreetmap.josm.plugins.rasterfilters.values.SliderValue;
import org.openstreetmap.josm.plugins.rasterfilters.values.Value;
/**
* Filter state's model which stores all parameters of
* the filter according to its meta-information.
* The usual values from meta-information are converted
* into subtypes of the generic interface {@link Value}
*
* @author Nipel-Crumple
*/
public class FilterStateModel {
private Map<String, Value<?>> params = new HashMap<>();
private String filterClassName;
public FilterStateModel() {
}
public Map<String, Value<?>> getParams() {
return params;
}
public String getFilterClassName() {
return filterClassName;
}
public void setFilterClassName(String filterClassName) {
this.filterClassName = filterClassName;
}
public void addParams(JsonObject json) {
String parameterName = json.getString("name");
String valueType = json.getString("value_type");
// setting up the beginning state of filter
// according to its metainfo
if (json.getString("type").equals("linear_slider")) {
if (valueType.equals("float") || valueType.equals("double")) {
double defaultValue = json.getJsonNumber("default")
.doubleValue();
SliderValue<Double> value = new SliderValue<>(parameterName,
defaultValue);
params.put(parameterName, value);
} else if (valueType.equals("integer")) {
int defaultValue = json.getJsonNumber("default").intValue();
SliderValue<Integer> value = new SliderValue<>(parameterName,
defaultValue);
params.put(parameterName, value);
}
} else if (json.getString("type").equals("checkbox")) {
boolean defaultValue = json.getBoolean("default");
BooleanValue value = new BooleanValue(parameterName, defaultValue);
params.put(parameterName, value);
} else if (json.getString("type").equals("select")) {
String defaultValue = json.getString("default");
SelectValue<String> value = new SelectValue<>(parameterName,
defaultValue);
params.put(parameterName, value);
} else if (json.getString("type").equals("colorpicker")) {
JsonObject defaultColorJson = json.getJsonObject("default");
int r = defaultColorJson.getInt("red");
int g = defaultColorJson.getInt("green");
int b = defaultColorJson.getInt("blue");
Color defaultColor = new Color(r, g, b);
ColorValue<Color> value = new ColorValue<>(parameterName,
defaultColor);
params.put(parameterName, value);
}
}
/**
* Method generates json from the current filter's model state.
*
* @return encoded json which describes current filter's state
*/
public JsonObject encodeJson() {
JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
for (Entry<String, Value<?>> entry : params.entrySet()) {
Object value = entry.getValue().getValue();
if (value instanceof String) {
jsonBuilder.add(entry.getKey(),
Json.createObjectBuilder().add("value", (String) value)
.build());
}
if (value instanceof Boolean) {
jsonBuilder.add(entry.getKey(),
Json.createObjectBuilder()
.add("value", (Boolean) value).build());
}
if (value instanceof Number) {
if (value instanceof Double) {
jsonBuilder.add(entry.getKey(), Json.createObjectBuilder()
.add("value", (Double) value).build());
} else if (value instanceof Integer) {
jsonBuilder.add(entry.getKey(), Json.createObjectBuilder()
.add("value", (Integer) value).build());
}
}
if (value instanceof Color) {
jsonBuilder.add(entry.getKey(),
Json.createObjectBuilder()
.add("value", Json.createObjectBuilder()
.add("red", ((Color) value).getRed())
.add("green", ((Color) value).getGreen())
.add("blue", ((Color) value).getBlue())
.build())
.build());
}
}
return jsonBuilder.build();
}
}