From 783e2af1cd6192ccdfee30f0411c258f8e9187b6 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 23 Aug 2024 16:52:17 +0800 Subject: [PATCH 01/26] =?UTF-8?q?REPORT-127437=20feat:=E9=80=82=E9=85=8D?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/icon/plugin/PluginIconManager.java | 213 ++++++++++++++++++ .../fine/theme/icon/plugin/PluginIconSet.java | 136 +++++++++++ .../theme/icon/plugin/PluginLazyIcon.java | 129 +++++++++++ .../com/fr/design/fun/LazyIconProvider.java | 68 ++++++ .../fun/impl/AbstractLazyIconProvider.java | 71 ++++++ 5 files changed, 617 insertions(+) create mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java new file mode 100644 index 0000000000..8648396f75 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java @@ -0,0 +1,213 @@ +package com.fine.theme.icon.plugin; + +import com.fine.theme.icon.IconException; +import com.fine.theme.icon.IconManager; +import com.fine.theme.icon.IconSet; +import com.fine.theme.icon.IconType; +import com.fine.theme.icon.LazyIcon; +import com.fr.base.extension.FileExtension; +import com.fr.general.IOUtils; +import com.fr.log.FineLoggerFactory; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.Icon; +import java.awt.Dimension; +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Map; + +/** + * 管理插件图标集 + * + * @author lemon + * @since + * Created on 2024/08/23 + */ +public class PluginIconManager { + + public static final String ICON_DISABLE_SUFFIX = "_disable"; + public static final Dimension DEFAULT_DIMENSION = new Dimension(16, 16); + private static final Map SOURCE_ICON_MAPS = new HashMap<>(2); + private static final HashMap>> CACHE = new HashMap<>(); + + + /** + * 获取图标集 + * + * @param id 图标集ID + * @return 图标集 + */ + public static IconSet getSet(String source, String id) { + IconSet set = SOURCE_ICON_MAPS.get(source); + + if (set != null && set.getId().equals(id)) { + return set; + } + throw new IconException("[PluginIconManager] Can not find icon set by id: " + id); + } + + /** + * 添加图标集 + * + * @param source 插件 + * @param set 图标集 + */ + public static void addSet(@NotNull String source, @NotNull IconSet set) { + if (SOURCE_ICON_MAPS.containsKey(source)) { + FineLoggerFactory.getLogger().warn("[PluginIconManager] plugin:{} icon set already exists: " + source); + } + SOURCE_ICON_MAPS.put(source, set); + clearCacheBySource(source); + } + + /** + * 更新指定插件图标集 + * + * @param source 插件 + * @param set 图标集 + */ + public static void updateSet(@NotNull String source, @NotNull IconSet set) { + SOURCE_ICON_MAPS.put(source, set); + clearCacheBySource(source); + } + + /** + * 删除指定插件图标集 + * + * @param source 插件 + */ + public static void removeSet(@NotNull String source) { + SOURCE_ICON_MAPS.remove(source); + clearCacheBySource(source); + } + + /** + * 根据图标ID获取图标 + *

+ * 查找路径 + * 1)查找图集图标 + * 2)路径为图片图标,从路径再查找 + * 3)提供默认svg图标 + * + * @param id 图标ID + * @param 图标类型 + * @return 图标 + */ + @NotNull + public static I getIcon(@NotNull String source, @NotNull final String id, @NotNull Dimension dimension, @NotNull IconType type) { + Icon icon = findIcon(source, id, dimension, type); + if (icon == null) { + // 只有找不到再进行其他fallback,提升效率 + if (IconManager.isImageIcon(id)) { + return (I) fallbackLegacyIcon(id); + } else { + FineLoggerFactory.getLogger().warn("[PluginIconManager] Can not find icon by id: " + id); + return (I) new LazyIcon("default"); + } + } + return (I) icon; + } + + private static Icon fallbackLegacyIcon(String id) { + return IOUtils.readIcon(id); + } + + @Nullable + private static I findIcon(String source, String id, Dimension dimension, IconType type) { + String cacheKey = genCacheKey(source, id, dimension, type); + HashMap> sourceCache = CACHE.getOrDefault(cacheKey, new HashMap<>(64)); + final WeakReference reference = sourceCache.get(cacheKey); + I icon = reference != null ? (I) reference.get() : null; + if (icon == null) { + IconSet set = SOURCE_ICON_MAPS.get(source); + if (set == null) { + return icon; + } + Icon f = set.findIcon(id, dimension, type); + if (f != null) { + icon = (I) f; + sourceCache.put(cacheKey, new WeakReference<>(icon)); + CACHE.put(source, sourceCache); + } + } + return icon; + } + + + /** + * 生成缓存key + * + * @param id id + * @param dimension 尺寸 + * @param type 图标类型 + * @return 缓存key + */ + public static @NotNull String genCacheKey(String source, String id, Dimension dimension, IconType type) { + if (DEFAULT_DIMENSION.equals(dimension)) { + return source + "_" + id + "_" + type; + } + return source + "_" + id + "_" + dimension.width + "_" + dimension.height + "_" + type; + } + + /** + * 是否SVG图标格式 + * + * @param path 路径 + * @return 是否SVG图标格式 + */ + public static boolean isSvgIcon(String path) { + return FileExtension.SVG.matchExtension(path); + } + + /** + * 是否支持的图片图标格式,目前只支持png和jpg + * + * @param path 路径 + * @return 是否支持的图片图标格式 + */ + public static boolean isImageIcon(String path) { + return FileExtension.PNG.matchExtension(path) + || FileExtension.JPG.matchExtension(path); + } + + /** + * 判断是否存在指定id的icon,非io读取行为,而是从已注册的sourceMap中遍历判断 + * + * @param id id + * @return 是否存在 + */ + public static boolean existIcon(String id, String source) { + IconSet set = SOURCE_ICON_MAPS.get(source); + if (set != null && set.getIds().contains(id)) { + return true; + } + return false; + } + + /** + * 清理所有缓存 + */ + public static void clearCache() { + CACHE.clear(); + } + + /** + * 清楚指定插件缓存 + * @param source 插件标识 + */ + public static void clearCacheBySource(String source) { + CACHE.remove(source); + } + + /** + * 查找灰化图标 + * + * @param path 原始路径 + * @return 灰化路径 + */ + public static String findDisablePath(String path) { + int i = path.lastIndexOf('.'); + return path.substring(0, i) + ICON_DISABLE_SUFFIX + path.substring(i); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java new file mode 100644 index 0000000000..151322d725 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java @@ -0,0 +1,136 @@ +package com.fine.theme.icon.plugin; + +import com.fine.theme.icon.AbstractIconSet; +import com.fine.theme.icon.IconManager; +import com.fine.theme.icon.IconType; +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; + +/** + * 插件图标集 + * + * @author lemon + * @since + * Created on 2024/08/20 + */ +public class PluginIconSet extends AbstractIconSet { + + private String base; + + + public PluginIconSet(PluginUrlIconResource resource, Map iconId2Path) { + addIconWithMap(iconId2Path); + + if (resource.getPath() == null) { + return; + } + Map json; + try (InputStream in = resource.getInputStream()) { + try (Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { + json = (Map) 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 icons = (Map) json.get("icons"); + + for (Map.Entry icon : icons.entrySet()) { + applyIcon(icon.getKey(), icon.getValue()); + } + + } + + private void applyIcon(String key, Object value) { + if (value instanceof String) { + dealWithIconString(key, (String) value); + } else if (value instanceof Map) { + dealWithIconMap(key, (Map) value); + } + } + + private void dealWithIconString(String key, String value) { + if (IconManager.isSvgIcon(value)) { + // 默认字符串提供正常图和灰化图 + addIcon(new PluginSvgIconSource(key, + base + value, + IconManager.findDisablePath(base + value), + null + )); + } else if (IconManager.isImageIcon(value)) { + addIcon(new PluginImageIconSource(key, base + value)); + } + // 其他无法识别格式不处理 + } + + + /** + * 处理object形式的icon配置 + */ + private void dealWithIconMap(String key, Map value) { + String normalPath = (String) value.get(IconType.normal.name()); + String disablePath = (String) value.get(IconType.disable.name()); + String whitePath = (String) value.get(IconType.white.name()); + // 暂不支持混合格式,每个id的格式需要保持一致 + if (IconManager.isSvgIcon(normalPath)) { + addIcon(new PluginSvgIconSource(key, + base + normalPath, + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null + )); + } else if (IconManager.isImageIcon(normalPath)) { + addIcon(new PluginImageIconSource(key, + base + normalPath, + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null + )); + } + } + + /** + * 根据 map 注册图标 + * @param iconId2Path key: id, value: icon path + */ + public void addIconWithMap(Map iconId2Path) { + for (Map.Entry entry: iconId2Path.entrySet()) { + if (PluginIconManager.isSvgIcon(entry.getValue())) { + addIcon(new PluginSvgIconSource(entry.getKey(), entry.getValue())); + } else if (PluginIconManager.isImageIcon(entry.getValue())) { + addIcon(new PluginImageIconSource(entry.getKey(), entry.getValue())); + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PluginIconSet that = (PluginIconSet) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java new file mode 100644 index 0000000000..c6ac211335 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java @@ -0,0 +1,129 @@ +package com.fine.theme.icon.plugin; + +import com.fine.theme.icon.DisabledIcon; +import com.fine.theme.icon.IconManager; +import com.fine.theme.icon.IconType; +import com.fine.theme.icon.Identifiable; +import com.fine.theme.icon.WhiteIcon; +import com.fr.design.fun.impl.AbstractLazyIconProvider; +import org.jetbrains.annotations.NotNull; + +import javax.swing.Icon; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.util.StringJoiner; + +import static com.fine.theme.utils.FineUIScale.scale; + +public class PluginLazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { + @NotNull + private final String id; + + private final Dimension dimension; + + private final IconType type; + + private final String source; + + /** + * + * @param source {@link AbstractLazyIconProvider#source()} + * @param id + */ + public PluginLazyIcon(@NotNull final String source, @NotNull final String id) { + this.id = id; + this.dimension = IconManager.DEFAULT_DIMENSION; + this.type = IconType.normal; + this.source = source; + } + + public PluginLazyIcon(@NotNull final String source, @NotNull final String id, int side) { + this.id = id; + this.dimension = new Dimension(side, side); + this.type = IconType.normal; + this.source = source; + } + + public PluginLazyIcon(@NotNull final String source, @NotNull final String id, @NotNull Dimension dimension) { + this.id = id; + this.dimension = dimension; + this.type = IconType.normal; + this.source = source; + } + + private PluginLazyIcon(@NotNull final String source, @NotNull final String id, @NotNull IconType type) { + this.id = id; + this.dimension = IconManager.DEFAULT_DIMENSION; + this.type = type; + this.source = source; + } + + public PluginLazyIcon(@NotNull final String source, @NotNull final String id, @NotNull Dimension dimension, @NotNull IconType type) { + this.id = id; + this.dimension = dimension; + this.type = type; + this.source = source; + } + + + @NotNull + @Override + public String getId() { + return id; + } + + @Override + public void paintIcon(@NotNull final Component c, @NotNull final Graphics g, final int x, final int y) { + getIcon().paintIcon(c, g, x, y); + } + + @Override + public int getIconWidth() { + return scale(dimension.width); + } + + @Override + public int getIconHeight() { + return scale(dimension.height); + } + + + @NotNull + public I getIcon() { + return PluginIconManager.getIcon(source, getId(), dimension, type); + } + + /** + * 创建一份灰化图标 + * + * @return 灰化图标 + */ + @NotNull + @Override + public Icon disabled() { + return new PluginLazyIcon(source, getId(), dimension, IconType.disable); + } + + /** + * 创建一份白化图标 + * + * @return 白化图标 + */ + @NotNull + @Override + public Icon white() { + return new PluginLazyIcon(source, getId(), dimension, IconType.white); + } + + + @Override + public String toString() { + return new StringJoiner(", ", PluginLazyIcon.class.getSimpleName() + "[", "]") + .add("source='" + source + "'") + .add("id='" + id + "'") + .add("size=" + "[w=" + scale(dimension.width) + ",h=" + scale(dimension.height) + "]") + .add("type=" + type) + .toString(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java new file mode 100644 index 0000000000..93989775fe --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java @@ -0,0 +1,68 @@ +package com.fr.design.fun; + +import com.fr.stable.fun.mark.Mutable; + +import java.util.Map; + +/** + * 插件图标适配接口 + * + * @author lemon + * @since + * Created on + */ +public interface LazyIconProvider extends Mutable { + String MARK_STRING = "LazyIconProvider"; + + int CURRENT_LEVEL = 1; + + /** + * 自定义,icon 来源标识 + * + * @return 来源标识 + */ + String source(); + + /** + * json 文件路径 + * + * @return 图标注册 json 路径 + */ + String jsonPath(); + + /** + * 图标所属主题分类 + * + * @return 主题类别 + */ + THEME themeCategory(); + + /** + * 构建需要注册的图标 key: id, value: icon path + * @return map + */ + Map iconId2Path(); + + /** + * 图标主题 + */ + enum THEME { + + /** + * light_icon + */ + LIGHT_ICON("light_icon"), + + /** + * dark_icon + */ + DARK_ICON("dark_icon") + ; + + final String category; + THEME(String category) { + this.category = category; + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java new file mode 100644 index 0000000000..53002c2705 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java @@ -0,0 +1,71 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.LazyIconProvider; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.Map; + + +/** + * 插件图标 LazyIcon 加载适配抽象类 + * + * @author lemon + * @since + * Created on + */ +@API(level = LazyIconProvider.CURRENT_LEVEL) +public class AbstractLazyIconProvider extends AbstractProvider implements LazyIconProvider { + + /** + * 当前接口的API等级,用于判断是否需要升级插件 + * @return API等级 + */ + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + /** + * 区分插件 + * + * @return 插件 id + */ + @Override + public String source() { + throw new RuntimeException("source is blank"); + } + + /** + * 通过 json 注册图标 + * + * @return 图标注册 json 路径 + */ + @Override + public String jsonPath() { + return null; + } + + /** + * 图标主题 {@link THEME} + * + * @return 主题类别 + */ + @Override + public THEME themeCategory() { + return null; + } + + /** + * 直接注册图标:key 是 icon id, value 是 icon path + * + * @return map + */ + @Override + public Map iconId2Path() { + return null; + } + +} From e2f37f8d7263a899b2ea8e03ad38b7a9217476f8 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 23 Aug 2024 17:14:53 +0800 Subject: [PATCH 02/26] =?UTF-8?q?REPORT-127437=20feat:=E9=80=82=E9=85=8D?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fine/theme/icon/plugin/PluginIconSet.java | 28 ++++---- .../theme/icon/plugin/PluginLazyIcon.java | 14 +++- .../fine/theme/light/ui/laf/FineDarkLaf.java | 3 + .../com/fine/theme/light/ui/laf/FineLaf.java | 72 +++++++++++++++++++ .../fine/theme/light/ui/laf/FineLightLaf.java | 2 + .../com/fr/design/fun/LazyIconProvider.java | 4 +- .../fun/impl/AbstractLazyIconProvider.java | 4 +- 7 files changed, 107 insertions(+), 20 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java index 151322d725..e2e2c13354 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java @@ -1,8 +1,10 @@ package com.fine.theme.icon.plugin; import com.fine.theme.icon.AbstractIconSet; -import com.fine.theme.icon.IconManager; import com.fine.theme.icon.IconType; +import com.fine.theme.icon.UrlIconResource; +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; @@ -27,7 +29,7 @@ public class PluginIconSet extends AbstractIconSet { private String base; - public PluginIconSet(PluginUrlIconResource resource, Map iconId2Path) { + public PluginIconSet(UrlIconResource resource, Map iconId2Path) { addIconWithMap(iconId2Path); if (resource.getPath() == null) { @@ -66,15 +68,15 @@ public class PluginIconSet extends AbstractIconSet { } private void dealWithIconString(String key, String value) { - if (IconManager.isSvgIcon(value)) { + if (PluginIconManager.isSvgIcon(value)) { // 默认字符串提供正常图和灰化图 - addIcon(new PluginSvgIconSource(key, + addIcon(new SvgIconSource(key, base + value, - IconManager.findDisablePath(base + value), + PluginIconManager.findDisablePath(base + value), null )); - } else if (IconManager.isImageIcon(value)) { - addIcon(new PluginImageIconSource(key, base + value)); + } else if (PluginIconManager.isImageIcon(value)) { + addIcon(new ImageIconSource(key, base + value)); } // 其他无法识别格式不处理 } @@ -88,14 +90,14 @@ public class PluginIconSet extends AbstractIconSet { String disablePath = (String) value.get(IconType.disable.name()); String whitePath = (String) value.get(IconType.white.name()); // 暂不支持混合格式,每个id的格式需要保持一致 - if (IconManager.isSvgIcon(normalPath)) { - addIcon(new PluginSvgIconSource(key, + if (PluginIconManager.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 PluginImageIconSource(key, + } else if (PluginIconManager.isImageIcon(normalPath)) { + addIcon(new ImageIconSource(key, base + normalPath, StringUtils.isNotBlank(disablePath) ? base + disablePath : null, StringUtils.isNotBlank(whitePath) ? base + whitePath : null @@ -110,9 +112,9 @@ public class PluginIconSet extends AbstractIconSet { public void addIconWithMap(Map iconId2Path) { for (Map.Entry entry: iconId2Path.entrySet()) { if (PluginIconManager.isSvgIcon(entry.getValue())) { - addIcon(new PluginSvgIconSource(entry.getKey(), entry.getValue())); + addIcon(new SvgIconSource(entry.getKey(), entry.getValue())); } else if (PluginIconManager.isImageIcon(entry.getValue())) { - addIcon(new PluginImageIconSource(entry.getKey(), entry.getValue())); + addIcon(new ImageIconSource(entry.getKey(), entry.getValue())); } } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java index c6ac211335..9cb11e567e 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java @@ -6,6 +6,7 @@ import com.fine.theme.icon.IconType; import com.fine.theme.icon.Identifiable; import com.fine.theme.icon.WhiteIcon; import com.fr.design.fun.impl.AbstractLazyIconProvider; +import com.fr.stable.AssistUtils; import org.jetbrains.annotations.NotNull; import javax.swing.Icon; @@ -16,6 +17,13 @@ import java.util.StringJoiner; import static com.fine.theme.utils.FineUIScale.scale; +/** + * 插件图标加载类 + * + * @author lemon + * @since + * Created on 2024/08/23 + */ public class PluginLazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { @NotNull private final String id; @@ -28,7 +36,7 @@ public class PluginLazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Ic /** * - * @param source {@link AbstractLazyIconProvider#source()} + * @param source {@link AbstractLazyIconProvider#pluginId()} * @param id */ public PluginLazyIcon(@NotNull final String source, @NotNull final String id) { @@ -119,11 +127,11 @@ public class PluginLazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Ic @Override public String toString() { - return new StringJoiner(", ", PluginLazyIcon.class.getSimpleName() + "[", "]") + return AssistUtils.toString(new StringJoiner(", ", PluginLazyIcon.class.getSimpleName() + "[", "]") .add("source='" + source + "'") .add("id='" + id + "'") .add("size=" + "[w=" + scale(dimension.width) + ",h=" + scale(dimension.height) + "]") .add("type=" + type) - .toString(); + .toString()); } } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java index e568f5af32..f83edb06d4 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java @@ -4,6 +4,7 @@ import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.IconManager; import com.fine.theme.light.ui.FineLightIconSet; import com.formdev.flatlaf.util.UIScale; +import com.fr.design.fun.LazyIconProvider; import com.fr.stable.StringUtils; /** @@ -32,6 +33,8 @@ public class FineDarkLaf extends FineLaf { Layouts.setScaleFactor((float) evt.getNewValue()); } }); + // dark_icon 目前还没适配,先使用 light_icon + insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); return setup(new FineDarkLaf()); } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java index edb038dd0f..f72f91e92c 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java @@ -1,9 +1,22 @@ package com.fine.theme.light.ui.laf; +import com.fine.theme.icon.UrlIconResource; +import com.fine.theme.icon.plugin.PluginIconManager; +import com.fine.theme.icon.plugin.PluginIconSet; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.SystemInfo; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.fun.LazyIconProvider; +import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralContext; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginEventType; import javax.swing.PopupFactory; +import java.util.Set; +import java.util.function.BiConsumer; /** * Fine designer new look and feel @@ -18,6 +31,21 @@ public abstract class FineLaf extends FlatLaf { private static final String NAME = "FineLaf"; + private static void handlePluginEvent(PluginEvent event, LazyIconProvider.THEME category, + BiConsumer operation) { + Set set = event.getContext().getRuntime().get(LazyIconProvider.MARK_STRING); + dealWithPluginIcon(set, category, operation); + } + + private static void dealWithPluginIcon(Set set, LazyIconProvider.THEME category, + BiConsumer operation) { + for (LazyIconProvider provider : set) { + if (!ComparatorUtils.equals(provider.themeCategory(), category)) { + continue; + } + operation.accept(provider, new PluginIconSet(new UrlIconResource(provider.jsonPath()), provider.iconId2Path())); + } + } @Override public String getName() { @@ -53,4 +81,48 @@ public abstract class FineLaf extends FlatLaf { System.setProperty("flatlaf.menuBarEmbedded", "false"); } } + + /** + * 适配插件图标 Icon + * @param category 图标 Icon 分类 {@link LazyIconProvider.THEME} + */ + public static void insertIconProvider(LazyIconProvider.THEME category) { + Set set = ExtraDesignClassManager.getInstance().getArray(LazyIconProvider.MARK_STRING); + dealWithPluginIcon(set, category, (provider, iconSet) -> PluginIconManager.addSet(provider.pluginId(), iconSet)); + listenerPlugins(category); + } + + private static void listenerPlugins(LazyIconProvider.THEME category) { + //注册插件监听 + PluginFilter filter = context -> context.contain(LazyIconProvider.MARK_STRING); + + PluginEventListener insert = new PluginEventListener() { + @Override + public void on(PluginEvent event) { + handlePluginEvent(event, category, (provider, iconSet) -> PluginIconManager.addSet(provider.pluginId(), iconSet)); + } + }; + + PluginEventListener update = new PluginEventListener() { + @Override + public void on(PluginEvent event) { + handlePluginEvent(event, category, (provider, iconSet) -> PluginIconManager.updateSet(provider.pluginId(), iconSet)); + } + }; + + PluginEventListener remove = new PluginEventListener() { + @Override + public void on(PluginEvent event) { + handlePluginEvent(event, category, (provider, iconSet) -> PluginIconManager.removeSet(provider.pluginId())); + } + }; + + GeneralContext.listenPlugin(PluginEventType.AfterRun, insert, filter); + GeneralContext.listenPlugin(PluginEventType.AfterInstall, insert, filter); + GeneralContext.listenPlugin(PluginEventType.AfterUpdate, update, filter); + GeneralContext.listenPlugin(PluginEventType.AfterActive, update, filter); + GeneralContext.listenPlugin(PluginEventType.AfterForbid, remove, filter); + GeneralContext.listenPlugin(PluginEventType.AfterUninstall, remove, filter); + } + } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java index 9e95b76f7e..fee8317f93 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -4,6 +4,7 @@ import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.IconManager; import com.fine.theme.light.ui.FineLightIconSet; import com.formdev.flatlaf.util.UIScale; +import com.fr.design.fun.LazyIconProvider; import com.fr.stable.StringUtils; /** @@ -32,6 +33,7 @@ public class FineLightLaf extends FineLaf { Layouts.setScaleFactor((float) evt.getNewValue()); } }); + insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); return setup(new FineLightLaf()); } diff --git a/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java index 93989775fe..1a9fc8095d 100644 --- a/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java @@ -17,11 +17,11 @@ public interface LazyIconProvider extends Mutable { int CURRENT_LEVEL = 1; /** - * 自定义,icon 来源标识 + * 插件 id,icon 来源标识 * * @return 来源标识 */ - String source(); + String pluginId(); /** * json 文件路径 diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java index 53002c2705..6da1316497 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java @@ -34,8 +34,8 @@ public class AbstractLazyIconProvider extends AbstractProvider implements LazyIc * @return 插件 id */ @Override - public String source() { - throw new RuntimeException("source is blank"); + public String pluginId() { + throw new RuntimeException("plugin id is blank"); } /** From c62885a7044e072f835d0d1167cef1f36827c42d Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 23 Aug 2024 18:15:32 +0800 Subject: [PATCH 03/26] =?UTF-8?q?REPORT-127437=20feat:=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81,=E5=A2=9E=E5=8A=A0=20mapSet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/icon/plugin/PluginIconManager.java | 54 +++++++++++-------- ...ginIconSet.java => PluginJsonIconSet.java} | 25 ++------- .../theme/icon/plugin/PluginLazyIcon.java | 4 +- .../theme/icon/plugin/PluginMapIconSet.java | 54 +++++++++++++++++++ .../fine/theme/light/ui/laf/FineDarkLaf.java | 4 +- .../com/fine/theme/light/ui/laf/FineLaf.java | 25 ++++++--- .../fine/theme/light/ui/laf/FineLightLaf.java | 2 +- 7 files changed, 112 insertions(+), 56 deletions(-) rename designer-base/src/main/java/com/fine/theme/icon/plugin/{PluginIconSet.java => PluginJsonIconSet.java} (82%) create mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java index 8648396f75..e0f6a822d2 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java @@ -8,6 +8,7 @@ import com.fine.theme.icon.LazyIcon; import com.fr.base.extension.FileExtension; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; +import com.fr.nx.app.web.out.widget.utils.CollectionUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,7 +16,9 @@ import javax.swing.Icon; import java.awt.Dimension; import java.lang.ref.WeakReference; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 管理插件图标集 @@ -28,8 +31,8 @@ public class PluginIconManager { public static final String ICON_DISABLE_SUFFIX = "_disable"; public static final Dimension DEFAULT_DIMENSION = new Dimension(16, 16); - private static final Map SOURCE_ICON_MAPS = new HashMap<>(2); - private static final HashMap>> CACHE = new HashMap<>(); + private static final Map> SOURCE_ICON_MAPS = new ConcurrentHashMap<>(2); + private static final Map>> CACHE = new ConcurrentHashMap<>(); /** @@ -39,10 +42,12 @@ public class PluginIconManager { * @return 图标集 */ public static IconSet getSet(String source, String id) { - IconSet set = SOURCE_ICON_MAPS.get(source); + List sets = SOURCE_ICON_MAPS.get(source); - if (set != null && set.getId().equals(id)) { - return set; + for (IconSet set : sets) { + if (set != null && set.getId().equals(id)) { + return set; + } } throw new IconException("[PluginIconManager] Can not find icon set by id: " + id); } @@ -51,25 +56,26 @@ public class PluginIconManager { * 添加图标集 * * @param source 插件 - * @param set 图标集 + * @param sets 图标集 */ - public static void addSet(@NotNull String source, @NotNull IconSet set) { + public static void addSet(@NotNull String source, @NotNull List sets) { if (SOURCE_ICON_MAPS.containsKey(source)) { FineLoggerFactory.getLogger().warn("[PluginIconManager] plugin:{} icon set already exists: " + source); } - SOURCE_ICON_MAPS.put(source, set); + SOURCE_ICON_MAPS.put(source, sets); clearCacheBySource(source); } + /** * 更新指定插件图标集 * * @param source 插件 - * @param set 图标集 + * @param sets 图标集 */ - public static void updateSet(@NotNull String source, @NotNull IconSet set) { - SOURCE_ICON_MAPS.put(source, set); - clearCacheBySource(source); + public static void updateSet(@NotNull String source, @NotNull List sets) { + removeSet(source); + addSet(source, sets); } /** @@ -120,15 +126,17 @@ public class PluginIconManager { final WeakReference reference = sourceCache.get(cacheKey); I icon = reference != null ? (I) reference.get() : null; if (icon == null) { - IconSet set = SOURCE_ICON_MAPS.get(source); - if (set == null) { + List sets = SOURCE_ICON_MAPS.get(source); + if (CollectionUtils.isEmpty(sets)) { return icon; } - Icon f = set.findIcon(id, dimension, type); - if (f != null) { - icon = (I) f; - sourceCache.put(cacheKey, new WeakReference<>(icon)); - CACHE.put(source, sourceCache); + for (IconSet set : sets) { + Icon f = set.findIcon(id, dimension, type); + if (f != null) { + icon = (I) f; + sourceCache.put(cacheKey, new WeakReference<>(icon)); + CACHE.put(source, sourceCache); + } } } return icon; @@ -178,9 +186,11 @@ public class PluginIconManager { * @return 是否存在 */ public static boolean existIcon(String id, String source) { - IconSet set = SOURCE_ICON_MAPS.get(source); - if (set != null && set.getIds().contains(id)) { - return true; + List sets = SOURCE_ICON_MAPS.get(source); + for (IconSet set : sets) { + if (set != null && set.getIds().contains(id)) { + return true; + } } return false; } diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java similarity index 82% rename from designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java rename to designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java index e2e2c13354..66c758f825 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java @@ -18,20 +18,17 @@ import java.util.Map; import java.util.Objects; /** - * 插件图标集 + * 插件 json 图标集 * * @author lemon * @since * Created on 2024/08/20 */ -public class PluginIconSet extends AbstractIconSet { +public class PluginJsonIconSet extends AbstractIconSet { private String base; - - public PluginIconSet(UrlIconResource resource, Map iconId2Path) { - addIconWithMap(iconId2Path); - + public PluginJsonIconSet(UrlIconResource resource) { if (resource.getPath() == null) { return; } @@ -105,20 +102,6 @@ public class PluginIconSet extends AbstractIconSet { } } - /** - * 根据 map 注册图标 - * @param iconId2Path key: id, value: icon path - */ - public void addIconWithMap(Map iconId2Path) { - for (Map.Entry entry: iconId2Path.entrySet()) { - if (PluginIconManager.isSvgIcon(entry.getValue())) { - addIcon(new SvgIconSource(entry.getKey(), entry.getValue())); - } else if (PluginIconManager.isImageIcon(entry.getValue())) { - addIcon(new ImageIconSource(entry.getKey(), entry.getValue())); - } - } - } - @Override public boolean equals(Object o) { if (this == o) { @@ -127,7 +110,7 @@ public class PluginIconSet extends AbstractIconSet { if (o == null || getClass() != o.getClass()) { return false; } - PluginIconSet that = (PluginIconSet) o; + PluginJsonIconSet that = (PluginJsonIconSet) o; return Objects.equals(name, that.name); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java index 9cb11e567e..8f17242505 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java @@ -127,11 +127,11 @@ public class PluginLazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Ic @Override public String toString() { - return AssistUtils.toString(new StringJoiner(", ", PluginLazyIcon.class.getSimpleName() + "[", "]") + return new StringJoiner(", ", PluginLazyIcon.class.getSimpleName() + "[", "]") .add("source='" + source + "'") .add("id='" + id + "'") .add("size=" + "[w=" + scale(dimension.width) + ",h=" + scale(dimension.height) + "]") .add("type=" + type) - .toString()); + .toString(); } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java new file mode 100644 index 0000000000..fdc32bac63 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java @@ -0,0 +1,54 @@ +package com.fine.theme.icon.plugin; + +import com.fine.theme.icon.AbstractIconSet; +import com.fine.theme.icon.img.ImageIconSource; +import com.fine.theme.icon.svg.SvgIconSource; + +import java.util.Map; +import java.util.Objects; + +/** + * 插件 map 图标集 + * + * @author lemon + * @since + * Created on 2024/08/20 + */ +public class PluginMapIconSet extends AbstractIconSet { + + public PluginMapIconSet(Map iconId2Path) { + addIconWithMap(iconId2Path); + } + + + /** + * 根据 map 注册图标 + * @param iconId2Path key: id, value: icon path + */ + public void addIconWithMap(Map iconId2Path) { + for (Map.Entry entry: iconId2Path.entrySet()) { + if (PluginIconManager.isSvgIcon(entry.getValue())) { + addIcon(new SvgIconSource(entry.getKey(), entry.getValue())); + } else if (PluginIconManager.isImageIcon(entry.getValue())) { + addIcon(new ImageIconSource(entry.getKey(), entry.getValue())); + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PluginMapIconSet that = (PluginMapIconSet) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java index f83edb06d4..f06d8ee888 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java @@ -27,14 +27,14 @@ public class FineDarkLaf extends FineLaf { */ public static boolean setup() { IconManager.addSet(new FineLightIconSet()); + // dark_icon 目前还没适配,先使用 light_icon + insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { Layouts.setScaleFactor((float) evt.getNewValue()); } }); - // dark_icon 目前还没适配,先使用 light_icon - insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); return setup(new FineDarkLaf()); } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java index f72f91e92c..f28f1e11d0 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java @@ -1,8 +1,10 @@ package com.fine.theme.light.ui.laf; +import com.fine.theme.icon.IconSet; import com.fine.theme.icon.UrlIconResource; import com.fine.theme.icon.plugin.PluginIconManager; -import com.fine.theme.icon.plugin.PluginIconSet; +import com.fine.theme.icon.plugin.PluginJsonIconSet; +import com.fine.theme.icon.plugin.PluginMapIconSet; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.SystemInfo; import com.fr.design.ExtraDesignClassManager; @@ -15,6 +17,8 @@ import com.fr.plugin.observer.PluginEventListener; import com.fr.plugin.observer.PluginEventType; import javax.swing.PopupFactory; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.function.BiConsumer; @@ -32,18 +36,23 @@ public abstract class FineLaf extends FlatLaf { private static final String NAME = "FineLaf"; private static void handlePluginEvent(PluginEvent event, LazyIconProvider.THEME category, - BiConsumer operation) { + BiConsumer> operation) { Set set = event.getContext().getRuntime().get(LazyIconProvider.MARK_STRING); dealWithPluginIcon(set, category, operation); } private static void dealWithPluginIcon(Set set, LazyIconProvider.THEME category, - BiConsumer operation) { + BiConsumer> operation) { for (LazyIconProvider provider : set) { if (!ComparatorUtils.equals(provider.themeCategory(), category)) { continue; } - operation.accept(provider, new PluginIconSet(new UrlIconResource(provider.jsonPath()), provider.iconId2Path())); + List iconSets = new ArrayList<>(); + PluginJsonIconSet jsonIconSet = new PluginJsonIconSet(new UrlIconResource(provider.jsonPath())); + iconSets.add(jsonIconSet); + PluginMapIconSet mapIconSet = new PluginMapIconSet(provider.iconId2Path()); + iconSets.add(mapIconSet); + operation.accept(provider, iconSets); } } @@ -88,7 +97,7 @@ public abstract class FineLaf extends FlatLaf { */ public static void insertIconProvider(LazyIconProvider.THEME category) { Set set = ExtraDesignClassManager.getInstance().getArray(LazyIconProvider.MARK_STRING); - dealWithPluginIcon(set, category, (provider, iconSet) -> PluginIconManager.addSet(provider.pluginId(), iconSet)); + dealWithPluginIcon(set, category, (provider, iconSets) -> PluginIconManager.addSet(provider.pluginId(), iconSets)); listenerPlugins(category); } @@ -99,21 +108,21 @@ public abstract class FineLaf extends FlatLaf { PluginEventListener insert = new PluginEventListener() { @Override public void on(PluginEvent event) { - handlePluginEvent(event, category, (provider, iconSet) -> PluginIconManager.addSet(provider.pluginId(), iconSet)); + handlePluginEvent(event, category, (provider, iconSets) -> PluginIconManager.addSet(provider.pluginId(), iconSets)); } }; PluginEventListener update = new PluginEventListener() { @Override public void on(PluginEvent event) { - handlePluginEvent(event, category, (provider, iconSet) -> PluginIconManager.updateSet(provider.pluginId(), iconSet)); + handlePluginEvent(event, category, (provider, iconSets) -> PluginIconManager.updateSet(provider.pluginId(), iconSets)); } }; PluginEventListener remove = new PluginEventListener() { @Override public void on(PluginEvent event) { - handlePluginEvent(event, category, (provider, iconSet) -> PluginIconManager.removeSet(provider.pluginId())); + handlePluginEvent(event, category, (provider, iconSets) -> PluginIconManager.removeSet(provider.pluginId())); } }; diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java index fee8317f93..08a0602d62 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -27,13 +27,13 @@ public class FineLightLaf extends FineLaf { */ public static boolean setup() { IconManager.addSet(new FineLightIconSet()); + insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { Layouts.setScaleFactor((float) evt.getNewValue()); } }); - insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); return setup(new FineLightLaf()); } From 429b1af7ad00312b90b0c2be6112903f06f2ed5f Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 26 Aug 2024 15:13:15 +0800 Subject: [PATCH 04/26] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fanruan/boot/env/DesignEnvComponent.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java index 7c9350430a..551455aeab 100644 --- a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java +++ b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java @@ -239,27 +239,27 @@ public class DesignEnvComponent { * ----------- logger -------- */ private void startLogger() { - String realPath = Carina.properties(LoggerProperties.class).getXml(); - URI uri = Log4jUtils.buildUserConfigURI(realPath); + URI uri = Log4jUtils.buildUserConfigURI(StringUtils.EMPTY); FRLogger.getLogger().config(uri); // 日志配置更新的监听在FRLogger里面,fbp去掉了但是设计器本地还是需要这个监听的,初始化的时候监听一下 listenConfig(); } private void listenConfig() { - ValidateConfigManger.getInstance().registerListener(new ConfigChangeListener() { - - @Override - public boolean accept(Class configClass) { - return configClass.equals(Log4jConfig.class); - } - - @Override - public void change() { - // The root logger is the topmost logger with a name of "" (the empty string). - Configurator.setAllLevels("", Log4jConfig.getInstance().getRootLevel()); - } - }); +// 等fbp改完,现在先配合打包注释掉 +// ValidateConfigManger.getInstance().registerListener(new ConfigChangeListener() { +// +// @Override +// public boolean accept(Class configClass) { +// return configClass.equals(Log4jConfig.class); +// } +// +// @Override +// public void change() { +// // The root logger is the topmost logger with a name of "" (the empty string). +// Configurator.setAllLevels("", Log4jConfig.getInstance().getRootLevel()); +// } +// }); } From 874b67c1151583445ca8f63548b5bb8665c47ea1 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 26 Aug 2024 15:14:32 +0800 Subject: [PATCH 05/26] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fanruan/boot/env/DesignEnvComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java index 551455aeab..95bcc301aa 100644 --- a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java +++ b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java @@ -246,7 +246,7 @@ public class DesignEnvComponent { } private void listenConfig() { -// 等fbp改完,现在先配合打包注释掉 +/// 等fbp改完,现在先配合打包注释掉 // ValidateConfigManger.getInstance().registerListener(new ConfigChangeListener() { // // @Override From 78b22dba5dce73cafd71bc015a7b8fac6e6da7c3 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 26 Aug 2024 15:28:52 +0800 Subject: [PATCH 06/26] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fanruan/boot/env/DesignFunctionComponent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fanruan/boot/env/DesignFunctionComponent.java b/designer-realize/src/main/java/com/fanruan/boot/env/DesignFunctionComponent.java index 6c584ca3a3..63de9d0d27 100644 --- a/designer-realize/src/main/java/com/fanruan/boot/env/DesignFunctionComponent.java +++ b/designer-realize/src/main/java/com/fanruan/boot/env/DesignFunctionComponent.java @@ -7,7 +7,7 @@ import com.fanruan.carina.annotions.Start; import com.fanruan.messenger.ums.config.email.FineEmailSecurityProviderImpl; import com.fr.base.email.EmailCenter; import com.fr.base.email.impl.EmailAccountManagerImpl; -import com.fr.base.email.impl.FREmailDispatcherImpl; +import com.fr.base.email.impl.EmailDispatcherImpl; import com.fr.base.email.impl.FineEmailExtensionProviderImpl; import com.fr.base.email.impl.FineEmailResourceProviderImpl; import com.fr.base.email.provider.FineEmailExtensionProvider; @@ -78,7 +78,7 @@ public class DesignFunctionComponent { fineEmailExtensionProvider, fineEmailResourceProvider, new FineEmailSecurityProviderImpl()); - EmailCenter.setDispatcher(new FREmailDispatcherImpl()); + EmailCenter.setDispatcher(new EmailDispatcherImpl()); EmailCenter.setAccountManager(new EmailAccountManagerImpl()); EmailTaskManagement.getInstance().start(); } From 91d3d558fb7a292174206eb031c6efa41d343fa0 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 30 Aug 2024 11:51:52 +0800 Subject: [PATCH 07/26] =?UTF-8?q?REPORT-127437=20fix:=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91=EF=BC=8C=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E8=B7=9F=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=85=B1=E7=94=A8=20icon?= =?UTF-8?q?=20=E5=8A=A0=E8=BD=BD=E6=96=B9=E5=BC=8F=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=8F=92=E4=BB=B6=20icon=20=E5=92=8C=20set=20?= =?UTF-8?q?=E7=9A=84=20id=20=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/IconManager.java | 33 ++- .../theme/icon/plugin/PluginIconManager.java | 223 ------------------ .../theme/icon/plugin/PluginJsonIconSet.java | 113 +-------- .../theme/icon/plugin/PluginLazyIcon.java | 137 ----------- .../theme/icon/plugin/PluginListIconSet.java | 57 +++++ .../theme/icon/plugin/PluginMapIconSet.java | 54 ----- .../fine/theme/light/ui/laf/FineDarkLaf.java | 5 +- .../com/fine/theme/light/ui/laf/FineLaf.java | 57 ++--- .../fine/theme/light/ui/laf/FineLightLaf.java | 3 +- .../com/fr/design/fun/LazyIconProvider.java | 42 ++-- .../fun/impl/AbstractLazyIconProvider.java | 19 +- 11 files changed, 142 insertions(+), 601 deletions(-) delete mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java delete mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java create mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java delete mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java index aa2ef8b173..86506c8475 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -3,6 +3,7 @@ package com.fine.theme.icon; import com.fr.base.extension.FileExtension; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; +import com.fr.nx.app.web.out.widget.utils.CollectionUtils; import com.fr.third.errorprone.annotations.Immutable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -10,8 +11,10 @@ import org.jetbrains.annotations.Nullable; import javax.swing.Icon; import java.awt.Dimension; import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; /** * 图标管理器 @@ -29,8 +32,8 @@ public class IconManager { public static final String ICON_DISABLE_SUFFIX = "_disable"; public static final Dimension DEFAULT_DIMENSION = new Dimension(16, 16); - private static final ArrayList ICON_SETS = new ArrayList<>(2); - private static final HashMap> CACHE = new HashMap<>(64); + private static final CopyOnWriteArrayList ICON_SETS = new CopyOnWriteArrayList<>(); + private static final Map> CACHE = new ConcurrentHashMap<>(64); /** @@ -123,6 +126,28 @@ public class IconManager { return id + "_" + dimension.width + "_" + dimension.height + "_" + type; } + /** + * 批量添加图标集 + * + * @param sets 图标集 + */ + public static void addSet(@NotNull List sets) { + if (CollectionUtils.isEmpty(sets)) { + return; + } + sets.forEach(IconManager::addSet); + } + + /** + * 删除指定 id 图标集 + * + * @param id 图标集ID + */ + public static void removeSet(@NotNull String id) { + ICON_SETS.removeIf(iconSet -> id.equals(iconSet.getId())); + clearCache(); + } + /** * 是否SVG图标格式 * diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java deleted file mode 100644 index e0f6a822d2..0000000000 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconManager.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.fine.theme.icon.plugin; - -import com.fine.theme.icon.IconException; -import com.fine.theme.icon.IconManager; -import com.fine.theme.icon.IconSet; -import com.fine.theme.icon.IconType; -import com.fine.theme.icon.LazyIcon; -import com.fr.base.extension.FileExtension; -import com.fr.general.IOUtils; -import com.fr.log.FineLoggerFactory; -import com.fr.nx.app.web.out.widget.utils.CollectionUtils; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.Icon; -import java.awt.Dimension; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 管理插件图标集 - * - * @author lemon - * @since - * Created on 2024/08/23 - */ -public class PluginIconManager { - - public static final String ICON_DISABLE_SUFFIX = "_disable"; - public static final Dimension DEFAULT_DIMENSION = new Dimension(16, 16); - private static final Map> SOURCE_ICON_MAPS = new ConcurrentHashMap<>(2); - private static final Map>> CACHE = new ConcurrentHashMap<>(); - - - /** - * 获取图标集 - * - * @param id 图标集ID - * @return 图标集 - */ - public static IconSet getSet(String source, String id) { - List sets = SOURCE_ICON_MAPS.get(source); - - for (IconSet set : sets) { - if (set != null && set.getId().equals(id)) { - return set; - } - } - throw new IconException("[PluginIconManager] Can not find icon set by id: " + id); - } - - /** - * 添加图标集 - * - * @param source 插件 - * @param sets 图标集 - */ - public static void addSet(@NotNull String source, @NotNull List sets) { - if (SOURCE_ICON_MAPS.containsKey(source)) { - FineLoggerFactory.getLogger().warn("[PluginIconManager] plugin:{} icon set already exists: " + source); - } - SOURCE_ICON_MAPS.put(source, sets); - clearCacheBySource(source); - } - - - /** - * 更新指定插件图标集 - * - * @param source 插件 - * @param sets 图标集 - */ - public static void updateSet(@NotNull String source, @NotNull List sets) { - removeSet(source); - addSet(source, sets); - } - - /** - * 删除指定插件图标集 - * - * @param source 插件 - */ - public static void removeSet(@NotNull String source) { - SOURCE_ICON_MAPS.remove(source); - clearCacheBySource(source); - } - - /** - * 根据图标ID获取图标 - *

- * 查找路径 - * 1)查找图集图标 - * 2)路径为图片图标,从路径再查找 - * 3)提供默认svg图标 - * - * @param id 图标ID - * @param 图标类型 - * @return 图标 - */ - @NotNull - public static I getIcon(@NotNull String source, @NotNull final String id, @NotNull Dimension dimension, @NotNull IconType type) { - Icon icon = findIcon(source, id, dimension, type); - if (icon == null) { - // 只有找不到再进行其他fallback,提升效率 - if (IconManager.isImageIcon(id)) { - return (I) fallbackLegacyIcon(id); - } else { - FineLoggerFactory.getLogger().warn("[PluginIconManager] Can not find icon by id: " + id); - return (I) new LazyIcon("default"); - } - } - return (I) icon; - } - - private static Icon fallbackLegacyIcon(String id) { - return IOUtils.readIcon(id); - } - - @Nullable - private static I findIcon(String source, String id, Dimension dimension, IconType type) { - String cacheKey = genCacheKey(source, id, dimension, type); - HashMap> sourceCache = CACHE.getOrDefault(cacheKey, new HashMap<>(64)); - final WeakReference reference = sourceCache.get(cacheKey); - I icon = reference != null ? (I) reference.get() : null; - if (icon == null) { - List sets = SOURCE_ICON_MAPS.get(source); - if (CollectionUtils.isEmpty(sets)) { - return icon; - } - for (IconSet set : sets) { - Icon f = set.findIcon(id, dimension, type); - if (f != null) { - icon = (I) f; - sourceCache.put(cacheKey, new WeakReference<>(icon)); - CACHE.put(source, sourceCache); - } - } - } - return icon; - } - - - /** - * 生成缓存key - * - * @param id id - * @param dimension 尺寸 - * @param type 图标类型 - * @return 缓存key - */ - public static @NotNull String genCacheKey(String source, String id, Dimension dimension, IconType type) { - if (DEFAULT_DIMENSION.equals(dimension)) { - return source + "_" + id + "_" + type; - } - return source + "_" + id + "_" + dimension.width + "_" + dimension.height + "_" + type; - } - - /** - * 是否SVG图标格式 - * - * @param path 路径 - * @return 是否SVG图标格式 - */ - public static boolean isSvgIcon(String path) { - return FileExtension.SVG.matchExtension(path); - } - - /** - * 是否支持的图片图标格式,目前只支持png和jpg - * - * @param path 路径 - * @return 是否支持的图片图标格式 - */ - public static boolean isImageIcon(String path) { - return FileExtension.PNG.matchExtension(path) - || FileExtension.JPG.matchExtension(path); - } - - /** - * 判断是否存在指定id的icon,非io读取行为,而是从已注册的sourceMap中遍历判断 - * - * @param id id - * @return 是否存在 - */ - public static boolean existIcon(String id, String source) { - List sets = SOURCE_ICON_MAPS.get(source); - for (IconSet set : sets) { - if (set != null && set.getIds().contains(id)) { - return true; - } - } - return false; - } - - /** - * 清理所有缓存 - */ - public static void clearCache() { - CACHE.clear(); - } - - /** - * 清楚指定插件缓存 - * @param source 插件标识 - */ - public static void clearCacheBySource(String source) { - CACHE.remove(source); - } - - /** - * 查找灰化图标 - * - * @param path 原始路径 - * @return 灰化路径 - */ - public static String findDisablePath(String path) { - int i = path.lastIndexOf('.'); - return path.substring(0, i) + ICON_DISABLE_SUFFIX + path.substring(i); - } -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java index 66c758f825..75a12c6a43 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java @@ -1,121 +1,22 @@ package com.fine.theme.icon.plugin; -import com.fine.theme.icon.AbstractIconSet; -import com.fine.theme.icon.IconType; +import com.fine.theme.icon.JsonIconSet; import com.fine.theme.icon.UrlIconResource; -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 图标集 + * json 格式参考 fine_light.icon.json + * 为了保证 插件之间,插件与设计器 icon id 的唯一性,icons key 值规则参考 {@link PluginListIconSet} * * @author lemon * @since * Created on 2024/08/20 */ -public class PluginJsonIconSet extends AbstractIconSet { - - private String base; - - public PluginJsonIconSet(UrlIconResource resource) { - if (resource.getPath() == null) { - return; - } - Map json; - try (InputStream in = resource.getInputStream()) { - try (Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { - json = (Map) 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 icons = (Map) json.get("icons"); - - for (Map.Entry icon : icons.entrySet()) { - applyIcon(icon.getKey(), icon.getValue()); - } - - } +public class PluginJsonIconSet extends JsonIconSet { - private void applyIcon(String key, Object value) { - if (value instanceof String) { - dealWithIconString(key, (String) value); - } else if (value instanceof Map) { - dealWithIconMap(key, (Map) value); - } + public PluginJsonIconSet(String id, UrlIconResource resource) { + super(resource); + this.name = id; } - private void dealWithIconString(String key, String value) { - if (PluginIconManager.isSvgIcon(value)) { - // 默认字符串提供正常图和灰化图 - addIcon(new SvgIconSource(key, - base + value, - PluginIconManager.findDisablePath(base + value), - null - )); - } else if (PluginIconManager.isImageIcon(value)) { - addIcon(new ImageIconSource(key, base + value)); - } - // 其他无法识别格式不处理 - } - - - /** - * 处理object形式的icon配置 - */ - private void dealWithIconMap(String key, Map value) { - String normalPath = (String) value.get(IconType.normal.name()); - String disablePath = (String) value.get(IconType.disable.name()); - String whitePath = (String) value.get(IconType.white.name()); - // 暂不支持混合格式,每个id的格式需要保持一致 - if (PluginIconManager.isSvgIcon(normalPath)) { - addIcon(new SvgIconSource(key, - base + normalPath, - StringUtils.isNotBlank(disablePath) ? base + disablePath : null, - StringUtils.isNotBlank(whitePath) ? base + whitePath : null - )); - } else if (PluginIconManager.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; - } - PluginJsonIconSet that = (PluginJsonIconSet) o; - return Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hashCode(name); - } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java deleted file mode 100644 index 8f17242505..0000000000 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginLazyIcon.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.fine.theme.icon.plugin; - -import com.fine.theme.icon.DisabledIcon; -import com.fine.theme.icon.IconManager; -import com.fine.theme.icon.IconType; -import com.fine.theme.icon.Identifiable; -import com.fine.theme.icon.WhiteIcon; -import com.fr.design.fun.impl.AbstractLazyIconProvider; -import com.fr.stable.AssistUtils; -import org.jetbrains.annotations.NotNull; - -import javax.swing.Icon; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.util.StringJoiner; - -import static com.fine.theme.utils.FineUIScale.scale; - -/** - * 插件图标加载类 - * - * @author lemon - * @since - * Created on 2024/08/23 - */ -public class PluginLazyIcon implements Identifiable, DisabledIcon, WhiteIcon, Icon { - @NotNull - private final String id; - - private final Dimension dimension; - - private final IconType type; - - private final String source; - - /** - * - * @param source {@link AbstractLazyIconProvider#pluginId()} - * @param id - */ - public PluginLazyIcon(@NotNull final String source, @NotNull final String id) { - this.id = id; - this.dimension = IconManager.DEFAULT_DIMENSION; - this.type = IconType.normal; - this.source = source; - } - - public PluginLazyIcon(@NotNull final String source, @NotNull final String id, int side) { - this.id = id; - this.dimension = new Dimension(side, side); - this.type = IconType.normal; - this.source = source; - } - - public PluginLazyIcon(@NotNull final String source, @NotNull final String id, @NotNull Dimension dimension) { - this.id = id; - this.dimension = dimension; - this.type = IconType.normal; - this.source = source; - } - - private PluginLazyIcon(@NotNull final String source, @NotNull final String id, @NotNull IconType type) { - this.id = id; - this.dimension = IconManager.DEFAULT_DIMENSION; - this.type = type; - this.source = source; - } - - public PluginLazyIcon(@NotNull final String source, @NotNull final String id, @NotNull Dimension dimension, @NotNull IconType type) { - this.id = id; - this.dimension = dimension; - this.type = type; - this.source = source; - } - - - @NotNull - @Override - public String getId() { - return id; - } - - @Override - public void paintIcon(@NotNull final Component c, @NotNull final Graphics g, final int x, final int y) { - getIcon().paintIcon(c, g, x, y); - } - - @Override - public int getIconWidth() { - return scale(dimension.width); - } - - @Override - public int getIconHeight() { - return scale(dimension.height); - } - - - @NotNull - public I getIcon() { - return PluginIconManager.getIcon(source, getId(), dimension, type); - } - - /** - * 创建一份灰化图标 - * - * @return 灰化图标 - */ - @NotNull - @Override - public Icon disabled() { - return new PluginLazyIcon(source, getId(), dimension, IconType.disable); - } - - /** - * 创建一份白化图标 - * - * @return 白化图标 - */ - @NotNull - @Override - public Icon white() { - return new PluginLazyIcon(source, getId(), dimension, IconType.white); - } - - - @Override - public String toString() { - return new StringJoiner(", ", PluginLazyIcon.class.getSimpleName() + "[", "]") - .add("source='" + source + "'") - .add("id='" + id + "'") - .add("size=" + "[w=" + scale(dimension.width) + ",h=" + scale(dimension.height) + "]") - .add("type=" + type) - .toString(); - } -} diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java new file mode 100644 index 0000000000..4034ef01ef --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java @@ -0,0 +1,57 @@ +package com.fine.theme.icon.plugin; + +import com.fine.theme.icon.AbstractIconSet; +import com.fine.theme.icon.IconManager; +import com.fine.theme.icon.img.ImageIconSource; +import com.fine.theme.icon.svg.SvgIconSource; + +import java.util.List; +import java.util.Objects; + +/** + * 插件 map 图标集 + * 为了保证 插件之间,插件与设计器 icon id 的唯一性,以图标 path 为 id 进行注册 + * + * @author lemon + * @since + * Created on 2024/08/20 + */ +public class PluginListIconSet extends AbstractIconSet { + + public PluginListIconSet(String id, List icons) { + this.name = id; + addIconWithList(icons); + } + + + /** + * 根据 list 注册图标 + * @param icons icon path list + */ + public void addIconWithList(List icons) { + for (String path : icons) { + if (IconManager.isSvgIcon(path)) { + addIcon(new SvgIconSource(path, path)); + } else if (IconManager.isImageIcon(path)) { + addIcon(new ImageIconSource(path, path)); + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PluginListIconSet that = (PluginListIconSet) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java deleted file mode 100644 index fdc32bac63..0000000000 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginMapIconSet.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.fine.theme.icon.plugin; - -import com.fine.theme.icon.AbstractIconSet; -import com.fine.theme.icon.img.ImageIconSource; -import com.fine.theme.icon.svg.SvgIconSource; - -import java.util.Map; -import java.util.Objects; - -/** - * 插件 map 图标集 - * - * @author lemon - * @since - * Created on 2024/08/20 - */ -public class PluginMapIconSet extends AbstractIconSet { - - public PluginMapIconSet(Map iconId2Path) { - addIconWithMap(iconId2Path); - } - - - /** - * 根据 map 注册图标 - * @param iconId2Path key: id, value: icon path - */ - public void addIconWithMap(Map iconId2Path) { - for (Map.Entry entry: iconId2Path.entrySet()) { - if (PluginIconManager.isSvgIcon(entry.getValue())) { - addIcon(new SvgIconSource(entry.getKey(), entry.getValue())); - } else if (PluginIconManager.isImageIcon(entry.getValue())) { - addIcon(new ImageIconSource(entry.getKey(), entry.getValue())); - } - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - PluginMapIconSet that = (PluginMapIconSet) o; - return Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hashCode(name); - } -} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java index f06d8ee888..df1c597d46 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java @@ -4,7 +4,6 @@ import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.IconManager; import com.fine.theme.light.ui.FineLightIconSet; import com.formdev.flatlaf.util.UIScale; -import com.fr.design.fun.LazyIconProvider; import com.fr.stable.StringUtils; /** @@ -27,14 +26,14 @@ public class FineDarkLaf extends FineLaf { */ public static boolean setup() { IconManager.addSet(new FineLightIconSet()); - // dark_icon 目前还没适配,先使用 light_icon - insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { Layouts.setScaleFactor((float) evt.getNewValue()); } }); + // dark_icon 目前还没适配,先使用 light_icon + listenPluginIcons(false); return setup(new FineDarkLaf()); } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java index f28f1e11d0..a005aa1c4c 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java @@ -1,16 +1,15 @@ package com.fine.theme.light.ui.laf; +import com.fine.theme.icon.IconManager; import com.fine.theme.icon.IconSet; import com.fine.theme.icon.UrlIconResource; -import com.fine.theme.icon.plugin.PluginIconManager; import com.fine.theme.icon.plugin.PluginJsonIconSet; -import com.fine.theme.icon.plugin.PluginMapIconSet; +import com.fine.theme.icon.plugin.PluginListIconSet; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.SystemInfo; -import com.fr.design.ExtraDesignClassManager; import com.fr.design.fun.LazyIconProvider; -import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; +import com.fr.nx.app.web.out.widget.utils.CollectionUtils; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; @@ -35,27 +34,36 @@ public abstract class FineLaf extends FlatLaf { private static final String NAME = "FineLaf"; - private static void handlePluginEvent(PluginEvent event, LazyIconProvider.THEME category, + private static void handlePluginEvent(PluginEvent event, boolean isDark, BiConsumer> operation) { Set set = event.getContext().getRuntime().get(LazyIconProvider.MARK_STRING); - dealWithPluginIcon(set, category, operation); + dealWithPluginIcon(set, isDark, operation); } - private static void dealWithPluginIcon(Set set, LazyIconProvider.THEME category, + private static void dealWithPluginIcon(Set set, boolean isDark, BiConsumer> operation) { for (LazyIconProvider provider : set) { - if (!ComparatorUtils.equals(provider.themeCategory(), category)) { + if (provider.isDark() != isDark) { continue; } - List iconSets = new ArrayList<>(); - PluginJsonIconSet jsonIconSet = new PluginJsonIconSet(new UrlIconResource(provider.jsonPath())); - iconSets.add(jsonIconSet); - PluginMapIconSet mapIconSet = new PluginMapIconSet(provider.iconId2Path()); - iconSets.add(mapIconSet); + List iconSets = generatePluginIconSet(provider); operation.accept(provider, iconSets); } } + private static List generatePluginIconSet(LazyIconProvider provider) { + List iconSets = new ArrayList<>(); + if (provider.jsonPath() != null) { + PluginJsonIconSet jsonIconSet = new PluginJsonIconSet(provider.id(), new UrlIconResource(provider.jsonPath())); + iconSets.add(jsonIconSet); + } + if (CollectionUtils.isNotEmpty(provider.icons())) { + PluginListIconSet listIconSet = new PluginListIconSet(provider.id(), provider.icons()); + iconSets.add(listIconSet); + } + return iconSets; + } + @Override public String getName() { return NAME; @@ -93,43 +101,28 @@ public abstract class FineLaf extends FlatLaf { /** * 适配插件图标 Icon - * @param category 图标 Icon 分类 {@link LazyIconProvider.THEME} + * @param isDark 图标 Icon 主题,light 或者 dark */ - public static void insertIconProvider(LazyIconProvider.THEME category) { - Set set = ExtraDesignClassManager.getInstance().getArray(LazyIconProvider.MARK_STRING); - dealWithPluginIcon(set, category, (provider, iconSets) -> PluginIconManager.addSet(provider.pluginId(), iconSets)); - listenerPlugins(category); - } - - private static void listenerPlugins(LazyIconProvider.THEME category) { + public static void listenPluginIcons(boolean isDark) { //注册插件监听 PluginFilter filter = context -> context.contain(LazyIconProvider.MARK_STRING); PluginEventListener insert = new PluginEventListener() { @Override public void on(PluginEvent event) { - handlePluginEvent(event, category, (provider, iconSets) -> PluginIconManager.addSet(provider.pluginId(), iconSets)); - } - }; - - PluginEventListener update = new PluginEventListener() { - @Override - public void on(PluginEvent event) { - handlePluginEvent(event, category, (provider, iconSets) -> PluginIconManager.updateSet(provider.pluginId(), iconSets)); + handlePluginEvent(event, isDark, (provider, iconSets) -> IconManager.addSet(iconSets)); } }; PluginEventListener remove = new PluginEventListener() { @Override public void on(PluginEvent event) { - handlePluginEvent(event, category, (provider, iconSets) -> PluginIconManager.removeSet(provider.pluginId())); + handlePluginEvent(event, isDark, (provider, iconSets) -> IconManager.removeSet(provider.id())); } }; GeneralContext.listenPlugin(PluginEventType.AfterRun, insert, filter); GeneralContext.listenPlugin(PluginEventType.AfterInstall, insert, filter); - GeneralContext.listenPlugin(PluginEventType.AfterUpdate, update, filter); - GeneralContext.listenPlugin(PluginEventType.AfterActive, update, filter); GeneralContext.listenPlugin(PluginEventType.AfterForbid, remove, filter); GeneralContext.listenPlugin(PluginEventType.AfterUninstall, remove, filter); } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java index 08a0602d62..5acb9a7a04 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -4,7 +4,6 @@ import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.IconManager; import com.fine.theme.light.ui.FineLightIconSet; import com.formdev.flatlaf.util.UIScale; -import com.fr.design.fun.LazyIconProvider; import com.fr.stable.StringUtils; /** @@ -27,13 +26,13 @@ public class FineLightLaf extends FineLaf { */ public static boolean setup() { IconManager.addSet(new FineLightIconSet()); - insertIconProvider(LazyIconProvider.THEME.LIGHT_ICON); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { Layouts.setScaleFactor((float) evt.getNewValue()); } }); + listenPluginIcons(false); return setup(new FineLightLaf()); } diff --git a/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java index 1a9fc8095d..edde0535e6 100644 --- a/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java @@ -2,7 +2,7 @@ package com.fr.design.fun; import com.fr.stable.fun.mark.Mutable; -import java.util.Map; +import java.util.List; /** * 插件图标适配接口 @@ -13,6 +13,8 @@ import java.util.Map; */ public interface LazyIconProvider extends Mutable { String MARK_STRING = "LazyIconProvider"; + String DARK_SUFFIX = "_dark"; + String LIGHT_SUFFIX = "_light"; int CURRENT_LEVEL = 1; @@ -30,39 +32,25 @@ public interface LazyIconProvider extends Mutable { */ String jsonPath(); - /** - * 图标所属主题分类 - * - * @return 主题类别 - */ - THEME themeCategory(); - /** * 构建需要注册的图标 key: id, value: icon path * @return map */ - Map iconId2Path(); + List icons(); /** - * 图标主题 + * 主题类别 light, dark + * @return 是否是 dark */ - enum THEME { - - /** - * light_icon - */ - LIGHT_ICON("light_icon"), + boolean isDark(); - /** - * dark_icon - */ - DARK_ICON("dark_icon") - ; - - final String category; - THEME(String category) { - this.category = category; - } + /** + * 插件注册的 iconSet id 根据主题设置为 pluginId_light 或者 pluginId_dark + * 同种主题内部的 iconSet id 不做区分 + * @return iconSet id + */ + default String id() { + String suffix = isDark() ? DARK_SUFFIX : LIGHT_SUFFIX; + return pluginId() + suffix; } - } diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java index 6da1316497..187b9deecd 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java @@ -4,9 +4,7 @@ import com.fr.design.fun.LazyIconProvider; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.Map; +import java.util.List; /** @@ -49,23 +47,18 @@ public class AbstractLazyIconProvider extends AbstractProvider implements LazyIc } /** - * 图标主题 {@link THEME} + * 直接注册图标:元素是 icon path * - * @return 主题类别 + * @return list */ @Override - public THEME themeCategory() { + public List icons() { return null; } - /** - * 直接注册图标:key 是 icon id, value 是 icon path - * - * @return map - */ @Override - public Map iconId2Path() { - return null; + public boolean isDark() { + return false; } } From 0bb4343b654ebfa79702fea161139bba49293ae4 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 4 Sep 2024 19:02:59 +0800 Subject: [PATCH 08/26] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fanruan/boot/pre/DesignPreStartComponent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java b/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java index eca6315272..06459b8fe3 100644 --- a/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java +++ b/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java @@ -61,7 +61,7 @@ import com.fr.tenant.config.TenantConfigProvider; import com.fr.tenant.context.CurrentTenantProviderStater; import com.fr.tenant.context.TenantContext; import com.fr.tenant.context.provider.CurrentTenantKey; -import com.fr.tenant.store.impl.DefaultTenantStorage; +import com.fr.tenant.store.impl.MemoryTenantStorage; import com.fr.workspace.WorkContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -208,7 +208,7 @@ public class DesignPreStartComponent { private void startTenant() { - TenantContext.registerStorage(new DefaultTenantStorage()); + TenantContext.registerStorage(new MemoryTenantStorage()); TenantContext.registerConfigProvider(new TenantConfigProvider() { @Override public boolean isMultiTenantOpen() { From 9513c664c4be44cee200967fb9acc9230d88fa54 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 6 Sep 2024 15:57:08 +0800 Subject: [PATCH 09/26] =?UTF-8?q?REPORT-127437=20fix:=20=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E9=80=82=E9=85=8D=E4=BB=A3=E7=A0=81=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/IconManager.java | 55 +++++++- .../fine/theme/icon/plugin/PluginIconSet.java | 127 ++++++++++++++++++ .../theme/icon/plugin/PluginJsonIconSet.java | 22 --- .../theme/icon/plugin/PluginListIconSet.java | 57 -------- .../fine/theme/light/ui/laf/FineDarkLaf.java | 5 +- .../com/fine/theme/light/ui/laf/FineLaf.java | 74 ---------- .../fine/theme/light/ui/laf/FineLightLaf.java | 4 +- .../com/fr/design/fun/LazyIconProvider.java | 31 +---- .../fun/impl/AbstractLazyIconProvider.java | 21 ++- .../mainframe/toolbar/LookAndFeelAction.java | 3 + 10 files changed, 195 insertions(+), 204 deletions(-) create mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java delete mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java delete mode 100644 designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java index 86506c8475..48f7660b2b 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -1,5 +1,8 @@ package com.fine.theme.icon; +import com.fine.theme.icon.plugin.PluginIconSet; +import com.fine.theme.light.ui.FineLightIconSet; +import com.formdev.flatlaf.FlatLaf; import com.fr.base.extension.FileExtension; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; @@ -9,12 +12,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.Icon; +import javax.swing.LookAndFeel; +import javax.swing.UIManager; import java.awt.Dimension; import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; /** * 图标管理器 @@ -29,11 +33,41 @@ import java.util.concurrent.CopyOnWriteArrayList; */ @Immutable public class IconManager { - public static final String ICON_DISABLE_SUFFIX = "_disable"; public static final Dimension DEFAULT_DIMENSION = new Dimension(16, 16); - private static final CopyOnWriteArrayList ICON_SETS = new CopyOnWriteArrayList<>(); - private static final Map> CACHE = new ConcurrentHashMap<>(64); + private static final ArrayList ICON_SETS = new ArrayList<>(); + private static final HashMap> CACHE = new HashMap<>(64); + + /** + * 初始化 Icon:FineIcon、PluginIcon + */ + public static void initializeIcon() { + addIconSet(); + } + + /** + * 切换 Icon + */ + public static void updateIcon() { + ICON_SETS.clear(); + clearCache(); + addIconSet(); + } + + private static void addIconSet() { + boolean dark = false; + LookAndFeel laf = UIManager.getLookAndFeel(); + if (laf instanceof FlatLaf) { + dark = ((FlatLaf) laf).isDark(); + } + if (dark) { + // dark 主题还没适配 + addSet(new FineLightIconSet()); + } else { + addSet(new FineLightIconSet()); + } + addSet(new PluginIconSet()); + } /** @@ -43,10 +77,17 @@ public class IconManager { * @return 图标集 */ public static IconSet getSet(String id) { + IconSet iconSet = null; for (IconSet set : ICON_SETS) { if (set.getId().equals(id)) { - return set; + iconSet = set; } + if (set instanceof PluginIconSet && iconSet == null) { + iconSet = PluginIconSet.getIconSet(id); + } + } + if (iconSet != null) { + return iconSet; } throw new IconException("[IconManager] Can not find icon set by id: " + id); } diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java new file mode 100644 index 0000000000..39d8c04112 --- /dev/null +++ b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginIconSet.java @@ -0,0 +1,127 @@ +package com.fine.theme.icon.plugin; + +import com.fine.theme.icon.AbstractIconSet; +import com.fine.theme.icon.IconSet; +import com.fine.theme.icon.IconType; +import com.fine.theme.icon.JsonIconSet; +import com.fine.theme.icon.UrlIconResource; +import com.formdev.flatlaf.FlatLaf; +import com.fr.design.fun.LazyIconProvider; +import com.fr.general.GeneralContext; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.plugin.observer.PluginEventType; +import com.fr.stable.AssistUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.Icon; +import javax.swing.LookAndFeel; +import javax.swing.UIManager; +import java.awt.Dimension; +import java.util.ArrayList; +import java.util.Set; +import java.util.function.Consumer; + + +/** + * 管理插件 iconSet + * @author lemon + * @since + * Created on + */ +public class PluginIconSet extends AbstractIconSet { + + private static final String NAME = "Plugin Icon Set"; + private static final ArrayList PLUGIN_ICON_SETS = new ArrayList<>(); + + public PluginIconSet() { + name = NAME; + listenPluginIcons(); + } + + /** + * 适配插件图标 Icon + */ + public static void listenPluginIcons() { + //注册插件监听 + PluginFilter filter = context -> context.contain(LazyIconProvider.MARK_STRING); + + PluginEventListener insert = new PluginEventListener() { + @Override + public void on(PluginEvent event) { + handlePluginEvent(event, (provider) -> PLUGIN_ICON_SETS.add(generateJsonIconSet(provider))); + } + }; + + PluginEventListener remove = new PluginEventListener() { + @Override + public void on(PluginEvent event) { + handlePluginEvent(event, (provider) -> PLUGIN_ICON_SETS.removeIf(iconSet -> iconSet.getId().equals(provider.pluginId()))); + } + }; + + GeneralContext.listenPlugin(PluginEventType.AfterRun, insert, filter); + GeneralContext.listenPlugin(PluginEventType.AfterInstall, insert, filter); + GeneralContext.listenPlugin(PluginEventType.AfterForbid, remove, filter); + GeneralContext.listenPlugin(PluginEventType.AfterUninstall, remove, filter); + } + + private static void handlePluginEvent(PluginEvent event, Consumer consumer) { + Set set = event.getContext().getRuntime().get(LazyIconProvider.MARK_STRING); + for (LazyIconProvider provider : set) { + consumer.accept(provider); + } + } + + private static JsonIconSet generateJsonIconSet(LazyIconProvider provider) { + LookAndFeel laf = UIManager.getLookAndFeel(); + boolean dark = ((FlatLaf) laf).isDark(); + String jsonPath = dark ? provider.darkJsonPath() : provider.lightJsonPath(); + return new JsonIconSet(new UrlIconResource(jsonPath)) { + @Override + public @NotNull String getId() { + return provider.pluginId(); + } + }; + } + + @Override + public @Nullable Icon findIcon(@NotNull String id, @NotNull Dimension dimension, IconType type) { + Icon icon; + for (IconSet iconSet : PLUGIN_ICON_SETS) { + icon = iconSet.findIcon(id, dimension, type); + if (icon != null) { + return icon; + } + } + return null; + } + + /** + * 根据 id 匹配 icon set + * @param id 对于 plugin icon set, id 是 plugin_id + * @return icon set + */ + public static IconSet getIconSet(@NotNull final String id ) { + for (IconSet iconSet : PLUGIN_ICON_SETS) { + if (iconSet.getId().equals(id)) { + return iconSet; + } + } + return null; + } + + + @Override + public boolean equals(Object obj) { + return obj instanceof PluginIconSet + && AssistUtils.equals(this.name, ((PluginIconSet) obj).name); + } + + @Override + public int hashCode() { + return AssistUtils.hashCode(name); + } +} diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java deleted file mode 100644 index 75a12c6a43..0000000000 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginJsonIconSet.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fine.theme.icon.plugin; - -import com.fine.theme.icon.JsonIconSet; -import com.fine.theme.icon.UrlIconResource; - -/** - * 插件 json 图标集 - * json 格式参考 fine_light.icon.json - * 为了保证 插件之间,插件与设计器 icon id 的唯一性,icons key 值规则参考 {@link PluginListIconSet} - * - * @author lemon - * @since - * Created on 2024/08/20 - */ -public class PluginJsonIconSet extends JsonIconSet { - - public PluginJsonIconSet(String id, UrlIconResource resource) { - super(resource); - this.name = id; - } - -} diff --git a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java deleted file mode 100644 index 4034ef01ef..0000000000 --- a/designer-base/src/main/java/com/fine/theme/icon/plugin/PluginListIconSet.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.fine.theme.icon.plugin; - -import com.fine.theme.icon.AbstractIconSet; -import com.fine.theme.icon.IconManager; -import com.fine.theme.icon.img.ImageIconSource; -import com.fine.theme.icon.svg.SvgIconSource; - -import java.util.List; -import java.util.Objects; - -/** - * 插件 map 图标集 - * 为了保证 插件之间,插件与设计器 icon id 的唯一性,以图标 path 为 id 进行注册 - * - * @author lemon - * @since - * Created on 2024/08/20 - */ -public class PluginListIconSet extends AbstractIconSet { - - public PluginListIconSet(String id, List icons) { - this.name = id; - addIconWithList(icons); - } - - - /** - * 根据 list 注册图标 - * @param icons icon path list - */ - public void addIconWithList(List icons) { - for (String path : icons) { - if (IconManager.isSvgIcon(path)) { - addIcon(new SvgIconSource(path, path)); - } else if (IconManager.isImageIcon(path)) { - addIcon(new ImageIconSource(path, path)); - } - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - PluginListIconSet that = (PluginListIconSet) o; - return Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hashCode(name); - } -} diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java index df1c597d46..0af36de488 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineDarkLaf.java @@ -2,7 +2,6 @@ package com.fine.theme.light.ui.laf; import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.IconManager; -import com.fine.theme.light.ui.FineLightIconSet; import com.formdev.flatlaf.util.UIScale; import com.fr.stable.StringUtils; @@ -25,15 +24,13 @@ public class FineDarkLaf extends FineLaf { * @return 是否安装成功 */ public static boolean setup() { - IconManager.addSet(new FineLightIconSet()); + IconManager.initializeIcon(); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { Layouts.setScaleFactor((float) evt.getNewValue()); } }); - // dark_icon 目前还没适配,先使用 light_icon - listenPluginIcons(false); return setup(new FineDarkLaf()); } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java index a005aa1c4c..aa67a7d2ca 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLaf.java @@ -1,25 +1,9 @@ package com.fine.theme.light.ui.laf; -import com.fine.theme.icon.IconManager; -import com.fine.theme.icon.IconSet; -import com.fine.theme.icon.UrlIconResource; -import com.fine.theme.icon.plugin.PluginJsonIconSet; -import com.fine.theme.icon.plugin.PluginListIconSet; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.SystemInfo; -import com.fr.design.fun.LazyIconProvider; -import com.fr.general.GeneralContext; -import com.fr.nx.app.web.out.widget.utils.CollectionUtils; -import com.fr.plugin.manage.PluginFilter; -import com.fr.plugin.observer.PluginEvent; -import com.fr.plugin.observer.PluginEventListener; -import com.fr.plugin.observer.PluginEventType; import javax.swing.PopupFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.function.BiConsumer; /** * Fine designer new look and feel @@ -34,36 +18,6 @@ public abstract class FineLaf extends FlatLaf { private static final String NAME = "FineLaf"; - private static void handlePluginEvent(PluginEvent event, boolean isDark, - BiConsumer> operation) { - Set set = event.getContext().getRuntime().get(LazyIconProvider.MARK_STRING); - dealWithPluginIcon(set, isDark, operation); - } - - private static void dealWithPluginIcon(Set set, boolean isDark, - BiConsumer> operation) { - for (LazyIconProvider provider : set) { - if (provider.isDark() != isDark) { - continue; - } - List iconSets = generatePluginIconSet(provider); - operation.accept(provider, iconSets); - } - } - - private static List generatePluginIconSet(LazyIconProvider provider) { - List iconSets = new ArrayList<>(); - if (provider.jsonPath() != null) { - PluginJsonIconSet jsonIconSet = new PluginJsonIconSet(provider.id(), new UrlIconResource(provider.jsonPath())); - iconSets.add(jsonIconSet); - } - if (CollectionUtils.isNotEmpty(provider.icons())) { - PluginListIconSet listIconSet = new PluginListIconSet(provider.id(), provider.icons()); - iconSets.add(listIconSet); - } - return iconSets; - } - @Override public String getName() { return NAME; @@ -99,32 +53,4 @@ public abstract class FineLaf extends FlatLaf { } } - /** - * 适配插件图标 Icon - * @param isDark 图标 Icon 主题,light 或者 dark - */ - public static void listenPluginIcons(boolean isDark) { - //注册插件监听 - PluginFilter filter = context -> context.contain(LazyIconProvider.MARK_STRING); - - PluginEventListener insert = new PluginEventListener() { - @Override - public void on(PluginEvent event) { - handlePluginEvent(event, isDark, (provider, iconSets) -> IconManager.addSet(iconSets)); - } - }; - - PluginEventListener remove = new PluginEventListener() { - @Override - public void on(PluginEvent event) { - handlePluginEvent(event, isDark, (provider, iconSets) -> IconManager.removeSet(provider.id())); - } - }; - - GeneralContext.listenPlugin(PluginEventType.AfterRun, insert, filter); - GeneralContext.listenPlugin(PluginEventType.AfterInstall, insert, filter); - GeneralContext.listenPlugin(PluginEventType.AfterForbid, remove, filter); - GeneralContext.listenPlugin(PluginEventType.AfterUninstall, remove, filter); - } - } diff --git a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java index 5acb9a7a04..5ccc51a8b1 100644 --- a/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java +++ b/designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java @@ -2,7 +2,6 @@ package com.fine.theme.light.ui.laf; import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.IconManager; -import com.fine.theme.light.ui.FineLightIconSet; import com.formdev.flatlaf.util.UIScale; import com.fr.stable.StringUtils; @@ -25,14 +24,13 @@ public class FineLightLaf extends FineLaf { * @return 是否安装成功 */ public static boolean setup() { - IconManager.addSet(new FineLightIconSet()); + IconManager.initializeIcon(); Layouts.setScaleFactor(UIScale.getUserScaleFactor()); UIScale.addPropertyChangeListener(evt -> { if (StringUtils.equals(evt.getPropertyName(), USER_SCALE_FACTOR)) { Layouts.setScaleFactor((float) evt.getNewValue()); } }); - listenPluginIcons(false); return setup(new FineLightLaf()); } diff --git a/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java index edde0535e6..f51a2323d7 100644 --- a/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/LazyIconProvider.java @@ -2,8 +2,6 @@ package com.fr.design.fun; import com.fr.stable.fun.mark.Mutable; -import java.util.List; - /** * 插件图标适配接口 * @@ -13,8 +11,6 @@ import java.util.List; */ public interface LazyIconProvider extends Mutable { String MARK_STRING = "LazyIconProvider"; - String DARK_SUFFIX = "_dark"; - String LIGHT_SUFFIX = "_light"; int CURRENT_LEVEL = 1; @@ -25,32 +21,19 @@ public interface LazyIconProvider extends Mutable { */ String pluginId(); + /** - * json 文件路径 + * light 主题 * * @return 图标注册 json 路径 */ - String jsonPath(); - - /** - * 构建需要注册的图标 key: id, value: icon path - * @return map - */ - List icons(); + String lightJsonPath(); /** - * 主题类别 light, dark - * @return 是否是 dark + * dark 主题 + * + * @return 图标注册 json 路径 */ - boolean isDark(); + String darkJsonPath(); - /** - * 插件注册的 iconSet id 根据主题设置为 pluginId_light 或者 pluginId_dark - * 同种主题内部的 iconSet id 不做区分 - * @return iconSet id - */ - default String id() { - String suffix = isDark() ? DARK_SUFFIX : LIGHT_SUFFIX; - return pluginId() + suffix; - } } diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java index 187b9deecd..916a100923 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractLazyIconProvider.java @@ -15,7 +15,7 @@ import java.util.List; * Created on */ @API(level = LazyIconProvider.CURRENT_LEVEL) -public class AbstractLazyIconProvider extends AbstractProvider implements LazyIconProvider { +public abstract class AbstractLazyIconProvider extends AbstractProvider implements LazyIconProvider { /** * 当前接口的API等级,用于判断是否需要升级插件 @@ -37,28 +37,23 @@ public class AbstractLazyIconProvider extends AbstractProvider implements LazyIc } /** - * 通过 json 注册图标 + * light 主题 * * @return 图标注册 json 路径 */ @Override - public String jsonPath() { - return null; + public String lightJsonPath() { + return ""; } /** - * 直接注册图标:元素是 icon path + * dark 主题 * - * @return list + * @return 图标注册 json 路径 */ @Override - public List icons() { - return null; - } - - @Override - public boolean isDark() { - return false; + public String darkJsonPath() { + return ""; } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java index 613fe0a0c1..3edf09d953 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/LookAndFeelAction.java @@ -5,6 +5,7 @@ package com.fr.design.mainframe.toolbar; +import com.fine.theme.icon.IconManager; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.extras.FlatAnimatedLafChange; import com.fr.design.actions.UpdateAction; @@ -32,6 +33,8 @@ public class LookAndFeelAction extends UpdateAction { FlatAnimatedLafChange.showSnapshot(); try { UIManager.setLookAndFeel( lookAndFeel ); + // 多主题场景下,需要判断是否需要切换图标 + IconManager.updateIcon(); } catch (UnsupportedLookAndFeelException e) { throw new RuntimeException(e); } From 5c244766431942a105d58f8ea0e1e0e4eba8ebe6 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 6 Sep 2024 16:00:27 +0800 Subject: [PATCH 10/26] =?UTF-8?q?REPORT-127437=20fix:=20=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E4=B8=8D=E7=94=A8=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fine/theme/icon/IconManager.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java index 48f7660b2b..01f722e24b 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/IconManager.java +++ b/designer-base/src/main/java/com/fine/theme/icon/IconManager.java @@ -6,7 +6,6 @@ import com.formdev.flatlaf.FlatLaf; import com.fr.base.extension.FileExtension; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; -import com.fr.nx.app.web.out.widget.utils.CollectionUtils; import com.fr.third.errorprone.annotations.Immutable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -167,28 +166,6 @@ public class IconManager { return id + "_" + dimension.width + "_" + dimension.height + "_" + type; } - /** - * 批量添加图标集 - * - * @param sets 图标集 - */ - public static void addSet(@NotNull List sets) { - if (CollectionUtils.isEmpty(sets)) { - return; - } - sets.forEach(IconManager::addSet); - } - - /** - * 删除指定 id 图标集 - * - * @param id 图标集ID - */ - public static void removeSet(@NotNull String id) { - ICON_SETS.removeIf(iconSet -> id.equals(iconSet.getId())); - clearCache(); - } - /** * 是否SVG图标格式 * From f9e9fa0625ba2a875150c1f728d742e69d56cb3b Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 6 Sep 2024 18:41:50 +0800 Subject: [PATCH 11/26] =?UTF-8?q?REPORT-127437=20fix:=20newui=20=E8=A7=86?= =?UTF-8?q?=E8=A7=89=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/datapane/TableDataTree.java | 6 ++-- .../wrapper/ServerTableDataWrapper.java | 8 ++++- .../fr/design/file/SaveSomeTemplatePane.java | 3 -- .../gui/controlpane/JListControlPane.java | 3 +- .../com/fr/design/gui/ilist/JNameEdList.java | 6 ++-- .../fr/design/i18n/DesignSizeI18nManager.java | 3 +- .../fr/design/mainframe/DesignerFrame.java | 8 +++-- .../design/mainframe/check/CheckButton.java | 31 +++++++++++-------- .../com/fine/theme/icon/tip/waiting.svg | 4 +++ .../fine/theme/light/ui/fine_light.icon.json | 1 + .../theme/light/ui/laf/FineLaf.properties | 2 +- .../light/ui/laf/FineLightLaf.properties | 1 + .../fr/design/i18n/dimension_zh.properties | 2 +- 13 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/tip/waiting.svg diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java index ca7cb38b4b..b1877fa75e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java @@ -64,11 +64,11 @@ public class TableDataTree extends UserObjectRefreshJTree { } else if (nameObject.getObject() instanceof Integer) { int num = (Integer) nameObject.getObject(); if (num == TableDataSourceOP.SERVER_TABLE_DATA) { - this.setIcon(IconUtils.readIcon(IconPathConstants.STD_SHOW_ICON_PATH)); + this.setIcon(new LazyIcon("server_database")); } else if (num == TableDataSourceOP.STORE_PRECEDURE_DATA) { - this.setIcon(IconUtils.readIcon(IconPathConstants.SP_SHOW_ICON_PATH)); + this.setIcon(new LazyIcon("store_procedure")); } else { - this.setIcon(IconUtils.readIcon(IconPathConstants.DS_QUERY_ICON_PATH)); + this.setIcon(new LazyIcon("database")); } } else { this.setIcon(new LazyIcon("store_procedure")); diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java index fb02f1a3f8..0d7b1297ea 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java @@ -6,6 +6,8 @@ import com.fr.base.svg.SVGLoader; import com.fr.data.impl.ClassTableData; import com.fr.data.impl.DBTableData; import com.fr.data.impl.EmbeddedTableData; +import com.fr.data.impl.FileTableData; +import com.fr.data.impl.MultiTDTableData; import com.fr.data.impl.RecursionTableData; import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.icon.WarningIcon; @@ -39,7 +41,11 @@ public final class ServerTableDataWrapper extends AbstractTableDataWrapper { return new LazyIcon("tree"); } else if (tabledata instanceof StoreProcedure) { return new LazyIcon("store_procedure"); - } + } else if (tabledata instanceof FileTableData) { + return new LazyIcon("file"); + } else if (tabledata instanceof MultiTDTableData) { + return new LazyIcon("multi"); + } return new LazyIcon("server_database"); } diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index 8ee5c61fb2..1932dab3d6 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -85,9 +85,6 @@ public class SaveSomeTemplatePane extends BasicPane { templatesChoosePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); UIScrollPane scrollPane = new UIScrollPane(templatesChoosePane); scrollPane.setBorder(new FineRoundBorder()); - if (SystemInfo.isWindows) { - scrollPane.getVerticalScrollBar().setUI(new UIScrollBarUI()); - } this.add(scrollPane, BorderLayout.CENTER); this.isJudgeCurrentEditingTemplate = isNeedTojudgeCurrent; } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index 7a1094ab17..a4b80242a9 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -30,6 +30,7 @@ import javax.swing.JPopupMenu; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; +import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.BorderLayout; @@ -381,7 +382,7 @@ public abstract class JListControlPane extends JControlPane implements ListContr @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - setPreferredSize(new Dimension(list.getWidth(), FineUIScale.scale(24))); + setPreferredSize(new Dimension(list.getWidth(), FineUIScale.scale(UIManager.getInt("List.cellRender.height")))); if (value instanceof ListModelElement) { ListModelElement element = ((ListModelElement) value); Nameable nameable = element.wrapper; diff --git a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java index 4c9135e151..7029fac1f8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java @@ -22,10 +22,10 @@ import java.util.Vector; public class JNameEdList extends UIList implements CellEditorListener { /** - * 原值为20,设计器图标由png替换为svg之后JNameEdList的icon大小为16x16 + * 原值为20,设计器图标由png替换为svg之后JNameEdList的icon大小为24x24 * 重命名是会出现左侧一部分带有背景色的渲染 */ - private static final int ICON_WIDTH = 16; + private static final int ICON_WIDTH = 24; private boolean editable = true; // kunsnat: 是否强制ListName是数字 (int型) @@ -240,7 +240,7 @@ public class JNameEdList extends UIList implements CellEditorListener { return false; } Rectangle rect = this.getCellBounds(index, index); - // alex:所有的JNameEdList都有Icon,空出前面20 * 20的位置就是放的Icon + // alex:所有的JNameEdList都有Icon,空出前面24 * 24的位置就是放的Icon rect.setRect(createRect(rect, getIconWidth())); editorComp.setBounds(rect); diff --git a/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java b/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java index 1dd2306b89..8b0e8739cf 100644 --- a/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java +++ b/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java @@ -1,5 +1,6 @@ package com.fr.design.i18n; +import com.fine.theme.utils.FineUIScale; import com.fr.design.dialog.BasicDialog; import com.fr.general.GeneralContext; import com.fr.locale.LocaleManager; @@ -52,6 +53,6 @@ public class DesignSizeI18nManager { if (arr.length < SPLIT_LENGTH) { return BasicDialog.DEFAULT; } - return new Dimension(Integer.parseInt(arr[WIDTH_INDEX]), Integer.parseInt(arr[HEIGHT_INDEX])); + return FineUIScale.scale(new Dimension(Integer.parseInt(arr[WIDTH_INDEX]), Integer.parseInt(arr[HEIGHT_INDEX]))); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index a4239bc64c..1417bd548a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -107,6 +107,8 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.CopyOnWriteArrayList; +import static com.fine.theme.utils.FineUIScale.scale; + public class DesignerFrame extends JFrame implements JTemplateActionListener, TargetModifiedListener { private static final String DESIGNER_FRAME_NAME = "designer_frame"; @@ -115,7 +117,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta private static final long serialVersionUID = -8732559571067484460L; - private static final int MENU_HEIGHT = 26; + private static final int MENU_HEIGHT = scale(26); private static final Integer SECOND_LAYER = 100; @@ -578,8 +580,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta closeButton.setBorder(null); int x = contentWidth - EastRegionContainerPane.getInstance().getContainerWidth() - closeMode.getIconWidth() / 2; int y = MENU_HEIGHT - closeMode.getIconHeight() / 2; - closeButton.setBounds(x, y, UIConstants.CLOSE_AUTHORITY_HEIGHT_AND_WIDTH, - UIConstants.CLOSE_AUTHORITY_HEIGHT_AND_WIDTH); + closeButton.setBounds(x, y, scale(UIConstants.CLOSE_AUTHORITY_HEIGHT_AND_WIDTH), + scale(UIConstants.CLOSE_AUTHORITY_HEIGHT_AND_WIDTH)); } /** diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java index dc502dcdf4..09170352fd 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.check; import com.fine.theme.icon.LazyIcon; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; @@ -24,7 +25,7 @@ import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; -import java.awt.FlowLayout; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; @@ -32,6 +33,10 @@ import java.awt.event.WindowEvent; import java.util.Set; import java.util.concurrent.ExecutionException; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; +import static com.fine.swing.ui.layout.Layouts.row; import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; import static javax.swing.JOptionPane.OK_CANCEL_OPTION; import static javax.swing.JOptionPane.OK_OPTION; @@ -73,7 +78,7 @@ public class CheckButton extends UIButton { } if (set.isEmpty()) { okButton.setEnabled(true); - imageLabel.setIcon(BaseUtils.readIcon("com/fr/design/images/correct.png")); + imageLabel.setIcon(new LazyIcon("success", 20)); message.setText("" + Toolkit.i18nText("Fine_Designer_Check_Font_Success") + ""); } else { if (dialog != null) { @@ -172,7 +177,7 @@ public class CheckButton extends UIButton { @Override public Void callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) { - imageLabel.setIcon(BaseUtils.readIcon("com/fr/design/images/error.png")); + imageLabel.setIcon(new LazyIcon("error", 20)); message.setText("" + Toolkit.i18nText("Fine_Designer_Check_Font_Upgrade") + ""); okButton.setEnabled(true); return null; @@ -198,16 +203,16 @@ public class CheckButton extends UIButton { dialog.setSize(DesignSizeI18nManager.getInstance().i18nDimension(this.getClass().getName())); JPanel jp = new JPanel(); JPanel upPane = new JPanel(); - JPanel downPane = new JPanel(); - imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/waiting.png")); - upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); - upPane.add(imageLabel); - upPane.add(message); - downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); - downPane.add(okButton); - jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); - jp.add(upPane); - jp.add(downPane); + JPanel downPane = new JPanel(new BorderLayout()); + imageLabel = new UILabel(new LazyIcon("waiting", 20)); + upPane.add(row(10, + column(cell(imageLabel),flex()), cell(message) + ).getComponent()); + downPane.add(okButton, BorderLayout.EAST); + jp.setLayout(new BorderLayout()); + jp.add(column(flex(), cell(upPane), flex()).getComponent()); + jp.add(downPane, BorderLayout.SOUTH); + jp.setBorder(new ScaledEmptyBorder(10, 10, 10,10)); dialog.add(jp); dialog.setResizable(false); dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(this)); diff --git a/designer-base/src/main/resources/com/fine/theme/icon/tip/waiting.svg b/designer-base/src/main/resources/com/fine/theme/icon/tip/waiting.svg new file mode 100644 index 0000000000..d28bde3384 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/tip/waiting.svg @@ -0,0 +1,4 @@ + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json index aaa6df6d59..e2dba1c4ce 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -439,6 +439,7 @@ "top": "border/top.svg", "all":"border/all.svg", "error":"tip/error.svg", + "waiting":"tip/waiting.svg", "information":"tip/information.svg", "new_information":"tip/new_information.svg", "success":"tip/success.svg", diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index 9ac0952b65..cd5d39cb54 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -26,7 +26,7 @@ ProgressBarUI=com.formdev.flatlaf.ui.FlatProgressBarUI RadioButtonUI=com.formdev.flatlaf.ui.FlatRadioButtonUI RadioButtonMenuItemUI=com.formdev.flatlaf.ui.FlatRadioButtonMenuItemUI RootPaneUI=com.formdev.flatlaf.ui.FlatRootPaneUI -ScrollBarUI=com.formdev.flatlaf.ui.FlatScrollBarUI +ScrollBarUI=com.fr.design.gui.iscrollbar.UIScrollBarUI ScrollPaneUI=com.formdev.flatlaf.ui.FlatScrollPaneUI SeparatorUI=com.formdev.flatlaf.ui.FlatSeparatorUI SliderUI=com.fine.theme.light.ui.FineSliderUI diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties index d941f77eec..22a4f0eef8 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties @@ -450,6 +450,7 @@ List.showCellFocusIndicator = false List.cellRender.background = #FFF List.cellRender.button.width = 28 List.cellRender.button.height = 24 +List.cellRender.height = 24 List.wrapper.text.fontColor = #0a1c3877 #---- Menu ---- diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties index bc6f1a8810..1e30edaf4e 100644 --- a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties @@ -1,5 +1,5 @@ # \u9ED8\u8BA4\u4E3A\u7C7B\u7684\u5168\u9650\u5B9A\u540D\uFF08\u53EF\u81EA\u5B9A\u4E49key\uFF09= width * height -com.fr.design.mainframe.check.CheckButton=250*118 +com.fr.design.mainframe.check.CheckButton=360*160 com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=360*185 com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=325*31 com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=360*280 From 537286eb3008f64de61f8aeb43d3ec12bdc2d1ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 6 Sep 2024 18:46:36 +0800 Subject: [PATCH 12/26] =?UTF-8?q?REPORT-132393=20&=20REPORT-133561=20fix?= =?UTF-8?q?=EF=BC=9ANewUI=20=E4=BF=AE=E5=A4=8D=E5=9B=BE=E6=A0=87=E9=97=AE?= =?UTF-8?q?=E9=A2=98&=E5=9B=BE=E8=A1=A8=E5=8C=BA=E5=9F=9F=E9=81=97?= =?UTF-8?q?=E6=BC=8F=E7=BF=BB=E6=96=B0=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/itree/filetree/EnvFileTree.java | 2 +- .../gui/itree/filetree/FileTreeIcon.java | 17 ++++++-- .../icon/filetree/folder_half_authority.svg | 13 ++++++ .../filetree/folder_half_authority_open.svg | 9 ++++ .../fine/theme/light/ui/fine_light.icon.json | 4 +- .../bubble/VanChartBubbleSeriesPane.java | 17 +++----- .../bubble/component/VanChartBubblePane.java | 11 +---- .../column/VanChartColumnSeriesPane.java | 2 +- ...nChartCustomStackAndAxisConditionPane.java | 41 +++++++------------ .../VanChartAreaSeriesFillColorPane.java | 14 +++---- .../style/axis/VanChartBaseAxisPane.java | 21 ++++------ .../component/VanChartAxisButtonPane.java | 3 +- .../background/VanChartAlertValuePane.java | 39 ++++++++---------- .../VanChartAreaBackgroundPane.java | 9 ++-- .../background/VanChartAxisAreaPane.java | 3 +- .../VanChartCustomIntervalBackgroundPane.java | 29 ++++--------- .../VanChartAbstractPlotSeriesPane.java | 4 +- .../designer/data/comp/DrillMapLayerPane.java | 21 ++++------ .../designer/data/comp/MapDataTree.java | 2 - .../style/VanChartFunnelSeriesPane.java | 21 +++------- .../van/chart/map/VanChartMapSeriesPane.java | 3 +- .../label/VanChartMapLabelContentPane.java | 14 ++----- .../chart/map/designer/type/WMSLayerPane.java | 17 +++----- .../style/VanChartMultiPieSeriesPane.java | 11 +++-- .../van/chart/pie/VanChartPieSeriesPane.java | 7 ++-- .../chart/radar/VanChartRadarSeriesPane.java | 17 ++++---- .../component/GradualIntervalConfigPane.java | 11 +---- .../component/LegendLabelFormatPane.java | 15 ++----- .../style/VanChartTreeMapSeriesPane.java | 9 ++-- 29 files changed, 163 insertions(+), 223 deletions(-) create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority.svg create mode 100644 designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority_open.svg diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java index 0d11eb491f..1a14821d00 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java @@ -77,7 +77,7 @@ public class EnvFileTree extends RefreshableJTree { } this.setIcon(FileTreeIcon.getIconWithExpandAttr(node, expanded)); } else { - this.setIcon(FileTreeIcon.getFolderHalfImageIcon()); + this.setIcon(FileTreeIcon.getFolderHalfImageIcon(expanded)); } this.setText(name); } else if (userObj == PENDING) { diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java index ca26e435aa..92de91aa1e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/FileTreeIcon.java @@ -49,9 +49,10 @@ public class FileTreeIcon { public static final Icon FRM_FILE_LOCK_ICON = new LazyIcon("frm_locked"); public static final Icon FVS_FILE_LOCK_ICON = new LazyIcon("fvs_locked"); - // TODO: 以下Icon视觉暂未提供,需提供后替换 + public static final Icon FOLDER_HALF_IMAGE_ICON = new LazyIcon("folder_half_authority"); + public static final Icon FOLDER_HALF_IMAGE_ICON_OPEN = new LazyIcon("folder_half_authority_open"); + public static final Icon BLANK_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/blank.gif"); - public static final Icon FOLDER_HALF_IMAGE_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/folder_half_authority.svg"); public static final Icon CPTX_LOCKED_ICON = IconUtils.readIcon("/com/fr/design/standard/fileicon/cptx_icon_locked.svg"); public static final LockIcon FOLDER_LOCK_ICON = @@ -130,7 +131,17 @@ public class FileTreeIcon { } public static Icon getFolderHalfImageIcon() { - return FOLDER_HALF_IMAGE_ICON; + return getFolderHalfImageIcon(false); + } + + /** + * 获取文件夹有部分权限时的图标 + * + * @param isExpand 文件夹是否已打开 + * @return 图标 + */ + public static Icon getFolderHalfImageIcon(boolean isExpand) { + return isExpand ? FOLDER_HALF_IMAGE_ICON_OPEN : FOLDER_HALF_IMAGE_ICON; } /** diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority.svg new file mode 100644 index 0000000000..438cd6c89b --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority_open.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority_open.svg new file mode 100644 index 0000000000..c919f1a181 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/folder_half_authority_open.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json index aaa6df6d59..33fc126994 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json @@ -448,7 +448,9 @@ "layout_left": "layout/layout_left.svg", "layout_right": "layout/layout_right.svg", "layout_top_right": "layout/layout_top_right.svg", - "theme_edit": "theme_edit.svg" + "theme_edit": "theme_edit.svg", + "folder_half_authority" : "filetree/folder_half_authority.svg", + "folder_half_authority_open" : "filetree/folder_half_authority_open.svg" } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubbleSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubbleSeriesPane.java index 9a4e9bc795..c2993d1f17 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubbleSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubbleSeriesPane.java @@ -1,17 +1,16 @@ package com.fr.van.chart.bubble; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.plugin.chart.bubble.VanChartBubblePlot; import com.fr.plugin.chart.bubble.attr.VanChartAttrBubble; import com.fr.van.chart.bubble.component.VanChartBubblePane; import com.fr.van.chart.custom.component.VanChartCustomAxisConditionPane; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.series.VanChartColorValueSeriesPane; import com.fr.van.chart.designer.style.series.VanChartStackedAndAxisListControlPane; @@ -31,12 +30,6 @@ public class VanChartBubbleSeriesPane extends VanChartColorValueSeriesPane { } protected JPanel getContentInPlotType() { - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p, p, p, p, p, p}; - double[] col = {f}; - Component[][] components = new Component[][]{ new Component[]{createBubblePane()}, new Component[]{createStackedAndAxisPane()}, @@ -47,7 +40,7 @@ public class VanChartBubbleSeriesPane extends VanChartColorValueSeriesPane { components[2] = new Component[]{createLargeDataModelPane()}; } - contentPane = TableLayoutHelper.createTableLayoutPane(components, row, col); + contentPane = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); return contentPane; } @@ -71,13 +64,13 @@ public class VanChartBubbleSeriesPane extends VanChartColorValueSeriesPane { return Toolkit.i18nText("Fine-Design_Chart_Custom_Axis"); } }; - stackAndAxisEditExpandablePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(stackAndAxisEditPane.getPaneTitle(), stackAndAxisEditPane); + stackAndAxisEditExpandablePane = new UIExpandablePane(stackAndAxisEditPane.getPaneTitle(), stackAndAxisEditPane); return stackAndAxisEditExpandablePane; } private JPanel createBubblePane() { bubblePane = new VanChartBubblePane(); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Bubble"), bubblePane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Bubble"), bubblePane, true); } protected void populateCondition(ConditionAttr defaultAttr) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/bubble/component/VanChartBubblePane.java b/designer-chart/src/main/java/com/fr/van/chart/bubble/component/VanChartBubblePane.java index 2d95bf2727..8b3c9f44a3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bubble/component/VanChartBubblePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bubble/component/VanChartBubblePane.java @@ -1,12 +1,11 @@ package com.fr.van.chart.bubble.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.chart.UISpinnerWithPx; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.bubble.attr.VanChartAttrBubble; @@ -39,17 +38,11 @@ public class VanChartBubblePane extends BasicBeanPane { } protected JPanel getContentPane () { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p, p, p, p, p}; - double[] col = {p, f}; - - return TableLayoutHelper.createTableLayoutPane(getComponent(), row, col); + return FineLayoutBuilder.compatibleTableLayout(10, getComponent(), new double[]{1.2, 3}); } protected Component[][] getComponent () { return new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Min_Diameter")), minDiameter}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Max_Diameter")), maxDiameter}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Shadow")), shadow}, diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java index 57176c256c..7822cb3443 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnSeriesPane.java @@ -79,7 +79,7 @@ public class VanChartColumnSeriesPane extends VanChartAbstractPlotSeriesPane { isFixedWidth.addActionListener(e -> checkColumnWidth()); isFillWithImage.addActionListener(e -> checkImagePane()); - return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Filled_With_Image"), borderPane); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Filled_With_Image"), borderPane, true); } private void checkAll() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java index 86766676b4..6ff6f35b67 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java @@ -1,29 +1,26 @@ package com.fr.van.chart.column; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIUtils; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.data.condition.AbstractCondition; import com.fr.data.condition.ListCondition; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.LiteConditionPane; import com.fr.design.gui.ibutton.UIButtonGroup; -import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.plugin.chart.base.AttrSeriesStackAndAxis; import com.fr.van.chart.designer.style.series.VanChartSeriesConditionPane; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; import javax.swing.JPanel; -import javax.swing.ScrollPaneConstants; +import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; + /** * 堆积和坐标轴设置 */ @@ -42,36 +39,26 @@ public class VanChartCustomStackAndAxisConditionPane extends BasicBeanPane(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_YES"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_NO")}); isPercentStacked = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_YES"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_NO")}); - double p = TableLayout.PREFERRED; - double[] columnSize = {p, p}; - double[] rowSize = {p, p, p, p}; - return TableLayoutHelper.createTableLayoutPane(getDeployComponents(), rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, getDeployComponents(), new double[]{1.2, 3}); } protected Component[][] getDeployComponents() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartAreaSeriesFillColorPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartAreaSeriesFillColorPane.java index 241798bef3..7d4ad238f6 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartAreaSeriesFillColorPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartAreaSeriesFillColorPane.java @@ -1,14 +1,14 @@ package com.fr.van.chart.designer.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.TableLayout; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.plugin.chart.VanChartAttrHelper; import com.fr.plugin.chart.base.AttrAreaSeriesFillColorBackground; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.background.VanChartMarkerBackgroundPane; import javax.swing.JPanel; @@ -24,14 +24,9 @@ public class VanChartAreaSeriesFillColorPane extends BasicPane { private UINumberDragPane transparent; public VanChartAreaSeriesFillColorPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p}; - double[] col = {f}; fillColorPane = new VanChartMarkerBackgroundPane(){ protected Component[][] getPaneComponents() { return new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Fill_Color")), typeComboBox}, new Component[]{null, centerPane}, }; @@ -39,9 +34,10 @@ public class VanChartAreaSeriesFillColorPane extends BasicPane { }; transparent = new UINumberDragPaneWithPercent(0, 100); - JPanel transparentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha"), transparent); + JPanel transparentPane = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha")), transparent); - this.setLayout(new BorderLayout()); + this.setLayout(FRGUIPaneFactory.createScaledBorderLayout(0, 10)); this.add(fillColorPane, BorderLayout.NORTH); this.add(transparentPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java index 1c02408a3f..54445cceab 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java @@ -38,7 +38,6 @@ import com.fr.stable.Constants; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.van.chart.config.DefaultStyleHelper4Van; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartHtmlLabelPane; import com.fr.van.chart.designer.style.VanChartStylePane; import com.fr.van.chart.designer.style.axis.component.VanChartCategoryStylePaneWithCheckBox; @@ -372,19 +371,15 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { maxProportion = new UINumberDragPaneWithPercent(0, 100, 1); axisLimitSize = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Limit"), Toolkit.i18nText("Fine-Design_Chart_Not_Limit")}); - JPanel limitSizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Area_Size"), axisLimitSize); - maxProportionPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Max_Proportion"), maxProportion, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); - maxProportionPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); - JPanel panel = new JPanel(new BorderLayout()); - panel.add(limitSizePane, BorderLayout.NORTH); - panel.add(maxProportionPane, BorderLayout.CENTER); + JPanel limitSizePane = FineLayoutBuilder.createHorizontalLayout(10, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Area_Size")), axisLimitSize); + maxProportionPane = FineLayoutBuilder.createHorizontalLayout(10, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Max_Proportion")), maxProportion); + JPanel panel = column(10, + cell(limitSizePane), cell(maxProportionPane) + ).getComponent(); - axisLimitSize.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkMaxProPortionUse(); - } - }); + axisLimitSize.addActionListener(e -> checkMaxProPortionUse()); return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy"), panel, true); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java index 1664b21ecf..368c9bfddf 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java @@ -10,6 +10,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.plugin.chart.VanChartAttrHelper; @@ -56,7 +57,7 @@ public class VanChartAxisButtonPane extends BasicBeanPane { public VanChartAxisButtonPane(VanChartAxisPane vanChartAxisPane) { this.parent = vanChartAxisPane; - this.setLayout(new BorderLayout()); + this.setLayout(FRGUIPaneFactory.createScaledBorderLayout(10, 0)); addButton = new AddButton(new LazyIcon("add_popup")); JPanel eastPane = new JPanel(new BorderLayout()); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java index e4ceae7fa9..62afe15d2e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java @@ -1,5 +1,8 @@ package com.fr.van.chart.designer.style.background; +import com.fine.swing.ui.layout.Column; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.BaseFormula; import com.fr.base.Utils; import com.fr.chart.base.AttrColor; @@ -14,12 +17,8 @@ import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.chart.UISpinnerWithPx; import com.fr.design.gui.style.FRFontPane; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.ColorSelectBox; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; import com.fr.general.GeneralUtils; import com.fr.plugin.chart.VanChartAttrHelper; @@ -29,10 +28,10 @@ import com.fr.stable.Constants; import com.fr.stable.StableUtils; import com.fr.van.chart.designer.component.LineTypeComboBox; -import javax.swing.BoxLayout; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; @@ -108,26 +107,24 @@ public class VanChartAlertValuePane extends BasicBeanPane { private void doLayoutPane() { this.removeAll(); - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + this.setLayout(new BorderLayout()); + Column column = new Column(); + column.setSpacing(10); + this.add(column, BorderLayout.CENTER); + //警戒线设置 - JPanel top = FRGUIPaneFactory.createBorderLayout_L_Pane(); - this.add(top); - top.setBorder(GUICoreUtils.createTitledBorder(Toolkit.i18nText("Fine-Design_Chart_Alert_Set") + ":", null)); - top.add(createTopPane()); + Component top = FineUIUtils.wrapComponentWithTitle(createTopPane(), Toolkit.i18nText("Fine-Design_Chart_Alert_Set")); + column.add(top); + //提示文字 - JPanel bottom = FRGUIPaneFactory.createBorderLayout_L_Pane(); - this.add(bottom); - bottom.setBorder(GUICoreUtils.createTitledBorder(Toolkit.i18nText("Fine-Design_Chart_Alert_Text") + ":", null)); - bottom.add(createBottomPane()); + Component bottom = FineUIUtils.wrapComponentWithTitle(createBottomPane(), Toolkit.i18nText("Fine-Design_Chart_Alert_Text")); + column.add(bottom); } protected JPanel createTopPane() { - double p = TableLayout.PREFERRED; - double[] columnSize = {p, p}; - double[] rowSize = {p, p, p, p, p}; Component[][] components = getTopPaneComponents(); - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } protected Component[][] getTopPaneComponents() { @@ -141,10 +138,6 @@ public class VanChartAlertValuePane extends BasicBeanPane { } private JPanel createBottomPane() { - alertTextPosition.setSelectedIndex(0); - double p = TableLayout.PREFERRED; - double[] columnSize = {p, p}; - double[] rowSize = {p, p, p, p, p}; Component[][] components = new Component[][]{ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Layout_Position")), alertTextPosition}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Content")), alertText}, @@ -153,7 +146,7 @@ public class VanChartAlertValuePane extends BasicBeanPane { new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), fontColor}, }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); } private void checkPositionPane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java index 9c332c3e5e..70049a4422 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java @@ -1,12 +1,14 @@ package com.fr.van.chart.designer.style.background; import com.fine.theme.utils.FineLayoutBuilder; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.chart.PaneTitleConstants; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.van.chart.designer.AbstractVanChartScrollPane; @@ -15,7 +17,6 @@ import com.fr.van.chart.designer.component.background.VanChartBackgroundPaneWith import com.fr.van.chart.designer.component.border.VanChartBorderWithRadiusPane; import com.fr.van.chart.designer.style.background.radar.VanChartRadarAxisAreaPane; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; @@ -44,7 +45,7 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane" + Toolkit.i18nText("Fine-Design_Chart_Background_Tooltip") + ""); tooltipLabel.setForeground(Color.gray); - tooltipLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 5, 10)); contentPane.add(tooltipLabel, BorderLayout.NORTH); tooltipLabel.setVisible(false); } @@ -87,7 +87,8 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane { checkCardPane(); } }); - JPanel intervalPane = new JPanel(new BorderLayout(0, 6)); + JPanel intervalPane = new JPanel(FRGUIPaneFactory.createScaledBorderLayout(0, 10)); JPanel panel1 = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, new UILabel(Toolkit.i18nText("Fine-Design_Chart_Interval_Background")), isDefaultIntervalBackground); intervalPane.add(panel1, BorderLayout.NORTH); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartCustomIntervalBackgroundPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartCustomIntervalBackgroundPane.java index 42fcdad8eb..f561ce2626 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartCustomIntervalBackgroundPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartCustomIntervalBackgroundPane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.designer.style.background; +import com.fine.theme.utils.FineLayoutBuilder; +import com.fine.theme.utils.FineUIUtils; import com.fr.base.BaseFormula; import com.fr.base.Utils; import com.fr.design.beans.BasicBeanPane; @@ -9,19 +11,14 @@ import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.ColorSelectBox; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.plugin.chart.VanChartAttrHelper; import com.fr.plugin.chart.attr.axis.VanChartCustomIntervalBackground; import com.fr.van.chart.designer.TableLayout4VanChartHelper; -import javax.swing.BoxLayout; import javax.swing.JPanel; +import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; /** * 自定义间隔背景设置 @@ -38,25 +35,17 @@ public class VanChartCustomIntervalBackgroundPane extends BasicBeanPane { } JPanel mapDataTreePanel = new JPanel(new BorderLayout()); - mapDataTreePanel.add(mapDataTree); + UIScrollPane treeScrollPane = new UIScrollPane(mapDataTree); + treeScrollPane.setBorder(FineBorderFactory.createWrappedRoundBorder()); + mapDataTreePanel.add(treeScrollPane, BorderLayout.CENTER); Component[][] components = new Component[][]{ new Component[]{new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layer_Tree"), mapDataTreePanel, true)}, @@ -78,28 +78,23 @@ public class DrillMapLayerPane extends BasicScrollPane { } private JPanel createLayerDetailPane() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f, p, p}; - double[] rowSize = new double[depth + 1]; detailComps = new Component[depth + 1][3]; - rowSize[0] = p; detailComps[0] = new Component[]{ new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Descriptor")), new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Zoom_Layer")), + null, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layer_Map_Type")) }; for (int i = 0; i < depth; i++) { - rowSize[i + 1] = p; int d = i + 1; UILabel label = new UILabel(String.format("%s%d%s", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Index_Article"), d, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Index_Layer"))); UIComboBox level = new UIComboBox(MapStatusPane.ZOOM_LEVELS); level.setEnabled(i != 0); UIComboBox type = new UIComboBox(TEMP.get(oldMapType)); - detailComps[i + 1] = new Component[]{label, level, type}; + detailComps[i + 1] = new Component[]{label, level, null, type}; } - return TableLayoutHelper.createGapTableLayoutPane(detailComps, rowSize, columnSize, 5, 6); + return FineLayoutBuilder.compatibleTableLayout(10, detailComps, new double[]{1.2, 1.4, 0.2, 1.4}); } /** diff --git a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java index 5ebfea2320..1ce78b7e70 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java +++ b/designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java @@ -1,7 +1,6 @@ package com.fr.van.chart.drillmap.designer.data.comp; import com.fine.theme.icon.LazyIcon; -import com.fr.design.border.FineBorderFactory; import com.fr.general.ComparatorUtils; import com.fr.plugin.chart.map.designer.type.GEOJSONTreeHelper; import com.fr.plugin.chart.map.server.ChartGEOJSONHelper; @@ -35,7 +34,6 @@ public class MapDataTree extends JTree { this.setShowsRootHandles(true); this.setInvokesStopCellEditing(true); this.setCellRenderer(treeCellRenderer); - setBorder(FineBorderFactory.createWrappedRoundBorder()); setStyle(this, PURE_TREE); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java index 5d8c896072..f08d81a636 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java @@ -1,15 +1,14 @@ package com.fr.van.chart.funnel.designer.style; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.plugin.chart.funnel.FunnelSortType; import com.fr.plugin.chart.funnel.VanChartFunnelPlot; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.series.VanChartAbstractPlotSeriesPane; import javax.swing.JPanel; @@ -27,16 +26,12 @@ public class VanChartFunnelSeriesPane extends VanChartAbstractPlotSeriesPane { } protected JPanel getContentInPlotType() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {f}; - double[] rowSize = {p,p,p,p,p,p,p,p,p,p}; Component[][] components = new Component[][]{ new Component[]{createFunnelStylePane()}, new Component[]{createBorderPane()}, }; - contentPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + contentPane = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1}); return contentPane; } @@ -57,20 +52,14 @@ public class VanChartFunnelSeriesPane extends VanChartAbstractPlotSeriesPane { Toolkit.i18nText("Fine-Design_Chart_Origin_Sort") }); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p,p,p}; Component[][] components = new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Continuity")), useSameSlantAngle}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Sort")), sort}, }; - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Style_Name"), panel); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Style_Name"), panel, true); } public void populateBean(Plot plot) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java index ad553d7b9c..b31055edca 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/VanChartMapSeriesPane.java @@ -11,6 +11,7 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.style.color.ColorSelectBox; import com.fr.design.utils.gui.GUICoreUtils; @@ -273,7 +274,7 @@ public class VanChartMapSeriesPane extends VanChartColorValueSeriesPane { //获取颜色面板 private JPanel getColorPane(MapType paneType) { - JPanel panel = new JPanel(new BorderLayout()); + JPanel panel = new JPanel(FRGUIPaneFactory.createScaledBorderLayout(0, 10)); stylePane = createStylePane(); mapType = ((VanChartMapPlot) plot).getAllLayersMapType(); if (mapType != MapType.CUSTOM && mapType != MapType.DRILL_CUSTOM) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java index 1afffc8964..0b7716faa2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java @@ -1,10 +1,11 @@ package com.fr.van.chart.map.designer.style.label; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.jxbrowser.JxUIPane; -import com.fr.design.layout.TableLayout; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipAreaNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipFormat; @@ -13,7 +14,6 @@ import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; import com.fr.plugin.chart.base.format.AttrTooltipValueFormat; import com.fr.plugin.chart.type.TextAlign; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartLabelContentPane; import com.fr.van.chart.designer.component.format.MapAreaNameFormatPaneWithCheckBox; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; @@ -67,18 +67,12 @@ public class VanChartMapLabelContentPane extends VanChartLabelContentPane { protected JPanel getLabelContentPane(JPanel contentPane) { showAllSeries = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Show_All_Series")); - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double p = TableLayout.PREFERRED; - double[] row = {p, p}; Component[][] components = { - new Component[]{null, null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Display_Strategy")), showAllSeries} }; - checkPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, columnSize); + checkPane = FineLayoutBuilder.compatibleTableLayout(0, components, new double[]{1.2, 3}); - JPanel panel = new JPanel(new BorderLayout()); + JPanel panel = new JPanel(FRGUIPaneFactory.createScaledBorderLayout(0, 10)); panel.add(contentPane, BorderLayout.CENTER); panel.add(checkPane, BorderLayout.SOUTH); return createTableLayoutPaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Content"), panel); diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/WMSLayerPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/WMSLayerPane.java index 218dd02294..cac695bf17 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/WMSLayerPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/WMSLayerPane.java @@ -1,6 +1,7 @@ package com.fr.van.chart.map.designer.type; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; @@ -9,11 +10,10 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.plugin.chart.base.GisLayer; import com.fr.plugin.chart.map.layer.WMSLayer; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.JPanel; import javax.swing.SwingConstants; @@ -55,24 +55,19 @@ public class WMSLayerPane extends JPanel implements UIObserver { public WMSLayerPane() { - final double p = TableLayout.PREFERRED; - double[] rowSize = {p}; - double[] COLUMN_SIZE = {TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH, 84, 44}; - wmsUrl = new UITextArea(); connectButton = new UIButton(Toolkit.i18nText("Fine-Design_Chart_Connect_WMP")); Component[][] comps = new Component[][]{ - new Component[]{new UILabel("url"), wmsUrl, connectButton} + new Component[]{new UILabel("url"), wmsUrl, null, connectButton} }; - JPanel northPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comps, rowSize, COLUMN_SIZE); - northPane.setBorder(TableLayout4VanChartHelper.SECOND_EDIT_AREA_BORDER); + JPanel northPane = FineLayoutBuilder.compatibleTableLayout(10, comps, new double[]{1.2, 1.4, 0.2, 1.4}); wmsLayerPane = new JPanel(new BorderLayout()); resetWMSLayerPane(new ArrayList<>()); - this.setLayout(new BorderLayout(0, 6)); + this.setLayout(FRGUIPaneFactory.createScaledBorderLayout(0, 10)); this.add(northPane, BorderLayout.NORTH); this.add(wmsLayerPane, BorderLayout.CENTER); addListener(); @@ -136,7 +131,7 @@ public class WMSLayerPane extends JPanel implements UIObserver { wmsLayerCheckBoxs.add(checkBox); } - wmsLayerPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, COLUMN_SIZE, 0), BorderLayout.CENTER); + wmsLayerPane.add(FineLayoutBuilder.compatibleTableLayout(10, comps, new double[]{1.2, 3}), BorderLayout.CENTER); updateUI(); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieSeriesPane.java index 6c1575cfdf..dd3923bc9d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieSeriesPane.java @@ -1,15 +1,15 @@ package com.fr.van.chart.multilayer.style; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.plugin.chart.multilayer.VanChartMultiPiePlot; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartBeautyPane; import com.fr.van.chart.pie.VanChartPieSeriesPane; @@ -39,7 +39,7 @@ public class VanChartMultiPieSeriesPane extends VanChartPieSeriesPane { new Component[]{createBorderPane()}, }; - return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1}); } protected JPanel createSeriesStylePane(double[] row, double[] col) { @@ -54,7 +54,6 @@ public class VanChartMultiPieSeriesPane extends VanChartPieSeriesPane { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}); Component[][] components = new Component[][]{ - new Component[]{null,null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gradual_Level") ),gradualLevel}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Start_Angle") ),startAngle}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_End_Angle")),endAngle}, @@ -63,8 +62,8 @@ public class VanChartMultiPieSeriesPane extends VanChartPieSeriesPane { new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Rotation")),supportRotation} }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel, true); } protected void populatePieAttr() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java index 52f865356d..f17cb9bcde 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPieSeriesPane.java @@ -1,6 +1,7 @@ package com.fr.van.chart.pie; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.UINumberDragPane; @@ -9,7 +10,6 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.i18n.Toolkit; @@ -48,7 +48,7 @@ public class VanChartPieSeriesPane extends VanChartAbstractPlotSeriesPane { new Component[]{createBorderPane()}, }; - return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + return FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1}); } @@ -60,7 +60,6 @@ public class VanChartPieSeriesPane extends VanChartAbstractPlotSeriesPane { Component[][] components = new Component[][]{ - new Component[]{null,null}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Start_Angle")),startAngle}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_End_Angle")),endAngle}, new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Inner_Radius")),innerRadius}, @@ -69,7 +68,7 @@ public class VanChartPieSeriesPane extends VanChartAbstractPlotSeriesPane { }; - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); + JPanel panel = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel, true); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarSeriesPane.java index 1026b99367..ffe75a7d58 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarSeriesPane.java @@ -1,15 +1,15 @@ package com.fr.van.chart.radar; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.gui.ibutton.UIButtonGroup; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.plugin.chart.radar.VanChartRadarPlot; import com.fr.plugin.chart.type.RadarType; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartLineTypePane; import com.fr.van.chart.designer.component.VanChartLineWidthPane; import com.fr.van.chart.designer.style.series.VanChartAbstractPlotSeriesPane; @@ -32,12 +32,8 @@ public class VanChartRadarSeriesPane extends VanChartAbstractPlotSeriesPane { } protected JPanel getContentInPlotType(){ - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] row = {p,p,p,p,p,p,p}; - double[] col = {f}; - contentPane = TableLayoutHelper.createTableLayoutPane(getPaneComponents(), row, col); + contentPane = FineLayoutBuilder.compatibleTableLayout(10, getPaneComponents(), new double[]{1}); return contentPane; } @@ -67,8 +63,9 @@ public class VanChartRadarSeriesPane extends VanChartAbstractPlotSeriesPane { private JPanel createRadarTypePane() { radarType = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Circle"), Toolkit.i18nText("Fine-Design_Chart_Polygonal")}, new String[]{RadarType.CIRCLE.getType(), RadarType.POLYGON.getType()}); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Shape"), radarType); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Style_Present"), panel); + JPanel panel = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Shape")), radarType); + return new UIExpandablePane(Toolkit.i18nText("Fine-Design_Chart_Style_Present"), panel, true); } protected VanChartLineTypePane getLineTypePane() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/range/component/GradualIntervalConfigPane.java b/designer-chart/src/main/java/com/fr/van/chart/range/component/GradualIntervalConfigPane.java index f1cdc5b62e..5fdf0d5a0f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/range/component/GradualIntervalConfigPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/range/component/GradualIntervalConfigPane.java @@ -1,11 +1,10 @@ package com.fr.van.chart.range.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.design.gui.frpane.UINumberDragPane; import com.fr.design.gui.ilable.BoldFontTextLabel; -import com.fr.design.layout.TableLayout; import com.fr.design.mainframe.chart.gui.ColorSelectBoxWithOutTransparent; import com.fr.plugin.chart.range.GradualIntervalConfig; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.axis.component.MinMaxValuePaneWithOutTick; import javax.swing.JPanel; @@ -51,16 +50,10 @@ public class GradualIntervalConfigPane extends JPanel { legendGradientBar = createLegendGradientBar(); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] col = new double[]{f, e}; - double[] row = new double[]{p, p, p, p}; - Component[][] components = getPaneComponents(minMaxValuePane, colorSelectBox, numberDragPane, legendGradientBar); //控件承载面板 - JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); + JPanel contentPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); this.setLayout(new BorderLayout()); this.add(contentPane, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendLabelFormatPane.java b/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendLabelFormatPane.java index eec9225f58..478d7d13d1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendLabelFormatPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendLabelFormatPane.java @@ -1,12 +1,12 @@ package com.fr.van.chart.range.component; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.base.LegendLabelFormat; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.style.FormatPane; -import com.fr.design.layout.TableLayout; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartHtmlLabelPaneWithOutWidthAndHeight; import com.fr.van.chart.designer.component.format.FormatPaneWithOutFont; import com.fr.van.chart.designer.style.VanChartStylePane; @@ -47,7 +47,6 @@ public class LegendLabelFormatPane extends JPanel { } }; htmlLabelPane = new VanChartHtmlLabelPaneWithOutWidthAndHeight(); - htmlLabelPane.setBorder(BorderFactory.createEmptyBorder(0, (int) TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH + TableLayout4VanChartHelper.COMPONENT_INTERVAL, 0, 0)); centerPane = new JPanel(new CardLayout()) { @Override @@ -63,17 +62,11 @@ public class LegendLabelFormatPane extends JPanel { centerPane.add(htmlLabelPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, e}; - double[] rowSize = {p, p, p}; Component[][] components = new Component[][]{ - new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Label_Format"), SwingConstants.LEFT), labelFormatStyle}, new Component[]{centerPane, null}, }; - JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + JPanel contentPane = FineLayoutBuilder.compatibleTableLayout(10, components, new double[]{1.2, 3}); labelFormatStyle.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -82,7 +75,7 @@ public class LegendLabelFormatPane extends JPanel { }); labelFormatStyle.setSelectedIndex(0); - JPanel panel = TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Format"), contentPane); + JPanel panel = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Format"), contentPane, true); this.setLayout(new BorderLayout()); this.add(panel, BorderLayout.CENTER); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/treemap/style/VanChartTreeMapSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/treemap/style/VanChartTreeMapSeriesPane.java index db8bfa94b1..7998a088e7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/treemap/style/VanChartTreeMapSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/treemap/style/VanChartTreeMapSeriesPane.java @@ -1,11 +1,13 @@ package com.fr.van.chart.treemap.style; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.chart.chartattr.Plot; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.plugin.chart.treemap.VanChartTreeMapPlot; -import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.multilayer.style.VanChartMultiPieSeriesPane; import javax.swing.JPanel; @@ -22,8 +24,9 @@ public class VanChartTreeMapSeriesPane extends VanChartMultiPieSeriesPane { protected JPanel createSeriesStylePane(double[] row, double[] col) { supportDrill = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Drill"), supportDrill); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel); + JPanel panel = FineLayoutBuilder.createHorizontalLayout(0, new double[]{1.2, 3}, + new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Drill")), supportDrill); + return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel, true); } protected void populatePieAttr() { From afdbf158bf189c80e8ac49e107a6810b3535a614 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 6 Sep 2024 18:51:39 +0800 Subject: [PATCH 13/26] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=A7=84=E8=8C=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wrapper/ServerTableDataWrapper.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java index 0d7b1297ea..4a07d9ab91 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java @@ -27,13 +27,10 @@ public final class ServerTableDataWrapper extends AbstractTableDataWrapper { @Override public Icon getIcon() { if (tabledata instanceof DBTableData) { - if (StringUtils.isBlank(((DBTableData) tabledata).getQuery())) { - return new LazyIcon("server_database_warning"); - } - else { - return new LazyIcon("server_database"); - } - } else if (tabledata instanceof ClassTableData) { + return getDBTableDataIcon(); + } + + if (tabledata instanceof ClassTableData) { return new LazyIcon("class_table_data"); } else if (tabledata instanceof EmbeddedTableData) { return new LazyIcon("data_table"); @@ -49,6 +46,15 @@ public final class ServerTableDataWrapper extends AbstractTableDataWrapper { return new LazyIcon("server_database"); } + private Icon getDBTableDataIcon() { + if (StringUtils.isBlank(((DBTableData) tabledata).getQuery())) { + return new LazyIcon("server_database_warning"); + } + else { + return new LazyIcon("server_database"); + } + } + /** * 是否异常 * @return From 9fd187e150852aa038fb6cb3fdd37578ddbd1f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 6 Sep 2024 19:31:24 +0800 Subject: [PATCH 14/26] =?UTF-8?q?REPORT-132393=20&=20REPORT-133561=20fix?= =?UTF-8?q?=EF=BC=9ANewUI=20=E4=BF=AE=E5=A4=8D=E5=9B=BE=E6=A0=87=E9=97=AE?= =?UTF-8?q?=E9=A2=98&=E5=9B=BE=E8=A1=A8=E5=8C=BA=E5=9F=9F=E9=81=97?= =?UTF-8?q?=E6=BC=8F=E7=BF=BB=E6=96=B0=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java index e1b5a40612..8846dc0cc3 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java @@ -74,7 +74,7 @@ public class ChartHyperRelateFloatLinkPane extends AbstractHyperLinkPane Date: Fri, 6 Sep 2024 19:32:41 +0800 Subject: [PATCH 15/26] =?UTF-8?q?fix:=20=E5=9B=9E=E9=80=80=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=BB=9A=E5=8A=A8=E6=9D=A1=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/SaveSomeTemplatePane.java | 3 +++ .../resources/com/fine/theme/light/ui/laf/FineLaf.properties | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index 1932dab3d6..8ee5c61fb2 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -85,6 +85,9 @@ public class SaveSomeTemplatePane extends BasicPane { templatesChoosePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); UIScrollPane scrollPane = new UIScrollPane(templatesChoosePane); scrollPane.setBorder(new FineRoundBorder()); + if (SystemInfo.isWindows) { + scrollPane.getVerticalScrollBar().setUI(new UIScrollBarUI()); + } this.add(scrollPane, BorderLayout.CENTER); this.isJudgeCurrentEditingTemplate = isNeedTojudgeCurrent; } diff --git a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties index cd5d39cb54..9ac0952b65 100644 --- a/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties +++ b/designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLaf.properties @@ -26,7 +26,7 @@ ProgressBarUI=com.formdev.flatlaf.ui.FlatProgressBarUI RadioButtonUI=com.formdev.flatlaf.ui.FlatRadioButtonUI RadioButtonMenuItemUI=com.formdev.flatlaf.ui.FlatRadioButtonMenuItemUI RootPaneUI=com.formdev.flatlaf.ui.FlatRootPaneUI -ScrollBarUI=com.fr.design.gui.iscrollbar.UIScrollBarUI +ScrollBarUI=com.formdev.flatlaf.ui.FlatScrollBarUI ScrollPaneUI=com.formdev.flatlaf.ui.FlatScrollPaneUI SeparatorUI=com.formdev.flatlaf.ui.FlatSeparatorUI SliderUI=com.fine.theme.light.ui.FineSliderUI From 8a1c5c2eb56263c332916c835afac246ce80397b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Fri, 6 Sep 2024 19:36:57 +0800 Subject: [PATCH 16/26] =?UTF-8?q?REPORT-132393=20&=20REPORT-133561=20fix?= =?UTF-8?q?=EF=BC=9ANewUI=20=E4=BF=AE=E5=A4=8D=E5=9B=BE=E6=A0=87=E9=97=AE?= =?UTF-8?q?=E9=A2=98&=E5=9B=BE=E8=A1=A8=E5=8C=BA=E5=9F=9F=E9=81=97?= =?UTF-8?q?=E6=BC=8F=E7=BF=BB=E6=96=B0=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/cell/editor/BiasTextPainterCellEditor.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/BiasTextPainterCellEditor.java b/designer-realize/src/main/java/com/fr/design/cell/editor/BiasTextPainterCellEditor.java index 1a578638c8..57f29e2c71 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/BiasTextPainterCellEditor.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/BiasTextPainterCellEditor.java @@ -4,8 +4,8 @@ package com.fr.design.cell.editor; import com.fine.swing.ui.layout.Layouts; -import com.fine.theme.light.ui.FineRoundBorder; import com.fine.theme.utils.FineUIScale; +import com.fr.design.border.FineBorderFactory; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIRadioButton; @@ -84,7 +84,7 @@ public class BiasTextPainterCellEditor extends AbstractCellEditor { Window parentWindow = SwingUtilities.getWindowAncestor(grid); this.biasTextPainterPane = new BiasTextPainterPane(); - Dimension wrapDimension = FineUIScale.scale(new Dimension(360, 172)); + Dimension wrapDimension = FineUIScale.scale(new Dimension(360, 212)); this.biasTextPainterPane.populate(biasTextPainter); return this.biasTextPainterPane.showWindowWithCustomSize(parentWindow, new DialogActionAdapter() { @@ -113,7 +113,7 @@ public class BiasTextPainterCellEditor extends AbstractCellEditor { formulaTextArea = new UITextArea(); JScrollPane scrollPane = new JScrollPane(formulaTextArea); - scrollPane.setBorder(new FineRoundBorder()); + scrollPane.setBorder(FineBorderFactory.createWrappedRoundBorder()); formulaTextArea.setBorder(null); String leftToLowerText = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Slope_Line_Upper_Left_To_Lower_Right"); @@ -130,8 +130,8 @@ public class BiasTextPainterCellEditor extends AbstractCellEditor { group.add(choice2); add(Layouts.column(10, - Layouts.cell(formulaLabel).weight(0.1), Layouts.cell(scrollPane).weight(0.12), - Layouts.row(5, Layouts.cell(choice1).weight(1), Layouts.cell(choice2).weight(1)).weight(0.12)).getComponent()); + Layouts.cell(formulaLabel), Layouts.cell(scrollPane).weight(1), + Layouts.row(5, Layouts.cell(choice1).weight(1), Layouts.cell(choice2).weight(1))).getComponent()); } @Override From 82863e626d0756b93b139521f7484ab60abbcea2 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Sun, 8 Sep 2024 10:16:31 +0800 Subject: [PATCH 17/26] =?UTF-8?q?REPORT-133110=20=E3=80=90fr-fbp=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E3=80=91=E3=80=90FR=E5=9B=BE=E8=A1=A8=E3=80=91?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E5=9C=B0=E5=9B=BE-=E7=B1=BB=E5=9E=8B-?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E8=BE=B9=E7=95=8C=EF=BC=8C=E5=9C=B0=E7=90=86?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=92=8C=E8=87=AA=E5=AE=9A=E4=B9=89=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=97=A0=E6=B3=95=E9=80=89=E4=B8=AD=E5=B9=B6=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E9=80=89=E6=8B=A9=E5=AD=90=E5=B1=82=E7=BA=A7=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fanruan/fs/DesignFileRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/designer-realize/src/main/java/com/fanruan/fs/DesignFileRepository.java b/designer-realize/src/main/java/com/fanruan/fs/DesignFileRepository.java index 07c68918fa..7947989a0a 100644 --- a/designer-realize/src/main/java/com/fanruan/fs/DesignFileRepository.java +++ b/designer-realize/src/main/java/com/fanruan/fs/DesignFileRepository.java @@ -7,6 +7,9 @@ import com.fr.stable.project.ProjectConstants; import com.fr.workspace.server.entity.resource.ResourceBean; import com.fr.workspace.server.repository.resource.PublicResourceRepository; +import java.io.ByteArrayInputStream; +import java.io.InputStream; + /** * DesignFileRepository @@ -31,4 +34,9 @@ public class DesignFileRepository extends LocalFileRepository { public FineFileEntry[] listEntry(String dir) { return PublicResourceRepository.getInstance().listEntry(new ResourceBean(dir)); } + + @Override + public InputStream openStream(String path) { + return new ByteArrayInputStream(PublicResourceRepository.getInstance().openStream(path)); + } } From 5e649c47577891a76edd63c8207842c71bf3568b Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Sun, 8 Sep 2024 23:51:33 +0800 Subject: [PATCH 18/26] =?UTF-8?q?REPORT-133186=20=E3=80=90fr-fbp=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E3=80=91=E3=80=90=E6=95=B0=E6=8D=AE=E9=9B=86=E3=80=91?= =?UTF-8?q?fbp=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=BF=9C=E7=A8=8B=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=EF=BC=8C=E6=96=B0=E5=BB=BAmysql=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=EF=BC=8C=E5=BC=80=E5=90=AFSSL=E9=80=9A?= =?UTF-8?q?=E9=81=93=E5=90=8E=E8=AF=BB=E4=B8=8D=E5=88=B0CA=E8=AF=81?= =?UTF-8?q?=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/datapane/connect/SslPane.java | 2 +- .../data/tabledata/LocalTableDataSource.java | 9 ++ .../java/com/fr/file/FILEChooserPane.java | 46 ++++++ .../src/main/java/com/fr/file/FileCAFILE.java | 151 ++++++++++++++++++ 4 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/java/com/fr/file/FileCAFILE.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java index 10cd4e5e2f..62e6666acd 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java @@ -146,7 +146,7 @@ public class SslPane extends BasicPane { @Override public void actionPerformed(ActionEvent e) { - FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(SslUtils.PREFIX, new ChooseFileFilter(true), SslUtils.CERTIFICATES); + FILEChooserPane fileChooser = FILEChooserPane.getFileCAChoosePane(new ChooseFileFilter(true)); int type = fileChooser.showOpenDialog(SslPane.this, StringUtils.EMPTY); if (type == FILEChooserPane.OK_OPTION) { final FILE file = fileChooser.getSelectedFILE(); diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java b/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java index 5c70a87536..25acc3da90 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/LocalTableDataSource.java @@ -7,9 +7,12 @@ import com.fr.decision.webservice.bean.dataset.FileDataSetBean; import com.fr.decision.webservice.bean.dataset.ServerDataSetBean; import com.fr.decision.webservice.bean.entry.FileNodeBean; import com.fr.decision.webservice.v10.datasource.dataset.processor.impl.FileProcessor; +import com.fr.decision.webservice.v10.file.FileNodeService; import com.fr.design.data.datapane.preview.TableDataBeanHelper; import com.fr.log.FineLoggerFactory; +import com.fr.stable.CommonUtils; import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.workspace.server.repository.tabledata.BaseTableDataSource; import java.util.ArrayList; @@ -67,6 +70,12 @@ public class LocalTableDataSource extends BaseTableDataSource { } } + @Override + public List getCertificatesFile(String keyword) throws Exception { + String pPath = CommonUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY); + return FileNodeService.getInstance().getAllRecursiveFileNodes(pPath, ProjectConstants.RESOURCES_NAME, keyword); + } + @Override public List getAllTableData() { diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 9d21751c28..5018f37349 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -252,6 +252,21 @@ public class FILEChooserPane extends BasicPane { return chooserPane; } + /** + * 获取CA证书的文件选择面板 + */ + public static FILEChooserPane getFileCAChoosePane(FILEFilter filter) { + FILEChooserPane chooserPane = new FILEChooserPane(); + chooserPane.showEnv = true; + chooserPane.showLoc = false; + chooserPane.showWebReport = false; + // 替换掉 PlaceListModel + chooserPane.setFileCAPlaceListModel(); + chooserPane.removeAllFilter(); + chooserPane.addChooseFILEFilter(filter, 0); + return chooserPane; + } + /** * @param showEnv @@ -1128,6 +1143,13 @@ public class FILEChooserPane extends BasicPane { setPlaceListModel(new FileDataPlaceListModel(type)); } + protected void setFileCAPlaceListModel() { + if (placesList == null) { + return; + } + setPlaceListModel(new FileCAPlaceListModel()); + } + /* * 选中文件 */ @@ -1385,6 +1407,30 @@ public class FILEChooserPane extends BasicPane { } + private class FileCAPlaceListModel extends AbstractPlaceListModel { + private FileCAFILE envFILE; + FileCAPlaceListModel() { + envFILE = new FileCAFILE(new FileNode(StableUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY), true), false, StableUtils.pathJoin(ProjectConstants.ASSETS_NAME, FileDataFILE.FILE_DATASET_NAME)) { + @Override + public String getName() { + return getEnvProjectName(); + } + }; + } + + @Override + public FILE getElementAt(int index) { + return envFILE; + } + + @Override + public int getSize() { + return 1 + filesOfSystem.size(); + } + + } + + private class MultiLocalEnvPlaceListModel extends AbstractPlaceListModel { private static final long serialVersionUID = 6300018896958532154L; diff --git a/designer-base/src/main/java/com/fr/file/FileCAFILE.java b/designer-base/src/main/java/com/fr/file/FileCAFILE.java new file mode 100644 index 0000000000..78ea400447 --- /dev/null +++ b/designer-base/src/main/java/com/fr/file/FileCAFILE.java @@ -0,0 +1,151 @@ +package com.fr.file; + +import com.fr.decision.webservice.bean.entry.FileNodeBean; +import com.fr.file.filetree.FileNode; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.CoreConstants; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; +import com.fr.workspace.server.repository.tabledata.TableDataRepository; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * CA证书文件相关 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/9/8 + */ +public class FileCAFILE extends FileNodeFILE{ + private List children = new ArrayList<>(); + private boolean builded = false; + private String id = StringUtils.EMPTY; + + public FileCAFILE(FileNode node) { + super(node); + } + + public FileCAFILE(FileNode node, boolean builded, String id) { + super(node); + this.builded = builded; + this.id = id; + } + + /** + * 添加子 + */ + private void addChild(FileCAFILE file) { + children.add(file); + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public boolean isBuilded() { + return builded; + } + + public void setBuilded(boolean builded) { + this.builded = builded; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public FILE[] listFiles() { + + if (ComparatorUtils.equals(node, null)) { + node = new FileNode(CoreConstants.SEPARATOR, true); + } + if (!node.isDirectory()) { + return new FILE[]{this}; + } + try { + FileCAFILE root = null; + if (!this.builded) { + root = buildTree(); + FileCAFILE dataFILE = root.getFileCAFILE(this.id); + this.setChildren(dataFILE.getChildren()); + this.builded = true; + } + return this.getChildren().toArray(new FILE[0]); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return new FILE[0]; + } + } + + private List getBeans() { + try { + return TableDataRepository.getInstance().getCertificatesFile(StringUtils.EMPTY); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 递归获取指定id的文件 + */ + public FileCAFILE getFileCAFILE(String id) { + if (StringUtils.equals(this.id, id) || StringUtils.equals(StableUtils.pathJoin(this.id, StringUtils.EMPTY), id)) { + return this; + } + for (FileCAFILE file : getChildren()) { + return file.getFileCAFILE(id); + } + return null; + } + + private FileCAFILE buildTree() { + List beans = getBeans(); + Map tree = new HashMap<>(); + FileCAFILE root = null; + // id , 父 + for (FileNodeBean bean : beans) { + FileNode fileNode = new FileNode(); + fileNode.setEnvPath(bean.getPath()); + fileNode.setDirectory(bean.getIsParent()); + tree.putIfAbsent(bean.getId(), new FileCAFILE(fileNode, true, bean.getId())); + if (StringUtils.isEmpty(bean.getpId())) { + root = tree.get(bean.getId()); + } else { + tree.putIfAbsent(bean.getpId(), createParent(bean.getpId(), beans)); + FileCAFILE file = tree.get(bean.getpId()); + if (file != null) { + file.addChild(tree.get(bean.getId())); + } + } + } + return root; + } + + private FileCAFILE createParent(String s, List beans) { + for (FileNodeBean bean : beans) { + if (StringUtils.equals(bean.getId(), s)) { + FileNode fileNode = new FileNode(); + fileNode.setEnvPath(bean.getPath()); + fileNode.setDirectory(bean.getIsParent()); + return new FileCAFILE(fileNode, true, bean.getId()); + } + } + return null; + } + + +} From 84668af345dbcf89e4b403e2b4dc4719c2472bcf Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 9 Sep 2024 00:26:46 +0800 Subject: [PATCH 19/26] =?UTF-8?q?REPORT-133186=20=E3=80=90fr-fbp=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E3=80=91=E3=80=90=E6=95=B0=E6=8D=AE=E9=9B=86=E3=80=91?= =?UTF-8?q?fbp=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=BF=9C=E7=A8=8B=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=EF=BC=8C=E6=96=B0=E5=BB=BAmysql=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=EF=BC=8C=E5=BC=80=E5=90=AFSSL=E9=80=9A?= =?UTF-8?q?=E9=81=93=E5=90=8E=E8=AF=BB=E4=B8=8D=E5=88=B0CA=E8=AF=81?= =?UTF-8?q?=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/file/FILEChooserPane.java | 2 +- .../src/main/java/com/fr/file/FILEFactory.java | 6 +++++- .../src/main/java/com/fr/file/FileCAFILE.java | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 5018f37349..355cbffa15 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -1410,7 +1410,7 @@ public class FILEChooserPane extends BasicPane { private class FileCAPlaceListModel extends AbstractPlaceListModel { private FileCAFILE envFILE; FileCAPlaceListModel() { - envFILE = new FileCAFILE(new FileNode(StableUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY), true), false, StableUtils.pathJoin(ProjectConstants.ASSETS_NAME, FileDataFILE.FILE_DATASET_NAME)) { + envFILE = new FileCAFILE(new FileNode(StableUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY), true), false, StableUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY)) { @Override public String getName() { return getEnvProjectName(); diff --git a/designer-base/src/main/java/com/fr/file/FILEFactory.java b/designer-base/src/main/java/com/fr/file/FILEFactory.java index 4d5fe6548d..7f20b844a4 100644 --- a/designer-base/src/main/java/com/fr/file/FILEFactory.java +++ b/designer-base/src/main/java/com/fr/file/FILEFactory.java @@ -9,6 +9,7 @@ public class FILEFactory { public static final String FILE_PREFIX = "file://"; public static final String ENV_PREFIX = "env://"; public static final String FILE_DATA_PREFIX = "filedata://"; + public static final String FILE_CA_PREFIX = "ca://"; public static final String WEBREPORT_PREFIX = "webreport://"; public static final String SEPARATOR = "/"; @@ -58,7 +59,10 @@ public class FILEFactory { return new FileFILE(new java.io.File(path.substring(FILE_PREFIX.length()))); } else if (path.startsWith(FILE_DATA_PREFIX)) { return new FileDataFILE(new FileNode(path.substring(FILE_DATA_PREFIX.length()), true), false, path.substring(FILE_DATA_PREFIX.length())); - } else { + } else if (path.startsWith(FILE_CA_PREFIX)) { + return new FileCAFILE(new FileNode(path.substring(FILE_CA_PREFIX.length()), true), false, path.substring(FILE_CA_PREFIX.length())); + } + else { return new FileNodeFILE(new FileNode(path, WorkContext.getWorkResource().isDirectory(path))); } } diff --git a/designer-base/src/main/java/com/fr/file/FileCAFILE.java b/designer-base/src/main/java/com/fr/file/FileCAFILE.java index 78ea400447..2ecf3c39b0 100644 --- a/designer-base/src/main/java/com/fr/file/FileCAFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileCAFILE.java @@ -7,6 +7,7 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.workspace.server.repository.tabledata.TableDataRepository; import java.util.ArrayList; @@ -22,6 +23,7 @@ import java.util.Map; * Created on 2024/9/8 */ public class FileCAFILE extends FileNodeFILE{ + public static final String ROOT = ProjectConstants.CERTIFICATES_DIRECTORY; private List children = new ArrayList<>(); private boolean builded = false; private String id = StringUtils.EMPTY; @@ -132,6 +134,13 @@ public class FileCAFILE extends FileNodeFILE{ } } } + for (Map.Entry entry : tree.entrySet()) { + if (entry.getKey().endsWith(ROOT)) { + root = entry.getValue(); + root.setId(StableUtils.pathJoin(ProjectConstants.RESOURCES_NAME, ProjectConstants.CERTIFICATES_DIRECTORY)); + break; + } + } return root; } @@ -144,8 +153,15 @@ public class FileCAFILE extends FileNodeFILE{ return new FileCAFILE(fileNode, true, bean.getId()); } } - return null; + FileNode fileNode = new FileNode(); + fileNode.setEnvPath(s); + fileNode.setDirectory(true); + return new FileCAFILE(fileNode, true, ROOT); } + @Override + public String prefix() { + return FILEFactory.FILE_CA_PREFIX; + } } From b9b7bd89f7e2fd3c6f58c51c050a2dc2975517aa Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 9 Sep 2024 12:24:48 +0800 Subject: [PATCH 20/26] =?UTF-8?q?REPORT-133863=20=E3=80=90fr-fbp=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E3=80=91=E6=95=B0=E6=8D=AE=E5=AD=97=E5=85=B8=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AD=97=E6=AE=B5=E7=A9=BA?= =?UTF-8?q?=E7=99=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/present/dict/DatabaseDictPane.java | 7 +++++-- .../java/com/fanruan/data/ConnectionConfigWrapper.java | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java b/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java index 5c157a7cd9..2c1f46a4a1 100644 --- a/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java +++ b/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java @@ -6,6 +6,7 @@ import com.fr.base.TableData; import com.fr.data.core.DataCoreUtils; import com.fr.data.core.db.DBUtils; import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.impl.Connection; import com.fr.data.impl.DatabaseDictionary; import com.fr.data.impl.NameDatabaseConnection; import com.fr.design.beans.FurtherBasicBeanPane; @@ -25,6 +26,7 @@ import com.fr.design.event.UIObserverListener; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.stable.StringUtils; +import com.fr.workspace.server.repository.connection.ConnectionRepository; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -176,8 +178,9 @@ public class DatabaseDictPane extends FurtherBasicBeanPane i if (StringUtils.isBlank(para.getDatabaseName())) { dbDict.setDatabaseConnection(null); } else { - database = DBUtils.checkDBConnection(para.getDatabaseName()); - if (database != null) { + Connection connection = ConnectionRepository.getInstance().getByName(para.getDatabaseName()).getConnection(); + if (connection != null) { + database = new NameDatabaseConnection(para.getDatabaseName()); dbDict.setDatabaseConnection(database); } } diff --git a/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java b/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java index 8c4a9e7b6b..8dd3ea86e5 100644 --- a/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java +++ b/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java @@ -7,6 +7,8 @@ import com.fr.file.ConnectionConfig; import com.fr.log.FineLoggerFactory; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerAdaptor; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.repository.connection.ConnectionRepository; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -106,7 +108,7 @@ public class ConnectionConfigWrapper implements ConnectionConfigProvider, Connec @Override public @Nullable Connection getConnection(@NotNull String connectionName) { - Connection connection = ConnectionConfig.getInstance().getConnection(connectionName); + Connection connection = WorkContext.getCurrent().isLocal() ? ConnectionConfig.getInstance().getConnection(connectionName) : ConnectionRepository.getInstance().getByName(connectionName).getConnection(); if (connection != null) { connection.setConnectionName(connectionName); } From 7cfeaef10c206401dabf8e9cf892b61af7fa904a Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 9 Sep 2024 15:45:51 +0800 Subject: [PATCH 21/26] =?UTF-8?q?REPORT-133888=20-=20=E3=80=90fr-fbp?= =?UTF-8?q?=E5=9B=9E=E5=BD=92=E3=80=91=E6=96=87=E4=BB=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86excel=E5=8F=AA=E8=83=BD=E8=A2=AB=E9=80=89=E4=B8=80?= =?UTF-8?q?=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/file/FILEChooserPane.java | 19 ++++++++++++++++++- .../main/java/com/fr/file/FILEFactory.java | 16 +++++++++++++++- .../main/java/com/fr/file/FileDataFILE.java | 11 +++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 355cbffa15..2cf1016c48 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -1384,6 +1384,7 @@ public class FILEChooserPane extends BasicPane { private class FileDataPlaceListModel extends AbstractPlaceListModel { private FileDataFILE envFILE; + private String type; FileDataPlaceListModel(String type) { envFILE = new FileDataFILE(new FileNode(StableUtils.pathJoin(ProjectConstants.ASSETS_NAME, FileDataFILE.FILE_DATASET_NAME), true), false, StableUtils.pathJoin(ProjectConstants.ASSETS_NAME, FileDataFILE.FILE_DATASET_NAME)) { @@ -1393,6 +1394,7 @@ public class FILEChooserPane extends BasicPane { } }; envFILE.setType(type); + FileDataPlaceListModel.this.setType(type); } @Override @@ -1405,6 +1407,21 @@ public class FILEChooserPane extends BasicPane { return 1 + filesOfSystem.size(); } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + protected void setCD(FILE lastDirectory) { + super.setCD(lastDirectory); + if (lastDirectory instanceof FileDataFILE) { + ((FileDataFILE)lastDirectory).setType(type); + } + } } private class FileCAPlaceListModel extends AbstractPlaceListModel { @@ -1642,7 +1659,7 @@ public class FILEChooserPane extends BasicPane { this.buttonList.add(createBlankButton((new SetDirectoryAction(btn_text + '/', // alex:dir.prefix不和btn_path一起参与pathJoin,因为btn_path是否以/打头在unix,linux // OS中意义很不一样 - FILEFactory.createFolder(dir.prefix() + StableUtils.pathJoin(btn_path, "/")), !needTopPath)))); + FILEFactory.createFolder(dir, dir.prefix() + StableUtils.pathJoin(btn_path, "/")), !needTopPath)))); } maxPathIndex = calculateMaxPathIndex(); diff --git a/designer-base/src/main/java/com/fr/file/FILEFactory.java b/designer-base/src/main/java/com/fr/file/FILEFactory.java index 7f20b844a4..3e7113f35a 100644 --- a/designer-base/src/main/java/com/fr/file/FILEFactory.java +++ b/designer-base/src/main/java/com/fr/file/FILEFactory.java @@ -39,12 +39,22 @@ public class FILEFactory { return new FileFILE(new java.io.File(path.substring(FILE_PREFIX.length()))); } else if (path.startsWith(FILE_DATA_PREFIX)) { return new FileDataFILE(new FileNode(path.substring(FILE_DATA_PREFIX.length()), false), false, path.substring(FILE_DATA_PREFIX.length())); + } else if (path.startsWith(FILE_CA_PREFIX)) { + return new FileCAFILE(new FileNode(path.substring(FILE_CA_PREFIX.length()), false), false, path.substring(FILE_CA_PREFIX.length())); } else { return new FileNodeFILE(new FileNode(path, WorkContext.getWorkResource().isDirectory(path))); } } public static FILE createFolder(String path) { + return createFolder(null, path); + } + + + /** + * 传递依据的基础文件并创建文件夹 + */ + public static FILE createFolder(FILE origin, String path) { if (path == null) { return null; } else if (path.startsWith(MEM_PREFIX)) { @@ -58,7 +68,11 @@ public class FILEFactory { } else if (path.startsWith(FILE_PREFIX)) { return new FileFILE(new java.io.File(path.substring(FILE_PREFIX.length()))); } else if (path.startsWith(FILE_DATA_PREFIX)) { - return new FileDataFILE(new FileNode(path.substring(FILE_DATA_PREFIX.length()), true), false, path.substring(FILE_DATA_PREFIX.length())); + FileDataFILE file = new FileDataFILE(new FileNode(path.substring(FILE_DATA_PREFIX.length()), true), false, path.substring(FILE_DATA_PREFIX.length())); + if (origin instanceof FileDataFILE) { + file.setType(((FileDataFILE) origin).getType()); + } + return file; } else if (path.startsWith(FILE_CA_PREFIX)) { return new FileCAFILE(new FileNode(path.substring(FILE_CA_PREFIX.length()), true), false, path.substring(FILE_CA_PREFIX.length())); } diff --git a/designer-base/src/main/java/com/fr/file/FileDataFILE.java b/designer-base/src/main/java/com/fr/file/FileDataFILE.java index 434faeee03..11fba58b6a 100644 --- a/designer-base/src/main/java/com/fr/file/FileDataFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileDataFILE.java @@ -42,6 +42,13 @@ public class FileDataFILE extends FileNodeFILE{ this.id = id; } + public FileDataFILE(FileNode node, boolean builded, String id, String type) { + super(node); + this.builded = builded; + this.id = id; + this.type = type; + } + private void addChild(FileDataFILE file) { children.add(file); } @@ -127,7 +134,7 @@ public class FileDataFILE extends FileNodeFILE{ FileNode fileNode = new FileNode(); fileNode.setEnvPath(bean.getPath()); fileNode.setDirectory(bean.getIsParent()); - tree.putIfAbsent(bean.getId(), new FileDataFILE(fileNode, true, bean.getId())); + tree.putIfAbsent(bean.getId(), new FileDataFILE(fileNode, true, bean.getId(), type)); if (StringUtils.isEmpty(bean.getpId())) { root = tree.get(bean.getId()); } else { @@ -147,7 +154,7 @@ public class FileDataFILE extends FileNodeFILE{ FileNode fileNode = new FileNode(); fileNode.setEnvPath(bean.getPath()); fileNode.setDirectory(bean.getIsParent()); - return new FileDataFILE(fileNode, true, bean.getId()); + return new FileDataFILE(fileNode, true, bean.getId(), type); } } return null; From 45c0952541b39feff0a996011aefdc05cc824019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levy=2EXie-=E8=A7=A3=E5=AE=89=E6=A3=AE?= Date: Mon, 9 Sep 2024 17:07:24 +0800 Subject: [PATCH 22/26] =?UTF-8?q?REPORT-133693=20&=20REPORT-133882=20&=20R?= =?UTF-8?q?EPORT-133878=20fix:=20NewUI=20=E6=8E=A7=E4=BB=B6=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=A2=9E=E5=BC=BA=E9=85=8D&Form=E9=81=97=E6=BC=8F?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E7=BF=BB=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgettheme/BaseStyleSettingPane.java | 42 +++++-------------- .../form/FormReportComponentComposite.java | 4 +- .../FormECRepeatAndFreezeSettingPane.java | 1 + .../design/widget/ui/CheckBoxDefinePane.java | 31 +++++--------- 4 files changed, 23 insertions(+), 55 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widgettheme/BaseStyleSettingPane.java b/designer-form/src/main/java/com/fr/design/widgettheme/BaseStyleSettingPane.java index 14183ed2e6..280ebcb9f2 100644 --- a/designer-form/src/main/java/com/fr/design/widgettheme/BaseStyleSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widgettheme/BaseStyleSettingPane.java @@ -1,10 +1,11 @@ package com.fr.design.widgettheme; import com.fine.swing.ui.layout.Column; +import com.fine.theme.icon.LazyIcon; +import com.fine.theme.utils.FineLayoutBuilder; import com.fr.base.background.ColorBackground; import com.fr.base.theme.TemplateTheme; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.designer.IntervalConstants; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.frpane.FontSizeComboPane; import com.fr.design.gui.frpane.UIPercentDragPane; @@ -18,15 +19,12 @@ import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.style.FRFontPane; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.JTemplate; import com.fr.design.style.color.NewColorSelectBox; import com.fr.design.utils.DesignUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.form.ui.Widget; import com.fr.general.FRFont; -import com.fr.general.IOUtils; import com.fr.util.ColorUtils; import com.fr.widgettheme.theme.bean.ButtonBackground; import com.fr.widgettheme.theme.panel.ButtonStyleDefinedPane; @@ -38,7 +36,6 @@ import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; import com.fr.widgettheme.util.WidgetStyleComponentCombiner; import com.fr.widgettheme.util.WidgetThemeDesignerUtils; -import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; @@ -130,8 +127,9 @@ public abstract class BaseStyleSettingPane extends BasicBeanPa protected void initPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.add(createHeadPane(), BorderLayout.NORTH); - this.add(createCustomPane(), BorderLayout.CENTER); + this.add(column(10, + cell(createHeadPane()), cell(createCustomPane()) + ).getComponent(), BorderLayout.CENTER); } @@ -145,8 +143,8 @@ public abstract class BaseStyleSettingPane extends BasicBeanPa fontNameSelectBox = new UIComboBox(DesignUtils.getAvailableFontFamilyNames4Report()); fontSizePane = new FontSizeComboPane(); fontColorButton = new UIColorButton(); - bold = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); - italic = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); + bold = new UIToggleButton(new LazyIcon("bold")); + italic = new UIToggleButton(new LazyIcon("italic")); widgetBgColorSelectBox = new NewColorSelectBox(WidgetThemeDisplayConstants.THEME_WIDGET_COMPONENT_WIDTH, true); widgetBgAlphaDragPane = new UIPercentDragPane(); paneMap.put(StyleSetting.THEME_COLOR, colorSelectBox); @@ -180,34 +178,14 @@ public abstract class BaseStyleSettingPane extends BasicBeanPa switchCard(); } }; - JPanel headPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ - new Component[]{headLabel, styleSettingHead}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - headPane.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0)); - return headPane; + + return FineLayoutBuilder.createHorizontalLayout(0, new double[] {1.2, 3}, headLabel, styleSettingHead); } protected JPanel createCustomPane() { int size = styleSettingList.size(); - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - int columnCount = 2; - double[] rowSize = new double[size]; - for (int i = 0; i < size; i++) { - rowSize[i] = p; - } - - double[] columnSize = {p, f}; - - int[][] rowCount = new int[size][columnCount]; - for (int i = 0; i < size; i++) { - for (int j = 0; j < columnCount; j++) { - rowCount[i][j] = 1; - } - } - - customPane = TableLayoutHelper.createGapTableLayoutPane(createComponents(size), rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - customPane.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0)); + customPane = FineLayoutBuilder.compatibleTableLayout(10, createComponents(size), new double[]{1.2, 3}); return customPane; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java index 5fdc4b011b..27d0a202a4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.form; +import com.formdev.flatlaf.ui.FlatRoundBorder; import com.fr.base.DynamicUnitList; import com.fr.base.ScreenResolution; import com.fr.design.cell.bar.DynamicScrollBar; @@ -11,9 +12,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.JDashboard; -import com.fr.design.mainframe.JForm; import com.fr.design.mainframe.JFormSliderPane; -import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplateProvider; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.form.FormElementCaseContainerProvider; @@ -59,6 +58,7 @@ public class FormReportComponentComposite extends JComponent implements TargetMo this.elementCaseDesigner.elementCasePane.getGrid().addMouseWheelListener(new FormReportComponentCompositeMouseWheelHandler(this)); elementCaseDesigner.addTargetModifiedListener(this); this.jSliderContainer.setShowValue((ScreenResolution.getScreenResolution() * HUND) / Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION); + setBorder(new FlatRoundBorder()); } public FormReportComponentComposite(BaseJForm jform, FormElementCaseDesigner elementCaseDesign, FormElementCaseContainerProvider ecContainer) { diff --git a/designer-realize/src/main/java/com/fr/design/report/freeze/FormECRepeatAndFreezeSettingPane.java b/designer-realize/src/main/java/com/fr/design/report/freeze/FormECRepeatAndFreezeSettingPane.java index 6e53599492..7ccc8771c6 100644 --- a/designer-realize/src/main/java/com/fr/design/report/freeze/FormECRepeatAndFreezeSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/freeze/FormECRepeatAndFreezeSettingPane.java @@ -30,6 +30,7 @@ public class FormECRepeatAndFreezeSettingPane extends RepeatAndFreezeSettingPane protected void addWriteFrozen(JPanel freezePanel, JPanel pagePanel) { super.initWriteFrozenPane(); + this.add(pagePanel); } } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java index 85e5272eb5..51a4c6e117 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/CheckBoxDefinePane.java @@ -7,7 +7,6 @@ import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; import com.fr.design.widgettheme.processor.WidgetThemeCreatorPaneAdder; import com.fr.form.ui.CheckBox; import com.fr.general.GeneralContext; @@ -37,8 +36,6 @@ public class CheckBoxDefinePane extends AbstractDataModify { protected final List> extraPaneList = new ArrayList<>(); protected JPanel extraPane; - protected static double F = TableLayout.FILL; - protected static double P = TableLayout.PREFERRED; public CheckBoxDefinePane() { this.iniComponents(); @@ -51,24 +48,16 @@ public class CheckBoxDefinePane extends AbstractDataModify { JPanel content = new JPanel(new BorderLayout()); - if (extraPane == null) { - content.add( - row( - cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"))).weight(LEFT_WEIGHT), - cell(text).weight(RIGHT_WEIGHT) - ).getComponent() - ); - } else { - content.add( - column( - 10, - row( - cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"))).weight(LEFT_WEIGHT), - cell(text)).weight(RIGHT_WEIGHT), - row(cell(extraPane)) - ).getComponent() - ); - } + content.add( + column( + 10, + row( + cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"))).weight(LEFT_WEIGHT), + cell(text).weight(RIGHT_WEIGHT) + ), + cell(extraPane) + ).getComponent() + ); UIExpandablePane uiExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 24, content); this.add(uiExpandablePane); } From 2ffd076c072e6da130cea745b0f9ac3861cb5c41 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 9 Sep 2024 18:33:08 +0800 Subject: [PATCH 23/26] =?UTF-8?q?REPORT-133908=20=E3=80=90fr-fbp=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E3=80=91DB2=20=E6=96=B0=E5=BB=BA=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E6=98=BE=E7=A4=BA=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/data/datapane/ChoosePane.java | 4 ++-- .../connect/LocalConnectionSource.java | 13 +++++++++++-- .../preview/ConnectionInfoBeanHelper.java | 18 +++++++++++++++++- .../tabledatapane/ProcedureDataPane.java | 4 ++-- .../com/fr/design/gui/ilist/TableViewList.java | 4 ++-- .../design/present/dict/DatabaseDictPane.java | 3 ++- .../fanruan/data/ConnectionConfigWrapper.java | 3 ++- 7 files changed, 38 insertions(+), 11 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java index 4229b54036..49af47f2ca 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java @@ -332,7 +332,7 @@ public class ChoosePane extends BasicBeanPane implements Refresha List authConnections = getHasAuthConnections(); for (String name : authConnections) { if (ComparatorUtils.equals(selectedDSName, name)) { - return ConnectionRepository.getInstance().getByName(name).getConnection(); + return ConnectionInfoBeanHelper.createConnection(ConnectionRepository.getInstance().getByName(name)); } } return null; @@ -442,7 +442,7 @@ public class ChoosePane extends BasicBeanPane implements Refresha boolean connect = false; com.fr.data.impl.Connection database = null; try { - database = ConnectionRepository.getInstance().getByName(paras.getDatabaseName()).getConnection(); + database = ConnectionInfoBeanHelper.createConnection(ConnectionRepository.getInstance().getByName(paras.getDatabaseName())); } catch (Exception e) { FineLoggerFactory.getLogger().info(e.getMessage(), e); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/LocalConnectionSource.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/LocalConnectionSource.java index bfad0a1850..1aaa2fb46a 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/LocalConnectionSource.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/LocalConnectionSource.java @@ -41,11 +41,20 @@ public class LocalConnectionSource extends BaseConnectionSource { } @Override - public void testConnection(ConnectionInfoBean database) throws Exception { + public ConnectionInfoBean getByName(String name) { + try { + return ConnectionInfoBeanHelper.createConnectionInfoBean(name, ConnectionConfigProviderFactory.getConfigProvider().getConnection(name)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public String[] testConnection(ConnectionInfoBean database) throws Exception { try { // 暂时这么处理,后续最好拉到外层包装一下 TransmissionEncryptionManager.setTransEncryptionLevel(1); - ConnectionProcessorFactory.testConnectionWithSchemaReturn(database); + return ConnectionProcessorFactory.testConnectionWithSchemaReturn(database); } catch (DriverNotFoundException e) { throw new DriverUnExistException(); } finally { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java index 6ad25c57c6..26ae869fcd 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java @@ -78,13 +78,29 @@ public class ConnectionInfoBeanHelper { return ans; } + /** + * 根据bean创建连接 + */ + public static Connection createConnection(ConnectionInfoBean infoBean) { + try { + if (JDBCConnectionProcessor.KEY.acceptConnectionTypes().contains(infoBean.getConnectionType())) { + return createJDBCConnection(infoBean); + } else { + return ConnectionProcessorFactory.createConnection(infoBean, true); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return null; + } + } + /** * 创建数据连接Bean,可自定义是否携带密码 */ public static ConnectionInfoBean createConnectionInfoBean(String name, Connection connection, boolean withPassword) throws Exception { if (connection instanceof NameDatabaseConnection) { name = ((NameDatabaseConnection) connection).getName(); - connection = ConnectionRepository.getInstance().getByName(name).getConnection(); + connection = createConnection(ConnectionRepository.getInstance().getByName(name)); } if (JDBCConnectionProcessor.KEY.acceptConnections().contains(connection.getClass())) { ConnectionInfoBean bean = new ConnectionInfoBean(); diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java index a5ced9dfe0..e1d9263c90 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java @@ -20,6 +20,7 @@ import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane; import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane.DoubleClickSelectedNodeOnTreeListener; +import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper; import com.fr.design.data.datapane.sqlpane.SQLEditPane; import com.fr.design.data.tabledata.ResponseDataSourceChange; import com.fr.design.data.tabledata.StoreProcedureWorkerListener; @@ -187,8 +188,7 @@ public class ProcedureDataPane extends AbstractTableDataPane imp } private boolean isAutoParameterDatabase() { - ConnectionBean bean = ConnectionRepository.getInstance().getByName(connectionTableProcedurePane.getSelectedDatabaseConnnectonName()); - Connection connection = bean == null ? null : bean.getConnection(); + Connection connection = ConnectionInfoBeanHelper.createConnection(ConnectionRepository.getInstance().getByName(connectionTableProcedurePane.getSelectedDatabaseConnnectonName())); return connection != null && ArrayUtils.contains(DRIVERS, connection.getDriver()); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java b/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java index b0483dfdd3..682e68be7d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilist/TableViewList.java @@ -104,7 +104,7 @@ public class TableViewList extends UIList { @Override protected DefaultListModel doInBackground() throws Exception { - Connection datasource = ConnectionRepository.getInstance().getByName(databaseName).getConnection(); + Connection datasource = ConnectionInfoBeanHelper.createConnection(ConnectionRepository.getInstance().getByName(databaseName)); boolean status = false; int count = 3; //总共给3次连接的机会 @@ -168,7 +168,7 @@ public class TableViewList extends UIList { */ private DefaultListModel processDataInAnotherThread(String databaseName, String searchFilter, String... typesFilter) throws Exception { DefaultListModel defaultListModel = new DefaultListModel(); - Connection datasource = ConnectionRepository.getInstance().getByName(databaseName).getConnection(); + Connection datasource = ConnectionInfoBeanHelper.createConnection(ConnectionRepository.getInstance().getByName(databaseName)); if (datasource == null) { return defaultListModel; } diff --git a/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java b/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java index 2c1f46a4a1..aa126574ea 100644 --- a/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java +++ b/designer-base/src/main/java/com/fr/design/present/dict/DatabaseDictPane.java @@ -15,6 +15,7 @@ import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.ChoosePane; import com.fr.design.data.datapane.DataBaseItems; import com.fr.design.data.datapane.VerticalChoosePane; +import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper; import com.fr.design.data.datapane.preview.PreviewLabel.Previewable; import com.fr.design.editor.DoubleDeckValueEditorPane; import com.fr.design.editor.editor.ColumnIndexEditor; @@ -178,7 +179,7 @@ public class DatabaseDictPane extends FurtherBasicBeanPane i if (StringUtils.isBlank(para.getDatabaseName())) { dbDict.setDatabaseConnection(null); } else { - Connection connection = ConnectionRepository.getInstance().getByName(para.getDatabaseName()).getConnection(); + Connection connection = ConnectionInfoBeanHelper.createConnection(ConnectionRepository.getInstance().getByName(para.getDatabaseName())); if (connection != null) { database = new NameDatabaseConnection(para.getDatabaseName()); dbDict.setDatabaseConnection(database); diff --git a/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java b/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java index 8dd3ea86e5..68516dd7b8 100644 --- a/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java +++ b/designer-realize/src/main/java/com/fanruan/data/ConnectionConfigWrapper.java @@ -3,6 +3,7 @@ package com.fanruan.data; import com.fanruan.config.impl.data.ConnectionConfigProvider; import com.fanruan.config.impl.data.ConnectionConfigWriter; import com.fr.data.impl.Connection; +import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper; import com.fr.file.ConnectionConfig; import com.fr.log.FineLoggerFactory; import com.fr.transaction.Configurations; @@ -108,7 +109,7 @@ public class ConnectionConfigWrapper implements ConnectionConfigProvider, Connec @Override public @Nullable Connection getConnection(@NotNull String connectionName) { - Connection connection = WorkContext.getCurrent().isLocal() ? ConnectionConfig.getInstance().getConnection(connectionName) : ConnectionRepository.getInstance().getByName(connectionName).getConnection(); + Connection connection = WorkContext.getCurrent().isLocal() ? ConnectionConfig.getInstance().getConnection(connectionName) : ConnectionInfoBeanHelper.createConnection(ConnectionRepository.getInstance().getByName(connectionName));; if (connection != null) { connection.setConnectionName(connectionName); } From a01affc9e57d26a7f297938def0f6a54ed65cb2b Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 10 Sep 2024 09:42:10 +0800 Subject: [PATCH 24/26] =?UTF-8?q?REPORT-133888=20=E3=80=90fr-fbp=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E3=80=91=E6=96=87=E4=BB=B6=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?excel=E5=8F=AA=E8=83=BD=E8=A2=AB=E9=80=89=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/file/FILEChooserPane.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 2cf1016c48..8b6d645fb3 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -1092,7 +1092,29 @@ public class FILEChooserPane extends BasicPane { String lastDirectoryPath = DesignerEnvManager.getEnvManager().getDialogCurrentDirectory(); String prefix = DesignerEnvManager.getEnvManager().getCurrentDirectoryPrefix(); FILE lastDirectory = FILEFactory.createFolder(prefix + lastDirectoryPath); + dealCurrentDirectory(model, lastDirectory) ; + } + + + + private void setPlaceListModel4DataFile(AbstractPlaceListModel model) { + if (placesList == null) { + return; + } + placesList.setModel(model); + String lastDirectoryPath = FILEFactory.ENV_PREFIX; + String prefix = ProjectConstants.REPORTLETS_NAME; + FILE lastDirectory; + if (model instanceof FileDataPlaceListModel) { + FileDataFILE file = new FileDataFILE(new FileNode(), false, StringUtils.EMPTY, ((FileDataPlaceListModel) model).getType()); + lastDirectory = FILEFactory.createFolder(file, prefix + lastDirectoryPath); + } else { + lastDirectory = FILEFactory.createFolder(prefix + lastDirectoryPath); + } + dealCurrentDirectory(model, lastDirectory); + } + private void dealCurrentDirectory(AbstractPlaceListModel model, FILE lastDirectory) { model.setCD(lastDirectory); if (currentDirectory != null) { @@ -1109,6 +1131,7 @@ public class FILEChooserPane extends BasicPane { } } + private void setPlaceListModel() { if (placesList == null) { return; @@ -1140,7 +1163,7 @@ public class FILEChooserPane extends BasicPane { if (placesList == null) { return; } - setPlaceListModel(new FileDataPlaceListModel(type)); + setPlaceListModel4DataFile(new FileDataPlaceListModel(type)); } protected void setFileCAPlaceListModel() { From 8ff689ba4dd429d56288dd7d7ce4a391d8ea980b Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 10 Sep 2024 11:20:35 +0800 Subject: [PATCH 25/26] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1,=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/optimized/ConfigurationActivator4Designer.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/module/optimized/ConfigurationActivator4Designer.java b/designer-realize/src/main/java/com/fr/start/module/optimized/ConfigurationActivator4Designer.java index 5a01fed354..60ad6922bb 100644 --- a/designer-realize/src/main/java/com/fr/start/module/optimized/ConfigurationActivator4Designer.java +++ b/designer-realize/src/main/java/com/fr/start/module/optimized/ConfigurationActivator4Designer.java @@ -1,11 +1,7 @@ package com.fr.start.module.optimized; import com.fr.config.activator.ConfigurationActivator; -import com.fr.config.dao.DaoContext; import com.fr.config.dao.DaoSelectorFactory; -import com.fr.config.dao.impl.remote.PropertiesClassHelperDao; -import com.fr.config.dao.impl.remote.PropertiesEntityDao; -import com.fr.config.dao.impl.remote.PropertiesXmlEntityDao; import com.fr.transaction.PropertiesTransactor; import com.fr.transaction.TransactorFactory; @@ -20,9 +16,6 @@ public class ConfigurationActivator4Designer extends ConfigurationActivator { protected void initLocalDao() { if (DaoSelectorFactory.getDaoSelector().useCacheDao()) { TransactorFactory.setTransactor(new PropertiesTransactor()); - DaoContext.setClassHelperDao(new PropertiesClassHelperDao()); - DaoContext.setEntityDao(new PropertiesEntityDao()); - DaoContext.setXmlEntityDao(new PropertiesXmlEntityDao()); } else { super.initLocalDao(); } From 38995898be1487fa38e5f077a952ae14f44e11ce Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 10 Sep 2024 14:53:33 +0800 Subject: [PATCH 26/26] =?UTF-8?q?fix:=E7=AA=97=E5=8F=A3=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=BC=A9=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java b/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java index 8b0e8739cf..88c6e30b5f 100644 --- a/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java +++ b/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java @@ -53,6 +53,6 @@ public class DesignSizeI18nManager { if (arr.length < SPLIT_LENGTH) { return BasicDialog.DEFAULT; } - return FineUIScale.scale(new Dimension(Integer.parseInt(arr[WIDTH_INDEX]), Integer.parseInt(arr[HEIGHT_INDEX]))); + return new Dimension(Integer.parseInt(arr[WIDTH_INDEX]), Integer.parseInt(arr[HEIGHT_INDEX])); } }