帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

113 lines
3.7 KiB

package com.fine.theme.icon;
import com.fine.theme.icon.img.ImageIconSource;
import com.fine.theme.icon.svg.SvgIconSource;
import com.formdev.flatlaf.json.Json;
import com.formdev.flatlaf.json.ParseException;
import com.fr.stable.StringUtils;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Objects;
/**
* json 格式图标集
*
* @author vito
* @since 11.0
* Created on 2023/11/17
*/
public class JsonIconSet extends AbstractIconSet {
private String base;
public JsonIconSet(UrlIconResource resource) {
addIcon(new SvgIconSource("default", "com/fine/theme/icon/default.svg"));
Map<String, Object> json;
try (InputStream in = resource.getInputStream()) {
try (Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
json = (Map<String, Object>) Json.parse(reader);
}
} catch (ParseException | IOException ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
name = (String) json.get("name");
dark = Boolean.parseBoolean((String) json.get("dark"));
base = (String) json.get("base");
if (base == null) {
base = StringUtils.EMPTY;
}
Map<String, Object> icons = (Map<String, Object>) json.get("icons");
for (Map.Entry<String, Object> icon : icons.entrySet()) {
applyIcon(icon.getKey(), icon.getValue());
}
}
/**
* 从配置文件中添加icon,只处理认识的格式和结构
*/
private void applyIcon(String key, Object value) {
if (value instanceof String) {
String path = (String) value;
if (IconManager.isSvgIcon(path)) {
// 默认字符串提供正常图和灰化图
addIcon(new SvgIconSource(key,
base + path,
IconManager.findDisablePath(base + path),
null
));
} else if (IconManager.isImageIcon(path)) {
addIcon(new ImageIconSource(key, base + path));
}
// 其他无法识别格式不处理
} else if (value instanceof Map) {
Map<String, Object> iconObj = (Map<String, Object>) value;
String normalPath = (String) iconObj.get(IconType.normal.name());
String disablePath = (String) iconObj.get(IconType.disable.name());
String whitePath = (String) iconObj.get(IconType.white.name());
// 暂不支持混合格式,每个id的格式需要保持一致
if (IconManager.isSvgIcon(normalPath)) {
addIcon(new SvgIconSource(key,
base + normalPath,
StringUtils.isNotBlank(disablePath) ? base + disablePath : null,
StringUtils.isNotBlank(whitePath) ? base + whitePath : null
));
} else if (IconManager.isImageIcon(normalPath)) {
addIcon(new ImageIconSource(key,
base + normalPath,
StringUtils.isNotBlank(disablePath) ? base + disablePath : null,
StringUtils.isNotBlank(whitePath) ? base + whitePath : null
));
}
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
JsonIconSet that = (JsonIconSet) o;
return Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return Objects.hashCode(name);
}
}