package com.baselet.element.facet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.baselet.control.enums.FormatLabels;
import com.baselet.diagram.draw.helper.StyleException;
import com.baselet.gui.AutocompletionText;
public abstract class KeyValueFacet extends Facet {
public static class KeyValue {
private final String key;
private final boolean allValuesListed;
private final List<ValueInfo> valueInfos;
public KeyValue(String key, boolean allValuesListed, String value, String info) {
super();
this.key = key.toLowerCase();
this.allValuesListed = allValuesListed;
valueInfos = Arrays.asList(new ValueInfo(value, info));
}
public KeyValue(String key, List<ValueInfo> valueInfos) {
super();
this.key = key;
allValuesListed = true;
this.valueInfos = valueInfos;
}
public KeyValue(String key, ValueInfo... valueInfos) {
this(key, Arrays.asList(valueInfos));
}
public String getKey() {
return key;
}
public List<ValueInfo> getValueInfos() {
return valueInfos;
}
public String getValueString() {
StringBuilder sb = new StringBuilder();
if (allValuesListed) {
sb.append("Valid are: ");
for (ValueInfo vi : valueInfos) {
sb.append(vi.value.toString().toLowerCase()).append(',');
}
sb.deleteCharAt(sb.length() - 1);
}
else {
for (ValueInfo vi : valueInfos) {
sb.append(vi.info);
}
}
return sb.toString();
}
}
public static class ValueInfo {
private final Object value;
private final String info;
private final String base64Img;
public ValueInfo(Object value, String info) {
this(value, info, null);
}
public ValueInfo(Object value, String info, String base64Img) {
super();
this.value = value;
this.info = info;
this.base64Img = base64Img;
}
public Object getValue() {
return value;
}
private String getInfo() {
return info;
}
private String getBase64Img() {
return base64Img;
}
}
public static final String SEP = "=";
public abstract KeyValue getKeyValue();
public abstract void handleValue(String value, PropertiesParserState state);
@Override
public boolean checkStart(String line, PropertiesParserState state) {
return line.startsWith(getKeyWithSep());
}
@Override
public void handleLine(String line, PropertiesParserState state) {
String value = extractValue(line);
try {
handleValue(value, state);
} catch (Exception e) {
log.debug("KeyValue Error", e);
String errorMessage = getKeyValue().getValueString();
if (e instanceof StyleException) { // self defined exceptions overwrite the default message
errorMessage = e.getMessage();
}
throw new RuntimeException(FormatLabels.BOLD.getValue() + "Invalid value:" + FormatLabels.BOLD.getValue() + "\n" + getKeyWithSep() + value + "\n" + errorMessage);
}
}
protected String extractValue(String line) {
return line.substring(getKeyWithSep().length());
}
@Override
public List<AutocompletionText> getAutocompletionStrings() {
List<AutocompletionText> returnList = new ArrayList<AutocompletionText>();
for (ValueInfo valueInfo : getKeyValue().getValueInfos()) {
returnList.add(new AutocompletionText(getKeyWithSep() + valueInfo.getValue().toString().toLowerCase(), valueInfo.getInfo(), valueInfo.getBase64Img()));
}
return returnList;
}
public String getKeyWithSep() {
return getKeyValue().getKey() + KeyValueFacet.SEP;
}
}