From 4ab8a7ec1fd12cd7bdf58f6f1c3e77bcd8547705 Mon Sep 17 00:00:00 2001 From: lucian Date: Tue, 23 Feb 2021 09:41:53 +0800 Subject: [PATCH 01/39] =?UTF-8?q?REPORT-48228=20=E3=80=9010.0.15=E3=80=91?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E6=8E=A5=E5=8F=A3-=E6=8F=92?= =?UTF-8?q?=E4=BB=B6jar=E5=8C=85=E4=B8=8D=E5=8C=B9=E9=85=8D=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fun/PluginErrorRemindHandleProvider.java | 19 ++++++++++++ ...stractPluginErrorRemindHandleProvider.java | 30 +++++++++++++++++++ .../com/fr/env/PluginErrorRemindDialog.java | 14 +++++++++ 3 files changed, 63 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginErrorRemindHandleProvider.java diff --git a/designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java b/designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java new file mode 100644 index 000000000..4e1eb44c2 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java @@ -0,0 +1,19 @@ +package com.fr.design.fun; + +import com.fr.stable.fun.mark.Selectable; + +/** + * 插件不匹配时设计器提示框的“立即处理”事件 + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2021/2/20 + */ +public interface PluginErrorRemindHandleProvider extends Selectable { + + String MARK_STRING = "PluginErrorRemindHandleProvider"; + + int CURRENT_LEVEL = 1; + + // 打开插件管理 + void openPluginManager(); +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginErrorRemindHandleProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginErrorRemindHandleProvider.java new file mode 100644 index 000000000..e8f24a753 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginErrorRemindHandleProvider.java @@ -0,0 +1,30 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.PluginErrorRemindHandleProvider; +import com.fr.stable.fun.assist.Selector; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2021/2/20 + */ +@API(level = PluginErrorRemindHandleProvider.CURRENT_LEVEL) +public abstract class AbstractPluginErrorRemindHandleProvider extends AbstractProvider implements PluginErrorRemindHandleProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } + + @Override + public Selector selector() { + return Selector.ALWAYS; + } + +} diff --git a/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java b/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java index 42dae0fa1..dbdb21826 100644 --- a/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java +++ b/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java @@ -1,12 +1,15 @@ package com.fr.env; +import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.server.PluginManagerAction; +import com.fr.design.fun.PluginErrorRemindHandleProvider; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; import com.fr.general.IOUtils; +import com.fr.stable.bridge.ObjectHolder; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -23,6 +26,7 @@ import java.awt.Frame; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Set; /** * 插件启动失败提示窗 @@ -113,6 +117,16 @@ public class PluginErrorRemindDialog extends JDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { this.jDialog.dispose(); + // 先从插件找 + Set providers = ExtraDesignClassManager.getInstance().getArray(PluginErrorRemindHandleProvider.MARK_STRING); + if (providers != null) { + for (PluginErrorRemindHandleProvider provider : providers) { + if (provider.selector().accept(new ObjectHolder())) { + provider.openPluginManager(); + return; + } + } + } super.actionPerformed(e); } } From 96896d5f36d4f146d3b8fb0007bdd7c90784634d Mon Sep 17 00:00:00 2001 From: lucian Date: Wed, 24 Feb 2021 10:33:28 +0800 Subject: [PATCH 02/39] =?UTF-8?q?REPORT-47901=20=E5=A1=AB=E6=8A=A5-?= =?UTF-8?q?=E5=AF=BC=E5=85=A5excel-=E5=8F=8C=E5=90=91=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=98=AF=EF=BC=8C=E8=A1=A8=E5=A4=B4=E9=83=A8=E5=88=86=E6=89=A9?= =?UTF-8?q?=E5=B1=95=EF=BC=8C=E5=A4=9A=E8=A1=8C=E5=AF=BC=E5=85=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fun/PluginErrorRemindHandleProvider.java | 19 ----------- .../fr/design/fun/PluginManagerProvider.java | 20 +++++++++++ ...ava => AbstractPluginManagerProvider.java} | 6 ++-- .../mainframe/toolbar/ToolBarMenuDock.java | 16 ++++++++- .../com/fr/env/PluginErrorRemindDialog.java | 33 +++++++++++-------- 5 files changed, 58 insertions(+), 36 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/PluginManagerProvider.java rename designer-base/src/main/java/com/fr/design/fun/impl/{AbstractPluginErrorRemindHandleProvider.java => AbstractPluginManagerProvider.java} (66%) diff --git a/designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java b/designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java deleted file mode 100644 index 4e1eb44c2..000000000 --- a/designer-base/src/main/java/com/fr/design/fun/PluginErrorRemindHandleProvider.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fr.design.fun; - -import com.fr.stable.fun.mark.Selectable; - -/** - * 插件不匹配时设计器提示框的“立即处理”事件 - * @author Lucian.Chen - * @version 10.0 - * Created by Lucian.Chen on 2021/2/20 - */ -public interface PluginErrorRemindHandleProvider extends Selectable { - - String MARK_STRING = "PluginErrorRemindHandleProvider"; - - int CURRENT_LEVEL = 1; - - // 打开插件管理 - void openPluginManager(); -} diff --git a/designer-base/src/main/java/com/fr/design/fun/PluginManagerProvider.java b/designer-base/src/main/java/com/fr/design/fun/PluginManagerProvider.java new file mode 100644 index 000000000..11fcecc2c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/PluginManagerProvider.java @@ -0,0 +1,20 @@ +package com.fr.design.fun; + +import com.fr.design.actions.UpdateAction; +import com.fr.stable.fun.mark.Selectable; + +/** + * 替换插件管理入口 + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2021/2/20 + */ +public interface PluginManagerProvider extends Selectable { + + String MARK_STRING = "PluginManagerProvider"; + + int CURRENT_LEVEL = 1; + + // 插件管理 + UpdateAction pluginManagerAction(); +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginErrorRemindHandleProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginManagerProvider.java similarity index 66% rename from designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginErrorRemindHandleProvider.java rename to designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginManagerProvider.java index e8f24a753..cfffd66f4 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginErrorRemindHandleProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginManagerProvider.java @@ -1,6 +1,6 @@ package com.fr.design.fun.impl; -import com.fr.design.fun.PluginErrorRemindHandleProvider; +import com.fr.design.fun.PluginManagerProvider; import com.fr.stable.fun.assist.Selector; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -10,8 +10,8 @@ import com.fr.stable.fun.mark.API; * @version 10.0 * Created by Lucian.Chen on 2021/2/20 */ -@API(level = PluginErrorRemindHandleProvider.CURRENT_LEVEL) -public abstract class AbstractPluginErrorRemindHandleProvider extends AbstractProvider implements PluginErrorRemindHandleProvider { +@API(level = PluginManagerProvider.CURRENT_LEVEL) +public abstract class AbstractPluginManagerProvider extends AbstractProvider implements PluginManagerProvider { public int currentAPILevel() { return CURRENT_LEVEL; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index d1abb908b..d9a7ecf3c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -41,6 +41,7 @@ import com.fr.design.actions.server.PluginManagerAction; import com.fr.design.file.NewTemplatePane; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; +import com.fr.design.fun.PluginManagerProvider; import com.fr.design.fun.TableDataPaneProcessor; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -72,6 +73,7 @@ import com.fr.plugin.observer.PluginEventListener; import com.fr.plugin.observer.PluginEventType; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; +import com.fr.stable.bridge.ObjectHolder; import com.fr.stable.os.support.OSBasedAction; import com.fr.stable.os.support.OSSupportCenter; import com.fr.start.OemHandler; @@ -489,7 +491,7 @@ public abstract class ToolBarMenuDock { if (!DesignerMode.isAuthorityEditing()) { if (shouldShowPlugin()) { menuDef.addShortCut( - new PluginManagerAction() + createPluginManagerAction() ); } menuDef.addShortCut( @@ -502,6 +504,18 @@ public abstract class ToolBarMenuDock { return menuDef; } + private ShortCut createPluginManagerAction() { + Set providers = ExtraDesignClassManager.getInstance().getArray(PluginManagerProvider.MARK_STRING); + if (providers != null) { + for (PluginManagerProvider provider : providers) { + if (provider.selector().accept(new ObjectHolder())) { + return provider.pluginManagerAction(); + } + } + } + return new PluginManagerAction(); + } + private ShortCut createGlobalTDAction() { TableDataPaneProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TableDataPaneProcessor.XML_TAG); return processor == null ? new GlobalTableDataAction() : processor.createServerTDAction(); diff --git a/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java b/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java index dbdb21826..1558d72e9 100644 --- a/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java +++ b/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java @@ -1,8 +1,9 @@ package com.fr.env; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.actions.UpdateAction; import com.fr.design.actions.server.PluginManagerAction; -import com.fr.design.fun.PluginErrorRemindHandleProvider; +import com.fr.design.fun.PluginManagerProvider; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; @@ -81,7 +82,7 @@ public class PluginErrorRemindDialog extends JDialog implements ActionListener { UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Plugin_Error_Remind_Deal_With")); cancelButton.addActionListener(this); - okButton.addActionListener(new PluginManagerActionAdapter(this)); + okButton.addActionListener(new PluginManagerHandleAction(this)); // 按钮 JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); @@ -106,28 +107,34 @@ public class PluginErrorRemindDialog extends JDialog implements ActionListener { this.dispose(); } - private static class PluginManagerActionAdapter extends PluginManagerAction { + private static class PluginManagerHandleAction extends UpdateAction { private JDialog jDialog; + private UpdateAction pluginManagerAction; - public PluginManagerActionAdapter(JDialog jDialog) { + public PluginManagerHandleAction(JDialog jDialog) { this.jDialog = jDialog; + initPluginManagerAction(); } - @Override - public void actionPerformed(ActionEvent e) { - this.jDialog.dispose(); - // 先从插件找 - Set providers = ExtraDesignClassManager.getInstance().getArray(PluginErrorRemindHandleProvider.MARK_STRING); + private void initPluginManagerAction() { + Set providers = ExtraDesignClassManager.getInstance().getArray(PluginManagerProvider.MARK_STRING); if (providers != null) { - for (PluginErrorRemindHandleProvider provider : providers) { + for (PluginManagerProvider provider : providers) { if (provider.selector().accept(new ObjectHolder())) { - provider.openPluginManager(); - return; + this.pluginManagerAction = provider.pluginManagerAction(); } } } - super.actionPerformed(e); + if (this.pluginManagerAction == null) { + this.pluginManagerAction = new PluginManagerAction(); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + this.jDialog.dispose(); + this.pluginManagerAction.actionPerformed(e); } } From 202b0292698974c1a148ec201a2a7f02356c02d9 Mon Sep 17 00:00:00 2001 From: lucian Date: Wed, 24 Feb 2021 10:56:25 +0800 Subject: [PATCH 03/39] =?UTF-8?q?REPORT-48228=20=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=9A=84=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E4=B8=8D=E5=8F=97shouldShowPlugin=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/toolbar/ToolBarMenuDock.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index d9a7ecf3c..33a2aaadf 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -489,11 +489,7 @@ public abstract class ToolBarMenuDock { } if (!DesignerMode.isAuthorityEditing()) { - if (shouldShowPlugin()) { - menuDef.addShortCut( - createPluginManagerAction() - ); - } + addPluginManagerAction(menuDef); menuDef.addShortCut( new FunctionManagerAction(), new GlobalParameterAction() @@ -504,16 +500,21 @@ public abstract class ToolBarMenuDock { return menuDef; } - private ShortCut createPluginManagerAction() { + private void addPluginManagerAction(MenuDef menuDef) { Set providers = ExtraDesignClassManager.getInstance().getArray(PluginManagerProvider.MARK_STRING); if (providers != null) { for (PluginManagerProvider provider : providers) { if (provider.selector().accept(new ObjectHolder())) { - return provider.pluginManagerAction(); + menuDef.addShortCut(provider.pluginManagerAction()); + return; } } } - return new PluginManagerAction(); + if (shouldShowPlugin()) { + menuDef.addShortCut( + new PluginManagerAction() + ); + } } private ShortCut createGlobalTDAction() { From 4e6e6aabf4e6e29f98814b224ce128107ab2aecc Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 24 Feb 2021 16:16:35 +0800 Subject: [PATCH 04/39] =?UTF-8?q?REPORT-47694=20=E6=B5=B7=E5=A4=96?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E5=B0=BA=E5=AF=B8=E7=BB=9F=E4=B8=80=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/dialog/BasicPane.java | 13 ++- .../fr/design/i18n/DesignSizeI18nManager.java | 57 +++++++++++++ .../fr/design/i18n/dimension_en.properties | 1 + .../fr/design/i18n/dimension_ja_JP.properties | 0 .../fr/design/i18n/dimension_ko_KR.properties | 0 .../fr/design/i18n/dimension_zh.properties | 1 + .../fr/design/i18n/dimension_zh_TW.properties | 0 .../i18n/DesignSizeI18nManagerTest.java | 80 +++++++++++++++++++ 8 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java create mode 100644 designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties create mode 100644 designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties create mode 100644 designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties create mode 100644 designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties create mode 100644 designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties create mode 100644 designer-base/src/test/java/com/fr/design/i18n/DesignSizeI18nManagerTest.java diff --git a/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java b/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java index e684d81f6..930dde76c 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java +++ b/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java @@ -3,6 +3,7 @@ package com.fr.design.dialog; import com.fr.common.annotations.Open; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.core.PropertyChangeAdapter; @@ -33,7 +34,7 @@ public abstract class BasicPane extends JPanel { * @return 对话框 */ public BasicDialog showWindow(Window window, DialogActionListener l) { - return showWindowWithCustomSize(window, l, BasicDialog.DEFAULT); + return showWindowWithCustomSize(window, l, DesignSizeI18nManager.getInstance().i18nDimension(this.i18nText4PopupWindow())); } /** @@ -236,6 +237,14 @@ public abstract class BasicPane extends JPanel { return title4PopupWindow(); } + /** + * 国际化标识 + * @return 默认是取当前类的全限定名 + */ + protected String i18nText4PopupWindow() { + return this.getClass().getName(); + } + /** * 作为名字面板 * @@ -403,4 +412,4 @@ public abstract class BasicPane extends JPanel { } -} \ No newline at end of file +} 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 new file mode 100644 index 000000000..1dd2306b8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java @@ -0,0 +1,57 @@ +package com.fr.design.i18n; + +import com.fr.design.dialog.BasicDialog; +import com.fr.general.GeneralContext; +import com.fr.locale.LocaleManager; +import com.fr.locale.impl.FineLocaleManager; + +import java.awt.Dimension; +import java.util.Map; + +/** + * Created by kerry on 2/23/21 + */ +public class DesignSizeI18nManager { + private static final String I18N_DIMENSION_PATH = "com/fr/design/i18n/dimension"; + private static final String DIMENSION_REGEX = "^[1-9]\\d*\\*[1-9]\\d*$"; + private static final String SEPARATOR_REGEX = "\\*"; + private static final int WIDTH_INDEX = 0; + private static final int HEIGHT_INDEX = 1; + private static final int SPLIT_LENGTH = 2; + + private static DesignSizeI18nManager instance = new DesignSizeI18nManager(); + + public static DesignSizeI18nManager getInstance() { + return instance; + } + + private LocaleManager localeManager = FineLocaleManager.create(); + + private DesignSizeI18nManager() { + localeManager.addResource(I18N_DIMENSION_PATH); + } + + public Dimension i18nDimension(String key) { + if (!containKey(key)) { + return BasicDialog.DEFAULT; + } + String dimension = localeManager.getLocalBundle(GeneralContext.getLocale()).getText(localeManager, key); + return parseDimensionFromText(dimension); + } + + private boolean containKey(String key) { + Map localeKV = localeManager.getLocalBundle(GeneralContext.getLocale()).getKV(localeManager); + return localeKV != null && localeKV.containsKey(key); + } + + private Dimension parseDimensionFromText(String dimensionText) { + if (!dimensionText.matches(DIMENSION_REGEX)) { + return BasicDialog.DEFAULT; + } + String[] arr = dimensionText.split(SEPARATOR_REGEX); + if (arr.length < SPLIT_LENGTH) { + return BasicDialog.DEFAULT; + } + return new Dimension(Integer.parseInt(arr[WIDTH_INDEX]), Integer.parseInt(arr[HEIGHT_INDEX])); + } +} diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties new file mode 100644 index 000000000..1cafa6d35 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties @@ -0,0 +1 @@ +com.fr.design.report.ReportColumnsPane=800*600 diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties new file mode 100644 index 000000000..e69de29bb diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties new file mode 100644 index 000000000..e69de29bb 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 new file mode 100644 index 000000000..69c2fcef4 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties @@ -0,0 +1 @@ +# \u9ED8\u8BA4\u4E3A\u7C7B\u7684\u5168\u9650\u5B9A\u540D\uFF08\u53EF\u81EA\u5B9A\u4E49key\uFF09= width * height diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties new file mode 100644 index 000000000..e69de29bb diff --git a/designer-base/src/test/java/com/fr/design/i18n/DesignSizeI18nManagerTest.java b/designer-base/src/test/java/com/fr/design/i18n/DesignSizeI18nManagerTest.java new file mode 100644 index 000000000..da9789526 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/i18n/DesignSizeI18nManagerTest.java @@ -0,0 +1,80 @@ +package com.fr.design.i18n; + +import com.fr.general.GeneralContext; +import com.fr.invoke.Reflect; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.awt.Dimension; +import java.util.Locale; + +/** + * Created by kerry on 2/24/21 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest(GeneralContext.class) +public class DesignSizeI18nManagerTest { + @Test + public void testI18nDimension() { + Dimension dimension = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.ReportColumnsPane"); + validDimension(dimension, 660, 600); + + PowerMock.mockStatic(GeneralContext.class); + EasyMock.expect(GeneralContext.getLocale()).andReturn(Locale.ENGLISH).times(3); + PowerMock.replayAll(); + + dimension = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.ReportColumnsPane"); + validDimension(dimension, 800, 600); + } + + @Test + public void testContainKey() { + PowerMock.mockStatic(GeneralContext.class); + EasyMock.expect(GeneralContext.getLocale()).andReturn(Locale.ENGLISH).times(3); + PowerMock.replayAll(); + + boolean result = Reflect.on(DesignSizeI18nManager.getInstance()).call("containKey", "testKey").get(); + Assert.assertFalse(result); + + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("containKey", "com.fr.design.report.ReportColumnsPane").get(); + Assert.assertTrue(result); + + } + + @Test + public void testParseDimensionFromText() { + String dimensionText = "800*600"; + Dimension result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 800, 600); + + dimensionText = "800* 600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = " 800*600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = "800*600s"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = "800s*600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = "800-600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + } + + private void validDimension(Dimension dimension, int width, int height) { + Assert.assertEquals(width, dimension.width); + Assert.assertEquals(height, dimension.height); + } +} From e114ee0104819d9946a97144b7297e8e929f77ad Mon Sep 17 00:00:00 2001 From: Lanlan Date: Fri, 26 Feb 2021 09:34:11 +0800 Subject: [PATCH 05/39] =?UTF-8?q?REPORT-47885=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E5=9F=8B=E7=82=B9=E5=9B=9E=E4=BC=A0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=9B=9E=E4=BC=A0=E6=9C=AC=E5=9C=B0=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/messagecollect/solid/SolidCollector.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollector.java index 974f75dd3..1a931df49 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollector.java @@ -40,9 +40,6 @@ public class SolidCollector { * 回传文件给云中心,并删除服务端本地文件 */ public void sendToCloudCenterAndDeleteFile() { - if (WorkContext.getCurrent().isLocal()) { - return; - } String url = CloudCenter.getInstance().acquireConf("design.solid", "https://cloud.fanruan.com/api/solid/upload"); if (StringUtils.isEmpty(url)) { FineLoggerFactory.getLogger().info("failed to get solid content upload url..."); From cff3586c102e855f9690ef5870bcd1f88f742557 Mon Sep 17 00:00:00 2001 From: shine Date: Fri, 26 Feb 2021 10:54:06 +0800 Subject: [PATCH 06/39] =?UTF-8?q?CHART-18181=20=E8=AE=BE=E7=BD=AE=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/ui/Assistant.java | 11 +++++++++++ .../main/java/com/fr/design/ui/ModernUIPane.java | 14 +++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/ui/Assistant.java b/designer-base/src/main/java/com/fr/design/ui/Assistant.java index 7e9430672..6a04cf358 100644 --- a/designer-base/src/main/java/com/fr/design/ui/Assistant.java +++ b/designer-base/src/main/java/com/fr/design/ui/Assistant.java @@ -3,6 +3,7 @@ package com.fr.design.ui; import com.fr.stable.StringUtils; import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.BrowserContext; +import com.teamdev.jxbrowser.chromium.BrowserPreferences; import com.teamdev.jxbrowser.chromium.ProtocolService; import com.teamdev.jxbrowser.chromium.URLResponse; @@ -12,6 +13,8 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collections; +import java.util.List; /** * @author richie @@ -20,6 +23,14 @@ import java.nio.file.Path; */ public class Assistant { + public static void addChromiumSwitches(String... switches) { + + List list = BrowserPreferences.getChromiumSwitches(); + Collections.addAll(list, switches); + + BrowserPreferences.setChromiumSwitches((list.toArray(new String[0]))); + } + public static URLResponse inputStream2Response(InputStream inputStream, String filePath) throws Exception { URLResponse response = new URLResponse(); DataInputStream stream = new DataInputStream(inputStream); diff --git a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java index 4a92d3715..745c56ea7 100644 --- a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java +++ b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java @@ -8,18 +8,18 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.web.struct.AssembleComponent; import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.BrowserPreferences; import com.teamdev.jxbrowser.chromium.JSValue; -import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent; -import com.teamdev.jxbrowser.chromium.events.LoadAdapter; import com.teamdev.jxbrowser.chromium.events.LoadListener; import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; import com.teamdev.jxbrowser.chromium.swing.BrowserView; -import javax.swing.*; -import java.awt.*; +import javax.swing.JDialog; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; +import java.awt.BorderLayout; +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Map; @@ -44,7 +44,7 @@ public class ModernUIPane extends BasicPane { private void initialize() { if (browser == null) { setLayout(new BorderLayout()); - BrowserPreferences.setChromiumSwitches("--disable-google-traffic"); + Assistant.addChromiumSwitches("--disable-google-traffic"); if (DesignerEnvManager.getEnvManager().isOpenDebug()) { UIToolbar toolbar = new UIToolbar(); add(toolbar, BorderLayout.NORTH); @@ -75,7 +75,7 @@ public class ModernUIPane extends BasicPane { SwingUtilities.getWindowAncestor(ModernUIPane.this).setVisible(false); } }); - BrowserPreferences.setChromiumSwitches("--remote-debugging-port=9222"); + Assistant.addChromiumSwitches("--remote-debugging-port=9222"); initializeBrowser(); add(new BrowserView(browser), BorderLayout.CENTER); } else { From 37d7fabfee118a6b5655eb9698de5c7387faeafc Mon Sep 17 00:00:00 2001 From: xiqiu Date: Wed, 3 Mar 2021 09:12:10 +0800 Subject: [PATCH 07/39] =?UTF-8?q?REPORT-48318=20=20=20=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E6=89=8D=E5=8E=BB=E6=9B=B4=E6=96=B0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/ConnectionTableProcedurePane.java | 36 +++++++++++++------ .../fr/design/gui/ilist/TableViewList.java | 18 ++++++---- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java index 4b4d66866..0ba498556 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -1,27 +1,33 @@ package com.fr.design.data.datapane.connect; import com.fr.base.BaseUtils; +import com.fr.data.core.db.TableProcedure; import com.fr.data.impl.AbstractDatabaseConnection; import com.fr.data.impl.Connection; -import com.fr.design.constants.UIConstants; -import com.fr.data.core.db.TableProcedure; import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.ilist.TableViewList; +import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.dialog.BasicPane; import com.fr.general.GeneralContext; - +import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; -import javax.swing.*; +import javax.swing.JPanel; +import javax.swing.ToolTipManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.*; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.List; /** @@ -48,10 +54,11 @@ public class ConnectionTableProcedurePane extends BasicPane { filter(connection, conName, nameList); } + @Override protected void refreshItems() { super.refreshItems(); if (tableViewList != null) { - search(); + searchForRefresh(); } } }; @@ -190,13 +197,22 @@ public class ConnectionTableProcedurePane extends BasicPane { tableViewList.populate(selectedObj, searchField.getText().trim(), types); } + protected void searchForRefresh() { + String databaseName = connectionComboBox.getSelectedItem(); + if (databaseName != null) { + tableViewList.clearCache(databaseName); + } else { + FineLoggerFactory.getLogger().warn("database name is null"); + } + search(); + } + @Override protected String title4PopupWindow() { return "Connection"; } /** - * * @param l */ public void addDoubleClickListener(DoubleClickSelectedNodeOnTreeListener l) { 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 ec05732c6..eccb24893 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 @@ -106,12 +106,6 @@ public class TableViewList extends UIList { if (!status) { throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed")); } - String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); - schemas = (schemas == null || schemas.length == 0) ? new String[]{null} : schemas; - for (String schema : schemas) { - clearCache(datasource, schema); - } - clearCache(datasource, null); return processDataInAnotherThread(databaseName, searchFilter, typesFilter); } @@ -132,7 +126,17 @@ public class TableViewList extends UIList { } } - private void clearCache(Connection datasource, String schema) { + public void clearCache(String databaseName) { + Connection datasource = ConnectionConfig.getInstance().getConnection(databaseName); + String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); + schemas = (schemas == null || schemas.length == 0) ? new String[]{null} : schemas; + for (String schema : schemas) { + doClearCache(datasource, schema); + } + doClearCache(datasource, null); + } + + private void doClearCache(Connection datasource, String schema) { DataCoreUtils.refreshTables(datasource, TableProcedure.TABLE, schema); DataCoreUtils.refreshTables(datasource, TableProcedure.VIEW, schema); DataCoreUtils.refreshTables(datasource, TableProcedure.PROCEDURE, schema); From a264231f0ebe0c541e74dc9d07eff51acb0f4e95 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Wed, 3 Mar 2021 11:17:40 +0800 Subject: [PATCH 08/39] =?UTF-8?q?REPORT-47886=20=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=85=88=E6=B7=BB=E5=8A=A0=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=8F=82=E6=95=B0=EF=BC=8C=E5=86=8D=E6=96=B0=E5=BB=BA=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E5=8F=82=E6=95=B0=20=E5=85=A8=E9=83=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=EF=BC=8C=E5=8F=82=E6=95=B0=E5=92=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E4=BC=9A=E9=87=8D=E5=8F=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/form/parameter/FormParaDesigner.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java index 8d13f3ab4..6b0b2dd31 100644 --- a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java +++ b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java @@ -474,7 +474,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP */ @Override public void updateUI() { - setUI(new FormDesignerUI(){ + setUI(new FormDesignerUI() { @Override protected Rectangle getFitPaintBounds(Component component, Component parent) { return new Rectangle(0, 0, parent.getSize().width, parent.getSize().height); @@ -694,7 +694,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP formSubmitButton.setWidgetName("Search"); formSubmitButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Query")); XCreator xCreator = XCreatorUtils.createXCreator(formSubmitButton); - if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * 3 + H_GAP, FIRST_V_LOCATION + if ((this.autoAddComponent(xCreator, H_COMPONENT_GAP * 3 + H_GAP, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { currentIndex = ((int) Math.ceil((currentIndex + 1) / (double) NUM_IN_A_LINE)) * NUM_IN_A_LINE; } @@ -741,7 +741,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP } @Override - public boolean checkIfBeyondValidArea(MouseEvent e){ + public boolean checkIfBeyondValidArea(MouseEvent e) { return false; } From 66d6036ef79788a1025d569cbb27aa4b5591befb Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Wed, 3 Mar 2021 11:21:09 +0800 Subject: [PATCH 09/39] =?UTF-8?q?REPORT-47886=20=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=85=88=E6=B7=BB=E5=8A=A0=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=8F=82=E6=95=B0=EF=BC=8C=E5=86=8D=E6=96=B0=E5=BB=BA=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E5=8F=82=E6=95=B0=20=E5=85=A8=E9=83=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=EF=BC=8C=E5=8F=82=E6=95=B0=E5=92=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E4=BC=9A=E9=87=8D=E5=8F=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/form/parameter/FormParaDesigner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java index 6b0b2dd31..0ac74e5b5 100644 --- a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java +++ b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java @@ -694,8 +694,8 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP formSubmitButton.setWidgetName("Search"); formSubmitButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Query")); XCreator xCreator = XCreatorUtils.createXCreator(formSubmitButton); - if ((this.autoAddComponent(xCreator, H_COMPONENT_GAP * 3 + H_GAP, FIRST_V_LOCATION - + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + if (this.autoAddComponent(xCreator, H_COMPONENT_GAP * 3 + H_GAP, FIRST_V_LOCATION + + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE))) { currentIndex = ((int) Math.ceil((currentIndex + 1) / (double) NUM_IN_A_LINE)) * NUM_IN_A_LINE; } } From 20447bef4137814ac58776a976edf1d6c022337b Mon Sep 17 00:00:00 2001 From: Yvan Date: Wed, 3 Mar 2021 14:25:48 +0800 Subject: [PATCH 10/39] =?UTF-8?q?REPORT-42238=20=E3=80=9010.0.13=E3=80=91J?= =?UTF-8?q?DK11=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=9B=BE=E6=A0=87=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E9=97=AE=E9=A2=98=E4=BC=98=E5=8C=96=20=E3=80=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91IOUtils.readResour?= =?UTF-8?q?ce()=E6=96=B9=E6=B3=95=E9=87=8C=E4=BC=9A=E5=AF=B9=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=BA=86ResourcePathTransformer=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E6=9F=90=E4=BA=9B=E6=8F=92=E4=BB=B6=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84=E7=9A=84?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=EF=BC=8C=E8=80=8C=E4=B9=8B=E5=89=8D=E4=BE=9D?= =?UTF-8?q?=E9=9D=A0IOUtils.readResource()=E5=88=A4=E6=96=AD=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E8=80=83=E8=99=91=E8=BF=99=E4=B8=80=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E7=B4=A7=E6=8E=A5=E7=9D=80=E5=8E=BB=E8=AF=BBIcon?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E4=BB=8D=E7=84=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BA=86=E5=8E=9F=E5=A7=8B=E8=B7=AF=E5=BE=84=EF=BC=8C=E9=80=A0?= =?UTF-8?q?=E6=88=90=E4=BA=86=E8=B7=AF=E5=BE=84=E4=B8=8D=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=8F=AF=E8=83=BD=E5=AF=BC?= =?UTF-8?q?=E8=87=B4bug=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF?= =?UTF-8?q?=E3=80=91=E6=8A=8AIOUtils=E4=B8=AD=E7=9A=84transformPath?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=90=AC=E4=BA=86=E4=B8=80=E5=A5=97=E8=BF=87?= =?UTF-8?q?=E6=9D=A5=EF=BC=8C=E4=BF=9D=E8=AF=81=E5=88=A4=E6=96=AD=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E5=92=8C=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E8=B5=84=E6=BA=90=E7=9A=84=E8=B7=AF=E5=BE=84=E4=B8=80?= =?UTF-8?q?=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/base/svg/IconUtils.java | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/IconUtils.java b/designer-base/src/main/java/com/fr/base/svg/IconUtils.java index 4b5f1b881..79d3cef76 100644 --- a/designer-base/src/main/java/com/fr/base/svg/IconUtils.java +++ b/designer-base/src/main/java/com/fr/base/svg/IconUtils.java @@ -2,9 +2,15 @@ package com.fr.base.svg; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; +import com.fr.stable.bridge.StableFactory; +import com.fr.stable.fun.ResourcePathTransformer; +import com.fr.stable.plugin.ExtraClassManagerProvider; import javax.swing.Icon; import javax.swing.ImageIcon; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; /** * 主要是用来读取svgIcon的工具类 @@ -36,7 +42,7 @@ public class IconUtils { // 判断是否以.svg结尾 if (resource.endsWith(ICON_SUFFIX_SVG)) { if (IOUtils.readResource(resource) != null) { - return SVGIcon.readSVGIcon(resource); + return SVGIcon.readSVGIcon(transformPath(resource)); } // 适配插件 return adjustPluginsPng(resource); @@ -68,15 +74,15 @@ public class IconUtils { private static Icon readNoSuffixResource(String resource, String svgIconType) { String svgPath = resource + svgIconType; if (IOUtils.readResource(svgPath) != null) { - return SVGIcon.readSVGIcon(svgPath); + return SVGIcon.readSVGIcon(transformPath(svgPath)); } String pngPath = resource + ICON_SUFFIX_PNG; if (IOUtils.readResource(pngPath) != null) { - return IOUtils.readIcon(pngPath); + return IOUtils.readIcon(transformPath(pngPath)); } String gifPath = resource + ICON_SUFFIX_GIF; if (IOUtils.readResource(gifPath) != null) { - return IOUtils.readIcon(gifPath); + return IOUtils.readIcon(transformPath(gifPath)); } FineLoggerFactory.getLogger().error("File not exists:{}", resource); return new ImageIcon(); @@ -113,8 +119,30 @@ public class IconUtils { private static Icon readSpecifiedTypeIcon(String resource, String oldSuffix, String newSuffix) { String iconPath = resource.replace(oldSuffix, newSuffix); if (IOUtils.readResource(iconPath) != null) { - return SVGIcon.readSVGIcon(iconPath); + return SVGIcon.readSVGIcon(transformPath(iconPath)); } return readIcon(resource); } + + private static String transformPath(String path) { + Set set = getResourcePathTransformers(); + for (ResourcePathTransformer transformer : set) { + if (transformer.accept(path)) { + return transformer.transform(path); + } + } + return path; + } + + private static Set getResourcePathTransformers() { + Set set = new HashSet(); + ExtraClassManagerProvider provider = StableFactory.getExtraClassManager(); + if (provider != null) { + Set pluginProvided = provider.getArray(ResourcePathTransformer.MARK_STRING); + set.addAll(pluginProvided); + } + ResourcePathTransformer[] oemSet = StableFactory.getMarkedObjectsFromCollection(ResourcePathTransformer.MARK_STRING, ResourcePathTransformer.class); + set.addAll(Arrays.asList(oemSet)); + return set; + } } From c829390f0c31d8c7765aea700cb8e20e15f9630c Mon Sep 17 00:00:00 2001 From: xiqiu Date: Wed, 3 Mar 2021 14:57:02 +0800 Subject: [PATCH 11/39] =?UTF-8?q?REPORT-48318=20=20=20=E6=94=B9=E6=88=90?= =?UTF-8?q?=E7=BB=99search=E4=BC=A0=E5=8F=82=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E9=80=A0=E6=88=90=E5=8D=A1=E9=A1=BF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/ConnectionTableProcedurePane.java | 25 ++++++------------- .../fr/design/gui/ilist/TableViewList.java | 8 +++--- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java index 0ba498556..a979a20cd 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -14,7 +14,6 @@ import com.fr.design.gui.ilist.TableViewList; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.GeneralContext; -import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import javax.swing.JPanel; @@ -58,7 +57,7 @@ public class ConnectionTableProcedurePane extends BasicPane { protected void refreshItems() { super.refreshItems(); if (tableViewList != null) { - searchForRefresh(); + search(true); } } }; @@ -155,17 +154,17 @@ public class ConnectionTableProcedurePane extends BasicPane { @Override public void removeUpdate(DocumentEvent e) { - search(); + search(false); } @Override public void insertUpdate(DocumentEvent e) { - search(); + search(false); } @Override public void changedUpdate(DocumentEvent e) { - search(); + search(false); } }; @@ -173,14 +172,14 @@ public class ConnectionTableProcedurePane extends BasicPane { @Override public void actionPerformed(ActionEvent e) { - search(); + search(false); } }; /** * 选项改变,需要重新刷新下拉列表里面的项 */ - protected void search() { + protected void search(boolean refresh) { String selectedObj = connectionComboBox.getSelectedItem(); String[] types = ArrayUtils.EMPTY_STRING_ARRAY; @@ -194,17 +193,7 @@ public class ConnectionTableProcedurePane extends BasicPane { } else { types = (String[]) ArrayUtils.add(types, TableProcedure.PROCEDURE); } - tableViewList.populate(selectedObj, searchField.getText().trim(), types); - } - - protected void searchForRefresh() { - String databaseName = connectionComboBox.getSelectedItem(); - if (databaseName != null) { - tableViewList.clearCache(databaseName); - } else { - FineLoggerFactory.getLogger().warn("database name is null"); - } - search(); + tableViewList.populate(selectedObj, searchField.getText().trim(), refresh, types); } @Override 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 eccb24893..ba29288fc 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 @@ -82,7 +82,7 @@ public class TableViewList extends UIList { * @param searchFilter * @param typesFilter */ - public void populate(final String databaseName, final String searchFilter, final String... typesFilter) { + public void populate(final String databaseName, final String searchFilter, boolean refresh, final String... typesFilter) { DefaultListModel defaultListModel = new DefaultListModel(); defaultListModel.addElement(UIConstants.PENDING); final DefaultListModel failed = new DefaultListModel(); @@ -106,6 +106,9 @@ public class TableViewList extends UIList { if (!status) { throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed")); } + if (refresh) { + clearCache(datasource); + } return processDataInAnotherThread(databaseName, searchFilter, typesFilter); } @@ -126,8 +129,7 @@ public class TableViewList extends UIList { } } - public void clearCache(String databaseName) { - Connection datasource = ConnectionConfig.getInstance().getConnection(databaseName); + private void clearCache(Connection datasource) { String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); schemas = (schemas == null || schemas.length == 0) ? new String[]{null} : schemas; for (String schema : schemas) { From 778dcc9ac93f1f8d4d5e4c84cbabcc839636bcf8 Mon Sep 17 00:00:00 2001 From: pengda Date: Wed, 3 Mar 2021 19:54:00 +0800 Subject: [PATCH 12/39] =?UTF-8?q?CHART-17714=20=E8=BD=AE=E6=92=ADgis?= =?UTF-8?q?=E7=82=B9=E5=9C=B0=E5=9B=BE-=E5=8D=AB=E6=98=9F=E5=9B=BE?= =?UTF-8?q?=E5=B1=82-=E9=A2=84=E8=A7=88=E6=8E=A7=E5=88=B6=E5=8F=B0?= =?UTF-8?q?=E6=8A=9B=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget/ui/designer/layout/AbstractFRLayoutDefinePane.java | 2 ++ .../design/widget/ui/designer/layout/FRFitLayoutDefinePane.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/AbstractFRLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/AbstractFRLayoutDefinePane.java index 0a718ee60..efa2729c2 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/AbstractFRLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/AbstractFRLayoutDefinePane.java @@ -31,6 +31,8 @@ public abstract class AbstractFRLayoutDefinePane extends for (int i = 0, len = srcLayout.getListenerSize(); i < len; i++) { destLayout.addListener(srcLayout.getListener(i)); } + srcLayout.clearListeners(); + srcLayout.clearMobileWidgetList(); } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java index 4481307bf..e073b2b15 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java @@ -207,7 +207,7 @@ public class FRFitLayoutDefinePane extends AbstractFRLayoutDefinePane Date: Thu, 4 Mar 2021 10:55:31 +0800 Subject: [PATCH 13/39] =?UTF-8?q?CHART-18383=20=E5=9C=B0=E5=9B=BE=E9=83=A8?= =?UTF-8?q?=E5=88=86icon=E5=9B=BD=E9=99=85=E5=8C=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/images/form/toolbar/drillmap.png | Bin 344 -> 810 bytes .../com/fr/design/images/form/toolbar/map.png | Bin 344 -> 819 bytes .../fr/van/chart/drillmap/images/area-map.png | Bin 1705 -> 2399 bytes .../van/chart/drillmap/images/point-map.png | Bin 1450 -> 2834 bytes .../fr/van/chart/heatmap/images/heatmap.png | Bin 22580 -> 3632 bytes .../com/fr/van/chart/map/images/area-map.png | Bin 1523 -> 2293 bytes .../fr/van/chart/map/images/custom-map.png | Bin 22428 -> 2984 bytes .../com/fr/van/chart/map/images/line-map.png | Bin 22260 -> 2793 bytes .../com/fr/van/chart/map/images/point-map.png | Bin 1294 -> 2729 bytes 9 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 designer-chart/src/main/resources/com/fr/van/chart/heatmap/images/heatmap.png mode change 100644 => 100755 designer-chart/src/main/resources/com/fr/van/chart/map/images/area-map.png mode change 100644 => 100755 designer-chart/src/main/resources/com/fr/van/chart/map/images/custom-map.png mode change 100644 => 100755 designer-chart/src/main/resources/com/fr/van/chart/map/images/line-map.png mode change 100644 => 100755 designer-chart/src/main/resources/com/fr/van/chart/map/images/point-map.png diff --git a/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/drillmap.png b/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/drillmap.png index 6459771dbc54e9dbf48298fc0c93baa89a80b940..a9cf86bdbcebfcaeb4e3944e6374064c649f310e 100644 GIT binary patch delta 787 zcmV+u1MK|R0;&d(B!2{FK}|sb0I`n?{9y$E001~;SV?A0O#mtY000O80f%V-1ONa4 z0RR918UO$Q0007@0ssU600031000o60{{d700031000mG0000Nom0pF00Ny!L_t(I z5uH*`NK|1EpZVU~%~YZ%!mjKtwXPavojlpW(x5u!AyguWFn`?j6cN=Ss31CY3IY#4 z71aI_M$i%+gt}%#MHhomTk)-$f71Txy6byynt8e*3tgJSn{VbfGvD|7y+PQtI+J|M zIDL%B-Git;8x$ITpTPAz{x6RLMEhoTf$by-VF>|05K$ci2IyL|aw+7H(*uCdb)SA` zyuD&!>o6q&*?-OeH$R$8M4D2G@TJMlNTbA(pNNNE`$0d9KxsQ?568@OQY;YXI0{8}{1Fw(*rToW(U z1e!P#oaakYmHk%rx}9wRq>sPXa{HLqnBd+XAmIxJ+g4$*TqFHW;RZ5I3vyWFf_oD| z?;=;7{-a$k~^_KF;PKqqV;X^mv0${Qeu$&OG`DQtF#?z8GwV|`YYY_VufS^i=YyGC?i4G3k~cKWuTuQWrWHa`o}ItBpzZ&|KUCf=CDUMo RoD2W}002ovPDHLkV1lg+US$9P delta 317 zcmV-D0mA;O2G|0SB!3BTNLh0L01FcU01FcV0GgZ_0000PbVXQnQ*UN;cVTj606}DL zVr3vnZDD6+Qe|Oed2z{QJOBUy0+Qh%wmg#jMWDO^$N&c*XFndVUqmw)=KKVp0S~}o0JPx(7Df0B z1clQBD^05+7~2*eMe?1fP0AHbRt@g!kTRI349ISXBmalmsUK!5=NET>bQN>UkH P00000NkvXXu0mjfhEs7H diff --git a/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/map.png b/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/map.png index 6459771dbc54e9dbf48298fc0c93baa89a80b940..649e1054fc71bd9532129b58e6b274aad4e3786f 100644 GIT binary patch delta 796 zcmV+%1LOSI0<#8?B!2{FK}|sb0I`n?{9y$E001~;SV?A0O#mtY000O80f%V-1ONa4 z0RR918UO$Q0007@0ssU600031000o60{{d700031000mG0000Nom0pF00O2-L_t(I z5v5aINEA^NKIhK3>aLbckn8?b>Y7mWixQD&AO%HM5Lsdr7=OA(5aL5r1VQv5^b`oC z78WJFx=;_1(nEzHJ%k}au3D^1prz*SvN^kRPv_1uu@Lyuftfq^eBb%*x!=75utpFO zt^r%nKZG4a%kD%Xew_fC7<4jA5KtTlhV>#>PvqQ&m0VGgJE<6m9*rkfMi6ke#8I?= zHWb**Pr#*Noqs^FU?!8JH7^4&OyY94=uzPT+WZ8&MGVMMf?qqgaAU-EacTnKXnGXL8MOG0UnDd)b z4m;fi2Pd01Caf*2q!ZUztBftX#KzUKY7G~k<=lJW_kX?4mS*33*89E#VRdqOwOeH@ z0V%0T2d%~d`Ys3RwYtzwa&L90$#;cIzm$n>($@W-4`z zrPDK=fqyPhn0J6k_9(JLQuPkG;9RN(^>jjrJ5?8>KcenIM8&rXc>GPg> zK84we!Dv-Fvsw>G9}~ZgZS2#O!m}L^zGU!>L=oehv)ENUp+GyhyC@jARf4>Yp!f0x zy}$y)3fI+3IP~6(ksfFDCLyrKUOw6t2T}^RJ%F$6zA&$T!X$diuHUG97!BG2 zOj_hSVsP;TT@$U5PXCyVSvS$1sB!z?yeDNCE$sX$cG}Nf@y`S?fe0+Qh%wmg#jMWDO^$N&c*XFndVUqmw)=KKVp0S~}o0JPx(7Df0B z1clQBD^05+7~2*eMe?1fP0AHbRt@g!kTRI349ISXBmalmsUK!5=NET>bQN>UkH P00000NkvXXu0mjfk$7<= diff --git a/designer-chart/src/main/resources/com/fr/van/chart/drillmap/images/area-map.png b/designer-chart/src/main/resources/com/fr/van/chart/drillmap/images/area-map.png index 35afc778165f488480504fcd39d1992874424276..f1be7c1e6d8f69404119337f63df211b22e5f14a 100644 GIT binary patch delta 2388 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 diff --git a/designer-chart/src/main/resources/com/fr/van/chart/drillmap/images/point-map.png b/designer-chart/src/main/resources/com/fr/van/chart/drillmap/images/point-map.png index f6659740dd5dcc48d331dc199417e0593327433c..30a32e34e6f7f4544269513026b9c5b3c228d888 100644 GIT binary patch delta 2827 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 m9BWWcPrUyJEm8a}zyRMJIT2}K1T`c80000> diff --git a/designer-chart/src/main/resources/com/fr/van/chart/heatmap/images/heatmap.png b/designer-chart/src/main/resources/com/fr/van/chart/heatmap/images/heatmap.png old mode 100644 new mode 100755 index 6f28e1c2549cffb7c85396dca121bd76f89a79c9..9748b2e8d1009c5472a281093555213ccad501d1 GIT binary patch literal 3632 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 diff --git a/designer-chart/src/main/resources/com/fr/van/chart/map/images/area-map.png b/designer-chart/src/main/resources/com/fr/van/chart/map/images/area-map.png old mode 100644 new mode 100755 index ebdcf5567048885049623dc9cb99154c2b9786e9..1eb12abafcca0b292ed9f8eb84599717edce5785 GIT binary patch delta 2281 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 DT5Tqd delta 1505 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 o1QnI@q=i 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 diff --git a/designer-chart/src/main/resources/com/fr/van/chart/map/images/point-map.png b/designer-chart/src/main/resources/com/fr/van/chart/map/images/point-map.png old mode 100644 new mode 100755 index 9c77308d26ffbcecb97078913e6a1888a01746fc..b3f27a072fe5d46c9eea9c9e1e68b2d05fa4a2cd GIT binary patch delta 2721 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 delta 1274 zcmVG9sw6rB5 zG@*Gli5)+&v!Qh~PU6H#Z=ff#BKbPU{`h;(x#wI3n~yA=0Zp_$HWJLN1;9k`N;7W@ z5b!^-9nc-n9ZqCD#2$=Vy;g$=A~_cjlf%4#^V{omwbWQ@%zpSfBvq z3Y@W0TvkkG5+sw2mY%*$doL8A)j(7g=MR$oPc{fg_U)W+R_CPocrWA>?z z#H^B1MAu88oZ>cj=_Oc)W$$X$x@l4{Sa3`F@ZRvkuQ76r;gK!DW@&%A2%L>A7K?`> z#KX!+9#aep{PuaxNhUw$Lr*}zm9oo4#t(Y3Kh^qshe^15)JFxN z2en$;=r{Uuv$d)^(nFsI4X}pPy3TeY*?-ec--JcYhJnheo;*PPfFU9cgPNKZ45iHH zCH~mgLCpqYmZ~<(Ja%rXUNu?i6BgD$L^@Jp2INGl@t_8So*N&?T>Rum^NZE2tH=AO zbG6<}23q8UU|9%nPe1DO;(to2&Qzi1w0}2KQ%x%aPO`t0g={#e)WQkl1I%}oVt-Xq zbD|a%FR{~Li4VfD!{G0BO0h~$D~-Et?2KA9<@meAP8GkQ*-DY^^q?@Qr0R)&`m9Tw4<(cZ3^gquRXS(EL`0Zn>OZ}S~aJ+1=WyE1C{OVL%Og3t?Kdq!k20jkDBSa zEuc?&EQ!sks#Q~-vehP@Z3UI>-E$Gcg@05%)<>OHt0t6{Q7PL?>N7qUbtOgV@IE)U zrl#Vlv`#_=D%*QU%onJ Date: Thu, 4 Mar 2021 11:18:53 +0800 Subject: [PATCH 14/39] =?UTF-8?q?=E7=83=AD=E5=8A=9B=E5=9C=B0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/images/form/toolbar/heatmap.png | Bin 750 -> 905 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/heatmap.png b/designer-chart/src/main/resources/com/fr/design/images/form/toolbar/heatmap.png index 6e6c2146c47835d0538cb6eca7b256b7dd8a0412..538473be1c237ef302ed1f1b2ba864d7346d8fbc 100644 GIT binary patch delta 882 zcmV-&1C9Ld1&IfcB!2{FK}|sb0I`n?{9y$E001~;SV?A0O#mtY000O80f%V-1ONa4 z0RR918UO$Q0007@0ssU600031000o60{{d700031000mG0000Nom0pF00R6;L_t(I z5v5XTNK{c2{_cHm#z`A(TpG6_r9mqdv<-qNq7D0zv_cd`Mt|GC2!iNO6cmMjT0|V$ zNrH+Zp+zdq7AP{wvZ&OY(s3OfO&w=^Gw+@5otlXLc7D8b-#OoR&Uene48N`HDP=Fn z!eJwfd2unwvY61Go`Cu(F*w2)8;Iim^-KnCeWdl~F}RxF8i_sOUYN)Xhcy{R^MMSz zp&xtY^VD|+u79bM<4&|~NgDaP2$!8D`C&s>;*-LIP*!b6pm;0pO*@I2x)JmZa;0KL z@+7CtJg)owwb|#omj7Jq zm)n*LYw28!#<}VE`p$;dPl>3Bae}*7A~lU6&Mcw$;;b5sf8+DG#JP(Rt(HMmUX|E( zeqY^QTz{B|kH`*H9`oPf`8g92G%MSaQUhK9=u+1yYGxe)h`kc z1)WJ4OS7U;kWY(r{v-EzGc=YXwttjCEhl2z#9r@6t|~v=td_S8X|Ly2^|(1>8`^he z-j(sFWxG7B1{vidcZImnU|?yg4YS(?AflkHG|dY|*(dIBF(de+#6Mo4$AVW)T&X2J zd}~=HR{Cr%+_oq4<*$sm zh3Fyb^DgzL1~hFGk+BYpWeQbXJgzSBn5ykIoQ`&m;{V(K1XHm;w|ZPR delta 726 zcmV;{0xA882kr%sB!2;OQb$4nuFf3k00080NklmwF*g4m^Slzv6@Nj@ZiM~uMQAT`{)b4% zU3}Qg%W;>Oicr6ul_jWFBWl_~{3DCh_RNe;HmCTOx5yVIbq1Ec-+c=>e|wrMujldX ze`L_+)}|`ywveDKc{J*wd`B`m6>#?26jKW!rEK-8;R<+;}axmpm(dw^;Nq^!!$Wtao7}V&?l~RPR>_y~cvi z`7%<|eKhKD?Mt4Z`zz609I+gyfAB6R3O9Ie4ba+ois8N|^IS^xk507*qo IM6N<$f_$-Yp#T5? From 6f6e07713262b14a69e855dc6895a2196645bf2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Fri, 5 Mar 2021 11:19:43 +0800 Subject: [PATCH 15/39] =?UTF-8?q?CHART-18429=20=E7=82=B9=E7=B1=BB=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E6=95=A3=E7=82=B9=E6=9D=A1=E4=BB=B6=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../condition/item/VanChartCommonMarkerConditionPane.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/item/VanChartCommonMarkerConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/item/VanChartCommonMarkerConditionPane.java index 2efb287ca..61f9025da 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/item/VanChartCommonMarkerConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/other/condition/item/VanChartCommonMarkerConditionPane.java @@ -2,7 +2,6 @@ package com.fr.van.chart.map.designer.other.condition.item; import com.fr.chart.base.DataSeriesCondition; import com.fr.design.condition.ConditionAttributesPane; - import com.fr.plugin.chart.base.VanChartAttrMarker; import com.fr.van.chart.designer.other.condition.item.AbstractNormalMultiLineConditionPane; import com.fr.van.chart.map.designer.style.series.VanChartMapScatterMarkerPane; @@ -30,6 +29,10 @@ public class VanChartCommonMarkerConditionPane extends AbstractNormalMultiLineCo return commonMarkerPane; } + public void setDefault() { + this.populate(new VanChartAttrMarker()); + } + /** * 条目名称 * From 69384a369d11b4c58b51af4c2671028aa631f8b2 Mon Sep 17 00:00:00 2001 From: hades Date: Mon, 8 Mar 2021 17:30:02 +0800 Subject: [PATCH 16/39] =?UTF-8?q?REPORT-48204=20=E3=80=9010.0.15=E3=80=91J?= =?UTF-8?q?DK11=E8=AE=BE=E8=AE=A1=E5=99=A8=E9=81=97=E7=95=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/os/impl/PMDialogAction.java | 4 +-- .../com/fr/design/os/impl/SupportOSImpl.java | 28 +++++++++++++++++++ .../fr/design/utils/gui/GUIPaintUtils.java | 6 ++-- .../fr/design/os/impl/SupportOSImplTest.java | 10 +++++++ 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java b/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java index 7e74e7651..990e73ee9 100644 --- a/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java +++ b/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java @@ -19,11 +19,11 @@ public class PMDialogAction implements OSBasedAction { private static String PLUGIN_MANAGER_ROUTE = "#management/plugin"; @Override public void execute(Object... objects) { - if(Arch.getArch() == Arch.ARM || OperatingSystem.isLinux()){ + if(Arch.getArch() == Arch.ARM || OperatingSystem.isLinux() || SupportOSImpl.MACOS_WEB_PLUGIN_MANAGEMENT.support()){ DesignUtils.visitEnvServerByParameters( PLUGIN_MANAGER_ROUTE,null,null); return; } - if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM() && JdkVersion.LE_8.support()) { + if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM() || SupportOSImpl.MACOS_NEW_PLUGIN_MANAGEMENT.support()) { UpmFinder.showUPMDialog(); } else { WebViewDlgHelper.createPluginDialog(); diff --git a/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java b/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java index 88fe2a275..a25d2606a 100644 --- a/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java +++ b/designer-base/src/main/java/com/fr/design/os/impl/SupportOSImpl.java @@ -1,6 +1,7 @@ package com.fr.design.os.impl; import com.fr.base.FRContext; +import com.fr.design.jdk.JdkVersion; import com.fr.general.CloudCenter; import com.fr.general.GeneralContext; import com.fr.json.JSON; @@ -124,6 +125,33 @@ public enum SupportOSImpl implements SupportOS { public boolean support() { return OperatingSystem.isWindows(); } + }, + + MACOS_NEW_PLUGIN_MANAGEMENT { + @Override + public boolean support() { + return JdkVersion.GE_9.support() && OperatingSystem.isMacos() && getMacOsVersion() < BIG_SUR_VERSION_NUMBER; + } + }, + + + MACOS_WEB_PLUGIN_MANAGEMENT { + @Override + public boolean support() { + return JdkVersion.GE_9.support() && OperatingSystem.isMacos() && getMacOsVersion() >= BIG_SUR_VERSION_NUMBER; + } + }; + + private static final int BIG_SUR_VERSION_NUMBER = 16; + + protected int getMacOsVersion() { + String version = System.getProperty("os.version"); + String[] versionSlice = version.split("\\."); + try { + return Integer.parseInt(versionSlice[1]); + } catch (Exception ignored) { + return 0; + } } } diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUIPaintUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUIPaintUtils.java index 30984197c..c4efc0282 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUIPaintUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUIPaintUtils.java @@ -1,6 +1,5 @@ package com.fr.design.utils.gui; -import com.fr.base.BaseUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.stable.Constants; @@ -40,7 +39,10 @@ public class GUIPaintUtils { g2d.drawLine(x, y, x, height - 1); g2d.drawLine(x, height - 1, x + 3, height - 1); } else { - g2d.drawRoundRect(x, y, width - 1, height - 1, UIConstants.ARC, UIConstants.ARC); + double offsetX = Math.min(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getDefaultTransform().getScaleX() - 1, 0.5d); + double offsetY = Math.min(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getDefaultTransform().getScaleY() - 1, 0.5d); + Shape shape = new RoundRectangle2D.Double(x + offsetX, y + offsetY, width - 1d, height - 1d, UIConstants.ARC, UIConstants.ARC); + g2d.draw(shape); } g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); } else { diff --git a/designer-base/src/test/java/com/fr/design/os/impl/SupportOSImplTest.java b/designer-base/src/test/java/com/fr/design/os/impl/SupportOSImplTest.java index 188753797..ee0804d36 100644 --- a/designer-base/src/test/java/com/fr/design/os/impl/SupportOSImplTest.java +++ b/designer-base/src/test/java/com/fr/design/os/impl/SupportOSImplTest.java @@ -6,6 +6,7 @@ import org.junit.Assert; import org.junit.Test; import java.util.Locale; +import org.powermock.reflect.Whitebox; /** * @author hades @@ -21,4 +22,13 @@ public class SupportOSImplTest extends TestCase { Assert.assertFalse(SupportOSImpl.AUTOPUSHUPDATE.support()); } + @Test + public void testGetMacOsVersion() throws Exception { + String backUp = System.getProperty("os.version"); + System.setProperty("os.version", "10.16"); + int number = Whitebox.invokeMethod(SupportOSImpl.MACOS_WEB_PLUGIN_MANAGEMENT, "getMacOsVersion"); + Assert.assertEquals(16, number); + System.setProperty("os.version", backUp); + } + } \ No newline at end of file From 6e396f6a89a4232f6d45fa93a2beb5cc993977c8 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 9 Mar 2021 14:42:36 +0800 Subject: [PATCH 17/39] =?UTF-8?q?REPORT-47438=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=BC=B9=E7=AA=97=E5=9C=A8=E5=A4=9A=E5=B1=8F=E6=83=85?= =?UTF-8?q?=E5=86=B5=E4=B8=8B=E9=83=A8=E5=88=86=E5=BC=B9=E7=AA=97=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=9C=A8=E5=8F=A6=E4=B8=80=E5=9D=97=E5=B1=8F=E5=B9=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datapane/preview/PreviewTablePane.java | 1 - .../com/fr/design/extra/PluginWebBridge.java | 2 ++ .../java/com/fr/design/extra/ShopDialog.java | 2 ++ .../exe/callback/ModifyStatusCallback.java | 5 +++-- .../design/plugin/DesignerPluginContext.java | 21 +++++++++++++++++++ .../java/com/fr/design/upm/UpmFinder.java | 2 ++ .../java/com/fr/design/upm/UpmShowDialog.java | 2 ++ .../com/fr/design/utils/gui/GUICoreUtils.java | 7 ++++++- 8 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/plugin/DesignerPluginContext.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java index da87c10f6..e95a5999a 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java @@ -169,7 +169,6 @@ public class PreviewTablePane extends BasicPane { this.add(new JScrollPane(preveiwTable), BorderLayout.CENTER); if (this.dialog == null) { this.dialog = this.showWindow(new JFrame()); - GUICoreUtils.centerWindow(DesignerContext.getDesignerFrame(), this.dialog); } progressBar = new AutoProgressBar(this, Toolkit.i18nText("Fine-Design_Basic_Loading_Data"), "", 0, 100) { public void doMonitorCanceled() { diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java b/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java index d70901350..ba7c0092d 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java @@ -16,6 +16,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.locale.impl.BbsRegisterMark; import com.fr.design.locale.impl.BbsResetMark; import com.fr.design.locale.impl.BbsSpaceMark; +import com.fr.design.plugin.DesignerPluginContext; import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.general.CloudCenter; import com.fr.general.locale.LocaleCenter; @@ -401,6 +402,7 @@ public class PluginWebBridge { if (uiDialog != null) { uiDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); uiDialog.setVisible(false); + DesignerPluginContext.setPluginDialog(null); } } diff --git a/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java b/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java index e0170cef8..fed317989 100644 --- a/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java +++ b/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java @@ -3,6 +3,7 @@ package com.fr.design.extra; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.UIDialog; import com.fr.design.jdk.JdkVersion; +import com.fr.design.plugin.DesignerPluginContext; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StableUtils; @@ -25,6 +26,7 @@ public class ShopDialog extends UIDialog { setSize(createDefaultDimension()); GUICoreUtils.centerWindow(this); setResizable(false); + DesignerPluginContext.setPluginDialog(this); } private Dimension createDefaultDimension() { diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java index 8015e00fb..78e338f8c 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java @@ -5,6 +5,7 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.extra.PluginOperateUtils; import com.fr.design.i18n.Toolkit; +import com.fr.design.plugin.DesignerPluginContext; import com.fr.log.FineLoggerFactory; import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.manage.control.PluginTaskResult; @@ -31,9 +32,9 @@ public class ModifyStatusCallback implements PluginTaskCallback{ pluginInfo + Toolkit.i18nText("Fine-Design_Basic_Plugin_Has_Been_Disabled_Duplicate") : pluginInfo + Toolkit.i18nText("Fine-Design_Plugin_Has_Been_Actived_Duplicate"); FineLoggerFactory.getLogger().info(modifyMessage); - FineJOptionPane.showMessageDialog(null, modifyMessage); + FineJOptionPane.showMessageDialog(DesignerPluginContext.getPluginDialog(), modifyMessage); } else { - FineJOptionPane.showMessageDialog(null, pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + FineJOptionPane.showMessageDialog(DesignerPluginContext.getPluginDialog(), pluginInfo, Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } } diff --git a/designer-base/src/main/java/com/fr/design/plugin/DesignerPluginContext.java b/designer-base/src/main/java/com/fr/design/plugin/DesignerPluginContext.java new file mode 100644 index 000000000..404477ff4 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/plugin/DesignerPluginContext.java @@ -0,0 +1,21 @@ +package com.fr.design.plugin; + +import com.fr.design.dialog.UIDialog; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/3/8 + */ +public class DesignerPluginContext { + + private static UIDialog DIALOG; + + public static UIDialog getPluginDialog() { + return DIALOG; + } + + public static void setPluginDialog(UIDialog pluginDialog) { + DesignerPluginContext.DIALOG = pluginDialog; + } +} diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index 4424d9d74..36e558d17 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -6,6 +6,7 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.UIDialog; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.plugin.DesignerPluginContext; import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.event.Event; import com.fr.event.EventDispatcher; @@ -114,6 +115,7 @@ public class UpmFinder { dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); dialog.setVisible(false); dialog = null; + DesignerPluginContext.setPluginDialog(null); } } } diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java b/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java index d5f132e98..f0c6c6d49 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java @@ -2,6 +2,7 @@ package com.fr.design.upm; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.UIDialog; +import com.fr.design.plugin.DesignerPluginContext; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.*; @@ -25,6 +26,7 @@ public class UpmShowDialog extends UIDialog { setSize(DEFAULT_SHOP); GUICoreUtils.centerWindow(this); setResizable(false); + DesignerPluginContext.setPluginDialog(this); } @Override diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index d55382c49..b65550ea7 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -318,7 +318,12 @@ public final class GUICoreUtils { public static void centerWindow(Window win) { // Toolkit.getDefaultToolkit().getScreenSize()在有多个显示器也只能获取到主屏的大小 // getGraphicsConfiguration().getBounds()能获取多个屏时 设计器主体界面所在屏的大小和对应的坐标 - Rectangle rectangle = win.getGraphicsConfiguration().getBounds(); + Rectangle rectangle; + if (DesignerContext.getDesignerFrame() != null) { + rectangle = DesignerContext.getDesignerFrame().getGraphicsConfiguration().getBounds(); + } else { + rectangle = win.getGraphicsConfiguration().getBounds(); + } centerWindow(win, rectangle); } From 4aa18921dc4f58e42c9ebfed6d0ff51dccbe50b1 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 9 Mar 2021 14:52:32 +0800 Subject: [PATCH 18/39] =?UTF-8?q?REPORT-47438=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=BC=B9=E7=AA=97=E9=83=A8=E5=88=86=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E4=B8=8D=E8=B7=9F=E9=9A=8F=E4=B8=BB=E5=B1=8F=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/gui/GUICoreUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index b65550ea7..ab40f0fd0 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -319,7 +319,7 @@ public final class GUICoreUtils { // Toolkit.getDefaultToolkit().getScreenSize()在有多个显示器也只能获取到主屏的大小 // getGraphicsConfiguration().getBounds()能获取多个屏时 设计器主体界面所在屏的大小和对应的坐标 Rectangle rectangle; - if (DesignerContext.getDesignerFrame() != null) { + if (DesignerContext.getDesignerFrame() != null && win.getParent() == null) { rectangle = DesignerContext.getDesignerFrame().getGraphicsConfiguration().getBounds(); } else { rectangle = win.getGraphicsConfiguration().getBounds(); From 7ca88aa36e907277c8730866ad138e2f6730e70e Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 9 Mar 2021 15:07:54 +0800 Subject: [PATCH 19/39] =?UTF-8?q?REPORT-47438=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=BC=B9=E7=AA=97=E9=83=A8=E5=88=86=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E4=B8=8D=E8=B7=9F=E9=9A=8F=E4=B8=BB=E5=B1=8F=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/gui/GUICoreUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index ab40f0fd0..763823465 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -38,6 +38,7 @@ import com.fr.stable.Constants; import com.fr.stable.OperatingSystem; import com.fr.stable.StringUtils; +import java.awt.Container; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.BorderFactory; @@ -319,7 +320,9 @@ public final class GUICoreUtils { // Toolkit.getDefaultToolkit().getScreenSize()在有多个显示器也只能获取到主屏的大小 // getGraphicsConfiguration().getBounds()能获取多个屏时 设计器主体界面所在屏的大小和对应的坐标 Rectangle rectangle; - if (DesignerContext.getDesignerFrame() != null && win.getParent() == null) { + Container parent = win.getParent(); + boolean displayByDesignerFrame = (DesignerContext.getDesignerFrame() != null && parent == null) || (parent != null && !parent.isVisible()); + if (displayByDesignerFrame) { rectangle = DesignerContext.getDesignerFrame().getGraphicsConfiguration().getBounds(); } else { rectangle = win.getGraphicsConfiguration().getBounds(); From afd47660ce6ecde19898240741d93cd093ee9b1a Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 9 Mar 2021 16:09:38 +0800 Subject: [PATCH 20/39] =?UTF-8?q?REPORT-45944=20=E6=97=A5=E6=96=87?= =?UTF-8?q?=E7=89=88=E6=A8=A1=E6=9D=BF=E9=87=8D=E5=91=BD=E5=90=8D=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignerFrameFileDealerPane.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index d2771cd49..39ef20658 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -600,6 +600,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt warnLabel = new UILabel(); warnLabel.setPreferredSize(new Dimension(300, 30)); warnLabel.setHorizontalAlignment(SwingConstants.LEFT); + warnLabel.setVerticalAlignment(SwingConstants.TOP); warnLabel.setForeground(Color.RED); warnLabel.setVisible(false); @@ -609,7 +610,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt // 确认按钮 confirmButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Confirm")); - confirmButton.setPreferredSize(new Dimension(60, 25)); confirmButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -619,7 +619,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt // 取消按钮 UIButton cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel")); - cancelButton.setPreferredSize(new Dimension(60, 25)); cancelButton.addActionListener(new ActionListener() { @@ -629,25 +628,26 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } }); - JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); - bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); - bottomPanel.add(confirmButton); - bottomPanel.add(cancelButton); + + JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 0)); + buttonsPane.setBorder(BorderFactory.createEmptyBorder(10, 15, 10, 10)); + buttonsPane.add(confirmButton); + buttonsPane.add(cancelButton); this.add( TableLayoutHelper.createTableLayoutPane( new Component[][]{ new Component[]{topPanel}, new Component[]{midPanel}, - new Component[]{bottomPanel} + new Component[]{buttonsPane} }, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, + new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.PREFERRED}, new double[]{TableLayout.FILL} ), BorderLayout.CENTER); - this.setSize(340, 180); + this.setSize(340, 200); this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Rename")); this.setResizable(false); this.setAlwaysOnTop(true); @@ -760,7 +760,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt ); newNameLabel.setHorizontalAlignment(SwingConstants.RIGHT); newNameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); - newNameLabel.setPreferredSize(new Dimension(118, 15)); // 文件名输入框 nameField = new UITextField(); @@ -806,6 +805,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt warnLabel = new UILabel(); warnLabel.setPreferredSize(new Dimension(300, 30)); warnLabel.setHorizontalAlignment(SwingConstants.LEFT); + warnLabel.setVerticalAlignment(SwingConstants.TOP); warnLabel.setForeground(Color.RED); warnLabel.setVisible(false); @@ -836,8 +836,8 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } }); - JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); - bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); + JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 0)); + bottomPanel.setBorder(BorderFactory.createEmptyBorder(10, 15, 10, 10)); bottomPanel.add(confirmButton); bottomPanel.add(cancelButton); @@ -848,13 +848,13 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt new Component[]{midPanel}, new Component[]{bottomPanel} }, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, + new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.PREFERRED}, new double[]{TableLayout.FILL} ), BorderLayout.CENTER); - this.setSize(380, 180); + this.setSize(380, 200); this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Mkdir")); this.setResizable(false); this.setAlwaysOnTop(true); From aeeb2f15cef5669fdf3a8dc30358fea76740db5f Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Tue, 9 Mar 2021 16:13:23 +0800 Subject: [PATCH 21/39] =?UTF-8?q?REPORT-48933=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=8F=9C=E5=8D=95-=E7=A4=BE=E5=8C=BA=E4=B8=8B?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E2=80=9C=E5=B7=A5=E5=8D=95=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E2=80=9D=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/WorkOrderCenterAction.java | 26 ++++++++++++++++++ .../mainframe/toolbar/ToolBarMenuDock.java | 14 ++-------- .../fr/design/images/bbs/workOrderCenter.png | Bin 0 -> 207 bytes .../images/bbs/workOrderCenter_normal.svg | 7 +++++ 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/bbs/workOrderCenter.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/bbs/workOrderCenter_normal.svg diff --git a/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java new file mode 100644 index 000000000..d556548c1 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java @@ -0,0 +1,26 @@ +package com.fr.design.actions.community; + + +import com.fr.design.i18n.Toolkit; +import com.fr.design.utils.BrowseUtils; +import com.fr.general.CloudCenter; + +import java.awt.event.ActionEvent; + +/** + * @Description 工单中心 + * @Author Henry.Wang + * @Date 2021/3/8 14:02 + **/ +public class WorkOrderCenterAction extends UpAction { + public WorkOrderCenterAction() { + this.setSmallIcon("/com/fr/design/images/bbs/workOrderCenter"); + this.setName(Toolkit.i18nText("Fine-Design_Basic_Commuinity_Work_Order_Center")); + } + + @Override + public void actionPerformed(ActionEvent arg0) { + String url = CloudCenter.getInstance().acquireUrlByKind("bbs.work.order.center"); + BrowseUtils.browser(url); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 33a2aaadf..aca9bcc36 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -9,17 +9,7 @@ import com.fr.design.DesignState; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; -import com.fr.design.actions.community.BBSAction; -import com.fr.design.actions.community.BugAction; -import com.fr.design.actions.community.BugNeedAction; -import com.fr.design.actions.community.CenterAction; -import com.fr.design.actions.community.FacebookFansAction; -import com.fr.design.actions.community.NeedAction; -import com.fr.design.actions.community.QuestionAction; -import com.fr.design.actions.community.SignAction; -import com.fr.design.actions.community.TechSolutionAction; -import com.fr.design.actions.community.TechSupportAction; -import com.fr.design.actions.community.VideoAction; +import com.fr.design.actions.community.*; import com.fr.design.actions.file.CloseCurrentTemplateAction; import com.fr.design.actions.file.ExitDesignerAction; import com.fr.design.actions.file.OpenRecentReportMenuDef; @@ -625,7 +615,7 @@ public abstract class ToolBarMenuDock { }, SupportLocaleImpl.TECH_SUPPORT_COMMUNITY); shortCuts.add(SeparatorDef.DEFAULT); - + shortCuts.add(new WorkOrderCenterAction()); shortCuts.add(new CenterAction()); shortCuts.add(new SignAction()); LocaleCenter.buildAction(new LocaleAction() { diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/workOrderCenter.png b/designer-base/src/main/resources/com/fr/design/images/bbs/workOrderCenter.png new file mode 100644 index 0000000000000000000000000000000000000000..6374a0e8d9e90c578f3b039a17da59c96272bdee GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;So-U3d z7J|tM3j_=feUX-){il6n=fd;zY?-ffhxvCgp2(Wnv5|MalvvKB6J`phlP#n*I@Q!5c2enNAo)M@L_Lf4}}sdcu$WQfUkqHzuT}sn{f8TEXTG56^!%aH)gi&Y*Lb9XjyN=_P0WYALt?mPgg&ebxsLQ E0N?6NH2?qr literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/workOrderCenter_normal.svg b/designer-base/src/main/resources/com/fr/design/images/bbs/workOrderCenter_normal.svg new file mode 100644 index 000000000..da3a6a3a9 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/bbs/workOrderCenter_normal.svg @@ -0,0 +1,7 @@ + + + icon/社区/工单中心_normal + + + + \ No newline at end of file From f4dc1d91ef39fd78bc01cbdcadbeb72343fd459c Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 9 Mar 2021 16:45:02 +0800 Subject: [PATCH 22/39] =?UTF-8?q?REPORT-48324=20=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=EF=BC=8C=E8=B6=85=E9=93=BE=E5=9C=A8=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=AD=E5=88=87=E6=8D=A2=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=90=8E=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/poly/creator/ECBlockEditor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java b/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java index 809a246e1..a387e0f3a 100644 --- a/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java +++ b/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java @@ -176,6 +176,7 @@ public class ECBlockEditor extends BlockEditor { // 超级链接 HyperlinkGroupPane hyperlinkGroupPane = DesignerContext.getDesignerFrame().getSelectedJTemplate() .getHyperLinkPane(HyperlinkGroupPaneActionImpl.getInstance()); + EastRegionContainerPane.getInstance().replaceHyperlinkPane(hyperlinkGroupPane); hyperlinkGroupPane.populate(editComponent); } @@ -187,4 +188,4 @@ public class ECBlockEditor extends BlockEditor { ElementCasePane ePane = (ElementCasePane)jTemplate.getCurrentElementCasePane(); return ePane != null && ePane.isSelectedOneCell(); } -} \ No newline at end of file +} From 352edc342e14313eb7d9849ba3178dc192e88a29 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 9 Mar 2021 17:13:02 +0800 Subject: [PATCH 23/39] =?UTF-8?q?REPORT-47438=20=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E8=B7=9F=E9=9A=8F=E8=87=AA=E4=B8=BB=E7=95=8C=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E5=86=8D=E4=BC=98=E5=8C=96=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/gui/GUICoreUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index 763823465..a89e367d6 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -321,7 +321,7 @@ public final class GUICoreUtils { // getGraphicsConfiguration().getBounds()能获取多个屏时 设计器主体界面所在屏的大小和对应的坐标 Rectangle rectangle; Container parent = win.getParent(); - boolean displayByDesignerFrame = (DesignerContext.getDesignerFrame() != null && parent == null) || (parent != null && !parent.isVisible()); + boolean displayByDesignerFrame = (DesignerContext.getDesignerFrame() != null && parent == null) || (parent != null && !parent.isVisible() && DesignerContext.getDesignerFrame() != null); if (displayByDesignerFrame) { rectangle = DesignerContext.getDesignerFrame().getGraphicsConfiguration().getBounds(); } else { From be9992d61cf6f225b9d159377851b974f32b3583 Mon Sep 17 00:00:00 2001 From: lucian Date: Wed, 10 Mar 2021 18:08:23 +0800 Subject: [PATCH 24/39] =?UTF-8?q?REPORT-48999=20=E5=A1=AB=E6=8A=A5-?= =?UTF-8?q?=E5=A1=AB=E6=8A=A5=E5=B1=9E=E6=80=A7=E8=AE=BE=E7=BD=AE-?= =?UTF-8?q?=E5=A1=AB=E6=8A=A5=E5=B1=9E=E6=80=A7=E5=BF=AB=E6=8D=B7=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=BF=9C=E7=A8=8B=E8=AE=BE=E8=AE=A1=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=97=A0=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/WriteShortCutsPane.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java b/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java index 8cf891b92..f48061d33 100644 --- a/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/WriteShortCutsPane.java @@ -8,6 +8,8 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.general.ComparatorUtils; +import com.fr.transaction.Configurations; +import com.fr.transaction.WorkerAdaptor; import javax.swing.BorderFactory; import javax.swing.JPanel; @@ -140,7 +142,13 @@ public class WriteShortCutsPane extends JPanel{ nextRowString = temp; switchColRow(); - ServerPreferenceConfig.getInstance().setWriteShortCuts(ComparatorUtils.equals(nextColString, "Tab")); + Configurations.update(new WorkerAdaptor(ServerPreferenceConfig.class) { + + @Override + public void run() { + ServerPreferenceConfig.getInstance().setWriteShortCuts(ComparatorUtils.equals(nextColString, "Tab")); + } + }); } }; From 91923d2a67474afe06355ecf36f997d0f693548f Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 12 Mar 2021 11:11:59 +0800 Subject: [PATCH 25/39] =?UTF-8?q?REPORT-48324=20=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=EF=BC=8C=E8=B6=85=E9=93=BE=E5=9C=A8=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=AD=E5=88=87=E6=8D=A2=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=90=8E=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/mainframe/DesignerFrame.java | 4 ++++ 1 file changed, 4 insertions(+) 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 490b4e7e9..b826931b6 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 @@ -977,6 +977,10 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * @param jt 添加的模板. */ public void addAndActivateJTemplate(JTemplate jt) { + JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (currentEditingTemplate != null) { + currentEditingTemplate.stopEditing(); + } //切换文件后清空FixedPopupPane面板 EastRegionContainerPane.getInstance().clearCurrentPopupPane(); //释放模板对象 From ad8e082c3921624f6bf681ebcad22a8f24b50666 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 12 Mar 2021 14:22:39 +0800 Subject: [PATCH 26/39] =?UTF-8?q?REPORT-45944=20=20ui=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/DesignerFrameFileDealerPane.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 39ef20658..fb8f9a2da 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -598,7 +598,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt }); // 重名提示 warnLabel = new UILabel(); - warnLabel.setPreferredSize(new Dimension(300, 30)); + warnLabel.setPreferredSize(new Dimension(300, 50)); warnLabel.setHorizontalAlignment(SwingConstants.LEFT); warnLabel.setVerticalAlignment(SwingConstants.TOP); warnLabel.setForeground(Color.RED); @@ -641,7 +641,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt new Component[]{midPanel}, new Component[]{buttonsPane} }, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.PREFERRED}, + new double[]{TableLayout.FILL, TableLayout.PREFERRED, TableLayout.PREFERRED}, new double[]{TableLayout.FILL} ), BorderLayout.CENTER); @@ -803,7 +803,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt }); // 重名提示 warnLabel = new UILabel(); - warnLabel.setPreferredSize(new Dimension(300, 30)); + warnLabel.setPreferredSize(new Dimension(300, 50)); warnLabel.setHorizontalAlignment(SwingConstants.LEFT); warnLabel.setVerticalAlignment(SwingConstants.TOP); warnLabel.setForeground(Color.RED); @@ -848,7 +848,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt new Component[]{midPanel}, new Component[]{bottomPanel} }, - new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.PREFERRED}, + new double[]{TableLayout.FILL, TableLayout.PREFERRED, TableLayout.PREFERRED}, new double[]{TableLayout.FILL} ), BorderLayout.CENTER); From 434f4a0f5622140dab6dd1c2d5d50335ecf0011c Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Mon, 15 Mar 2021 16:37:32 +0800 Subject: [PATCH 27/39] =?UTF-8?q?CHART-18080=20=E4=BF=AE=E5=A4=8D=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E8=BE=93=E5=85=A5=E6=A1=86=E8=BE=93=E5=85=A5=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E6=97=B6=E8=87=AA=E5=8A=A8=E5=88=A0=E9=99=A4=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/gui/itextfield/UINumberField.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java index f4437a9c4..8176905fe 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UINumberField.java @@ -5,11 +5,15 @@ import com.fr.general.ComparatorUtils; import com.fr.stable.CoreConstants; import com.fr.stable.StringUtils; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; import java.awt.Dimension; import java.awt.Toolkit; +import java.awt.event.InputMethodEvent; +import java.awt.event.InputMethodListener; /** * Number Field. @@ -35,6 +39,8 @@ public class UINumberField extends UITextField { private boolean isContentChanged = false; private boolean fillNegativeNumber = true; + private boolean isInputMethodChange = false; + private int insertOffset = 0; public UINumberField() { this(MAX_INTEGERLENGTH_32, MAX_DECIMALLENGTH); @@ -55,6 +61,7 @@ public class UINumberField extends UITextField { this.minValue = minValue; this.maxValue = maxValue; setFieldDocument(); + initFieldListener(); } public void setFieldDocument() { @@ -62,6 +69,31 @@ public class UINumberField extends UITextField { initListener(); } + private void initFieldListener() { + addInputMethodListener(new InputMethodListener() { + @Override + public void inputMethodTextChanged(InputMethodEvent event) { + isInputMethodChange = true; + } + + @Override + public void caretPositionChanged(InputMethodEvent event) { + } + }); + + addCaretListener(new CaretListener() { + @Override + public void caretUpdate(CaretEvent e) { + if (isInputMethodChange) { + isInputMethodChange = false; + setCaretPosition(insertOffset); + } else { + insertOffset = e.getDot(); + } + } + }); + } + public void canFillNegativeNumber(boolean fillNegativeNumber) { this.fillNegativeNumber = fillNegativeNumber; } @@ -186,6 +218,13 @@ public class UINumberField extends UITextField { super.insertString(offset, s, a); } + public void remove(int offs, int len) throws BadLocationException { + if (isInputMethodChange) { + return; + } + super.remove(offs, len); + } + // kunsnat: 这种限制输入 有个不好的地方, 比如删除时: 10.1 最大值限定100, 那么就删除中间的小数点之后变为101, 超出了100. // 但是直接限制不能删除中间类似小数点, 那么也可能遇到: 最小值10 , 从100变化到其中的19, 就很难.. private boolean notChange(String strNew) { From f462925487d4fbb7a3914b90fb3f9edac3c9976c Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 16 Mar 2021 10:42:02 +0800 Subject: [PATCH 28/39] =?UTF-8?q?REPORT-48965=20=E5=87=BA=E7=8E=B0concurre?= =?UTF-8?q?ntModification=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/core/ActionFactory.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java index 574195470..6c7d6408a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java +++ b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java @@ -14,11 +14,12 @@ import java.awt.event.KeyEvent; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArraySet; /** * 插入单元格元素和插入悬浮元素的一些集合方法 @@ -27,8 +28,8 @@ import java.util.concurrent.ConcurrentMap; * @version 2017年11月17日14点39分 */ public class ActionFactory { - private static LinkedHashSet> actionClasses = new LinkedHashSet<>(); - private static LinkedHashSet> floatActionClasses = new LinkedHashSet<>(); + private static Set> actionClasses = new CopyOnWriteArraySet<>(); + private static Set> floatActionClasses = new CopyOnWriteArraySet<>(); private static Class chartCollectionClass = null; /** * 无需每次实例化的悬浮元素编辑器 From 6daaa9f4f9b0bd2ea5f0a4d67b62660895bb5c6c Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 16 Mar 2021 10:56:36 +0800 Subject: [PATCH 29/39] =?UTF-8?q?REPORT-48965=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=B7=BB=E5=8A=A0=20=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E5=A4=8D=E5=88=B6=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/core/ActionFactory.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java index 6c7d6408a..f19c962f8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java +++ b/designer-base/src/main/java/com/fr/design/actions/core/ActionFactory.java @@ -13,6 +13,7 @@ import javax.swing.KeyStroke; import java.awt.event.KeyEvent; import java.lang.reflect.Constructor; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -257,14 +258,14 @@ public class ActionFactory { */ public static void registerCellInsertActionClass(Class[] cls) { if (cls != null) { - Collections.addAll(actionClasses, cls); + actionClasses.addAll(Arrays.asList(cls)); } } public static void referCellInsertActionClass(Class[] cls) { if (cls != null) { actionClasses.clear(); - Collections.addAll(actionClasses, cls); + actionClasses.addAll(Arrays.asList(cls)); } } @@ -322,14 +323,14 @@ public class ActionFactory { */ public static void registerFloatInsertActionClass(Class[] cls) { if (cls != null) { - Collections.addAll(floatActionClasses, cls); + floatActionClasses.addAll(Arrays.asList(cls)); } } public static void referFloatInsertActionClass(Class[] cls) { if (cls != null) { floatActionClasses.clear(); - Collections.addAll(floatActionClasses, cls); + floatActionClasses.addAll(Arrays.asList(cls)); } } From 8e2f877e495472979d464a32cc59ab80dca2a414 Mon Sep 17 00:00:00 2001 From: Yvan Date: Wed, 17 Mar 2021 11:39:15 +0800 Subject: [PATCH 30/39] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=B8=8B=E5=9B=A0=E4=BB=A3=E7=A0=81=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E8=A2=AB=E5=88=A0=E9=99=A4=E7=9A=84svg=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/images/buttonicon/prewidget_normal.svg | 8 ++++++++ .../fr/design/images/buttonicon/refresh_normal.svg | 7 +++++++ .../images/buttonicon/widget/files_up_normal.svg | 7 +++++++ .../com/fr/design/images/control/edit_disable.svg | 8 ++++++++ .../com/fr/design/images/control/edit_normal.svg | 8 ++++++++ .../com/fr/design/images/control/remove_disable.svg | 11 +++++++++++ .../com/fr/design/images/control/remove_normal.svg | 9 +++++++++ .../com/fr/design/images/m_file/preview_disable.svg | 11 +++++++++++ .../com/fr/design/images/m_file/preview_normal.svg | 7 +++++++ 9 files changed, 76 insertions(+) create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/refresh_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/edit_disable.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/remove_disable.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg b/designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg new file mode 100644 index 000000000..542c02c26 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg @@ -0,0 +1,8 @@ + + + icon_控件管理 有小箭头_normal + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/refresh_normal.svg b/designer-base/src/main/resources/com/fr/design/images/buttonicon/refresh_normal.svg new file mode 100644 index 000000000..4e3fd9c14 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/buttonicon/refresh_normal.svg @@ -0,0 +1,7 @@ + + + icon_刷新_normal + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg b/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg new file mode 100644 index 000000000..34cd6083a --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg @@ -0,0 +1,7 @@ + + + icon_控件_文件控件_normal + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/edit_disable.svg b/designer-base/src/main/resources/com/fr/design/images/control/edit_disable.svg new file mode 100644 index 000000000..9b001cfc5 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/edit_disable.svg @@ -0,0 +1,8 @@ + + + icon_编辑_disable + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg b/designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg new file mode 100644 index 000000000..291719452 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg @@ -0,0 +1,8 @@ + + + icon_编辑_normal + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/remove_disable.svg b/designer-base/src/main/resources/com/fr/design/images/control/remove_disable.svg new file mode 100644 index 000000000..b57f9a853 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/remove_disable.svg @@ -0,0 +1,11 @@ + + + icon_删除_normal + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg b/designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg new file mode 100644 index 000000000..b09268f45 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg @@ -0,0 +1,9 @@ + + + icon_删除_normal备份 + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg new file mode 100644 index 000000000..2d64f68f7 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg @@ -0,0 +1,11 @@ + + + icon_报表web属性_打印预览_normal + + + + + + + + diff --git a/designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg new file mode 100644 index 000000000..7b0ea197d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg @@ -0,0 +1,7 @@ + + + icon_预览_normal + + + + \ No newline at end of file From be0850e46a6bd224fade40fed6f5ba853f9e8093 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 22 Mar 2021 18:34:09 +0800 Subject: [PATCH 31/39] =?UTF-8?q?KERNEL-6368=E3=80=90=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E3=80=91XML=E6=B3=A8=E5=85=A5(XML=20External?= =?UTF-8?q?=20Entity=20Injection)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultCompletionProvider.java | 676 +++++++++--------- .../ui/rsyntaxtextarea/SyntaxScheme.java | 4 + .../gui/syntax/ui/rsyntaxtextarea/Theme.java | 9 +- .../design/gui/syntax/ui/rtextarea/Macro.java | 8 + .../server/FineEmbedServerActivator.java | 5 + 5 files changed, 369 insertions(+), 333 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java b/designer-base/src/main/java/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java index 4a002cf01..df36add40 100644 --- a/designer-base/src/main/java/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java +++ b/designer-base/src/main/java/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java @@ -2,7 +2,7 @@ * 12/21/2008 * * DefaultCompletionProvider.java - A basic completion provider implementation. - * + * * This library is distributed under a modified BSD license. See the included * RSyntaxTextArea.License.txt file for details. */ @@ -24,7 +24,11 @@ import javax.swing.text.Segment; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; + +import com.fr.log.FineLoggerFactory; import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; /** @@ -38,337 +42,345 @@ import org.xml.sax.SAXException; */ public class DefaultCompletionProvider extends AbstractCompletionProvider { - protected Segment seg; - - /** - * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}. - */ - private String lastCompletionsAtText; - - /** - * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}, - * since this may be called multiple times in succession (this is usually - * called by JTextComponent.getToolTipText(), and if the user - * wiggles the mouse while a tool tip is displayed, this method gets - * repeatedly called. It can be costly so we try to speed it up a tad). - */ - private List lastParameterizedCompletionsAt; - - /** - * Constructor. The returned provider will not be aware of any completions. - * - * @see #addCompletion(Completion) - */ - public DefaultCompletionProvider() { - init(); - } - - - /** - * Creates a completion provider that provides completion for a simple - * list of words. - * - * @param words The words to offer as completion suggestions. If this is - * null, no completions will be known. - * @see BasicCompletion - */ - public DefaultCompletionProvider(String[] words) { - init(); - addWordCompletions(words); - } - - - /** - * Returns the text just before the current caret position that could be - * the start of something auto-completable.

- * - * This method returns all characters before the caret that are matched - * by {@link #isValidChar(char)}. - * - * {@inheritDoc} - */ - public String getAlreadyEnteredText(JTextComponent comp) { - - Document doc = comp.getDocument(); - - int dot = comp.getCaretPosition(); - Element root = doc.getDefaultRootElement(); - int index = root.getElementIndex(dot); - Element elem = root.getElement(index); - int start = elem.getStartOffset(); - int len = dot-start; - try { - doc.getText(start, len, seg); - } catch (BadLocationException ble) { - - return EMPTY_STRING; - } - - int segEnd = seg.offset + len; - start = segEnd - 1; - while (start>=seg.offset && isValidChar(seg.array[start])) { - start--; - } - start++; - - len = segEnd - start; - return len==0 ? EMPTY_STRING : new String(seg.array, start, len); - - } - - - /** - * {@inheritDoc} - */ - public List getCompletionsAt(JTextComponent tc, Point p) { - - int offset = tc.viewToModel(p); - if (offset<0 || offset>=tc.getDocument().getLength()) { - lastCompletionsAtText = null; - return lastParameterizedCompletionsAt = null; - } - - Segment s = new Segment(); - Document doc = tc.getDocument(); - Element root = doc.getDefaultRootElement(); - int line = root.getElementIndex(offset); - Element elem = root.getElement(line); - int start = elem.getStartOffset(); - int end = elem.getEndOffset() - 1; - - try { - - doc.getText(start, end-start, s); - - // Get the valid chars before the specified offset. - int startOffs = s.offset + (offset-start) - 1; - while (startOffs>=s.offset && isValidChar(s.array[startOffs])) { - startOffs--; - } - - // Get the valid chars at and after the specified offset. - int endOffs = s.offset + (offset-start); - while (endOffs list = getCompletionByInputText(text); - lastCompletionsAtText = text; - return lastParameterizedCompletionsAt = list; - - } catch (BadLocationException ble) { - // Never happens - } - - lastCompletionsAtText = null; - return lastParameterizedCompletionsAt = null; - - } - - - /** - * {@inheritDoc} - */ - public List getParameterizedCompletions( - JTextComponent tc) { - - List list = null; - - // If this provider doesn't support parameterized completions, - // bail out now. - char paramListStart = getParameterListStart(); - if (paramListStart==0) { - return list; // null - } - - int dot = tc.getCaretPosition(); - Segment s = new Segment(); - Document doc = tc.getDocument(); - Element root = doc.getDefaultRootElement(); - int line = root.getElementIndex(dot); - Element elem = root.getElement(line); - int offs = elem.getStartOffset(); - int len = dot - offs - 1/*paramListStart.length()*/; - if (len<=0) { // Not enough chars on line for a method. - return list; // null - } - - try { - - doc.getText(offs, len, s); - - // Get the identifier preceding the '(', ignoring any whitespace - // between them. - offs = s.offset + len - 1; - while (offs>=s.offset && Character.isWhitespace(s.array[offs])) { - offs--; - } - int end = offs; - while (offs>=s.offset && isValidChar(s.array[offs])) { - offs--; - } - - String text = new String(s.array, offs+1, end-offs); - - // Get a list of all Completions matching the text, but then - // narrow it down to just the ParameterizedCompletions. - List l = getCompletionByInputText(text); - if (l!=null && !l.isEmpty()) { - for (int i=0; i(1); - } - list.add((ParameterizedCompletion)o); - } - } - } - - } catch (BadLocationException ble) { - // Never happens - } - - return list; - - } - - - /** - * Initializes this completion provider. - */ - protected void init() { - completions = new ArrayList(); - seg = new Segment(); - } - - - /** - * Returns whether the specified character is valid in an auto-completion. - * The default implementation is equivalent to - * "Character.isLetterOrDigit(ch) || ch=='_'". Subclasses - * can override this method to change what characters are matched. - * - * @param ch The character. - * @return Whether the character is valid. - */ - protected boolean isValidChar(char ch) { - return Character.isLetterOrDigit(ch) || ch=='_'; - } - - - /** - * Loads completions from an XML file. The XML should validate against - * CompletionXml.dtd. - * - * @param file An XML file to load from. - * @throws IOException If an IO error occurs. - */ - public void loadFromXML(File file) throws IOException { - BufferedInputStream bin = new BufferedInputStream( - new FileInputStream(file)); - try { - loadFromXML(bin); - } finally { - bin.close(); - } - } - - - /** - * Loads completions from an XML input stream. The XML should validate - * against CompletionXml.dtd. - * - * @param in The input stream to read from. - * @throws IOException If an IO error occurs. - */ - public void loadFromXML(InputStream in) throws IOException { - loadFromXML(in, null); - } - - - /** - * Loads completions from an XML input stream. The XML should validate - * against CompletionXml.dtd. - * - * @param in The input stream to read from. - * @param cl The class loader to use when loading any extra classes defined - * in the XML, such as custom {@link FunctionCompletion}s. This - * may be null if the default is to be used, or if no - * custom completions are defined in the XML. - * @throws IOException If an IO error occurs. - */ - public void loadFromXML(InputStream in, ClassLoader cl) throws IOException { - - //long start = System.currentTimeMillis(); - - SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setValidating(true); - CompletionXMLParser handler = new CompletionXMLParser(this, cl); - BufferedInputStream bin = new BufferedInputStream(in); - try { - SAXParser saxParser = factory.newSAXParser(); - saxParser.parse(bin, handler); - List completions = handler.getCompletions(); - addCompletions(completions); - char startChar = handler.getParamStartChar(); - if (startChar!=0) { - char endChar = handler.getParamEndChar(); - String sep = handler.getParamSeparator(); - if (endChar!=0 && sep!=null && sep.length()>0) { // Sanity - setParameterizedCompletionParams(startChar, sep, endChar); - } - } - } catch (SAXException se) { - throw new IOException(se.toString()); - } catch (ParserConfigurationException pce) { - throw new IOException(pce.toString()); - } finally { - //long time = System.currentTimeMillis() - start; - //System.out.println("XML loaded in: " + time + "ms"); - bin.close(); - } - - } - - - /** - * Loads completions from an XML file. The XML should validate against - * CompletionXml.dtd. - * - * @param resource A resource the current ClassLoader can get to. - * @throws IOException If an IO error occurs. - */ - public void loadFromXML(String resource) throws IOException { - ClassLoader cl = getClass().getClassLoader(); - InputStream in = cl.getResourceAsStream(resource); - if (in==null) { - File file = new File(resource); - if (file.isFile()) { - in = new FileInputStream(file); - } - else { - throw new IOException("No such resource: " + resource); - } - } - BufferedInputStream bin = new BufferedInputStream(in); - try { - loadFromXML(bin); - } finally { - bin.close(); - } - } + protected Segment seg; + + /** + * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}. + */ + private String lastCompletionsAtText; + + /** + * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}, + * since this may be called multiple times in succession (this is usually + * called by JTextComponent.getToolTipText(), and if the user + * wiggles the mouse while a tool tip is displayed, this method gets + * repeatedly called. It can be costly so we try to speed it up a tad). + */ + private List lastParameterizedCompletionsAt; + + /** + * Constructor. The returned provider will not be aware of any completions. + * + * @see #addCompletion(Completion) + */ + public DefaultCompletionProvider() { + init(); + } + + + /** + * Creates a completion provider that provides completion for a simple + * list of words. + * + * @param words The words to offer as completion suggestions. If this is + * null, no completions will be known. + * @see BasicCompletion + */ + public DefaultCompletionProvider(String[] words) { + init(); + addWordCompletions(words); + } + + + /** + * Returns the text just before the current caret position that could be + * the start of something auto-completable.

+ *

+ * This method returns all characters before the caret that are matched + * by {@link #isValidChar(char)}. + *

+ * {@inheritDoc} + */ + public String getAlreadyEnteredText(JTextComponent comp) { + + Document doc = comp.getDocument(); + + int dot = comp.getCaretPosition(); + Element root = doc.getDefaultRootElement(); + int index = root.getElementIndex(dot); + Element elem = root.getElement(index); + int start = elem.getStartOffset(); + int len = dot - start; + try { + doc.getText(start, len, seg); + } catch (BadLocationException ble) { + + return EMPTY_STRING; + } + + int segEnd = seg.offset + len; + start = segEnd - 1; + while (start >= seg.offset && isValidChar(seg.array[start])) { + start--; + } + start++; + + len = segEnd - start; + return len == 0 ? EMPTY_STRING : new String(seg.array, start, len); + + } + + + /** + * {@inheritDoc} + */ + public List getCompletionsAt(JTextComponent tc, Point p) { + + int offset = tc.viewToModel(p); + if (offset < 0 || offset >= tc.getDocument().getLength()) { + lastCompletionsAtText = null; + return lastParameterizedCompletionsAt = null; + } + + Segment s = new Segment(); + Document doc = tc.getDocument(); + Element root = doc.getDefaultRootElement(); + int line = root.getElementIndex(offset); + Element elem = root.getElement(line); + int start = elem.getStartOffset(); + int end = elem.getEndOffset() - 1; + + try { + + doc.getText(start, end - start, s); + + // Get the valid chars before the specified offset. + int startOffs = s.offset + (offset - start) - 1; + while (startOffs >= s.offset && isValidChar(s.array[startOffs])) { + startOffs--; + } + + // Get the valid chars at and after the specified offset. + int endOffs = s.offset + (offset - start); + while (endOffs < s.offset + s.count && isValidChar(s.array[endOffs])) { + endOffs++; + } + + int len = endOffs - startOffs - 1; + if (len <= 0) { + return lastParameterizedCompletionsAt = null; + } + String text = new String(s.array, startOffs + 1, len); + + if (text.equals(lastCompletionsAtText)) { + return lastParameterizedCompletionsAt; + } + + // Get a list of all Completions matching the text. + List list = getCompletionByInputText(text); + lastCompletionsAtText = text; + return lastParameterizedCompletionsAt = list; + + } catch (BadLocationException ble) { + // Never happens + } + + lastCompletionsAtText = null; + return lastParameterizedCompletionsAt = null; + + } + + + /** + * {@inheritDoc} + */ + public List getParameterizedCompletions( + JTextComponent tc) { + + List list = null; + + // If this provider doesn't support parameterized completions, + // bail out now. + char paramListStart = getParameterListStart(); + if (paramListStart == 0) { + return list; // null + } + + int dot = tc.getCaretPosition(); + Segment s = new Segment(); + Document doc = tc.getDocument(); + Element root = doc.getDefaultRootElement(); + int line = root.getElementIndex(dot); + Element elem = root.getElement(line); + int offs = elem.getStartOffset(); + int len = dot - offs - 1/*paramListStart.length()*/; + if (len <= 0) { // Not enough chars on line for a method. + return list; // null + } + + try { + + doc.getText(offs, len, s); + + // Get the identifier preceding the '(', ignoring any whitespace + // between them. + offs = s.offset + len - 1; + while (offs >= s.offset && Character.isWhitespace(s.array[offs])) { + offs--; + } + int end = offs; + while (offs >= s.offset && isValidChar(s.array[offs])) { + offs--; + } + + String text = new String(s.array, offs + 1, end - offs); + + // Get a list of all Completions matching the text, but then + // narrow it down to just the ParameterizedCompletions. + List l = getCompletionByInputText(text); + if (l != null && !l.isEmpty()) { + for (int i = 0; i < l.size(); i++) { + Object o = l.get(i); + if (o instanceof ParameterizedCompletion) { + if (list == null) { + list = new ArrayList(1); + } + list.add((ParameterizedCompletion) o); + } + } + } + + } catch (BadLocationException ble) { + // Never happens + } + + return list; + + } + + + /** + * Initializes this completion provider. + */ + protected void init() { + completions = new ArrayList(); + seg = new Segment(); + } + + + /** + * Returns whether the specified character is valid in an auto-completion. + * The default implementation is equivalent to + * "Character.isLetterOrDigit(ch) || ch=='_'". Subclasses + * can override this method to change what characters are matched. + * + * @param ch The character. + * @return Whether the character is valid. + */ + protected boolean isValidChar(char ch) { + return Character.isLetterOrDigit(ch) || ch == '_'; + } + + + /** + * Loads completions from an XML file. The XML should validate against + * CompletionXml.dtd. + * + * @param file An XML file to load from. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(File file) throws IOException { + BufferedInputStream bin = new BufferedInputStream( + new FileInputStream(file)); + try { + loadFromXML(bin); + } finally { + bin.close(); + } + } + + + /** + * Loads completions from an XML input stream. The XML should validate + * against CompletionXml.dtd. + * + * @param in The input stream to read from. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(InputStream in) throws IOException { + loadFromXML(in, null); + } + + + /** + * Loads completions from an XML input stream. The XML should validate + * against CompletionXml.dtd. + * + * @param in The input stream to read from. + * @param cl The class loader to use when loading any extra classes defined + * in the XML, such as custom {@link FunctionCompletion}s. This + * may be null if the default is to be used, or if no + * custom completions are defined in the XML. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(InputStream in, ClassLoader cl) throws IOException { + + //long start = System.currentTimeMillis(); + + SAXParserFactory factory = SAXParserFactory.newInstance(); + try { + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + factory.setFeature("http://xml.org/sax/features/external-general-entities", false); + factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + } catch (ParserConfigurationException | SAXNotSupportedException | SAXNotRecognizedException e) { + FineLoggerFactory.getLogger().warn(e.getMessage(), e); + } + + factory.setValidating(true); + CompletionXMLParser handler = new CompletionXMLParser(this, cl); + BufferedInputStream bin = new BufferedInputStream(in); + try { + SAXParser saxParser = factory.newSAXParser(); + saxParser.parse(bin, handler); + List completions = handler.getCompletions(); + addCompletions(completions); + char startChar = handler.getParamStartChar(); + if (startChar != 0) { + char endChar = handler.getParamEndChar(); + String sep = handler.getParamSeparator(); + if (endChar != 0 && sep != null && sep.length() > 0) { // Sanity + setParameterizedCompletionParams(startChar, sep, endChar); + } + } + } catch (SAXException se) { + throw new IOException(se.toString()); + } catch (ParserConfigurationException pce) { + throw new IOException(pce.toString()); + } finally { + //long time = System.currentTimeMillis() - start; + //System.out.println("XML loaded in: " + time + "ms"); + bin.close(); + } + + } + + + /** + * Loads completions from an XML file. The XML should validate against + * CompletionXml.dtd. + * + * @param resource A resource the current ClassLoader can get to. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(String resource) throws IOException { + ClassLoader cl = getClass().getClassLoader(); + InputStream in = cl.getResourceAsStream(resource); + if (in == null) { + File file = new File(resource); + if (file.isFile()) { + in = new FileInputStream(file); + } else { + throw new IOException("No such resource: " + resource); + } + } + BufferedInputStream bin = new BufferedInputStream(in); + try { + loadFromXML(bin); + } finally { + bin.close(); + } + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java index dbaaf4c6f..8bbedf0be 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java @@ -624,6 +624,10 @@ public class SyntaxScheme implements Cloneable, TokenTypes { SyntaxSchemeLoader parser = null; try { XMLReader reader = XMLReaderFactory.createXMLReader(); + reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + reader.setFeature("http://xml.org/sax/features/external-general-entities", false); + reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false); parser = new SyntaxSchemeLoader(baseFont); parser.baseFont = baseFont; reader.setContentHandler(parser); diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Theme.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Theme.java index 3b422f574..896a5eec4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Theme.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Theme.java @@ -22,6 +22,7 @@ import java.lang.reflect.Field; import javax.swing.UIManager; import javax.swing.plaf.ColorUIResource; import javax.swing.text.StyleContext; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.SAXParser; @@ -493,6 +494,8 @@ public class Theme { StreamResult result = new StreamResult(new PrintWriter( new UnicodeWriter(bout, "UTF-8"))); TransformerFactory transFac = TransformerFactory.newInstance(); + transFac.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + transFac.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); Transformer transformer = transFac.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); @@ -580,8 +583,12 @@ public class Theme { public static void load(Theme theme, InputStream in) throws IOException { SAXParserFactory spf = SAXParserFactory.newInstance(); - spf.setValidating(true); try { + spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + spf.setFeature("http://xml.org/sax/features/external-general-entities", false); + spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + spf.setValidating(true); SAXParser parser = spf.newSAXParser(); XMLReader reader = parser.getXMLReader(); XmlHandler handler = new XmlHandler(); diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/Macro.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/Macro.java index 8a0ba741c..2558eafe0 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/Macro.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/Macro.java @@ -14,6 +14,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import javax.xml.XMLConstants; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; @@ -94,6 +95,11 @@ public class Macro { DocumentBuilder db = null; Document doc = null; try { + dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); + dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + dbf.setXIncludeAware(false); db = dbf.newDocumentBuilder(); //InputSource is = new InputSource(new FileReader(file)); InputSource is = new InputSource(new UnicodeReader( @@ -374,6 +380,8 @@ public class Macro { StreamResult result = new StreamResult(new File(fileName)); DOMSource source = new DOMSource(doc); TransformerFactory transFac = TransformerFactory.newInstance(); + transFac.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + transFac.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); Transformer transformer = transFac.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, FILE_ENCODING); diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java index 36b86cb89..5fa8173d4 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java @@ -12,6 +12,7 @@ import com.fr.third.springframework.web.context.support.AnnotationConfigWebAppli import com.fr.workspace.WorkContext; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; +import org.apache.catalina.Wrapper; import org.apache.catalina.loader.WebappLoader; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.webresources.StandardRoot; @@ -73,6 +74,10 @@ public class FineEmbedServerActivator extends Activator { String contextPath = "/" + ProductConstants.getAppFolderName(); final Context context = tomcat.addContext(contextPath, docBase); context.setResources(new StandardRoot(context)); + Wrapper servlet = Tomcat.addServlet(context, "DruidStatView", "com.fr.third.alibaba.druid.support.http.StatViewServlet"); + context.addServletMappingDecoded("/druid/*", "DruidStatView"); + servlet.setLoadOnStartup(1); + servlet.setOverridable(true); Tomcat.initWebappDefaults(context); //覆盖tomcat的WebAppClassLoader context.setLoader(new FRTomcatLoader()); From 7c4c873078a48f9e0cf2afe3679e86d7260e669a Mon Sep 17 00:00:00 2001 From: "Qinghui.Liu" Date: Tue, 23 Mar 2021 15:45:40 +0800 Subject: [PATCH 32/39] =?UTF-8?q?CHART-18348=20=E8=B0=83=E6=95=B4=E5=AF=8C?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E7=BB=84=E4=BB=B6=E5=B0=BA=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/com/fr/design/editor/script/editor.js | 4 ++-- .../resources/com/fr/design/editor/script/editor.model.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.js b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.js index 3786e47ef..ec4de690d 100644 --- a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.js +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.js @@ -74,10 +74,10 @@ }], layouts: [{ type: "bi.left", - rgap: 5 + rgap: 2 }], value: this.model.mode, - width: 125 + width: 170 }, this._getToolBar()], height: 24 }, { diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.model.js b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.model.js index e1ee49645..06f7bf2bf 100644 --- a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.model.js +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.model.js @@ -18,7 +18,7 @@ return [{ type: "bi.single_select_radio_item", text: BI.i18nText("BI-Basic_Auto"), - width: 50, + width: 70, logic: { dynamic: true }, @@ -27,7 +27,7 @@ }, { type: "bi.single_select_radio_item", text: BI.i18nText("BI-Basic_Custom"), - width: 60, + width: 80, logic: { dynamic: true }, From 6ce46d57e2132851d49dec173c26bdfdbbf58450 Mon Sep 17 00:00:00 2001 From: Starryi Date: Tue, 23 Mar 2021 16:50:45 +0800 Subject: [PATCH 33/39] =?UTF-8?q?REPORT-50030=20=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E5=A4=96=E8=BE=B9=E6=A1=86=E8=AE=BE=E7=BD=AE=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E9=A2=9C=E8=89=B2=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=86=85?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8E=E9=BB=91=E8=89=B2=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E6=A0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 选中表格中区域后,设置边框颜色为黑色,勾选右侧外边框,表格中选中区域的 单元格都出现右边框,正确的效果是只有选中区域右侧的单元格有右边框。 目前代码中更新单元格边框的逻辑是 1. 首先将边框面板的单元格样式直接写入每个单元格中(此时单元格边样式对象值是不对的,需要进行修正) 2. 根据选中区域的单元格样式(旧样式)和边框面板中的样式(新样式)进行比较 3. 决定指定单元格边框是否使用新样式 问题出现在: 1. 无法获取当前选中区域的单元格样式(旧样式),因为已经被污染了. 2. 获取到的边框面板样式不对,导致比较结果出错 3. 只在单元格边框使用新样式时,才重写单元格边框样式对象,不使用新样式时,会继续使用被污染的值. 问题 【改动思路】 1. 在更新边框前,获取选中区域的单元格样式 2. 修改边框面板样式对象的创建逻辑 3. 不使用新样式时,重写单元格边框为旧样式 --- .../com/fr/design/gui/style/BorderPane.java | 30 +++++++++++++++---- .../cell/settingpane/CellStylePane.java | 5 +++- .../settingpane/style/CustomStylePane.java | 4 +-- .../cell/settingpane/style/StylePane.java | 5 ++-- .../java/com/fr/design/style/BorderUtils.java | 23 +++++++++++++- 5 files changed, 54 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java index 0dcfe4c21..9f948e7a1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/BorderPane.java @@ -217,18 +217,36 @@ public class BorderPane extends AbstractBasicStylePane implements GlobalNameObse int lineStyle = currentLineCombo.getSelectedLineStyle(); Color lineColor = currentLineColorPane.getSelectObject(); CellBorderStyle cellBorderStyle = new CellBorderStyle(); - cellBorderStyle.setTopColor(lineColor); + if (topToggleButton.isSelected()) { + cellBorderStyle.setTopColor(lineColor); + } cellBorderStyle.setTopStyle(topToggleButton.isSelected() ? lineStyle : Constants.LINE_NONE); - cellBorderStyle.setBottomColor(lineColor); + + if (bottomToggleButton.isSelected()) { + cellBorderStyle.setBottomColor(lineColor); + } cellBorderStyle.setBottomStyle(bottomToggleButton.isSelected() ? lineStyle : Constants.LINE_NONE); - cellBorderStyle.setLeftColor(lineColor); + + if (leftToggleButton.isSelected()) { + cellBorderStyle.setLeftColor(lineColor); + } cellBorderStyle.setLeftStyle(leftToggleButton.isSelected() ? lineStyle : Constants.LINE_NONE); - cellBorderStyle.setRightColor(lineColor); + + if (rightToggleButton.isSelected()) { + cellBorderStyle.setRightColor(lineColor); + } cellBorderStyle.setRightStyle(rightToggleButton.isSelected() ? lineStyle : Constants.LINE_NONE); - cellBorderStyle.setVerticalColor(lineColor); + + if (verticalToggleButton.isSelected()) { + cellBorderStyle.setVerticalColor(lineColor); + } cellBorderStyle.setVerticalStyle(verticalToggleButton.isSelected() ? lineStyle : Constants.LINE_NONE); - cellBorderStyle.setHorizontalColor(lineColor); + + if (horizontalToggleButton.isSelected()) { + cellBorderStyle.setHorizontalColor(lineColor); + } cellBorderStyle.setHorizontalStyle(horizontalToggleButton.isSelected() ? lineStyle : Constants.LINE_NONE); + if (leftToggleButton.isSelected() && bottomToggleButton.isSelected() && rightToggleButton.isSelected() && topToggleButton.isSelected()) { outerToggleButton.setSelected(true); } else { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java index 370677860..4bfd9fa46 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe.cell.settingpane; import com.fr.base.Style; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.cell.settingpane.style.StylePane; +import com.fr.design.style.BorderUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.report.cell.DefaultTemplateCellElement; @@ -67,6 +68,7 @@ public class CellStylePane extends AbstractCellAttrPane { @Override public void updateBeans() { + Object[] selectionCellBorderObjects = BorderUtils.createCellBorderObject(elementCasePane); if (stylePane.getSelectedIndex() == 1) { Style s = stylePane.updateBean(); TemplateElementCase elementCase = elementCasePane.getEditingElementCase(); @@ -110,7 +112,8 @@ public class CellStylePane extends AbstractCellAttrPane { } } } - stylePane.updateBorder();// border必须特别处理 + // border必须特别处理 + stylePane.updateBorder(selectionCellBorderObjects); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java index 2d7277239..268dbebe6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java @@ -136,8 +136,8 @@ public class CustomStylePane extends MultiTabPane