From aceeafda42ec675bb1c5491bf503d833c034fb6a Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 25 Apr 2023 09:43:58 +0800 Subject: [PATCH 01/61] =?UTF-8?q?REPORT-94400=E3=80=90FVS=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E5=BC=80=E3=80=91=E6=9D=A5=E5=9B=9E=E5=88=87?= =?UTF-8?q?=E6=8D=A2fvs=E6=A8=A1=E6=9D=BF=EF=BC=8Ctab=E6=A0=8F=E4=BC=9A?= =?UTF-8?q?=E6=99=83=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/MultiTemplateTabPane.java | 4 ++-- .../java/com/fr/design/mainframe/DesignerFrame.java | 8 ++++---- .../main/java/com/fr/design/mainframe/JTemplate.java | 10 ++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 901a12154e..abebe0438d 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -335,9 +335,9 @@ public class MultiTemplateTabPane extends JComponent { if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); } else if (option == CloseOption.All){ - DesignerContext.getDesignerFrame().activateJTemplate(openedTemplate.get(0)); + openedTemplate.get(0).activeOldJTemplate(); } else { - DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); + currentTemplate.activeOldJTemplate(); } MultiTemplateTabPane.getInstance().repaint(); 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 e88d0c946c..150c4302f4 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 @@ -852,7 +852,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta if (jt == null || jt.getEditingFILE() == null) { return; } - if (currentTemplateDeactivateFail()) { + if (currentTemplateDeactivateFail(jt)) { return; } jt.addJTemplateActionListener(this); @@ -877,7 +877,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta if (jt == null || jt.getEditingFILE() == null) { return; } - if (currentTemplateDeactivateFail()) { + if (currentTemplateDeactivateFail(jt)) { return; } getCenterTemplateCardPane().showJTemplate(jt); @@ -939,9 +939,9 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @return 是否停用失败 */ - private boolean currentTemplateDeactivateFail() { + private boolean currentTemplateDeactivateFail(JTemplate jt) { JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - return currentEditingTemplate != null && !currentEditingTemplate.deactivateTemplate(); + return currentEditingTemplate != null && !currentEditingTemplate.deactivateTemplate(jt); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 17a5afb2b6..0efb1de626 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1373,6 +1373,16 @@ public abstract class JTemplate> } + /** + * 将要激活打开其他模板,使当前模板灭活 + * 默认 do nothing 返回true + * + * @return true:成功停用当前模板 + */ + public boolean deactivateTemplate(JTemplate jTemplate) { + return true; + } + /** * 返回当前支持的超链界面pane * From bd2b819a527264bd612b4490e00510de0343617e Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 25 Apr 2023 09:48:17 +0800 Subject: [PATCH 02/61] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/MultiTemplateTabPane.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index abebe0438d..94983ac79e 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -335,6 +335,7 @@ public class MultiTemplateTabPane extends JComponent { if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); } else if (option == CloseOption.All){ + //openedTemplate(0)是JVirtualTemplate时需重新打开 openedTemplate.get(0).activeOldJTemplate(); } else { currentTemplate.activeOldJTemplate(); From b421538b5b48f816095f2a4b4659d8685b8326a0 Mon Sep 17 00:00:00 2001 From: roger Date: Tue, 25 Apr 2023 09:57:41 +0800 Subject: [PATCH 03/61] =?UTF-8?q?REPORT-94504=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=A8=A1=E6=9D=BF=EF=BC=8C=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=98=AF=E5=90=A6=E6=9C=89=E6=9C=AA=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=86=85=E5=AE=B9=E6=B2=A1=E6=9C=89=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=EF=BC=8C=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E6=9C=89=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E9=A3=8E=E9=99=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabPane.java | 5 ++-- .../fr/design/file/SaveSomeTemplatePane.java | 27 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 901a12154e..f66743717d 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -322,8 +322,9 @@ public class MultiTemplateTabPane extends JComponent { @Override public void actionPerformed(ActionEvent e) { - SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); - if (saveSomeTempaltePane.showSavePane()) { + //只有关闭所有模板才需要判断当前模板,关闭左侧、右侧、其他都不需要 + SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(option == CloseOption.All); + if (saveSomeTemplatePane.showSavePane(option, false)) { JTemplate[] templates = new JTemplate[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index fa8e3d385d..25df1dd3cc 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -17,6 +17,7 @@ import com.fr.design.mainframe.JTemplate; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.EmptyBorder; @@ -162,8 +163,25 @@ public class SaveSomeTemplatePane extends BasicPane { return showSavePane(false); } + /** + * 显示保存模板提醒面板 + * + * @param judgeJTemplateMustSave 模板是否必须保存 + * @return + */ public boolean showSavePane(boolean judgeJTemplateMustSave) { - populate(judgeJTemplateMustSave); + return showSavePane(null, judgeJTemplateMustSave); + } + + /** + * 显示保存模板提醒面板 + * + * @param option 具体关闭操作 + * @param judgeJTemplateMustSave 模板是否必须保存 + * @return + */ + public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + populate(option, judgeJTemplateMustSave); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { dialog.setVisible(true); @@ -177,11 +195,14 @@ public class SaveSomeTemplatePane extends BasicPane { return HistoryTemplateListPane.getInstance().getHistoryList(); } - public void populate(boolean judgeJTemplateMustSave) { + private void populate(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { java.util.List> opendedTemplate = getOpenedTemplatesToProcess(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + int currentIndex = opendedTemplate.indexOf(currentTemplate); for (int i = 0; i < opendedTemplate.size(); i++) { - if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) { + //满足关闭条件的才继续判断文件是否发生了改动 + boolean needClose = option == null || option.shouldClose(currentIndex, i); + if (needClose && isneedToAdd(opendedTemplate.get(i), currentTemplate)) { unSavedTemplate.add(opendedTemplate.get(i)); } } From 52d926d1d1908d4c302eb621f1cd85b8c862ef5c Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 25 Apr 2023 10:59:10 +0800 Subject: [PATCH 04/61] =?UTF-8?q?REPORT-91253=20FR=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E4=B8=AD=E5=AD=98=E5=9C=A8=E5=AF=86=E9=92=A5=E7=A1=AC=E7=BC=96?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/com/fr/design/config/default | 1 + .../com/fr/design/mainframe/share/util/DownloadUtils.java | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/resources/com/fr/design/config/default b/designer-base/src/main/resources/com/fr/design/config/default index f808a82379..b323302824 100644 --- a/designer-base/src/main/resources/com/fr/design/config/default +++ b/designer-base/src/main/resources/com/fr/design/config/default @@ -1 +1,2 @@ Fine-Designer_Login=i7hP48WAcuTrmxfN +Fine-Designer_Reu_Share_CERTIFICATE_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtsz62CPSWXZE/IYZRiAuTSZkw1WOwer8+JFktK0uKLAUuQoBr+UjAMFtRA8W7JgKMDwZy/2liEAiXEOSPU/hrdV8DtT541LnGi1X/hXiRwuttPWYN3L2GYm/d5blU+FBNwghBIrdAxXTzYBc6P4KL/oYXnMdTIrkz8tYkG3QoFQIDAQAB \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java b/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java index a814dfa0aa..a451a9bee1 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe.share.util; import com.fr.base.theme.FormTheme; import com.fr.design.DesignerEnvManager; import com.fr.design.extra.PluginConstants; +import com.fr.design.login.config.DefaultLoginKeys; import com.fr.form.share.base.CancelCheck; import com.fr.form.share.constants.ShareComponentConstants; import com.fr.ftp.util.Base64; @@ -45,10 +46,7 @@ import java.util.Set; * created by Harrison on 2020/05/27 **/ public class DownloadUtils { - private static final String CERTIFICATE_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtsz62CPSWXZE/IYZRiAuTSZkw\n" + - "1WOwer8+JFktK0uKLAUuQoBr+UjAMFtRA8W7JgKMDwZy/2liEAiXEOSPU/hrdV8D\n" + - "tT541LnGi1X/hXiRwuttPWYN3L2GYm/d5blU+FBNwghBIrdAxXTzYBc6P4KL/oYX\n" + - "nMdTIrkz8tYkG3QoFQIDAQAB"; + private static final String CERTIFICATE_PUBLIC_KEY = DefaultLoginKeys.getInstance().getKey("Fine-Designer_Reu_Share_CERTIFICATE_PUBLIC_KEY"); private static String getReusesUrl() { return StableUtils.pathJoin(OnlineShopUtils.getReuInfoPath(), "file/download"); From 4ebd18d6ee53cdc844d72c01d83be96a76e1d4d6 Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 25 Apr 2023 14:46:06 +0800 Subject: [PATCH 05/61] =?UTF-8?q?REPORT-94510=20=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8-tab=E5=9D=97=E7=BB=84=E4=BB=B6=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E8=AE=BE=E7=BD=AE0-=E6=A0=B7=E5=BC=8F=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE"=E8=8F=9C=E5=8D=95=E5=BC=8F"-=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E7=A9=BA=E7=99=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget/ui/designer/component/WidgetCardTagBoundPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java index 22d544c1a6..66ae39cd60 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java @@ -29,7 +29,7 @@ public class WidgetCardTagBoundPane extends WidgetBoundPane { @Override public void initBoundPane() { - cardTagWidth = new UIBoundSpinner(0, Integer.MAX_VALUE, 1); + cardTagWidth = new UIBoundSpinner(0, Integer.MAX_VALUE, 1, 0); cardTagWidth.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Coords_And_Size")); this.add(WidgetBoundsPaneFactory.createCardTagBoundPane(cardTagWidth)); } From 5c535d46ee6a5836e429b405c2a44a642295c37d Mon Sep 17 00:00:00 2001 From: roger Date: Tue, 25 Apr 2023 16:29:30 +0800 Subject: [PATCH 06/61] =?UTF-8?q?=E6=94=B9=E4=B8=80=E4=B8=8B=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/file/SaveSomeTemplatePane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index 25df1dd3cc..e371f6ce2b 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -181,7 +181,7 @@ public class SaveSomeTemplatePane extends BasicPane { * @return */ public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { - populate(option, judgeJTemplateMustSave); + initAndPopulate(option, judgeJTemplateMustSave); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { dialog.setVisible(true); @@ -195,7 +195,7 @@ public class SaveSomeTemplatePane extends BasicPane { return HistoryTemplateListPane.getInstance().getHistoryList(); } - private void populate(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { java.util.List> opendedTemplate = getOpenedTemplatesToProcess(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); int currentIndex = opendedTemplate.indexOf(currentTemplate); From d661eb200986b8e7d6ce4d846c73ed7c6b881f9f Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 25 Apr 2023 17:13:14 +0800 Subject: [PATCH 07/61] =?UTF-8?q?REPORT-94114=2011.0.15.1=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E7=89=88=E6=9C=AC=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=88=B0?= =?UTF-8?q?persist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/VanChartHyperLinkPane.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java index 75ec5d3ce2..bdd3608c9e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java @@ -309,12 +309,24 @@ public class VanChartHyperLinkPane extends VanChartUIListControlPane { if (!JTemplate.isValid(template)) { return false; } - Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class}; - for (Class aClass : classes) { - if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) { - // 编辑的是决策报表中的图表,那么没有ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项,有FormHyperlink 选项 - if (ComparatorUtils.equals(aClass, clazz)) { - return false; + + if (template.isJWorkBook()) { + // 如果是普通报表单元格,那么没有 FormHyperlink 选项 + FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); + return !ComparatorUtils.equals(clazz, formHyperlink.getClass()); + } else { + // 如果是决策报表 + if (template.getEditingReportIndex() == BaseJForm.ELEMENTCASE_TAB) { + // 编辑的是决策报表中的报表块,那么没有 ChartHyperRelateFloatLink选项 + return !ComparatorUtils.equals(clazz, ChartHyperRelateFloatLink.class); + } + Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class}; + for (Class aClass : classes) { + if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) { + // 编辑的是决策报表中的图表,那么没有 ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项 + if (ComparatorUtils.equals(aClass, clazz)) { + return false; + } } } } From cddfe101f845eecda288c74ec00e0cae8c0e2844 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 26 Apr 2023 11:51:31 +0800 Subject: [PATCH 08/61] =?UTF-8?q?REPORT-94999=20=20frm-tab=E6=A0=8F?= =?UTF-8?q?=E4=B8=8Efvs-tab=E6=A0=8F=E5=88=87=E6=8D=A2=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E4=BC=9A=E5=87=BA=E7=8E=B0=E8=B7=B3=E5=88=B0=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/MultiTemplateTabPane.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 9b4b57fc45..c2b340dff2 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -998,9 +998,12 @@ public class MultiTemplateTabPane extends JComponent { // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 if (closeIconIndex == selectedIndex || isCloseCurrent) { // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 + // 关闭的模板是当前选中的模板时,需要重新计算下一个待展示的模板的index if (selectedIndex >= maxPaintIndex) { // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true selectedIndex = calNextShowJTemplateIndex(selectedIndex - 1); + } else { + selectedIndex = calNextShowJTemplateIndex(selectedIndex); } isCloseCurrent = false; } From a6a0952f0b19cdd235a184b737554c4028da37e9 Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 27 Apr 2023 09:16:46 +0800 Subject: [PATCH 09/61] =?UTF-8?q?REPORT-95068=E3=80=90FVS=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E5=BC=80=E3=80=91=E5=85=BC=E5=AE=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=8Brelease-jar+=E6=97=A7=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E8=BF=9E=E7=BB=AD=E6=89=93=E5=BC=80=E4=B8=A4=E5=BC=A0?= =?UTF-8?q?fvs=E6=A8=A1=E6=9D=BF=EF=BC=8C=E5=85=B3=E9=97=AD=E5=90=8E?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/mainframe/JTemplate.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 0efb1de626..7977b8202a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1380,7 +1380,8 @@ public abstract class JTemplate> * @return true:成功停用当前模板 */ public boolean deactivateTemplate(JTemplate jTemplate) { - return true; + //兼容调用老的接口 + return deactivateTemplate(); } /** From 9378404421920b4878a245d982d464cdda779a0b Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 28 Apr 2023 12:00:11 +0800 Subject: [PATCH 10/61] =?UTF-8?q?REPORT-95197=20&&=20REPORT-95194=20?= =?UTF-8?q?=E6=89=93=E5=BC=80=E8=BF=9C=E7=A8=8B=E5=B7=A5=E4=BD=9C=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E9=9D=A2=E6=9D=BF=EF=BC=8C=E9=80=89=E6=8B=A9=E8=BF=9C?= =?UTF-8?q?=E7=A8=8B=E7=9B=AE=E5=BD=95=E7=82=B9=E7=A1=AE=E5=AE=9A=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=BC=BA=E5=88=B6=E8=A6=81=E6=B1=82=E4=BF=9D?= =?UTF-8?q?=E5=AD=98fvs=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 2 +- .../fr/design/file/MultiTemplateTabPane.java | 32 ++++++++++++++++--- .../fr/design/file/SaveSomeTemplatePane.java | 6 ++-- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index 0a464aa6d9..16c1a7e8a4 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -413,7 +413,7 @@ public class EnvChangeEntrance { @Override public void doOk() { SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true, SwingUtilities.getWindowAncestor(envListPane)); - if (!saveSomeTemplatePane.showSavePane()) { + if (!saveSomeTemplatePane.showSavePane(true)) { // 用户取消保存时,取消切换目录操作 return; } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index c2b340dff2..a686699e1a 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -212,6 +212,28 @@ public class MultiTemplateTabPane extends JComponent { }); } + + /** + * 模板可以关闭的条件 + */ + class CloseCondition { + private CloseOption closeOption; + + public CloseCondition(CloseOption closeOption) { + this.closeOption = closeOption; + } + + public boolean shouldClose(JTemplate closeJTemplate, int tplIndex, int i) { + boolean matchOption = this.closeOption.shouldClose(tplIndex, i); + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (currentTemplate == null) { + return matchOption; + } + return matchOption && ComparatorUtils.equals(closeJTemplate.getTemplateTabOperatorType(), + currentTemplate.getTemplateTabOperatorType()); + } + } + enum CloseOption { Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { @Override @@ -324,14 +346,15 @@ public class MultiTemplateTabPane extends JComponent { public void actionPerformed(ActionEvent e) { //只有关闭所有模板才需要判断当前模板,关闭左侧、右侧、其他都不需要 SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(option == CloseOption.All); - if (saveSomeTemplatePane.showSavePane(option, false)) { + CloseCondition closeCondition = new CloseCondition(option); + if (saveSomeTemplatePane.showSavePane(closeCondition, false)) { JTemplate[] templates = new JTemplate[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { templates[i] = openedTemplate.get(i); } JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - closeTemplate(templates, currentTemplate); + closeTemplate(closeCondition, templates, currentTemplate); if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); @@ -346,10 +369,9 @@ public class MultiTemplateTabPane extends JComponent { } } - private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate) { - String operator = currentTemplate.getTemplateTabOperatorType(); + private void closeTemplate(CloseCondition closeCondition, JTemplate[] templates, JTemplate currentTemplate) { for (int i = 0; i < templates.length; i++) { - if (option.shouldClose(tplIndex, i) && ComparatorUtils.equals(operator, templates[i].getTemplateTabOperatorType())) { + if (closeCondition.shouldClose(templates[i], tplIndex, i)) { JTemplate jTemplate = templates[i]; if (jTemplate == currentTemplate) { currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index e371f6ce2b..18c34e808c 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -180,7 +180,7 @@ public class SaveSomeTemplatePane extends BasicPane { * @param judgeJTemplateMustSave 模板是否必须保存 * @return */ - public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { initAndPopulate(option, judgeJTemplateMustSave); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { @@ -195,13 +195,13 @@ public class SaveSomeTemplatePane extends BasicPane { return HistoryTemplateListPane.getInstance().getHistoryList(); } - private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { java.util.List> opendedTemplate = getOpenedTemplatesToProcess(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); int currentIndex = opendedTemplate.indexOf(currentTemplate); for (int i = 0; i < opendedTemplate.size(); i++) { //满足关闭条件的才继续判断文件是否发生了改动 - boolean needClose = option == null || option.shouldClose(currentIndex, i); + boolean needClose = option == null || option.shouldClose(opendedTemplate.get(i), currentIndex, i); if (needClose && isneedToAdd(opendedTemplate.get(i), currentTemplate)) { unSavedTemplate.add(opendedTemplate.get(i)); } From 91f3f3cd0bcc42a2453c329863fb7de7953210ca Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 28 Apr 2023 14:02:03 +0800 Subject: [PATCH 11/61] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/MultiTemplateTabPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index a686699e1a..4352bab179 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -226,7 +226,7 @@ public class MultiTemplateTabPane extends JComponent { public boolean shouldClose(JTemplate closeJTemplate, int tplIndex, int i) { boolean matchOption = this.closeOption.shouldClose(tplIndex, i); JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (currentTemplate == null) { + if (!JTemplate.isValid(currentTemplate)) { return matchOption; } return matchOption && ComparatorUtils.equals(closeJTemplate.getTemplateTabOperatorType(), From c9cf01170c4177dc82c3b6be50f025e6328610ce Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 28 Apr 2023 14:07:48 +0800 Subject: [PATCH 12/61] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/file/MultiTemplateTabPane.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 4352bab179..aa64244dee 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -223,6 +223,13 @@ public class MultiTemplateTabPane extends JComponent { this.closeOption = closeOption; } + /** + * 判断模板是否可以关闭,两个条件:1、是否满足CloseOption里面的条件(在左侧、在右侧等)2、是否和当前正在编辑模板属于同一种模板tab操作类型 + * @param closeJTemplate + * @param tplIndex + * @param i + * @return + */ public boolean shouldClose(JTemplate closeJTemplate, int tplIndex, int i) { boolean matchOption = this.closeOption.shouldClose(tplIndex, i); JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); From 7993ac4c05d882ce165cc4dcec4cf6c9403fe385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 4 May 2023 10:01:54 +0800 Subject: [PATCH 13/61] =?UTF-8?q?REPORT-94476=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=AD=E6=8C=89=E4=B8=8A=E6=96=B9=E5=90=91=E9=94=AE?= =?UTF-8?q?=E5=90=8E=E4=B8=8A=E9=9D=A2=E7=9A=84=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E8=A2=AB=E6=B8=85=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/grid/GridKeyAction.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java b/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java index 12e8ac597a..c69c2e11db 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java +++ b/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java @@ -69,28 +69,21 @@ public class GridKeyAction extends AbstractAction { } else if ("right".equals(actionKey)) { selectionMove(ReportConstants.MOVE_DIRECTION_RIGHT); } else if ("up".equals(actionKey)) { - selectionMove(ReportConstants.MOVE_DIRECTION_UP); + directKeyPressed(ReportConstants.MOVE_DIRECTION_UP); } else if ("down".equals(actionKey)) { - selectionMove(ReportConstants.MOVE_DIRECTION_DOWN); + directKeyPressed(ReportConstants.MOVE_DIRECTION_DOWN); } else if ("enter".equals(actionKey)) { - enterKeyPressed(); + directKeyPressed(ReportConstants.MOVE_DIRECTION_DOWN); } else if ("tab".equals(actionKey)) { - tabKeyPressed(); + directKeyPressed(ReportConstants.MOVE_DIRECTION_RIGHT); } } - private void enterKeyPressed() { + private void directKeyPressed(int direction) { if (grid.isCellEditing()) { grid.stopEditing(); } - selectionMove(ReportConstants.MOVE_DIRECTION_DOWN); - } - - private void tabKeyPressed() { - if (grid.isCellEditing()) { - grid.stopEditing(); - } - selectionMove(ReportConstants.MOVE_DIRECTION_RIGHT); + selectionMove(direction); } /** From a96940ccd83d40ea040d1fb300e77bc893f12811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 4 May 2023 10:08:05 +0800 Subject: [PATCH 14/61] =?UTF-8?q?REPORT-94476=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=AD=E6=8C=89=E4=B8=8A=E6=96=B9=E5=90=91=E9=94=AE?= =?UTF-8?q?=E5=90=8E=E4=B8=8A=E9=9D=A2=E7=9A=84=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E8=A2=AB=E6=B8=85=E7=A9=BA--=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/grid/GridKeyAction.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java b/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java index c69c2e11db..8432cc819b 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java +++ b/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java @@ -79,6 +79,11 @@ public class GridKeyAction extends AbstractAction { } } + /** + * 传入方向进行单元格的方向移动 + * + * @param direction 方向 + */ private void directKeyPressed(int direction) { if (grid.isCellEditing()) { grid.stopEditing(); From 4efdb7aa1162c1a4becc3bca736bae9fee263f71 Mon Sep 17 00:00:00 2001 From: Maximus <49313791+num73@users.noreply.github.com> Date: Fri, 5 May 2023 09:35:19 +0800 Subject: [PATCH 15/61] =?UTF-8?q?REPORT-90546=20=E6=8A=8A=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E5=92=8C=E5=B9=B3=E5=8F=B0=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95=E5=8C=BA=E5=88=86=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/data/datapane/connect/DatabaseConnectionPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 0a00f37041..95742d0bdd 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -589,7 +589,7 @@ public abstract class DatabaseConnectionPane Date: Fri, 5 May 2023 09:48:05 +0800 Subject: [PATCH 16/61] =?UTF-8?q?REPORT-90546=20=E6=8A=8A=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E5=92=8C=E5=B9=B3=E5=8F=B0=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95=E5=8C=BA=E5=88=86=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/connect/DatabaseConnectionPane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 95742d0bdd..3c5c2b82a8 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -589,7 +589,7 @@ public abstract class DatabaseConnectionPane Date: Sat, 6 May 2023 09:45:27 +0800 Subject: [PATCH 17/61] =?UTF-8?q?REPORT-95337=20&=20REPORT-95265=20fix:=20?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E9=A2=84=E8=A7=88=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E7=9A=84=E6=A8=A1=E6=9D=BF=E4=BF=A1=E6=81=AF=E6=90=BA?= =?UTF-8?q?=E5=B8=A6=E4=BF=AE=E6=94=B9=20&=20sql=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E5=85=88=E5=8D=95=E7=8B=AC=E5=A4=84=E7=90=86=E4=B8=80=E4=B8=8B?= =?UTF-8?q?sqlserver=E7=9A=84=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/data/DesignTableDataManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index 712dcbd33b..6ed05fe115 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -572,7 +572,7 @@ public abstract class DesignTableDataManager { parameter.setValue(parameterMap.get(parameter.getName())); } } - parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); + addTemplateInfo(parameterMap); return DataOperator.getInstance().previewTableData(TableDataSourceTailor.extractTableData(tableDataSource), tabledata, parameterMap, rowCount); } catch (Exception e) { throw new TableDataException(e.getMessage(), e); @@ -592,6 +592,12 @@ public abstract class DesignTableDataManager { } } + private static void addTemplateInfo(Map parameterMap) { + if (JTemplate.isValid(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())) { + parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); + } + } + private static boolean needInputParams(boolean mustInputParameters, ParameterProvider[] parameters) { if (mustInputParameters && ArrayUtils.isNotEmpty(parameters)) { return true; @@ -669,7 +675,7 @@ public abstract class DesignTableDataManager { if (needLoadingBar) { MultiResultTableDataWrapper.loadingBar.start(); } - parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); + addTemplateInfo(parameterMap); return DataOperator.getInstance().previewMultiResultTableData(tableData, parameterMap, 0); } From 28b4d2a774b0fa916f0b5878536da6e06b46df40 Mon Sep 17 00:00:00 2001 From: "Sky.Luo" Date: Sat, 6 May 2023 10:04:22 +0800 Subject: [PATCH 18/61] =?UTF-8?q?REPORT-95337=20&=20REPORT-95265=20fix:=20?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E9=A2=84=E8=A7=88=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E7=9A=84=E6=A8=A1=E6=9D=BF=E4=BF=A1=E6=81=AF=E6=90=BA?= =?UTF-8?q?=E5=B8=A6=E4=BF=AE=E6=94=B9=20&=20sql=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E5=85=88=E5=8D=95=E7=8B=AC=E5=A4=84=E7=90=86=E4=B8=80=E4=B8=8B?= =?UTF-8?q?sqlserver=E7=9A=84=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/DesignTableDataManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index 6ed05fe115..2354007e18 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -572,7 +572,7 @@ public abstract class DesignTableDataManager { parameter.setValue(parameterMap.get(parameter.getName())); } } - addTemplateInfo(parameterMap); + addTemplateInfoIfNeed(parameterMap); return DataOperator.getInstance().previewTableData(TableDataSourceTailor.extractTableData(tableDataSource), tabledata, parameterMap, rowCount); } catch (Exception e) { throw new TableDataException(e.getMessage(), e); @@ -592,7 +592,7 @@ public abstract class DesignTableDataManager { } } - private static void addTemplateInfo(Map parameterMap) { + private static void addTemplateInfoIfNeed(Map parameterMap) { if (JTemplate.isValid(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())) { parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); } @@ -675,7 +675,7 @@ public abstract class DesignTableDataManager { if (needLoadingBar) { MultiResultTableDataWrapper.loadingBar.start(); } - addTemplateInfo(parameterMap); + addTemplateInfoIfNeed(parameterMap); return DataOperator.getInstance().previewMultiResultTableData(tableData, parameterMap, 0); } From 5e45ab2f60cd9fabb037c7aebe20863f9620b2fa Mon Sep 17 00:00:00 2001 From: Carlson Date: Sat, 6 May 2023 14:17:52 +0800 Subject: [PATCH 19/61] =?UTF-8?q?REPORT-95362=20fix:tab=E4=B8=8A=E7=9A=84t?= =?UTF-8?q?oolTip=E8=A2=AB=E6=88=AA=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/MultiTemplateTabPane.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index aa64244dee..8e74eaacd4 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -44,6 +44,7 @@ import javax.swing.JSeparator; import javax.swing.MenuElement; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import javax.swing.ToolTipManager; import javax.swing.plaf.basic.BasicMenuItemUI; import java.awt.AWTEvent; import java.awt.AlphaComposite; @@ -1153,6 +1154,7 @@ public class MultiTemplateTabPane extends JComponent { private class MultiTemplateTabMouseListener implements MouseListener { + private boolean oldLightWeightPopupEnabled; /** * 鼠标进入 @@ -1161,7 +1163,8 @@ public class MultiTemplateTabPane extends JComponent { */ @Override public void mouseEntered(MouseEvent e) { - // do nothing + this.oldLightWeightPopupEnabled = ToolTipManager.sharedInstance().isLightWeightPopupEnabled(); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); } /** @@ -1171,6 +1174,9 @@ public class MultiTemplateTabPane extends JComponent { */ @Override public void mouseExited(MouseEvent e) { + ToolTipManager.sharedInstance().setEnabled(false); + ToolTipManager.sharedInstance().setEnabled(true); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(this.oldLightWeightPopupEnabled); listDownMode = LIST_DOWN; closeIconIndex = -1; mouseOveredIndex = -1; From 78027aae0ede70dc5e7768c93d26bc625e88876f Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 6 May 2023 15:45:19 +0800 Subject: [PATCH 20/61] =?UTF-8?q?REPORT-95401=20&&=20REPORT-95218=E3=80=90?= =?UTF-8?q?FVS=E6=94=AF=E6=8C=81=E5=A4=9A=E5=BC=80=E3=80=91=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=A4=9A=E4=B8=AAfvs=E4=B9=8B=E5=90=8E=E6=89=93?= =?UTF-8?q?=E5=BC=80frm=EF=BC=8C=E5=86=8D=E6=AC=A1=E6=89=93=E5=BC=80fvs?= =?UTF-8?q?=EF=BC=8Ctab=E6=A0=8F=E8=87=AA=E9=80=82=E5=BA=94=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E3=80=90FVS=E6=94=AF=E6=8C=81=E5=A4=9A=E5=BC=80?= =?UTF-8?q?=E3=80=91=E7=A6=81=E7=94=A8=E6=8F=92=E4=BB=B6=EF=BC=8C=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E4=BF=9D=E5=AD=98fvs=E6=A8=A1=E6=9D=BF=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E5=8F=96=E6=B6=88=E5=8B=BE=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabPane.java | 48 +++++++++++++++++++ .../fr/design/file/SaveSomeTemplatePane.java | 4 +- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index aa64244dee..98c98a1846 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -756,6 +756,54 @@ public class MultiTemplateTabPane extends JComponent { minPaintIndex = 0; maxPaintIndex = openedTemplate.size() - 1; } + //需要根据每个tab的宽度重新check下实际的maxPaintIndex和minPaintIndex + checkActualPaintIndex(); + } + + + /** + * 由于可能存在宽度为0的tab,所以这边需要重新check下 + */ + private void checkActualPaintIndex(){ + //先计算出需要补充的tab个数 + int a = 0; + for (int i = minPaintIndex; i <= maxPaintIndex; i++) { + JTemplate template = openedTemplate.get(i); + if (!showJTemplateTab(template)) { + a++; + } + } + if (a == 0){ + return; + } + //先往后补 + if (maxPaintIndex < openedTemplate.size() - 1) { + for (int i = maxPaintIndex + 1; i < openedTemplate.size(); i++) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + a--; + } + maxPaintIndex++; + if (a == 0){ + return; + } + } + } + + //再往前补 + if (minPaintIndex > 0){ + for (int i = minPaintIndex - 1; i > 0; i--) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + a--; + } + minPaintIndex--; + if (a == 0){ + return; + } + } + } + } diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index 18c34e808c..0bdd48b359 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -124,8 +124,10 @@ public class SaveSomeTemplatePane extends BasicPane { if (index < 0) { return; } + boolean mustSaveBeforeSwitchEnv = judgeJTemplateMustSave + && unSavedTemplate.get(index).needSaveBeforeSwitchEnv(); UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(index); - checkBox.setSelected(!checkBox.isSelected()); + checkBox.setSelected(mustSaveBeforeSwitchEnv ||!checkBox.isSelected()); //根据templateCheckBoxes中的选择情况来更新全选框的状态 int selectedCount = calculateSelectedNum(); From 51adfa34e9a2b8a4abb458716a7729e99d30d5bb Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 6 May 2023 15:54:28 +0800 Subject: [PATCH 21/61] =?UTF-8?q?=E5=BE=80=E5=89=8D=E9=81=8D=E5=8E=86?= =?UTF-8?q?=E8=A6=81=E5=88=B00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/MultiTemplateTabPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 98c98a1846..af772dc7ec 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -792,7 +792,7 @@ public class MultiTemplateTabPane extends JComponent { //再往前补 if (minPaintIndex > 0){ - for (int i = minPaintIndex - 1; i > 0; i--) { + for (int i = minPaintIndex - 1; i >= 0; i--) { JTemplate template = openedTemplate.get(i); if (showJTemplateTab(template)) { a--; From 47164404ad526fff6f629237ad0d42f45873c050 Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 6 May 2023 17:02:34 +0800 Subject: [PATCH 22/61] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=A1=8C=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabPane.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index af772dc7ec..2bac8fcad0 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -760,12 +760,11 @@ public class MultiTemplateTabPane extends JComponent { checkActualPaintIndex(); } - /** - * 由于可能存在宽度为0的tab,所以这边需要重新check下 + * 先计算出需要补充的tab个数 + * @return */ - private void checkActualPaintIndex(){ - //先计算出需要补充的tab个数 + private int calTabCountComplemented(){ int a = 0; for (int i = minPaintIndex; i <= maxPaintIndex; i++) { JTemplate template = openedTemplate.get(i); @@ -773,37 +772,42 @@ public class MultiTemplateTabPane extends JComponent { a++; } } - if (a == 0){ + return a; + } + + + /** + * 由于可能存在宽度为0的tab,所以这边需要重新check下,先往后补,再往前补 + */ + private void checkActualPaintIndex(){ + int tabCount = calTabCountComplemented(); + if (tabCount == 0){ return; } - //先往后补 if (maxPaintIndex < openedTemplate.size() - 1) { for (int i = maxPaintIndex + 1; i < openedTemplate.size(); i++) { JTemplate template = openedTemplate.get(i); if (showJTemplateTab(template)) { - a--; + tabCount--; } maxPaintIndex++; - if (a == 0){ + if (tabCount == 0){ return; } } } - - //再往前补 if (minPaintIndex > 0){ for (int i = minPaintIndex - 1; i >= 0; i--) { JTemplate template = openedTemplate.get(i); if (showJTemplateTab(template)) { - a--; + tabCount--; } minPaintIndex--; - if (a == 0){ + if (tabCount == 0){ return; } } } - } From ccb79d4c49f6dfce1542bb9bffb425d969d7b23d Mon Sep 17 00:00:00 2001 From: Carlson Date: Mon, 8 May 2023 09:51:03 +0800 Subject: [PATCH 23/61] =?UTF-8?q?REPORT-95367=20fix:=E5=85=B3=E9=97=ADicon?= =?UTF-8?q?=E6=A8=A1=E7=B3=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/MultiTemplateTabMenuFactory.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java index 64e28eabf4..6210f7ba68 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java @@ -1,5 +1,6 @@ package com.fr.design.file; +import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; @@ -7,7 +8,6 @@ import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.TemplateUtils; -import com.fr.general.IOUtils; import com.fr.stable.StringUtils; import com.fr.stable.collections.CollectionUtils; @@ -34,9 +34,9 @@ import java.util.Map; **/ public class MultiTemplateTabMenuFactory { - private static final Icon CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/close_icon.png"); - private static final Icon MOUSE_OVER_CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/mouseoverclose icon.png"); - private static final Icon MOUSE_PRESS_CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/pressclose icon.png"); + private static final Icon CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close"); + private static final Icon MOUSE_OVER_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_mouseover.svg"); + private static final Icon MOUSE_PRESS_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_press.svg"); private static final int ITEM_SIZE = 25; From 3d6cb96da67f86e8ebb4eb8459d99f1ffb3b1520 Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 8 May 2023 17:15:03 +0800 Subject: [PATCH 24/61] =?UTF-8?q?REPORT-95068=20&&=20REPORT-95197=20&&=20R?= =?UTF-8?q?EPORT-95194=20=20&&=20REPORT-95401=20&&=20REPORT-95218=20&&=20R?= =?UTF-8?q?EPORT-94999=20=20=E5=90=88=E5=B9=B6=E5=88=B0final?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 2 +- .../fr/design/file/MultiTemplateTabPane.java | 94 ++++++++++++++++++- .../fr/design/file/SaveSomeTemplatePane.java | 10 +- .../com/fr/design/mainframe/JTemplate.java | 3 +- 4 files changed, 98 insertions(+), 11 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index 0a464aa6d9..16c1a7e8a4 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -413,7 +413,7 @@ public class EnvChangeEntrance { @Override public void doOk() { SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true, SwingUtilities.getWindowAncestor(envListPane)); - if (!saveSomeTemplatePane.showSavePane()) { + if (!saveSomeTemplatePane.showSavePane(true)) { // 用户取消保存时,取消切换目录操作 return; } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 9b4b57fc45..2bac8fcad0 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -212,6 +212,35 @@ public class MultiTemplateTabPane extends JComponent { }); } + + /** + * 模板可以关闭的条件 + */ + class CloseCondition { + private CloseOption closeOption; + + public CloseCondition(CloseOption closeOption) { + this.closeOption = closeOption; + } + + /** + * 判断模板是否可以关闭,两个条件:1、是否满足CloseOption里面的条件(在左侧、在右侧等)2、是否和当前正在编辑模板属于同一种模板tab操作类型 + * @param closeJTemplate + * @param tplIndex + * @param i + * @return + */ + public boolean shouldClose(JTemplate closeJTemplate, int tplIndex, int i) { + boolean matchOption = this.closeOption.shouldClose(tplIndex, i); + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (!JTemplate.isValid(currentTemplate)) { + return matchOption; + } + return matchOption && ComparatorUtils.equals(closeJTemplate.getTemplateTabOperatorType(), + currentTemplate.getTemplateTabOperatorType()); + } + } + enum CloseOption { Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { @Override @@ -324,14 +353,15 @@ public class MultiTemplateTabPane extends JComponent { public void actionPerformed(ActionEvent e) { //只有关闭所有模板才需要判断当前模板,关闭左侧、右侧、其他都不需要 SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(option == CloseOption.All); - if (saveSomeTemplatePane.showSavePane(option, false)) { + CloseCondition closeCondition = new CloseCondition(option); + if (saveSomeTemplatePane.showSavePane(closeCondition, false)) { JTemplate[] templates = new JTemplate[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { templates[i] = openedTemplate.get(i); } JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - closeTemplate(templates, currentTemplate); + closeTemplate(closeCondition, templates, currentTemplate); if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); @@ -346,10 +376,9 @@ public class MultiTemplateTabPane extends JComponent { } } - private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate) { - String operator = currentTemplate.getTemplateTabOperatorType(); + private void closeTemplate(CloseCondition closeCondition, JTemplate[] templates, JTemplate currentTemplate) { for (int i = 0; i < templates.length; i++) { - if (option.shouldClose(tplIndex, i) && ComparatorUtils.equals(operator, templates[i].getTemplateTabOperatorType())) { + if (closeCondition.shouldClose(templates[i], tplIndex, i)) { JTemplate jTemplate = templates[i]; if (jTemplate == currentTemplate) { currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; @@ -727,6 +756,58 @@ public class MultiTemplateTabPane extends JComponent { minPaintIndex = 0; maxPaintIndex = openedTemplate.size() - 1; } + //需要根据每个tab的宽度重新check下实际的maxPaintIndex和minPaintIndex + checkActualPaintIndex(); + } + + /** + * 先计算出需要补充的tab个数 + * @return + */ + private int calTabCountComplemented(){ + int a = 0; + for (int i = minPaintIndex; i <= maxPaintIndex; i++) { + JTemplate template = openedTemplate.get(i); + if (!showJTemplateTab(template)) { + a++; + } + } + return a; + } + + + /** + * 由于可能存在宽度为0的tab,所以这边需要重新check下,先往后补,再往前补 + */ + private void checkActualPaintIndex(){ + int tabCount = calTabCountComplemented(); + if (tabCount == 0){ + return; + } + if (maxPaintIndex < openedTemplate.size() - 1) { + for (int i = maxPaintIndex + 1; i < openedTemplate.size(); i++) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + tabCount--; + } + maxPaintIndex++; + if (tabCount == 0){ + return; + } + } + } + if (minPaintIndex > 0){ + for (int i = minPaintIndex - 1; i >= 0; i--) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + tabCount--; + } + minPaintIndex--; + if (tabCount == 0){ + return; + } + } + } } @@ -998,9 +1079,12 @@ public class MultiTemplateTabPane extends JComponent { // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 if (closeIconIndex == selectedIndex || isCloseCurrent) { // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 + // 关闭的模板是当前选中的模板时,需要重新计算下一个待展示的模板的index if (selectedIndex >= maxPaintIndex) { // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true selectedIndex = calNextShowJTemplateIndex(selectedIndex - 1); + } else { + selectedIndex = calNextShowJTemplateIndex(selectedIndex); } isCloseCurrent = false; } diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index e371f6ce2b..0bdd48b359 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -124,8 +124,10 @@ public class SaveSomeTemplatePane extends BasicPane { if (index < 0) { return; } + boolean mustSaveBeforeSwitchEnv = judgeJTemplateMustSave + && unSavedTemplate.get(index).needSaveBeforeSwitchEnv(); UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(index); - checkBox.setSelected(!checkBox.isSelected()); + checkBox.setSelected(mustSaveBeforeSwitchEnv ||!checkBox.isSelected()); //根据templateCheckBoxes中的选择情况来更新全选框的状态 int selectedCount = calculateSelectedNum(); @@ -180,7 +182,7 @@ public class SaveSomeTemplatePane extends BasicPane { * @param judgeJTemplateMustSave 模板是否必须保存 * @return */ - public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { initAndPopulate(option, judgeJTemplateMustSave); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { @@ -195,13 +197,13 @@ public class SaveSomeTemplatePane extends BasicPane { return HistoryTemplateListPane.getInstance().getHistoryList(); } - private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { java.util.List> opendedTemplate = getOpenedTemplatesToProcess(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); int currentIndex = opendedTemplate.indexOf(currentTemplate); for (int i = 0; i < opendedTemplate.size(); i++) { //满足关闭条件的才继续判断文件是否发生了改动 - boolean needClose = option == null || option.shouldClose(currentIndex, i); + boolean needClose = option == null || option.shouldClose(opendedTemplate.get(i), currentIndex, i); if (needClose && isneedToAdd(opendedTemplate.get(i), currentTemplate)) { unSavedTemplate.add(opendedTemplate.get(i)); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 0efb1de626..7977b8202a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1380,7 +1380,8 @@ public abstract class JTemplate> * @return true:成功停用当前模板 */ public boolean deactivateTemplate(JTemplate jTemplate) { - return true; + //兼容调用老的接口 + return deactivateTemplate(); } /** From ee3ccaf42fc1a1fd52198e3bb08bb7410d747f85 Mon Sep 17 00:00:00 2001 From: Carlson Date: Mon, 8 May 2023 09:51:03 +0800 Subject: [PATCH 25/61] =?UTF-8?q?REPORT-95367=20fix:=E5=85=B3=E9=97=ADicon?= =?UTF-8?q?=E6=A8=A1=E7=B3=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/MultiTemplateTabMenuFactory.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java index 64e28eabf4..6210f7ba68 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java @@ -1,5 +1,6 @@ package com.fr.design.file; +import com.fr.base.svg.IconUtils; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; @@ -7,7 +8,6 @@ import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.TemplateUtils; -import com.fr.general.IOUtils; import com.fr.stable.StringUtils; import com.fr.stable.collections.CollectionUtils; @@ -34,9 +34,9 @@ import java.util.Map; **/ public class MultiTemplateTabMenuFactory { - private static final Icon CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/close_icon.png"); - private static final Icon MOUSE_OVER_CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/mouseoverclose icon.png"); - private static final Icon MOUSE_PRESS_CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/pressclose icon.png"); + private static final Icon CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close"); + private static final Icon MOUSE_OVER_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_mouseover.svg"); + private static final Icon MOUSE_PRESS_CLOSE = IconUtils.readIcon("/com/fr/design/standard/close/close_press.svg"); private static final int ITEM_SIZE = 25; From 831dc93a6bdcee9a655c17f01c6e1e3a9bcdbdc7 Mon Sep 17 00:00:00 2001 From: Carlson Date: Sat, 6 May 2023 14:17:52 +0800 Subject: [PATCH 26/61] =?UTF-8?q?REPORT-95362=20fix:tab=E4=B8=8A=E7=9A=84t?= =?UTF-8?q?oolTip=E8=A2=AB=E6=88=AA=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/MultiTemplateTabPane.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 2bac8fcad0..9236deb4ad 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -44,6 +44,7 @@ import javax.swing.JSeparator; import javax.swing.MenuElement; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import javax.swing.ToolTipManager; import javax.swing.plaf.basic.BasicMenuItemUI; import java.awt.AWTEvent; import java.awt.AlphaComposite; @@ -1205,6 +1206,7 @@ public class MultiTemplateTabPane extends JComponent { private class MultiTemplateTabMouseListener implements MouseListener { + private boolean oldLightWeightPopupEnabled; /** * 鼠标进入 @@ -1213,7 +1215,8 @@ public class MultiTemplateTabPane extends JComponent { */ @Override public void mouseEntered(MouseEvent e) { - // do nothing + this.oldLightWeightPopupEnabled = ToolTipManager.sharedInstance().isLightWeightPopupEnabled(); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); } /** @@ -1223,6 +1226,9 @@ public class MultiTemplateTabPane extends JComponent { */ @Override public void mouseExited(MouseEvent e) { + ToolTipManager.sharedInstance().setEnabled(false); + ToolTipManager.sharedInstance().setEnabled(true); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(this.oldLightWeightPopupEnabled); listDownMode = LIST_DOWN; closeIconIndex = -1; mouseOveredIndex = -1; From 04eeb7ff16e428f435379c7a0c25ee8b2e3c2508 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Tue, 9 May 2023 14:21:26 +0800 Subject: [PATCH 27/61] =?UTF-8?q?REPORT-95156=20=E3=80=90FR=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E3=80=91=E6=8A=A5=E8=A1=A8=E5=9D=97=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E5=8B=BE=E9=80=89=E7=A7=BB=E5=8A=A8=E7=AB=AF"?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=8F=AF=E9=80=89=E4=B8=AD"=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E5=8F=98=E7=BB=84=E4=BB=B6=E4=BD=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E6=92=A4=E9=94=80=E5=BC=82=E5=B8=B8=20=E3=80=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91=20ElementCaseDefinePane=20?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96panel=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=BB=99=E4=BA=86=E4=B8=AAtrue=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=8B=96=E5=8A=A8=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=EF=BC=8C=E8=A7=A6=E5=8F=91=E9=9D=A2=E6=9D=BF=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=9C=AA=E9=80=89=E4=B8=AD=E8=BF=99=E4=B8=AAcheckbox?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E6=88=90=E4=BA=86=E7=8A=B6=E6=80=81=E5=8F=91?= =?UTF-8?q?=E7=94=9F=E4=BA=86=E5=8F=98=E5=8C=96=EF=BC=8CundoState=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E7=9A=84=E7=8A=B6=E6=80=81=E5=B0=B1=E4=B8=8D=E5=A4=AA?= =?UTF-8?q?=E5=AF=B9=E3=80=82=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D?= =?UTF-8?q?=E8=B7=AF=E3=80=91=20=E4=B8=A4=E7=A7=8D=E6=94=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=9A=20=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=EF=BC=8C=E8=A6=81=E6=A0=B9=E6=8D=AE=E4=BC=A0=E8=BF=9B?= =?UTF-8?q?=E6=9D=A5=E7=9A=84FormDesigner=E6=9D=A5=E6=B8=B2=E6=9F=93checkb?= =?UTF-8?q?ox=E6=95=B0=E6=8D=AE=E3=80=82=20=E7=BB=84=E4=BB=B6=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E7=9B=91=E5=90=AC=E4=BA=8B=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E4=B8=8D=E8=A6=81=E6=94=BE=E5=9C=A8=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E4=BD=8D=E7=BD=AE=EF=BC=8C=E5=8F=82=E8=80=83?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E5=9D=97=EF=BC=8C=E6=94=BE=E5=9C=A8pupolate?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4=E3=80=82?= =?UTF-8?q?=EF=BC=88=E9=80=89=E8=BF=99=E4=B8=AA=EF=BC=89=20=E5=85=B3?= =?UTF-8?q?=E4=BA=8E=E4=B8=80=E6=AC=A1=E6=92=A4=E9=94=80=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E4=B8=A4=E7=A7=8D=E7=8A=B6=E6=80=81=E5=8F=91=E7=94=9F=E5=8F=98?= =?UTF-8?q?=E5=8C=96=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E6=98=AF=E7=94=B1?= =?UTF-8?q?=E4=BA=8E=E8=AE=B0=E5=BD=95undo=E7=8A=B6=E6=80=81=E7=9A=84?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E9=9D=A0=E5=89=8D=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E7=8A=B6=E6=80=81=E8=BF=98=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=8F=98=E5=8C=96=EF=BC=8C=E5=B0=B1=E8=A2=AB=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=BA=86=EF=BC=8C=E6=8A=8A=E8=BF=99=E4=B8=AA=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E4=B8=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget/ui/designer/mobile/ElementCaseDefinePane.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index bdd5b7d351..7ee106a9fc 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -22,7 +22,6 @@ import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.mobile.ui.MobileCollapsedStyleExpandPane; import com.fr.design.mainframe.mobile.ui.MobileComboBoxDialogEditor; import com.fr.form.ui.ElementCaseEditor; - import com.fr.form.ui.mobile.MobileCollapsedStyle; import com.fr.stable.StringUtils; @@ -30,7 +29,9 @@ import javax.swing.BorderFactory; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingConstants; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; /** * 报表块-移动端属性面板 @@ -123,7 +124,6 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { panelWrapper.add(panel, BorderLayout.NORTH); UIExpandablePane folderPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fit"), 280, 20, panelWrapper); this.add(folderPane, BorderLayout.NORTH); - this.bingListeners2Widgets(); this.setGlobalNames(); this.repaint(); } @@ -178,6 +178,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { this.mobileCollapsedStyleEditor.setStyle(elementCaseEditor.getMobileCollapsedStyle()); fix(elementCaseEditor.getMobileCollapsedStyle()); this.mobileCollapsedStyleEditor.setSelected(elementCaseEditor.getMobileCollapsedStyle().isCollapsedWork()); + this.bingListeners2Widgets(); } /** @@ -191,7 +192,6 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { @Override public void update() { - DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 String globalName = this.getGlobalName(); switch (globalName) { case "hComboBox": @@ -220,6 +220,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { style.setCollapsedWork(this.mobileCollapsedStyleEditor.isSelectedCustom() && !FormDesignerUtils.isInAbsoluteLayout(xCreator)); ((ElementCaseEditor) xCreator.toData()).setMobileCollapsedStyle(style); } + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 } private void setGlobalNames() { From 7a15b95c356a721e0d728db8c7027421c9c2c5f5 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Tue, 9 May 2023 14:43:44 +0800 Subject: [PATCH 28/61] =?UTF-8?q?REPORT-95156=20review=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/widget/ui/designer/mobile/ElementCaseDefinePane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index 7ee106a9fc..b9c84e5be7 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -165,7 +165,6 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { @Override public void populate(FormDesigner designer) { this.designer = designer; - this.addAttributeChangeListener(changeListener); ElementCaseEditor elementCaseEditor = (ElementCaseEditor) xCreator.toData(); this.hComboBox.setSelectedItem(new Item(elementCaseEditor.getHorziontalAttr().description(), elementCaseEditor.getHorziontalAttr())); this.vComboBox.setSelectedItem(new Item(elementCaseEditor.getVerticalAttr().description(), elementCaseEditor.getVerticalAttr())); @@ -179,6 +178,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { fix(elementCaseEditor.getMobileCollapsedStyle()); this.mobileCollapsedStyleEditor.setSelected(elementCaseEditor.getMobileCollapsedStyle().isCollapsedWork()); this.bingListeners2Widgets(); + this.addAttributeChangeListener(changeListener); } /** From 6d89346283af247f6a8c1da7339657ef25aac273 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 11 May 2023 09:52:29 +0800 Subject: [PATCH 29/61] =?UTF-8?q?REPORT-95731=20=E5=A4=9A=E5=B1=82?= =?UTF-8?q?=E9=A5=BC=E5=9B=BE=E3=80=81=E7=9F=A9=E5=BD=A2=E6=A0=91=E5=9B=BE?= =?UTF-8?q?=E7=9A=84=E6=B1=87=E6=80=BB=E6=96=B9=E5=BC=8F=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E9=A1=B9=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multilayer/data/MultiPiePlotTableDataContentPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java index b32ea4b67c..2466ed9036 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java @@ -241,7 +241,8 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa for (UIComboBox uiComboBox : levelNameList) { clearBoxItems(uiComboBox); } - clearBoxItems(calculateCombox); + //默认选求和 + calculateCombox.setSelectedIndex(2); refreshCenterPane(); } From 1bcac4b39842c7eed6606d7f443e1cb09a2fa050 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 11 May 2023 10:00:53 +0800 Subject: [PATCH 30/61] =?UTF-8?q?REPORT-95731=20=E5=A4=9A=E5=B1=82?= =?UTF-8?q?=E9=A5=BC=E5=9B=BE=E3=80=81=E7=9F=A9=E5=BD=A2=E6=A0=91=E5=9B=BE?= =?UTF-8?q?=E7=9A=84=E6=B1=87=E6=80=BB=E6=96=B9=E5=BC=8F=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E9=A1=B9=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multilayer/data/MultiPiePlotTableDataContentPane.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java index 2466ed9036..ba8d24929d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java @@ -58,6 +58,9 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa //将数据列名保存下来,在update时会删除层级名列表,需要用保存的list重新初始化新的层级名列表 private List columnNameList; + //汇总方式求和的索引 + public static final int SUM_INDEX = 2; + public MultiPiePlotTableDataContentPane() { } @@ -242,7 +245,7 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa clearBoxItems(uiComboBox); } //默认选求和 - calculateCombox.setSelectedIndex(2); + calculateCombox.setSelectedIndex(SUM_INDEX); refreshCenterPane(); } From eaf8616790a1dd5cadd1e7d4e4a029ba15b1ea8c Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Thu, 11 May 2023 21:08:53 +0800 Subject: [PATCH 31/61] =?UTF-8?q?REPORT-94629=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8tab=E7=BB=84=E4=BB=B6=E6=93=8D=E4=BD=9C=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creator/cardlayout/XCardSwitchButton.java | 63 ++++++++++++++----- .../creator/cardlayout/XWCardTagLayout.java | 39 +++++++++++- .../layout/WCardMainLayoutDefinePane.java | 6 +- .../layout/WCardTagLayoutDefinePane.java | 6 +- 4 files changed, 90 insertions(+), 24 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 85436c72fd..1c70ef870d 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -10,6 +10,7 @@ import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.creator.XButton; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ilable.UILabel; @@ -25,16 +26,27 @@ import com.fr.form.ui.container.WTabTextDirection; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.general.Background; -import com.fr.general.act.BorderPacker; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; +import com.fr.general.act.BorderPacker; import com.fr.general.act.TitlePacker; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.unit.PT; -import javax.swing.*; +import javax.swing.Action; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; import javax.swing.plaf.basic.BasicLabelUI; -import java.awt.*; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; import java.util.ArrayList; @@ -236,36 +248,54 @@ public class XCardSwitchButton extends XButton { //SwitchButton对应的XWCardLayout和XWCardTagLayout暂未存到xml中,重新打开时根据父子层关系获取 - private void initRelateLayout(){ - this.tagLayout = (XWCardTagLayout)this.getBackupParent(); + private void initRelateLayout() { + this.tagLayout = (XWCardTagLayout) this.getBackupParent(); XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.tagLayout.getBackupParent(); - XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout)titleLayout.getBackupParent(); + XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent(); this.cardLayout = borderLayout.getCardPart(); } - //是否进入点击关闭按钮区域 - private boolean isSelectedClose(MouseEvent e, FormDesigner designer){ + /** + *

是否进入点击关闭按钮区域 + *

计算逻辑: + *

先得到鼠标的绝对坐标 -> tab布局的绝对坐标 -> 得到鼠标相对tab的坐标(有参数面板时要减去参数面板的高度) + *

再计算删除区域位置的相对坐标,通过对比判定鼠标是否在点击关闭按钮区域内 + * + * @param e 鼠标事件 + * @param designer 表单编辑对象 + * @return true/false 在内/不在 + */ + private boolean isSelectedClose(MouseEvent e, FormDesigner designer) { int diff = designer.getHorizontalScaleValue(); // mouse position + // 这里是鼠标的绝对位置 int ex = e.getX() + diff; int ey = e.getY(); - //获取tab布局的位置,鼠标相对于tab按钮的位置 + // 获取tab布局的位置,鼠标相对于tab按钮的位置 Container mainLayout = cardLayout.getBackupParent(); + // 这个point是当前tab布局的相对坐标,是相对于父容器的坐标 + // 比如父级是一个absolute块,放在左上角,现在得到的point就是(0,0) Point point = mainLayout.getLocation(); int y = 0; int x = 0; - //遍历一下,不然是相对位置,嵌套后位置不对 - while (mainLayout.getParent() != null){ - if(mainLayout instanceof XWCardLayout){ + // 遍历一下,不然是相对位置,嵌套后位置不对 + // 这里是要得到tab布局的绝对位置,所以要加上父组件的位置 + while (mainLayout.getParent() != null) { + if (mainLayout instanceof XWCardLayout) { y += mainLayout.getY(); } mainLayout = mainLayout.getParent(); - if(mainLayout instanceof XWCardMainBorderLayout){ + if (mainLayout instanceof XWCardMainBorderLayout) { + x += mainLayout.getX(); + y += mainLayout.getY(); + } + + if (mainLayout instanceof XWAbsoluteLayout) { x += mainLayout.getX(); y += mainLayout.getY(); } @@ -291,10 +321,11 @@ public class XCardSwitchButton extends XButton { int width = button.getWidth(); // 鼠标进入按钮右侧删除图标区域 - double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET); + double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET); double recY = position.getY() + titlePoint.getY() + CLOSE_ICON_TOP_OFFSET; - - return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY()); + // 比较的是相对位置的偏移量是否在一定距离内 + // 所以要得到鼠标相对于当前tab块的坐标 + return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY()); } //将当前switchButton改为选中状态 diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index 0353d53dd0..a88b6847e4 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -24,21 +24,25 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.FormHierarchyTreePane; import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; -import com.fr.general.act.BorderPacker; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; +import com.fr.general.act.BorderPacker; import com.fr.general.cardtag.DefaultTemplateStyle; import com.fr.stable.StringUtils; import javax.swing.border.Border; -import java.awt.*; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Rectangle; import java.awt.event.ContainerEvent; import java.awt.event.MouseEvent; import java.util.HashMap; @@ -434,7 +438,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { } - private void fixTitleLayout(XLayoutContainer parent){ + private void fixTitleLayout(XLayoutContainer parent) { FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent); if (layoutAdapter != null) { @@ -443,4 +447,33 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { } } + /** + *

对于tab组件,WCardMainBorderLayout里面有两个子容器: + *

  • WCardTitleLayout,里面包含两个部分,一个是CardAddButton,另一个是WCardTagLayout - tabpane0
  • + *
  • WCardLayout,里面放的是WTabFitLayout - tab00、tab10
  • + *

    在右侧组件树选择删除WCardTagLayout时(tabpane0),按照现在的产品逻辑,应该删除整个tab组件 + * + * @param creator 组件 + * @param designer 表单设计器 + */ + @Override + public void deleteRelatedComponent(XCreator creator, FormDesigner designer) { + XWCardTagLayout tagLayout = (XWCardTagLayout) creator; + // 先删除所有tab按钮 + for (int i = 0; i < tagLayout.getComponentCount(); i++) { + tagLayout.remove(i); + } + //逐层回溯找出最外层的XWCardMainBorderLayout + XWCardTitleLayout cardTitleLayout = (XWCardTitleLayout) tagLayout.getBackupParent(); + XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) cardTitleLayout.getBackupParent(); + // 删除tab布局 + SelectionModel selectionModel = designer.getSelectionModel(); + if (mainLayout != null) { + selectionModel.setSelectedCreator(mainLayout); + selectionModel.deleteSelection(); + } + LayoutUtils.layoutRootContainer(designer.getRootComponent()); + FormHierarchyTreePane.getInstance().refreshRoot(); + selectionModel.setSelectedCreator(designer.getRootComponent()); + } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java index 2278b7b0f8..6276c3c2df 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java @@ -7,16 +7,13 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.xpane.CardTagLayoutStylePane; -import com.fr.design.gui.xpane.LayoutStylePane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.mainframe.widget.accessibles.AccessibleCardTagWLayoutBorderStyleEditor; import com.fr.design.widget.ui.designer.AbstractDataModify; import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; - import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -72,6 +69,9 @@ public class WCardMainLayoutDefinePane extends AbstractDataModify public void populateBean(WCardTagLayout ob) { //标题背景和字体属性设置在WCardLayout上做兼容 XLayoutContainer topLayout = creator.getTopLayout(); + if (topLayout.getComponentCount() == 0) { + // 没有子组件,不用做处理 + return; + } LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle(); - displayPositionGroup.setSelectedIndex(ob.getDisplayPosition().getType()); textDirectionGroup.setSelectedIndex(ob.getTextDirection().getType()); backgroundEditor.setValue(layoutBorderStyle.getTitle().getBackground()); From 9bb43f2d94527c60833a9edf7c598f337dc390df Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Fri, 12 May 2023 18:18:25 +0800 Subject: [PATCH 32/61] =?UTF-8?q?REPORT-94629=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creator/cardlayout/XCardSwitchButton.java | 65 ++++++++++--------- .../creator/cardlayout/XWCardTagLayout.java | 4 +- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 1c70ef870d..4f7e0a1366 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -273,7 +273,38 @@ public class XCardSwitchButton extends XButton { // 这里是鼠标的绝对位置 int ex = e.getX() + diff; int ey = e.getY(); + // 获取tab布局的位置,鼠标相对于tab按钮的位置 + double[] tabPositionInBody = getTabAbsolutePositionInBody(); + // 参数界面对坐标的影响 + JForm jform = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + if (jform.getFormDesign().getParaComponent() != null) { + ey -= jform.getFormDesign().getParaHeight(); + } + //减掉tab布局的相对位置 + ex -= tabPositionInBody[0]; + ey -= tabPositionInBody[1]; + + XLayoutContainer titleLayout = tagLayout.getBackupParent(); + Point titlePoint = titleLayout.getLocation(); + // button position + XCardSwitchButton button = this; + Point position = button.getLocation(); + int width = button.getWidth(); + // 鼠标进入按钮右侧删除图标区域 + double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET); + double recY = position.getY() + titlePoint.getY() + CLOSE_ICON_TOP_OFFSET; + // 比较的是相对位置的偏移量是否在一定距离内 + // 所以要得到鼠标相对于当前tab块的坐标 + return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY()); + } + + /** + * 获取tab布局在body内的绝对位置 + * + * @return + */ + private double[] getTabAbsolutePositionInBody() { // 获取tab布局的位置,鼠标相对于tab按钮的位置 Container mainLayout = cardLayout.getBackupParent(); // 这个point是当前tab布局的相对坐标,是相对于父容器的坐标 @@ -290,42 +321,14 @@ public class XCardSwitchButton extends XButton { mainLayout = mainLayout.getParent(); - if (mainLayout instanceof XWCardMainBorderLayout) { - x += mainLayout.getX(); - y += mainLayout.getY(); - } - - if (mainLayout instanceof XWAbsoluteLayout) { + if ((mainLayout instanceof XWCardMainBorderLayout) || (mainLayout instanceof XWAbsoluteLayout)) { x += mainLayout.getX(); y += mainLayout.getY(); } } double mainX = point.getX() + x; double mainY = point.getY() + y; - - // 参数界面对坐标的影响 - JForm jform = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if(jform.getFormDesign().getParaComponent() != null){ - ey -= jform.getFormDesign().getParaHeight(); - } - - //减掉tab布局的相对位置 - ex -= mainX; - ey -= mainY; - - XLayoutContainer titleLayout = tagLayout.getBackupParent(); - Point titlePoint = titleLayout.getLocation(); - // button position - XCardSwitchButton button = this; - Point position = button.getLocation(); - int width = button.getWidth(); - - // 鼠标进入按钮右侧删除图标区域 - double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET); - double recY = position.getY() + titlePoint.getY() + CLOSE_ICON_TOP_OFFSET; - // 比较的是相对位置的偏移量是否在一定距离内 - // 所以要得到鼠标相对于当前tab块的坐标 - return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY()); + return new double[]{mainX, mainY}; } //将当前switchButton改为选中状态 @@ -337,7 +340,7 @@ public class XCardSwitchButton extends XButton { } } - @Override + @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index a88b6847e4..7ded6ee77e 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -460,9 +460,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { public void deleteRelatedComponent(XCreator creator, FormDesigner designer) { XWCardTagLayout tagLayout = (XWCardTagLayout) creator; // 先删除所有tab按钮 - for (int i = 0; i < tagLayout.getComponentCount(); i++) { - tagLayout.remove(i); - } + tagLayout.removeAll(); //逐层回溯找出最外层的XWCardMainBorderLayout XWCardTitleLayout cardTitleLayout = (XWCardTitleLayout) tagLayout.getBackupParent(); XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) cardTitleLayout.getBackupParent(); From b390deeec22dd3524e077c63fd1cd419af4a6d30 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Mon, 15 May 2023 10:39:34 +0800 Subject: [PATCH 33/61] =?UTF-8?q?REPORT-94629=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/designer/creator/cardlayout/XCardSwitchButton.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 4f7e0a1366..1f139bbabf 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -259,7 +259,9 @@ public class XCardSwitchButton extends XButton { *

    是否进入点击关闭按钮区域 *

    计算逻辑: *

    先得到鼠标的绝对坐标 -> tab布局的绝对坐标 -> 得到鼠标相对tab的坐标(有参数面板时要减去参数面板的高度) - *

    再计算删除区域位置的相对坐标,通过对比判定鼠标是否在点击关闭按钮区域内 + *

    再计算删除区域位置的相对坐标,通过对比判定鼠标是否在点击关闭按钮区域内,即,鼠标的位置(ex,ey): + *

  • 当前点击tag删除区域的x坐标 < ex < 当前点击tag删除区域的x坐标 + 偏移量
  • + *
  • 当前点击tag删除区域的y坐标 < ey < 当前点击tag删除区域的y坐标 + 偏移量
  • * * @param e 鼠标事件 * @param designer 表单编辑对象 From 7dc49e1e0715b60ef67bdae6d5bab060a09a55b3 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Mon, 22 May 2023 09:57:23 +0800 Subject: [PATCH 34/61] =?UTF-8?q?REPORT-89967=20=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=80=BC=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mobile/component/MobilePasswordEditSettingPane.java | 5 ----- .../designer/mobile/component/MobileTextAreaSettingPane.java | 5 +++++ .../designer/mobile/component/MobileTextEditSettingPane.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java index 3cf5adccb1..e90bf577e0 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java @@ -23,11 +23,6 @@ public class MobilePasswordEditSettingPane extends MobileTextEditSettingPane { this.add(showPassword, BorderLayout.NORTH); } - @Override - protected boolean getClearDefaultState() { - return true; - } - @Override public void populateBean(MobileTextEditAttr ob) { super.populateBean(ob); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java index d660508e6e..bfcb185b70 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java @@ -23,6 +23,11 @@ public class MobileTextAreaSettingPane extends MobileTextEditSettingPane { this.add(showWordCount, BorderLayout.NORTH); } + @Override + protected boolean getClearDefaultState() { + return false; + } + @Override public void populateBean(MobileTextEditAttr ob) { super.populateBean(ob); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java index 56d340e4d0..9b2758a2d2 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java @@ -27,7 +27,7 @@ public class MobileTextEditSettingPane extends BasicBeanPane } protected boolean getClearDefaultState() { - return false; + return true; } protected void initLayout() { @@ -38,7 +38,7 @@ public class MobileTextEditSettingPane extends BasicBeanPane @Override public void populateBean(MobileTextEditAttr ob) { - allowOneClickClear.setSelected(ob.isAllowOneClickClear() != null && ob.isAllowOneClickClear()); + allowOneClickClear.setSelected(ob.isAllowOneClickClear() == null || ob.isAllowOneClickClear()); } @Override From 654b9a1b1798896f9ac1bfc99da6223249ffe294 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Mon, 22 May 2023 14:55:01 +0800 Subject: [PATCH 35/61] =?UTF-8?q?REPORT-93554=20=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E6=94=AF=E6=8C=81=E2=80=94=E2=80=94=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E6=94=AF=E6=92=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...bstractMobileStyleDefinePaneProcessor.java | 23 +++++++ .../MobileStyleDefinePaneProcessor.java | 40 +++++++++++ .../mobile/ui/MobileStyleDefinePane.java | 11 ++- .../mainframe/mobile/ui/MobileStylePane.java | 69 +++++++++++++++++-- 4 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneProcessor.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneProcessor.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneProcessor.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneProcessor.java new file mode 100644 index 0000000000..5beb748e45 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneProcessor.java @@ -0,0 +1,23 @@ +package com.fr.design.mainframe.mobile.processor; + +import com.fr.stable.fun.mark.API; + +/** + * 移动端Form控件,样式模板,通用属性替换接口 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/11 + */ +@API(level = MobileStyleDefinePaneProcessor.CURRENT_LEVEL) +public abstract class AbstractMobileStyleDefinePaneProcessor implements MobileStyleDefinePaneProcessor { + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public int layerIndex() { + return DEFAULT_LAYER_INDEX; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneProcessor.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneProcessor.java new file mode 100644 index 0000000000..2d2d0a252a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneProcessor.java @@ -0,0 +1,40 @@ +package com.fr.design.mainframe.mobile.processor; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileCommonExtraStyle; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.stable.fun.mark.Immutable; +import org.jetbrains.annotations.Nullable; + +/** + * 移动端Form控件,样式模板,通用属性替换接口 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/11 + */ +public interface MobileStyleDefinePaneProcessor extends Immutable { + String XML_TAG = "MobileStyleDefinePaneProcessor"; + + int CURRENT_LEVEL = 1; + + /** + *

    创建通用属性样式界面,可替换{@link com.fr.design.mainframe.mobile.ui.MobileStyleDefinePane} + *

    每种样式的通用属性面板是一样的 + * + * @param widget 控件 + * @param customDefinePane 自定义面板 + * @param mobileStyle 移动端样式 + * @return + */ + @Nullable BasicBeanPane createBaseBeanPane(Widget widget, Class customDefinePane, Class mobileStyle); + + /** + * 替换通用属性面板,注册额外属性 + * + * @return 属性类 + */ + @Nullable Class classForCommonExtraStyle(Widget widget); +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java index 6c03df00d5..268672fb30 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -53,22 +53,28 @@ public class MobileStyleDefinePane extends BasicBeanPane { private UISpinner borderRadius; private NewColorSelectBox iconColor; private MobileStyleFontConfigPane fontConfigPane; + private MobileStyle mobileStyle; MobileStyleDefinePane(Widget widget, Class customBeanPaneClass, Class mobileStyleClazz) { this.widget = widget; this.customBeanPane = Reflect.on(customBeanPaneClass).create(widget).get(); this.mobileStyleClazz = mobileStyleClazz; + initMobileStyle(widget); init(); } + private void initMobileStyle(Widget widget) { + mobileStyle = widget.getMobileStyle() != null ? widget.getMobileStyle() : Reflect.on(mobileStyleClazz).create().get(); + } + @Override public void populateBean(MobileStyle ob) { this.customBeanPane.populateBean(ob); customCombo.setSelectedIndex(ob.isCommonCustom() ? 1 : 0); - if(ob.getCommonBackground() != null) { - colorSelectBox.setSelectObject(((ColorBackground)ob.getCommonBackground()).getColor()); + if (ob.getCommonBackground() != null) { + colorSelectBox.setSelectObject(((ColorBackground) ob.getCommonBackground()).getColor()); } borderType.setSelectedLineStyle(ob.getCommonBorderType()); if (ob.getCommonBorderColor() != null) { @@ -85,7 +91,6 @@ public class MobileStyleDefinePane extends BasicBeanPane { @Override public MobileStyle updateBean() { - MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get(); this.widget.setMobileStyle(mobileStyle); this.customBeanPane.updateBean(); mobileStyle.setCommonCustom(customCombo.getSelectedIndex() == 1); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java index 3573427ca9..6fefd7b7e3 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -5,17 +5,32 @@ import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.mobile.processor.MobileStyleDefinePaneProcessor; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WScaleLayout; +import com.fr.form.ui.mobile.MobileCommonExtraStyle; import com.fr.form.ui.mobile.MobileStyle; +import com.fr.form.ui.mobile.StyleClassMap; import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.observer.PluginEventType; import com.fr.stable.ArrayUtils; -import javax.swing.*; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; import java.util.HashMap; import java.util.Map; @@ -28,9 +43,11 @@ public class MobileStylePane extends BasicPane { private JList styleList; private Map> map = new HashMap<>(); + private boolean checkFlag = true; + public MobileStylePane(Widget widget) { - if(widget instanceof WScaleLayout) { - this.widget = ((CRBoundsWidget)((WScaleLayout) widget).getBoundsWidget()).getWidget(); + if (widget instanceof WScaleLayout) { + this.widget = ((CRBoundsWidget) ((WScaleLayout) widget).getBoundsWidget()).getWidget(); } else { this.widget = widget; } @@ -63,13 +80,18 @@ public class MobileStylePane extends BasicPane { } private void init() { + initComponent(); + initPluginListener(); + } + + private void initComponent() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); listModel = new DefaultListModel<>(); card = new CardLayout(); right = FRGUIPaneFactory.createCardLayout_S_Pane(); right.setLayout(card); MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders(); - for(MobileWidgetStyleProvider styleProvider: styleProviders) { + for (MobileWidgetStyleProvider styleProvider : styleProviders) { this.addProvider2View(styleProvider); } this.addWestList(); @@ -107,7 +129,15 @@ public class MobileStylePane extends BasicPane { listModel.addElement(displayName); try { + MobileStyleDefinePaneProcessor processor = ExtraDesignClassManager.getInstance().getSingle(MobileStyleDefinePaneProcessor.XML_TAG); BasicBeanPane mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz); + if (checkFlag && processor != null && processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz) != null) { + mobileStyleBasicBeanPane = processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz); + Class extraStyle = processor.classForCommonExtraStyle(widget); + if (extraStyle != null) { + StyleClassMap.getCommonStyleMap().put(extraStyle.getName(), extraStyle.getName()); + } + } right.add(displayName, mobileStyleBasicBeanPane); map.put(displayName, mobileStyleBasicBeanPane); } catch (Exception e) { @@ -133,4 +163,33 @@ public class MobileStylePane extends BasicPane { styleProviders = ArrayUtils.insert(0, styleProviders, defaultMobileWidgetStyleProvider); return styleProviders; } + + private void initPluginListener() { + EventDispatcher.listen(PluginEventType.AfterRun, new Listener() { + @Override + public void on(Event event, PluginContext pluginContext) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + checkFlag = true; + refreshDockingView(); + } + } + }); + EventDispatcher.listen(PluginEventType.BeforeStop, new Listener() { + @Override + public void on(Event event, PluginContext pluginContext) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + checkFlag = false; + refreshDockingView(); + } + } + }); + } + + private void refreshDockingView() { + removeAll(); + initComponent(); + populate(widget.getMobileStyle()); + this.updateUI(); + this.repaint(); + } } \ No newline at end of file From 16dda148f1253314a65998b777661b55317fae8e Mon Sep 17 00:00:00 2001 From: Carlson Date: Mon, 22 May 2023 15:30:59 +0800 Subject: [PATCH 36/61] =?UTF-8?q?fix:=20=E5=BC=80=E6=94=BEfvs=E7=9A=84?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=8E=A7=E5=88=B6=E5=85=A5=E5=8F=A3=20#REPOR?= =?UTF-8?q?T-95402?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/DesignerFrameFileDealerPane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 8cfd263421..fc2f9c658c 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 @@ -54,6 +54,7 @@ import com.fr.plugin.injectable.PluginModule; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; +import com.fr.report.lock.LockInfoOperator; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -61,7 +62,6 @@ import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; -import com.fr.report.lock.LockInfoOperator; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JOptionPane; @@ -537,7 +537,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } private boolean pathSupportVcsAction(String path) { - if (FileExtension.CPT.matchExtension(path) || FileExtension.FRM.matchExtension(path)) { + if (FileExtension.CPT.matchExtension(path) || FileExtension.FRM.matchExtension(path) || FileExtension.VIS.matchExtension(path)) { return true; } return false; From 930e1df661143636c2bf9dda821b771422c47ba2 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Mon, 22 May 2023 22:54:30 +0800 Subject: [PATCH 37/61] =?UTF-8?q?REPORT-93554=20=E6=9B=B4=E6=96=B0Immutabl?= =?UTF-8?q?e=E7=B1=BB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ocessor.java => AbstractMobileStyleDefinePaneCreator.java} | 4 ++-- ...nePaneProcessor.java => MobileStyleDefinePaneCreator.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/{AbstractMobileStyleDefinePaneProcessor.java => AbstractMobileStyleDefinePaneCreator.java} (70%) rename designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/{MobileStyleDefinePaneProcessor.java => MobileStyleDefinePaneCreator.java} (91%) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneProcessor.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java similarity index 70% rename from designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneProcessor.java rename to designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java index 5beb748e45..203a83f13c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneProcessor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java @@ -9,8 +9,8 @@ import com.fr.stable.fun.mark.API; * @since 11.0 * Created on 2023/4/11 */ -@API(level = MobileStyleDefinePaneProcessor.CURRENT_LEVEL) -public abstract class AbstractMobileStyleDefinePaneProcessor implements MobileStyleDefinePaneProcessor { +@API(level = MobileStyleDefinePaneCreator.CURRENT_LEVEL) +public abstract class AbstractMobileStyleDefinePaneCreator implements MobileStyleDefinePaneCreator { @Override public int currentAPILevel() { return CURRENT_LEVEL; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneProcessor.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java similarity index 91% rename from designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneProcessor.java rename to designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java index 2d2d0a252a..3b5e2cb861 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneProcessor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java @@ -15,8 +15,8 @@ import org.jetbrains.annotations.Nullable; * @since 11.0 * Created on 2023/4/11 */ -public interface MobileStyleDefinePaneProcessor extends Immutable { - String XML_TAG = "MobileStyleDefinePaneProcessor"; +public interface MobileStyleDefinePaneCreator extends Immutable { + String XML_TAG = "MobileStyleDefinePaneCreator"; int CURRENT_LEVEL = 1; From 2ec1a867f53c16f37d1e47ca8d7df2f12e6cd6da Mon Sep 17 00:00:00 2001 From: "Levy.Xie" Date: Tue, 23 May 2023 20:37:59 +0800 Subject: [PATCH 38/61] =?UTF-8?q?REPORT-96012=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E5=88=B0=E8=87=AA=E5=B7=B1=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E4=B8=8B=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultTemplateTreeDefineProcessor.java | 24 +++++++--- .../fr/design/file/FileOperationHelper.java | 47 +++++++++++++++++-- .../design/file/FileOperationHelperTest.java | 44 +++++++++++++++++ 3 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java diff --git a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java index 1bcfe3c622..e010986ac0 100644 --- a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java +++ b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java @@ -28,7 +28,6 @@ import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.collections.CollectionUtils; import com.fr.stable.project.ProjectConstants; -import com.fr.workspace.WorkContext; import javax.swing.BorderFactory; import javax.swing.JDialog; @@ -221,6 +220,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi /** * 检测是否能够黏贴 + * * @param treeNodeList * @return */ @@ -271,7 +271,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi } } } catch (Exception e) { - FineLoggerFactory.getLogger().error(e,"Template paste failed.", e.getMessage()); + FineLoggerFactory.getLogger().error(e, "Template paste failed.", e.getMessage()); FineJOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Basic_Paste_Failure"), Toolkit.i18nText("Fine-Design_Basic_Error"), @@ -286,7 +286,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi /** * 确认粘贴的目标目录是否是复制文件的子目录,并确认是否继续执行粘贴任务 * - * @param targetDir 目标文件夹 + * @param targetDir 目标文件夹 * @param pasteNodes 待粘贴的文件 * @return 是否继续 */ @@ -433,6 +433,14 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi WARNING_MESSAGE); return false; } + // 检查移动源文件夹是否为目标文件夹的子文件夹 + if (FileOperationHelper.getInstance().isSubDirectory(getFileTree().getSelectedTreeNodes(), getTargetFileNode())) { + FineJOptionPane.showMessageDialog(this, + Toolkit.i18nText("Fine-Design_Basic_Move_To_SubDirectory"), + Toolkit.i18nText("Fine-Design_Basic_Alert"), + WARNING_MESSAGE); + return false; + } if (TemplateUtils.checkSelectedTemplateIsEditing()) { return FineJOptionPane.showConfirmDialog(this, Toolkit.i18nText("Fine-Design_Basic_Template_Is_Editing"), @@ -443,9 +451,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi } private boolean doMove() { - FileNode fileNode = getDirTree().getSelectedFileNode(); - ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) getDirTree().getModel().getRoot(); - fileNode = fileNode == null ? (FileNode) rootTreeNode.getUserObject() : fileNode; + FileNode fileNode = getTargetFileNode(); boolean moveSuccess = true; try { //待移动的文件可以有多个 @@ -465,6 +471,12 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi return moveSuccess; } + private FileNode getTargetFileNode() { + FileNode fileNode = getDirTree().getSelectedFileNode(); + ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) getDirTree().getModel().getRoot(); + return fileNode == null ? (FileNode) rootTreeNode.getUserObject() : fileNode; + } + @Override public void dispose() { TemplateDirTreeSearchManager.getInstance().outOfSearchMode(); diff --git a/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java b/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java index a3abaf4606..bdbab64136 100644 --- a/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java +++ b/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java @@ -16,6 +16,7 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.resource.ResourceIOException; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -26,12 +27,47 @@ import static javax.swing.JOptionPane.WARNING_MESSAGE; */ public class FileOperationHelper { + private static final char DIR_SEPARATOR = '/'; + private static final FileOperationHelper INSTANCE = new FileOperationHelper(); public static FileOperationHelper getInstance() { return INSTANCE; } + /** + * 检查多个目标文件夹是否含有源文件夹的子文件夹 + * + * @param fileNodes + * @param targetNode + * @return + */ + public boolean isSubDirectory(@NotNull ExpandMutableTreeNode[] fileNodes, @NotNull FileNode targetNode) { + for (ExpandMutableTreeNode treeNode : fileNodes) { + FileNode sourceFileNode = (FileNode) treeNode.getUserObject(); + if (isSubDirectory(sourceFileNode, targetNode)) { + return true; + } + } + return false; + } + + /** + * 检查目标文件夹是否为源文件夹的子文件夹 + * + * @param sourceFileNode + * @param targetNode + */ + public boolean isSubDirectory(@NotNull FileNode sourceFileNode, @NotNull FileNode targetNode) { + if (!sourceFileNode.isDirectory() || !targetNode.isDirectory()) { + return false; + } + String sourceDir = sourceFileNode.getEnvPath(); + String targetDir = targetNode.getEnvPath(); + return StringUtils.equals(targetDir, sourceDir) || + (targetDir.startsWith(sourceDir) && targetDir.charAt(sourceDir.length()) == DIR_SEPARATOR); + } + public String moveFile(FileNode sourceFileNode, String targetDir) { String targetPath = copyFileAndVcs(sourceFileNode, targetDir); FileNodeFILE nodeFILE = new FileNodeFILE(sourceFileNode); @@ -51,8 +87,9 @@ public class FileOperationHelper { /** * 拷贝文件的同时拷贝对应的版本控制文件 + * * @param sourceFile 源文件或目录 - * @param targetDir 目标目录 + * @param targetDir 目标目录 * @return 复制后的目标文件的路径 */ public String copyFileAndVcs(FileNode sourceFile, String targetDir) { @@ -61,8 +98,9 @@ public class FileOperationHelper { /** * 只拷贝文件, 不拷贝对应的版本控制文件 + * * @param sourceFile 源文件或目录 - * @param targetDir 目标目录 + * @param targetDir 目标目录 * @return 复制后的目标文件的路径 */ public String copyFile(FileNode sourceFile, String targetDir) { @@ -71,7 +109,8 @@ public class FileOperationHelper { /** * 检测节点是否被锁住了 - * @param node 待检测节点 + * + * @param node 待检测节点 * @param dNodes 没有锁住的节点集合 * @param lNodes 锁住的节点集合 * @return 是否存在被锁住的文件 @@ -165,7 +204,7 @@ public class FileOperationHelper { } else { if (!TemplateResourceManager.getResource().copy(sourcePath, targetPath)) { throw new ResourceIOException(String.format("copy file failed, from %s to %s", sourcePath, targetPath)); - } else if (withCopyVcs){ + } else if (withCopyVcs) { sourcePath = sourcePath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY); targetPath = targetPath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY); VcsHelper.getInstance().moveVcs(sourcePath, targetPath); diff --git a/designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java b/designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java new file mode 100644 index 0000000000..612a65d70d --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java @@ -0,0 +1,44 @@ +package com.fr.design.file; + +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.file.filetree.FileNode; +import org.junit.Assert; +import org.junit.Test; + + +/** + * + * @author Levy.Xie + * @version 11.0 + * Created by Levy.Xie on 2023/05/23 + */ +public class FileOperationHelperTest { + + @Test + public void testIsSubDirectory() { + FileNode sourceNode1 = new FileNode("/usr/local/webroot/reportlets", true); + FileNode sourceNode2 = new FileNode("/usr/local/webroot/reportlets/demo", true); + FileNode sourceNode3 = new FileNode("/usr/local/webroot/reportlets/doc", true); + FileNode sourceNode4 = new FileNode("/usr/local/webroot/reportlets/doc/1.cpt", false); + FileNode sourceNode5 = new FileNode("/usr/local/webroot/reportlets/demo/test", true); + FileNode sourceNode6 = new FileNode("/usr/local/webroot/reportlets/demo/test", false); + FileNode sourceNode7 = new FileNode("/usr/local/webroot/reportlets/demo/test123", true); + + FileNode targetNode = new FileNode("/usr/local/webroot/reportlets/demo/test", true); + + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(sourceNode1, targetNode)); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(sourceNode2, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode3, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode4, targetNode)); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(sourceNode5, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode6, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode7, targetNode)); + + ExpandMutableTreeNode treeNode1 = new ExpandMutableTreeNode(sourceNode1); + ExpandMutableTreeNode treeNode2 = new ExpandMutableTreeNode(sourceNode2); + ExpandMutableTreeNode treeNode3 = new ExpandMutableTreeNode(sourceNode3); + ExpandMutableTreeNode treeNode4 = new ExpandMutableTreeNode(sourceNode4); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(new ExpandMutableTreeNode[]{treeNode1, treeNode2, treeNode3}, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(new ExpandMutableTreeNode[]{treeNode3, treeNode4}, targetNode)); + } +} \ No newline at end of file From bb5781511f606e72c6fc07513ec848692b1c756f Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Tue, 23 May 2023 22:06:08 +0800 Subject: [PATCH 39/61] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E4=BA=A4=E9=81=97=E6=BC=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/mobile/ui/MobileStylePane.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java index 6fefd7b7e3..aafc5d4e2b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -5,7 +5,7 @@ import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.mobile.processor.MobileStyleDefinePaneProcessor; +import com.fr.design.mainframe.mobile.processor.MobileStyleDefinePaneCreator; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; @@ -129,13 +129,13 @@ public class MobileStylePane extends BasicPane { listModel.addElement(displayName); try { - MobileStyleDefinePaneProcessor processor = ExtraDesignClassManager.getInstance().getSingle(MobileStyleDefinePaneProcessor.XML_TAG); + MobileStyleDefinePaneCreator processor = ExtraDesignClassManager.getInstance().getSingle(MobileStyleDefinePaneCreator.XML_TAG); BasicBeanPane mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz); if (checkFlag && processor != null && processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz) != null) { mobileStyleBasicBeanPane = processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz); Class extraStyle = processor.classForCommonExtraStyle(widget); if (extraStyle != null) { - StyleClassMap.getCommonStyleMap().put(extraStyle.getName(), extraStyle.getName()); + StyleClassMap.putCommonStyle(extraStyle.getName(), extraStyle.getName()); } } right.add(displayName, mobileStyleBasicBeanPane); @@ -168,7 +168,7 @@ public class MobileStylePane extends BasicPane { EventDispatcher.listen(PluginEventType.AfterRun, new Listener() { @Override public void on(Event event, PluginContext pluginContext) { - if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneCreator.XML_TAG)) { checkFlag = true; refreshDockingView(); } @@ -177,7 +177,7 @@ public class MobileStylePane extends BasicPane { EventDispatcher.listen(PluginEventType.BeforeStop, new Listener() { @Override public void on(Event event, PluginContext pluginContext) { - if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneCreator.XML_TAG)) { checkFlag = false; refreshDockingView(); } From 2a106e06538742c4531e06a39f63481f006a6feb Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Wed, 24 May 2023 09:48:00 +0800 Subject: [PATCH 40/61] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=81=97=E6=BC=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/mobile/ui/MobileStylePane.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java index 6fefd7b7e3..aafc5d4e2b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -5,7 +5,7 @@ import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.mobile.processor.MobileStyleDefinePaneProcessor; +import com.fr.design.mainframe.mobile.processor.MobileStyleDefinePaneCreator; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; @@ -129,13 +129,13 @@ public class MobileStylePane extends BasicPane { listModel.addElement(displayName); try { - MobileStyleDefinePaneProcessor processor = ExtraDesignClassManager.getInstance().getSingle(MobileStyleDefinePaneProcessor.XML_TAG); + MobileStyleDefinePaneCreator processor = ExtraDesignClassManager.getInstance().getSingle(MobileStyleDefinePaneCreator.XML_TAG); BasicBeanPane mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz); if (checkFlag && processor != null && processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz) != null) { mobileStyleBasicBeanPane = processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz); Class extraStyle = processor.classForCommonExtraStyle(widget); if (extraStyle != null) { - StyleClassMap.getCommonStyleMap().put(extraStyle.getName(), extraStyle.getName()); + StyleClassMap.putCommonStyle(extraStyle.getName(), extraStyle.getName()); } } right.add(displayName, mobileStyleBasicBeanPane); @@ -168,7 +168,7 @@ public class MobileStylePane extends BasicPane { EventDispatcher.listen(PluginEventType.AfterRun, new Listener() { @Override public void on(Event event, PluginContext pluginContext) { - if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneCreator.XML_TAG)) { checkFlag = true; refreshDockingView(); } @@ -177,7 +177,7 @@ public class MobileStylePane extends BasicPane { EventDispatcher.listen(PluginEventType.BeforeStop, new Listener() { @Override public void on(Event event, PluginContext pluginContext) { - if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneCreator.XML_TAG)) { checkFlag = false; refreshDockingView(); } From 3e2dfd6f53ac8f26ac1fce8b74bb948f080968ed Mon Sep 17 00:00:00 2001 From: "Levy.Xie" Date: Wed, 24 May 2023 10:03:46 +0800 Subject: [PATCH 41/61] =?UTF-8?q?REPORT-96012=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E5=88=B0=E8=87=AA=E5=B7=B1=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E4=B8=8B=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/FileOperationHelper.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java b/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java index bdbab64136..bc947df414 100644 --- a/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java +++ b/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java @@ -18,6 +18,8 @@ import com.fr.workspace.WorkContext; import com.fr.workspace.resource.ResourceIOException; import org.jetbrains.annotations.NotNull; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import static javax.swing.JOptionPane.WARNING_MESSAGE; @@ -27,8 +29,6 @@ import static javax.swing.JOptionPane.WARNING_MESSAGE; */ public class FileOperationHelper { - private static final char DIR_SEPARATOR = '/'; - private static final FileOperationHelper INSTANCE = new FileOperationHelper(); public static FileOperationHelper getInstance() { @@ -36,10 +36,10 @@ public class FileOperationHelper { } /** - * 检查多个目标文件夹是否含有源文件夹的子文件夹 + * 检查目标文件夹是否为多个源文件夹中,任一文件夹的子文件夹 * - * @param fileNodes - * @param targetNode + * @param fileNodes 需移动的源文件 + * @param targetNode 移动后的目标文件夹 * @return */ public boolean isSubDirectory(@NotNull ExpandMutableTreeNode[] fileNodes, @NotNull FileNode targetNode) { @@ -55,17 +55,16 @@ public class FileOperationHelper { /** * 检查目标文件夹是否为源文件夹的子文件夹 * - * @param sourceFileNode - * @param targetNode + * @param sourceFileNode 需移动的源文件 + * @param targetNode 移动后的目标文件夹 */ public boolean isSubDirectory(@NotNull FileNode sourceFileNode, @NotNull FileNode targetNode) { if (!sourceFileNode.isDirectory() || !targetNode.isDirectory()) { return false; } - String sourceDir = sourceFileNode.getEnvPath(); - String targetDir = targetNode.getEnvPath(); - return StringUtils.equals(targetDir, sourceDir) || - (targetDir.startsWith(sourceDir) && targetDir.charAt(sourceDir.length()) == DIR_SEPARATOR); + Path sourceDir = Paths.get(sourceFileNode.getEnvPath()); + Path targetDir = Paths.get(targetNode.getEnvPath()); + return targetDir.startsWith(sourceDir); } public String moveFile(FileNode sourceFileNode, String targetDir) { From 9c8cd304339ae3aedf9f97399c0df47c31bada1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Wed, 24 May 2023 14:30:27 +0800 Subject: [PATCH 42/61] =?UTF-8?q?REPORT-96107=208.0=E5=92=8C11.0.2?= =?UTF-8?q?=E8=83=BD=E5=8F=8C=E5=BC=80=EF=BC=8C8.0=E5=92=8C11.0.14?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E5=8F=8C=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/DesignerEnvManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 199834fb77..73db5f13d4 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -2309,6 +2309,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter, AsyncXmlReada writeUUID(writer); writeActiveStatus(writer); writeHttpsParas(writer); + writeDesignerPort(writer); writeAlphaFineAttr(writer); writeEnvDetectorConfig(writer); writeStartupConfig(writer); @@ -2316,7 +2317,6 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter, AsyncXmlReada writeOpenDebug(writer); writeDesignerPushUpdateAttr(writer); writeVcsAttr(writer); - writeDesignerPort(writer); writeSnapChatConfig(writer); writeComponentReuseNotificationInfo(writer); writeDesignerLoginAttr(writer); From e073d7692df7bb04863cbea886a55497ea112b4a Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Wed, 24 May 2023 15:09:00 +0800 Subject: [PATCH 43/61] =?UTF-8?q?REPORT-96567=20=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=BE=93=E5=85=A5=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget/ui/designer/mobile/TextEditorMobileDefinePane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java index de006160dc..3e3010aa4d 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java @@ -39,17 +39,17 @@ public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { @Override public void populate(FormDesigner designer) { - super.populate(designer); TextEditor textEditor = (TextEditor) getxCreator().toData(); inputSettingPane.populateBean(textEditor.getMobileScanCodeAttr()); + textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); this.bindListeners2Widgets(); } @Override public void update() { - super.update(); TextEditor textEditor = (TextEditor) getxCreator().toData(); inputSettingPane.updateBean(textEditor.getMobileScanCodeAttr()); + textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); } From 69dbfa1da6ef97a6a7547030178bff463904450f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Wed, 24 May 2023 18:16:01 +0800 Subject: [PATCH 44/61] =?UTF-8?q?REPORT-96107=208.0=E5=92=8C11.0.2?= =?UTF-8?q?=E8=83=BD=E5=8F=8C=E5=BC=80=EF=BC=8C8.0=E5=92=8C11.0.14?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E5=8F=8C=E5=BC=80--=E6=96=B9=E6=A1=88?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 2 +- .../java/com/fr/design/utils/DesignUtils.java | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 73db5f13d4..199834fb77 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -2309,7 +2309,6 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter, AsyncXmlReada writeUUID(writer); writeActiveStatus(writer); writeHttpsParas(writer); - writeDesignerPort(writer); writeAlphaFineAttr(writer); writeEnvDetectorConfig(writer); writeStartupConfig(writer); @@ -2317,6 +2316,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter, AsyncXmlReada writeOpenDebug(writer); writeDesignerPushUpdateAttr(writer); writeVcsAttr(writer); + writeDesignerPort(writer); writeSnapChatConfig(writer); writeComponentReuseNotificationInfo(writer); writeDesignerLoginAttr(writer); diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index 4779f91916..752aa653f1 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -66,7 +66,8 @@ import java.util.concurrent.TimeoutException; * Some util method of Designer */ public class DesignUtils { - private static int port = DesignerPort.getInstance().getMessagePort(); + + private static Integer port; private static boolean started = false; @@ -80,6 +81,13 @@ public class DesignUtils { } public synchronized static int getPort() { + if (port == null) { + if (ComparatorUtils.equals("true", System.getProperty("debug"))) { + setPort(DesignerPort.getInstance().getDebugMessagePort()); + } else { + setPort(DesignerPort.getInstance().getMessagePort()); + } + } return port; } @@ -93,7 +101,6 @@ public class DesignUtils { return started; } - /** * 判断设计器端口是否被其他程序占用 * 尝试去通信,无回应就是其他程序占用端口,否则需要继续判断是否为设计器进程未关闭 @@ -103,7 +110,7 @@ public class DesignUtils { public static boolean isPortOccupied() { ExecutorService executor = null; Future future = null; - try (Socket socket = new Socket("localhost", port); + try (Socket socket = new Socket("localhost", getPort()); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)))) { writer.println("check"); @@ -167,7 +174,7 @@ public class DesignUtils { if (lines == null || lines.length == 0) { return; } - try (Socket socket = new Socket("localhost", port)) { + try (Socket socket = new Socket("localhost", getPort())) { clientSend(lines, socket); } catch (Exception ignore) { @@ -190,7 +197,7 @@ public class DesignUtils { try { serverSocket = new ServerSocket(startPort); } catch (IOException e1) { - FineLoggerFactory.getLogger().error("Cannot create server socket on " + port); + FineLoggerFactory.getLogger().error("Cannot create server socket on " + getPort()); } while (true) { try { @@ -250,7 +257,7 @@ public class DesignUtils { reader.close(); socket.close(); } else { - FineLoggerFactory.getLogger().error("Cannot create server socket on " + port); + FineLoggerFactory.getLogger().error("Cannot create server socket on " + getPort()); break; } } catch (IOException ignored) { From 2f557b6b024bc1fb957eb68e27d372b4338b9861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Wed, 24 May 2023 18:19:28 +0800 Subject: [PATCH 45/61] =?UTF-8?q?REPORT-96107=208.0=E5=92=8C11.0.2?= =?UTF-8?q?=E8=83=BD=E5=8F=8C=E5=BC=80=EF=BC=8C8.0=E5=92=8C11.0.14?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E5=8F=8C=E5=BC=80--=E9=AD=94=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/DesignUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index 752aa653f1..b91ca4d8e1 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -69,7 +69,9 @@ public class DesignUtils { private static Integer port; + private static final String TURE = "true"; + private static final String DEBUG = "debug"; private static boolean started = false; @@ -82,7 +84,7 @@ public class DesignUtils { public synchronized static int getPort() { if (port == null) { - if (ComparatorUtils.equals("true", System.getProperty("debug"))) { + if (ComparatorUtils.equals(TURE, System.getProperty(DEBUG))) { setPort(DesignerPort.getInstance().getDebugMessagePort()); } else { setPort(DesignerPort.getInstance().getMessagePort()); From b319184a10802da6ce6a66fb822e224ec6e82871 Mon Sep 17 00:00:00 2001 From: obo Date: Thu, 25 May 2023 10:20:12 +0800 Subject: [PATCH 46/61] =?UTF-8?q?REPORT-96424=20=E9=AB=98=E7=BA=A7js?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=99=A8=E8=B6=85=E9=93=BE=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/JSContentWithDescriptionPane.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java index 74b1596207..bebe106cdc 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java @@ -20,6 +20,7 @@ import com.fr.design.javascript.jsapi.JSAPITreeHelper; import com.fr.design.javascript.jsapi.JSAPIUserObject; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralContext; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; @@ -70,6 +71,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.concurrent.ExecutionException; public class JSContentWithDescriptionPane extends JSContentPane implements KeyListener { @@ -393,9 +395,13 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private void updateHelpDocuments(Object value, List helpDocuments) { String url = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT) + value.toString(); try { - String result = HttpToolbox.get(url); - JSONObject jsonObject = new JSONObject(result); - JSONArray jsonArray = jsonObject.optJSONArray("list"); + JSONArray jsonArray = null; + //目前简中繁中之外的语言高级编辑器功能及文档不完善,右侧展示的文档链接列表暂时为空白 + if(Locale.CHINA.getLanguage().equals(GeneralContext.getLocale().getLanguage())) { + String result = HttpToolbox.get(url); + JSONObject jsonObject = new JSONObject(result); + jsonArray = jsonObject.optJSONArray("list"); + } if (jsonArray != null) { for (int i = 0; i < jsonArray.length(); i++) { JSONObject resultJSONObject = jsonArray.optJSONObject(i); From 7a9d957377cc91ee1bddff058f8381f0d4e2aec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 25 May 2023 11:26:02 +0800 Subject: [PATCH 47/61] =?UTF-8?q?REPORT-96107=208.0=E5=92=8C11.0.2?= =?UTF-8?q?=E8=83=BD=E5=8F=8C=E5=BC=80=EF=BC=8C8.0=E5=92=8C11.0.14?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E5=8F=8C=E5=BC=80--=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/utils/DesignUtils.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index b91ca4d8e1..bfba512a20 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -69,9 +69,6 @@ public class DesignUtils { private static Integer port; - private static final String TURE = "true"; - - private static final String DEBUG = "debug"; private static boolean started = false; @@ -84,11 +81,7 @@ public class DesignUtils { public synchronized static int getPort() { if (port == null) { - if (ComparatorUtils.equals(TURE, System.getProperty(DEBUG))) { - setPort(DesignerPort.getInstance().getDebugMessagePort()); - } else { - setPort(DesignerPort.getInstance().getMessagePort()); - } + setPort(DesignerPort.getInstance().getMessagePort()); } return port; } @@ -230,7 +223,7 @@ public class DesignUtils { @Override public void run() { DesignerStartupContext context = DesignerStartupContext.getInstance(); - + // 如果在启动页展示中 if (DesignerStartupUtil.openTemplateIfOnWaiting(f)) { return; @@ -240,7 +233,7 @@ public class DesignUtils { // 之前就有这样的问题 return; } - + // 打开模板 DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f)); } @@ -493,6 +486,7 @@ public class DesignUtils { /** * 获取设计器可用字体 + * * @return */ public static String[] getAvailableFontFamilyNames4Report() { From f1f5b54b5a75f37036b7d192a1efda7f34cd30cf Mon Sep 17 00:00:00 2001 From: obo Date: Thu, 25 May 2023 16:34:04 +0800 Subject: [PATCH 48/61] =?UTF-8?q?REPORT-96424=20=E9=AB=98=E7=BA=A7js?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=99=A8=E8=B6=85=E9=93=BE=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/javascript/JSContentWithDescriptionPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java index bebe106cdc..4116f4f1d0 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java @@ -397,7 +397,7 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi try { JSONArray jsonArray = null; //目前简中繁中之外的语言高级编辑器功能及文档不完善,右侧展示的文档链接列表暂时为空白 - if(Locale.CHINA.getLanguage().equals(GeneralContext.getLocale().getLanguage())) { + if(GeneralContext.isChineseEnv()) { String result = HttpToolbox.get(url); JSONObject jsonObject = new JSONObject(result); jsonArray = jsonObject.optJSONArray("list"); From 795c0e5f6cdcd4b0b8e1ce394ea71a8a59a7ab6e Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 26 May 2023 11:14:54 +0800 Subject: [PATCH 49/61] =?UTF-8?q?REPORT-96808=20=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=B3=BB=E7=BB=9F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E4=B8=AD=E7=9A=84jxbrowser=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/actions/help/SystemInfoPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java index 7fe26054f6..5f05dbffa8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java @@ -42,7 +42,8 @@ public class SystemInfoPane extends JPanel { Object[] tableRowData = new Object[2]; String keyValue = keys[i].toString(); // james:屏蔽掉exe4j的内容 - if (keyValue.indexOf("exe4j") != -1) { + // jxbrowser的也得屏蔽 + if (keyValue.indexOf("exe4j") != -1 || keyValue.indexOf("jxbrowser") != -1) { continue; } // james:这个也是exe4j的东东 From 0c906a483139947fd40a3d8862e6cb737cbc3e56 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 26 May 2023 11:23:30 +0800 Subject: [PATCH 50/61] =?UTF-8?q?REPORT-96808=20=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=B3=BB=E7=BB=9F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E4=B8=AD=E7=9A=84jxbrowser=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/help/SystemInfoPane.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java index 5f05dbffa8..4d76f52dab 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java @@ -43,11 +43,7 @@ public class SystemInfoPane extends JPanel { String keyValue = keys[i].toString(); // james:屏蔽掉exe4j的内容 // jxbrowser的也得屏蔽 - if (keyValue.indexOf("exe4j") != -1 || keyValue.indexOf("jxbrowser") != -1) { - continue; - } - // james:这个也是exe4j的东东 - if ("install4j.exeDir".equals(keyValue)) { + if (needToShield(keyValue)) { continue; } @@ -67,4 +63,14 @@ public class SystemInfoPane extends JPanel { add(new JScrollPane(table), BorderLayout.CENTER); } + + /** + * 是否属于需要屏蔽的内容 + * + * @param keyValue 对应的key值 + * @return 需要屏蔽则返回true + */ + private boolean needToShield(String keyValue) { + return keyValue.indexOf("exe4j") != -1 || keyValue.indexOf("jxbrowser") != -1 || "install4j.exeDir".equals(keyValue); + } } \ No newline at end of file From 81bf0f081e55b361df5b7dfc18049c54f3e35d13 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 26 May 2023 11:28:06 +0800 Subject: [PATCH 51/61] =?UTF-8?q?REPORT-96808=20=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=B3=BB=E7=BB=9F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E4=B8=AD=E7=9A=84jxbrowser=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/actions/help/SystemInfoPane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java index 4d76f52dab..8df91e7cc0 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java @@ -47,7 +47,7 @@ public class SystemInfoPane extends JPanel { continue; } - if(keyValue.indexOf("FineReport") != -1){ + if(keyValue.contains("FineReport")){ keys[i] = keyValue.replaceAll("FineReport", ProductConstants.APP_NAME); } @@ -71,6 +71,6 @@ public class SystemInfoPane extends JPanel { * @return 需要屏蔽则返回true */ private boolean needToShield(String keyValue) { - return keyValue.indexOf("exe4j") != -1 || keyValue.indexOf("jxbrowser") != -1 || "install4j.exeDir".equals(keyValue); + return keyValue.contains("exe4j") || keyValue.contains("jxbrowser") || "install4j.exeDir".equals(keyValue); } } \ No newline at end of file From db6b2ceb18e01029682d01f6b367a437ffc0f9a7 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 26 May 2023 11:40:08 +0800 Subject: [PATCH 52/61] =?UTF-8?q?REPORT-96808=20=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=B3=BB=E7=BB=9F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E4=B8=AD=E7=9A=84jxbrowser=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/actions/help/SystemInfoPane.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java index 8df91e7cc0..db5c21e692 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java @@ -41,8 +41,7 @@ public class SystemInfoPane extends JPanel { for (int i = 0; i < keys.length; i++) { Object[] tableRowData = new Object[2]; String keyValue = keys[i].toString(); - // james:屏蔽掉exe4j的内容 - // jxbrowser的也得屏蔽 + if (needToShield(keyValue)) { continue; } @@ -65,7 +64,7 @@ public class SystemInfoPane extends JPanel { } /** - * 是否属于需要屏蔽的内容 + * 是否属于需要屏蔽的内容(当前屏蔽掉exe4j与jxbrowser的内容) * * @param keyValue 对应的key值 * @return 需要屏蔽则返回true From d0d89d77f071e923a4f71f6267c42686b4634456 Mon Sep 17 00:00:00 2001 From: "Levy.Xie" Date: Mon, 29 May 2023 11:48:09 +0800 Subject: [PATCH 53/61] =?UTF-8?q?REPORT-96012=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E5=88=B0=E8=87=AA=E5=B7=B1=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E4=B8=8B=EF=BC=8C=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultTemplateTreeDefineProcessor.java | 4 ++-- .../fr/design/file/FileOperationHelper.java | 14 +++++------ .../design/file/FileOperationHelperTest.java | 23 +++++++++++-------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java index e010986ac0..1d2048fa28 100644 --- a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java +++ b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java @@ -433,8 +433,8 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi WARNING_MESSAGE); return false; } - // 检查移动源文件夹是否为目标文件夹的子文件夹 - if (FileOperationHelper.getInstance().isSubDirectory(getFileTree().getSelectedTreeNodes(), getTargetFileNode())) { + // 检查移动的源文件夹是否为目标文件夹相同文件夹或子文件夹 + if (FileOperationHelper.getInstance().isSubDirectoryOrSame(getFileTree().getSelectedTreeNodes(), getTargetFileNode())) { FineJOptionPane.showMessageDialog(this, Toolkit.i18nText("Fine-Design_Basic_Move_To_SubDirectory"), Toolkit.i18nText("Fine-Design_Basic_Alert"), diff --git a/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java b/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java index bc947df414..8bf57ae4ee 100644 --- a/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java +++ b/designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java @@ -36,16 +36,16 @@ public class FileOperationHelper { } /** - * 检查目标文件夹是否为多个源文件夹中,任一文件夹的子文件夹 + * 检查目标文件夹是否为多个源文件夹中的任一文件夹,或者任一文件夹的子文件夹 * * @param fileNodes 需移动的源文件 * @param targetNode 移动后的目标文件夹 * @return */ - public boolean isSubDirectory(@NotNull ExpandMutableTreeNode[] fileNodes, @NotNull FileNode targetNode) { + public boolean isSubDirectoryOrSame(@NotNull ExpandMutableTreeNode[] fileNodes, @NotNull FileNode targetNode) { for (ExpandMutableTreeNode treeNode : fileNodes) { FileNode sourceFileNode = (FileNode) treeNode.getUserObject(); - if (isSubDirectory(sourceFileNode, targetNode)) { + if (isSubDirectoryOrSame(sourceFileNode, targetNode)) { return true; } } @@ -53,17 +53,17 @@ public class FileOperationHelper { } /** - * 检查目标文件夹是否为源文件夹的子文件夹 + * 检查目标文件夹是否为源文件夹,或源文件夹的子文件夹 * * @param sourceFileNode 需移动的源文件 * @param targetNode 移动后的目标文件夹 */ - public boolean isSubDirectory(@NotNull FileNode sourceFileNode, @NotNull FileNode targetNode) { + public boolean isSubDirectoryOrSame(@NotNull FileNode sourceFileNode, @NotNull FileNode targetNode) { if (!sourceFileNode.isDirectory() || !targetNode.isDirectory()) { return false; } - Path sourceDir = Paths.get(sourceFileNode.getEnvPath()); - Path targetDir = Paths.get(targetNode.getEnvPath()); + Path sourceDir = Paths.get(sourceFileNode.getEnvPath()).normalize(); + Path targetDir = Paths.get(targetNode.getEnvPath()).normalize(); return targetDir.startsWith(sourceDir); } diff --git a/designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java b/designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java index 612a65d70d..2fa25fd17d 100644 --- a/designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java +++ b/designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java @@ -23,22 +23,27 @@ public class FileOperationHelperTest { FileNode sourceNode5 = new FileNode("/usr/local/webroot/reportlets/demo/test", true); FileNode sourceNode6 = new FileNode("/usr/local/webroot/reportlets/demo/test", false); FileNode sourceNode7 = new FileNode("/usr/local/webroot/reportlets/demo/test123", true); + FileNode sourceNode8 = new FileNode("/usr/local/webroot/reportlets/../reportlets/demo/test", true); + FileNode sourceNode9 = new FileNode("/usr/local/webroot/reportlets/../reportlets/demo/test/c", true); FileNode targetNode = new FileNode("/usr/local/webroot/reportlets/demo/test", true); - Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(sourceNode1, targetNode)); - Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(sourceNode2, targetNode)); - Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode3, targetNode)); - Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode4, targetNode)); - Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(sourceNode5, targetNode)); - Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode6, targetNode)); - Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(sourceNode7, targetNode)); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode1, targetNode)); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode2, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode3, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode4, targetNode)); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode5, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode6, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode7, targetNode)); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode8, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode9, targetNode)); + ExpandMutableTreeNode treeNode1 = new ExpandMutableTreeNode(sourceNode1); ExpandMutableTreeNode treeNode2 = new ExpandMutableTreeNode(sourceNode2); ExpandMutableTreeNode treeNode3 = new ExpandMutableTreeNode(sourceNode3); ExpandMutableTreeNode treeNode4 = new ExpandMutableTreeNode(sourceNode4); - Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectory(new ExpandMutableTreeNode[]{treeNode1, treeNode2, treeNode3}, targetNode)); - Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectory(new ExpandMutableTreeNode[]{treeNode3, treeNode4}, targetNode)); + Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(new ExpandMutableTreeNode[]{treeNode1, treeNode2, treeNode3}, targetNode)); + Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(new ExpandMutableTreeNode[]{treeNode3, treeNode4}, targetNode)); } } \ No newline at end of file From 73ad42cbdb3af7c3bae4d5368f2bc1791894134c Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 29 May 2023 18:23:07 +0800 Subject: [PATCH 54/61] =?UTF-8?q?REPORT-76564=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A3=80=E6=9F=A5-=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/components/table/TablePanel.java | 3 +++ .../src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java b/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java index 317a171954..769efec515 100644 --- a/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java +++ b/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java @@ -160,6 +160,9 @@ public class TablePanel extends JPanel { cellPanel.remove(0); } cellPanel.add(component); + if(component instanceof UILabel) { + cellPanel.setToolTipText(((UILabel)component).getText()); + } } public void updateCell(int row, int column, String value) { diff --git a/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java b/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java index 48dfecd7b3..312bf71074 100644 --- a/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java +++ b/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java @@ -163,6 +163,7 @@ public class EnvDetectorDialog extends JDialog { } }; detectButton.setForeground(Color.WHITE); + detectButton.setToolTipText(buttonStatus.getDesc()); detectButton.addActionListener(event -> { if (buttonStatus.isNotExecuting()) { startDetecting(); @@ -284,6 +285,7 @@ public class EnvDetectorDialog extends JDialog { UIUtil.invokeLaterIfNeeded(() -> { // 刷新按钮 detectButton.setText(buttonStatus.getDesc()); + detectButton.setToolTipText(detectButton.getText()); // 刷新面板 refreshBody(); }); @@ -293,6 +295,7 @@ public class EnvDetectorDialog extends JDialog { // 刷新按钮 detectButton.setText(buttonStatus.getDesc()); + detectButton.setToolTipText(detectButton.getText()); if (buttonStatus == EnvDetectorButtonStatus.A_NEW) { this.resultSummaryPane = new JPanel(); this.resultSummaryPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); From 8880e07986c2e1c72d9a91d8e9172f14abb03d98 Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 30 May 2023 14:13:53 +0800 Subject: [PATCH 55/61] =?UTF-8?q?REPORT-76564=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A3=80=E6=9F=A5-=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/components/table/TablePanel.java | 17 ++++++++++++++--- .../com/fr/env/detect/ui/EnvDetectorDialog.java | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java b/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java index 769efec515..304ade6f9e 100644 --- a/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java +++ b/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java @@ -160,9 +160,20 @@ public class TablePanel extends JPanel { cellPanel.remove(0); } cellPanel.add(component); - if(component instanceof UILabel) { - cellPanel.setToolTipText(((UILabel)component).getText()); - } + } + + /** + * 为单元格Panel添加tooltip + * + * @param row 行数 + * @param column 列数 + * @param value tooltip值 + */ + public void updateCellToolTip(int row, int column, String value) { + int x = row - 1; + int y = column - 1; + JPanel cellPanel = this.cellPanels[x][y]; + cellPanel.setToolTipText(value); } public void updateCell(int row, int column, String value) { diff --git a/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java b/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java index 312bf71074..f7ede9f1a0 100644 --- a/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java +++ b/designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java @@ -361,6 +361,7 @@ public class EnvDetectorDialog extends JDialog { } EnvDetectorItem item = items.get(i); tablePanel.updateCell(row, 2, new UILabel(item.getDescription())); + tablePanel.updateCellToolTip(row, 2, item.getDescription()); DetectorResult result = item.getResult(); int detectRow = currentDetectIndex + 1; From e385dc59483c50003f444dfd244ca4d343ab4f6c Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 30 May 2023 14:18:13 +0800 Subject: [PATCH 56/61] =?UTF-8?q?REPORT-76564=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=A3=80=E6=9F=A5-=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/components/table/TablePanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java b/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java index 304ade6f9e..b2e8ceb35a 100644 --- a/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java +++ b/designer-base/src/main/java/com/fr/design/components/table/TablePanel.java @@ -163,7 +163,7 @@ public class TablePanel extends JPanel { } /** - * 为单元格Panel添加tooltip + * 为单元格Panel更新tooltip * * @param row 行数 * @param column 列数 From b74d96cf19681397ab4f2c056dabf7ead6af2e88 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 31 May 2023 19:39:36 +0800 Subject: [PATCH 57/61] =?UTF-8?q?REPORT-95741=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=96=B0=E5=BB=BA=E7=9A=84cpt=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=EF=BC=8C=E5=9B=9E=E5=88=B0=E4=BA=86fvs-tab=EF=BC=9B?= =?UTF-8?q?=E9=A2=84=E6=9C=9F=E6=98=AF=E6=89=93=E5=BC=80=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E5=BC=A0cpt/frm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabPane.java | 14 +- .../fr/design/file/MultiTemplateTabUtils.java | 36 +++ .../design/file/MultiTemplateTabPaneTest.java | 289 ++++++++++++++++++ 3 files changed, 327 insertions(+), 12 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java create mode 100644 designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 9236deb4ad..6658fc6638 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -1108,18 +1108,8 @@ public class MultiTemplateTabPane extends JComponent { * @return */ public int calNextShowJTemplateIndex(int currentIndex) { - //先看是否有可以展示的模板 - for (int i = currentIndex; i >= 0; i--) { - if (showJTemplateTab(openedTemplate.get(i))) { - return i; - } - } - for (int i = currentIndex; i >= 0; i--) { - if (!showJTemplateTab(openedTemplate.get(i))) { - return i; - } - } - return -1; + JTemplate jTemplate= HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + return MultiTemplateTabUtils.calShowTemplateIndex(currentIndex, openedTemplate, jTemplate.getTemplateTabOperatorType()); } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java new file mode 100644 index 0000000000..5a8c504189 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java @@ -0,0 +1,36 @@ +package com.fr.design.file; + +import com.fr.design.mainframe.JTemplate; +import com.fr.general.ComparatorUtils; + +import java.util.List; +import java.util.function.Predicate; + +public class MultiTemplateTabUtils { + public static int calShowTemplateIndex(int currentIndex, List> openedTemplate, String type) { + if (currentIndex < 0 || currentIndex > openedTemplate.size() - 1) { + return -1; + } + int result = getShowJTemplateTab(currentIndex, openedTemplate, template -> showJTemplateTab(type, template)); + if (result != -1) return result; + return getShowJTemplateTab(currentIndex, openedTemplate, template -> !showJTemplateTab(type, template)); + } + + private static int getShowJTemplateTab(int currentIndex, List> openedTemplate, Predicate> predicate) { + for (int i = currentIndex; i >= 0; i--) { + if (predicate.test(openedTemplate.get(i))) { + return i; + } + } + for (int i = currentIndex + 1; i < openedTemplate.size(); i++) { + if (predicate.test(openedTemplate.get(i))) { + return i; + } + } + return -1; + } + + private static boolean showJTemplateTab(String type, JTemplate jTemplate) { + return ComparatorUtils.equals(type, jTemplate.getTemplateTabOperatorType()); + } +} diff --git a/designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java b/designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java new file mode 100644 index 0000000000..c00976abb3 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/file/MultiTemplateTabPaneTest.java @@ -0,0 +1,289 @@ +package com.fr.design.file; + +import com.fr.design.DesignModelAdapter; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.designer.TargetComponent; +import com.fr.design.gui.frpane.HyperlinkGroupPane; +import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider; +import com.fr.design.gui.imenu.UIMenuItem; +import com.fr.design.mainframe.AuthorityEditPane; +import com.fr.design.mainframe.BaseUndoState; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.template.info.TemplateProcessInfo; +import com.fr.design.menu.ShortCut; +import com.fr.design.menu.ToolBarDef; +import com.fr.plugin.injectable.PluginModule; +import junit.framework.TestCase; +import org.junit.Assert; + +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JPanel; +import java.util.ArrayList; +import java.util.List; + +public class MultiTemplateTabPaneTest extends TestCase { + @Override + protected void setUp() throws Exception { + PluginModule.registerAgent(PluginModule.ExtraDesign, new ExtraDesignClassManager()); + } + + /** + * 当前显示模式A,传入index左边(含当前)或右边有模式A的模板,返回最近的模式A模板index(优先左边) + */ + public void test_index_left_has_same_mode_temp() { + //当前显示模式A,传入index左边(含当前)有模式A的模板,返回左边最近的模式A模板index + List> openedTemplateList = new ArrayList<>(); + openedTemplateList.add(new A_Mode()); + Assert.assertEquals(0, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); + openedTemplateList.add(new A_Mode()); + Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); + openedTemplateList.add(new B_Mode()); + Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); + } + + public void test_index_left_has_not_but_right_has_same_mode_temp() { + //当前显示模式A,传入index左边没有但是右边有模式A的模板,返回右边最近的模式A模板index + List> openedTemplateList = new ArrayList<>(); + openedTemplateList.add(new B_Mode()); + openedTemplateList.add(new A_Mode()); + Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); + openedTemplateList.add(1, new B_Mode()); + openedTemplateList.add(new A_Mode()); + Assert.assertEquals(2, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); + openedTemplateList.add(new A_Mode()); + Assert.assertEquals(2, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); + } + + /** + * 当前显示模式A,没有模式A的模板,左边(含当前)或者右边有其他模式的模板,返回最近的其他模式模式模板index(优先左边) + */ + public void test_no_same_mode_temp_but_index_left_has_other_mode_temp() { + //当前显示模式A,没有模式A的模板,左边(含当前)有其他模式模板,返回左边最近的其他模式模板index + List> openedTemplateList = new ArrayList<>(); + openedTemplateList.add(new B_Mode()); + Assert.assertEquals(0, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); + openedTemplateList.add(new B_Mode()); + Assert.assertEquals(1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); + } + + + public void test_has_no_temp() { + //当前显示模式A,没有模式A的模板,也没有其他模式的模板,返回-1 + List> openedTemplateList = new ArrayList<>(); + Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); + } + + + public void test_if_index_less_than_zero_or_more_than_open_temp_size() { + //index<0 或者超出openTemplateList.size时,返回-1 + List> openedTemplateList = new ArrayList<>(); + Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(-1, openedTemplateList, "A_Mode")); + Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(0, openedTemplateList, "A_Mode")); + openedTemplateList.add(new A_Mode()); + Assert.assertEquals(-1, MultiTemplateTabUtils.calShowTemplateIndex(1, openedTemplateList, "A_Mode")); + } + + private class A_Mode extends AbstractTestMode { + public String getTemplateTabOperatorType() { + return "A_Mode"; + } + } + + private class B_Mode extends AbstractTestMode { + public String getTemplateTabOperatorType() { + return "B_Mode"; + } + } + + private abstract class AbstractTestMode extends JTemplate { + public AbstractTestMode() { + } + + @Override + public void copy() { + + } + + @Override + public boolean paste() { + return false; + } + + @Override + public boolean cut() { + return false; + } + + @Override + public AuthorityEditPane createAuthorityEditPane() { + return null; + } + + @Override + public JPanel getEastUpPane() { + return null; + } + + @Override + public JPanel getEastDownPane() { + return null; + } + + @Override + public ToolBarDef[] toolbars4Target() { + return new ToolBarDef[0]; + } + + @Override + public JPanel[] toolbarPanes4Form() { + return new JPanel[0]; + } + + @Override + public JComponent[] toolBarButton4Form() { + return new JComponent[0]; + } + + @Override + public JComponent toolBar4Authority() { + return null; + } + + @Override + public int getToolBarHeight() { + return 0; + } + + @Override + public void refreshEastPropertiesPane() { + + } + + @Override + public TargetComponent getCurrentElementCasePane() { + return null; + } + + @Override + public JComponent getCurrentReportComponentPane() { + return null; + } + + @Override + public TemplateProcessInfo getProcessInfo() { + return null; + } + + @Override + public void setJTemplateResolution(int resolution) { + + } + + @Override + public int getJTemplateResolution() { + return 0; + } + + @Override + protected JComponent createCenterPane() { + return null; + } + + @Override + public void removeTemplateSelection() { + + } + + @Override + public void refreshContainer() { + + } + + @Override + public void removeParameterPaneSelection() { + + } + + @Override + public void setScale(int resolution) { + + } + + @Override + public int getScale() { + return 0; + } + + @Override + public int selfAdaptUpdate() { + return 0; + } + + @Override + protected DesignModelAdapter createDesignModel() { + return null; + } + + @Override + public UIMenuItem[] createMenuItem4Preview() { + return new UIMenuItem[0]; + } + + @Override + protected BaseUndoState createUndoState() { + return null; + } + + @Override + public String suffix() { + return null; + } + + @Override + public ShortCut[] shortcut4TemplateMenu() { + return new ShortCut[0]; + } + + @Override + public ShortCut[] shortCuts4Authority() { + return new ShortCut[0]; + } + + @Override + public boolean isJWorkBook() { + return false; + } + + @Override + public HyperlinkGroupPane getHyperLinkPane(HyperlinkGroupPaneActionProvider hyperlinkGroupPaneActionProvider) { + return null; + } + + @Override + public HyperlinkGroupPane getHyperLinkPaneNoPop(HyperlinkGroupPaneActionProvider hyperlinkGroupPaneActionProvider) { + return null; + } + + @Override + public void setAuthorityMode(boolean isUpMode) { + + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public String route() { + return null; + } + + @Override + protected void applyUndoState(BaseUndoState baseUndoState) { + + } + + } +} From 4531ad7d5fd22a0ea979b7544bbbfdc23a892c08 Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 1 Jun 2023 12:00:33 +0800 Subject: [PATCH 58/61] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabUtils.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java index 5a8c504189..e5883a3987 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java @@ -7,6 +7,13 @@ import java.util.List; import java.util.function.Predicate; public class MultiTemplateTabUtils { + /** + * 计算离currentIndex最近的相同模式的模板index值(优先左边) + * @param currentIndex 当前index + * @param openedTemplate 模板list + * @param type 当前显示模式 + * @return + */ public static int calShowTemplateIndex(int currentIndex, List> openedTemplate, String type) { if (currentIndex < 0 || currentIndex > openedTemplate.size() - 1) { return -1; @@ -16,6 +23,13 @@ public class MultiTemplateTabUtils { return getShowJTemplateTab(currentIndex, openedTemplate, template -> !showJTemplateTab(type, template)); } + /** + * 先从左找,再从右找离得最近的满足条件的模板 + * @param currentIndex 当前index + * @param openedTemplate 模板list + * @param predicate + * @return + */ private static int getShowJTemplateTab(int currentIndex, List> openedTemplate, Predicate> predicate) { for (int i = currentIndex; i >= 0; i--) { if (predicate.test(openedTemplate.get(i))) { @@ -30,6 +44,12 @@ public class MultiTemplateTabUtils { return -1; } + /** + * 是否显示模板 + * @param type 模板类型 + * @param jTemplate 模板 + * @return + */ private static boolean showJTemplateTab(String type, JTemplate jTemplate) { return ComparatorUtils.equals(type, jTemplate.getTemplateTabOperatorType()); } From c8b3cd6ce396bf9e09bfb8566575cbf54a189ad7 Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 1 Jun 2023 13:57:09 +0800 Subject: [PATCH 59/61] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/MultiTemplateTabUtils.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java index e5883a3987..344abe64f2 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabUtils.java @@ -9,9 +9,10 @@ import java.util.function.Predicate; public class MultiTemplateTabUtils { /** * 计算离currentIndex最近的相同模式的模板index值(优先左边) - * @param currentIndex 当前index + * + * @param currentIndex 当前index * @param openedTemplate 模板list - * @param type 当前显示模式 + * @param type 当前显示模式 * @return */ public static int calShowTemplateIndex(int currentIndex, List> openedTemplate, String type) { @@ -25,7 +26,8 @@ public class MultiTemplateTabUtils { /** * 先从左找,再从右找离得最近的满足条件的模板 - * @param currentIndex 当前index + * + * @param currentIndex 当前index * @param openedTemplate 模板list * @param predicate * @return @@ -46,7 +48,8 @@ public class MultiTemplateTabUtils { /** * 是否显示模板 - * @param type 模板类型 + * + * @param type 模板类型 * @param jTemplate 模板 * @return */ From 41329b7cd38b00fb1546c1afc9d302b1b5269f06 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Thu, 1 Jun 2023 14:19:47 +0800 Subject: [PATCH 60/61] =?UTF-8?q?EPORT-97225=20=E3=80=90H5=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6=E5=A2=9E=E5=BC=BA=E3=80=91=E5=85=B3=E4=BA=8E=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E7=B1=BB=E6=8E=A7=E4=BB=B6=E7=9A=84=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=A1=B9=E7=9A=84=E5=B1=8F=E8=94=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/creator/XNumberEditor.java | 26 +++++++++---------- .../fr/design/designer/creator/XPassword.java | 10 +++---- .../fr/design/designer/creator/XTextArea.java | 10 +++---- .../mobile/TextEditorMobileDefinePane.java | 9 +++---- .../widget/WidgetMobilePaneFactory.java | 13 +++------- .../ui/mobile/TextEditorMobilePane.java | 2 +- 6 files changed, 29 insertions(+), 41 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XNumberEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XNumberEditor.java index 8dbe1e716a..12bed66f01 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XNumberEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XNumberEditor.java @@ -6,9 +6,7 @@ package com.fr.design.designer.creator; import com.fr.base.BaseUtils; import com.fr.base.ScreenResolution; import com.fr.base.Style; -import com.fr.design.designer.properties.mobile.NumberEditorMobilePropertyUI; import com.fr.design.form.util.XCreatorConstants; -import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.mainframe.widget.editors.InChangeBooleanEditor; import com.fr.design.mainframe.widget.editors.SpinnerMaxNumberEditor; import com.fr.design.mainframe.widget.editors.SpinnerMinNumberEditor; @@ -94,18 +92,18 @@ public class XNumberEditor extends XWrapperedFieldEditor { } @Override - protected JComponent initEditor() { - setBorder(FIELDBORDER); - return this; - } + protected JComponent initEditor() { + setBorder(FIELDBORDER); + return this; + } - @Override - protected String getIconName() { - return "number_field_16.png"; - } + @Override + protected String getIconName() { + return "number_field_16.png"; + } - @Override - public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { - return new WidgetPropertyUIProvider[]{new NumberEditorMobilePropertyUI(this)}; - } +// @Override +// public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { +// return new WidgetPropertyUIProvider[]{new NumberEditorMobilePropertyUI(this)}; +// } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XPassword.java b/designer-form/src/main/java/com/fr/design/designer/creator/XPassword.java index 29de6c9d05..f3d6214bfc 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XPassword.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XPassword.java @@ -3,9 +3,7 @@ */ package com.fr.design.designer.creator; -import com.fr.design.designer.properties.mobile.PasswordMobilePropertyUI; import com.fr.design.form.util.XCreatorConstants; -import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.gui.ibutton.UIPasswordField; import com.fr.design.mainframe.widget.editors.RegexEditor; import com.fr.design.mainframe.widget.editors.WidgetValueEditor; @@ -70,8 +68,8 @@ public class XPassword extends XWrapperedFieldEditor { (CRPropertyDescriptor[]) ArrayUtils.addAll(sup, new CRPropertyDescriptor[]{regex, waterMark}); } - @Override - public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { - return new WidgetPropertyUIProvider[]{new PasswordMobilePropertyUI(this)}; - } +// @Override +// public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { +// return new WidgetPropertyUIProvider[]{new PasswordMobilePropertyUI(this)}; +// } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XTextArea.java b/designer-form/src/main/java/com/fr/design/designer/creator/XTextArea.java index 88d0391ceb..e5702c81f2 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XTextArea.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XTextArea.java @@ -6,9 +6,7 @@ package com.fr.design.designer.creator; import com.fr.base.BaseUtils; import com.fr.base.ScreenResolution; import com.fr.base.Style; -import com.fr.design.designer.properties.mobile.TextAreaMobilePropertyUI; import com.fr.design.form.util.XCreatorConstants; -import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.mainframe.widget.editors.RegexEditor; import com.fr.design.mainframe.widget.editors.WidgetValueEditor; import com.fr.design.mainframe.widget.renderer.RegexCellRencerer; @@ -85,9 +83,9 @@ public class XTextArea extends XWrapperedFieldEditor { return "text_area_16.png"; } - @Override - public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { - return new WidgetPropertyUIProvider[]{new TextAreaMobilePropertyUI(this)}; - } +// @Override +// public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { +// return new WidgetPropertyUIProvider[]{new TextAreaMobilePropertyUI(this)}; +// } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java index 3e3010aa4d..834c3fb51b 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java @@ -3,7 +3,6 @@ package com.fr.design.widget.ui.designer.mobile; import com.fr.design.designer.creator.XCreator; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.FormDesigner; -import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane; import com.fr.design.widget.ui.designer.mobile.component.MobileTextFieldInputSettingPane; import com.fr.form.ui.TextEditor; @@ -31,9 +30,9 @@ public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { @Override protected void initSettingPane(JPanel container) { inputSettingPane = new MobileTextFieldInputSettingPane(); - textSettingPane = new MobileTextEditSettingPane(); +// textSettingPane = new MobileTextEditSettingPane(); container.add(inputSettingPane); - container.add(textSettingPane); +// container.add(textSettingPane); } @@ -41,7 +40,7 @@ public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { public void populate(FormDesigner designer) { TextEditor textEditor = (TextEditor) getxCreator().toData(); inputSettingPane.populateBean(textEditor.getMobileScanCodeAttr()); - textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); +// textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); this.bindListeners2Widgets(); } @@ -49,7 +48,7 @@ public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { public void update() { TextEditor textEditor = (TextEditor) getxCreator().toData(); inputSettingPane.updateBean(textEditor.getMobileScanCodeAttr()); - textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); +// textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/WidgetMobilePaneFactory.java b/designer-realize/src/main/java/com/fr/design/widget/WidgetMobilePaneFactory.java index eef3477c97..76f57797b5 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/WidgetMobilePaneFactory.java +++ b/designer-realize/src/main/java/com/fr/design/widget/WidgetMobilePaneFactory.java @@ -4,14 +4,8 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.fun.CellWidgetOptionProvider; import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.design.widget.ui.mobile.MultiFileEditorMobilePane; -import com.fr.design.widget.ui.mobile.NumberEditorMobilePane; -import com.fr.design.widget.ui.mobile.PasswordMobilePane; -import com.fr.design.widget.ui.mobile.TextAreaMobilePane; import com.fr.design.widget.ui.mobile.TextEditorMobilePane; import com.fr.form.ui.MultiFileEditor; -import com.fr.form.ui.NumberEditor; -import com.fr.form.ui.Password; -import com.fr.form.ui.TextArea; import com.fr.form.ui.TextEditor; import com.fr.form.ui.Widget; import com.fr.general.GeneralContext; @@ -35,9 +29,10 @@ public class WidgetMobilePaneFactory { static { mobilePaneMap.put(MultiFileEditor.class, MultiFileEditorMobilePane.class); mobilePaneMap.put(TextEditor.class, TextEditorMobilePane.class); - mobilePaneMap.put(TextArea.class, TextAreaMobilePane.class); - mobilePaneMap.put(NumberEditor.class, NumberEditorMobilePane.class); - mobilePaneMap.put(Password.class, PasswordMobilePane.class); + // 此版本不发布,先屏蔽入口 + // mobilePaneMap.put(TextArea.class, TextAreaMobilePane.class); + // mobilePaneMap.put(NumberEditor.class, NumberEditorMobilePane.class); + // mobilePaneMap.put(Password.class, PasswordMobilePane.class); mobilePluginPaneMap.putAll(ExtraDesignClassManager.getInstance().getCellWidgetMobileOptionsMap()); GeneralContext.listenPluginRunningChanged(new PluginEventListener() { diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java index 7c836389d7..a80a27df52 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java @@ -37,7 +37,7 @@ public class TextEditorMobilePane extends WidgetMobilePane { settingPane = new MobileTextFieldInputSettingPane(); textSettingPane = new MobileTextEditSettingPane(); container.add(settingPane); - container.add(textSettingPane); +// container.add(textSettingPane); this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH); } From 51b78ed2692bd5d7fcf186b16710805069825196 Mon Sep 17 00:00:00 2001 From: obo Date: Thu, 1 Jun 2023 15:32:54 +0800 Subject: [PATCH 61/61] =?UTF-8?q?REPORT-92333=20frm=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E6=98=AF=E4=B8=AD=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget/picture_widget_designer_bg.png | Bin 4933 -> 3211 bytes .../widget/picture_widget_designer_bg_en.png | Bin 0 -> 3211 bytes .../widget/picture_widget_designer_bg_zh.png | Bin 0 -> 2918 bytes .../picture_widget_designer_bg_zh_TW.png | Bin 0 -> 4276 bytes .../fr/design/designer/creator/XPicture.java | 3 ++- 5 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_en.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_zh.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_zh_TW.png diff --git a/designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png b/designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png index 9e731c557b747f06c132c3ef09a47c722d9ca182..a302e257b222c8c5f7ae2a6c4c73dcc4eacf47a9 100644 GIT binary patch literal 3211 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 NL`TL%oDNfH{|_#1j diff --git a/designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_en.png b/designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_en.png new file mode 100644 index 0000000000000000000000000000000000000000..a302e257b222c8c5f7ae2a6c4c73dcc4eacf47a9 GIT binary patch literal 3211 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 W5TKm*eApZS0000