diff --git a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java index 1eb6c18637..2ced39c685 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java +++ b/designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java @@ -24,8 +24,6 @@ import java.awt.Dimension; @Immutable public abstract class AbstractIconSource implements IconSource { - private static final String ICON_DISABLE_SUFFIX = "_disable"; - protected String id; protected final IconResource resource; @@ -98,11 +96,6 @@ public abstract class AbstractIconSource implements IconSource implements IconSource ICON_SETS = new ArrayList<>(2); private static final HashMap> CACHE = new HashMap<>(64); @@ -149,4 +150,15 @@ public class IconManager { public static void clearCache() { CACHE.clear(); } + + /** + * 查找灰化图标 + * + * @param path 原始路径 + * @return 灰化路径 + */ + public static String findDisablePath(String path) { + int i = path.lastIndexOf('.'); + return path.substring(0, i) + ICON_DISABLE_SUFFIX + path.substring(i); + } } diff --git a/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java index f341317d0c..fc769c7557 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java +++ b/designer-base/src/main/java/com/fine/theme/icon/JsonIconSet.java @@ -58,35 +58,51 @@ public class JsonIconSet extends AbstractIconSet { */ private void applyIcon(String key, Object value) { if (value instanceof String) { - String path = (String) value; - if (IconManager.isSvgIcon(path)) { - addIcon(new SvgIconSource(key, base + path)); - } else if (IconManager.isImageIcon(path)) { - addIcon(new ImageIconSource(key, base + path)); - } - // 其他无法识别格式不处理 + dealWithIconString(key, (String) value); } else if (value instanceof Map) { - Map iconObj = (Map) value; - String normalPath = (String) iconObj.get(IconType.normal.name()); - String disablePath = (String) iconObj.get(IconType.disable.name()); - String whitePath = (String) iconObj.get(IconType.white.name()); - // 暂不支持混合格式,每个id的格式需要保持一致 - if (IconManager.isSvgIcon(normalPath)) { - addIcon(new SvgIconSource(key, - base + normalPath, - base + disablePath, - base + whitePath - )); - } else if (IconManager.isImageIcon(normalPath)) { - addIcon(new ImageIconSource(key, - base + normalPath, - base + disablePath, - base + whitePath - )); - } + dealWithIconMap(key, (Map) value); } } + /** + * 处理字符串格式的icon配置 + */ + private void dealWithIconString(String key, String value) { + if (IconManager.isSvgIcon(value)) { + // 默认字符串提供正常图和灰化图 + addIcon(new SvgIconSource(key, + base + value, + IconManager.findDisablePath(base + value), + null + )); + } else if (IconManager.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 (IconManager.isSvgIcon(normalPath)) { + addIcon(new SvgIconSource(key, + base + normalPath, + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null + )); + } else if (IconManager.isImageIcon(normalPath)) { + addIcon(new ImageIconSource(key, + base + normalPath, + StringUtils.isNotBlank(disablePath) ? base + disablePath : null, + StringUtils.isNotBlank(whitePath) ? base + whitePath : null + )); + } + } @Override diff --git a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java index 051e8d1280..eee575d50b 100644 --- a/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java +++ b/designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java @@ -2,8 +2,10 @@ package com.fine.theme.icon.svg; import com.fine.theme.icon.DisabledIcon; import com.fine.theme.icon.GraphicsFilter; +import com.fine.theme.icon.IconManager; import com.fine.theme.icon.IconResource; import com.fine.theme.icon.IconType; +import com.fine.theme.icon.UrlIconResource; import com.fine.theme.icon.WhiteIcon; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -24,7 +26,6 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.RGBImageFilter; -import java.util.Objects; import java.util.StringJoiner; import static com.fine.theme.utils.FineUIScale.scale; @@ -48,8 +49,12 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { private final IconResource resource; private final IconType type; - private final NullableLazyValue svgDocument = NullableLazyValue.createValue(() -> load(IconType.normal)); - private final NullableLazyValue whiteSvgDocument = NullableLazyValue.createValue(() -> load(IconType.white)); + private final static NullableLazyValue DEFAULT_ICON_DOC = + NullableLazyValue.createValue(SvgIcon::loadDefault); + private final NullableLazyValue svgDocument = + NullableLazyValue.createValue(() -> load(IconType.normal)); + private final NullableLazyValue whiteSvgDocument = + NullableLazyValue.createValue(() -> load(IconType.white)); public SvgIcon(IconResource resource, Dimension size, IconType type) { this.resource = resource; @@ -69,8 +74,34 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { g = grayGraphics(g); } Object[] oldRenderingHints = FlatUIUtils.setRenderingHints(g); - render(c, g, x, y); - FlatUIUtils.resetRenderingHints(g, oldRenderingHints); + try { + render(c, g, x, y, this::fallbackRender); + } finally { + FlatUIUtils.resetRenderingHints(g, oldRenderingHints); + } + } + + /** + * 用于fallback渲染disable图像,这段代码来自异常分支,使用率要保持较低水平 + */ + private boolean fallbackRender(Component c, Graphics g, int x, int y) { + if (resource instanceof UrlIconResource) { + String path = ((UrlIconResource) resource).getPath(); + int index = path.lastIndexOf(IconManager.ICON_DISABLE_SUFFIX); + if (path.contains(IconManager.ICON_DISABLE_SUFFIX) && index > 0) { + SVGLoader loader = new SVGLoader(); + SVGDocument document = loader.load( + new UrlIconResource(path.substring(0, index) + + path.substring(index + IconManager.ICON_DISABLE_SUFFIX.length())) + .getInputStream()); + if (document != null) { + document.render((JComponent) c, grayGraphics(g), + new ViewBox(x, y, scaleSize.width, scaleSize.height)); + return true; + } + } + } + return false; } private Graphics2D grayGraphics(Graphics g) { @@ -92,20 +123,35 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { return scaleSize.height; } - private void render(Component c, Graphics g, int x, int y) { + private void render(Component c, Graphics g, int x, int y, FallbackRender fallbackRender) { + SVGDocument document; try { if (type == IconType.white) { - Objects.requireNonNull(whiteSvgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); + document = whiteSvgDocument.getValue(); } else { - Objects.requireNonNull(svgDocument.getValue()) - .render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); + document = svgDocument.getValue(); } + // 由于 weisj 库中加载svg描述出现问题,则返回一个Null,这里补充一个默认图标 + if (document == null) { + document = DEFAULT_ICON_DOC.getValue(); + } + document.render((JComponent) c, (Graphics2D) g, new ViewBox(x, y, scaleSize.width, scaleSize.height)); } catch (Exception e) { - FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); + boolean rendered = fallbackRender.render(c, g, x, y); + if (rendered) { + FineLoggerFactory.getLogger().warn("SvgIcon from url: " + resource + " paint with fallbackRender"); + } else { + FineLoggerFactory.getLogger().error("SvgIcon from url: " + resource + "can not paint.", e); + } } } + private static SVGDocument loadDefault() { + SVGLoader loader = new SVGLoader(); + UrlIconResource iconResource = new UrlIconResource("com/fine/theme/icon/default.svg"); + return loader.load(iconResource.getInputStream()); + } + private SVGDocument load(IconType type) { SVGLoader loader = new SVGLoader(); @@ -114,7 +160,6 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { : loader.load(resource.getInputStream()); } - @Override public String toString() { return new StringJoiner(", ", SvgIcon.class.getSimpleName() + "[", "]") @@ -141,4 +186,22 @@ public class SvgIcon implements DisabledIcon, WhiteIcon, Icon { public @NotNull SvgIcon disabled() { return new SvgIcon(resource, size, IconType.disable); } + + + /** + * 用于回退渲染的回调类 + */ + @FunctionalInterface + interface FallbackRender { + /** + * 渲染图标 + * + * @param c 待绘制组件 + * @param g 抽象画板 + * @param x 起点横坐标 + * @param y 起点纵坐标 + * @return 是否使用了回退渲染 + */ + boolean render(Component c, Graphics g, int x, int y); + } } diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg old mode 100755 new mode 100644 index 6cb73b6991..ad9e75210d --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report.svg @@ -1,5 +1,5 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_report_disable.svg old mode 100755 new mode 100644 diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg old mode 100755 new mode 100644 index d2aa41ea80..6f9d1f6d6c --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word.svg @@ -1,7 +1,7 @@ - + - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg old mode 100755 new mode 100644 index f8f711c520..ae6a0a3fa4 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/add_word_disable.svg @@ -1,7 +1,12 @@ + + + + + + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg old mode 100755 new mode 100644 index fc346b19de..01e6c412ae --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile.svg @@ -1,8 +1,10 @@ + - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg old mode 100755 new mode 100644 index ec09f32baa..16e2c4117f --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/bmpFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg old mode 100755 new mode 100644 index cda2a6cb93..2422bcf307 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile.svg @@ -1,4 +1,5 @@ + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/chtFile_disable.svg old mode 100755 new mode 100644 diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg old mode 100755 new mode 100644 index e3e9893bba..4fc380e73a --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile.svg @@ -1,6 +1,7 @@ + - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg old mode 100755 new mode 100644 index 3201b3d581..ed15882e48 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/classFile_disable.svg @@ -1,6 +1,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg old mode 100755 new mode 100644 index 9c5f01a364..18791ee41d --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked.svg @@ -1,6 +1,7 @@ - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/cpt_locked_disable.svg old mode 100755 new mode 100644 diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile.svg new file mode 100644 index 0000000000..6cce0ba0a7 --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile_disable.svg new file mode 100644 index 0000000000..ede1cbc16a --- /dev/null +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/csvFile_disable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg old mode 100755 new mode 100644 index 8143080cac..5dd91fb6a7 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile.svg @@ -1,6 +1,7 @@ + - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg old mode 100755 new mode 100644 index fad1fa2a1c..fc89982901 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excelFile_disable.svg @@ -1,6 +1,6 @@ + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg old mode 100755 new mode 100644 index 3faf981f21..2a21450f81 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import.svg @@ -3,5 +3,5 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg old mode 100755 new mode 100644 index 04fd0b9b4a..c4fdb4b49f --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/excel_import_disable.svg @@ -1,7 +1,7 @@ + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg old mode 100755 new mode 100644 index 70e75f46c7..f1408b67f2 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile.svg @@ -1,8 +1,8 @@ + - - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg old mode 100755 new mode 100644 index 712692d1bd..00d288d930 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/flashFile_disable.svg @@ -1,7 +1,7 @@ + + - - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg old mode 100755 new mode 100644 index 8bd63be484..a602e102cb --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked.svg @@ -4,6 +4,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg old mode 100755 new mode 100644 index b2fb1bc31a..77eeb6f351 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/frm_locked_disable.svg @@ -4,6 +4,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg old mode 100755 new mode 100644 index 6c64fd7241..945e988e75 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg old mode 100755 new mode 100644 index 709124b0d6..b4e60659d4 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/gifFile_disable.svg @@ -1,8 +1,8 @@ + + + - - - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg old mode 100755 new mode 100644 index 6a65b848ba..a593de1653 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile.svg @@ -1,11 +1,10 @@ + - - - - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg old mode 100755 new mode 100644 index 809c5f12e7..597eaadfa0 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/htmlFile_disable.svg @@ -1,10 +1,9 @@ - - - - + + + + - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg old mode 100755 new mode 100644 index cb3bfd8924..8cf93ffc01 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg old mode 100755 new mode 100644 index 0b1d5f818b..a2b58b1e96 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jarFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg old mode 100755 new mode 100644 index f2e2e3c2f8..185bc71a87 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile.svg @@ -1,9 +1,10 @@ + - - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg old mode 100755 new mode 100644 index 53acf3252e..7d94b54e8c --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/javaFile_disable.svg @@ -1,9 +1,9 @@ - - - - + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg old mode 100755 new mode 100644 index 32e7d50fd2..0f0065ecf3 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg old mode 100755 new mode 100644 index 5ddc6a39cf..2a9c644837 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jpgFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg old mode 100755 new mode 100644 index 97756c235c..596cac7d7c --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile.svg @@ -1,7 +1,8 @@ + - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg old mode 100755 new mode 100644 index 4c05097233..7777d71f41 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jsFile_disable.svg @@ -1,7 +1,7 @@ - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg old mode 100755 new mode 100644 index 27be0dcb20..d029535ad9 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg old mode 100755 new mode 100644 index dc1ad39412..2d00642e09 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/jspFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg old mode 100755 new mode 100644 index 9146d94cc6..9ec5ffb81f --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg old mode 100755 new mode 100644 index 6f97ecfc05..bd3c767845 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pdfFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg old mode 100755 new mode 100644 index 527e0a204e..cf2cb0dd9b --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile.svg @@ -1,8 +1,9 @@ + - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg old mode 100755 new mode 100644 index 37a41dc9d5..83adf9d2cd --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/pngFile_disable.svg @@ -1,8 +1,8 @@ + + + - - - diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg old mode 100755 new mode 100644 index f24f8bb647..432938f062 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile.svg @@ -1,11 +1,12 @@ - - - - - - - - - + + + + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg old mode 100755 new mode 100644 index 441ed97a70..3dedd47e58 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/sqlFile_disable.svg @@ -1,10 +1,9 @@ - - - - - - - - + + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg old mode 100755 new mode 100644 index 6dc5bab611..2ca4ef17f7 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile.svg @@ -1,6 +1,6 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg old mode 100755 new mode 100644 index 80ae82c64d..c46e574960 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/wordFile_disable.svg @@ -1,6 +1,11 @@ - + + + + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg old mode 100755 new mode 100644 index ea58c34918..135b429b03 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile.svg @@ -3,5 +3,5 @@ - + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg old mode 100755 new mode 100644 index ccd9aae917..687ed47b4b --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xlsFile_disable.svg @@ -1,7 +1,7 @@ - - + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg old mode 100755 new mode 100644 index c5b68c24d0..af5aecd593 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile.svg @@ -1,9 +1,9 @@ + - - - - + + + diff --git a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg old mode 100755 new mode 100644 index 4aaa3dfc2c..9257262130 --- a/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg +++ b/designer-base/src/main/resources/com/fine/theme/icon/filetree/filetype/xmlFile_disable.svg @@ -1,8 +1,8 @@ - - - + + + 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 19f4d0900a..4e3213695b 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 @@ -134,8 +134,9 @@ "image": "insert/image.svg", "bias": "insert/bias.svg", "sub_report": "insert/sub_report.svg", - "chart_line": "chart/chart_line.svg", - "popup": "popup/popup.svg", + "popup": { + "normal": "popup/popup.svg" + }, "clear": "clear.svg", "clear_hover": "clear_hover.svg", "tool_copy": "toolbar/copy.svg", diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/DebugStory.java b/designer-base/src/test/java/com/fr/design/gui/storybook/DebugStory.java new file mode 100644 index 0000000000..ef000aabe5 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/DebugStory.java @@ -0,0 +1,21 @@ +package com.fr.design.gui.storybook; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 单面板调试注解,如果components目录下带有这个注解, + * 那么Storybook中只有带有这个注解的界面被展示 + * + * @author vito + * @since 11.0 + * Created on 2024/6/11 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Inherited +public @interface DebugStory { +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java index 635b342c15..d8b09ca523 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/Storybook.java @@ -9,6 +9,7 @@ import com.formdev.flatlaf.extras.FlatAnimatedLafChange; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.formdev.flatlaf.util.UIScale; import com.fr.design.gui.UILookAndFeel; +import com.fr.third.org.reflections.Reflections; import com.fr.value.NotNullLazyValue; import javax.swing.DefaultListCellRenderer; @@ -29,11 +30,10 @@ import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import static com.fine.swing.ui.layout.Layouts.cell; @@ -108,33 +108,30 @@ public class Storybook { private StoryBookComponent[] components() { ArrayList components = new ArrayList<>(); - for (String s : getClasses()) { - components.add(new StoryBookComponent(s.replace("StoryBoard", ""), COMPONENTS_PACKAGE + s)); + List> componentList = getDebugClasses(); + if (componentList.isEmpty()) { + componentList = getClasses(); + } + for (Class s : componentList) { + components.add( + new StoryBookComponent(s.getSimpleName().replace("StoryBoard", ""), s.getTypeName())); } return components.toArray(new StoryBookComponent[0]); } - private static List getClasses() { - List classNames = new ArrayList<>(); - URL resource = Storybook.class.getResource(COMPONENTS_DIR); - try { - File folder = new File(resource.toURI()); - File[] files = folder.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isFile() && file.getName().endsWith(".class")) { - String className = file.getName().replace(".class", ""); - if (isStory(className)) { - classNames.add(className); - } - } - } - } - return classNames.stream().sorted().collect(Collectors.toList()); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } + private static List> getClasses() { + Reflections reflections = new Reflections("com.fr.design.gui.storybook.components"); + Set> storyClass = reflections.getTypesAnnotatedWith(Story.class); + Set> classSet = reflections.getSubTypesOf(StoryBoard.class); + storyClass.addAll(classSet); + return storyClass.stream().sorted(Comparator.comparing(Class::getSimpleName)).collect(Collectors.toList()); + } + + private static List> getDebugClasses() { + Reflections reflections = new Reflections("com.fr.design.gui.storybook.components"); + Set> types = reflections.getTypesAnnotatedWith(DebugStory.class); + return new ArrayList<>(types); } /** diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java index aefcb16d5a..e86582dd5f 100644 --- a/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java +++ b/designer-base/src/test/java/com/fr/design/gui/storybook/components/IconStoryBoard.java @@ -1,15 +1,18 @@ package com.fr.design.gui.storybook.components; +import com.fine.swing.ui.layout.Layouts; import com.fine.theme.icon.LazyIcon; +import com.fine.theme.light.ui.FineLightIconSet; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.storybook.Story; import com.fr.design.gui.storybook.StoryBoard; import javax.swing.JLabel; +import javax.swing.SwingConstants; 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.fix; -import static com.fine.swing.ui.layout.Layouts.flex; import static com.fine.swing.ui.layout.Layouts.row; /** @@ -19,42 +22,50 @@ import static com.fine.swing.ui.layout.Layouts.row; */ @Story public class IconStoryBoard extends StoryBoard { + private FineLightIconSet iconSet = new FineLightIconSet(); + public IconStoryBoard() { super("图标"); - add( - cell(new UILabel("普通图标")).with(this::h3), - row(10, - cell(new JLabel(new LazyIcon("cut"))), - cell(new JLabel(new LazyIcon("save"))), - cell(new JLabel(new LazyIcon("copy"))), - cell(new JLabel(new LazyIcon("formatBrush"))), - cell(new JLabel(new LazyIcon("paste"))), - cell(new JLabel(new LazyIcon("undo"))), - cell(new JLabel(new LazyIcon("redo"))) + add(row( + column(10, + cell(new UILabel("普通图标")).with(this::h3), + icons() ), fix(5), - cell(new UILabel("禁用图标")).with(this::h3), - row(10, - cell(new JLabel(new LazyIcon("cut").disabled())), - cell(new JLabel(new LazyIcon("save").disabled())), - cell(new JLabel(new LazyIcon("copy").disabled())), - cell(new JLabel(new LazyIcon("formatBrush").disabled())), - cell(new JLabel(new LazyIcon("paste").disabled())), - cell(new JLabel(new LazyIcon("undo").disabled())), - cell(new JLabel(new LazyIcon("redo").disabled())) + column(10, + cell(new UILabel("禁用图标")).with(this::h3), + disableIcons() ), fix(5), - cell(new UILabel("白化图标")).with(this::h3), - row(10, - cell(new JLabel(new LazyIcon("cut").white())), - cell(new JLabel(new LazyIcon("save").white())), - cell(new JLabel(new LazyIcon("copy").white())), - cell(new JLabel(new LazyIcon("formatBrush").white())), - cell(new JLabel(new LazyIcon("paste").white())), - cell(new JLabel(new LazyIcon("undo").white())), - cell(new JLabel(new LazyIcon("redo").white())) - ), - flex() + column(10, + cell(new UILabel("白化图标")).with(this::h3), + whiteIcons() + )) ); } + + private Layouts.Cell icons() { + return column(10, + iconSet.getIds().stream().sorted() + .map(id -> cell(new JLabel(id, new LazyIcon(id), SwingConstants.LEFT))) + .toArray(Layouts.Cell[]::new)); + } + + private Layouts.Cell disableIcons() { + return column(10, + iconSet.getIds().stream().sorted() + .map(id -> cell(new JLabel(id, new LazyIcon(id).disabled(), SwingConstants.LEFT)) + .with(it -> { + it.setDisabledIcon(new LazyIcon(id).disabled()); + it.setEnabled(false); + })) + .toArray(Layouts.Cell[]::new)); + } + + private Layouts.Cell whiteIcons() { + return column(10, + iconSet.getIds().stream().sorted() + .map(id -> cell(new JLabel(id, new LazyIcon(id).white(), SwingConstants.LEFT))) + .toArray(Layouts.Cell[]::new)); + } }