From 7ca66ff67907181ada372208e7700ce5a99aee25 Mon Sep 17 00:00:00 2001 From: lidongy <1879087903@qq.com> Date: Fri, 11 Feb 2022 13:45:35 +0800 Subject: [PATCH 001/625] =?UTF-8?q?KERNEL-9267=20feat:=20=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=8F=90=E4=BE=9B=E7=9A=84CBB=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=9B=AE=E5=89=8D=E8=BF=87=E4=BA=8E=E5=86=97=E6=9D=82=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=B3=95=E7=B2=BE=E7=AE=80=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index ee08bdeeac..4a634b11d4 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,7 @@ plugins { // 模块参数 ext { frVersion = "" + cbbVersion = "" outputPath = "build" ignoreTestFailureSetting = true languageLevelSetting = 1.8 @@ -75,6 +76,8 @@ allprojects { implementation 'org.apache.tomcat:tomcat-catalina:8.5.72' implementation 'org.apache.tomcat:tomcat-websocket:8.5.72' implementation 'io.socket:socket.io-client:0.7.0' + implementation 'com.fr.essential:fine-essential:' + cbbVersion + implementation 'com.fr.cbb:fine-universal-skeleton:' + cbbVersion implementation 'com.fr.third:fine-third:' + frVersion implementation 'com.fr.core:fine-core:' + frDevVersion implementation 'com.fr.activator:fine-activator:' + frVersion From f189f1ba19d50d2af899473b70401bf59770b5cd Mon Sep 17 00:00:00 2001 From: Yann Date: Fri, 17 Mar 2023 10:05:56 +0800 Subject: [PATCH 002/625] =?UTF-8?q?REPORT-91327=20=E4=BF=AE=E5=A4=8DDesign?= =?UTF-8?q?TableDataManagerTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/DesignTableDataManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/test/java/com/fr/design/data/DesignTableDataManagerTest.java b/designer-base/src/test/java/com/fr/design/data/DesignTableDataManagerTest.java index 9a5ce7b8c1..1a23555f61 100644 --- a/designer-base/src/test/java/com/fr/design/data/DesignTableDataManagerTest.java +++ b/designer-base/src/test/java/com/fr/design/data/DesignTableDataManagerTest.java @@ -23,7 +23,7 @@ import java.util.HashMap; import java.util.Map; @RunWith(PowerMockRunner.class) -@PrepareForTest({TableDataFactory.class, StoreProcedure.class, TableDataConfig.class, ProcedureConfig.class}) +@PrepareForTest({TableDataFactory.class, StoreProcedure.class, TableDataConfig.class, ProcedureConfig.class, TemplateTableDataWrapper.class}) @SuppressStaticInitializationFor({"com.fr.design.data.tabledata.wrapper.TableDataFactory"}) public class DesignTableDataManagerTest { From 1f73a890b95d93758f2e996ca2608d5f43984898 Mon Sep 17 00:00:00 2001 From: Yann Date: Fri, 17 Mar 2023 10:10:36 +0800 Subject: [PATCH 003/625] =?UTF-8?q?REPORT-91327=20=E4=BF=AE=E5=A4=8DBasicT?= =?UTF-8?q?ableDataUtilsTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/data/BasicTableDataUtilsTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java b/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java index 7391924ac2..a5721a36a6 100644 --- a/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java +++ b/designer-base/src/test/java/com/fr/design/data/BasicTableDataUtilsTest.java @@ -50,19 +50,19 @@ public class BasicTableDataUtilsTest extends TestCase { TableDataSource source = EasyMock.mock(TableDataSource.class); TableData tableData = EasyMock.mock(TableData.class); EasyMock.expect(source.getTableData("ds1")).andReturn(tableData).anyTimes(); - EasyMock.expect(source.getTableData("test-ds1")).andReturn(tableData).anyTimes(); - EasyMock.expect(source.getTableData("test-ds11")).andReturn(null).anyTimes(); + EasyMock.expect(source.getTableData("test_ds1")).andReturn(tableData).anyTimes(); + EasyMock.expect(source.getTableData("test_ds11")).andReturn(null).anyTimes(); EasyMock.replay(source, tableData); - Assert.assertEquals("test-ds1", BasicTableDataUtils.getTableDataName(true, source, "ds1", "test", false)); - Assert.assertEquals("test-ds11", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", false)); + Assert.assertEquals("test_ds1", BasicTableDataUtils.getTableDataName(true, source, "ds1", "test", false)); + Assert.assertEquals("test_ds11", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", false)); source = EasyMock.mock(TableDataSource.class); EasyMock.expect(source.getTableData("ds1")).andReturn(null).anyTimes(); - EasyMock.expect(source.getTableData("test-ds1")).andReturn(null).anyTimes(); + EasyMock.expect(source.getTableData("test_ds1")).andReturn(null).anyTimes(); EasyMock.replay(source); - Assert.assertEquals("test-ds1", BasicTableDataUtils.getTableDataName(true, source, "ds1", "test", false)); + Assert.assertEquals("test_ds1", BasicTableDataUtils.getTableDataName(true, source, "ds1", "test", false)); Assert.assertEquals("ds1", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", false)); - Assert.assertEquals("test-ds1", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", true)); + Assert.assertEquals("test_ds1", BasicTableDataUtils.getTableDataName(false, source, "ds1", "test", true)); } From 2f814b1ce6f4d753957d01eef5ded864cc8c6e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Wed, 22 Mar 2023 12:07:59 +0800 Subject: [PATCH 004/625] =?UTF-8?q?REPORT-91503=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=A2=91=E7=B9=81=E6=8A=A5=E9=94=99=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E4=BF=A1=E6=81=AF=E4=B8=8D=E4=B8=80=E8=87=B4=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8=E8=BF=99=E4=B8=AA=E5=BC=B9=E7=AA=97=E5=8F=A6=E5=AD=98?= =?UTF-8?q?=E4=B8=BA=E4=B8=80=E5=AE=9A=E4=BC=9A=E5=A4=B1=E8=B4=A5=E3=80=82?= =?UTF-8?q?=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91REPORT?= =?UTF-8?q?-70481=E8=BF=AD=E4=BB=A3=E5=BC=95=E8=B5=B7=EF=BC=8C=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E6=98=AF=E5=9C=A8=E6=A8=A1=E6=9D=BF=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E4=B8=8D=E4=B8=80=E8=87=B4=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=EF=BC=8C=E5=8E=9F=E6=9C=AC=E7=9A=84=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=98=AF=E5=B0=86=E5=BD=93=E5=89=8D=E6=A8=A1=E6=9D=BF=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E4=B8=BA=E5=A4=87=E4=BB=BD=E6=96=87=E4=BB=B6=20+=20?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E5=BD=93=E5=89=8D=E6=A8=A1=E6=9D=BF=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E6=98=AF=E4=BF=9D=E5=AD=98=E7=9A=84=E5=8A=A8=E4=BD=9C?= =?UTF-8?q?=E6=98=AF=E9=80=9A=E8=BF=87SwingWorker=E5=81=9A=E7=9A=84?= =?UTF-8?q?=EF=BC=8C=E5=85=B3=E9=97=AD=E5=BD=93=E5=89=8D=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E7=9A=84=E5=8A=A8=E4=BD=9C=E6=9C=AA=E8=A2=AB=E5=8C=85=E5=90=AB?= =?UTF-8?q?=E5=9C=A8SwingWorker=E4=B8=AD=EF=BC=8C=E5=9B=A0=E6=AD=A4?= =?UTF-8?q?=E4=BC=9A=E5=AF=BC=E8=87=B4=E5=85=88=E5=85=B3=E9=97=AD=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E6=A8=A1=E6=9D=BF=E9=87=8A=E6=94=BE=E8=B5=84=E6=BA=90?= =?UTF-8?q?=EF=BC=8C=E5=86=8D=E8=AF=BB=E5=8F=96=E5=BD=93=E5=89=8D=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=86=99=E5=85=A5=E6=96=B0=E6=96=87=E4=BB=B6=EF=BC=88?= =?UTF-8?q?=E6=AD=A4=E6=97=B6=E6=9C=89=E8=B5=84=E6=BA=90=E5=B7=B2=E8=A2=AB?= =?UTF-8?q?=E9=87=8A=E6=94=BE=EF=BC=8C=E4=BC=9A=E5=9C=A8=E5=86=99=E5=85=A5?= =?UTF-8?q?=E6=97=B6=E5=BC=95=E8=B5=B7NPE=EF=BC=89=20=E3=80=90=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91=E5=B0=86=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E6=A8=A1=E6=9D=BF=E7=9A=84=E5=8A=A8=E4=BD=9C?= =?UTF-8?q?=E6=94=BE=E5=88=B0=E4=BF=9D=E5=AD=98=E7=9A=84SwingWorker?= =?UTF-8?q?=E7=9A=84done=E6=96=B9=E6=B3=95=E4=B8=AD=EF=BC=8C=E5=8D=B3?= =?UTF-8?q?=E5=85=88=E4=BF=9D=E5=AD=98=E6=88=90=E5=8A=9F=EF=BC=8C=E5=86=8D?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=A8=A1=E6=9D=BF=EF=BC=9B=E5=8F=A6=E5=A4=96?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E4=B8=80=E4=B8=8B=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BD=BF=E5=85=B6=E6=9B=B4?= =?UTF-8?q?=E7=AC=A6=E5=90=88=E5=BC=80=E5=8F=91=E8=A7=84=E8=8C=83=20?= =?UTF-8?q?=E3=80=90review=E5=BB=BA=E8=AE=AE=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 74 ++++++++++++------- .../worker/save/SaveFailureHandler.java | 8 +- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index 9fb1e632af..e82251f4b8 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -16,6 +16,7 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import com.fr.stable.CoreConstants; import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; @@ -33,6 +34,7 @@ public class TemplateUtils { /** * 创建新的模板文件并打开模板 + * * @param prefix 模板文件名称前缀 * @param file 模板文件 * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 @@ -41,6 +43,21 @@ public class TemplateUtils { * @param openNewTemplate 是否需要在创建后打开模板 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { + createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); + } + + /** + * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + * @param doAfterCreateTemplate 创建备份模板成功后调用 + */ + public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { String fileName = file.getName(); String oldPath = file.getPath(); int indexOfLastDot = fileName.lastIndexOf(CoreConstants.DOT); @@ -62,43 +79,25 @@ public class TemplateUtils { if (isOk(result)) { file = fileChooserPane.getSelectedFILE(); - _createAndOpenTemplate(file, oldPath, createByEditingTemplate, openNewTemplate); + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); } } - private static void _createAndOpenTemplate(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate){ + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { new SwingWorker() { @Override protected Void doInBackground() throws Exception { - byte[] content = new byte[0]; - if (createByEditingTemplate) { - // 从当前编辑模板中生成备份文件 - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - content = template.exportData(); - } else { - content = WorkContext.getWorkResource().readFully(oldPath); - } - if (ArrayUtils.isEmpty(content)) { - throw new Exception(oldPath + " content is empty" ); - } - OutputStream out = null; - try { + // 读取模板数据 + byte[] content = getTemplateData(createByEditingTemplate, oldPath); + try(OutputStream out = file.asOutputStream()) { // 加锁 WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); - out = file.asOutputStream(); out.write(content); } finally { - try { - if (out != null) { - out.close(); - } - } finally { - // 解锁 - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); - } - + // 解锁 + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); } return null; } @@ -107,6 +106,8 @@ public class TemplateUtils { protected void done() { try { get(); + // 创建备份成功后 + doAfterCreateTemplate.run(); if (openNewTemplate) { DesignerContext.getDesignerFrame().openTemplate(file); } @@ -118,7 +119,30 @@ public class TemplateUtils { } } }.execute(); + } + /** + * 读取模板文件数据 + * + * @param readCurrentEditingTemplate 是否读取当前编辑模板 + * @param path 模板路径 + * @return + */ + private static byte[] getTemplateData(boolean readCurrentEditingTemplate, String path) throws Exception { + byte[] content = new byte[0]; + if (readCurrentEditingTemplate) { + // 从当前编辑模板中生成备份文件 + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (JTemplate.isValid(template)) { + content = template.exportData(); + } + } else { + content = WorkContext.getWorkResource().readFully(path); + } + if (ArrayUtils.isEmpty(content)) { + throw new Exception(StringUtils.messageFormat("{} content is empty", path)); + } + return content; } private static boolean isCancel(int result) { diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java index 080b9ddbcd..128064301e 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java @@ -133,14 +133,14 @@ public class SaveFailureHandler implements ThrowableHandler { new Object[] {Toolkit.i18nText("Fine_Design_Template_SaveAs_Backup"), Toolkit.i18nText("Fine-Design_Basic_Button_Cancel")}, null); if (option == JOptionPane.YES_OPTION) { JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (template != null) { + if (JTemplate.isValid(template)) { TemplateUtils.createAndOpenTemplate( Toolkit.i18nText("Fine_Design_Template_Backup"), new FileNodeFILE(new FileNode(template.getPath(), false)), true, - true); - // 创建并打开备份模板后,关闭原模板 - HistoryTemplateListCache.getInstance().closeSelectedReport(template); + true, + // 创建并打开备份模板后,关闭原模板 + () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template)); } } } From d3b6873102eec2261969173f997e4c7ac97d4a99 Mon Sep 17 00:00:00 2001 From: loy Date: Wed, 22 Mar 2023 14:48:16 +0800 Subject: [PATCH 005/625] =?UTF-8?q?REPORT-92308=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8F=AF=E7=94=A8=E6=80=A7=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=80=82=E9=85=8D=E6=96=B0=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/PreferencePane.java | 31 ++++--------------- .../DesignerFrameFileDealerPane.java | 9 ++++-- .../mainframe/vcs/common/VcsHelper.java | 24 ++++++++++++++ 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index e09d6f7a05..a83bcfd771 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -356,6 +356,8 @@ public class PreferencePane extends BasicPane { useIntervalCheckBox = new UICheckBox(); //gc面板 + JPanel gcControlPane = createGcControlPane(); + JPanel enableVcsPanel = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); enableVcsPanel.add(vcsEnableCheckBox); enableVcsPanel.add(remindVcsLabel); @@ -388,31 +390,10 @@ public class PreferencePane extends BasicPane { vcsPane.add(enableVcsPanel); vcsPane.add(intervalPanel); vcsPane.add(saveCommitCheckBox); - - initGcControlPane(vcsPane); - } - - private void initGcControlPane(JPanel vcsPane) { - JPanel gcControlPane = createGcControlPane(); - new SwingWorker() { - @Override - protected Boolean doInBackground() throws Exception { - return WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); - } - - @Override - protected void done() { - try { - if (Boolean.TRUE.equals(get())) { - // 老版本时才显示gc选项 - vcsPane.add(gcControlPane); - vcsPane.updateUI(); - } - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e, "[Vcs] retrieve legacy mode error: {}", e.getMessage()); - } - } - }.execute(); + if (VcsHelper.getInstance().isLegacyMode()) { + // 老版本时才显示gc选项 + vcsPane.add(gcControlPane); + } } /** 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..d21dd1b7cf 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 @@ -325,7 +325,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt if (VcsHelper.getInstance().needInit()) { vcsAction = new VcsAction(); - if (!WorkContext.getCurrent().isCluster()) { + if (!isLegacyOnCluster()) { vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_Title")); } else { vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_NotSupportRemote")); @@ -509,7 +509,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt private void fireVcsActionChange(boolean enable) { if (!DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable() || VcsHelper.getInstance().isUnSelectedTemplate() - || WorkContext.getCurrent().isCluster()) { + || isLegacyOnCluster()) { setEnabled(false); return; } @@ -810,6 +810,11 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } + private boolean isLegacyOnCluster() { + // 老模式且为集群,用于代替之前的只判断集群逻辑 + return WorkContext.getCurrent().isCluster() && VcsHelper.getInstance().isLegacyMode(); + } + private String doCheck (String userInput, String suffix) { String errorMsg = StringUtils.EMPTY; if (selectedOperation.duplicated(userInput, suffix, true)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index c72fa68dc4..335e3c9a7b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -12,6 +12,9 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplateActionListener; import com.fr.design.mainframe.vcs.VcsConfigManager; import com.fr.design.mainframe.vcs.ui.FileVersionTable; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; @@ -20,6 +23,8 @@ import com.fr.report.entity.VcsEntity; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; +import com.fr.workspace.Workspace; +import com.fr.workspace.WorkspaceEvent; import com.fr.workspace.server.vcs.VcsOperator; import com.fr.workspace.server.vcs.filesystem.VcsFileSystem; import com.fr.workspace.server.vcs.git.config.GcConfig; @@ -56,10 +61,22 @@ public class VcsHelper implements JTemplateActionListener { private final static String SERVICE_NAME_MOVE = "moveVcs"; private static final VcsHelper INSTANCE = new VcsHelper(); + private volatile boolean isLegacyMode; + public static VcsHelper getInstance() { return INSTANCE; } + private VcsHelper() { + isLegacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); + EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { + @Override + public void on(Event event, Workspace param) { + isLegacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); + } + }); + } + private int containsFolderCounts() { TemplateFileTree fileTree = TemplateTreePane.getInstance().getTemplateFileTree(); if (fileTree.getSelectionPaths() == null) { @@ -187,6 +204,13 @@ public class VcsHelper implements JTemplateActionListener { moveVcs.shutdown(); } + /** + * 判断是否为老模式 + * @return 是否为老模式 + */ + public boolean isLegacyMode() { + return isLegacyMode; + } @Override public void templateOpened(JTemplate jt) { From b474bf0447435e435d93d7fc896d06b1255610b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Wed, 22 Mar 2023 14:52:43 +0800 Subject: [PATCH 006/625] =?UTF-8?q?REPORT-91988=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E7=BC=96=E8=BE=91=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/connect/ConnectionTableProcedurePane.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java index 613eed9a48..79e75a0b83 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -21,6 +21,7 @@ import com.fr.general.GeneralContext; import com.fr.stable.ArrayUtils; import javax.swing.BorderFactory; +import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.ToolTipManager; import javax.swing.event.DocumentEvent; @@ -109,6 +110,8 @@ public class ConnectionTableProcedurePane extends BasicPane { if (parent != null) { parent.switchTo(SwitchableTableDataPane.CONTENT_PANE_NAME); } + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + model.removeElement(EMPTY); } @Override From 204e83c90042d9b411d5cfbaf92be72c92a59e70 Mon Sep 17 00:00:00 2001 From: loy Date: Wed, 22 Mar 2023 14:55:30 +0800 Subject: [PATCH 007/625] =?UTF-8?q?REPORT-92308=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8F=AF=E7=94=A8=E6=80=A7=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=80=82=E9=85=8D=E6=96=B0=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=20-=20=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/vcs/common/VcsHelper.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index 335e3c9a7b..0c8924e9d0 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -61,18 +61,18 @@ public class VcsHelper implements JTemplateActionListener { private final static String SERVICE_NAME_MOVE = "moveVcs"; private static final VcsHelper INSTANCE = new VcsHelper(); - private volatile boolean isLegacyMode; + private volatile boolean legacyMode; public static VcsHelper getInstance() { return INSTANCE; } private VcsHelper() { - isLegacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); + legacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { @Override public void on(Event event, Workspace param) { - isLegacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); + legacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); } }); } @@ -209,7 +209,7 @@ public class VcsHelper implements JTemplateActionListener { * @return 是否为老模式 */ public boolean isLegacyMode() { - return isLegacyMode; + return legacyMode; } @Override From 76c2bab02d57ddd8c3584775ac00576ec7c2bef8 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 22 Mar 2023 20:10:05 +0800 Subject: [PATCH 008/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/locale/impl/EmptyDataMark.java | 37 ++++++++++++++++++ .../module/ChartEmptyDataStylePane.java | 12 +++--- .../images/zh_traditional_emptydata.png | Bin 0 -> 18659 bytes 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java create mode 100644 designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png diff --git a/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java b/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java new file mode 100644 index 0000000000..6b7a2f5fbd --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java @@ -0,0 +1,37 @@ +package com.fr.design.locale.impl; + +import com.fr.general.GeneralContext; +import com.fr.general.IOUtils; +import com.fr.general.locale.LocaleMark; + +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * 根据本地化信息设置服务器图表空数据提示图标 + * + * @author obo + * @version 11.0 + * Created by obo on 2023/3/22 + */ +public class EmptyDataMark implements LocaleMark { + + private Map map = new HashMap<>(); + + private static final BufferedImage ZH_EMPTY_DATA = IOUtils.readImage("com/fr/design/images/zh_emptydata.png"); + private static final BufferedImage US_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/us_emptydata.png"); + private static final BufferedImage ZH_TRADITIONAL_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/zh_traditional_emptydata.png"); + + public EmptyDataMark() { + map.put(Locale.CHINA, ZH_EMPTY_DATA); + map.put(Locale.US, US_EMPTY_DATA); + map.put(Locale.TAIWAN, ZH_TRADITIONAL_EMPTY_DATA); + } + @Override + public BufferedImage getValue() { + BufferedImage result = map.get(GeneralContext.getLocale()); + return result == null ? US_EMPTY_DATA : result; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java index 31718fda82..e73bae010e 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java @@ -10,12 +10,13 @@ import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.locale.impl.EmptyDataMark; import com.fr.design.style.background.image.ImageFileChooser; import com.fr.design.style.background.image.ImagePreviewPane; import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.general.GeneralContext; -import com.fr.general.IOUtils; +import com.fr.general.locale.LocaleCenter; +import com.fr.general.locale.LocaleMark; import com.fr.stable.Constants; import com.fr.stable.CoreGraphHelper; import com.fr.stable.StringUtils; @@ -26,7 +27,6 @@ import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingWorker; -import java.io.File; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; @@ -35,6 +35,8 @@ import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.io.File; /** * Created by mengao on 2017/11/23. @@ -63,8 +65,8 @@ public class ChartEmptyDataStylePane extends AbstractAttrNoScrollPane { static { - DEFAULT_EMPTY_DATA_IMAGE = GeneralContext.isChineseEnv() ? IOUtils.readImage("com/fr/design/images/zh_emptydata.png") - : IOUtils.readImage("com/fr/design/images/us_emptydata.png"); + LocaleMark localeMark = LocaleCenter.getMark(EmptyDataMark.class); + DEFAULT_EMPTY_DATA_IMAGE = localeMark.getValue(); } @Override diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png new file mode 100644 index 0000000000000000000000000000000000000000..738fa685adb223d384edfe6310251f31365a6830 GIT binary patch literal 18659 zcmeEt`8!naAGakb6_vDDQ=zPt?2N5a+4roYgc@tcI*dU{B@HRE4v}pbp&{#75)xw@ zJ42Q+27@t{Va#*-e6Q>I`S}AL*X6=E=RW6t@9)?9b-yt)F*v~^$iv3QcH;iM+ZJqW z?7P5s-;u+>C(rIT;ea1U{qEU8+1QTp|NCZVOUpP9e8>*9FwkSe^azuIKMr~58tbyL zl_QVsKjLCzyBBi*wysqO`^sckKn5L7-9s&WNtbYFjJlyR8aaFVL&vWx@-a?zH+DGg zkM5mGdG(4z^2brNTQW{gTFlv!dF>u`Ehn_G{AS^75Ldna|&yRTev=DUq&0zeycY_kA-`rCb=6yEs%_Nsp z3;I}_(YuvfkeK%a6Gslew|$`>9vk4`6%z6TJiI+hKG>sDhXXJ3>f8~Zi(;$1?t7Zc zhc-R!QW;%kXFDF+Ad_Qu_12f+>)Cp@%MO;~+h?VO1O-hRnOoxp%HCri{n$9(Bye-g zy^+fLoPRy@t36$o`HW;N-(*D*GmpwOD5L$*W9=-DRwBzBs(pIdj~vnyy_)MAJ}Y!W z(W9r{?2%f#gnmPhbt9+&dAXP_=HuZD z6E*{b>Z_`@a)15$^@1{7Mh#|r@G61(!Ss5&nC}Ha!CI@Ch@6&&W@B^6n0E1i!a3Q8 zYci0XNY;_iCMgjSk-%6!vBoQBMO&~+2)unrfg3@@#c3|IS($*vGZN4 zhgA7Y!X9ag;*8jXqSDa2+R6H=!lJ#TtsE0EuaR##!|ZFvH7+)BrYn2Dbqrr`vvCC% zY72=--r>r1RS%;~g;BNsvYm-f;C}03ydehP?BgIzIM6)?oB4|g!3LKSs|PZn=>Z+9;P*1D z^XjxId2?%zierf@F0=1mo{Q3ah}xS^0XOQ*M0|xLpNg&MB@xAVV~Hc*9<}OnUz7r# z5*eS2`1?jmUPM&X*-@gh&zehPD#FEOn!qg@GX0S=K|q}E$@(NUBA78fJuM}$swfhD z^%Sz5?@xvrt&~m~ZWoE9o!n?rtqWRtTfetj7Z>pS5mt;O8rLRx=HmbzlpFLxHxq>^ zE!Fz!zW(5-NxBRRs{kh(im9=YF3v^W5Jl{-hw{{T76&fbIaoTE^2;qnJS_CX>2*&H zRC=WyiP7_=Yz_e?9pM(&Qx|EOGne2@@%)42%ed3QDQ_31?Kj;d6|jEVHpa>oHAEy5 zi%S~aqh0X#w$*IFU{-5wZLO>Pv{$X8fYFxk$hR30?#KjgQTV30Lmm7Lx*~PyOo%zx zox1p*vlOP!d)eo!w@w zDkNO!f+}jTF=;>&db}}hMu_|HVS9SWkTAHv6yQ(0MRb+EGnQn86QrvyoFykJ%^~JAl$%4_7>>28jeDz2;owNIBcWEM zgA=qa!}4$M7(0B|rosLKEj(=8e4-hya%^Y!U0Ya};Lfzo;9K}um;-j#38P1bA1ncW zJ&A@Um))_xG-v*)k-6fFw~2(;p6O~Ci*&}3VUbu1J6bvTD@qu<++RoZU8UcF|I2OXyU13ow z>e1eauBlFnn7kr1SLhS@jED718QhqOP9{E$uVeeIS4RKtO!E;KVF;T^0Qbft zc484fE(*pwlO9;TFx?%6Z%=M#>6@&qtYFXX7vDg>Lcm1XJlU@je%`KmI2`9Zj-=L* zve>z;*a4k3yO&!&4FB~>dAhXdfO~NNtw$`!(9qEP!>r!k-c-FvdpGym(*w}0;@))> z;pQ(6OCfROTMu-{v-bLl{I`J;Pq2+Agp`*9*5Vt-Jp-zmK25EY2MVb2gmCUi@B@1a zdwss(^zoP#j|U=aK@X>jEDJdLemZuWWNC)#$laR6Y`SNH;IL;k?)-=9^*VANYaQ&& z(jkAD0Y!HM&_`AJiA2P6Utg+6V67ouqrKU-w6s+DO`n7Mr+TuZ(+!$v*mAk4dUo`w zjlz3X*>OQFsG*{%-FtF}lwQ1eQ7N#5GVf-_l|S^#Y=J*oTDS%saa4OKXJ0VJU@#IO zv^}Q_i@OTr6>eSa!e%*uEQQB+#Z>)VisXCzKo>+seJr3WN?KZ4xPk^ zj@&O^Q}w$QW>>%WhDw#_pvqiWaug3++};DO`yj5@IsfARj~Bl0h1L8`y6)c+j9=Uf z9siVrm?{kPcoWb0T!*V@@Y>ZIT%*y7oSd8}zdH};m3S-5wNE_p-~sET3lc0D_ZnJC zt>L95q&BG*P}=aK$~SPS>>U;_j~oA1VdS&RtB96hcuHHB{>0ebL$OFb7A> zml{!lnWiXCl-W1s8jfotp4OKgLpJ6*@$~I&gsuje;*`klyJ^3O+)jloUyu=3K3|r> zq(ScdSSoK9O{YZi=yY6O`{%IW{7S=(NoS3jZyd}^^zt$@vx%=bZ8Vys##c1DmHonZ z`N-QhlBzs9tbGdx$^7V3j6t^dXvJ4M?0N>Xj3*`m5~66qTo$v{*{S_&cja`BBsI6E zrzb=4ygjR)$4}c<7c<8{RG8oqx6-SPY|52HHdTyeaMX1huW4ALyk`Lm#@LiHg9CPh z15nC1&Z$Dl`yG3QXtYcj&pmzpRx?%MRe!haY*eZH-W}c}*Y!lB=s?g^uyUz>hXWDt zQ^hXe0vDVmR}|3?Wb!VldCfo!9x&LfGLUcFB{Nrwa5g5z(lyj(em6<}e&*||Fz?HE z^+-4UNS;(yNXw8Q>$6ENLZ-v>%<4JmLGLHDPndeHLF9jx+?wUoFBRky5I0=T!p`{K-k$F;@5EtM zLQSL@nxnmAPj-9;%AcwRbsuGr=7$Hp@cpevgwrUejvx+52v8*kvx*~sF_x(_lR}Hv zL_Y4#M3zX9I;Bv5>S{o8liFfDG46{u+-v*a7MnpTr49z!*@2MYWkoy6+DO5D?|c?v zSRjGXvrqnfq#e8~3`#Lp+ar0~jUo2i5#g*J4XSL{MV*WMdZH55Kz;ob2(r>#`>Y&o z86P)=K(Uh>Ad7R|dHPciS>dv0$Hn6B8iH_4!0x?IP9d%z;nUScX+Bs|IQXlu;Ayav zGIlCr)Y_%V@NsiAml)vji+#CwY(errra96#51ectFG+tsSjxLZR0bX%E1+kkFM|j8Z zs2!P>7BZ$E$P@!oAZR0Wax~^1+>42OE%$aVlI`N$OkJ!f>?tPbJF7Z7Tv4o5$@yX*E_)89JF6A z^PE*rSn%}pbPzFff2kQx@Ai!tusKpUWzDBIWnijB|47=qLP6P1iv~%oqN;aA0h{`H z%IK<$o@k?m_CCo`VCH-%qDX8q#q2wsWH_l^Cb>6esL=3{>|<^NtVi2Mu(pi>^Bb;} ze$)<$Bq6L#`eJHfP?!_d~ixed8eR_9Y3=A^G`r8ibIxw=;_z*2w+|Jp8Ukl_low)w!Zh z+eC|PJcZTT#(VXKo@fLk27L*-@JD=(Y1`k1=x5TTn|7zP%Sbfm3!Ud#F5bwaFf;{m-)%$9$i-BzTqEhQ2{ zkZ`&oUs_ajE&pUh`>v7Gp}_@n3qZ<{y86JAw&8v4<^&E|>K&yqCjXW(rH-jz< zpO=ve*m{c&e;NMf=i~CJfASe#FuukhU5JdexHLDTLHJXg)0vf^kod2Qu%6W-|IRza zq@C-3g0uiu(1_WOQ%5f*lGj5r5)^XkR%pyIv)S6rHnKDpRYg|8Kn`srwAPp3)1}JV0XaY z;+V~1`_1J^Ql_Hijj+rI%8FTZyv!m}4QV$s%npiEZSvsR86CSnHglf}Wc3;#-E;r^ z6)z+=Vc_r*@R&2Tj3xAChSQzRJsuPYu6{cHt~cte4fKbHzE#^Gkc4Bp>nA#@eSK3~9OJds4W*M%P=O zQ0(oK8v^b|>=y^Ta~ymdl=cA;-UgtD%a!ikJZKw{8~g%nKobQjS@F7CFO$K&iFovi zr}h7sXm&wlB`Ao!Vqy2Z7ms736y*3R?`xAf0kQ`Kj(9S=FStJ7K(>M+gD_AH>->$Red6-wXR!3Cgx6{q=& zb2onTux%3&tZ(u|8pxlIZw#fxmH{T_K8$fXMfXs7hjSK3Jj8yfC=mi3eW}@FW;_*v z&stGY6o_V503_7i{DM1O(Wy+(T+cYGtd1wU<%l>^ad7fhcPKiw4KfY%+>K-^6>o3Y z*Rv6cW=p*H@|ySaU(?gs1>(Lhb{lD#)LZIJQh@IGk?obQ>W!fki=?zesd`yynms@@ zK+{YB1iBJPVe>l-ynbO-R$%N?OgjkfM zaEv36wB|Y9rLJC|T3h=@5-$UVrcq{ufLN1uea>=V;&2Tn;Dd*E9z$2G5fC6p?auocKsVo6nHogAKQSoEo1nlIHZDgU8(Egbgv__ zTrVdXyfJIg&W zHTf3q*E7E7$iac=L z*;${p#`(QA)+(VcSQMv&f%$m;_or4&OVPz! z-d?)xhSDebH`chs`M^&-&JUT~psr9T6uwP5olA1gNnop8dvCcig%Va{qr30P@Cj$) zP>@e{c_jP1=%3j{4UX?ORjM$VRnH7*6i%H<(ZwLn>9Z}-kz~Hpi6@@M4s5e9q zw^F17ZX6M81nP&lL616UydX=TM;wsdwq?nEtkl zfrt!!E+iLEmG(rrYr82728;L+!DQ$ld#ZJVUAcu|#*@~7mo)PoYkb}Im@BqEn*6Fy<`R9E_{)PLDpU-jZk1$4U76QNI8+t(4})Lu!n1$*%Q^ zS9|Hjec&n&d={(5YqX+*b>!EE#+>z4_e;V%(SR^YB!X_n3f%#qfXs%{flnAC=^}0C zoDf|Ef_09bmhSj`8A`Q?XE+6>hhNv!4EF+@P7V0 zO}GiTmy$WiA;mNJD02%PH&=kREsOBDIZ*73VA7fDdlv&?&9x`8;9H}2V1G=>8`iKt z(TGE}DC43!U9Qj6!;dzZ0Mb?3`ntQhaogoRYP9Xazr#Fq&3L--@0{c zbFY?lR^V=}Q|d>clZc@HGqOe4&X><=_2#%Wc3VkZXZY$Kk#%51Z)P>hd~^5e-ryO< zS!(Yg4NtAP+IcpoDR~Ad1EARpX9HXDZEX2rfVaKY&(R1Mio_b(UNXR|Dsvg*?JBFQGgV< z&E#cL(3qc_-wpm%#U1w6P$*4KJw1uK#q%>FGwX<6Q-Pg0WU@9;dyusM@x*@Dc7!tZ zU~6UEw)W=L<{9W^U1oRA29V)mAnSMd7Av0lIFY$3iVgtCr*i!$N_JY_pujkN>vbBb z&XMifBGHV-JnN)s*EH#~xVZSE< zy7FlE+S-~N*Tj5e^lYDyZ~gkqW7n04V#Q@;h}&h@gto|oIuH_OdkKaCf^DPdd=AHr z|K*?QSRsTny9EKC9ZdQ+P46EL6{q>k!~yNW@l@E<@lq$#GF@x zO{Mj4b8~A`9?W&C5H}mNfdNSf?EK~HKtTY0NJN|5;f_xWK#(6?eab(xJW&Hp>;Wa? ztBOydhRCSO_^j&0T|8*dtA^L`&k_yAsu!td;g!98K;xcuZcB|<;{9Vii32tONoK1CAI_|%88Kw?t?EYkH@hAQ94t!m8eGon%CB-`ub zgWu$Kz0kuD8$P-WzI=3c`7_jE${M+=5tMoCeBk=No&ps?sw|yqZ7c2u&xhN* zedD+J&qMWrMVCysugnpiAg&VgCoYK~)|$CF`%=6OPA&!LgT|$&!Hx6D4qI-u-TBGZ zVpYZnji7J#nT%bWOI+8FNIRh3Lk4WQgT{+L&E6$dTD%Mgtn1l-)raq^SFbdWhQ2{7 zv!Eng(=7s8;b2xhJ=If#66@>bHIX`BmB7Om{N&k*&!dx*P93kAAIdw!Hq>4@vxgUT z&rrkXwr8LVKi}{V&i$)b8vA<2&1^oKv3@=}QGpS@@tO4+LoZl45ZiE5Ap+ z)8F=3vREx!g@ilZX^uX&d7wQT-aj=ZDmu*ZS1tY9>o%Mk?XdFk;<9s+23V3ew40yP~nws{NPa0dd>M z^J@n-6EYUJzZA5%vOjefdjHq|7 zvNU6L{OWV7l@pA|V0D8o_y}5DkFbUBM5S+f$YM>7$F|O#^Y`{ZkI^?b9cRPM-l|dP zj4b$rF5hmP!AWw7+K)sD$^!)dGL5UdV@ajIS@lkc$4^ z1@`-mUNRMA#=B!Ri*-9X%t`G)fxl^(ZAhPbbiKi$s5OWfQ~ zw#&bIQW>3rz7Fdan^P=3m7ZM;0o*ml!|E!m z+xiVN^8_n~r+N?6f_z=wOADjBiS ze(&lbC6%<1v=&W> zGkp()4!!ve^z*?**m4YW|c z-E;;*$5IOz6dQD2&DJcvF@CFBG?4SqS4ouOob}1`zx^$%BGGRJbGvy{JcY_28^pb- zZNbfOr5-6=yOoocoZ`q2Z*E`8iYJIbTtF=u)2cPt8xFN%AUU~nH$T9FLq$6tMgb0s&H4v$bJeW&pU z%Xm$vYrYj5C7miBwazHrs@9_gb<){HBM`MUDXktHiytjNC>oN@egXg@gTFt?#9~{w z0&aytM0Pq&ph6$*>(x?$eM^Oxbpe+Sryi7T117Vx=>>BexS}9KrY9C zYCj|P%!ZBMV){=fPW}y^qHw8W_6g+Q>&N;Q6|3&sW?6Q1%3z|eO*_y=++FBPggd6t z@V`Hgg432f{(SD6kG%O>HT(GYfiM;TlZy@9F?~NXn*@DN8;0FYE5m=cPMKie4-S2$uqFx{GJ$1QN& zcztJN=u;+xu2wM5wXb6=>Xwt~?5N>un*Y_<66Mv5EEx0c1sr!*bhF0kllS#Z9v&ol z(-C`U-?Oa227UGoS51{AJ3eVXfO+1oOfR)SMv^1u;+(niIi~>glpak=fmM8``)Qdx zaL^)>wS(luMj8Tfx*)s19!l!TXtq58j5!<7ilrEpsU6JQ&J9>^rg5E@tC_Hw0BIm9KI6%D% zyr(vbzb&kvt`vjM%Ycvmylwco7FdYj6g(MduVI6KpKgn*KjHTqt-Q=}e&cRT7HXl~ z?jiPo;v``Ci1aJG%Cgx9Mbj}bFv#RN_K0+fi79H!T?STg^7SnfnO(Ib*6VGMLVW}~ z5^!@L3?ne#-prSiE40G4cB)oG)mDI_Fz8a^P6%ej>g1vw7V=4oQ~Z2_U2jkY+Ew5mobl@(HcC)a8ucPJyaB zdspDm`7i~8A&SaQJ|{YFeygb*ucD%YTh{zb$kuR3pZN!w)9hl|)IzcV${JvOpzZ=M!vQ3peH}hRIz4$kNuvzNP8-)6(8&F9ID+UD0v(o{P zMnqr=yTVE*#RLTz<+OxzN}=hw&Nvycy8J7H^ z)nQD}^=aH)cmd1YjS!8i@+BTPV4{n<7N9WPIa1B8VfAECx(9aWY6LjSr~(;qzFUE6szgx8XG zy*y>k4-F5qdP55V;=+(X&HLyG-?HMfC~7bl0Q@4G0F*A!;qsKgHNp5SD;lCIV*Blp zT`LsSqj8+VJlNukSbGuf*&3A{-TCGArRSEwr`3Js08NRVlmql+X9-rmFH~_mZ3;F& zeR(X80SlHN^$$pw! z0xJ&Hhtjs5ksPeVJd&UJ@B_{!Q_E)lKxHaq_9)k^V$6iWOyvVz2GM)4_SngWELa0Z zVe#)qIMtO)1ly?j)g1=Di!luX5-%oKNX2K<%ig`o6EGMV>;oqd?T6_-<8sn1>e3CQ z*Vy-Ks0-^HcTnv@uoZ>cmT-SRzcn8&&$wf34gvW%91Ea)$v8a?&a|bB*Bi1smjzpo`!(-URyw7&g92;c0!eNOHalTn9@M8XF(i za)|tTQW?e^^*}Y;FLTRnj2n%auq{-QC?_ z!nPmtO4haq(4to=FxQ@?tN8j@#n)%Mh0#IpCxEz_CHszZ2S~uvMPfk@vFo;P?Sg@} z)9Ox#kmsj+S5C8Trk>@U^hoAdssfbHvV6oMpK}h$Y2KYC7odEqk~sqf_7e}jKZB$@ z%}kj^Eg(X%Y{ts4_;W>HT_f0o$>}#-e>vm8=cZ$HPIRzW)X;h~OaYXsZ6OytCz;dO zcu)xOWb*uY6{%p9bWW%&+kPV$07ZR*lXi@(Tp)cO@iXt$02noDqbUIH=wd?gLCFLN(x+{uD5gb*3NamWv|)BJY_=SV0Q4JC z-O#|)04YcYBu1DH1ioFO#kq~&tH!~J@a7#6BTIZb?7(Q z#+4uj1@6IVnV1Ko042_r=oOn$^ZOBT21$1k#aBh~1Q-Iq^cJN@dq~U|P8&UZa7FPkO&?N_9DnF&^xeS)xA6u?}Obx2kg=Ed1}z`qYMTieIfoIhzP!=(<}Zy6Mp3F4s6@O_3t z0q5_vf=!sHjrfy&7>9B?v97kkHF|G&X^S{s>4DE%NX7p(>Odzv&#&@<-n^aLr)856 zpu^=Fpe3CZeLzBLZ9UB8nEv88UQ7&pFgVx#Aijx}3PRaxsH@9cM#3K;z@?U%G;moK zOCbHvRVPnWhg|hUg+bYK%qop+R87(PE({9a;mt&ZO<1)heZfD@g3xlyEOVw%wLKgM z^9m8`an{f?hx6qD-Qgi604u5tfMM@qX(+|Ms<^XqY5wA)Gd$~53*-Vk`R@Sc z9^?ZG1^c7us8f`UT$NS8|R2I_R%FrJ<=l)vc?8I7UWms8v`NrU{^@ zstijCRkVEQeoMMJxK&DYM13W|_5#YmA69lpkP8Nh%k;PS_9F4uUa_WFY91QNem@dUtb?J2Fw@`OM4AHwSr!DPH-x9 zX`fC&+j=nn0fh?RIdZC)DjcGOxB81_*i{_sKn2T>kYiRufblk0MJpR!>)^_OHxJ#3 zhwPK7U8s$)Oer(}p-?5THRwj0C!r7r6<$d6o@1Ujn31c^$bFC|e)1|X7%a{Q*=TIR z0^}G)H&2-;S>X0)JoDB42uhvs5RrBE&26toso2`$pndq6>4CvP7I$j&6lATIIuobR zxWfw65y&+awTxygDp*|=_JH;O{^}kkL`IaEC|~Fqkp97Z)dJJS?2*H$!$HUi7^O5< zku_>nRqH!oi(?R6c?2H%;X zSFFf&u3ksJ?8gA7>_oBq!8q69`c#cuw*rX3n5pHEW zhp?G{)Z;(wmPf?-vM&KdZ>i!+q(DfuAYq^KrEl?CI>lLz4K)e~9?Sdr(veU$0bOi} zgS)b02i&5)neTm_Pi8cT6seUhcyfbHIy!Cqn6sqnz+YA6FlS9sFb=*KWO{aIeV~bgNrJ&&%BR3If&(X|F}0&kPLO{kg4F|GhWhkCWLDBJ1P5D~!xw zpNQ2O62@N#03z9~V*a7&x8ZOmuFwYMC;Dw>YdvH?*eVwV(BJ+&OAv_Y9>jss?aW|^ zeopVXt>w{y{|JYih0>5(#2tXNtBPDKw+A?ZErZqnQcYxWB@om|fm`{s9;u+!iO?KQ z>EnQ!mkKrDbNz-2Oj|+=-@oyBd6%%+BR~q)C)o~fzB=)_H3(v7kdLD6I)!qV4ERMnkj+l6af}cJT->(MC4bB)!n!7Y{HGd z)Zi_=4!p^=N8M>kEQd!8xP-mDpKN_nuIJdBT1&=l|Q0 zjsJVqXPtP?$fNsoFe}hgRXD4_a+s4()34)GQ!WyuP8lq+>;o)vDqcusYkthRZ2e0a ze8p3YFgSR{@f1+xwyGb)19;)TrsEO!|6LRKk zR#mylEQdcW^ko6oWd4Euoz72okf*nIsqeFAMZpqQ_d;OaQ{J;sLGkQ@u6N zdLdz$Jeh+pHOy(yMo~>sDCZ`h2v)P3H8`V}Av0E&0o%jg!4w zWhS2LjP@Yrlw%rJRq6x(`o-Y~hIq0Pqb!E<>*`DuY;@uUFIIYCe0FK;~D zn_o-WOddEwa7amU7@b|-B5*D7bwI6bb0$xgK#-ko_~OquuBIMg8Sp*l2z%q^J?x|) zS9;7R!ZI$ueQ~1F!_*^xuP`+ti}2SIa`*6=Ti)`fZOTfN-LnM>6zHbJ98y%P)*(ih z%e~N8oCu*><2A-$+4yHD4y>X`;n@l@esqN7E_Z3yB7yJcY|e_SgK5dhk@4|8B`r)0 zT}6tQ@)X@zJ-(^FLJwDjuaww9Z5PWa?Tt3s696J&Ra`YTAD*zBE9V^-RW6v3R_<#! zbQ^zYf5;JAYZd<-M8C0u>;ob5c(jo8Ut{YihzaK*t zktb|o4(2ectFxwO`@QOXiCHFEL{LocWKp}Sg3IF@DhiWNFyqjn)2%aUFfJ3g|DNBk z;SVqb|KWzI@zgFQC7<%zi)ZWpW?1fZU!gmFtq{RmN4r1^7qK8y4Zj&%+aLPPaQ-QUqE`j=7WT z*JG5j2LVN7LTtK9w=6s0vPOYbginb|c$om3j0VY^wa*hKlX?cmzlavloq8koTUDKo z`1Ni_WUvqVZpq{H_ug|~G98*I8aM~k?FO!Td6Z&=_~|#_B`o;Iii>cKU)_5Av3vnz z#G(EV2eKtfe?Qr7xgTFkPJXs$nx*OHfOQYk>J$vCNVw5B9jv^V$<?7W1x7hjXB&Mc70wThfd7Tx*eC0YfVYPh3>w@)hX>LvPO z&Cqwo-HsJ$iat=<^<#E){2VWg`AdG|V~Sib_3`YUZ*>A{-UEfJ%N7Rie>D8(I>a*( zhH^(e@7_H<-hOz01O$`Wm)P4hNCv~{gxuI-J6fGjd3xPS<7k%5=o4ItL(I#wlflmU ztrHfgH%@Kw{^gdP+Z>SX*;(<~oXf|NUL+;mfn0U4+S;CPVt3LusIIflT5P+Xo#y zN^waqPIxW>V1OOf|HD5;O6O z+qWOzj(M3@1yFfyQXUDv(5oXbCKUsV-hEn*E^m%}BY$`%Cj&rbUP1253~Fo7@S1DP zgwAKQcHS+LS*-pw`mCxKVJ5XKh zD})j!FjUHbK8MLhm9JIZI8wWk;b&s}va%(uZGhd^c<1b2SV@8P$$AG};^WJk^mIt( z)1K(^O*^p)qU|MfMc;jIo1I?INo?~;lRQafhta1gDV2ejZ zx>Y<%7rZ}}wvW!Aw%;FVrJYF#dOAAk^I_Q!YwH{;K{+03KTrEIJAbWEIfu0=^;}hKc0X^)W#~K`%^{?^l$^pOSZzWWD(j z{p0#Mw;N6@8>$Qx_!B$1OAtLuiTv5AT z$1-!|3I4rl2jh&Nab!{RtEA^Yz#)5ymknwM9(gMT!AT?$iy};#RUDF#XCU?Ex$@h_ zQg0JX!D7W;vDsIAd$*;rW6ZZSC~vOkv(&l~-mtENlR5L9x+v1Uo)JxLz3_yr-uyb{TE&xmqH$!rcVRs+Ps?xhjLDfuAsUDfB}fTD|>49 zk8wql1^=zjyH8F`ae#)cD$Z_oF3de4u8)9%v5$o<l=()OTbJkRn4Pa58D=Oc^jnn82Kz zT6%lEalYv=MIxQtRhnNnaxGy+C1*PsS~uts(Nn(d>Tt>Gh^H~O@QH@-^MISV0B^bM zTMd^5<@g9+#Q?h-a2V-Ng;MuIAb5OcA@GPp@OJr1F*!J&Rb~D2JHJ?IjeFKhsj;-x z+-~Lj$e3?EK0?qlI?a}2`EERl$KDP?jnYcBv^6#B6&zIEmIS}ym1 zwvhJl9>)c;pmYBHkbtmY2CjW)+%gIK@JDs6Vi^$^}9**J6nYDV#*z$GUCNbiS#oKug)c);$+CV{m2bLot z0;yEz2|4Y3`Et&@jiuPQ@yDa=$n1-Ar>>IQAiqo_T{Rq((t~S{TgIE1Z2o!Yr~Fib z81^-2%2eL2;!nPXRvwTVM$>#PAN6HYr)4~q!N6gg#?6jpAX*5P-pJCD_1(Ppf?2~M zX~%CWU-9AI%Plt;ytD10Nl?Mzw}I~InQ}@vc=L;P2;@@N0Byz8nar5OhuSo3&3%1o zudOF@S3zR=>CrtVVZ^0g05-u)60thRD`ihO@rZKjPi4(YAR)pA{Q?Z+FZ1n@qkg~S z_?HqBH!oI3b#CV1HhyPGN!3m|LpOHFX|R=E4XE++G@gaN#8KtH5neyOO1>*6+c-eE zj4EVimT&#AInwz(Q^4j!Ws8Kp{~>bTg0rt@U6pb7IOhEPVv=^S#ygiVV9%lXS>-JgNFM%H$U-S$O%a0xXRBJkAZ+WJ%Nd8rb zN51z5+G)o+{DQ={w&=}N7TA^4XZmWl1}cB0E(=oIPrG%TPpXQw>~Wyrb?7|cOOGux zemyStYVQs^-Qntivn)k-gc`C`-pu*|!arkdJt|BVc{+)6I{Bkaf9zG_uG8x*L+qVRqYIq;#EEg{f^5g`;~rumYYm=GF)22UXp^Sg&p5) zYSKxey(Z+fAFdKnL{UJ}gC(jC6ugrsc5R6E&g6wByd5B*?Y0gYdq`HOJ^wp0fZ=)Q zspF8SD17JADVf{zx2ot84ssxGFLoW=_zHuUf)vphQc5isi6jCRs&~!vo$DS>QBK9a zaL%Q)PdA9xk4$$S*BoYApufbwf;M(j6ma_+1BNNiDlUrX8tB5bSSH8tK&0uFS2(rK zsNib1^t-BvsuHi~v_o_JYj@$~t#1Z$lr;ql^;8fRxhM~EPMnV z9+MxRal_mzl6dY5B@N~weY*>6Qi|K^=9qs&#q>T2zQOJ6w|51Uz~}FaR0Z>THk1o& zIlh+{LR%L^n3B8;@;{Yu{X1J3xV5=iwNTu~`RN~r1-_t&y0AxzP%5hJ6x@3V998A_ z0S@NdZ}%A(_-KR~&vXq)|C|Ka8h8WnZz{9sy5)+7XL zS14G<`vLgvYTG$*0C1Wc*0@aph|AcCg;VD%PsSUTHc$BnNz~m-mvi_(TbmO0H%J^Ob1{dZz|F)KFA-CJ{QO=S8ZGs~|pJ<`{CW?d4~i3nJ~?~7>q zdduzKR!oqyt^f6MdG4Rat2e~Y&#_!>dh^R1zLgjC8qZzvD${*A_01bG?%%t1wQbwC z@1S%3-m6=G>;7GQDByeQ^w?+fs$OY6SN$C$+Ved2{@uH;KP@dN1x|G>Zk7C916=Wu z*uGddOkuk!vvuu>$g}Tqj{lXGezPq8#=ig!OW6&(QloOk%YmCwf&I$Mzs2Y<@u9eYm;NU)_++%XQk(ECe4^{w{dw_%30C5>-4OpeGKzkk-%^6cM**}Ogb zzB&JF*-|T}_2q?KXI1rnGlz4l4_^$L-)j2t{kFp&fmLO*?y}vd$@?2>`JVm}&q3 literal 0 HcmV?d00001 From 083ceefcfb57a98440f710b21f7ab4691ac2e1ee Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 22 Mar 2023 20:31:56 +0800 Subject: [PATCH 009/625] =?UTF-8?q?REPORT-92160=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E9=83=A8=E5=88=86-=E6=96=B0=E5=BB=BA=E6=97=A0disable=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataTreePane.java | 2 +- .../main/java/com/fr/design/menu/MenuDef.java | 33 +++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 57ad09d0e7..149fa87dc2 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -229,7 +229,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { private TreeSearchToolbarPane initToolBarPane() { // toolbar addMenuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); - addMenuDef.setIconPath("/com/fr/design/standard/addpopup/addPopup"); + addMenuDef.setDisabledIcon("/com/fr/design/standard/addpopup/addPopup", true); createAddMenuDef(); // 创建插件监听 createPluginListener(); diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index 798d4870af..ee82d256ec 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -3,25 +3,32 @@ package com.fr.design.menu; import com.fr.base.svg.IconUtils; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.imenu.*; +import com.fr.design.gui.imenu.UIHeadMenu; +import com.fr.design.gui.imenu.UIMenu; +import com.fr.design.gui.imenu.UIPopupEastAttrMenu; +import com.fr.design.gui.imenu.UIPopupMenu; +import com.fr.design.gui.imenu.UIScrollMenu; import com.fr.design.gui.iscrollbar.UIScrollBar; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StringUtils; -import java.util.HashSet; -import java.util.Set; -import javax.swing.*; +import javax.swing.JMenu; +import javax.swing.JPopupMenu; +import javax.swing.JToolBar; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; -import java.awt.*; +import java.awt.Component; +import java.awt.Dimension; import java.awt.event.ContainerListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Define Menu. @@ -46,6 +53,7 @@ public class MenuDef extends ShortCut { protected Boolean isEastAttr = false; protected char mnemonic; protected String iconPath; + private boolean needDisabled; protected String tooltip; //item List. private List shortcutList = new ArrayList(); @@ -112,9 +120,19 @@ public class MenuDef extends ShortCut { } public void setIconPath(String iconPath) { - this.iconPath = iconPath; + setDisabledIcon(iconPath, false); } + /** + * 设置不可用图标时,注意传递路径问题,若路径为"view_normal.svg",请传递"view",不带后缀 + * 读取disable图标的文件名应当为"xxx_disabled.svg",也是项目中的svg命名规范 + * 注意必须是svg图标路径才能使用此函数设置正常和禁用状态 + * + * */ + public void setDisabledIcon(String iconPath, boolean needDisabled) { + this.iconPath = iconPath; + this.needDisabled = needDisabled; + } public int getShortCutCount() { return this.shortcutList.size(); } @@ -183,6 +201,9 @@ public class MenuDef extends ShortCut { if (createdButton == null) { if (iconPath != null) { createdButton = new UIButton(IconUtils.readIcon(iconPath)); + if(needDisabled) { + createdButton.setDisabledIcon(IconUtils.readIcon(iconPath + IconUtils.ICON_TYPE_DISABLED)); + } createdButton.set4ToolbarButton(); } else { createdButton = new UIButton(name); From be3c8395be08a09eaf08d75c6db2718fb0b211ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Thu, 23 Mar 2023 09:35:36 +0800 Subject: [PATCH 010/625] =?UTF-8?q?REPORT-91503=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=A2=91=E7=B9=81=E6=8A=A5=E9=94=99=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E4=BF=A1=E6=81=AF=E4=B8=8D=E4=B8=80=E8=87=B4=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8=E8=BF=99=E4=B8=AA=E5=BC=B9=E7=AA=97=E5=8F=A6=E5=AD=98?= =?UTF-8?q?=E4=B8=BA=E4=B8=80=E5=AE=9A=E4=BC=9A=E5=A4=B1=E8=B4=A5=E3=80=82?= =?UTF-8?q?=20=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=8C=96=E3=80=81?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index e82251f4b8..e7d3c3dca3 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -35,12 +35,12 @@ public class TemplateUtils { /** * 创建新的模板文件并打开模板 * - * @param prefix 模板文件名称前缀 - * @param file 模板文件 + * @param prefix 模板文件名称前缀 + * @param file 模板文件 * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 * 为true时以CurrentEditingTemplate为准创建新模板 * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 - * @param openNewTemplate 是否需要在创建后打开模板 + * @param openNewTemplate 是否需要在创建后打开模板 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); @@ -49,13 +49,13 @@ public class TemplateUtils { /** * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate * - * @param prefix 模板文件名称前缀 - * @param file 模板文件 - * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 - * 为true时以CurrentEditingTemplate为准创建新模板 - * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 - * @param openNewTemplate 是否需要在创建后打开模板 - * @param doAfterCreateTemplate 创建备份模板成功后调用 + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + * @param doAfterCreateTemplate 创建备份模板成功后调用 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { String fileName = file.getName(); @@ -65,7 +65,7 @@ public class TemplateUtils { return; } String suffix = fileName.substring(indexOfLastDot + 1); - FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); + FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); fileChooserPane.setFileNameTextField(prefix + fileName, suffix); FileExtension fileExtension = FileExtension.parse(suffix); fileChooserPane.addChooseFILEFilter(new ChooseFileFilter(fileExtension, ProductConstants.APP_NAME + Toolkit.i18nText("Fine-Design_Report_Template_File"))); @@ -91,7 +91,7 @@ public class TemplateUtils { protected Void doInBackground() throws Exception { // 读取模板数据 byte[] content = getTemplateData(createByEditingTemplate, oldPath); - try(OutputStream out = file.asOutputStream()) { + try (OutputStream out = file.asOutputStream()) { // 加锁 WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); out.write(content); @@ -124,19 +124,20 @@ public class TemplateUtils { /** * 读取模板文件数据 * - * @param readCurrentEditingTemplate 是否读取当前编辑模板 - * @param path 模板路径 - * @return + * @param readCurrentEditingTemplate 是否读取当前编辑模板 + * @param path 模板路径 + * @return 模板文件数据 */ private static byte[] getTemplateData(boolean readCurrentEditingTemplate, String path) throws Exception { byte[] content = new byte[0]; if (readCurrentEditingTemplate) { - // 从当前编辑模板中生成备份文件 + // 从当前编辑模板中读取模板文件数据 JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (JTemplate.isValid(template)) { content = template.exportData(); } } else { + // 从给定的模板路径中读取模板文件数据 content = WorkContext.getWorkResource().readFully(path); } if (ArrayUtils.isEmpty(content)) { From 9f0f3de839867f4de9640c053c3bee0bcf521a7b Mon Sep 17 00:00:00 2001 From: obo Date: Thu, 23 Mar 2023 11:30:02 +0800 Subject: [PATCH 011/625] =?UTF-8?q?REPORT-92304=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E4=B8=89=E8=A7=92=E5=BD=A2?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/constants/UIConstants.java | 20 +++++++++--------- .../icontainer/UIEastResizableContainer.java | 19 ++++++++++++++--- .../mainframe/EastRegionContainerPane.java | 5 ++++- .../fr/design/images/control/down_arrow.png | Bin 218 -> 0 bytes .../fr/design/images/control/east_arrow.png | Bin 241 -> 0 bytes .../com/fr/design/images/control/up_arrow.png | Bin 190 -> 0 bytes .../fr/design/images/control/west_arrow.png | Bin 242 -> 0 bytes .../standard/arrowlinear/down_arrow.svg | 3 +++ .../standard/arrowlinear/east_arrow.svg | 3 +++ .../design/standard/arrowlinear/up_arrow.svg | 3 +++ .../standard/arrowlinear/west_arrow.svg | 3 +++ .../com/fr/design/standard/fileicon/minus.svg | 6 +++--- .../com/fr/design/standard/fileicon/plus.svg | 4 ++-- .../fr/design/standard/floatpop_normal.svg | 13 ++++++------ .../standard/poparrow/pop_down_arrow.svg | 10 +++++++++ .../design/standard/poparrow/pop_up_arrow.svg | 3 +++ .../standard/preview_down_icon_normal.svg | 3 +++ .../standard/triangle.arrow/down_hover.svg | 4 ++-- .../standard/triangle.arrow/down_normal.svg | 2 +- .../standard/triangle.arrow/up_hover.svg | 2 +- .../standard/triangle.arrow/up_normal.svg | 2 +- .../design/cell/bar/DynamicScrollButton.java | 13 ++++++++++-- 22 files changed, 85 insertions(+), 33 deletions(-) delete mode 100644 designer-base/src/main/resources/com/fr/design/images/control/down_arrow.png delete mode 100644 designer-base/src/main/resources/com/fr/design/images/control/east_arrow.png delete mode 100644 designer-base/src/main/resources/com/fr/design/images/control/up_arrow.png delete mode 100644 designer-base/src/main/resources/com/fr/design/images/control/west_arrow.png create mode 100644 designer-base/src/main/resources/com/fr/design/standard/arrowlinear/down_arrow.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/arrowlinear/east_arrow.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/arrowlinear/up_arrow.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/arrowlinear/west_arrow.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_down_arrow.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_up_arrow.svg create mode 100644 designer-base/src/main/resources/com/fr/design/standard/preview_down_icon_normal.svg diff --git a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java index da05a79dd5..eba4a5634a 100644 --- a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java +++ b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java @@ -153,10 +153,10 @@ public interface UIConstants { public static final BufferedImage DRAG_BAR = IOUtils.readImage("com/fr/design/images/control/bar.png"); public static final BufferedImage DRAG_BAR_LIGHT = IOUtils.readImage("com/fr/design/images/control/bar-light.png"); - public static final BufferedImage ARROW_NORTH = IOUtils.readImage("com/fr/design/images/control/up_arrow.png"); - public static final BufferedImage ARROW_SOUTH = IOUtils.readImage("com/fr/design/images/control/down_arrow.png"); - public static final BufferedImage ARROW_EAST = IOUtils.readImage("com/fr/design/images/control/east_arrow.png"); - public static final BufferedImage ARROW_WEST = IOUtils.readImage("com/fr/design/images/control/west_arrow.png"); + public static final Image ARROW_NORTH = SVGLoader.load("/com/fr/design/standard/arrowlinear/up_arrow.svg"); + public static final Image ARROW_SOUTH = SVGLoader.load("/com/fr/design/standard/arrowlinear/down_arrow.svg"); + public static final Image ARROW_EAST = SVGLoader.load("/com/fr/design/standard/arrowlinear/east_arrow.svg"); + public static final Image ARROW_WEST = SVGLoader.load("/com/fr/design/standard/arrowlinear/west_arrow.svg"); public static final BufferedImage DRAG_BAR_RIGHT = IOUtils.readImage("com/fr/design/images/control/barm.png"); public static final BufferedImage DRAG_BAR_LEFT = IOUtils.readImage("com/fr/design/images/control/barl.png"); @@ -172,24 +172,24 @@ public interface UIConstants { public static final Image DRAG_LINE = SVGLoader.load("/com/fr/design/standard/dot_line_normal.svg"); public static final BufferedImage ACCESSIBLE_EDITOR_DOT = IOUtils.readImage("com/fr/design/images/control/dot.png"); public static final BufferedImage DRAG_DOT_VERTICAL = IOUtils.readImage("com/fr/design/images/control/dotv.png"); - public static final BufferedImage POP_BUTTON_DOWN = IOUtils.readImage("com/fr/design/images/buttonicon/popdownarrow.png"); - public static final BufferedImage POP_BUTTON_UP = IOUtils.readImage("com/fr/design/images/buttonicon/popuparrow.png"); + public static final Image POP_BUTTON_DOWN = SVGLoader.load("/com/fr/design/standard/poparrow/pop_down_arrow.svg"); + public static final Image POP_BUTTON_UP = SVGLoader.load("/com/fr/design/standard/poparrow/pop_up_arrow.svg"); public static final BufferedImage DRAG_DOWN_SELECTED_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/downSelected.png"); public static final BufferedImage DRAG_LEFT_NORMAL_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/leftNormal.png"); public static final BufferedImage WATERMARK_BACKGROUND = IOUtils.readImage("/com/fr/design/images/dialog/watermark/" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WaterMark_Background_Icon_File_Name")); public static final int MODEL_NORMAL = 0; public static final int MODEL_PRESS = 1; - public static final Icon ARROW_DOWN_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/arrowdown.png"); + public static final Icon ARROW_DOWN_ICON = IconUtils.readIcon("/com/fr/design/standard/arrowlinear/down_arrow.svg"); public static final Icon ARROW_UP_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/arrowup.png"); public static final Icon YES_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/yes.png"); public static final Icon CHOOSEN_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/select_item.png"); public static final Icon PRE_WIDGET_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/prewidget.png"); public static final Icon PRE_WIDGET_NORMAL_ICON = IconUtils.readIcon("com/fr/design/images/buttonicon/prewidget"); public static final Icon EDIT_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/edit"); - public static final Icon EDIT_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/edit"); + public static final Icon EDIT_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/edit_pressed.svg"); public static final Icon HIDE_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/hide"); - public static final Icon HIDE_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/hide"); + public static final Icon HIDE_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/hide_pressed.svg"); public static final Icon VIEW_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/view"); //public static final Icon VIEW_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/view"); @@ -221,7 +221,7 @@ public interface UIConstants { public static final int BUTTON_GROUP_ARC = 0; public static final int LARGEARC = 6; public static final Stroke BS = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 2f, new float[]{3, 1}, 0); - public static final Icon PREVIEW_DOWN = IOUtils.readIcon("com/fr/design/images/buttonicon/prevew_down_icon.png"); + public static final Icon PREVIEW_DOWN = IconUtils.readIcon("/com/fr/design/standard/preview_down_icon"); public static final Icon CLOSE_OF_AUTHORITY = IOUtils.readIcon("/com/fr/design/images/m_report/close.png"); public static final Icon CLOSE_OVER_AUTHORITY = IOUtils.readIcon("/com/fr/design/images/m_report/close_over.png"); public static final Icon CLOSE_PRESS_AUTHORITY = IOUtils.readIcon("/com/fr/design/images/m_report/close_press.png"); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index f00fbee498..ff75221627 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -5,10 +5,22 @@ import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.SvgPaintUtils; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.LayoutManager; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; @@ -313,7 +325,7 @@ public class UIEastResizableContainer extends JPanel { @Override public void paint(Graphics g) { Image button; - + SvgPaintUtils.beforePaint((Graphics2D) g); if (containerWidth == leftPaneWidth) { if (model == UIConstants.MODEL_NORMAL) { button = UIConstants.DRAG_LEFT_NORMAL; @@ -328,6 +340,7 @@ public class UIEastResizableContainer extends JPanel { } } g.drawImage(button, 18, 7, this); + SvgPaintUtils.afterPaint((Graphics2D) g); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index b033fa6171..00405d6093 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -19,6 +19,7 @@ import com.fr.design.notification.SnapChat; import com.fr.design.notification.SnapChatFactory; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; +import com.fr.design.utils.SvgPaintUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.log.FineLoggerFactory; @@ -1313,7 +1314,9 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } else { button = UIConstants.POP_BUTTON_UP; } - g.drawImage(button, ARROW_RANGE_START + 8, 4, 16, 16, null); + SvgPaintUtils.beforePaint((Graphics2D) g); + g.drawImage(button, ARROW_RANGE_START + 8, 4, null); + SvgPaintUtils.afterPaint((Graphics2D) g); } } diff --git a/designer-base/src/main/resources/com/fr/design/images/control/down_arrow.png b/designer-base/src/main/resources/com/fr/design/images/control/down_arrow.png deleted file mode 100644 index 26a780d5e2858e01e9c1fa4baa98674754d3a238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|rg*wIhFAzD zCrGef;cZ;DOzm!48=G;=vZf~vSreYloM8F?-`~e9k8~YeznyrbU>2~M*@JHhTV$W) z%;E|G%P#T*`y{`|HCuZ`jas?fP|j=WB;M&NOaxlyYcm zFljiF@MhPpUCjoj22!gT6+Bl=4sX1n(7Yj&?c_sN2j?>m66+TQdY*D-U?}x+agbD+ RQU`P&gQu&X%Q~loCIE&}SR?=d diff --git a/designer-base/src/main/resources/com/fr/design/images/control/east_arrow.png b/designer-base/src/main/resources/com/fr/design/images/control/east_arrow.png deleted file mode 100644 index 918d75a9f910fdabb1e3f79faac235803684e51a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(rZQhFAzD zCrHd&uyUp6_Js=%_DI|}Obq_={=U7R!aXLF6LPa{Hc1#8u^+Q5cyJ&%J^gub{l7nv zyoTd0x1ULBNs1z{BnPPeK_;WW`*escQa&5EYLo5{CGBl zhCpNE&aT#0RS^m8qa90 diff --git a/designer-base/src/main/resources/com/fr/design/images/control/west_arrow.png b/designer-base/src/main/resources/com/fr/design/images/control/west_arrow.png deleted file mode 100644 index 5693190f9646d3cf5fca20ff24bf9d114e07c833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|)_A%&hFAzD zCrC&xSh(=unw2X(#b@Ww+`y^S&1h=<=lAz~Zh>N@?!z}Kco}YG@n6}|)!M2ml5s(E zhFZ!j!I{lx*fRfpette{!n0kwb~T?UI+3%6t>F((k(uIIh2{@cj5pO{a?)~y*!g5C zUcGr!!}Ww!U~m2Zf9*G}G#=R?#W0B>Q|Xw%9JT{Ig(W36f4{%Kf7Ria!iiLc!W0Js po(9IMhR)8D>>c}+vt`_J820A+P5iQ={VdSk44$rjF6*2UngD4wV8H+Y diff --git a/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/down_arrow.svg b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/down_arrow.svg new file mode 100644 index 0000000000..fc5d318bf7 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/down_arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/east_arrow.svg b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/east_arrow.svg new file mode 100644 index 0000000000..b4b54dea89 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/east_arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/up_arrow.svg b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/up_arrow.svg new file mode 100644 index 0000000000..cf615f3f37 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/up_arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/west_arrow.svg b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/west_arrow.svg new file mode 100644 index 0000000000..d5260bfd0f --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/arrowlinear/west_arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg index 067df99f84..db4e76f2a9 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/minus.svg @@ -1,3 +1,3 @@ - - - + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg b/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg index c2b0e9d9c4..f012490aee 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/fileicon/plus.svg @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/floatpop_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/floatpop_normal.svg index 95806104dc..a9e45f1c8d 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/floatpop_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/floatpop_normal.svg @@ -1,9 +1,8 @@ - - icon_悬浮元素&三角_normal - - - - + + + + + - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_down_arrow.svg b/designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_down_arrow.svg new file mode 100644 index 0000000000..8e4260b37d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_down_arrow.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_up_arrow.svg b/designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_up_arrow.svg new file mode 100644 index 0000000000..5c797c1f03 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/poparrow/pop_up_arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/preview_down_icon_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/preview_down_icon_normal.svg new file mode 100644 index 0000000000..da4dd8c300 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/standard/preview_down_icon_normal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg index f83d881a5d..68870b99dd 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg index 478b58eba7..db4e76f2a9 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg index 67045e796a..1b7312ff6e 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg index 2297284274..f767fbcf31 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java index 20bb70d668..b250119510 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java +++ b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java @@ -1,11 +1,18 @@ package com.fr.design.cell.bar; import com.fr.design.constants.UIConstants; +import com.fr.design.utils.SvgPaintUtils; import com.fr.general.ComparatorUtils; -import javax.swing.*; +import javax.swing.SwingConstants; import javax.swing.plaf.basic.BasicArrowButton; -import java.awt.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Insets; import java.awt.image.BufferedImage; import java.util.HashMap; @@ -62,6 +69,7 @@ public class DynamicScrollButton extends BasicArrowButton { private void paintArrow(Graphics g, Dimension size) { + SvgPaintUtils.beforePaint((Graphics2D) g); switch (direction) { case SwingConstants.NORTH: g.drawImage(UIConstants.ARROW_NORTH, 0, 0, this); @@ -76,6 +84,7 @@ public class DynamicScrollButton extends BasicArrowButton { g.drawImage(UIConstants.ARROW_WEST, 0, 0, this); break; } + SvgPaintUtils.afterPaint((Graphics2D) g); } From 83ecaed30f28ba13630f5c594283ea284eb3e686 Mon Sep 17 00:00:00 2001 From: obo Date: Thu, 23 Mar 2023 12:07:02 +0800 Subject: [PATCH 012/625] =?UTF-8?q?REPORT-92304=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E4=B8=89=E8=A7=92=E5=BD=A2?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=9B=B4=E6=96=B0,=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=B8=8BSvgPaintUtils=E7=9A=84=E5=A4=84=E7=90=86=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/icontainer/UIEastResizableContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index ff75221627..c8cfadd0fd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -325,7 +325,6 @@ public class UIEastResizableContainer extends JPanel { @Override public void paint(Graphics g) { Image button; - SvgPaintUtils.beforePaint((Graphics2D) g); if (containerWidth == leftPaneWidth) { if (model == UIConstants.MODEL_NORMAL) { button = UIConstants.DRAG_LEFT_NORMAL; @@ -339,6 +338,7 @@ public class UIEastResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } + SvgPaintUtils.beforePaint((Graphics2D) g); g.drawImage(button, 18, 7, this); SvgPaintUtils.afterPaint((Graphics2D) g); } From 6c34870789d45bfb4eacc25eec6348455a3ced1b Mon Sep 17 00:00:00 2001 From: loy Date: Thu, 23 Mar 2023 13:50:45 +0800 Subject: [PATCH 013/625] =?UTF-8?q?REPORT-92325=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E8=BF=9C=E7=A8=8B=E8=AE=BE=E8=AE=A1=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AF=BC=E8=87=B4NPE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/vcs/common/VcsHelper.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index 0c8924e9d0..dd7187be23 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -68,7 +68,11 @@ public class VcsHelper implements JTemplateActionListener { } private VcsHelper() { - legacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); + VcsOperator op = WorkContext.getCurrent().get(VcsOperator.class); + // 开了设计器启动页面时一开始取不到VcsOperator,通过下面的切换环境事件再取,这边判断下 + if (op != null) { + legacyMode = op.isLegacyMode(); + } EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { @Override public void on(Event event, Workspace param) { From 006ae013d30f39735859f7150c8882786fb788da Mon Sep 17 00:00:00 2001 From: loy Date: Thu, 23 Mar 2023 20:09:39 +0800 Subject: [PATCH 014/625] =?UTF-8?q?REPORT-80651=20=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=AE=A1=E7=90=86=E9=87=8D=E6=9E=84=E4=B8=80?= =?UTF-8?q?=E6=9C=9F=EF=BC=88=E5=9C=A811.0.15=E4=B8=8A=E5=9B=9E=E6=BB=9A?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revert "REPORT-92325 修复环境初始化之前调用远程设计接口导致NPE问题" Revert "REPORT-92308 版本管理可用性判断逻辑适配新模式" Revert "REPORT-80651 模板版本管理重构一期" --- .../design/actions/file/PreferencePane.java | 5 +-- .../DesignerFrameFileDealerPane.java | 9 +--- .../mainframe/vcs/common/VcsHelper.java | 41 ++++--------------- 3 files changed, 10 insertions(+), 45 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index a83bcfd771..46485409bb 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -390,10 +390,7 @@ public class PreferencePane extends BasicPane { vcsPane.add(enableVcsPanel); vcsPane.add(intervalPanel); vcsPane.add(saveCommitCheckBox); - if (VcsHelper.getInstance().isLegacyMode()) { - // 老版本时才显示gc选项 - vcsPane.add(gcControlPane); - } + vcsPane.add(gcControlPane); } /** 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 d21dd1b7cf..8cfd263421 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 @@ -325,7 +325,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt if (VcsHelper.getInstance().needInit()) { vcsAction = new VcsAction(); - if (!isLegacyOnCluster()) { + if (!WorkContext.getCurrent().isCluster()) { vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_Title")); } else { vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_NotSupportRemote")); @@ -509,7 +509,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt private void fireVcsActionChange(boolean enable) { if (!DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable() || VcsHelper.getInstance().isUnSelectedTemplate() - || isLegacyOnCluster()) { + || WorkContext.getCurrent().isCluster()) { setEnabled(false); return; } @@ -810,11 +810,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } - private boolean isLegacyOnCluster() { - // 老模式且为集群,用于代替之前的只判断集群逻辑 - return WorkContext.getCurrent().isCluster() && VcsHelper.getInstance().isLegacyMode(); - } - private String doCheck (String userInput, String suffix) { String errorMsg = StringUtils.EMPTY; if (selectedOperation.duplicated(userInput, suffix, true)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index dd7187be23..980ccb5a3a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -12,9 +12,6 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplateActionListener; import com.fr.design.mainframe.vcs.VcsConfigManager; import com.fr.design.mainframe.vcs.ui.FileVersionTable; -import com.fr.event.Event; -import com.fr.event.EventDispatcher; -import com.fr.event.Listener; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; @@ -23,14 +20,11 @@ import com.fr.report.entity.VcsEntity; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; -import com.fr.workspace.Workspace; -import com.fr.workspace.WorkspaceEvent; import com.fr.workspace.server.vcs.VcsOperator; import com.fr.workspace.server.vcs.filesystem.VcsFileSystem; import com.fr.workspace.server.vcs.git.config.GcConfig; import javax.swing.Icon; -import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import java.awt.Color; import java.util.List; @@ -61,26 +55,10 @@ public class VcsHelper implements JTemplateActionListener { private final static String SERVICE_NAME_MOVE = "moveVcs"; private static final VcsHelper INSTANCE = new VcsHelper(); - private volatile boolean legacyMode; - public static VcsHelper getInstance() { return INSTANCE; } - private VcsHelper() { - VcsOperator op = WorkContext.getCurrent().get(VcsOperator.class); - // 开了设计器启动页面时一开始取不到VcsOperator,通过下面的切换环境事件再取,这边判断下 - if (op != null) { - legacyMode = op.isLegacyMode(); - } - EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { - @Override - public void on(Event event, Workspace param) { - legacyMode = WorkContext.getCurrent().get(VcsOperator.class).isLegacyMode(); - } - }); - } - private int containsFolderCounts() { TemplateFileTree fileTree = TemplateTreePane.getInstance().getTemplateFileTree(); if (fileTree.getSelectionPaths() == null) { @@ -159,18 +137,20 @@ public class VcsHelper implements JTemplateActionListener { String fileName = getEditingFilename(); VcsOperator operator = WorkContext.getCurrent().get(VcsOperator.class); VcsEntity entity = operator.getFileVersionByIndex(fileName, 0); - boolean replace = needDeleteVersion(entity); int latestFileVersion = 0; if (entity != null) { latestFileVersion = entity.getVersion(); } if (jt.getEditingFILE() instanceof VcsCacheFileNodeFile) { - operator.saveVersionFromCache(getCurrentUsername(), fileName, StringUtils.EMPTY, latestFileVersion + 1, replace); + operator.saveVersionFromCache(getCurrentUsername(), fileName, StringUtils.EMPTY, latestFileVersion + 1); String path = DesignerFrameFileDealerPane.getInstance().getSelectedOperation().getFilePath(); - List updatedList = WorkContext.getCurrent().get(VcsOperator.class).getVersions(path.replaceFirst(VCS_FILE_SLASH, StringUtils.EMPTY)); - SwingUtilities.invokeLater(() -> FileVersionTable.getInstance().updateModel(1, updatedList)); + FileVersionTable.getInstance().updateModel(1, WorkContext.getCurrent().get(VcsOperator.class).getVersions(path.replaceFirst(VCS_FILE_SLASH, StringUtils.EMPTY))); } else { - operator.saveVersion(getCurrentUsername(), fileName, StringUtils.EMPTY, latestFileVersion + 1, replace); + operator.saveVersion(getCurrentUsername(), fileName, StringUtils.EMPTY, latestFileVersion + 1); + } + VcsEntity oldEntity = WorkContext.getCurrent().get(VcsOperator.class).getFileVersionByIndexAndUsername(fileName, getCurrentUsername(), 1); + if (needDeleteVersion(oldEntity)) { + operator.deleteVersion(oldEntity.getFilename(), oldEntity.getVersion()); } if (GcConfig.getInstance().isGcEnable()) { operator.gc(); @@ -208,13 +188,6 @@ public class VcsHelper implements JTemplateActionListener { moveVcs.shutdown(); } - /** - * 判断是否为老模式 - * @return 是否为老模式 - */ - public boolean isLegacyMode() { - return legacyMode; - } @Override public void templateOpened(JTemplate jt) { From fe85bf97116dc844a808cbfcb1f439222f56131d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Fri, 24 Mar 2023 11:44:32 +0800 Subject: [PATCH 015/625] =?UTF-8?q?REPORT-91503=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=A2=91=E7=B9=81=E6=8A=A5=E9=94=99=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E4=BF=A1=E6=81=AF=E4=B8=8D=E4=B8=80=E8=87=B4=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8=E8=BF=99=E4=B8=AA=E5=BC=B9=E7=AA=97=E5=8F=A6=E5=AD=98?= =?UTF-8?q?=E4=B8=BA=E4=B8=80=E5=AE=9A=E4=BC=9A=E5=A4=B1=E8=B4=A5=E3=80=82?= =?UTF-8?q?=20=E5=A4=84=E7=90=86=E5=88=9B=E5=BB=BA=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=A4=87=E4=BB=BD=E6=96=87=E4=BB=B6=E6=97=B6=E7=9A=84=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BB=A5=E5=8F=8A=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E5=8F=AF=E8=83=BD=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 34 +++++++++++++------ .../worker/save/SaveFailureHandler.java | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index e7d3c3dca3..ce01d9992f 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -85,28 +85,42 @@ public class TemplateUtils { private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { - new SwingWorker() { + new SwingWorker() { @Override - protected Void doInBackground() throws Exception { + protected Boolean doInBackground() throws Exception { // 读取模板数据 byte[] content = getTemplateData(createByEditingTemplate, oldPath); - try (OutputStream out = file.asOutputStream()) { + OutputStream out = null; + try { // 加锁 - WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); + boolean saveAsLock = WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); + if (!saveAsLock) { + // 加锁失败时,直接返回 + return false; + } + out = file.asOutputStream(); out.write(content); } finally { - // 解锁 - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); + try { + if (out != null) { + out.close(); + } + } finally { + // 解锁 + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); + } } - return null; + return true; } @Override protected void done() { try { - get(); - // 创建备份成功后 + if (!get()) { + throw new Exception("[RemoteDesign] back up template file failed"); + } + // 创建备份成功后,关闭原模板 doAfterCreateTemplate.run(); if (openNewTemplate) { DesignerContext.getDesignerFrame().openTemplate(file); @@ -126,7 +140,7 @@ public class TemplateUtils { * * @param readCurrentEditingTemplate 是否读取当前编辑模板 * @param path 模板路径 - * @return 模板文件数据 + * @return 模板文件数据 */ private static byte[] getTemplateData(boolean readCurrentEditingTemplate, String path) throws Exception { byte[] content = new byte[0]; diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java index 128064301e..119668ec68 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java @@ -139,7 +139,7 @@ public class SaveFailureHandler implements ThrowableHandler { new FileNodeFILE(new FileNode(template.getPath(), false)), true, true, - // 创建并打开备份模板后,关闭原模板 + // 创建并打开备份模板后,关闭原模板,无需释放原模板锁(锁定信息不一致 = 此用户模板锁信息已被清除) () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template)); } } From f51f25b8598a5403eb0b470b8767d48a167e097a Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 24 Mar 2023 14:58:12 +0800 Subject: [PATCH 016/625] =?UTF-8?q?REPORT-92304=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E4=B8=89=E8=A7=92=E5=BD=A2?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/com/fr/design/standard/drag/left_normal.svg | 2 +- .../main/resources/com/fr/design/standard/drag/left_pressed.svg | 2 +- .../main/resources/com/fr/design/standard/drag/right_normal.svg | 2 +- .../resources/com/fr/design/standard/drag/right_pressed.svg | 2 +- .../com/fr/design/standard/triangle.arrow/down_hover.svg | 2 +- .../com/fr/design/standard/triangle.arrow/down_normal.svg | 2 +- .../com/fr/design/standard/triangle.arrow/up_hover.svg | 2 +- .../com/fr/design/standard/triangle.arrow/up_normal.svg | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/resources/com/fr/design/standard/drag/left_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/drag/left_normal.svg index 0809e2e261..d20fea5a83 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/drag/left_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/drag/left_normal.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/drag/left_pressed.svg b/designer-base/src/main/resources/com/fr/design/standard/drag/left_pressed.svg index 7f293e9a15..db0dca3958 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/drag/left_pressed.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/drag/left_pressed.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/drag/right_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/drag/right_normal.svg index a9bc6d2c6b..4b3cb3aadd 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/drag/right_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/drag/right_normal.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/drag/right_pressed.svg b/designer-base/src/main/resources/com/fr/design/standard/drag/right_pressed.svg index 7fa6c4e056..fafe763882 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/drag/right_pressed.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/drag/right_pressed.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg index 68870b99dd..b89e826352 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_hover.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg index db4e76f2a9..597fe8c9c6 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/down_normal.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg index 1b7312ff6e..9ddff69714 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_hover.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg index f767fbcf31..cfd49c95d1 100644 --- a/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/standard/triangle.arrow/up_normal.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file From e59b18264a0427e15c42c88b18a7aa4376d65a1e Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 24 Mar 2023 14:59:25 +0800 Subject: [PATCH 017/625] =?UTF-8?q?REPORT-92440=20mac-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=B8=A6=E5=8F=B9=E5=8F=B7=E7=9A=84=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/icon/WarningIcon.java | 26 +++++++++++++------ .../com/fr/design/utils/SvgPaintUtils.java | 3 ++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java index 08d5b5a55a..025033d735 100644 --- a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java @@ -1,12 +1,17 @@ package com.fr.design.icon; import com.fr.base.svg.SVGLoader; +import com.fr.base.svg.SystemScaleUtils; import com.fr.design.utils.SvgPaintUtils; import com.fr.log.FineLoggerFactory; import javax.swing.GrayFilter; import javax.swing.ImageIcon; -import java.awt.*; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.MediaTracker; import java.awt.image.ImageObserver; /** @@ -20,7 +25,8 @@ public class WarningIcon extends ImageIcon { }; protected final static MediaTracker TRACKER = new MediaTracker(COMPONENT); private final static Image WARNING_IMAGE = SVGLoader.load("/com/fr/design/standard/warning.svg"); - + private static final boolean HI_DPI_SUPPORT = SystemScaleUtils.isJreHiDPIEnabled(); + public static final float SYSTEM_SCALE = SystemScaleUtils.sysScale(); private Image mainImage = null; private ImageObserver imageObserver; private int width = -1; @@ -36,14 +42,16 @@ public class WarningIcon extends ImageIcon { @Override public synchronized void paintIcon(Component c, Graphics g, int x, int y) { - SvgPaintUtils.beforePaint((Graphics2D) g); + //裁剪绘制svg的位置,以免影响到图标右侧的文字 + Graphics2D graphics = (Graphics2D) g.create(x, y, WARNING_IMAGE.getWidth(null), WARNING_IMAGE.getHeight(null)); + SvgPaintUtils.beforePaint(graphics); if (mainImage != null) { - g.drawImage(mainImage, x, y, c); + graphics.drawImage(mainImage, x, y, null); } if (WARNING_IMAGE != null) { - g.drawImage(WARNING_IMAGE, x, y, c); + graphics.drawImage(WARNING_IMAGE, x, y, null); } - SvgPaintUtils.afterPaint((Graphics2D) g); + SvgPaintUtils.afterPaint(graphics); } /** @@ -91,7 +99,8 @@ public class WarningIcon extends ImageIcon { * @return the width in pixels of this icon */ public int getIconWidth() { - return width; + //如果环境支持高清化,drawImage可能会缩放绘制的图像比例,需要保证svg正常显示的同时调整绘制范围 + return HI_DPI_SUPPORT ? (int) (width / SYSTEM_SCALE) : width; } /** @@ -100,7 +109,8 @@ public class WarningIcon extends ImageIcon { * @return the height in pixels of this icon */ public int getIconHeight() { - return height; + //如果环境支持高清化,drawImage可能会缩放绘制的图像比例,需要保证svg正常显示的同时调整绘制范围 + return HI_DPI_SUPPORT ? (int) (height / SYSTEM_SCALE) : height; } { diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java index fdb460eb41..a51783d8fa 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java @@ -2,6 +2,7 @@ package com.fr.design.utils; import com.fr.base.svg.SVGLoader; import com.fr.base.svg.SystemScaleUtils; + import java.awt.Graphics2D; /** @@ -21,7 +22,7 @@ public class SvgPaintUtils { public static void afterPaint(Graphics2D g2) { if (SystemScaleUtils.isJreHiDPIEnabled()) { - g2.scale(SVGLoader.SYSTEM_SCALE, SVGLoader.SYSTEM_SCALE); + g2.scale(1.0D, 1.0D); } } From 9277d913817c69db8796186844c66e5dc4e366f5 Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 24 Mar 2023 15:00:40 +0800 Subject: [PATCH 018/625] =?UTF-8?q?REPORT-92439=20mac=E4=B8=8B-=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E6=94=B6=E8=B5=B7=E5=9B=BE=E6=A0=87=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icontainer/UIEastResizableContainer.java | 7 +++- .../gui/icontainer/UIResizableContainer.java | 41 +++++++++++++++---- .../mainframe/EastRegionContainerPane.java | 7 +++- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index c8cfadd0fd..17511d391e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -1,6 +1,8 @@ package com.fr.design.gui.icontainer; +import com.fr.base.svg.SVGLoader; +import com.fr.base.svg.SystemScaleUtils; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; @@ -339,7 +341,10 @@ public class UIEastResizableContainer extends JPanel { } } SvgPaintUtils.beforePaint((Graphics2D) g); - g.drawImage(button, 18, 7, this); + //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 + int x = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (10 * SVGLoader.SYSTEM_SCALE) : 10; + int y = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (7 * SVGLoader.SYSTEM_SCALE) : 7; + g.drawImage(button, x, y, null); SvgPaintUtils.afterPaint((Graphics2D) g); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index 8e562cc3ce..cbc175a0d9 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -1,14 +1,27 @@ package com.fr.design.gui.icontainer; +import com.fr.base.svg.SVGLoader; +import com.fr.base.svg.SystemScaleUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.SvgPaintUtils; -import com.fr.stable.Constants; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.Constants; -import javax.swing.*; -import java.awt.*; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.LayoutManager; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; @@ -16,6 +29,8 @@ import java.awt.event.MouseMotionListener; public class UIResizableContainer extends JPanel { private static final long serialVersionUID = 1854340560790476907L; private static final int MAX_PARA_HEIGHT = 240; + private final boolean HI_DPI_SUPPORT = SystemScaleUtils.isJreHiDPIEnabled(); + private int containerWidth = 240; private int preferredWidth = 240; private int toolPaneY = 300; @@ -412,9 +427,13 @@ public class UIResizableContainer extends JPanel { Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); SvgPaintUtils.beforePaint((Graphics2D) g); - g.drawImage(UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null); - g.drawImage(upButton, ARROW_MARGIN, 1, null); - g.drawImage(downButton, getWidth() - toolPaneHeight - ARROW_MARGIN, 1, null); + //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 + int dragLineX = HI_DPI_SUPPORT ? (int) ((getWidth() - toolPaneHeight) / 2 * SVGLoader.SYSTEM_SCALE) : (getWidth() - toolPaneHeight) / 2; + int dragLineY = HI_DPI_SUPPORT ? (int) (3 * SVGLoader.SYSTEM_SCALE) : 3; + int downButtonX = HI_DPI_SUPPORT ? (int) ((getWidth() - toolPaneHeight - ARROW_MARGIN) * SVGLoader.SYSTEM_SCALE) : (getWidth() - toolPaneHeight - ARROW_MARGIN); + g.drawImage(UIConstants.DRAG_LINE, dragLineX, dragLineY, null); + g.drawImage(upButton, ARROW_MARGIN, 0, null); + g.drawImage(downButton, downButtonX, 0, null); SvgPaintUtils.afterPaint((Graphics2D) g); } } @@ -512,7 +531,12 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_LEFT_PRESS; } } - g.drawImage(button, -1, ARROW_MARGIN_VERTICAL, this); + SvgPaintUtils.beforePaint((Graphics2D) g); + //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 + int x = HI_DPI_SUPPORT ? (int) (-6 * SVGLoader.SYSTEM_SCALE) : -6; + int y = HI_DPI_SUPPORT ? (int) (ARROW_MARGIN_VERTICAL * SVGLoader.SYSTEM_SCALE) : ARROW_MARGIN_VERTICAL; + g.drawImage(button, x, y, this); + SvgPaintUtils.afterPaint((Graphics2D) g); } else { g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); if (containerWidth == toolPaneHeight) { @@ -528,7 +552,8 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - g.drawImage(button, 2, ARROW_MARGIN_VERTICAL, this); + int x = HI_DPI_SUPPORT ? (int) (10 * SVGLoader.SYSTEM_SCALE) : 10; + g.drawImage(button, x, ARROW_MARGIN_VERTICAL, this); } if (isLeftRightDragEnabled) { g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 00405d6093..7ac1aac409 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -2,6 +2,8 @@ package com.fr.design.mainframe; import com.fr.base.FRContext; import com.fr.base.svg.IconUtils; +import com.fr.base.svg.SVGLoader; +import com.fr.base.svg.SystemScaleUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -1315,7 +1317,10 @@ public class EastRegionContainerPane extends UIEastResizableContainer { button = UIConstants.POP_BUTTON_UP; } SvgPaintUtils.beforePaint((Graphics2D) g); - g.drawImage(button, ARROW_RANGE_START + 8, 4, null); + //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 + int x = SystemScaleUtils.isJreHiDPIEnabled() ? (int) ((ARROW_RANGE_START + 8) * SVGLoader.SYSTEM_SCALE) : (ARROW_RANGE_START + 8); + int y = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (4 * SVGLoader.SYSTEM_SCALE) : 4; + g.drawImage(button, x, y, null); SvgPaintUtils.afterPaint((Graphics2D) g); } } From 5df6bf5477ff065e9d430c021fa2f7c42f01f76c Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 24 Mar 2023 15:46:19 +0800 Subject: [PATCH 019/625] =?UTF-8?q?REPORT-92439=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E8=AE=A1=E7=AE=97svg=E4=BD=8D=E7=BD=AEx,y=E7=9A=84?= =?UTF-8?q?=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icontainer/UIEastResizableContainer.java | 6 +---- .../gui/icontainer/UIResizableContainer.java | 18 ++++---------- .../mainframe/EastRegionContainerPane.java | 6 +---- .../com/fr/design/utils/SvgPaintUtils.java | 24 +++++++++++++++++-- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index 17511d391e..2a9fcacb82 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -1,8 +1,6 @@ package com.fr.design.gui.icontainer; -import com.fr.base.svg.SVGLoader; -import com.fr.base.svg.SystemScaleUtils; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; @@ -342,9 +340,7 @@ public class UIEastResizableContainer extends JPanel { } SvgPaintUtils.beforePaint((Graphics2D) g); //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - int x = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (10 * SVGLoader.SYSTEM_SCALE) : 10; - int y = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (7 * SVGLoader.SYSTEM_SCALE) : 7; - g.drawImage(button, x, y, null); + g.drawImage(button, SvgPaintUtils.calculatePositionX(10), SvgPaintUtils.calculatePositionY(7), null); SvgPaintUtils.afterPaint((Graphics2D) g); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index cbc175a0d9..44806b3bf9 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -1,7 +1,5 @@ package com.fr.design.gui.icontainer; -import com.fr.base.svg.SVGLoader; -import com.fr.base.svg.SystemScaleUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerContext; @@ -29,8 +27,6 @@ import java.awt.event.MouseMotionListener; public class UIResizableContainer extends JPanel { private static final long serialVersionUID = 1854340560790476907L; private static final int MAX_PARA_HEIGHT = 240; - private final boolean HI_DPI_SUPPORT = SystemScaleUtils.isJreHiDPIEnabled(); - private int containerWidth = 240; private int preferredWidth = 240; private int toolPaneY = 300; @@ -428,12 +424,9 @@ public class UIResizableContainer extends JPanel { g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); SvgPaintUtils.beforePaint((Graphics2D) g); //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - int dragLineX = HI_DPI_SUPPORT ? (int) ((getWidth() - toolPaneHeight) / 2 * SVGLoader.SYSTEM_SCALE) : (getWidth() - toolPaneHeight) / 2; - int dragLineY = HI_DPI_SUPPORT ? (int) (3 * SVGLoader.SYSTEM_SCALE) : 3; - int downButtonX = HI_DPI_SUPPORT ? (int) ((getWidth() - toolPaneHeight - ARROW_MARGIN) * SVGLoader.SYSTEM_SCALE) : (getWidth() - toolPaneHeight - ARROW_MARGIN); - g.drawImage(UIConstants.DRAG_LINE, dragLineX, dragLineY, null); + g.drawImage(UIConstants.DRAG_LINE, SvgPaintUtils.calculatePositionX((getWidth() - toolPaneHeight) / 2), SvgPaintUtils.calculatePositionY(3), null); g.drawImage(upButton, ARROW_MARGIN, 0, null); - g.drawImage(downButton, downButtonX, 0, null); + g.drawImage(downButton, SvgPaintUtils.calculatePositionX(getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null); SvgPaintUtils.afterPaint((Graphics2D) g); } } @@ -533,9 +526,7 @@ public class UIResizableContainer extends JPanel { } SvgPaintUtils.beforePaint((Graphics2D) g); //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - int x = HI_DPI_SUPPORT ? (int) (-6 * SVGLoader.SYSTEM_SCALE) : -6; - int y = HI_DPI_SUPPORT ? (int) (ARROW_MARGIN_VERTICAL * SVGLoader.SYSTEM_SCALE) : ARROW_MARGIN_VERTICAL; - g.drawImage(button, x, y, this); + g.drawImage(button, SvgPaintUtils.calculatePositionX(-6), SvgPaintUtils.calculatePositionY(ARROW_MARGIN_VERTICAL), this); SvgPaintUtils.afterPaint((Graphics2D) g); } else { g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); @@ -552,8 +543,7 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - int x = HI_DPI_SUPPORT ? (int) (10 * SVGLoader.SYSTEM_SCALE) : 10; - g.drawImage(button, x, ARROW_MARGIN_VERTICAL, this); + g.drawImage(button, SvgPaintUtils.calculatePositionX(10), ARROW_MARGIN_VERTICAL, this); } if (isLeftRightDragEnabled) { g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 7ac1aac409..b460e1e31d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -2,8 +2,6 @@ package com.fr.design.mainframe; import com.fr.base.FRContext; import com.fr.base.svg.IconUtils; -import com.fr.base.svg.SVGLoader; -import com.fr.base.svg.SystemScaleUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -1318,9 +1316,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } SvgPaintUtils.beforePaint((Graphics2D) g); //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - int x = SystemScaleUtils.isJreHiDPIEnabled() ? (int) ((ARROW_RANGE_START + 8) * SVGLoader.SYSTEM_SCALE) : (ARROW_RANGE_START + 8); - int y = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (4 * SVGLoader.SYSTEM_SCALE) : 4; - g.drawImage(button, x, y, null); + g.drawImage(button, SvgPaintUtils.calculatePositionX(ARROW_RANGE_START + 8), SvgPaintUtils.calculatePositionY(4), null); SvgPaintUtils.afterPaint((Graphics2D) g); } } diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java index a51783d8fa..85e34caba2 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java @@ -14,16 +14,36 @@ import java.awt.Graphics2D; */ public class SvgPaintUtils { + private static final boolean HI_DPI_ENABLED = SystemScaleUtils.isJreHiDPIEnabled(); + public static void beforePaint(Graphics2D g2) { - if (SystemScaleUtils.isJreHiDPIEnabled()) { + if (HI_DPI_ENABLED) { g2.scale(1 / SVGLoader.SYSTEM_SCALE, 1 / SVGLoader.SYSTEM_SCALE); } } public static void afterPaint(Graphics2D g2) { - if (SystemScaleUtils.isJreHiDPIEnabled()) { + if (HI_DPI_ENABLED) { g2.scale(1.0D, 1.0D); } } + /** + * 计算高缩放下绘制svg图标时新的的位置x + * @param x 旧x的值 + * @return 新的x值 + * */ + public static int calculatePositionX(int x) { + return HI_DPI_ENABLED ? (int) (x * SVGLoader.SYSTEM_SCALE) : x; + } + + /** + * 计算高缩放下绘制svg图标时新的的位置y + * @param y 旧y的值 + * @return 新的y值 + * */ + public static int calculatePositionY(int y) { + return HI_DPI_ENABLED ? (int) (y * SVGLoader.SYSTEM_SCALE) : y; + } + } From 810f67af613136a1a293556314d3ba2c8b117e79 Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 24 Mar 2023 19:59:13 +0800 Subject: [PATCH 020/625] =?UTF-8?q?REPORT-92440=20mac-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=B8=A6=E5=8F=B9=E5=8F=B7=E7=9A=84=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/icon/WarningIcon.java | 19 ++++++++--- .../com/fr/design/utils/SvgPaintWorker.java | 33 +++++++++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java diff --git a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java index 025033d735..20e6462569 100644 --- a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java @@ -2,7 +2,7 @@ package com.fr.design.icon; import com.fr.base.svg.SVGLoader; import com.fr.base.svg.SystemScaleUtils; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgPaintWorker; import com.fr.log.FineLoggerFactory; import javax.swing.GrayFilter; @@ -44,14 +44,23 @@ public class WarningIcon extends ImageIcon { public synchronized void paintIcon(Component c, Graphics g, int x, int y) { //裁剪绘制svg的位置,以免影响到图标右侧的文字 Graphics2D graphics = (Graphics2D) g.create(x, y, WARNING_IMAGE.getWidth(null), WARNING_IMAGE.getHeight(null)); - SvgPaintUtils.beforePaint(graphics); if (mainImage != null) { - graphics.drawImage(mainImage, x, y, null); + new SvgPaintWorker(graphics) { + @Override + protected void doPrint() { + this.drawImage(mainImage, x, y, null); + } + }.execute(); } if (WARNING_IMAGE != null) { - graphics.drawImage(WARNING_IMAGE, x, y, null); + new SvgPaintWorker(graphics) { + @Override + protected void doPrint() { + this.drawImage(WARNING_IMAGE, x, y, null); + } + }.execute(); } - SvgPaintUtils.afterPaint(graphics); + graphics.dispose(); } /** diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java b/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java new file mode 100644 index 0000000000..321e8b05d7 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java @@ -0,0 +1,33 @@ +package com.fr.design.utils; + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.image.ImageObserver; + +/** + * SVG图标绘制器 + * + * @author obo + * @since 11.0 + * Created on 2023/3/24 + */ +abstract public class SvgPaintWorker { + + private final Graphics graphics; + public SvgPaintWorker(Graphics g) { + graphics = g; + } + + protected abstract void doPrint(); + protected void drawImage(Image image, int x, int y, ImageObserver imageObserver) { + //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 + graphics.drawImage(image, SvgPaintUtils.calculatePosition(x), SvgPaintUtils.calculatePosition(y), imageObserver); + } + + public void execute() { + SvgPaintUtils.beforePaint((Graphics2D) graphics); + doPrint(); + SvgPaintUtils.afterPaint((Graphics2D) graphics); + } +} From d7d7fd53269f4650a00bcdbb1ed753eb4f875454 Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 24 Mar 2023 20:03:35 +0800 Subject: [PATCH 021/625] =?UTF-8?q?REPORT-92439=20mac=E4=B8=8B-=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E6=94=B6=E8=B5=B7=E5=9B=BE=E6=A0=87=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/base/svg/SVGIcon.java | 17 ++++--- .../icontainer/UIEastResizableContainer.java | 12 ++--- .../gui/icontainer/UIResizableContainer.java | 44 +++++++++++++------ .../mainframe/EastRegionContainerPane.java | 12 ++--- .../com/fr/design/utils/SvgPaintUtils.java | 22 +++------- 5 files changed, 62 insertions(+), 45 deletions(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index 172b10dac5..a15b2118d3 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -1,9 +1,12 @@ package com.fr.base.svg; +import com.fr.design.utils.SvgPaintWorker; import com.fr.general.IOUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.Icon; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -34,10 +37,12 @@ public class SVGIcon implements Icon { public void paintIcon(Component c, Graphics g, int x, int y) { if (HI_DPI_SURPORT) { Graphics2D graphics = (Graphics2D) g.create(x, y, image.getWidth(null), image.getHeight(null)); - float scale = SYSTEM_SCALE; - graphics.scale(1 / scale, 1 / scale); - graphics.drawImage(image, 0, 0, null); - graphics.scale(1.0D, 1.0D); + new SvgPaintWorker(graphics) { + @Override + protected void doPrint() { + this.drawImage(image, 0, 0, null); + } + }.execute(); graphics.dispose(); } else { g.drawImage(image, x, y, null); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index 2a9fcacb82..5029ccf98d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -5,7 +5,7 @@ import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgPaintWorker; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.JComponent; @@ -18,7 +18,6 @@ import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.Image; import java.awt.LayoutManager; import java.awt.event.MouseAdapter; @@ -338,10 +337,13 @@ public class UIEastResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - SvgPaintUtils.beforePaint((Graphics2D) g); //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - g.drawImage(button, SvgPaintUtils.calculatePositionX(10), SvgPaintUtils.calculatePositionY(7), null); - SvgPaintUtils.afterPaint((Graphics2D) g); + new SvgPaintWorker(g) { + @Override + protected void doPrint() { + this.drawImage(button, 10, 7, null); + } + }.execute(); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index 44806b3bf9..ceaabe56e6 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -3,7 +3,7 @@ package com.fr.design.gui.icontainer; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgPaintWorker; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; @@ -17,7 +17,6 @@ import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.Image; import java.awt.LayoutManager; import java.awt.event.MouseAdapter; @@ -422,12 +421,24 @@ public class UIResizableContainer extends JPanel { Image upButton = (upModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_UP_NORMAL : UIConstants.DRAG_UP_PRESS); Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); - SvgPaintUtils.beforePaint((Graphics2D) g); - //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - g.drawImage(UIConstants.DRAG_LINE, SvgPaintUtils.calculatePositionX((getWidth() - toolPaneHeight) / 2), SvgPaintUtils.calculatePositionY(3), null); - g.drawImage(upButton, ARROW_MARGIN, 0, null); - g.drawImage(downButton, SvgPaintUtils.calculatePositionX(getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null); - SvgPaintUtils.afterPaint((Graphics2D) g); + new SvgPaintWorker(g) { + @Override + protected void doPrint() { + this.drawImage(UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null); + } + }.execute(); + new SvgPaintWorker(g) { + @Override + protected void doPrint() { + this.drawImage(upButton, ARROW_MARGIN, 0, null); + } + }.execute(); + new SvgPaintWorker(g) { + @Override + protected void doPrint() { + this.drawImage(downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null); + } + }.execute(); } } @@ -524,10 +535,12 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_LEFT_PRESS; } } - SvgPaintUtils.beforePaint((Graphics2D) g); - //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - g.drawImage(button, SvgPaintUtils.calculatePositionX(-6), SvgPaintUtils.calculatePositionY(ARROW_MARGIN_VERTICAL), this); - SvgPaintUtils.afterPaint((Graphics2D) g); + new SvgPaintWorker(g) { + @Override + protected void doPrint() { + this.drawImage(button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this); + } + }.execute(); } else { g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); if (containerWidth == toolPaneHeight) { @@ -543,7 +556,12 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - g.drawImage(button, SvgPaintUtils.calculatePositionX(10), ARROW_MARGIN_VERTICAL, this); + new SvgPaintWorker(g) { + @Override + protected void doPrint() { + this.drawImage(button, 10, ARROW_MARGIN_VERTICAL, VerticalToolPane.this); + } + }.execute(); } if (isLeftRightDragEnabled) { g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index b460e1e31d..858e76048d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -19,7 +19,7 @@ import com.fr.design.notification.SnapChat; import com.fr.design.notification.SnapChatFactory; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgPaintWorker; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.log.FineLoggerFactory; @@ -1314,10 +1314,12 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } else { button = UIConstants.POP_BUTTON_UP; } - SvgPaintUtils.beforePaint((Graphics2D) g); - //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - g.drawImage(button, SvgPaintUtils.calculatePositionX(ARROW_RANGE_START + 8), SvgPaintUtils.calculatePositionY(4), null); - SvgPaintUtils.afterPaint((Graphics2D) g); + new SvgPaintWorker(g) { + @Override + protected void doPrint() { + this.drawImage(button, (ARROW_RANGE_START + 8), 4, null); + } + }.execute(); } } diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java index 85e34caba2..507768a047 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java @@ -24,26 +24,16 @@ public class SvgPaintUtils { public static void afterPaint(Graphics2D g2) { if (HI_DPI_ENABLED) { - g2.scale(1.0D, 1.0D); + g2.scale(SVGLoader.SYSTEM_SCALE, SVGLoader.SYSTEM_SCALE); } } /** - * 计算高缩放下绘制svg图标时新的的位置x - * @param x 旧x的值 - * @return 新的x值 + * 计算高缩放下绘制svg图标时新的的位置x,y + * @param position 旧坐标的值 + * @return 新的position值 * */ - public static int calculatePositionX(int x) { - return HI_DPI_ENABLED ? (int) (x * SVGLoader.SYSTEM_SCALE) : x; + public static int calculatePosition(int position) { + return HI_DPI_ENABLED ? (int) (position * SVGLoader.SYSTEM_SCALE) : position; } - - /** - * 计算高缩放下绘制svg图标时新的的位置y - * @param y 旧y的值 - * @return 新的y值 - * */ - public static int calculatePositionY(int y) { - return HI_DPI_ENABLED ? (int) (y * SVGLoader.SYSTEM_SCALE) : y; - } - } From df2bdb4ae1087ead62ccc98ee0c1f03246bc6240 Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 24 Mar 2023 20:50:50 +0800 Subject: [PATCH 022/625] =?UTF-8?q?REPORT-92430=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-mac=E4=B8=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E9=83=BD=E4=B8=A2=E5=A4=B1=E4=BA=86=EF=BC=8C?= =?UTF-8?q?windows=E4=B8=8B=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/images/lookandfeel/TreeLeafIcon.svg | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 designer-base/src/main/resources/com/fr/design/images/lookandfeel/TreeLeafIcon.svg diff --git a/designer-base/src/main/resources/com/fr/design/images/lookandfeel/TreeLeafIcon.svg b/designer-base/src/main/resources/com/fr/design/images/lookandfeel/TreeLeafIcon.svg new file mode 100644 index 0000000000..c2971da642 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/lookandfeel/TreeLeafIcon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 905eac5f5b294a88b091e1fc97784d202a3abe48 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 10:19:08 +0800 Subject: [PATCH 023/625] =?UTF-8?q?REPORT-92440=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=86SvgPaintWorker=E7=9A=84execute=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=9A=84=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/utils/SvgPaintWorker.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java b/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java index 321e8b05d7..6202f608aa 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java @@ -25,6 +25,13 @@ abstract public class SvgPaintWorker { graphics.drawImage(image, SvgPaintUtils.calculatePosition(x), SvgPaintUtils.calculatePosition(y), imageObserver); } + /** + * 执行完整的svg绘制逻辑 + * + * @author obo + * @since 11.0 + * Created on 2023/3/24 + */ public void execute() { SvgPaintUtils.beforePaint((Graphics2D) graphics); doPrint(); From e977f6fc6fdd31a44e21c0a39dc9aa2076121c87 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 15:54:51 +0800 Subject: [PATCH 024/625] =?UTF-8?q?REPORT-92439=20mac=E4=B8=8B-=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E6=94=B6=E8=B5=B7=E5=9B=BE=E6=A0=87=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/base/svg/SVGIcon.java | 8 ++--- .../icontainer/UIEastResizableContainer.java | 8 ++--- .../gui/icontainer/UIResizableContainer.java | 32 +++++++++---------- .../mainframe/EastRegionContainerPane.java | 8 ++--- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index a15b2118d3..613b6ddbde 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -1,6 +1,6 @@ package com.fr.base.svg; -import com.fr.design.utils.SvgPaintWorker; +import com.fr.design.utils.SvgPainter; import com.fr.general.IOUtils; import javax.swing.Icon; @@ -37,12 +37,12 @@ public class SVGIcon implements Icon { public void paintIcon(Component c, Graphics g, int x, int y) { if (HI_DPI_SURPORT) { Graphics2D graphics = (Graphics2D) g.create(x, y, image.getWidth(null), image.getHeight(null)); - new SvgPaintWorker(graphics) { + new SvgPainter(graphics) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(image, 0, 0, null); } - }.execute(); + }.paint(); graphics.dispose(); } else { g.drawImage(image, x, y, null); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index 5029ccf98d..d078b747fb 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -5,7 +5,7 @@ import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPaintWorker; +import com.fr.design.utils.SvgPainter; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.JComponent; @@ -338,12 +338,12 @@ public class UIEastResizableContainer extends JPanel { } } //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - new SvgPaintWorker(g) { + new SvgPainter(g) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(button, 10, 7, null); } - }.execute(); + }.paint(); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index ceaabe56e6..20109fff1e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -3,7 +3,7 @@ package com.fr.design.gui.icontainer; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPaintWorker; +import com.fr.design.utils.SvgPainter; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; @@ -421,24 +421,24 @@ public class UIResizableContainer extends JPanel { Image upButton = (upModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_UP_NORMAL : UIConstants.DRAG_UP_PRESS); Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); - new SvgPaintWorker(g) { + new SvgPainter(g) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null); } - }.execute(); - new SvgPaintWorker(g) { + }.paint(); + new SvgPainter(g) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(upButton, ARROW_MARGIN, 0, null); } - }.execute(); - new SvgPaintWorker(g) { + }.paint(); + new SvgPainter(g) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null); } - }.execute(); + }.paint(); } } @@ -535,12 +535,12 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_LEFT_PRESS; } } - new SvgPaintWorker(g) { + new SvgPainter(g) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this); } - }.execute(); + }.paint(); } else { g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); if (containerWidth == toolPaneHeight) { @@ -556,12 +556,12 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - new SvgPaintWorker(g) { + new SvgPainter(g) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(button, 10, ARROW_MARGIN_VERTICAL, VerticalToolPane.this); } - }.execute(); + }.paint(); } if (isLeftRightDragEnabled) { g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 858e76048d..0d3dfcae84 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -19,7 +19,7 @@ import com.fr.design.notification.SnapChat; import com.fr.design.notification.SnapChatFactory; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.SvgPaintWorker; +import com.fr.design.utils.SvgPainter; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.log.FineLoggerFactory; @@ -1314,12 +1314,12 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } else { button = UIConstants.POP_BUTTON_UP; } - new SvgPaintWorker(g) { + new SvgPainter(g) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(button, (ARROW_RANGE_START + 8), 4, null); } - }.execute(); + }.paint(); } } From 567d3f67d4edb226ed1b9f658c8b0e2ddaf0a636 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 15:55:22 +0800 Subject: [PATCH 025/625] =?UTF-8?q?REPORT-92440=20mac-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=B8=A6=E5=8F=B9=E5=8F=B7=E7=9A=84=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/icon/WarningIcon.java | 14 +++++++------- .../utils/{SvgPaintWorker.java => SvgPainter.java} | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) rename designer-base/src/main/java/com/fr/design/utils/{SvgPaintWorker.java => SvgPainter.java} (84%) diff --git a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java index 20e6462569..cadf64fd94 100644 --- a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java @@ -2,7 +2,7 @@ package com.fr.design.icon; import com.fr.base.svg.SVGLoader; import com.fr.base.svg.SystemScaleUtils; -import com.fr.design.utils.SvgPaintWorker; +import com.fr.design.utils.SvgPainter; import com.fr.log.FineLoggerFactory; import javax.swing.GrayFilter; @@ -45,20 +45,20 @@ public class WarningIcon extends ImageIcon { //裁剪绘制svg的位置,以免影响到图标右侧的文字 Graphics2D graphics = (Graphics2D) g.create(x, y, WARNING_IMAGE.getWidth(null), WARNING_IMAGE.getHeight(null)); if (mainImage != null) { - new SvgPaintWorker(graphics) { + new SvgPainter(graphics) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(mainImage, x, y, null); } - }.execute(); + }.paint(); } if (WARNING_IMAGE != null) { - new SvgPaintWorker(graphics) { + new SvgPainter(graphics) { @Override - protected void doPrint() { + protected void doPaint() { this.drawImage(WARNING_IMAGE, x, y, null); } - }.execute(); + }.paint(); } graphics.dispose(); } diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java b/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java similarity index 84% rename from designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java rename to designer-base/src/main/java/com/fr/design/utils/SvgPainter.java index 6202f608aa..766dc3fc6b 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPaintWorker.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java @@ -12,14 +12,14 @@ import java.awt.image.ImageObserver; * @since 11.0 * Created on 2023/3/24 */ -abstract public class SvgPaintWorker { +public abstract class SvgPainter { private final Graphics graphics; - public SvgPaintWorker(Graphics g) { + public SvgPainter(Graphics g) { graphics = g; } - protected abstract void doPrint(); + protected abstract void doPaint(); protected void drawImage(Image image, int x, int y, ImageObserver imageObserver) { //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 graphics.drawImage(image, SvgPaintUtils.calculatePosition(x), SvgPaintUtils.calculatePosition(y), imageObserver); @@ -32,9 +32,9 @@ abstract public class SvgPaintWorker { * @since 11.0 * Created on 2023/3/24 */ - public void execute() { + public void paint() { SvgPaintUtils.beforePaint((Graphics2D) graphics); - doPrint(); + doPaint(); SvgPaintUtils.afterPaint((Graphics2D) graphics); } } From efbfb9ecbef6aae1ed9527e30af621ab453b08a8 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 19:00:19 +0800 Subject: [PATCH 026/625] =?UTF-8?q?REPORT-92440=20mac-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=B8=A6=E5=8F=B9=E5=8F=B7=E7=9A=84=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/icon/WarningIcon.java | 16 ++------- .../com/fr/design/utils/SvgPaintUtils.java | 28 +++++++++++++++ .../java/com/fr/design/utils/SvgPainter.java | 34 +++---------------- 3 files changed, 36 insertions(+), 42 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java index cadf64fd94..b4d7f33174 100644 --- a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java @@ -2,7 +2,7 @@ package com.fr.design.icon; import com.fr.base.svg.SVGLoader; import com.fr.base.svg.SystemScaleUtils; -import com.fr.design.utils.SvgPainter; +import com.fr.design.utils.SvgPaintUtils; import com.fr.log.FineLoggerFactory; import javax.swing.GrayFilter; @@ -45,20 +45,10 @@ public class WarningIcon extends ImageIcon { //裁剪绘制svg的位置,以免影响到图标右侧的文字 Graphics2D graphics = (Graphics2D) g.create(x, y, WARNING_IMAGE.getWidth(null), WARNING_IMAGE.getHeight(null)); if (mainImage != null) { - new SvgPainter(graphics) { - @Override - protected void doPaint() { - this.drawImage(mainImage, x, y, null); - } - }.paint(); + SvgPaintUtils.doDrawSVG(graphics, () -> SvgPaintUtils.drawImage(graphics, mainImage, x, y, null)); } if (WARNING_IMAGE != null) { - new SvgPainter(graphics) { - @Override - protected void doPaint() { - this.drawImage(WARNING_IMAGE, x, y, null); - } - }.paint(); + SvgPaintUtils.doDrawSVG(graphics, () -> SvgPaintUtils.drawImage(graphics, WARNING_IMAGE, x, y, null)); } graphics.dispose(); } diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java index 507768a047..103aaf0acb 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java @@ -2,8 +2,12 @@ package com.fr.design.utils; import com.fr.base.svg.SVGLoader; import com.fr.base.svg.SystemScaleUtils; +import org.jetbrains.annotations.NotNull; +import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.image.ImageObserver; /** * 用于绘制svg图片缩放(高分屏下) @@ -36,4 +40,28 @@ public class SvgPaintUtils { public static int calculatePosition(int position) { return HI_DPI_ENABLED ? (int) (position * SVGLoader.SYSTEM_SCALE) : position; } + + /** + * 绘制svg图像的完整逻辑 + * @param graphics 绘图 + * @param svgPainter 具体绘制逻辑 + * */ + public static void doDrawSVG(@NotNull Graphics graphics, @NotNull final SvgPainter svgPainter) { + SvgPaintUtils.beforePaint((Graphics2D) graphics); + svgPainter.drawSVG(); + SvgPaintUtils.afterPaint((Graphics2D) graphics); + } + + /** + * 绘制前对坐标x和y进行处理 + * @param graphics 绘图 + * @param image svg的Image对象 + * @param x x坐标 + * @param y y坐标 + * @param imageObserver 图像观察器 + * */ + public static void drawImage(Graphics graphics, Image image, int x, int y, ImageObserver imageObserver) { + //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 + graphics.drawImage(image, SvgPaintUtils.calculatePosition(x), SvgPaintUtils.calculatePosition(y), imageObserver); + } } diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java b/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java index 766dc3fc6b..67c066b2c6 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java @@ -1,40 +1,16 @@ package com.fr.design.utils; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.image.ImageObserver; - /** - * SVG图标绘制器 + * 绘制SVG图标的函数式接口 * * @author obo * @since 11.0 * Created on 2023/3/24 */ -public abstract class SvgPainter { - - private final Graphics graphics; - public SvgPainter(Graphics g) { - graphics = g; - } - - protected abstract void doPaint(); - protected void drawImage(Image image, int x, int y, ImageObserver imageObserver) { - //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - graphics.drawImage(image, SvgPaintUtils.calculatePosition(x), SvgPaintUtils.calculatePosition(y), imageObserver); - } +public interface SvgPainter { /** - * 执行完整的svg绘制逻辑 - * - * @author obo - * @since 11.0 - * Created on 2023/3/24 - */ - public void paint() { - SvgPaintUtils.beforePaint((Graphics2D) graphics); - doPaint(); - SvgPaintUtils.afterPaint((Graphics2D) graphics); - } + * 绘制svg图标的具体逻辑,方法体 + * */ + void drawSVG(); } From 8ac5a7e5ea17ae0852b4eaafdf25ad153a6cfbb5 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 19:02:30 +0800 Subject: [PATCH 027/625] =?UTF-8?q?REPORT-92439=20mac=E4=B8=8B-=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E6=94=B6=E8=B5=B7=E5=9B=BE=E6=A0=87=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/base/svg/SVGIcon.java | 9 +---- .../icontainer/UIEastResizableContainer.java | 10 +---- .../gui/icontainer/UIResizableContainer.java | 37 +++---------------- .../mainframe/EastRegionContainerPane.java | 9 +---- 4 files changed, 12 insertions(+), 53 deletions(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index 613b6ddbde..1280fbf737 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -1,6 +1,6 @@ package com.fr.base.svg; -import com.fr.design.utils.SvgPainter; +import com.fr.design.utils.SvgPaintUtils; import com.fr.general.IOUtils; import javax.swing.Icon; @@ -37,12 +37,7 @@ public class SVGIcon implements Icon { public void paintIcon(Component c, Graphics g, int x, int y) { if (HI_DPI_SURPORT) { Graphics2D graphics = (Graphics2D) g.create(x, y, image.getWidth(null), image.getHeight(null)); - new SvgPainter(graphics) { - @Override - protected void doPaint() { - this.drawImage(image, 0, 0, null); - } - }.paint(); + SvgPaintUtils.doDrawSVG(graphics, () -> SvgPaintUtils.drawImage(graphics, image, 0, 0, null)); graphics.dispose(); } else { g.drawImage(image, x, y, null); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index d078b747fb..c018e622f1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -5,7 +5,7 @@ import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPainter; +import com.fr.design.utils.SvgPaintUtils; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.JComponent; @@ -337,13 +337,7 @@ public class UIEastResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - new SvgPainter(g) { - @Override - protected void doPaint() { - this.drawImage(button, 10, 7, null); - } - }.paint(); + SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, 10, 7, null)); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index 20109fff1e..0c69d47e74 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -3,7 +3,7 @@ package com.fr.design.gui.icontainer; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPainter; +import com.fr.design.utils.SvgPaintUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; @@ -421,24 +421,9 @@ public class UIResizableContainer extends JPanel { Image upButton = (upModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_UP_NORMAL : UIConstants.DRAG_UP_PRESS); Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); - new SvgPainter(g) { - @Override - protected void doPaint() { - this.drawImage(UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null); - } - }.paint(); - new SvgPainter(g) { - @Override - protected void doPaint() { - this.drawImage(upButton, ARROW_MARGIN, 0, null); - } - }.paint(); - new SvgPainter(g) { - @Override - protected void doPaint() { - this.drawImage(downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null); - } - }.paint(); + SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null)); + SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, upButton, ARROW_MARGIN, 0, null)); + SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null)); } } @@ -535,12 +520,7 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_LEFT_PRESS; } } - new SvgPainter(g) { - @Override - protected void doPaint() { - this.drawImage(button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this); - } - }.paint(); + SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); } else { g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); if (containerWidth == toolPaneHeight) { @@ -556,12 +536,7 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - new SvgPainter(g) { - @Override - protected void doPaint() { - this.drawImage(button, 10, ARROW_MARGIN_VERTICAL, VerticalToolPane.this); - } - }.paint(); + SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, 10, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); } if (isLeftRightDragEnabled) { g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 0d3dfcae84..e6490b84de 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -19,7 +19,7 @@ import com.fr.design.notification.SnapChat; import com.fr.design.notification.SnapChatFactory; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.SvgPainter; +import com.fr.design.utils.SvgPaintUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.log.FineLoggerFactory; @@ -1314,12 +1314,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } else { button = UIConstants.POP_BUTTON_UP; } - new SvgPainter(g) { - @Override - protected void doPaint() { - this.drawImage(button, (ARROW_RANGE_START + 8), 4, null); - } - }.paint(); + SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, (ARROW_RANGE_START + 8), 4, null)); } } From 3b09ea22b35e23f36553357e1330ee7f101d5da0 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 20:09:55 +0800 Subject: [PATCH 028/625] =?UTF-8?q?REPORT-92439=20mac=E4=B8=8B-=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E6=94=B6=E8=B5=B7=E5=9B=BE=E6=A0=87=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/base/svg/SVGIcon.java | 4 ++-- .../gui/icontainer/UIEastResizableContainer.java | 4 ++-- .../design/gui/icontainer/UIResizableContainer.java | 12 ++++++------ .../fr/design/mainframe/EastRegionContainerPane.java | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index 1280fbf737..832fd33e91 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -1,6 +1,6 @@ package com.fr.base.svg; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; import com.fr.general.IOUtils; import javax.swing.Icon; @@ -37,7 +37,7 @@ public class SVGIcon implements Icon { public void paintIcon(Component c, Graphics g, int x, int y) { if (HI_DPI_SURPORT) { Graphics2D graphics = (Graphics2D) g.create(x, y, image.getWidth(null), image.getHeight(null)); - SvgPaintUtils.doDrawSVG(graphics, () -> SvgPaintUtils.drawImage(graphics, image, 0, 0, null)); + SvgDrawUtils.doDrawSVG(graphics, () -> SvgDrawUtils.drawImage(graphics, image, 0, 0, null)); graphics.dispose(); } else { g.drawImage(image, x, y, null); diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index c018e622f1..cec4b840a7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -5,7 +5,7 @@ import com.fr.design.base.mode.DesignModeContext; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.JComponent; @@ -337,7 +337,7 @@ public class UIEastResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, 10, 7, null)); + SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, 10, 7, null)); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index 0c69d47e74..a7682107ec 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -3,7 +3,7 @@ package com.fr.design.gui.icontainer; import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.Constants; @@ -421,9 +421,9 @@ public class UIResizableContainer extends JPanel { Image upButton = (upModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_UP_NORMAL : UIConstants.DRAG_UP_PRESS); Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); - SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null)); - SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, upButton, ARROW_MARGIN, 0, null)); - SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null)); + SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, null)); + SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, upButton, ARROW_MARGIN, 0, null)); + SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, downButton, (getWidth() - toolPaneHeight - ARROW_MARGIN), 0, null)); } } @@ -520,7 +520,7 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_LEFT_PRESS; } } - SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); + SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, -6, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); } else { g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); if (containerWidth == toolPaneHeight) { @@ -536,7 +536,7 @@ public class UIResizableContainer extends JPanel { button = UIConstants.DRAG_RIGHT_PRESS; } } - SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, 10, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); + SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, 10, ARROW_MARGIN_VERTICAL, VerticalToolPane.this)); } if (isLeftRightDragEnabled) { g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index e6490b84de..c8f7281a32 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -19,7 +19,7 @@ import com.fr.design.notification.SnapChat; import com.fr.design.notification.SnapChatFactory; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.log.FineLoggerFactory; @@ -1314,7 +1314,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } else { button = UIConstants.POP_BUTTON_UP; } - SvgPaintUtils.doDrawSVG(g, () -> SvgPaintUtils.drawImage(g, button, (ARROW_RANGE_START + 8), 4, null)); + SvgDrawUtils.doDrawSVG(g, () -> SvgDrawUtils.drawImage(g, button, (ARROW_RANGE_START + 8), 4, null)); } } From 0b8b849e2e3992fd1a531838aa26242c6de992c8 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 20:14:35 +0800 Subject: [PATCH 029/625] =?UTF-8?q?REPORT-92440=20mac-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=B8=A6=E5=8F=B9=E5=8F=B7=E7=9A=84=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/icon/WarningIcon.java | 6 ++--- .../utils/{SvgPainter.java => SvgDraw.java} | 2 +- .../{SvgPaintUtils.java => SvgDrawUtils.java} | 24 ++++++++++++------- 3 files changed, 19 insertions(+), 13 deletions(-) rename designer-base/src/main/java/com/fr/design/utils/{SvgPainter.java => SvgDraw.java} (87%) rename designer-base/src/main/java/com/fr/design/utils/{SvgPaintUtils.java => SvgDrawUtils.java} (72%) diff --git a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java index b4d7f33174..a50bb39969 100644 --- a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java @@ -2,7 +2,7 @@ package com.fr.design.icon; import com.fr.base.svg.SVGLoader; import com.fr.base.svg.SystemScaleUtils; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; import com.fr.log.FineLoggerFactory; import javax.swing.GrayFilter; @@ -45,10 +45,10 @@ public class WarningIcon extends ImageIcon { //裁剪绘制svg的位置,以免影响到图标右侧的文字 Graphics2D graphics = (Graphics2D) g.create(x, y, WARNING_IMAGE.getWidth(null), WARNING_IMAGE.getHeight(null)); if (mainImage != null) { - SvgPaintUtils.doDrawSVG(graphics, () -> SvgPaintUtils.drawImage(graphics, mainImage, x, y, null)); + SvgDrawUtils.doDrawSVG(graphics, () -> SvgDrawUtils.drawImage(graphics, mainImage, x, y, null)); } if (WARNING_IMAGE != null) { - SvgPaintUtils.doDrawSVG(graphics, () -> SvgPaintUtils.drawImage(graphics, WARNING_IMAGE, x, y, null)); + SvgDrawUtils.doDrawSVG(graphics, () -> SvgDrawUtils.drawImage(graphics, WARNING_IMAGE, x, y, null)); } graphics.dispose(); } diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java b/designer-base/src/main/java/com/fr/design/utils/SvgDraw.java similarity index 87% rename from designer-base/src/main/java/com/fr/design/utils/SvgPainter.java rename to designer-base/src/main/java/com/fr/design/utils/SvgDraw.java index 67c066b2c6..0ae7ff7af8 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPainter.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgDraw.java @@ -7,7 +7,7 @@ package com.fr.design.utils; * @since 11.0 * Created on 2023/3/24 */ -public interface SvgPainter { +public interface SvgDraw { /** * 绘制svg图标的具体逻辑,方法体 diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java b/designer-base/src/main/java/com/fr/design/utils/SvgDrawUtils.java similarity index 72% rename from designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java rename to designer-base/src/main/java/com/fr/design/utils/SvgDrawUtils.java index 103aaf0acb..0b141b9991 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgPaintUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgDrawUtils.java @@ -16,17 +16,23 @@ import java.awt.image.ImageObserver; * @version 11.0 * Created by hades on 2022/5/6 */ -public class SvgPaintUtils { +public class SvgDrawUtils { private static final boolean HI_DPI_ENABLED = SystemScaleUtils.isJreHiDPIEnabled(); - public static void beforePaint(Graphics2D g2) { + /** + * 绘制svg前若环境支持高清化则对缩放比例进行适配 + * */ + public static void beforeDraw(Graphics2D g2) { if (HI_DPI_ENABLED) { g2.scale(1 / SVGLoader.SYSTEM_SCALE, 1 / SVGLoader.SYSTEM_SCALE); } } - public static void afterPaint(Graphics2D g2) { + /** + * 绘制svg后还原缩放矩阵 + * */ + public static void afterDraw(Graphics2D g2) { if (HI_DPI_ENABLED) { g2.scale(SVGLoader.SYSTEM_SCALE, SVGLoader.SYSTEM_SCALE); } @@ -44,12 +50,12 @@ public class SvgPaintUtils { /** * 绘制svg图像的完整逻辑 * @param graphics 绘图 - * @param svgPainter 具体绘制逻辑 + * @param svgDraw 具体绘制逻辑 * */ - public static void doDrawSVG(@NotNull Graphics graphics, @NotNull final SvgPainter svgPainter) { - SvgPaintUtils.beforePaint((Graphics2D) graphics); - svgPainter.drawSVG(); - SvgPaintUtils.afterPaint((Graphics2D) graphics); + public static void doDrawSVG(@NotNull Graphics graphics, @NotNull final SvgDraw svgDraw) { + SvgDrawUtils.beforeDraw((Graphics2D) graphics); + svgDraw.drawSVG(); + SvgDrawUtils.afterDraw((Graphics2D) graphics); } /** @@ -62,6 +68,6 @@ public class SvgPaintUtils { * */ public static void drawImage(Graphics graphics, Image image, int x, int y, ImageObserver imageObserver) { //如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整 - graphics.drawImage(image, SvgPaintUtils.calculatePosition(x), SvgPaintUtils.calculatePosition(y), imageObserver); + graphics.drawImage(image, SvgDrawUtils.calculatePosition(x), SvgDrawUtils.calculatePosition(y), imageObserver); } } From 3e253a43a7af337a4a2bfdf9149a03a223a73568 Mon Sep 17 00:00:00 2001 From: obo Date: Mon, 27 Mar 2023 20:15:51 +0800 Subject: [PATCH 030/625] =?UTF-8?q?REPORT-92440=20mac-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=B8=A6=E5=8F=B9=E5=8F=B7=E7=9A=84=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/cell/bar/DynamicScrollButton.java | 6 +++--- .../alphafine/component/ProductNewsImagePanel.java | 11 +++++------ .../mainframe/alphafine/question/QuestionPane.java | 9 +++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java index b250119510..cc0ab91809 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java +++ b/designer-realize/src/main/java/com/fr/design/cell/bar/DynamicScrollButton.java @@ -1,7 +1,7 @@ package com.fr.design.cell.bar; import com.fr.design.constants.UIConstants; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; import com.fr.general.ComparatorUtils; import javax.swing.SwingConstants; @@ -69,7 +69,7 @@ public class DynamicScrollButton extends BasicArrowButton { private void paintArrow(Graphics g, Dimension size) { - SvgPaintUtils.beforePaint((Graphics2D) g); + SvgDrawUtils.beforeDraw((Graphics2D) g); switch (direction) { case SwingConstants.NORTH: g.drawImage(UIConstants.ARROW_NORTH, 0, 0, this); @@ -84,7 +84,7 @@ public class DynamicScrollButton extends BasicArrowButton { g.drawImage(UIConstants.ARROW_WEST, 0, 0, this); break; } - SvgPaintUtils.afterPaint((Graphics2D) g); + SvgDrawUtils.afterDraw((Graphics2D) g); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/ProductNewsImagePanel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/ProductNewsImagePanel.java index b46d094d8b..1baa092cec 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/ProductNewsImagePanel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/ProductNewsImagePanel.java @@ -2,19 +2,18 @@ package com.fr.design.mainframe.alphafine.component; import com.fr.base.GraphHelper; import com.fr.base.svg.SVGLoader; -import com.fr.base.svg.SystemScaleUtils; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.alphafine.model.ProductNews; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; + +import javax.swing.JPanel; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; - import java.awt.RenderingHints; import java.util.Set; -import javax.swing.JPanel; /** * @author hades @@ -58,9 +57,9 @@ public class ProductNewsImagePanel extends JPanel { } Set readSet = DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().getReadSet(); if (!readSet.contains(productNews.getId())) { - SvgPaintUtils.beforePaint(g2); + SvgDrawUtils.beforeDraw(g2); g2.drawImage(NEW_TIP_IMAGE, 0, 0, this); - SvgPaintUtils.afterPaint(g2); + SvgDrawUtils.afterDraw(g2); } g2.setColor(BACKGROUND_COLOR); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionPane.java index b2c186a9ea..f96622d5ca 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/question/QuestionPane.java @@ -4,13 +4,14 @@ import com.fr.base.svg.SVGLoader; import com.fr.base.svg.SystemScaleUtils; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.alphafine.AlphaFineUtil; -import com.fr.design.utils.SvgPaintUtils; +import com.fr.design.utils.SvgDrawUtils; + +import javax.swing.JPanel; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; -import javax.swing.JPanel; /** * @author hades @@ -33,7 +34,7 @@ public class QuestionPane extends JPanel { protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; - SvgPaintUtils.beforePaint(g2); + SvgDrawUtils.beforeDraw(g2); // 宽高保持 int width = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (getWidth() * SVGLoader.SYSTEM_SCALE) : getWidth(); int height = SystemScaleUtils.isJreHiDPIEnabled() ? (int) (getHeight() * SVGLoader.SYSTEM_SCALE) : getHeight(); @@ -47,7 +48,7 @@ public class QuestionPane extends JPanel { int imageWidth = QUESTION_IMAGE.getWidth(this); int imageHeight = QUESTION_IMAGE.getHeight(this); g2.drawImage(QUESTION_IMAGE, (width - imageWidth) / 2 - 2, (height - imageHeight) / 2 - 2,this); - SvgPaintUtils.afterPaint(g2); + SvgDrawUtils.afterDraw(g2); } From 94f9aadec21e8b3b0b84666ff2743608ac8173b2 Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 28 Mar 2023 09:21:43 +0800 Subject: [PATCH 031/625] =?UTF-8?q?REPORT-92440=20mac-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=B8=A6=E5=8F=B9=E5=8F=B7=E7=9A=84=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/SvgDrawUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/SvgDrawUtils.java b/designer-base/src/main/java/com/fr/design/utils/SvgDrawUtils.java index 0b141b9991..5754b2f8d7 100644 --- a/designer-base/src/main/java/com/fr/design/utils/SvgDrawUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/SvgDrawUtils.java @@ -13,8 +13,8 @@ import java.awt.image.ImageObserver; * 用于绘制svg图片缩放(高分屏下) * * @author hades - * @version 11.0 - * Created by hades on 2022/5/6 + * @since 11.0 + * Created on 2022/5/6 */ public class SvgDrawUtils { From 149aaa9d4c645531dce589cf0d27feccb060fb8c Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 28 Mar 2023 10:52:28 +0800 Subject: [PATCH 032/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/locale/impl/EmptyDataMark.java | 37 ------------------ .../module/ChartEmptyDataStylePane.java | 2 +- .../com/fr/design/images/us_emptydata.png | Bin 21918 -> 0 bytes .../com/fr/design/images/zh_emptydata.png | Bin 25842 -> 0 bytes .../images/zh_traditional_emptydata.png | Bin 18659 -> 0 bytes 5 files changed, 1 insertion(+), 38 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java delete mode 100644 designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png delete mode 100644 designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png delete mode 100644 designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png diff --git a/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java b/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java deleted file mode 100644 index 6b7a2f5fbd..0000000000 --- a/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fr.design.locale.impl; - -import com.fr.general.GeneralContext; -import com.fr.general.IOUtils; -import com.fr.general.locale.LocaleMark; - -import java.awt.image.BufferedImage; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -/** - * 根据本地化信息设置服务器图表空数据提示图标 - * - * @author obo - * @version 11.0 - * Created by obo on 2023/3/22 - */ -public class EmptyDataMark implements LocaleMark { - - private Map map = new HashMap<>(); - - private static final BufferedImage ZH_EMPTY_DATA = IOUtils.readImage("com/fr/design/images/zh_emptydata.png"); - private static final BufferedImage US_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/us_emptydata.png"); - private static final BufferedImage ZH_TRADITIONAL_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/zh_traditional_emptydata.png"); - - public EmptyDataMark() { - map.put(Locale.CHINA, ZH_EMPTY_DATA); - map.put(Locale.US, US_EMPTY_DATA); - map.put(Locale.TAIWAN, ZH_TRADITIONAL_EMPTY_DATA); - } - @Override - public BufferedImage getValue() { - BufferedImage result = map.get(GeneralContext.getLocale()); - return result == null ? US_EMPTY_DATA : result; - } -} diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java index e73bae010e..50de28871a 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java @@ -10,13 +10,13 @@ import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.locale.impl.EmptyDataMark; import com.fr.design.style.background.image.ImageFileChooser; import com.fr.design.style.background.image.ImagePreviewPane; import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.locale.LocaleCenter; import com.fr.general.locale.LocaleMark; +import com.fr.locale.impl.EmptyDataMark; import com.fr.stable.Constants; import com.fr.stable.CoreGraphHelper; import com.fr.stable.StringUtils; diff --git a/designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png deleted file mode 100644 index 46597ea7a146532843bfce15eadefb1f7ab12263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21918 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 diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png deleted file mode 100644 index 5a6c3a9624f8428547454528e6ce58fe0c6d9758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25842 zcmeFZg;$hq^fn5^AOonBfJhH19SWj!Hz*}tQqm#aAq+@&BdO9kG)VUluXHn%^w13P zJ$`3>=bS&`oV9)|X3YT4Jagas-uv2hZD8uEa!>GH;9+23JW-IB{(ymjc?~=!Adi6G z*eG;%08f~%ALJx4D#oaGfghwTJ}OwMs9>-GuOS$i;WilHf0qD{7r+Ap11k>`0}FV@ z{P(*&(Es@>=5-#{|NVO6--UK3qgxml;us3j5}KZv2iZ7T&(4<~gbr65B}q6mF-h?+ zXbNCI@&fzh3VI@*y!Yhz-J|({NEBwien{+pR?uVp?7egWE;IARR|yhx*zCJtI>pL< z>I3VCOOH9B%L_{nD-SD6D-W?#@6pkb%7^8Sw(HxQI@=N{u(bI9eE*LG{zn4;BZ2>~ zOJFElT&4+2{az;TIqstOUODyOzkff!prm}K<*KQv>Gs*d;ZRdcORLQfeeu_Rp+QSa zTf3pZHDUV#IngwKCop2p;_hzOYsWuhdHZSuPJtfPZ?KySy!L+AA4}VTS$nX!M~F$p z3I!2gL)kc(>Te-wX)~^NOU?DCebJQf80xaWo6M-1PFkW%FeFFFuG=$;*xG*n zJUy1qU$Q%ITe(DLsrM`u5)tSDBKA5eLw*2*Sa|H`>)!UbvFQDIN0e^3hZXxO7Gizw zSkg5i{#J+nrqugvr}{H;AU+cX`Cud?4)$fFi@zi)4kiw=!!-!FJAb{@;;}+ny$>@c zIsa?d9g&AVN16+j-&?&xDz_fW?9BF9o{NS#-@SF) zF)6>ua4C|QxyKtrJbFsi_>uG0<&Knf#gsU1AY4J;Ihi!5pT?)md#=X9Ptb9Bk-)ST z*Y)i>c&B$3FR@p72W_`MTg`l%(Nt+14grgcLuoNIv31+Qgq4v$HA)VL_D}C2vs`ua z=VB>q+nqIS(N6jU*Sn3*8+I4%z^X8FAv@Se5_xQmW$;H??LQ@Iw6@g*!P53#Qv)KG zn%}h7(FIZ5?VetT-v>$nVM~cakK)F)z%FzqhA5>}E^7H@9fR~{)6oWM^c&&cC|fZJzGY#TLzK64M7=@cj8e%$jrTx`NISr(kDc$Q;RJyVTz4Ae52gtXXdpVZc9 zl&B)KbaWPEU&o8e?`ikkW2G$mQSFAZIYSBm306LjRK*Q<(I0(qad08^M(K0OTW}>- z*K(>hnh-V3zCtW6Y+PDd84&Hnu=0zgQmMsl7xk$8X3O`K^8uzFDuIs8Gf+_Y#FwS=Sp}YeJdo+p*he%C(n1XNAMb$h?*n_iGj42( zaAVWN>4U5zW48$z*E>9owFq%uqPPKa4V#zc?S$g1K73KPJUzVXyl%uww)3K;^PO{{ zt7R<97mGR>&-t&*V{EA%YK%hE1bsPedvOSJzVwId>3(N=VC1~PR;7tr{dI_jvNAGF z1OR~Zkj~ZvAxRVVLWzSvN7Va=s4}m&1;>_g{P_7(H^GJ)u5z0x;^R(zsB&zpa&_=c z2lQ6RrnjQ|=6nxr(oSpXM|BD^$Q+#U(@cr99LdB>X+FX~mU^EQ#zc4(RZ%sku@9{Z z!SET=snD(6!Z13!kVwyqJ^u#l@SC$pT$hQr+2en9rW z9g`y;(uO8a>$X-d8DdStB(5E;K5kGCS^9r;W}_iuWef^#rNT=$?KSiV@4HsvlXD3Z zOFV8>qWo?6U%jnP<{#=IS-!_2ZsK+BMSJanOq3+|p?h45I2T0Jo(}tqO{Z-=M2beR zet1Y7!tw!4;D@h{2@{tF44pxbM=?bVOyhsGrq_OXk1dJs>qTX_a|%HI!&4A3jLC8u zt8>h+WpcfNtYZr0!3JvSVmu-^;PJV8KPGdZq}}+v(?XO41=TQG+cK(7#s}1}Danmu zi@*KycA~DLHs`+-POiSIRJ!BJPkWW>hvlFu>xujvO=U9?3{|GUvyV(Bf@4oLAf5buQd+sB+1Q> z5h`gsrmoEJUK2<2+m5>fN1qSQu=*P>cfE(U^~-WLmHPVnsWhI(pU+WSDY9Vy-aLsA zBMJb+$pn4UVdA_bfUddjzC5S^+dX*c{RlUunDuls>*;xoA7q?mtvz%(V;s)^`_dIogLHpeU*$V;9!v0Kag-{!iUb0HB*lG z+BBjj=4PMV%@;7|tLax=0W}ISkFoxnXnAji-dsr5_U9!1{`SMh7YN;LC<%j&p zepf>~9j-`LMo@%Ji`djpHEt$^q2t3D7e~E8lp0C_vw-e?jBIdq78=by5WCV^33Y2btuBc!$BH!s=EyWSj zWts+Bi6Q&T|M}X2Bj?*wyO(q;Rk1KJC6GQFrrU!DVrR|@r)N&SXv4UOufNMm7_VXg z@P<)kok@!g;C*(N*0k7SZ0)&efj1UVZ{8*X&7?JF*TVIc(k5w5#jwXnXFY$M6XQbLg#_ z_VX!uOakrA&WNmbhDj(Q=c3h!Xg|7-C$A+y0fhaz&XGGZi(}}COFKA+I!U2(Q6rGR zHt!K3JTJ(|$QZL)pOx?NQx~qN(G?&EFDRSpv1inpm#AjXPh~vNC8Fu}VI2=iFEuWn zLhZs{f=mekS1+OKe5KfFbnm)7CXyuHa`VDT(!{P%L(Svh{>hUk#&SpmqpIyh{rpFq zyVL;|o>TNi!-7NUdWdlKq053@INw#z(VNy#xz><_y)dK2p=gM7bfC28XQuqKPmG=T zGorPheJau3$9$E=_3bR>7nM~bdwXZZzCjQ>Klq-+-UsNBVjpey?+_fga-lSmeb&he z*FrPm#A|`T^ucDTcn&APEkgYLKRDHLep#(tw}&WmFKJmMpi72$JBHqY$MBzf&_>32 z{uF;@?A%LQdMh8;<-}6udyUc-Vc8E-m$@GK{bgt4G)20@AdTQ2oZo?7qjyy>0D-VkJ z%Jao5np}I+PrEr}Ew&6j%p0UGzBw!7MjYh}Lc{w5O^|1yfc?(~ke6z4U9l zSz|JQiJzH$yYs9dKlX+CA5iYLQ`bSsugTItpQQrvs3SCvOr8gwTuZ$cT`8XZL?{8O zc)bZJ)=*&60F}KzR37HsxMI&Ar|~cpx{w2ot*gYp{EI*8OQDReCDVf!%MqE4dEaa8fa*f;WBq`Sx9||UJ zXqe3s4?porY2e)OsF^SMQH%FgannTfJLQ%mcj?(+HN^8qj+mJUl8Lc#d{KVVCS?Ae z0ZAHxu83$JwOdZCjU)Z9XvWCrprI-~N!OR6WsjQX{QUgY7W+0&6JL@M6^qgKP(=g| z^a7zVF`l4^6Il^YuRcI-@rjO=egbN;bXGU^RPw*lH!ZyH?s>*eiLR#Pe}0K2JM$PG zHb^`K-4F6?)0aMiBuk)GT4|kX3_{?`%v&+DNOfu`p%4h$PggePEAca2kl>rRQ+lSsPFUPKg zN!FW*Wj*?Z3vF@OiW+>@GwFLvtff0iFk!7M$}Z2qn0lhgxqcUOyb;&9tw{v*G5I^X z&~oByI)B0wo;HqLB~m~7{_ShSvxjcl`zjM41j9}Tr$xd>hBE;*Z5{5QYuaYur@mqx zQGnd)D0FhQQsF1W7%*5|i9>VQg$eGT=MOfM<~}crM)0R@V5JCIE*jHM zKIED&(>1sm3#wNN-B7Ht$vJjYb{ov_iNU0?lsSwi|-5aJWWao}!Sj z&PY;rl!Nbn%`jKP?wzn2(alc8_h2sgia#2IHbhe$8b=QJGove{5G6=(*>l6RuEIYg zH)!rEDs91{KrVKbP;L$(Y*Bc!t1aI73?#8~wa}5hX@Te7(-y zoj>rq(*L~FZ%4N6YtQsEnP3f;4~FMI=dLUgbv)VAfB^GlmaIW!b`~lmx^Ky#r9f<9OtQq+tpP;4SOf0SzRlx1q}GUp{&6vUr7SG_ zLxtwLK~-=U9bG&@h)a6^?>>PI@zwrq!vgUSP+F6h<9HP&Qw6OpdnAe0d)r=5zxXce zol?JZr;1B^x)dc&4>(JFiMDU+pUf%Il4*Y3ZJJMEzJW|$4|kX7d)1l~FR%y2An-1l z@3cJ^{q5QxLDH3ZN=bo759&-q3Ufp8fXOtF+7D8-HZq|wQ5v$fJmGlnh;`uYv6bO zrf5G>!M#PF-p1Uxd=+S_(qcYWPXUrW z3*G%SiwyD$F_^u+C+{P&L}^i;x?G$Q9K!})Q`hco=C!3TUeVZ29sc2VE6=76%A5ZJ z+{2E*z|(;1&D6@`*AL#E6QM+{(xQ)tdaAunw`8Y>!Bl22`u7Ckl|ih;<+(zGR$9nHt(+mfh2Hcnf94YxmWrvS=pP+G!|*k~clW@BU7 zohWb1x5gxi0|7>bK`Vw%zp?jbz1-j>es?^Pame+4SRU-l0u+U) ze}a^md7RgKRO$?jlmxi*xBHI#FI%vQvY=*2pAQI8^nSgYJ%Hcswlfv3Ke8N9BIaOu zY|B)-F0C|Z9B|;d%F>8-lC)PgA6}Cjlikob$z!7OXJ)n~&9a|AS%k+@@LRqP{uo!` zvtC(NUjF3Mov?@$@pVtvw4Vte(4g;Holh|@AS<}>j(M+FR?|r5v<%O&Ie7YZGB1GY z*QQ$m&g8GLxcYL;^4z1($t#bYhxNcHz={x*-$4V?fkg@;&r?@aqxQ>{9T+}y$8$UV zrUEjvOzzg>u4G`%h7RWES>F%7S?z5T-6Z=nR1H zIo0&4{O`OwLI@ayVZP6kM0$8lyTBxuA7cq^|1KN>n5^~s^=qx$cDBrnj9;^4Gs`x~ zZsF+Z!0Pi;!27xi+Rdt~IVL%lJ9hEM&o~ZCH4Q5q0vl|qO;jTQ7pvti$4~3nbvQI| z7$V+mTeY%AeYRDbEF-TDuX(xvv(J*sYIx$1S?-jLhvA<5=g%K4ZOom?A|<9Sy<{cq z&c1EkmIq7`2+nn~T9>BMGItst3ljj&imz&pLpqzk?CG@)cq+8_57+#V&dGtmT4}|; z5_Ze~z^H@$VZ$iN@&3FC1cwHHW@kUvPpQ7^?a5WNp2x#T4&~G&-kP+nlFJl#e92v(bYrvHAz<$wJ}s7BQ8z6trON*E`F^DM%r<`TkR-OL2Lshg zKl)T9^EUM9Z)$Hhix0ZSj247n?#@+$~=%!!UnjH{9| z47%g?=u48^Cl(6GJ1+UK8OcsKt*uf-Gf@y2RHtpWae^y*@KMzYYRnNX-TqOLZPiT= z+vN7@L_eZ9(fECJsZr(wK}VPN8|XjHyP*clnrw}vYkjktVU!CT;4aXw8~yb2lLwJk z%79!UU4Go-X4Jvu{({d`IWbk3FWZwMsehlhOZQ&&7WywE*ET#?ZLEuEnAp6oIHfu% zl@?vcerAb!?(pkWsC}%LPpo&_m%Z`-Du)`zOz`|}JSsN?(^jQ29S zEd5do`SVzN87S=4(=!=QB+&yxp&;}AsB1~)rx*{ncTkW+!ka9#lJ!ugcP5c^G}DV{ zt^p4I^ZIpl@blyzLI4S+LJb|>Pw1&#OV)Au^zE&{-XyA|8v9@WjVO6Ph#!y9p}&Hi z{*Wkesx3K^kk94}l<DLPz+xIW1P`>Eb=)cmA?t z8buuF()`D(k=OdFKzP^)n)?%Dc)%aXGX9M4|9nh0Oni-z$2LIy?-ZE8l7Z(vHu@*3 zg>G})h5C!`6j6)c4{ruY6(mS{sEAiu{&Gr{t^VM$?tA8?0F)k5-A>53Tw5E3VZxHl z>8Ax0jb?+)pM=eDx{qn!NDW~H5 zBwxL6l6I;#I6aVfnRQo!l21z(Xzl$Ynq4Xd_GJQal(Yoo3V9_c=po&j-Cw8Ex0!kh zswW8cJdG20wZZ`})2si56r(cJC(zKovsQU3{pp55K;$|w&NhnF)G;V(6~4&*u_|wA zBUWrV;$br@*Mzt7`*+j#Km8>CH1D-(8|bfkwwkuC=$&fYOwxnefucD&QX@zRJo~DL zd08mdrqb=eaTELI=^=r_9*?wA&u4{O*FyTf7pj`EA{QTDla~6e`C$aNzpI|N(ln2M zH$(NoY@v2u2+|?7x3?$AaC-_l;`GO-eM0cR6(9&&|Gr6Mk6sz7%uCAZ}|mORc+ zilNo8$ljJ7k-a1h)t7n|nzFWovAGY-oTk57$5GZWc|i*~aj~)*c9avJGW*GCyCK1Q z6v$ru`80}HrHQm6+~n5nL!DXD<24vd&MZmohRMRp{%Y1fXBd0-617_34K< z*T_V%CvQK9b?5$bL%Rg~ehNkGr4Qs{r^Qu@nc^m5^OJqWix$vMr6pz(3zuoLSoEv_ zymdduhL>aYN%@!z_P6EKA4LDPgI@)^>>MZsih?DDjufz+)YxdIlOMol9V6i;SOobE z4bxw8f{lr+^j}`E8-;1y02*9m+=o5*9p>9WbUKl7?c2mf3{|^{YG8Ue?k1Sw+wv#A zEqHZ1@poIi*PO2FB3DiH8X2WL=@X;i9iNk}R#X{t)-V*3OYm6dC)2+G<&PvF5VB{@ zCyAX~qnWj2Ud*)R3{RA9mE|f-CyES`plW-5VsDHT+8Nl7Rnyhue~G_|-37{(q!D-G z{lbwtY)nCiiX|z&&y?C;O)|!FN4tD8;Ih6(zB-O-lr_yddWss5P)Ved{*f@Z z&oD7s+r-^anejye$whb9pLmhwFK9DSXPzWNzBnJut9zoE8E+UhrKa!Sn zLytaxOpAZeaW$sH5T(fz) zoulh>F^FZuol)T}?M%MKo28bqcRJGUoU0b)O|x{DTeGkwIFI972RSZdaas1J zk-Ys>wLuZ~LRs0|ghotzCpaWq5{pMNX}S-PV=Mi?F$Ex3wP%(qD?nRO+h(w7J$U7t zoT1^;^tTwKIM7!DA{fk!)=$ixQE#_X$%d0tDhykuE%g_;Ov2tkR}!ply)hCg`|0wV zZV4*;SCmF}{KK+$e3ulHoyr$i;3V-4_9h*jUSPyriiH(hq`4K4&z=`1s_N-Q&<2sP zl#2e9k2-xmkWBxpjQwK}qjXRTRgi%ZArp=S1u7SVv&pxCcPaAW(zBXoKVV2W?72<6 z)nk7_cX_mT11J_f3ON)@)4bv{U%n_06erMIYtS=$wCk7SNJ2HN-bpSWvYjI0@UFV@ z-s>t?(xPYU(KBS#rmIAhaEAxXS3(hf#&CX1pmW2TBqfH6oJxSZ@o)*xAkIFKka3?6 zMBXyQ3QuP9UY!o8X>*znZD2`XF!#;n5=gC*c_+@~ku0{ksS>rL0pBoJB0EHW$il&um)+IzTJ480$`m29j$ov+`HwXv zC(&iw*2X2+pr>*7k>TR@eF5r)X~H|(K^BVZdwCh=$xO`a98>J)FEHzoQc{LSL=$c4 zGfKlfu*j|jQw@gsO%i71h)<=FD(15BqM3t-yW)g`PO4GCo$qj&MHb{@sIIB58*`^l z7-DwG?tJ`$z zA*YC!8(}kj)3tHb?QVO`!09=|>#%U2(rWm4xRNKxUM<%2>(+>S1A~3Q$qRbJMTWNK z(SB+R!mCLUf!7HG+Zyty%oO0>oHV*yQh}-N8lv~q9d*T`ZigZ5P?~s(M7cD3+gS%A zlyWnz#Hyi>$a9@Th19E$Lj^gt!8`~)e(treyI<*Z2o#oA+IkddZpJfKhNBjI7vpj| z^-(?a@raT*q#!2%oqEDGBjFeuyX_Ieh8N7OIn6Go3f%rWDp_xMkLbS&PZ6HRMAUB! zPb+tH5{PAr1iiI8+@8^sr#ku>PjTSdI zm>`|NV*krr+`R96M z2uBYefj-oDODvGC7BM`}9S^4%a1B;24U4vxwzL%4sFU*<D-^$m_d+=?-;i%nv-gmtabve#EXIXGRcl^gjOn$vmXrqYRG+=;VlEes#EG zI^HeGt=M2nx#WARM7sA=#~HUypPy~xgh1@pNv)@Mc>iQm`J>Np`G1fCf@|l4vEt-b zqLvnlZsWr(K|IT(OQk}7bFZmM8mj-Qq=3%kYT_X)&I~N!Ju6nx_g6s1q*Oq~kRD}Q z**1Ma0l(Wm74=*Lco~E{0&r;}*rB)k&1qdNHRwc*4XYxVRe<;tDXH#zn5F;HsSm#Sq+y8huGSmqsw_}vk(IG*ClY@% zb4B`bd|{E;pHZ5I=mLr=wSjf)^`(>>UxxV53cd?Hb)GKbcB_rb&|PWwvx+B}`5sYN z=e?GUWIAOajp&rg84US6XvKxsG!O!ah`7oHqqWwU%44#2WI) z7m+?ZIyC4Qki~cVkr^td4>6jCh;TaH~Z;M zb4%lMpU}u4+spRUH~4E`aZ_{HnD(a2DOWvif)6W7@~5f7RKI6v@(oIWP@|}Ir+y^y=BXOy4by@aSD4|aXob@fO=W}A zj5O=Ypi{e)UMqm^Gm59{5+Y%-dPB|k>3gbx|EQKn@R+TJQl5e-o z(V+tjt1UhQaklrms6RvxXhwASi~yS)1xqy(I%|2=FejVGCh0~SEiQ-; zH752#FhRqcfJkFoQT1M!MEsMl;V&6-2SQ-22FP@t8EkEe84G?_{~StRcU8)W2Z4tv z$OFzry`Z32uZb+v#On^24NI(uy`fLOuIMHD0B*cGy#2#d0eSk8@%mgkZxsJ`BDWB6 z&_3jf4W%4cJLo~-AwA3mJHX>Y)$PxJD{4WS?kTWjBj3KG3G%o*ew>`|VbJyR1w+H? z9ixWXpbvKL>_N_8wvJEACbr0~L+uj_FO}Fun0N)?jhYe?#Smbw<{fCJ#Qwtasat`= zTK0X;HrUfiUa1N=?5O(i@WKk{QH3kjfK;Z1Ynr`PN@MDw1HpUpzCpm?9L&;AGC`V; zT8~eYaEGAk@gJD88pJ|{j^PP5Z27u}S7$F@ZWHeGKW zbmTS@`>uHsR@Q+akUPeO?M72C)%lmUbw#>4$f!?u#;9wnh!R$bh>!UO4ZC{PvWXky zT25zjXrccRPRC%;_q-{U9!KZVoF&+jv}aqtQrzYCmi9-fC`Dur76Sm%kIO--%z@(9 z^JbQnUJKU!v8EWtQ^{FJ969`v!lalw@hmZ#plundT6r_mEI!#BwiQm?b$DF7an!~u z!B}CG{F4){Lg$23Qd9JNX|j$PvIzvkd3TT8^xb#D>x7xp5C(+Jm;V3xpiE5<*~RR8sgJ4Gt`QybW@t0Kg54O4w#trZV=Vl25J{&kg zr{O>goi+xqmmx^xV%D7AyrkW&^zD1T$Hzggxd)`Cv!0``XRdCFTJ5G*8!w?BA`Gqi z{nkkzRX}4ixnPHp=Q%6iQhh&_F?tP(F<=GNAz!YLo-A{455`dv9ftw;CjW-l!;X2O zzS4#76R&e=wAkB$l{+N>FJxjX_ZA1IX9X?v(LX>ik zm>qt-rFB0H+`3(ONa#Zo(!vT|iJtuH!q;cXLo0NtYsA2Siik>$wtXuGWZ@N@DrwCQ z=fj^WC3N{tWMND`UqZ$adU4}Xh-H`X&@5+(yxXbU?pDN zn~w=#x)|qxt>;EA`L`olwW#LZbbKNh_@J@!UPNBQlj3k+rhte?eGR)q8fRIphgp_3k>H0H)jA{%qQQ8UNMdMKLtAe&_b}bH$Q2hVwCU5?&IAQ~ z(>{|uJwp5*{9ghh_q*gk5C(T!d28CK-c1S>r+JNTxZK_hxwE{gQUxMHw@Nk!~F;;qe5OyA>CG`so24UzyT3OF*_YnF`T zr8JX?s| z4q8x7bw97y59o}Wh8OC~B=s66T!^))Sngh$&KLkXU)-U9F>skr2656?>T+V`$gdUb zTFk+%K?LMf&R=VKNAFStnQG*Jy%|4i{W3j0XBaTecHg152|{hF!T8fBW`?Ue>(5i+ zxT-mN-HlOM1C%&yB98N~yWcmNc7HYJYkc|HmhD}?*B}OIuV8EAF!HNH)E`YUHvXp5 z&xj+va?i>tBo_~`=T3lPQ3(d372 zoJbEvWFpYmI5X*5ic^k%Ph|b(q=%&K%=Z)CucdsMC|}!N4gV+><+SlQ-VZ{AL4g2# zVm&Hb4V>mA5U!ohOPfnAM7WBmDun zQFWh8H2)MQe0+3qreGo8sZXF4oiHvU%;;{rJ(g{JzB-mj;!gmi3LP6V+u0sDsYisK zim6mEaZ$hzUymmmuRxTu-b`4|qo;37K}N;)4)C+XrFWT|?(Lg@l*G$~KgN9YoR7^V z+u0S!*=Jh((NaAaTDLCet-#`I^bacS=L)%T-aWm6qU_F+s)Kixf=MGFo`9>n#86P} zqUUi~Y>Xu;YlSn{|2O^TPkLa^Y;DmCNXC+W}Ln zWRt{dset{w+f%QTn$ITe$wAw9K(%m-6BSw=xRPACVsXqLi&uIJ1cSqsBMh15MsW*i z@%vucKF#0gJQwDuN=BzEasBfbwP=;Lj@P=$q5g&e_{v$#E#1 z8i;EBelS@yoM@17u-xsuUl1$m9f;!*@7k5&ssGe7FEy0DScN0mcPvW3(&1kphzRcG zCl|D`uu!+&mXbVEIG7DV$^d;da#63R!5G}b9yVdyOUYy4)_S*xmY9|)GY-7?*jOR4 zz2w?xMD1qz%yiX^3Dy_6-cLNGxL>`ZLs$CDrNW;s?fhvY_h8p98z?Q!iR@oLMTm8< z`fC_@4yfz`eb!V}-4tb2yAUeAL}%Re)W;0o6-!HyFz$ssZw0A#2UVfXq*UDQ(m+iC zK|$l=tBu&BY{yp9E32+mdI)l+wNJ*&pT};NXQid*C*c+YDpNtH`8$2(T;e;T<7~j2 zc@*M}6M)S7W3mxZuDb1}L|^v=;AuXjqrQo8@BnEieLuguJ8<2gxykgo@0f;~$hl1H zp_GTLnj$u7eB$7O&Kr@oaHkn*ZbX3uW6Fxu7!)C#aCy~sGha(6O+#wwMSOgQ(8{q+ z+LI)iwTCY)uWn|}JhzGjw6olxiSGzcI?Xo*AmILiY)H-Zz^<}F<8n-Er)y8h>+~n5 zU~bt;!g4;*!)$NQ+85OX{pk2-Of#nn-%ZvBXCIJxj)nt~?ku4HrX)JPIk-I?AGR%M zFY8PvNf&`Va{^fH5BQJkp(HzCQ?=>T~-o#nhkkgkf)to#_(ns$+_Bk|`6ulVX zi(%O6e2nxpuV&wHcLx&(9@3R_2}ia?}p^p)r(P<|joK_P;RCK4IV_VU42MU1VOE z$UJ2`CBDzLJKT2Vf~q09aO&1)(CJUZm_YtOj|8ovxpu8;GM*=Kgvy5xdJ0ir)oY{o z!3Y_4RK$ck_z1H?*DneCa@ryQYK~5=&AF%R5lDLQqh!l-aR%@8R~Aym4AL*dXSwO( zoISTMo%YJ%)05E48qC;@BI@gps@She`K(XMD2X8P;;aul^jmW8lj$(~OyT1%0;uB$ zuB90FX>^F8j=fPPjuwM+xs8@f-9fq8gg+ikw9$fuXa-}?wXh62e?9`yD-)|dA(J1g zY+V4!P$=AUxj^!i&StD>5vX~*@R^vJScqC^%sjUMOGp&qrIa_Uah2m)le*E?k zs74HaOGJDf^#ORUr>OMVzHp1?nm_w=S5N8pB??P}OB0c0l_N!0IHuPZxa*p@bVqHl z67q{vjV9-jLBuq`eAKDijh2$0`9Z?^x2>Y!sm|_cDhBs#WUkCjR@+ z4dPE=#c@7VTG7n5r(H#&npDAK6Dz;qUWJ2>=jw65HuY0vGQlp>hSu4x*28j=R5*+m zYCKQYpSoRp7(cJ1$TcRmx#ykcxB zzowQB>R&4LHUDmX@o^xDb}m&EC{HSNd{bf$Z#9AQ``_Rh9`!?cbfdq&089Th*J}^I z{QJjN;iq^Itlo{baLizWJpl$P9t`u)91y ze*BvGV2S#;Kh!(^h%1YF6)vQeQ z-i-P*dKA8IglLV#Y`FeMr3XkG89Z^|hZ>J>EUM9_CxQqOx9mf7Lv0S?a;v876KL~k z`nYNF%4V|gGiY`Y^qp_QG9g!sk@o?9PPa)KFB~Nv1S}dKY&5Z@)+q|qg)8B;xUf|B zvAu&@Sjo79n(#?anA@5fb4LT|;a|xTmY4TT5jUDWOASAxpKxcnO)9Xz9NsOQsec_k zu05XZpK_3v`b^s>Hk87)w*|XvJiMrvdH!|t+_3WhLrzv!2qbIs8?bax#8Du#mYLgE zmohId;^1XLJ>zlit5Mi+_lL@Y9c@7n*+40YNGM|8#8v^BKQ-`(EB?8W(&wLt-Va) z&d&r*7V9~H%ZJJtLvMDzvh;mg9vfK7c#l+%Ad-q*@+ zj9m#$j#7K=0E1FBu8qrKnPuCb7{hU+maIoJof-0J^na0)U+G+n`VN+L$&bPRPqf$k z$#rPh|J`tzkt5LM=^S232`mzRL_lNU4n6ARQC-x>zabHr^!jGF{Afx>6cSGvVQ6PC z@0__udcOd%CDPHiec&xWjrDTipU&p;Z9d8Uq>xwMvC=(Cy>@O6UACFM8yyv;ClY-O1~{7_w*y@8QUC?KMnxlboo zQDDZk#l0@4h3@K(s4<(UoyNci>bqnzRa_stIoH{`j)QdG zb3nPGz9%KgBEZT4#j4rfgpweG<_h@`^(U(wZ?_TDb##HJ_n%4Wn)5iAU ztiU9TF{jQ7ZTg-AEMiZ=WT7mOfA?f8ym=p zRY+y*rbLl1N)m6>{RMhqyyYLz<43y~YcjCK*Zys0Wi&T^t%Tgcc+Ff!*YQ^pn{s-T z_xZXs(j z%j@vRMWSgBL zubCvgZS<@oZAzf~nzHp0gj^4c6y_P5{$_5LH3 z?KAy2ixQ_GGO;lf6!lq%*1q`}0WUAQ^ycWlOA=i1t!>bUJ5Y1A?AKTri3|axTYk(h zGyi*T1FCKbPSdG|XA-ynAgT}`h6<>n#N+=>f_P!FT|?Emz*jsfIH>s=#!2&bcI#`M z+C)PV!(07b%r}vn?%`f%>{d|qGa$l}F%BIHge2i$>YZGq&kfnRMEzKJd!+*N=b?m+ zTV++H?#Nw2)yse@d-Yrt;gBQ>%;tsKdu5*TO99$`3FJcUSN~VEzfU#`ge|lm4>`pD zqw4Dhy=;Q2SAb)H{G%RH$L&K+cb~n}CpIG*s!<`Fe1!T}Xp42x=90*dwpHN=B$QR}=3gO^{*b**XlziG% z8Iu9#wEz<={*j~(%oI|ZSN{B&KK2K(^f$&6u(Mb~Ln2lgAVK@Up|z<1R!r+0|1Kps zX&*paejM#@kys^LWq(NHA6DWdO~(f8@cm2NB4Ap+lOMC4wxgz|#^vpL>r!pWtEamZ zRU7+2ue{Ofg;fo4P(D!9<8Fp(1Oua--!N7pbHn?@wiu#6dqc+j0C4#1`&dH)CN2Ra znfQ^$@lk;gq?E}&u(b~A$WnW*;NMbUxsdg$TU4xru+d|A_-61EeR$n!QCmzyKd3Ngh*2v;!L5 zR3YCme4bwQ)B?IZ(R7n4MihYuBuSczlDojn>p*(vKs6*f;=vP1q5Bq?gYpnSGX0lCx;9L!!f?ShX$gq`k50&R1xA}Kn4sSSrro?5#op7 zo#ue->D#EL@bP&T(=Yn%zD*77_R%tGGLpc47_o~!0sHY};W6upC~+29Xo>yCMUVzG z5-KPR2ZJEe01Z>r3_Bkg0mxG=aP92i4t@E6Uw&+H9p1nY3JgA8Ub1t9F@Q_~4Gfpj zI{~f>RWuohqaXDh*%E~s9%=M^5e+Lak*0eEtbSab9STUe3ip^d^R;pon&HG@RM0`p z2OFglbsH6^1B`4{79v%_(s``7RSe4|jJMx~NmjlEhfUSz5ieTFNu7)JgB$Ahe%)(`O>R`9oM6QLqkJLZ?^x94k>lXFC4&E+BJZ$ za3HDZ!zE!ZLp)=#**_n3^mnz9k?Czvc9@z|%N1=SMh^kA)Lsh!p1=!T+20YdJ^~#? z(Z?$mK%S8VQ93lPl>$R|cN-Ade$8Fkq(@7h8_`yUHL+>e+(4X#GIMo39bSMtUe=qM zto>e(N@P}f%gT$0j*eDy1Ws}g06Q+#SK$Y5NY12dukMsbW`5tXk-tO8Mv-wg@75wj z7tZ=99fc3)5~(7^Lvb~Msa{1r7||+|a3qJ}bJ+@$nnhYv0Wg=96hsUx_9RiBg_sI<_~Vi&Zk)i7#DgO&t+^0nBjbd89obhf&V~@9tvv!L!Asm`tIo zxy-sAy@N$~i2;t;GEwbUH&dj!+-<+QgT24T+*bu}?pC1YwlX@MyBH0)kdtRK#5Zax4YqoSuft4%`NMHoY1;^|8U5+*agIzcSzNt(-IWZK`$4ZOgCYUtIYSz2BzMGq9HVTjImErqK8?;KcljISm?*!+TD! zpFa-yJ>_s%t^@Yq4YCIY{Ryao1mPX%rK1~X*m(v|;c-xAfY=D@LPgd$ z@ijSSC9qZ_g~4n`u%|@j+HJZcCNsE4=?XMmakDe6?Nv1en%c)yne&2SHR-8r@xYsyDxf@Ud6&J%Cbxnv#rf60x2O$srR3v2^A7O%!@~p z$Zz1o;gcG>K7K&|^PJm(%J{}4+V-7q+v+8Y%* zZXD|WTx?3;xU?S8h!p<4v~?ww<-w4%)>Dgny7G3*y~wsfEH!Ol%EcFK>cu*-d|0BA zsSS7896BQWnq5tg(UqaN=N1gpsX_N_Uwx|KExcs9UGB7zJQqfE%PVC@hHeN7Wydrb zp7=1VX)4j6+LMzdC|tFLY?SFR2s0hejXo{A{{U+tZVH`M+A_YonL?Xs7xP$8lW*|#qu zb(JJzDQYC^SchRIQI;v9M2)3Ha*0fs8T*>C3m1kNGxp`e3?{QMV}5hp_kHej{|omy z-*Y~H!RvEApU?aCcrG7Lausi>;@N_v0rf^hhv^2b&kaa(6Izic_YJ;Vt5aq2iL8G` ze5GqbOTzpq{f!?&i1mQg4Oq&0to-B^?g}z26NvKrS)bAZG)vex!IV^IR|YQ_j()L0 z<)BuYwx?3ZKICw;%x}!Ia?To>XIS;| z#Ol1@QQ43lSaMB%J7#fT16fw2skM>c9_6kGC0B(uu76Sf-gdZ86Ku{B%Ji7AtAm=x zY(h@x{;Depq|Badq*BWwY9*VrMON7l0o^D$ok8q%ZR6>xselV|a%GXudbsK1cU=I0 zG+LI#)W%rD$j?mUOw~+}tdmv5n3!86*PF>(M-M9XO%b17<(n`pe<uPIY%p?DAK zbywlQe8*D(SBpf0zB4&I{qftZ^xY%iLS?{|y&pycHbn@tr?61MgueJKX%# zJ(LZzV#a8|G2LAp!R#A=B>mMj$teot@CT3&+zP4>UF|8`SzDz$g#hgl+`FH zEhuOvDGhFXC|zxcCC`~HhRRdKS6I@+9xOlfXQd8s-QoKB{v>@)SJ|FJq<7w#J=ai3Jw-yY({z|8`i*SG^HF!Lz!Ha@zdO9|J1ePR&(58npIJ3-< zw_ETx^uy9Uc*Dun%{~QZG2Lxy;-V6n*$&?Daw5aKsf1eM_o0L1T-2*b?8R{QS)Yo> z=DoFrsN~DUXN2T=j$~U4)nujb?%3n?2xNP#K;RDzn2}Ss+mAM8Br>5iT+3gw7ioor zXEfWo@u|;cTY1fKhn%CsXq^ZepwKk-u(&>GY6cN=T(3_KvhMR7I~zZsi`netnCFXk z5jB$vrQO8F{daF)t*ukvzVX3BHQ&fT!O`p2O!Pm02mV_lbJq{>n(tz{Hq5uNV5D&= z$JyP4zq3s76Z0Yro_5b+IBtn$hO?NE0Wc)1(-VA&b${_mk_-mNGR$ZvV#*&S+S)KD zJrh4fot2MkE97-K0K5Q@9qY1(e+05G#pM&4VyVS7nlLPDF-|rwyEI5JRI`gZGjOqK zaCdAN{jrQdtax3ATZ0U@fqPC82|wx;q4%BqU1=IIDSy-T0uy>dV$5Yq3Ky#}aTUkW zC+=yg&*||W;C`tI2&p}F1Ul2G&An3*u-v?biN&5*L8U^Eo`KXSvgNqcz#WUH`mG&e zP8S(Zn+mZ-v;b^Vu0jZyFR-4vPCfOSXV=)Q@;&2CNLe@woX%Sl&zIb@n@P@Hp z6@*=Vqdvg;8Q~>nyZ!RU%3@D0CR67E;s-HlPL z#c?ya(iKb{Do<;QT^nKwJZSa;0--Vk{buzq7R{9=b3y`#G;v$>U|qj4zx7j3=-tja zXhLz@SYaXxS?mT9+5UuY`Ot4MO1xn78$z@;n^YwCh*qO*)s{9)@TXjs0~AAD!JX}7 z!6vPi$_9)#Kk$UMYJbaOi$rVP!ud*1tx${mwbKn#cLYm#xi6LFvGd7w(~6IOOsjAI z+akf3e*}}Ps-s=X(k)xm2(9u^Dz3s&qCM&2I|6ObFRdtOI{I8vvqB%`m}WwKW^!Y0 zU}tM;qv}rK>xuqcKDzGFC=SJb;Fl)oXC{xN*WTt?-(n@+2I=do)m)*is(OfTh0h<# z9TdOL)5RZJ4jq?|~7Q1R)ykJ-RjDhn>vQ{}~&XN)7S&6V&RvbgVJ3sVIb zQ{wm@v<`(;*BVB3=nv??q(fj(d~BA(nB;-GAxHX5`EE?}R6nr9l1E698y6)obhbHOb2Bu@pQkR&=Y<}DP0Ad0> z`z_Ci%QBAIQH*dW1Rz&so;EXB(dDUUVqp|>j~w$TlxGXS_-XPbYYOR%!0{#hPB7BGyfA_ z*clkKnT65bd8oU~toUeiDQEi-L4FwU%;fd>3#yk9iTYAH`f>Q5h+*eV8-)opl4Yrvqg;5A(- zZU@(xwWA`fs`(;ucq|?#auq+-<^6~bvgm^xyqVNhq}ssv zlcswRyGP&oai;HO*jElUQs58Eqd$)&a_>;K*e%oZsX)e&KjY+-O#OvJx5R?zQrxo* zmGYx&BhDo7z5%_ektA87;&>%xNk7eWH7~8>BR1q!}`M@IG^V zJHYRMF=EVdL*t_SE#HxZR0qgm1Tk2Ra(&JcOvKC7s(Ec5-*l9PRDM-^OK%{>u$3v- zWl(n{&V4q7?)|e@*YGJ~?`(_8#ty^2KiZe=KI%z%>bF(aas6cPW+t5zbwKcR`sAt@-WD&uC-!J<2g^E8s z9pa(wMlro{cbnh5g=H(bfny{-|2$5`yT8rO4US8x!$az&OYVqZF*Hw{4pJLzTs5pQ z%{0W+o&0Y2r|QF>}F(V$EwM>sFP-JfeAQ*m3O)W~}V-;!*qbh2-yChM>?xI^=( z-Fwfw9F24kGx~ze(01XRdtld)0F(XlvgJIpo+XC80&)i{2_GqU3Gm|iS1M1(rcW_b z!$1c9+{c3it(kkI^NZ5K7p-(3S4hgOv#-bcUZzNBe&$Ekp;!#AbB?d<>jEXv!eu5 z!Za+N)@F;0@Tbv4h)oxpY%aG3&4YF9@{3>1YOp^EFKT+y$eLVpk0${OMiw27%kLD( zmJzOOyY5%-9@HUGo>n9CCIbjm$zJoLTV8GaO5 z*<8|c8RcAJ%ce-ft2-^+!OnH7htwUP4`=;(3)TP5b=>)SPpT&G+~Rxs(DsykGTab# zVA`797yDR&-0u8a-E$N$syJluVsdz^Y1w5G@d|Y-aJ&AItQ-U>Z)Bjn@oZ-i7iMqg zsr9TJa&=f=Y!~M2*LoV~RK)^|WJhlRnYzLPmotQsZy(RIPaNPqq7liZNEdC%oC4w9 zG<^MF_D89|bB_(?%1W-cz4(2@`Q_ghcDD97(BHrfV!Y9<)0*EHA2f7|oF?v2Az#$v znj(uS{bAo#=vTl16j^Njl*1`hM#z(pg$$(nh~(OI@MZ0jNw$X_yX!$a$%D4(tr^5f0QbI~ogtXV;ZL_o zu^#HjpDf@};PCE@cCjSLhR&o-6Ke(8RLea;F%3JoQhK;E#;G(j;st@aU2X?rZ=`Np zrAA@jr!yApKR@kE$a81c1&;r-mV`y9j=aQ08|ocuzY)?7m1|PnCeM9&V?H$6woko2MN;_b?=^&+1)Mz3{rL}~o;zHgrA#k?Jna77~KSRVoY zm%(@5$RYoxLj}QRMdebA7W6GXLm(h5PH-JiTo1(@vF09qaNN+82ciaVj>&YARrn zM9g9M-tG~w80Nyi~CAi;XAzV#yH3GGM1I=7u~P&AHkMedR#7 zh;Q7FR9;LEOSt@0|C>}qmUncT6-wf9y-}TqR8`bFIeuv)XvdiX-;(GlaqFfGIaV9? z@S>bl^KZQ?@D$V!UiX0!tZ2N03BA$1tlSAL;ET~RBUmr5YHq(5@Tz|@VNBe7Na@9u zx=@CSu$z&UdTN)eJUN>5(s}alaCZOLlE$~M4WC}F-aNnWg9)A8e}jhVCW;D#Wu@L~ zNU#60rM6Q;ffZFXHNT*RpskA@&;KclR_x;CxDNI+37gzoYNtY4MZ(+@e%z-g^`?sa zk;cpE2?_WPkM921bPS4b^OE0Q0Q^}Oy@aY?>YG=M@g92~RAsOslh)J_$?N)58gIDq zDE0Bn2S&^jc+--r$f#HT_<5Ea>=ccO=U_G!WNGWyU=r}m=t}JpZ)Y>3^pSVJPOp0` zgdH83%(X~?5@IlzhK?=BSj-XKX=GKz5>|ZUSn{!c)s3~_PW3>`*u8%y$X$_}80*$| zkz9eeT4kjFSE89U$wxD@xP9XiLU7*lwQSQYW8TX_ zo8Gw@U+Ww_H+kWhZfe!r`|6Lr;e@&>bY(>WOa-T_I)`tCL+LJo=fxyNUh^I`E9|kE zLO#7_pSsLomfKh19rWrWv*(r3kzo&8XhYMQPpjhyl*v{|Oa{x|3>^VCS9!)#aqu#D z-lxN=-7!?9a5X#e@7ARXJhI`>EF*pkjn!W*Rj(&MDF`)II{3CWOz7* zW81UERZ43qxm%nznqyX^#Hzsuf@A{`OK1XDOk6&`gPP_;?B~=M~;@l>&DZdT3C>u%(1h zo{1LM!?He=9f);r**BuHKC9;>8WPgatzSE3giPe0sxIxL$9-?_ySVc5fH%i$yY-8b zN#E_P$ept!(UXb|#jbkYH>4S(sZ=QMlz~@C5#gpBSewWH#wITJ=c>%LiGja&Z(i;` zu&=HhhVy`N3rYH1MF1k2Mq}UntB@a6+Xq3s z>2i!m_kDK1$HO6?c)&F^1DLJA?-PS&FrTVERs|UuLB9a;Y3)av=R!JXl89u-sVZb` z9f)}#3}(O4FS5N1&v{C55ojh z)emwqK@mSbGYy~ZPE+CB1MjVDcYkfQ|M0o?+Y<}FN~Dw#fr!8NJ|b9hQI{-}B<>*$ zH_lj$v^SzuKJF2OWXs>IcnnN9->+dQP`>CFpw7O5+HIQ}iIKpm2 i`2TDIudgI=#fx=sTjZO(b@=yxBTn|NcGWibpZyQ3W$@tu diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png deleted file mode 100644 index 738fa685adb223d384edfe6310251f31365a6830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18659 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 From 97152ee7a842cd16295a972e6d7494e979c79ab2 Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 28 Mar 2023 11:16:42 +0800 Subject: [PATCH 033/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/locale/impl/EmptyDataMark.java | 38 ++++++++++++++++++ .../module/ChartEmptyDataStylePane.java | 2 +- .../com/fr/design/images/us_emptydata.png | Bin 0 -> 21918 bytes .../com/fr/design/images/zh_emptydata.png | Bin 0 -> 25842 bytes .../images/zh_traditional_emptydata.png | Bin 0 -> 18659 bytes 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java create mode 100644 designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png create mode 100644 designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png create mode 100644 designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png diff --git a/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java b/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java new file mode 100644 index 0000000000..14b8d51077 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java @@ -0,0 +1,38 @@ +package com.fr.design.locale.impl; + +import com.fr.general.GeneralContext; +import com.fr.general.IOUtils; +import com.fr.general.locale.LocaleMark; + +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * 根据本地化信息设置服务器图表空数据提示图标 + * + * @author obo + * @since 11.0 + * Created on 2023/3/22 + */ +public class EmptyDataMark implements LocaleMark { + + private Map map = new HashMap<>(); + + private static final BufferedImage ZH_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/zh_emptydata.png"); + private static final BufferedImage US_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/us_emptydata.png"); + private static final BufferedImage ZH_TRADITIONAL_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/zh_traditional_emptydata.png"); + + public EmptyDataMark() { + map.put(Locale.CHINA, ZH_EMPTY_DATA); + map.put(Locale.US, US_EMPTY_DATA); + map.put(Locale.TAIWAN, ZH_TRADITIONAL_EMPTY_DATA); + } + @Override + public BufferedImage getValue() { + BufferedImage result = map.get(GeneralContext.getLocale()); + return result == null ? US_EMPTY_DATA : result; + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java index 50de28871a..e73bae010e 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java @@ -10,13 +10,13 @@ import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.locale.impl.EmptyDataMark; import com.fr.design.style.background.image.ImageFileChooser; import com.fr.design.style.background.image.ImagePreviewPane; import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.locale.LocaleCenter; import com.fr.general.locale.LocaleMark; -import com.fr.locale.impl.EmptyDataMark; import com.fr.stable.Constants; import com.fr.stable.CoreGraphHelper; import com.fr.stable.StringUtils; diff --git a/designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png new file mode 100644 index 0000000000000000000000000000000000000000..46597ea7a146532843bfce15eadefb1f7ab12263 GIT binary patch literal 21918 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 literal 0 HcmV?d00001 diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6c3a9624f8428547454528e6ce58fe0c6d9758 GIT binary patch literal 25842 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 literal 0 HcmV?d00001 diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png new file mode 100644 index 0000000000000000000000000000000000000000..738fa685adb223d384edfe6310251f31365a6830 GIT binary patch literal 18659 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 literal 0 HcmV?d00001 From bd3ba069a1b17990f54163b466216e7d1da9cac4 Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 28 Mar 2023 14:13:16 +0800 Subject: [PATCH 034/625] =?UTF-8?q?REPORT-92430=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-mac=E4=B8=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E9=83=BD=E4=B8=A2=E5=A4=B1=E4=BA=86=EF=BC=8C?= =?UTF-8?q?windows=E4=B8=8B=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/UILookAndFeel.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java index a8e45b24cf..c33f3e0fc2 100644 --- a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java +++ b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java @@ -1,5 +1,6 @@ package com.fr.design.gui; +import com.fr.base.svg.IconUtils; import com.fr.design.gui.borders.UIFrameBorder; import com.fr.design.gui.borders.UIInternalFrameBorder; import com.fr.design.gui.borders.UITableHeaderBorder; @@ -160,10 +161,10 @@ public class UILookAndFeel extends MetalLookAndFeel { table.put("Tree.collapsedIcon", loadIcon("TreePlusIcon.png", this)); table.put("Tree.openIcon", loadIcon("TreeFolderOpenedIcon.png", this)); table.put("Tree.closedIcon", loadIcon("TreeFolderClosedIcon.png", this)); - table.put("Tree.leafIcon", loadIcon("TreeLeafIcon.svg", this)); + table.put("Tree.leafIcon", loadIcon("TreeLeafIcon.png", this)); table.put("FileView.directoryIcon", loadIcon("DirectoryIcon.png", this)); table.put("FileView.computerIcon", loadIcon("ComputerIcon.png", this)); - table.put("FileView.fileIcon", loadIcon("FileIcon.svg", this)); + table.put("FileView.fileIcon", IconUtils.readIcon("/com/fr/design/images/lookandfeel/FileIcon.svg")); table.put("FileView.floppyDriveIcon", loadIcon("FloppyIcon.png", this)); table.put("FileView.hardDriveIcon", loadIcon("HarddiskIcon.png", this)); table.put("FileChooser.detailsViewIcon", loadIcon("FileDetailsIcon.png", this)); From 74d9244b1ebd296e18a060dba50629ad844653df Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 28 Mar 2023 14:43:37 +0800 Subject: [PATCH 035/625] =?UTF-8?q?REPORT-83689=20=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E4=B8=BA=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=97=E7=9A=84=E6=97=B6=E5=80=99=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=95=B0=E6=8D=AE=E9=9B=86=E6=8E=92=E5=88=97?= =?UTF-8?q?=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=95=B0=E6=8D=AE=E9=9B=86=E6=8E=92=E5=88=97?= =?UTF-8?q?=EF=BC=8C=E8=8E=B7=E5=8F=96=E5=BD=93=E5=89=8D=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=95=B0=E6=8D=AE=E9=9B=86=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E6=9C=AA=E8=80=83=E8=99=91=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=EF=BC=8C=E5=AF=BC=E8=87=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=9A=84tableDataWrapper=E4=B8=BA=E7=A9=BA=20?= =?UTF-8?q?=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=89=80=E6=9C=89=E6=95=B0=E6=8D=AE=E9=9B=86=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8C=85=E6=8B=AC=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/sort/celldscolumn/CellDSColumnSortGroupPane.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortGroupPane.java b/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortGroupPane.java index 788f1a57cb..01c5eafc05 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortGroupPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/celldscolumn/CellDSColumnSortGroupPane.java @@ -8,6 +8,8 @@ import com.fr.design.sort.common.AbstractSortItemPane; import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.core.sort.sortexpression.SortExpression; +import java.util.Map; + public class CellDSColumnSortGroupPane extends AbstractSortGroupPane { DSColumn dsColumn; @@ -24,7 +26,8 @@ public class CellDSColumnSortGroupPane extends AbstractSortGroupPane { CellDSColumnSortItemPane cellDSColumnSortItemPane = new CellDSColumnSortItemPane(sortItemPaneWidth, sortItemPaneRightWidth); java.util.Map tableDataWrapperMap = DesignTableDataManager.getAllEditingDataSet(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTarget()); - TableDataWrapper tableDataWrapper = tableDataWrapperMap.get(dsColumn.getDSName()); + Map allDataSetIncludingProcedure = DesignTableDataManager.getAllDataSetIncludingProcedure(tableDataWrapperMap); + TableDataWrapper tableDataWrapper = allDataSetIncludingProcedure.get(dsColumn.getDSName()); if (tableDataWrapper != null) { java.util.List columnNameList = tableDataWrapper.calculateColumnNameList(); String[] columnNames = new String[columnNameList.size()]; From a68a577331b0d741e53eb5a7487073382b2b874b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Tue, 28 Mar 2023 15:40:10 +0800 Subject: [PATCH 036/625] =?UTF-8?q?REPORT-92492=20=E8=B6=85=E7=AE=A1?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E8=A7=A3=E9=94=81=EF=BC=8C=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A7=A6=E5=8F=91=E4=BF=9D=E5=AD=98=EF=BC=8C?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E6=8F=90=E7=A4=BA=E5=92=8C=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E6=95=88=E6=9E=9C=E4=B8=8D=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/worker/save/SaveFailureHandler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java index 119668ec68..efb0ab5f76 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java @@ -113,12 +113,14 @@ public class SaveFailureHandler implements ThrowableHandler { new Object[] {Toolkit.i18nText("Fine_Design_Template_SaveAs_Backup"), Toolkit.i18nText("Fine-Design_Basic_Button_Cancel")}, null); if (option == JOptionPane.YES_OPTION) { JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (template != null) { + if (JTemplate.isValid(template)) { TemplateUtils.createAndOpenTemplate( Toolkit.i18nText("Fine_Design_Template_Backup"), new FileNodeFILE(new FileNode(template.getPath(), false)), true, - false); + true, + // 创建并打开备份模板后,关闭原模板,无需释放原模板锁(锁定信息不一致 = 此用户模板锁信息已被清除) + () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template)); } } } From c2be117534ca20e67a8af8a05ecd1f9f7aa60fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Tue, 28 Mar 2023 15:42:06 +0800 Subject: [PATCH 037/625] =?UTF-8?q?REPORT-92492=20=E8=B6=85=E7=AE=A1?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E8=A7=A3=E9=94=81=EF=BC=8C=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A7=A6=E5=8F=91=E4=BF=9D=E5=AD=98=EF=BC=8C?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E6=8F=90=E7=A4=BA=E5=92=8C=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E6=95=88=E6=9E=9C=E4=B8=8D=E7=AC=A6--=E6=94=B9=E4=B8=8B?= =?UTF-8?q?=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/worker/save/SaveFailureHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java index efb0ab5f76..42ef95978a 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java @@ -119,7 +119,7 @@ public class SaveFailureHandler implements ThrowableHandler { new FileNodeFILE(new FileNode(template.getPath(), false)), true, true, - // 创建并打开备份模板后,关闭原模板,无需释放原模板锁(锁定信息不一致 = 此用户模板锁信息已被清除) + // 创建并打开备份模板后,关闭原模板,无需释放原模板锁(因为已经被超管手动清除了) () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template)); } } From 055634cd912e2a9646db08aa80df786f2c277c5f Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 28 Mar 2023 22:05:01 +0800 Subject: [PATCH 038/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/module/ChartEmptyDataStylePane.java | 9 +++++---- .../design/images/zh_traditional_emptydata.png | Bin 0 -> 18659 bytes 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java index 31718fda82..702dcab39f 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java @@ -15,7 +15,8 @@ import com.fr.design.style.background.image.ImagePreviewPane; import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.GeneralContext; -import com.fr.general.IOUtils; +import com.fr.plugin.chart.locale.impl.LocaleImageFactory; +import com.fr.plugin.chart.locale.impl.LocaleImageMark; import com.fr.stable.Constants; import com.fr.stable.CoreGraphHelper; import com.fr.stable.StringUtils; @@ -26,7 +27,6 @@ import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingWorker; -import java.io.File; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; @@ -35,6 +35,7 @@ import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; /** * Created by mengao on 2017/11/23. @@ -63,8 +64,8 @@ public class ChartEmptyDataStylePane extends AbstractAttrNoScrollPane { static { - DEFAULT_EMPTY_DATA_IMAGE = GeneralContext.isChineseEnv() ? IOUtils.readImage("com/fr/design/images/zh_emptydata.png") - : IOUtils.readImage("com/fr/design/images/us_emptydata.png"); + LocaleImageMark localeImageMark = LocaleImageFactory.getOrCreateLocaleMark("/com/fr/design/images/", "emptydata.png"); + DEFAULT_EMPTY_DATA_IMAGE = localeImageMark.getImageWithLocale(GeneralContext.getLocale()); } @Override diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png new file mode 100644 index 0000000000000000000000000000000000000000..738fa685adb223d384edfe6310251f31365a6830 GIT binary patch literal 18659 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 literal 0 HcmV?d00001 From 882f04ea87faf464ad8a1a2cd3d9d4eb308ed590 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 29 Mar 2023 10:16:32 +0800 Subject: [PATCH 039/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/locale/impl/EmptyDataMark.java | 38 ------------------ .../module/ChartEmptyDataStylePane.java | 7 ++-- ...onal_emptydata.png => zh_tw_emptydata.png} | Bin 3 files changed, 4 insertions(+), 41 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java rename designer-chart/src/main/resources/com/fr/design/images/{zh_traditional_emptydata.png => zh_tw_emptydata.png} (100%) diff --git a/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java b/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java deleted file mode 100644 index 14b8d51077..0000000000 --- a/designer-chart/src/main/java/com/fr/design/locale/impl/EmptyDataMark.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fr.design.locale.impl; - -import com.fr.general.GeneralContext; -import com.fr.general.IOUtils; -import com.fr.general.locale.LocaleMark; - -import java.awt.image.BufferedImage; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -/** - * 根据本地化信息设置服务器图表空数据提示图标 - * - * @author obo - * @since 11.0 - * Created on 2023/3/22 - */ -public class EmptyDataMark implements LocaleMark { - - private Map map = new HashMap<>(); - - private static final BufferedImage ZH_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/zh_emptydata.png"); - private static final BufferedImage US_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/us_emptydata.png"); - private static final BufferedImage ZH_TRADITIONAL_EMPTY_DATA = IOUtils.readImage("/com/fr/design/images/zh_traditional_emptydata.png"); - - public EmptyDataMark() { - map.put(Locale.CHINA, ZH_EMPTY_DATA); - map.put(Locale.US, US_EMPTY_DATA); - map.put(Locale.TAIWAN, ZH_TRADITIONAL_EMPTY_DATA); - } - @Override - public BufferedImage getValue() { - BufferedImage result = map.get(GeneralContext.getLocale()); - return result == null ? US_EMPTY_DATA : result; - } - -} diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java index 702dcab39f..df5baf243f 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java @@ -15,8 +15,8 @@ import com.fr.design.style.background.image.ImagePreviewPane; import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.GeneralContext; -import com.fr.plugin.chart.locale.impl.LocaleImageFactory; -import com.fr.plugin.chart.locale.impl.LocaleImageMark; +import com.fr.general.locale.image.LocaleImageFactory; +import com.fr.general.locale.image.LocaleImageMarkWithAttachID; import com.fr.stable.Constants; import com.fr.stable.CoreGraphHelper; import com.fr.stable.StringUtils; @@ -62,9 +62,10 @@ public class ChartEmptyDataStylePane extends AbstractAttrNoScrollPane { private Image emptyDataImage = DEFAULT_EMPTY_DATA_IMAGE; private SwingWorker imageWorker; + private static final String EMPTY_DATA_IMAGE_PATH = "/com/fr/design/images/emptydata.png"; static { - LocaleImageMark localeImageMark = LocaleImageFactory.getOrCreateLocaleMark("/com/fr/design/images/", "emptydata.png"); + LocaleImageMarkWithAttachID localeImageMark = LocaleImageFactory.getOrCreateLocaleMarkWithAttachID(EMPTY_DATA_IMAGE_PATH); DEFAULT_EMPTY_DATA_IMAGE = localeImageMark.getImageWithLocale(GeneralContext.getLocale()); } diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_tw_emptydata.png similarity index 100% rename from designer-chart/src/main/resources/com/fr/design/images/zh_traditional_emptydata.png rename to designer-chart/src/main/resources/com/fr/design/images/zh_tw_emptydata.png From d4da6af2bf39bc63c81bb79c64729ae25dda9440 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 29 Mar 2023 10:24:09 +0800 Subject: [PATCH 040/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/module/ChartEmptyDataStylePane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java index df5baf243f..3895d660ac 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java @@ -16,7 +16,7 @@ import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.GeneralContext; import com.fr.general.locale.image.LocaleImageFactory; -import com.fr.general.locale.image.LocaleImageMarkWithAttachID; +import com.fr.general.locale.image.LocaleImageMark; import com.fr.stable.Constants; import com.fr.stable.CoreGraphHelper; import com.fr.stable.StringUtils; @@ -65,7 +65,7 @@ public class ChartEmptyDataStylePane extends AbstractAttrNoScrollPane { private static final String EMPTY_DATA_IMAGE_PATH = "/com/fr/design/images/emptydata.png"; static { - LocaleImageMarkWithAttachID localeImageMark = LocaleImageFactory.getOrCreateLocaleMarkWithAttachID(EMPTY_DATA_IMAGE_PATH); + LocaleImageMark localeImageMark = LocaleImageFactory.getOrCreateLocaleMark(EMPTY_DATA_IMAGE_PATH); DEFAULT_EMPTY_DATA_IMAGE = localeImageMark.getImageWithLocale(GeneralContext.getLocale()); } From fd5d8048adb314aea99fc91f461d57c1084ab29f Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 29 Mar 2023 14:02:27 +0800 Subject: [PATCH 041/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/module/ChartEmptyDataStylePane.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java index 3895d660ac..f014efed03 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java @@ -14,7 +14,6 @@ import com.fr.design.style.background.image.ImageFileChooser; import com.fr.design.style.background.image.ImagePreviewPane; import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.general.GeneralContext; import com.fr.general.locale.image.LocaleImageFactory; import com.fr.general.locale.image.LocaleImageMark; import com.fr.stable.Constants; @@ -66,7 +65,7 @@ public class ChartEmptyDataStylePane extends AbstractAttrNoScrollPane { static { LocaleImageMark localeImageMark = LocaleImageFactory.getOrCreateLocaleMark(EMPTY_DATA_IMAGE_PATH); - DEFAULT_EMPTY_DATA_IMAGE = localeImageMark.getImageWithLocale(GeneralContext.getLocale()); + DEFAULT_EMPTY_DATA_IMAGE = localeImageMark.getValue(); } @Override From 07c29bb0b35b0dd2ecc0200dc7f48a4fb38e5941 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 29 Mar 2023 15:30:39 +0800 Subject: [PATCH 042/625] =?UTF-8?q?REPORT-82787=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=8F=90=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=9C=80=E8=A1=A5=E5=85=85=E7=B9=81=E4=B8=AD=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{us_emptydata.png => en_us_emptydata.png} | Bin .../{zh_emptydata.png => zh_cn_emptydata.png} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename designer-chart/src/main/resources/com/fr/design/images/{us_emptydata.png => en_us_emptydata.png} (100%) rename designer-chart/src/main/resources/com/fr/design/images/{zh_emptydata.png => zh_cn_emptydata.png} (100%) diff --git a/designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/en_us_emptydata.png similarity index 100% rename from designer-chart/src/main/resources/com/fr/design/images/us_emptydata.png rename to designer-chart/src/main/resources/com/fr/design/images/en_us_emptydata.png diff --git a/designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png b/designer-chart/src/main/resources/com/fr/design/images/zh_cn_emptydata.png similarity index 100% rename from designer-chart/src/main/resources/com/fr/design/images/zh_emptydata.png rename to designer-chart/src/main/resources/com/fr/design/images/zh_cn_emptydata.png From 764d729328452fb8059a031824f18c9235a238e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Wed, 29 Mar 2023 18:31:35 +0800 Subject: [PATCH 043/625] =?UTF-8?q?REPORT-92506=20=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=BB=E9=A2=98=E5=88=87=E6=8D=A2-?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=86=B3=E7=AD=96=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0=E9=9D=A2=E6=9D=BF=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/parameter/RootDesignDefinePane.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java b/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java index 86e3f49986..a794a7bd69 100644 --- a/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java @@ -368,12 +368,11 @@ public class RootDesignDefinePane extends AbstractDataModify { wParameterLayout.setParamsFireStopEdit(fireAfterEditor.isSelected()); JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected()); - wParameterLayout.setBackground((Background) background.getValue()); if (extraPaneList.isEmpty()) { - background.setValue(wParameterLayout.getBackground()); + wParameterLayout.setBackground((Background) background.getValue()); } else { for (BasicBeanPane pane : extraPaneList) { - pane.populateBean(wParameterLayout); + pane.updateBean(wParameterLayout); } } //设置参数模板面板的高度 From 9309a2265b0e49ef665926ae0e4fab557adcdc29 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Thu, 30 Mar 2023 16:07:17 +0800 Subject: [PATCH 044/625] =?UTF-8?q?REPORT-90316=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E6=8E=A7=E4=BB=B6=E7=BF=BB=E6=96=B0----=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=83=A8=E5=88=86=E9=85=8D=E7=BD=AE=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/creator/XNumberEditor.java | 16 +++- .../fr/design/designer/creator/XPassword.java | 6 ++ .../fr/design/designer/creator/XTextArea.java | 10 +- .../mobile/NumberEditorMobilePropertyUI.java | 37 ++++++++ .../mobile/PasswordMobilePropertyUI.java | 37 ++++++++ .../mobile/TextAreaMobilePropertyUI.java | 37 ++++++++ .../BaseTextEditorMobileDefinePane.java | 94 +++++++++++++++++++ .../mobile/NumberEditorMobileDefinePane.java | 33 +++++++ .../mobile/PasswordMobileDefinePane.java | 25 +++++ .../mobile/ScanCodeMobileDefinePane.java | 57 +++++------ .../mobile/TextAreaAdvancedDefinePane.java | 25 +++++ .../MobilePasswordEditSettingPane.java | 43 +++++++++ .../component/MobileTextAreaSettingPane.java | 38 ++++++++ .../component/MobileTextEditSettingPane.java | 59 ++++++++++++ .../MobileTextFieldInputSettingPane.java | 28 ++++-- 15 files changed, 499 insertions(+), 46 deletions(-) create mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java create mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java create mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java 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 15cd30c6fd..8861d6fcbc 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,7 +6,9 @@ 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; @@ -91,15 +93,19 @@ public class XNumberEditor extends XWrapperedFieldEditor { } } - @Override + @Override 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)}; + } } 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 4194e4be03..29de6c9d05 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,7 +3,9 @@ */ 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; @@ -68,4 +70,8 @@ public class XPassword extends XWrapperedFieldEditor { (CRPropertyDescriptor[]) ArrayUtils.addAll(sup, new CRPropertyDescriptor[]{regex, waterMark}); } + @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 845fe43d9e..f23c24fea7 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,7 +6,9 @@ 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; @@ -26,7 +28,7 @@ import java.beans.IntrospectionException; * @author richer * @since 6.5.3 */ -public class XTextArea extends XFieldEditor { +public class XTextArea extends XWrapperedFieldEditor { public XTextArea(TextArea widget, Dimension initSize) { super(widget, initSize); @@ -81,4 +83,10 @@ public class XTextArea extends XFieldEditor { protected String getIconName() { return "text_area_16.png"; } + + @Override + public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { + return new WidgetPropertyUIProvider[]{new TextAreaMobilePropertyUI(this)}; + } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java new file mode 100644 index 0000000000..67a8569f72 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java @@ -0,0 +1,37 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.NumberEditorMobileDefinePane; + +/** + * 数字控件属性面板注册 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/30 + */ +public class NumberEditorMobilePropertyUI extends AbstractWidgetPropertyUIProvider { + private XCreator xCreator; + + public NumberEditorMobilePropertyUI(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new NumberEditorMobileDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java new file mode 100644 index 0000000000..2c3b3b2270 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java @@ -0,0 +1,37 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.PasswordMobileDefinePane; + +/** + * 密码控件移动端属性注册 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/30 + */ +public class PasswordMobilePropertyUI extends AbstractWidgetPropertyUIProvider { + private XCreator xCreator; + + public PasswordMobilePropertyUI(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new PasswordMobileDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java new file mode 100644 index 0000000000..1c24e06bce --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java @@ -0,0 +1,37 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.TextAreaAdvancedDefinePane; + +/** + * 文本域控件移动端属性 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/29 + */ +public class TextAreaMobilePropertyUI extends AbstractWidgetPropertyUIProvider { + private XCreator xCreator; + + public TextAreaMobilePropertyUI(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new TextAreaAdvancedDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java new file mode 100644 index 0000000000..57faab6a72 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java @@ -0,0 +1,94 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +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.form.ui.TextEditor; + +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.FlowLayout; + +/** + *

文本类组件移动端高级属性的定义面板,基础扩展可以直接继承此面板 + *

往内部添加其他配置 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/30 + */ +public class BaseTextEditorMobileDefinePane extends MobileWidgetDefinePane { + + private XCreator xCreator; + protected MobileTextEditSettingPane textSettingPane; + + public BaseTextEditorMobileDefinePane(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5); + addPropertyPanesToContainer(container); + this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH); + this.repaint(); + } + + /** + * 添加其他属性面板 + * + * @param container 展开容器 + */ + protected void addPropertyPanesToContainer(JPanel container) { + initSettingPane(container); + } + + /** + * 初始化文本类基础面板 + * + * @param container + */ + protected void initSettingPane(JPanel container) { + textSettingPane = new MobileTextEditSettingPane(); + container.add(textSettingPane); + } + + @Override + public void populate(FormDesigner designer) { + TextEditor textEditor = (TextEditor) xCreator.toData(); + textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); + this.bindListeners2Widgets(); + } + + protected void bindListeners2Widgets() { + reInitAllListeners(); + AttributeChangeListener changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + this.addAttributeChangeListener(changeListener); + } + + private void reInitAllListeners() { + initListener(this); + } + + @Override + public void update() { + TextEditor textEditor = (TextEditor) xCreator.toData(); + textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); + } + + public XCreator getxCreator() { + return xCreator; + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java new file mode 100644 index 0000000000..75c6dbefc0 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java @@ -0,0 +1,33 @@ +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.form.ui.NumberEditor; + +/** + * 数字控件 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/30 + */ +public class NumberEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { + public NumberEditorMobileDefinePane(XCreator xCreator) { + super(xCreator); + } + + @Override + public void populate(FormDesigner designer) { + NumberEditor numberEditor = (NumberEditor) getxCreator().toData(); + textSettingPane.populateBean(numberEditor.getMobileTextEditAttr()); + this.bindListeners2Widgets(); + } + + @Override + public void update() { + NumberEditor numberEditor = (NumberEditor) getxCreator().toData(); + textSettingPane.updateBean(numberEditor.getMobileTextEditAttr()); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java new file mode 100644 index 0000000000..68c878b459 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java @@ -0,0 +1,25 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.widget.ui.designer.mobile.component.MobilePasswordEditSettingPane; + +import javax.swing.JPanel; + +/** + * 密码控件移动端高级属性 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/30 + */ +public class PasswordMobileDefinePane extends BaseTextEditorMobileDefinePane { + public PasswordMobileDefinePane(XCreator xCreator) { + super(xCreator); + } + + @Override + protected void initSettingPane(JPanel container) { + textSettingPane = new MobilePasswordEditSettingPane(); + container.add(textSettingPane); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java index a9876b7a3d..bb785c27d9 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java @@ -1,61 +1,50 @@ package com.fr.design.widget.ui.designer.mobile; -import com.fr.base.mobile.MobileScanCodeAttr; import com.fr.design.designer.creator.XCreator; -import com.fr.design.foldablepane.UIExpandablePane; -import com.fr.design.gui.frpane.AttributeChangeListener; -import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; 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; -import java.awt.BorderLayout; +import javax.swing.JPanel; -public class ScanCodeMobileDefinePane extends MobileWidgetDefinePane { +/** + * 输入方式: + * + * @author hades + * @since 11.0 + * Created on 2018/11/27 + */ +public class ScanCodeMobileDefinePane extends BaseTextEditorMobileDefinePane { - private XCreator xCreator; - private MobileTextFieldInputSettingPane settingPane; + private MobileTextFieldInputSettingPane inputSettingPane; public ScanCodeMobileDefinePane(XCreator xCreator) { - this.xCreator = xCreator; + super(xCreator); } @Override - public void initPropertyGroups(Object source) { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - settingPane = new MobileTextFieldInputSettingPane(); - this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, settingPane), BorderLayout.NORTH); - this.repaint(); + protected void initSettingPane(JPanel container) { + inputSettingPane = new MobileTextFieldInputSettingPane(); + textSettingPane = new MobileTextEditSettingPane(); + container.add(inputSettingPane); + container.add(textSettingPane); } - private void bindListeners2Widgets() { - reInitAllListeners(); - AttributeChangeListener changeListener = new AttributeChangeListener() { - @Override - public void attributeChange() { - update(); - } - }; - this.addAttributeChangeListener(changeListener); - } - - private void reInitAllListeners() { - initListener(this); - } @Override public void populate(FormDesigner designer) { - MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) xCreator.toData()).getMobileScanCodeAttr(); - settingPane.populateBean(mobileScanCodeAttr); + super.populate(designer); + TextEditor textEditor = (TextEditor) getxCreator().toData(); + inputSettingPane.populateBean(textEditor.getMobileScanCodeAttr()); this.bindListeners2Widgets(); } - @Override public void update() { - MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) xCreator.toData()).getMobileScanCodeAttr(); - settingPane.updateBean(mobileScanCodeAttr); + super.update(); + TextEditor textEditor = (TextEditor) getxCreator().toData(); + inputSettingPane.updateBean(textEditor.getMobileScanCodeAttr()); DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java new file mode 100644 index 0000000000..ccc3194f9f --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java @@ -0,0 +1,25 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.widget.ui.designer.mobile.component.MobileTextAreaSettingPane; + +import javax.swing.JPanel; + +/** + * 文本域控件 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/29 + */ +public class TextAreaAdvancedDefinePane extends BaseTextEditorMobileDefinePane { + public TextAreaAdvancedDefinePane(XCreator xCreator) { + super(xCreator); + } + + @Override + protected void initSettingPane(JPanel container) { + textSettingPane = new MobileTextAreaSettingPane(); + container.add(textSettingPane); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..db475dc569 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java @@ -0,0 +1,43 @@ +package com.fr.design.widget.ui.designer.mobile.component; + +import com.fr.base.mobile.MobileTextEditAttr; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.i18n.Toolkit; + +import java.awt.BorderLayout; + +/** + * 密码控件编辑属性设置面板 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/30 + */ +public class MobilePasswordEditSettingPane extends MobileTextEditSettingPane { + // 显示字数统计 + private UICheckBox showPassword; + + public MobilePasswordEditSettingPane() { + super(); + showPassword = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Show_Password"), false); + this.add(showPassword, BorderLayout.NORTH); + } + + @Override + protected boolean getClearDefaultState() { + return true; + } + + @Override + public void populateBean(MobileTextEditAttr ob) { + super.populateBean(ob); + // 要兼容处理一下,为null 的话赋默认值,默认开启 + this.showPassword.setSelected(ob.isShowPassword() == null || ob.isShowPassword()); + } + + @Override + public void updateBean(MobileTextEditAttr ob) { + super.updateBean(ob); + ob.setShowPassword(showPassword.isSelected()); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..d660508e6e --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java @@ -0,0 +1,38 @@ +package com.fr.design.widget.ui.designer.mobile.component; + +import com.fr.base.mobile.MobileTextEditAttr; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.i18n.Toolkit; + +import java.awt.BorderLayout; + +/** + * 文本域控件 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/29 + */ +public class MobileTextAreaSettingPane extends MobileTextEditSettingPane { + // 显示字数统计 + private UICheckBox showWordCount; + + public MobileTextAreaSettingPane() { + super(); + showWordCount = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Show_Word_Count"), false); + this.add(showWordCount, BorderLayout.NORTH); + } + + @Override + public void populateBean(MobileTextEditAttr ob) { + super.populateBean(ob); + // 要兼容处理一下,为null 的话赋默认值,默认不开启 + this.showWordCount.setSelected(ob.isShowWordCount() != null && ob.isShowWordCount()); + } + + @Override + public void updateBean(MobileTextEditAttr ob) { + super.updateBean(ob); + ob.setShowWordCount(showWordCount.isSelected()); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..56d340e4d0 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java @@ -0,0 +1,59 @@ +package com.fr.design.widget.ui.designer.mobile.component; + +import com.fr.base.mobile.MobileTextEditAttr; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.VerticalFlowLayout; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; + +/** + * 文本类基础设置 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/29 + */ +public class MobileTextEditSettingPane extends BasicBeanPane { + // 允许一键清空 + protected UICheckBox allowOneClickClear; + + public MobileTextEditSettingPane() { + initLayout(); + allowOneClickClear = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Allow_One_Click_Clear"), getClearDefaultState()); + this.add(allowOneClickClear, BorderLayout.NORTH); + } + + protected boolean getClearDefaultState() { + return false; + } + + protected void initLayout() { + VerticalFlowLayout verticalFlowLayout = new VerticalFlowLayout(FlowLayout.LEADING, 0, 5); + verticalFlowLayout.setAlignLeft(true); + this.setLayout(verticalFlowLayout); + } + + @Override + public void populateBean(MobileTextEditAttr ob) { + allowOneClickClear.setSelected(ob.isAllowOneClickClear() != null && ob.isAllowOneClickClear()); + } + + @Override + public MobileTextEditAttr updateBean() { + // do nothing + return null; + } + + @Override + public void updateBean(MobileTextEditAttr ob) { + ob.setAllowOneClickClear(allowOneClickClear.isSelected()); + } + + @Override + protected String title4PopupWindow() { + return null; + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java index 75d924e53a..faaec45bc8 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java @@ -2,12 +2,17 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.mobile.MobileScanCodeAttr; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import java.awt.BorderLayout; -import java.awt.FlowLayout; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; + import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; /** * @author hades @@ -22,13 +27,24 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane Date: Thu, 30 Mar 2023 16:14:44 +0800 Subject: [PATCH 045/625] =?UTF-8?q?REPORT-90316=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E6=8E=A7=E4=BB=B6=E7=BF=BB=E6=96=B0----=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=83=A8=E5=88=86=E9=85=8D=E7=BD=AE=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/designer/creator/XTextArea.java | 1 + 1 file changed, 1 insertion(+) 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 f23c24fea7..88d0391ceb 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 @@ -27,6 +27,7 @@ import java.beans.IntrospectionException; /** * @author richer * @since 6.5.3 + * Created on 2016/3/29 */ public class XTextArea extends XWrapperedFieldEditor { From 74037b9b0f3191845667f612329165ffa16477e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 31 Mar 2023 10:46:10 +0800 Subject: [PATCH 046/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/lock/LockInfoDialog.java | 2 +- .../com/fr/design/utils/TemplateUtils.java | 140 ++++++++++++++---- 2 files changed, 114 insertions(+), 28 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java b/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java index 003215ca6c..44c95c44c2 100644 --- a/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/lock/LockInfoDialog.java @@ -99,7 +99,7 @@ public class LockInfoDialog extends JDialog { return; } final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, TemplateTreePane.getInstance().getFilePath()); - TemplateUtils.createAndOpenTemplate( + TemplateUtils.createAndReOpenTemplate( Toolkit.i18nText("Fine_Design_Template_Lock_Copy"), new FileNodeFILE(new FileNode(selectedFilePath, false)), false, diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index 9fb1e632af..1c9f90ab95 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -16,8 +16,10 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import com.fr.stable.CoreConstants; import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; +import org.jetbrains.annotations.Nullable; import javax.swing.SwingWorker; import java.io.OutputStream; @@ -33,22 +35,63 @@ public class TemplateUtils { /** * 创建新的模板文件并打开模板 - * @param prefix 模板文件名称前缀 - * @param file 模板文件 + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 * 为true时以CurrentEditingTemplate为准创建新模板 * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 - * @param openNewTemplate 是否需要在创建后打开模板 + * @param openNewTemplate 是否需要在创建后打开模板 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { - String fileName = file.getName(); + createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); + } + + /** + * 创建新的模板文件并并判断新的模板文件是否之前已经被开打,如果已经打开需要reOpen + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + */ + public static void createAndReOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { String oldPath = file.getPath(); + file = getSavedFile(prefix, file); + if (file == null) { + return; + } + Runnable doAfterCreateTemplate; + //判断一下要保存的文件是否已打开 + int index = HistoryTemplateListCache.getInstance().contains(file); + if (index == -1) { + doAfterCreateTemplate = () -> {}; + } else { + JTemplate template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); + doAfterCreateTemplate = () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template); + } + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); + } + + + /** + * 返回值可以为null, 为null表示点击保存按钮或者传递进来的文件file本身不满足格式要求 + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @return 最后选择的要保存的文件 + */ + @Nullable + private static FILE getSavedFile(String prefix, FILE file) { + String fileName = file.getName(); int indexOfLastDot = fileName.lastIndexOf(CoreConstants.DOT); if (indexOfLastDot < 0) { - return; + return null; } String suffix = fileName.substring(indexOfLastDot + 1); - FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); + FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); fileChooserPane.setFileNameTextField(prefix + fileName, suffix); FileExtension fileExtension = FileExtension.parse(suffix); fileChooserPane.addChooseFILEFilter(new ChooseFileFilter(fileExtension, ProductConstants.APP_NAME + Toolkit.i18nText("Fine-Design_Report_Template_File"))); @@ -57,36 +100,52 @@ public class TemplateUtils { fileChooserPane.enableFileNameTextFiled(); if (isCancel(result)) { - return; + return null; } if (isOk(result)) { - file = fileChooserPane.getSelectedFILE(); - _createAndOpenTemplate(file, oldPath, createByEditingTemplate, openNewTemplate); + return fileChooserPane.getSelectedFILE(); } + + return null; } + /** + * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + * @param doAfterCreateTemplate 创建备份模板成功后调用 + */ + public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { + String oldPath = file.getPath(); + file = getSavedFile(prefix, file); + if (file == null) { + return; + } - private static void _createAndOpenTemplate(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate){ - new SwingWorker() { + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); + } + + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { + new SwingWorker() { @Override - protected Void doInBackground() throws Exception { - byte[] content = new byte[0]; - if (createByEditingTemplate) { - // 从当前编辑模板中生成备份文件 - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - content = template.exportData(); - } else { - content = WorkContext.getWorkResource().readFully(oldPath); - } - if (ArrayUtils.isEmpty(content)) { - throw new Exception(oldPath + " content is empty" ); - } + protected Boolean doInBackground() throws Exception { + // 读取模板数据 + byte[] content = getTemplateData(createByEditingTemplate, oldPath); OutputStream out = null; try { // 加锁 - WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); + boolean saveAsLock = WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); + if (!saveAsLock) { + // 加锁失败时,直接返回 + return false; + } out = file.asOutputStream(); out.write(content); } finally { @@ -98,15 +157,18 @@ public class TemplateUtils { // 解锁 WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); } - } - return null; + return true; } @Override protected void done() { try { - get(); + if (!get()) { + throw new Exception("[RemoteDesign] back up template file failed"); + } + // 创建备份成功后,关闭原模板 + doAfterCreateTemplate.run(); if (openNewTemplate) { DesignerContext.getDesignerFrame().openTemplate(file); } @@ -118,7 +180,31 @@ public class TemplateUtils { } } }.execute(); + } + /** + * 读取模板文件数据 + * + * @param readCurrentEditingTemplate 是否读取当前编辑模板 + * @param path 模板路径 + * @return 模板文件数据 + */ + private static byte[] getTemplateData(boolean readCurrentEditingTemplate, String path) throws Exception { + byte[] content = new byte[0]; + if (readCurrentEditingTemplate) { + // 从当前编辑模板中读取模板文件数据 + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (JTemplate.isValid(template)) { + content = template.exportData(); + } + } else { + // 从给定的模板路径中读取模板文件数据 + content = WorkContext.getWorkResource().readFully(path); + } + if (ArrayUtils.isEmpty(content)) { + throw new Exception(StringUtils.messageFormat("{} content is empty", path)); + } + return content; } private static boolean isCancel(int result) { From 938ced8b6d21a9eac28936706745d562db4cd831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 31 Mar 2023 11:10:06 +0800 Subject: [PATCH 047/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=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/utils/TemplateUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index 1c9f90ab95..f3d062946d 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -77,7 +77,7 @@ public class TemplateUtils { /** - * 返回值可以为null, 为null表示点击保存按钮或者传递进来的文件file本身不满足格式要求 + * 返回值可以为null, 为null表示没有点击保存按钮或者传递进来的文件file本身不满足格式要求 * * @param prefix 模板文件名称前缀 * @param file 模板文件 From cafb3d21303863dd97e58e1cd2369f9563756567 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 31 Mar 2023 18:25:30 +0800 Subject: [PATCH 048/625] =?UTF-8?q?REPORT-92953=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=90=8E=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/EnvChangeEntrance.java | 4 ++++ .../src/main/java/com/fr/design/gui/ilist/JNameEdList.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) 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 d38def2836..9771239eab 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -116,6 +116,10 @@ public class EnvChangeEntrance { if (!checkValid) { return false; } + //如果是相同环境就不会做done操作,因此不会更新名字,需要先判断一下,如果是相同环境也要更新一下名字(可能会重命名) + if (AssistUtils.equals(WorkContext.getCurrent(), workspace)) { + DesignerEnvManager.getEnvManager().setCurEnvName(envName); + } WorkContext.switchTo(workspace, new WorkContextCallback() { @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java index 4c530c0fcc..4a489e50f5 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java @@ -175,7 +175,8 @@ public class JNameEdList extends UIList implements CellEditorListener { } public void setIllegalIndex(int index) { - setNameAt(NameInspector.ILLEGAL_NAME_HOLDER, index); + //环境如果重名会被命名为请重命名,这个”请重命名“也会重复,后面加个索引区别一下 + setNameAt(NameInspector.ILLEGAL_NAME_HOLDER + index, index); this.repaint(); } From 58109181e0e97126fed713fc3c621441812826ce Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 31 Mar 2023 18:31:06 +0800 Subject: [PATCH 049/625] =?UTF-8?q?REPORT-92953=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=90=8E=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/ilist/JNameEdList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java index 4a489e50f5..c12a225051 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java @@ -175,7 +175,7 @@ public class JNameEdList extends UIList implements CellEditorListener { } public void setIllegalIndex(int index) { - //环境如果重名会被命名为请重命名,这个”请重命名“也会重复,后面加个索引区别一下 + //环境如果重名会被命名为请重命名,这个请重命名也会重复,后面加个索引区别一下 setNameAt(NameInspector.ILLEGAL_NAME_HOLDER + index, index); this.repaint(); } From 07991b53e5801e9c6b30f4a24de1ca26b892b41f Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 3 Apr 2023 15:15:09 +0800 Subject: [PATCH 050/625] =?UTF-8?q?REPORT-92953=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=90=8E=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 102 ++++++++++++------ 1 file changed, 68 insertions(+), 34 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 9771239eab..59b8e8e533 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -120,19 +120,14 @@ public class EnvChangeEntrance { if (AssistUtils.equals(WorkContext.getCurrent(), workspace)) { DesignerEnvManager.getEnvManager().setCurEnvName(envName); } - - WorkContext.switchTo(workspace, new WorkContextCallback() { - @Override - public void done() { - DesignerEnvManager.getEnvManager().setCurEnvName(envName); - DesignUtils.refreshDesignerFrame(); - DesignTableDataManager.fireDSChanged(new HashMap()); - if (WorkContext.getCurrent().isLocal()) { - //初始化一下serverTray - ServerTray.init(); - } - } - }); + //如果是相同环境 + if (isSameEnv(workspace)) { + //目前切换到相同环境需要更新一下名字,后续如果有别的操作直接往里面加就行了 + switch2SameEnv(envName); + } else { + //切换到新环境,做下封装 + switch2OtherEnv(workspace, envName); + } // REPORT-25688如果是war包部署的服务器,给与提示 if (WorkContext.getCurrent().isWarDeploy()) { FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Basic_War_Deploy_Tip"), @@ -160,6 +155,41 @@ public class EnvChangeEntrance { return true; } + private void switch2OtherEnv(Workspace workspace, String envName) { + WorkContext.switchTo(workspace, new WorkContextCallback() { + @Override + public void done() { + DesignerEnvManager.getEnvManager().setCurEnvName(envName); + DesignUtils.refreshDesignerFrame(); + DesignTableDataManager.fireDSChanged(new HashMap()); + if (WorkContext.getCurrent().isLocal()) { + //初始化一下serverTray + ServerTray.init(); + } + } + }); + } + + /** + * 切换到相同环境要做的事情 + * + * @param envName 当前的环境名 + */ + private void switch2SameEnv(String envName) { + //当前环境名称可能重命名更改过,需要更新一下,防止启动失败 + DesignerEnvManager.getEnvManager().setCurEnvName(envName); + } + + /** + * 是否切换到相同环境 + * + * @param workspace 要切换的环境 + * @return 是则返回true + */ + private boolean isSameEnv(Workspace workspace) { + return AssistUtils.equals(WorkContext.getCurrent(), workspace); + } + /** * 这个功能留着,可能会加回来,先做注释处理 * 切换远程环境之前,进行版本检测,当版本不一致的时候,提示。 @@ -205,13 +235,14 @@ public class EnvChangeEntrance { return true; } - /** + /** * 对选择的环境做服务检测 + * * @param selectedEnv 选择的工作环境 */ public void showServiceDialog(DesignerWorkspaceInfo selectedEnv) throws Exception { //是否需要做服务校验 - if(needCheckBranch(selectedEnv)) { + if (needCheckBranch(selectedEnv)) { String localBranch; String remoteBranch; WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); @@ -232,18 +263,18 @@ public class EnvChangeEntrance { StringBuilder textBuilder = new StringBuilder(); for (Class clazz : noExistServiceSet) { WorkspaceAPI workspaceAPI = (WorkspaceAPI) clazz.getAnnotation(WorkspaceAPI.class); - if(workspaceAPI == null){ + if (workspaceAPI == null) { FineLoggerFactory.getLogger().info("workspace service {} get annotation failed", clazz); continue; } - if(workspaceAPI.ignore()){ + if (workspaceAPI.ignore()) { continue; } String descriptionOfCN = InterProviderFactory.getProvider().getLocText(workspaceAPI.description()); textBuilder.append(descriptionOfCN).append("\n"); } String areaText = textBuilder.toString(); - if(StringUtils.isEmpty(areaText)){ + if (StringUtils.isEmpty(areaText)) { return; } @@ -255,24 +286,25 @@ public class EnvChangeEntrance { * 判断是否需要做版本验证,判断依据为 * 1、选择的环境为远程环境 * 2、一个月内不弹出是否勾选 + * * @param selectedEnv 选择的环境 * @return */ - private boolean needCheckBranch(DesignerWorkspaceInfo selectedEnv){ - if(selectedEnv.getType() == DesignerWorkspaceType.Remote){ + private boolean needCheckBranch(DesignerWorkspaceInfo selectedEnv) { + if (selectedEnv.getType() == DesignerWorkspaceType.Remote) { try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); - if(StringUtils.isEmpty(selectedEnv.getRemindTime())){ + if (StringUtils.isEmpty(selectedEnv.getRemindTime())) { return true; } //获取记录的时间 Date remindTime = format.parse(selectedEnv.getRemindTime()); calendar.setTime(remindTime); //获取一个月后的时间 - calendar.add(Calendar.MONTH,1); + calendar.add(Calendar.MONTH, 1); //与当前时间作对比,然后判断是否提示 - if(new Date().after(calendar.getTime())){ + if (new Date().after(calendar.getTime())) { return true; } } catch (ParseException e) { @@ -284,21 +316,22 @@ public class EnvChangeEntrance { /** * 获取不存在的服务列表 + * * @param info 环境连接信息 * @return 以Set形式返回不存在的服务 */ - public Set getNoExistServiceSet(WorkspaceConnectionInfo info){ + public Set getNoExistServiceSet(WorkspaceConnectionInfo info) { Set noExistServiceSet = new HashSet(); Set remoteServiceSet = new HashSet(); Set localServiceSet = FineObjectPool.getInstance().getServerPool().keySet(); try { JSONArray serviceArray = new FunctionalHttpRequest(info).getServiceList(); - for(int i = 0; i < serviceArray.size(); i++){ - try{ + for (int i = 0; i < serviceArray.size(); i++) { + try { Class clazz = Class.forName((String) serviceArray.get(i)); remoteServiceSet.add(clazz); - } catch (Exception e){ + } catch (Exception e) { continue; } } @@ -308,12 +341,12 @@ public class EnvChangeEntrance { } catch (WorkspaceConnectionException e) { FineLoggerFactory.getLogger().info(e.getMessage()); //根据本地的服务列表做逐一检测 - for(Class clazz : localServiceSet) { + for (Class clazz : localServiceSet) { Method testMethod = Reflect.on(Method.class).create(clazz, "connectTest", new Class[0], String.class, new Class[0], 1025, 8, null, null, null, null).get(); WorkspaceProxyPool proxyPool = (WorkspaceProxyPool) (((RemoteWorkspace) WorkContext.getCurrent()).getClient()).getPool(); Result result = proxyPool.testInvoker(testMethod); Exception invokeException = (Exception) result.getException(); - if(invokeException != null){ + if (invokeException != null) { Exception cause = (Exception) invokeException.getCause(); //获取被包装最底层的异常 while (cause != null) { @@ -321,25 +354,26 @@ public class EnvChangeEntrance { cause = (Exception) invokeException.getCause(); } //该异常表示服务不存在 - if(invokeException instanceof ClassNotFoundException){ + if (invokeException instanceof ClassNotFoundException) { noExistServiceSet.add(clazz); } } } return noExistServiceSet; - } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage(),e); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); return noExistServiceSet; } } /** * 格式化分支版本号 + * * @param branch 初始的分支版本号 * @return 格式化后的版本号 */ - private String formatBranch(String branch){ - if(branch.contains("#")){ + private String formatBranch(String branch) { + if (branch.contains("#")) { return branch.substring(branch.lastIndexOf("-") + 1, branch.length() - 13); } return branch; From b983e1ebdb00ba82cf01f43d925353618e0bd467 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 3 Apr 2023 15:15:46 +0800 Subject: [PATCH 051/625] =?UTF-8?q?REPORT-92953=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=90=8E=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/EnvChangeEntrance.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 59b8e8e533..cb78d56436 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -155,6 +155,12 @@ public class EnvChangeEntrance { return true; } + /** + * 切换到其他环境 + * + * @param workspace 要切换的环境 + * @param envName 要切换的环境名称 + */ private void switch2OtherEnv(Workspace workspace, String envName) { WorkContext.switchTo(workspace, new WorkContextCallback() { @Override From b68a0841db5c1d12015b297adfda388f4c0d5cd8 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 3 Apr 2023 15:16:38 +0800 Subject: [PATCH 052/625] =?UTF-8?q?REPORT-92953=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=90=8E=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/EnvChangeEntrance.java | 4 ---- 1 file changed, 4 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 cb78d56436..4300ba039c 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -116,10 +116,6 @@ public class EnvChangeEntrance { if (!checkValid) { return false; } - //如果是相同环境就不会做done操作,因此不会更新名字,需要先判断一下,如果是相同环境也要更新一下名字(可能会重命名) - if (AssistUtils.equals(WorkContext.getCurrent(), workspace)) { - DesignerEnvManager.getEnvManager().setCurEnvName(envName); - } //如果是相同环境 if (isSameEnv(workspace)) { //目前切换到相同环境需要更新一下名字,后续如果有别的操作直接往里面加就行了 From dd8dec870b475f5beb2e4917fcfd5cc421170705 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 3 Apr 2023 15:31:30 +0800 Subject: [PATCH 053/625] =?UTF-8?q?REPORT-92953=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=90=8E=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=20=E6=94=B9=E4=B8=80=E4=B8=8B=E8=80=81=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=AD=94=E6=B3=95=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/EnvChangeEntrance.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 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 4300ba039c..17d7d5883e 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -65,6 +65,9 @@ import java.util.HashSet; import static javax.swing.JOptionPane.QUESTION_MESSAGE; public class EnvChangeEntrance { + private static final String BRANCH_TAG = "#"; + private static final String BRANCH_BEGIN = "-"; + private static final int BRANCH_SUB_LENGTH = 13; public static EnvChangeEntrance getInstance() { return HOLDER.singleton; @@ -375,8 +378,8 @@ public class EnvChangeEntrance { * @return 格式化后的版本号 */ private String formatBranch(String branch) { - if (branch.contains("#")) { - return branch.substring(branch.lastIndexOf("-") + 1, branch.length() - 13); + if (branch.contains(BRANCH_TAG)) { + return branch.substring(branch.lastIndexOf(BRANCH_BEGIN) + 1, branch.length() - BRANCH_SUB_LENGTH); } return branch; } From bbc5a3f916cffa104c6020e5dbe5bb18f4cc8d09 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 3 Apr 2023 17:22:00 +0800 Subject: [PATCH 054/625] =?UTF-8?q?REPORT-90581=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=B7=BB=E5=8A=A0=E4=BA=8B=E4=BB=B6=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=85=85=E6=BB=A1=EF=BC=8C=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E7=95=99=E7=99=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/controlpane/UIListGroupControlPane.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java index ed07ecc2d5..41e40d8b17 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java @@ -28,14 +28,7 @@ import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.AlphaComposite; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.Constructor; @@ -336,7 +329,9 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li Map.Entry entry = iterator.next(); ListWrapperPane wrapperPane = entry.getValue(); UIList uiList = wrapperPane.getNameEdList(); - uiList.setFixedCellWidth(width); + //contentPane是外层的Panel,如果不进行判断的话宽度就可能会小于contentPanel,右侧会有空隙 + //所以需要判断一下,如果外层比较宽就取外层的宽度,防止空隙出现 + uiList.setFixedCellWidth(Math.max(width, contentPane == null? 0 : contentPane.getWidth())); } } From 704028d58a89a0d648560ce78c1bb6b396411d56 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 3 Apr 2023 17:28:41 +0800 Subject: [PATCH 055/625] =?UTF-8?q?REPORT-90581=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=B7=BB=E5=8A=A0=E4=BA=8B=E4=BB=B6=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=85=85=E6=BB=A1=EF=BC=8C=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E7=95=99=E7=99=BD=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/controlpane/UIListGroupControlPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java index 41e40d8b17..890d56da66 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java @@ -331,7 +331,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li UIList uiList = wrapperPane.getNameEdList(); //contentPane是外层的Panel,如果不进行判断的话宽度就可能会小于contentPanel,右侧会有空隙 //所以需要判断一下,如果外层比较宽就取外层的宽度,防止空隙出现 - uiList.setFixedCellWidth(Math.max(width, contentPane == null? 0 : contentPane.getWidth())); + uiList.setFixedCellWidth(Math.max(width, contentPane == null ? 0 : contentPane.getWidth())); } } From 604cab798cc26e3ff884b6ba3d9e76d48a4a28d4 Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 4 Apr 2023 10:04:54 +0800 Subject: [PATCH 056/625] =?UTF-8?q?REPORT-93211=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=96=B0=E5=A2=9E=E6=8A=A5=E9=94=99File=20not=20exist?= =?UTF-8?q?s:/com/fr/design/standard/nextpage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/SheetNameTabPane.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index c8c1b7172e..f672b9a232 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -1,30 +1,7 @@ package com.fr.design.mainframe; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.geom.GeneralPath; -import java.awt.geom.Path2D; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; - import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; - import com.fr.base.svg.IconUtils; import com.fr.base.theme.ReportTheme; import com.fr.base.theme.TemplateTheme; @@ -44,7 +21,6 @@ import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.general.ComparatorUtils; - import com.fr.general.IOUtils; import com.fr.main.impl.WorkBook; import com.fr.poly.PolyDesigner; @@ -52,6 +28,34 @@ import com.fr.report.poly.PolyWorkSheet; import com.fr.report.report.TemplateReport; import com.fr.report.worksheet.WorkSheet; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.geom.GeneralPath; +import java.awt.geom.Path2D; +import java.util.ArrayList; +import java.util.List; + /** * NameTabPane of sheets * @@ -67,7 +71,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse private static final Icon WORK_SHEET_ICON = IconUtils.readIcon("/com/fr/design/standard/worksheet"); private static final Icon POLY_SHEET_ICON = IconUtils.readIcon("/com/fr/design/standard/polysheet"); private static final Icon LEFT_ICON = IconUtils.readIcon("/com/fr/design/standard/prepage/pre_page"); - private static final Icon RIGHT_ICON = IconUtils.readIcon("/com/fr/design/standard/nextpage"); + private static final Icon RIGHT_ICON = IconUtils.readIcon("/com/fr/design/standard/nextpage/next_page"); private static final Icon DISABLED_LEFT_ICON = IconUtils.readIcon("/com/fr/design/standard/prepage/pre_page_disabled.svg"); private static final Icon DISABLED_RIGHT_ICON = IconUtils.readIcon("/com/fr/design/standard/nextpage/next_page_disabled.svg"); private static final int NUM = 10; From c8bb1cae57ff091420df8dd45643682b1b6dfa2c Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 4 Apr 2023 13:50:05 +0800 Subject: [PATCH 057/625] =?UTF-8?q?REPORT-92161=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3-=E9=83=A8=E5=88=86=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=97=A0=E5=8F=8D=E8=89=B2=E5=A4=84=E7=90=86=EF=BC=8C=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E5=90=8E=E5=B0=B1=E7=9C=8B=E4=B8=8D=E5=88=B0=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/controlpane/JListControlPane.java | 9 ++- .../com/fr/design/utils/IconColorUtils.java | 66 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index ee05422caa..7a1fcd9a44 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -7,6 +7,7 @@ import com.fr.design.gui.ilist.JNameEdList; import com.fr.design.gui.ilist.ListModelElement; import com.fr.design.gui.ilist.ModNameActionListener; import com.fr.design.i18n.Toolkit; +import com.fr.design.utils.IconColorUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.general.ComparatorUtils; @@ -19,6 +20,7 @@ import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; +import javax.swing.Icon; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JPopupMenu; @@ -27,6 +29,7 @@ import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -357,7 +360,11 @@ public abstract class JListControlPane extends JControlPane implements ListContr boolean iconSet = false; for (NameableCreator creator : JListControlPane.this.creators()) { if (creator.menuIcon() != null && creator.acceptObject2Populate(nameable) != null) { - this.setIcon(creator.menuIcon()); + Icon icon = creator.menuIcon(); + if(isSelected) { + icon = IconColorUtils.convert(icon, Color.WHITE); + } + this.setIcon(icon); this.setToolTipText(creator.createTooltip()); iconSet = true; break; diff --git a/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java b/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java new file mode 100644 index 0000000000..d8db0a6e1d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java @@ -0,0 +1,66 @@ +package com.fr.design.utils; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.image.BufferedImage; + + +/** + * 对Icon进行颜色处理的工具类 + * + * @author obo + * @since 11.0 + * Created on 2023/4/3 + */ +public final class IconColorUtils { + + /** + * 转色处理并返回处理后的Icon + * + * @param icon 需要转色处理的icon + * @param color 需要转的颜色,可能要和视觉沟通 + * @return 转色后的icon + */ + public static Icon convert(Icon icon, Color color) { + BufferedImage image = iconToImage(icon); + Image convertedImage = createConvertedImage(image, color); + return new ImageIcon(convertedImage); + } + + /** + * 获取icon中的image对象,虽然设计器中未来大部分图标会读取为SVGIcon类型,其中直接包含image对象 + * 但存在某些特殊情况,例如绘制带警告图标的数据集时,无法直接获取image对象,因此统一使用此方法获取 + * + * @param icon 需要获取image的icon + * @return 获取icon对应的image + */ + private static BufferedImage iconToImage(Icon icon) { + BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = image.createGraphics(); + icon.paintIcon(null, g2d, 0, 0); + g2d.dispose(); + return image; + } + + /** + * 转色 + * + * @param image 需要转色的image + * @return 转色后的image + */ + private static Image createConvertedImage(BufferedImage image, Color color) { + int colorRgb = (color.getRGB() & 0x00FFFFFF); + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + int originalArgb = image.getRGB(x, y); + int alpha = (originalArgb >> 24) & 0xFF; + int newArgb = (alpha << 24) | colorRgb; + image.setRGB(x, y, newArgb); + } + } + return image; + } +} \ No newline at end of file From 9d81b6496df6dd2c92ad07182c6f74da7a9c4604 Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 4 Apr 2023 13:51:07 +0800 Subject: [PATCH 058/625] =?UTF-8?q?REPORT-92161=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3-=E9=83=A8=E5=88=86=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=97=A0=E5=8F=8D=E8=89=B2=E5=A4=84=E7=90=86=EF=BC=8C=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E5=90=8E=E5=B0=B1=E7=9C=8B=E4=B8=8D=E5=88=B0=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/IconColorUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java b/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java index d8db0a6e1d..b4b0db9a59 100644 --- a/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java @@ -49,6 +49,7 @@ public final class IconColorUtils { * 转色 * * @param image 需要转色的image + * @param color 需要转的颜色,可能要和视觉沟通 * @return 转色后的image */ private static Image createConvertedImage(BufferedImage image, Color color) { From 5cb91f8270f1590d3b0112aa2aaacfd7c2492e18 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 4 Apr 2023 14:03:07 +0800 Subject: [PATCH 059/625] =?UTF-8?q?REPORT-90581=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=B7=BB=E5=8A=A0=E4=BA=8B=E4=BB=B6=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=85=85=E6=BB=A1=EF=BC=8C=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E7=95=99=E7=99=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controlpane/UIListGroupControlPane.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java index 890d56da66..47581fb626 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java @@ -139,7 +139,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li } this.checkButtonEnabled(); refreshEventListWrapperPane(); - this.checkGroupPaneSize(); + this.updateGroupPaneSize(contentPane); isPopulating = false; } @@ -207,7 +207,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li nameEdList.addModNameActionListener(new ModNameActionListener() { @Override public void nameModed(int index, String oldName, String newName) { - checkGroupPaneSize(); + updateGroupPaneSize(contentPane); saveSettings(); } }); @@ -297,24 +297,30 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li public void onAddItem(NameableCreator creator) { updateSelectedNameList(creator); getCommonHandlers().onAddItem(creator); - checkGroupPaneSize(); + updateGroupPaneSize(contentPane); } @Override public void onRemoveItem() { getCommonHandlers().onRemoveItem(); refreshEventListWrapperPane(); - checkGroupPaneSize(); + updateGroupPaneSize(contentPane); } @Override public void onCopyItem() { getCommonHandlers().onCopyItem(); - checkGroupPaneSize(); + updateGroupPaneSize(contentPane); } - private void checkGroupPaneSize() { + /** + * 根据父面板更新对应的面板宽度 + * (如果小于父面板的宽度就填充到与父面板宽度一致) + * + * @param parentPane 父面板 + */ + private void updateGroupPaneSize(JPanel parentPane) { int width = 180; Iterator> iterator = nameEdListMap.entrySet().iterator(); while (iterator.hasNext()) { @@ -324,14 +330,14 @@ public abstract class UIListGroupControlPane extends UIControlPane implements Li width = Math.max(width, calculateUIListMaxCellWidth(uiList.getModel(), uiList.getFontMetrics(uiList.getFont()))); } iterator = nameEdListMap.entrySet().iterator(); - width += 30; + //contentPane是外层的Panel,如果不进行判断的话宽度就可能会小于contentPanel,右侧会有空隙 + //所以需要判断一下,如果外层比较宽就取外层的宽度,防止空隙出现 + width = Math.max(width + 30, parentPane == null ? 0 : parentPane.getWidth()); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); ListWrapperPane wrapperPane = entry.getValue(); UIList uiList = wrapperPane.getNameEdList(); - //contentPane是外层的Panel,如果不进行判断的话宽度就可能会小于contentPanel,右侧会有空隙 - //所以需要判断一下,如果外层比较宽就取外层的宽度,防止空隙出现 - uiList.setFixedCellWidth(Math.max(width, contentPane == null ? 0 : contentPane.getWidth())); + uiList.setFixedCellWidth(width); } } From 6c67564b624906abbe6033fe7a76e371fe4c7f65 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 4 Apr 2023 16:38:29 +0800 Subject: [PATCH 060/625] =?UTF-8?q?REPORT-93235=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=8F=9C=E5=8D=95=E6=A0=8F-=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=EF=BC=8C=E6=8A=A5=E8=A1=A8=E5=B7=A5=E7=A8=8B=E5=B8=88=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E8=B7=B3=E8=BD=AC=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/community/QuestionAction.java | 2 +- .../main/java/com/fr/design/actions/community/SignAction.java | 2 +- .../com/fr/design/actions/community/TechSolutionAction.java | 2 +- .../src/main/java/com/fr/design/locale/impl/VideoMark.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java index 5b44112254..d6b95217a5 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java @@ -18,7 +18,7 @@ public class QuestionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.questions", "http://bbs.fanruan.com/wenda"); + return CloudCenter.getInstance().acquireUrlByKind("bbs.questions", "https://home.fanruan.com/finereport/wenda"); } public static final MenuKeySet QUESTIONS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java index 8c29ee5e66..110af35340 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java @@ -18,7 +18,7 @@ public class SignAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.aut", "https://bbs.fanruan.com/certification/"); + return CloudCenter.getInstance().acquireUrlByKind("bbs.aut", "https://cert.fanruan.com/"); } public static final MenuKeySet SIGN = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java index 8975555780..9372304868 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java @@ -20,7 +20,7 @@ public class TechSolutionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.solution", "http://bbs.fanruan.com/forum-113-1.html"); + return CloudCenter.getInstance().acquireUrlByKind("bbs.solution", "https://home.fanruan.com/finereport/forum"); } public static final MenuKeySet TSO = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/VideoMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/VideoMark.java index 2521c82c23..571c5e02e9 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/VideoMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/VideoMark.java @@ -16,7 +16,7 @@ public class VideoMark implements LocaleMark { private Map map = new HashMap<>(); private static final String VIDEO_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.en_US", "http://www.finereport.com/en/Learning-path"); - private static final String VIDEO_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.zh_CN", "https://edu.fanruan.com/video?class1=16&class2=0"); + private static final String VIDEO_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.zh_CN", "https://home.fanruan.com/finereport/video"); private static final String VIDEO_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.video.zh_TW", "http://www.finereport.com/tw/video"); public VideoMark() { From 62e2b5d6a44f94d78e948a493de2fd300b490f89 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 4 Apr 2023 16:48:52 +0800 Subject: [PATCH 061/625] =?UTF-8?q?REPORT-93234=20=E4=B8=8D=E6=89=93?= =?UTF-8?q?=E5=BC=80=E4=BB=BB=E4=BD=95=E6=8A=A5=E8=A1=A8=EF=BC=8C=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=88=87=E6=8D=A2=E5=B7=A5=E4=BD=9C=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E6=A8=A1=E6=9D=BFtab=E4=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=BC=B9=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/EnvChangeEntrance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 17d7d5883e..0a464aa6d9 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -134,7 +134,7 @@ public class EnvChangeEntrance { } //REPORT-13810如果只是添加了工作目录,没有切换,这里ToolArea也是要显示新建的工作目录 JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (template != null) { + if (JTemplate.isValid(template)) { template.refreshToolArea(); } PluginErrorDesignReminder.getInstance().remindStartFailedPlugins(); From ba509e753f469b10f296b5b7168a7fd9c93d784f Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 6 Apr 2023 13:42:54 +0800 Subject: [PATCH 062/625] =?UTF-8?q?REPORT-93250=20=E4=B8=8D=E6=89=93?= =?UTF-8?q?=E5=BC=80=E4=BB=BB=E4=BD=95=E6=8A=A5=E8=A1=A8=EF=BC=8C=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E7=82=B9=E5=87=BB=E6=B2=A1=E5=8F=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/webattr/EventPane.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java index 8c11bc5929..347d942834 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/EventPane.java @@ -5,8 +5,11 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.ListenerEditPane; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.MenuDef; import com.fr.design.menu.ToolBarDef; import com.fr.design.widget.EventCreator; @@ -238,6 +241,23 @@ public class EventPane extends BasicPane { } public void actionPerformed(ActionEvent e) { + JTemplate jTemplate = DesignerContext.getDesignerFrame().getSelectedJTemplate(); + if (!JTemplate.isValid(jTemplate)) { + //如果当前没打开模板就跳出弹窗 + Object[] options = new Object[]{Toolkit.i18nText("Fine-Design_Basic_Button_OK")}; + FineJOptionPane.showOptionDialog( + EventPane.this, + Toolkit.i18nText("Fine-Design_Please_Open_Template_First"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[0] + ); + //如果不支持就直接返回,不提供事件功能 + return ; + } String[] def = WebContent.getDefaultArg(menuName[j]); final ListenerEditPane listenerPane = def == null ? new ListenerEditPane() : new ListenerEditPane(def); Listener lis = new Listener(menuName[j], new JavaScriptImpl()); From cf4830a241dccc3223a5d5c67a8b412b00178964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 14:43:03 +0800 Subject: [PATCH 063/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 118 ++++++++++-------- .../worker/save/SaveFailureHandler.java | 8 +- 2 files changed, 72 insertions(+), 54 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index f3d062946d..a09e9c5590 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -24,6 +24,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.SwingWorker; import java.io.OutputStream; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -44,7 +46,7 @@ public class TemplateUtils { * @param openNewTemplate 是否需要在创建后打开模板 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { - createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); + createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, null); } /** @@ -66,15 +68,33 @@ public class TemplateUtils { Runnable doAfterCreateTemplate; //判断一下要保存的文件是否已打开 int index = HistoryTemplateListCache.getInstance().contains(file); - if (index == -1) { - doAfterCreateTemplate = () -> {}; - } else { - JTemplate template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); - doAfterCreateTemplate = () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template); + JTemplate template = null; + if (index != -1) { + template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); } - createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, template); } + /** + * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + * @param template 备份成功后需要关闭的模板 + */ + public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { + String oldPath = file.getPath(); + file = getSavedFile(prefix, file); + if (file == null) { + return; + } + + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, template); + } /** * 返回值可以为null, 为null表示没有点击保存按钮或者传递进来的文件file本身不满足格式要求 @@ -110,32 +130,10 @@ public class TemplateUtils { return null; } - /** - * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate - * - * @param prefix 模板文件名称前缀 - * @param file 模板文件 - * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 - * 为true时以CurrentEditingTemplate为准创建新模板 - * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 - * @param openNewTemplate 是否需要在创建后打开模板 - * @param doAfterCreateTemplate 创建备份模板成功后调用 - */ - public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { - String oldPath = file.getPath(); - file = getSavedFile(prefix, file); - if (file == null) { - return; - } - - createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); - } - - private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { - new SwingWorker() { + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { - @Override - protected Boolean doInBackground() throws Exception { + CompletableFuture.supplyAsync(() -> { + try { // 读取模板数据 byte[] content = getTemplateData(createByEditingTemplate, oldPath); OutputStream out = null; @@ -144,7 +142,7 @@ public class TemplateUtils { boolean saveAsLock = WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); if (!saveAsLock) { // 加锁失败时,直接返回 - return false; + throw new RuntimeException("[RemoteDesign] back up template file failed"); } out = file.asOutputStream(); out.write(content); @@ -159,27 +157,47 @@ public class TemplateUtils { } } return true; + } catch (Exception e) { + SaveFailureHandler.getInstance().process(e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return false; } - - @Override - protected void done() { - try { - if (!get()) { - throw new Exception("[RemoteDesign] back up template file failed"); + }).thenApply((Function) aBoolean -> { + if (!aBoolean) { + //备份失败直接返回 + return null; + } + new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + if (JTemplate.isValid(template)) { + //给要关闭的模板解锁 + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(template.getPath()); + return true; } - // 创建备份成功后,关闭原模板 - doAfterCreateTemplate.run(); - if (openNewTemplate) { - DesignerContext.getDesignerFrame().openTemplate(file); + return false; + } + + @Override + protected void done() { + try { + if (get()) { + // 创建备份成功后,关闭原模板 + HistoryTemplateListCache.getInstance().closeSelectedReport(template); + } + if (openNewTemplate) { + DesignerContext.getDesignerFrame().openTemplate(file); + } + // 备份成功刷新下目录树 展示出来备份的模板 + TemplateTreePane.getInstance().refresh(); + } catch (Exception e) { + SaveFailureHandler.getInstance().process(e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - // 备份成功刷新下目录树 展示出来备份的模板 - TemplateTreePane.getInstance().refresh(); - } catch (Exception e) { - SaveFailureHandler.getInstance().process(e); - FineLoggerFactory.getLogger().error(e.getMessage(), e); } - } - }.execute(); + }.execute(); + return null; + }); } /** diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java index 42ef95978a..9ab897d7e8 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java @@ -119,8 +119,8 @@ public class SaveFailureHandler implements ThrowableHandler { new FileNodeFILE(new FileNode(template.getPath(), false)), true, true, - // 创建并打开备份模板后,关闭原模板,无需释放原模板锁(因为已经被超管手动清除了) - () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template)); + //另存之后需要关闭的模板 + template); } } } @@ -141,8 +141,8 @@ public class SaveFailureHandler implements ThrowableHandler { new FileNodeFILE(new FileNode(template.getPath(), false)), true, true, - // 创建并打开备份模板后,关闭原模板,无需释放原模板锁(锁定信息不一致 = 此用户模板锁信息已被清除) - () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template)); + //另存之后需要关闭的模板 + template); } } } From b7f78769328cf4c249e8cfbdf7dc701aade959f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 14:51:26 +0800 Subject: [PATCH 064/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=E6=96=B9=E6=B3=95=E6=8B=86=E4=B8=A4?= =?UTF-8?q?=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/TemplateUtils.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index a09e9c5590..11b98883e0 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -132,7 +132,7 @@ public class TemplateUtils { private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { - CompletableFuture.supplyAsync(() -> { + CompletableFuture createTemplate = CompletableFuture.supplyAsync(() -> { try { // 读取模板数据 byte[] content = getTemplateData(createByEditingTemplate, oldPath); @@ -162,7 +162,9 @@ public class TemplateUtils { FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; } - }).thenApply((Function) aBoolean -> { + }); + + createTemplate.thenApply((Function) aBoolean -> { if (!aBoolean) { //备份失败直接返回 return null; From 92c88eef13efdc9bd63a3256562f9cdccb95121f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 15:01:35 +0800 Subject: [PATCH 065/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=E6=96=B9=E6=B3=95=E6=8B=86=E4=B8=A4?= =?UTF-8?q?=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index 11b98883e0..77c9d2eb8e 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -130,9 +130,17 @@ public class TemplateUtils { return null; } - private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { - - CompletableFuture createTemplate = CompletableFuture.supplyAsync(() -> { + /** + * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * + * @param file saveAs的模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param oldPath 被saveAs的文件路径 + */ + private static CompletableFuture createTemplate(FILE file, String oldPath, boolean createByEditingTemplate) { + return CompletableFuture.supplyAsync(() -> { try { // 读取模板数据 byte[] content = getTemplateData(createByEditingTemplate, oldPath); @@ -163,8 +171,10 @@ public class TemplateUtils { return false; } }); + } - createTemplate.thenApply((Function) aBoolean -> { + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { + createTemplate(file, oldPath, createByEditingTemplate).thenApply((Function) aBoolean -> { if (!aBoolean) { //备份失败直接返回 return null; From a042152f1bf8655c4468fbe0479f9686cc6e3dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 15:29:32 +0800 Subject: [PATCH 066/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=E6=96=B9=E6=B3=95=E6=8B=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index 77c9d2eb8e..0cbbc4002b 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -173,41 +173,48 @@ public class TemplateUtils { }); } - private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { - createTemplate(file, oldPath, createByEditingTemplate).thenApply((Function) aBoolean -> { - if (!aBoolean) { - //备份失败直接返回 - return null; + /** + * + * @param file 模板文件 + * @param openNewTemplate 是否需要打开新模板 + * @param template 需要关闭的模板 + */ + private static void openNewTemplate(FILE file, boolean openNewTemplate, @Nullable JTemplate template) { + new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + if (JTemplate.isValid(template)) { + //给要关闭的模板解锁 + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(template.getPath()); + return true; + } + return false; } - new SwingWorker() { - @Override - protected Boolean doInBackground() throws Exception { - if (JTemplate.isValid(template)) { - //给要关闭的模板解锁 - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(template.getPath()); - return true; + @Override + protected void done() { + try { + if (get()) { + // 创建备份成功后,关闭原模板 + HistoryTemplateListCache.getInstance().closeSelectedReport(template); } - return false; - } - - @Override - protected void done() { - try { - if (get()) { - // 创建备份成功后,关闭原模板 - HistoryTemplateListCache.getInstance().closeSelectedReport(template); - } - if (openNewTemplate) { - DesignerContext.getDesignerFrame().openTemplate(file); - } - // 备份成功刷新下目录树 展示出来备份的模板 - TemplateTreePane.getInstance().refresh(); - } catch (Exception e) { - SaveFailureHandler.getInstance().process(e); - FineLoggerFactory.getLogger().error(e.getMessage(), e); + if (openNewTemplate) { + DesignerContext.getDesignerFrame().openTemplate(file); } + // 备份成功刷新下目录树 展示出来备份的模板 + TemplateTreePane.getInstance().refresh(); + } catch (Exception e) { + SaveFailureHandler.getInstance().process(e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - }.execute(); + } + }.execute(); + } + + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { + createTemplate(file, oldPath, createByEditingTemplate).thenApply((Function) aBoolean -> { + if (aBoolean) { + openNewTemplate(file, openNewTemplate, template); + } return null; }); } From 7dde3b763a6f0616b9aa6b30a8a4d54f3825f0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 15:42:08 +0800 Subject: [PATCH 067/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=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/utils/TemplateUtils.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index 0cbbc4002b..3b4d11e2fe 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -174,10 +174,9 @@ public class TemplateUtils { } /** - * - * @param file 模板文件 + * @param file 模板文件 * @param openNewTemplate 是否需要打开新模板 - * @param template 需要关闭的模板 + * @param template 需要关闭的模板 */ private static void openNewTemplate(FILE file, boolean openNewTemplate, @Nullable JTemplate template) { new SwingWorker() { From bf9b529af8e15f6ac76bcf42120e6e63b3db092f Mon Sep 17 00:00:00 2001 From: "Sky.Luo" Date: Thu, 6 Apr 2023 17:05:34 +0800 Subject: [PATCH 068/625] =?UTF-8?q?REPORT-89901=20feat:=20sql=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/tabledata/wrapper/AbstractTableDataWrapper.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java index be993fa686..fc520a4d36 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java @@ -2,11 +2,13 @@ package com.fr.design.data.tabledata.wrapper; import com.fr.base.TableData; import com.fr.data.TableDataSource; +import com.fr.data.impl.DBTableData; import com.fr.data.impl.EmbeddedTableData; import com.fr.design.DesignModelAdapter; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.preview.PreviewTablePane; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.utils.DesignUtils; import com.fr.general.ComparatorUtils; @@ -58,6 +60,9 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper { } EmbeddedTableData embeddedTableData = null; + if (tabledata instanceof DBTableData) { + ((DBTableData) tabledata).setDesignerCurrEditTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getName()); + } try { embeddedTableData = DesignTableDataManager.previewTableDataNotNeedInputParameters(tds, tabledata, TableData.RESULT_NOT_NEED, false); } catch (Exception e) { @@ -103,6 +108,9 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper { * */ public void previewData() { + if (tabledata instanceof DBTableData) { + ((DBTableData) tabledata).setDesignerCurrEditTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getName()); + } PreviewTablePane.previewTableData(tabledata); } From 7d36e6f0454b78931c14430b0170cda5222da672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 18:58:44 +0800 Subject: [PATCH 069/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/utils/TemplateUtils.java | 102 ++++++++++++------ 1 file changed, 70 insertions(+), 32 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index f3d062946d..9e48ae137e 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -24,6 +24,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.SwingWorker; import java.io.OutputStream; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -44,7 +46,7 @@ public class TemplateUtils { * @param openNewTemplate 是否需要在创建后打开模板 */ public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { - createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); + createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, null); } /** @@ -66,15 +68,33 @@ public class TemplateUtils { Runnable doAfterCreateTemplate; //判断一下要保存的文件是否已打开 int index = HistoryTemplateListCache.getInstance().contains(file); - if (index == -1) { - doAfterCreateTemplate = () -> {}; - } else { - JTemplate template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); - doAfterCreateTemplate = () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template); + JTemplate template = null; + if (index != -1) { + template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); } - createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, template); } + /** + * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * + * @param prefix 模板文件名称前缀 + * @param file 模板文件 + * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 + * 为true时以CurrentEditingTemplate为准创建新模板 + * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 + * @param openNewTemplate 是否需要在创建后打开模板 + * @param template 备份成功后需要关闭的模板 + */ + public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { + String oldPath = file.getPath(); + file = getSavedFile(prefix, file); + if (file == null) { + return; + } + + createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, template); + } /** * 返回值可以为null, 为null表示没有点击保存按钮或者传递进来的文件file本身不满足格式要求 @@ -113,29 +133,15 @@ public class TemplateUtils { /** * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate * - * @param prefix 模板文件名称前缀 - * @param file 模板文件 + * @param file saveAs的模板文件 * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 * 为true时以CurrentEditingTemplate为准创建新模板 * 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 - * @param openNewTemplate 是否需要在创建后打开模板 - * @param doAfterCreateTemplate 创建备份模板成功后调用 + * @param oldPath 被saveAs的文件路径 */ - public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { - String oldPath = file.getPath(); - file = getSavedFile(prefix, file); - if (file == null) { - return; - } - - createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); - } - - private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { - new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { + private static CompletableFuture createTemplate(FILE file, String oldPath, boolean createByEditingTemplate) { + return CompletableFuture.supplyAsync(() -> { + try { // 读取模板数据 byte[] content = getTemplateData(createByEditingTemplate, oldPath); OutputStream out = null; @@ -144,7 +150,7 @@ public class TemplateUtils { boolean saveAsLock = WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); if (!saveAsLock) { // 加锁失败时,直接返回 - return false; + throw new RuntimeException("[RemoteDesign] back up template file failed"); } out = file.asOutputStream(); out.write(content); @@ -159,20 +165,43 @@ public class TemplateUtils { } } return true; + } catch (Exception e) { + SaveFailureHandler.getInstance().process(e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return false; } + }); + } + /** + * 打开新saveAs的新模板并关闭指定的旧模板 + * + * @param file 模板文件 + * @param openNewTemplate 是否需要打开新模板 + * @param template 需要关闭的模板 + */ + private static void openNewTemplateAndCloseOldTemplate(FILE file, boolean openNewTemplate, @Nullable JTemplate template) { + new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + if (JTemplate.isValid(template)) { + //给要关闭的模板解锁 + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(template.getPath()); + return true; + } + return false; + } @Override protected void done() { try { - if (!get()) { - throw new Exception("[RemoteDesign] back up template file failed"); + if (get()) { + //模板释放锁成功后关闭该模板 + HistoryTemplateListCache.getInstance().closeSelectedReport(template); } - // 创建备份成功后,关闭原模板 - doAfterCreateTemplate.run(); if (openNewTemplate) { DesignerContext.getDesignerFrame().openTemplate(file); } - // 备份成功刷新下目录树 展示出来备份的模板 + // 刷新下目录树 TemplateTreePane.getInstance().refresh(); } catch (Exception e) { SaveFailureHandler.getInstance().process(e); @@ -182,6 +211,15 @@ public class TemplateUtils { }.execute(); } + private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, @Nullable JTemplate template) { + createTemplate(file, oldPath, createByEditingTemplate).thenApply((Function) aBoolean -> { + if (aBoolean) { + openNewTemplateAndCloseOldTemplate(file, openNewTemplate, template); + } + return null; + }); + } + /** * 读取模板文件数据 * From 82933300a5a4242739df9cffd26ac7696b36e884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 19:02:45 +0800 Subject: [PATCH 070/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=E6=94=B9=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/utils/TemplateUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index 9e48ae137e..ceb21dfd6a 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -174,7 +174,7 @@ public class TemplateUtils { } /** - * 打开新saveAs的新模板并关闭指定的旧模板 + * 打开saveAs的新模板并关闭指定的旧模板 * * @param file 模板文件 * @param openNewTemplate 是否需要打开新模板 From 82f00839d05f7b72f2687962a26021db4da29ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 6 Apr 2023 19:08:56 +0800 Subject: [PATCH 071/625] =?UTF-8?q?REPORT-92893=20=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E9=87=8D=E5=A4=8D=E5=8F=A6?= =?UTF-8?q?=E5=AD=98=E5=89=AF=E6=9C=AC=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E4=B8=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0--=E6=94=B9=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/utils/TemplateUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java index ceb21dfd6a..9b426b5c87 100644 --- a/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/TemplateUtils.java @@ -131,7 +131,7 @@ public class TemplateUtils { } /** - * 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate + * 生成备份模板 * * @param file saveAs的模板文件 * @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 From 5728ed0fb0a05f41cab69b9d974ccc8bacaa2016 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 7 Apr 2023 12:00:17 +0800 Subject: [PATCH 072/625] =?UTF-8?q?REPORT-93234=20=E4=B8=8D=E6=89=93?= =?UTF-8?q?=E5=BC=80=E4=BB=BB=E4=BD=95=E6=8A=A5=E8=A1=A8=EF=BC=8C=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=88=87=E6=8D=A2=E5=B7=A5=E4=BD=9C=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E6=A8=A1=E6=9D=BFtab=E4=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=BC=B9=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/toolbar/ToolBarMenuDock.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 3c75eff39d..3372e2ad13 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -42,6 +42,7 @@ import com.fr.design.actions.server.GlobalTableDataAction; import com.fr.design.actions.server.PlatformManagerAction; import com.fr.design.actions.server.PluginManagerAction; import com.fr.design.base.mode.DesignModeContext; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.NewTemplatePane; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; @@ -275,7 +276,10 @@ public abstract class ToolBarMenuDock { insertTemplateExtendMenu(plus, menuDefs); // 添加模板菜单 - menuList.addAll(Arrays.asList(menuDefs)); + // 如果是JNullTemplate不能添加模板菜单,之前没有这个JNullTemplate所以没考虑 + if (JTemplate.isValid(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())) { + menuList.addAll(Arrays.asList(menuDefs)); + } // 添加服务器菜单 if (WorkContext.getCurrent() != null && WorkContext.getCurrent().isRoot()) { From 52277923da17a7f7f406bb6e64842006d3463879 Mon Sep 17 00:00:00 2001 From: "Sky.Luo" Date: Fri, 7 Apr 2023 15:55:20 +0800 Subject: [PATCH 073/625] =?UTF-8?q?REPORT-89901=20feat:=20sql=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/DesignTableDataManager.java | 1 + .../data/tabledata/wrapper/AbstractTableDataWrapper.java | 6 ------ 2 files changed, 1 insertion(+), 6 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 5134e88c8b..2f97977f5b 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 @@ -571,6 +571,7 @@ public abstract class DesignTableDataManager { parameter.setValue(parameterMap.get(parameter.getName())); } } + parameterMap.put("templateName", HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); return DataOperator.getInstance().previewTableData(TableDataSourceTailor.extractTableData(tableDataSource), tabledata, parameterMap, rowCount); } catch (Exception e) { throw new TableDataException(e.getMessage(), e); diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java index fc520a4d36..43a9771caf 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java @@ -60,9 +60,6 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper { } EmbeddedTableData embeddedTableData = null; - if (tabledata instanceof DBTableData) { - ((DBTableData) tabledata).setDesignerCurrEditTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getName()); - } try { embeddedTableData = DesignTableDataManager.previewTableDataNotNeedInputParameters(tds, tabledata, TableData.RESULT_NOT_NEED, false); } catch (Exception e) { @@ -108,9 +105,6 @@ public abstract class AbstractTableDataWrapper implements TableDataWrapper { * */ public void previewData() { - if (tabledata instanceof DBTableData) { - ((DBTableData) tabledata).setDesignerCurrEditTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getName()); - } PreviewTablePane.previewTableData(tabledata); } From 8b6fa967afbd8efd4465f98665cf0b7688438ab9 Mon Sep 17 00:00:00 2001 From: "Sky.Luo" Date: Fri, 7 Apr 2023 16:00:10 +0800 Subject: [PATCH 074/625] =?UTF-8?q?REPORT-89901=20feat:=20sql=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/tabledata/wrapper/AbstractTableDataWrapper.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java index 43a9771caf..be993fa686 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java @@ -2,13 +2,11 @@ package com.fr.design.data.tabledata.wrapper; import com.fr.base.TableData; import com.fr.data.TableDataSource; -import com.fr.data.impl.DBTableData; import com.fr.data.impl.EmbeddedTableData; import com.fr.design.DesignModelAdapter; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.preview.PreviewTablePane; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; -import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.utils.DesignUtils; import com.fr.general.ComparatorUtils; From d1d46dc5472a736d7ef2dbd944700bd15d9aa5be Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 11 Apr 2023 14:29:47 +0800 Subject: [PATCH 075/625] =?UTF-8?q?REPORT-92161=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3-=E9=83=A8=E5=88=86=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=97=A0=E5=8F=8D=E8=89=B2=E5=A4=84=E7=90=86=EF=BC=8C=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E5=90=8E=E5=B0=B1=E7=9C=8B=E4=B8=8D=E5=88=B0=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/controlpane/JListControlPane.java | 49 +++++++++++--- .../com/fr/design/utils/IconColorUtils.java | 67 ------------------- 2 files changed, 39 insertions(+), 77 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index 7a1fcd9a44..37bc66871a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -7,7 +7,6 @@ import com.fr.design.gui.ilist.JNameEdList; import com.fr.design.gui.ilist.ListModelElement; import com.fr.design.gui.ilist.ModNameActionListener; import com.fr.design.i18n.Toolkit; -import com.fr.design.utils.IconColorUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.event.Listener; import com.fr.general.ComparatorUtils; @@ -18,12 +17,13 @@ import com.fr.stable.Nameable; import com.fr.stable.StringUtils; import com.fr.stable.core.PropertyChangeAdapter; -import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.Icon; +import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JPopupMenu; +import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; @@ -346,25 +346,46 @@ public abstract class JListControlPane extends JControlPane implements ListContr } protected class NameableListCellRenderer extends - DefaultListCellRenderer { + JPanel implements ListCellRenderer { + + private final JLabel textLabel; + private final JLabel iconLabel; + + /** + * JList默认单元格渲染器的选中背景色 + */ + private final Color selectedBgColor = new Color(65, 155, 249); + protected NameableListCellRenderer() { + setLayout(new BorderLayout()); + this.textLabel = new JLabel(); + this.iconLabel = new JLabel(); + add(this.textLabel, BorderLayout.CENTER); + add(this.iconLabel, BorderLayout.WEST); + this.iconLabel.setBackground(Color.WHITE); + //iconLabel和textLabel的背景颜色不会被JList背景颜色覆盖,开发者自定义 + this.textLabel.setOpaque(true); + this.iconLabel.setOpaque(true); + } + @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, - cellHasFocus); if (value instanceof ListModelElement) { ListModelElement element = ((ListModelElement) value); Nameable nameable = element.wrapper; - this.setText(nameable.getName()); + this.textLabel.setText(nameable.getName()); boolean iconSet = false; for (NameableCreator creator : JListControlPane.this.creators()) { if (creator.menuIcon() != null && creator.acceptObject2Populate(nameable) != null) { - Icon icon = creator.menuIcon(); + this.iconLabel.setIcon(creator.menuIcon()); if(isSelected) { - icon = IconColorUtils.convert(icon, Color.WHITE); + this.textLabel.setBackground(selectedBgColor); + this.textLabel.setForeground(Color.WHITE); + } else { + this.textLabel.setBackground(Color.WHITE); + this.textLabel.setForeground(Color.BLACK); } - this.setIcon(icon); this.setToolTipText(creator.createTooltip()); iconSet = true; break; @@ -376,8 +397,16 @@ public abstract class JListControlPane extends JControlPane implements ListContr } return this; } - } + /** + * 改造后兼容基类NoIconNameableListCellRenderer使用,添加此setIcon函数 + * + * @param icon 图标,可为null + */ + public void setIcon(Icon icon) { + this.iconLabel.setIcon(icon); + } + } @Override public BasicBeanPane createPaneByCreators(NameableCreator creator) { return Reflect.on(creator.getUpdatePane()).create().get(); diff --git a/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java b/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java deleted file mode 100644 index b4b0db9a59..0000000000 --- a/designer-base/src/main/java/com/fr/design/utils/IconColorUtils.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.fr.design.utils; - -import javax.swing.Icon; -import javax.swing.ImageIcon; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.image.BufferedImage; - - -/** - * 对Icon进行颜色处理的工具类 - * - * @author obo - * @since 11.0 - * Created on 2023/4/3 - */ -public final class IconColorUtils { - - /** - * 转色处理并返回处理后的Icon - * - * @param icon 需要转色处理的icon - * @param color 需要转的颜色,可能要和视觉沟通 - * @return 转色后的icon - */ - public static Icon convert(Icon icon, Color color) { - BufferedImage image = iconToImage(icon); - Image convertedImage = createConvertedImage(image, color); - return new ImageIcon(convertedImage); - } - - /** - * 获取icon中的image对象,虽然设计器中未来大部分图标会读取为SVGIcon类型,其中直接包含image对象 - * 但存在某些特殊情况,例如绘制带警告图标的数据集时,无法直接获取image对象,因此统一使用此方法获取 - * - * @param icon 需要获取image的icon - * @return 获取icon对应的image - */ - private static BufferedImage iconToImage(Icon icon) { - BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); - Graphics2D g2d = image.createGraphics(); - icon.paintIcon(null, g2d, 0, 0); - g2d.dispose(); - return image; - } - - /** - * 转色 - * - * @param image 需要转色的image - * @param color 需要转的颜色,可能要和视觉沟通 - * @return 转色后的image - */ - private static Image createConvertedImage(BufferedImage image, Color color) { - int colorRgb = (color.getRGB() & 0x00FFFFFF); - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - int originalArgb = image.getRGB(x, y); - int alpha = (originalArgb >> 24) & 0xFF; - int newArgb = (alpha << 24) | colorRgb; - image.setRGB(x, y, newArgb); - } - } - return image; - } -} \ No newline at end of file From c53183a30c374f1b1d68409463f9fa89c249944c Mon Sep 17 00:00:00 2001 From: obo Date: Tue, 11 Apr 2023 15:02:39 +0800 Subject: [PATCH 076/625] =?UTF-8?q?REPORT-92161=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3-=E9=83=A8=E5=88=86=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=97=A0=E5=8F=8D=E8=89=B2=E5=A4=84=E7=90=86=EF=BC=8C=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E5=90=8E=E5=B0=B1=E7=9C=8B=E4=B8=8D=E5=88=B0=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/gui/ilist/JNameEdList.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java index c12a225051..f4c3cfe920 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilist/JNameEdList.java @@ -11,15 +11,20 @@ import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.ListModel; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; -import java.util.ArrayList; -import java.util.Vector; import java.awt.Component; import java.awt.Rectangle; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import java.util.ArrayList; +import java.util.Vector; public class JNameEdList extends UIList implements CellEditorListener { - private static final int ICON_WIDTH = 20; + + /** + * 原值为20,设计器图标由png替换为svg之后JNameEdList的icon大小为16x16 + * 重命名是会出现左侧一部分带有背景色的渲染 + */ + private static final int ICON_WIDTH = 16; private boolean editable = true; // kunsnat: 是否强制ListName是数字 (int型) From be631852114495177ae5cc4123b1fcfabe7cdab2 Mon Sep 17 00:00:00 2001 From: Yvan Date: Tue, 11 Apr 2023 17:15:09 +0800 Subject: [PATCH 077/625] =?UTF-8?q?REPORT-89863=5F=E3=80=90=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E3=80=91=E7=A7=BB=E5=8A=A8=E7=AB=AFNFC?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AF=BB=E5=8F=96uid=E4=BF=A1=E6=81=AF=5F?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E6=94=AF=E6=92=91=20=E3=80=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91=E8=AF=A6=E8=A7=81=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=96=87=E6=A1=A3-=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E9=83=A8=E5=88=86=EF=BC=8Chttps://kms.fineres.com/pages/viewpa?= =?UTF-8?q?ge.action=3FpageId=3D722437221=20=E3=80=90review=E5=BB=BA?= =?UTF-8?q?=E8=AE=AE=E3=80=91=E6=97=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MobileTextFieldInputSettingPane.java | 90 ++++++++++++++++++- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java index faaec45bc8..b736230dd7 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java @@ -3,13 +3,16 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.mobile.MobileScanCodeAttr; import com.fr.design.beans.BasicBeanPane; import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.layout.VerticalFlowLayout; +import javax.swing.ButtonGroup; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -25,25 +28,38 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane { + UICheckBox source = (UICheckBox) e.getSource(); + // 更新面板是否可见 + updateNfcContentTypePane(source.isSelected(), nfcContentTypePane.getSelectedType()); + }); initComponents(); + // 初始状态,内容类型面板不可见 + nfcContentTypePane.setVisible(false); } private void initComponents() { Component[][] components = new Component[][]{ new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Mobile_Input_Way")), manualInputCheckBox}, new Component[]{null, scanCodeCheckBox}, - new Component[]{null, nfcInputCheckBox} + new Component[]{null, nfcInputCheckBox}, + new Component[]{null, nfcContentTypePane}, }; double p = TableLayout.PREFERRED; double f = TableLayout.FILL; - double[] rowSize = {p, p, p}; + double[] rowSize = {p, p, p, p}; double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; JPanel settingPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.HGAP_LARGE, LayoutConstants.VGAP_LARGE); this.add(settingPane, BorderLayout.NORTH); } @@ -53,6 +69,7 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane Date: Tue, 11 Apr 2023 19:12:54 +0800 Subject: [PATCH 078/625] =?UTF-8?q?REPORT-92161=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=9B=BE=E6=A0=87-=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3-=E9=83=A8=E5=88=86=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=97=A0=E5=8F=8D=E8=89=B2=E5=A4=84=E7=90=86=EF=BC=8C=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E5=90=8E=E5=B0=B1=E7=9C=8B=E4=B8=8D=E5=88=B0=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/gui/controlpane/JListControlPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index 37bc66871a..37134ec995 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -399,7 +399,7 @@ public abstract class JListControlPane extends JControlPane implements ListContr } /** - * 改造后兼容基类NoIconNameableListCellRenderer使用,添加此setIcon函数 + * 改造后兼容子类NoIconNameableListCellRenderer使用,添加此setIcon函数 * * @param icon 图标,可为null */ From 21ad45ba352ca9ee0370ce69dcb57acc7b69a02f Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 11 Apr 2023 19:59:23 +0800 Subject: [PATCH 079/625] =?UTF-8?q?REPORT-93649=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BF=9E=E6=8E=A5=E6=9D=83=E9=99=90=EF=BC=8C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=95=B0=E6=8D=AE=E9=9B=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BB=8D=E7=84=B6=E5=8F=AF=E4=BB=A5=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/BasicTableDataTreePane.java | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java index b3a076a92b..af9850172b 100644 --- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java @@ -5,14 +5,17 @@ import com.fr.base.TableData; import com.fr.base.svg.IconUtils; import com.fr.data.MultiResultTableData; import com.fr.data.TableDataSource; +import com.fr.data.impl.DBTableData; import com.fr.design.DesignModelAdapter; import com.fr.design.actions.UpdateAction; import com.fr.design.data.datapane.TableDataCreatorProducer; import com.fr.design.data.datapane.TableDataNameObjectCreator; import com.fr.design.data.datapane.TableDataSourceOP; import com.fr.design.data.datapane.TableDataTree; +import com.fr.design.data.datapane.auth.TableDataAuthHelper; import com.fr.design.data.tabledata.ResponseDataSourceChange; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.loading.TableDataLoadingPane; import com.fr.design.data.tabledata.wrapper.MultiResultTableDataWrapper; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; @@ -42,6 +45,8 @@ import javax.swing.DefaultCellEditor; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JTree; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.tree.TreeCellEditor; @@ -51,6 +56,7 @@ import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.util.Collection; import java.util.EventObject; import java.util.HashMap; import java.util.HashSet; @@ -449,7 +455,45 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp storeProcedureDataWrapper.previewData(MultiResultTableDataWrapper.PREVIEW_ALL); } } else { - ((TableDataWrapper) data).previewData(); + TableDataWrapper wrapper = ((TableDataWrapper) data); + if (TableDataAuthHelper.needCheckAuthWhenEdit(wrapper.getTableData())) { + // 先打开一个Loading面板 + TableDataLoadingPane loadingPane = new TableDataLoadingPane(); + BasicDialog loadingDialog = loadingPane.showLargeWindow(SwingUtilities.getWindowAncestor(BasicTableDataTreePane.this), null); + // 查询权限 + new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + // 获取无权限连接名称集合 + Collection noAuthConnections = TableDataAuthHelper.getNoAuthConnections(); + // 获取当前数据集对应的数据连接名称 + String connectionName = TableDataAuthHelper.getConnectionNameByDBTableData((DBTableData) wrapper.getTableData()); + return !noAuthConnections.contains(connectionName); + } + + @Override + protected void done() { + try { + Boolean hasAuth = get(); + if (hasAuth) { + // 有权限时,关闭Loading面板,打开编辑面板 + loadingDialog.setVisible(false); + wrapper.previewData(); + } else { + // 无权限时,给出无权限提示 + loadingPane.switchTo(TableDataLoadingPane.NO_AUTH_PANE_NAME); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error("loading connection error in remote design", e.getMessage()); + // 查询权限失败时,给出报错提示 + loadingPane.switchTo(TableDataLoadingPane.ERROR_NAME); + } + } + }.execute(); + loadingDialog.setVisible(true); + } else { + wrapper.previewData(); + } } } catch (Exception ex) { From 7a3f3dc7166e2da29fda7b1cd1daeafe2685b418 Mon Sep 17 00:00:00 2001 From: "Sky.Luo" Date: Wed, 12 Apr 2023 11:31:55 +0800 Subject: [PATCH 080/625] =?UTF-8?q?REPORT-89901=20feat:=20sql=E6=B7=BB?= =?UTF-8?q?=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/data/DesignTableDataManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 2f97977f5b..175af0653f 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 @@ -32,6 +32,7 @@ import com.fr.file.TableDataConfig; import com.fr.general.ComparatorUtils; import com.fr.general.data.DataModel; import com.fr.general.data.TableDataException; +import com.fr.general.sql.sqlnote.SqlNoteConstants; import com.fr.log.FineLoggerFactory; import com.fr.module.ModuleContext; import com.fr.script.Calculator; @@ -571,7 +572,7 @@ public abstract class DesignTableDataManager { parameter.setValue(parameterMap.get(parameter.getName())); } } - parameterMap.put("templateName", HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); + parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); return DataOperator.getInstance().previewTableData(TableDataSourceTailor.extractTableData(tableDataSource), tabledata, parameterMap, rowCount); } catch (Exception e) { throw new TableDataException(e.getMessage(), e); From 470d10722047618d14deec69d11721c386ef640e Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Wed, 12 Apr 2023 13:36:42 +0800 Subject: [PATCH 081/625] =?UTF-8?q?REPORT-90316=20=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E6=8E=A7=E4=BB=B6=E7=9A=84=E7=A7=BB=E5=8A=A8=E7=AB=AF?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...I.java => TextEditorMobilePropertyUI.java} | 15 ++++-- ...e.java => TextEditorMobileDefinePane.java} | 10 ++-- .../widget/WidgetMobilePaneFactory.java | 13 ++++- .../ui/mobile/NumberEditorMobilePane.java | 41 ++++++++++++++ .../widget/ui/mobile/PasswordMobilePane.java | 42 +++++++++++++++ .../widget/ui/mobile/ScanCodeMobilePane.java | 38 ------------- .../widget/ui/mobile/TextAreaMobilePane.java | 42 +++++++++++++++ .../ui/mobile/TextEditorMobilePane.java | 53 +++++++++++++++++++ 8 files changed, 207 insertions(+), 47 deletions(-) rename designer-form/src/main/java/com/fr/design/designer/properties/mobile/{ScanCodeMobilePropertyUI.java => TextEditorMobilePropertyUI.java} (65%) rename designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/{ScanCodeMobileDefinePane.java => TextEditorMobileDefinePane.java} (86%) create mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/NumberEditorMobilePane.java create mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/PasswordMobilePane.java delete mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/ScanCodeMobilePane.java create mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextAreaMobilePane.java create mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ScanCodeMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java similarity index 65% rename from designer-form/src/main/java/com/fr/design/designer/properties/mobile/ScanCodeMobilePropertyUI.java rename to designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java index 85011ee2b9..531e2c4fc8 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ScanCodeMobilePropertyUI.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java @@ -5,13 +5,20 @@ import com.fr.design.designer.creator.XTextEditor; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; import com.fr.design.gui.itable.AbstractPropertyTable; -import com.fr.design.widget.ui.designer.mobile.ScanCodeMobileDefinePane; +import com.fr.design.widget.ui.designer.mobile.TextEditorMobileDefinePane; -public class ScanCodeMobilePropertyUI extends AbstractWidgetPropertyUIProvider { +/** + * 文本控件 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/3/30 + */ +public class TextEditorMobilePropertyUI extends AbstractWidgetPropertyUIProvider { private XCreator xCreator; - public ScanCodeMobilePropertyUI(XTextEditor xTextEditor) { + public TextEditorMobilePropertyUI(XTextEditor xTextEditor) { this.xCreator = xTextEditor; } @@ -22,7 +29,7 @@ public class ScanCodeMobilePropertyUI extends AbstractWidgetPropertyUIProvider { @Override public BasicPane createWidgetAttrPane() { - return new ScanCodeMobileDefinePane(xCreator); + return new TextEditorMobileDefinePane(xCreator); } @Override diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java similarity index 86% rename from designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java rename to designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java index bb785c27d9..17342a372c 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java @@ -10,17 +10,21 @@ import com.fr.form.ui.TextEditor; import javax.swing.JPanel; /** + * 文本控件移动端属性 * 输入方式: + * 输入框属性: * * @author hades * @since 11.0 * Created on 2018/11/27 */ -public class ScanCodeMobileDefinePane extends BaseTextEditorMobileDefinePane { - +public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { + /** + * 输入方式 + */ private MobileTextFieldInputSettingPane inputSettingPane; - public ScanCodeMobileDefinePane(XCreator xCreator) { + public TextEditorMobileDefinePane(XCreator xCreator) { super(xCreator); } 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 86eba335d9..eef3477c97 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,8 +4,14 @@ 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.ScanCodeMobilePane; +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; @@ -28,7 +34,10 @@ public class WidgetMobilePaneFactory { static { mobilePaneMap.put(MultiFileEditor.class, MultiFileEditorMobilePane.class); - mobilePaneMap.put(TextEditor.class, ScanCodeMobilePane.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); mobilePluginPaneMap.putAll(ExtraDesignClassManager.getInstance().getCellWidgetMobileOptionsMap()); GeneralContext.listenPluginRunningChanged(new PluginEventListener() { diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/NumberEditorMobilePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/NumberEditorMobilePane.java new file mode 100644 index 0000000000..8f105c870c --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/NumberEditorMobilePane.java @@ -0,0 +1,41 @@ +package com.fr.design.widget.ui.mobile; + +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.widget.mobile.WidgetMobilePane; +import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane; +import com.fr.form.ui.NumberEditor; +import com.fr.form.ui.Widget; + +import java.awt.BorderLayout; + +/** + * 数字控件移动端属性 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/11 + */ +public class NumberEditorMobilePane extends WidgetMobilePane { + private MobileTextEditSettingPane textSettingPane; + + @Override + protected void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + textSettingPane = new MobileTextEditSettingPane(); + this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, textSettingPane), BorderLayout.NORTH); + } + + @Override + public void populate(Widget widget) { + NumberEditor numberEditor = (NumberEditor) widget; + textSettingPane.populateBean(numberEditor.getMobileTextEditAttr()); + } + + @Override + public void update(Widget widget) { + NumberEditor numberEditor = (NumberEditor) widget; + textSettingPane.updateBean(numberEditor.getMobileTextEditAttr()); + } +} \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/PasswordMobilePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/PasswordMobilePane.java new file mode 100644 index 0000000000..196e6aa1c3 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/PasswordMobilePane.java @@ -0,0 +1,42 @@ +package com.fr.design.widget.ui.mobile; + +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.widget.mobile.WidgetMobilePane; +import com.fr.design.widget.ui.designer.mobile.component.MobilePasswordEditSettingPane; +import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane; +import com.fr.form.ui.TextEditor; +import com.fr.form.ui.Widget; + +import java.awt.BorderLayout; + +/** + * 密码控件移动端属性 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/11 + */ +public class PasswordMobilePane extends WidgetMobilePane { + private MobileTextEditSettingPane textSettingPane; + + @Override + protected void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + textSettingPane = new MobilePasswordEditSettingPane(); + this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, textSettingPane), BorderLayout.NORTH); + } + + @Override + public void populate(Widget widget) { + TextEditor textEditor = (TextEditor) widget; + textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); + } + + @Override + public void update(Widget widget) { + TextEditor textEditor = (TextEditor) widget; + textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); + } +} \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/ScanCodeMobilePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/ScanCodeMobilePane.java deleted file mode 100644 index 6f9b379067..0000000000 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/ScanCodeMobilePane.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fr.design.widget.ui.mobile; - -import com.fr.base.mobile.MobileScanCodeAttr; -import com.fr.design.foldablepane.UIExpandablePane; -import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.widget.mobile.WidgetMobilePane; -import com.fr.design.widget.ui.designer.mobile.component.MobileTextFieldInputSettingPane; -import com.fr.form.ui.TextEditor; -import com.fr.form.ui.Widget; -import java.awt.BorderLayout; - - -public class ScanCodeMobilePane extends WidgetMobilePane { - - private MobileTextFieldInputSettingPane settingPane; - - @Override - protected void init() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - settingPane = new MobileTextFieldInputSettingPane(); - this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, settingPane), BorderLayout.NORTH); - } - - @Override - public void populate(Widget widget) { - MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) widget).getMobileScanCodeAttr(); - settingPane.populateBean(mobileScanCodeAttr); - } - - @Override - public void update(Widget widget) { - MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) widget).getMobileScanCodeAttr(); - settingPane.updateBean(mobileScanCodeAttr); - } - - -} diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextAreaMobilePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextAreaMobilePane.java new file mode 100644 index 0000000000..2b8edc0e15 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextAreaMobilePane.java @@ -0,0 +1,42 @@ +package com.fr.design.widget.ui.mobile; + +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.widget.mobile.WidgetMobilePane; +import com.fr.design.widget.ui.designer.mobile.component.MobileTextAreaSettingPane; +import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane; +import com.fr.form.ui.TextEditor; +import com.fr.form.ui.Widget; + +import java.awt.BorderLayout; + +/** + * 文本域控件移动端属性 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/11 + */ +public class TextAreaMobilePane extends WidgetMobilePane { + private MobileTextEditSettingPane textSettingPane; + + @Override + protected void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + textSettingPane = new MobileTextAreaSettingPane(); + this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, textSettingPane), BorderLayout.NORTH); + } + + @Override + public void populate(Widget widget) { + TextEditor textEditor = (TextEditor) widget; + textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); + } + + @Override + public void update(Widget widget) { + TextEditor textEditor = (TextEditor) widget; + textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..60818cdf95 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java @@ -0,0 +1,53 @@ +package com.fr.design.widget.ui.mobile; + +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.widget.mobile.WidgetMobilePane; +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; +import com.fr.form.ui.Widget; + +import javax.swing.JPanel; +import java.awt.BorderLayout; + + +public class TextEditorMobilePane extends WidgetMobilePane { + + /** + * 输入方式 + */ + private MobileTextFieldInputSettingPane settingPane; + /** + * 输入框属性配置 + */ + private MobileTextEditSettingPane textSettingPane; + + @Override + protected void init() { + JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + settingPane = new MobileTextFieldInputSettingPane(); + textSettingPane = new MobileTextEditSettingPane(); + container.add(settingPane); + container.add(textSettingPane); + this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH); + } + + @Override + public void populate(Widget widget) { + TextEditor textEditor = (TextEditor) widget; + settingPane.populateBean(textEditor.getMobileScanCodeAttr()); + textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); + } + + @Override + public void update(Widget widget) { + TextEditor textEditor = (TextEditor) widget; + settingPane.updateBean(textEditor.getMobileScanCodeAttr()); + textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); + } + + +} From fbb07da941e3495bb1ac33adc9305ecf8a1161c1 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Wed, 12 Apr 2023 13:46:49 +0800 Subject: [PATCH 082/625] =?UTF-8?q?REPORT-90316=20=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/widget/ui/mobile/TextEditorMobilePane.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 60818cdf95..7c836389d7 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 @@ -12,7 +12,13 @@ import com.fr.form.ui.Widget; import javax.swing.JPanel; import java.awt.BorderLayout; - +/** + * 文本控件移动端属性面板 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/12 + */ public class TextEditorMobilePane extends WidgetMobilePane { /** From 2fd5bef6309e0db0e1e014f4374047dce9ce5dc5 Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Wed, 12 Apr 2023 16:02:54 +0800 Subject: [PATCH 083/625] =?UTF-8?q?REPORT-90316=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=BB=B6=E6=9C=9F=EF=BC=8C=E5=90=8E=E7=AB=AF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/creator/XNumberEditor.java | 6 - .../fr/design/designer/creator/XPassword.java | 6 - .../fr/design/designer/creator/XTextArea.java | 11 +- .../mobile/NumberEditorMobilePropertyUI.java | 37 ------ .../mobile/PasswordMobilePropertyUI.java | 37 ------ ...yUI.java => ScanCodeMobilePropertyUI.java} | 15 +-- .../mobile/TextAreaMobilePropertyUI.java | 37 ------ .../BaseTextEditorMobileDefinePane.java | 94 --------------- .../mobile/NumberEditorMobileDefinePane.java | 33 ------ .../mobile/PasswordMobileDefinePane.java | 25 ---- .../mobile/ScanCodeMobileDefinePane.java | 63 ++++++++++ .../mobile/TextAreaAdvancedDefinePane.java | 25 ---- .../mobile/TextEditorMobileDefinePane.java | 55 --------- .../MobilePasswordEditSettingPane.java | 43 ------- .../component/MobileTextAreaSettingPane.java | 38 ------ .../component/MobileTextEditSettingPane.java | 59 ---------- .../MobileTextFieldInputSettingPane.java | 109 +----------------- .../widget/WidgetMobilePaneFactory.java | 13 +-- .../ui/mobile/NumberEditorMobilePane.java | 41 ------- .../widget/ui/mobile/PasswordMobilePane.java | 42 ------- .../widget/ui/mobile/ScanCodeMobilePane.java | 39 +++++++ .../widget/ui/mobile/TextAreaMobilePane.java | 42 ------- .../ui/mobile/TextEditorMobilePane.java | 59 ---------- 23 files changed, 114 insertions(+), 815 deletions(-) delete mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java delete mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java rename designer-form/src/main/java/com/fr/design/designer/properties/mobile/{TextEditorMobilePropertyUI.java => ScanCodeMobilePropertyUI.java} (65%) delete mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java delete mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java delete mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/NumberEditorMobilePane.java delete mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/PasswordMobilePane.java create mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/ScanCodeMobilePane.java delete mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextAreaMobilePane.java delete mode 100644 designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java 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 8861d6fcbc..fc359976e2 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; @@ -104,8 +102,4 @@ public class XNumberEditor extends XWrapperedFieldEditor { return "number_field_16.png"; } - @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..4194e4be03 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,4 @@ public class XPassword extends XWrapperedFieldEditor { (CRPropertyDescriptor[]) ArrayUtils.addAll(sup, new CRPropertyDescriptor[]{regex, waterMark}); } - @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..845fe43d9e 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; @@ -27,9 +25,8 @@ import java.beans.IntrospectionException; /** * @author richer * @since 6.5.3 - * Created on 2016/3/29 */ -public class XTextArea extends XWrapperedFieldEditor { +public class XTextArea extends XFieldEditor { public XTextArea(TextArea widget, Dimension initSize) { super(widget, initSize); @@ -84,10 +81,4 @@ public class XTextArea extends XWrapperedFieldEditor { protected String getIconName() { return "text_area_16.png"; } - - @Override - public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { - return new WidgetPropertyUIProvider[]{new TextAreaMobilePropertyUI(this)}; - } - } diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java deleted file mode 100644 index 67a8569f72..0000000000 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fr.design.designer.properties.mobile; - -import com.fr.design.designer.creator.XCreator; -import com.fr.design.dialog.BasicPane; -import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; -import com.fr.design.gui.itable.AbstractPropertyTable; -import com.fr.design.widget.ui.designer.mobile.NumberEditorMobileDefinePane; - -/** - * 数字控件属性面板注册 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/30 - */ -public class NumberEditorMobilePropertyUI extends AbstractWidgetPropertyUIProvider { - private XCreator xCreator; - - public NumberEditorMobilePropertyUI(XCreator xCreator) { - this.xCreator = xCreator; - } - - @Override - public AbstractPropertyTable createWidgetAttrTable() { - return null; - } - - @Override - public BasicPane createWidgetAttrPane() { - return new NumberEditorMobileDefinePane(xCreator); - } - - @Override - public String tableTitle() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java deleted file mode 100644 index 2c3b3b2270..0000000000 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fr.design.designer.properties.mobile; - -import com.fr.design.designer.creator.XCreator; -import com.fr.design.dialog.BasicPane; -import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; -import com.fr.design.gui.itable.AbstractPropertyTable; -import com.fr.design.widget.ui.designer.mobile.PasswordMobileDefinePane; - -/** - * 密码控件移动端属性注册 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/30 - */ -public class PasswordMobilePropertyUI extends AbstractWidgetPropertyUIProvider { - private XCreator xCreator; - - public PasswordMobilePropertyUI(XCreator xCreator) { - this.xCreator = xCreator; - } - - @Override - public AbstractPropertyTable createWidgetAttrTable() { - return null; - } - - @Override - public BasicPane createWidgetAttrPane() { - return new PasswordMobileDefinePane(xCreator); - } - - @Override - public String tableTitle() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ScanCodeMobilePropertyUI.java similarity index 65% rename from designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java rename to designer-form/src/main/java/com/fr/design/designer/properties/mobile/ScanCodeMobilePropertyUI.java index 531e2c4fc8..85011ee2b9 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ScanCodeMobilePropertyUI.java @@ -5,20 +5,13 @@ import com.fr.design.designer.creator.XTextEditor; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; import com.fr.design.gui.itable.AbstractPropertyTable; -import com.fr.design.widget.ui.designer.mobile.TextEditorMobileDefinePane; +import com.fr.design.widget.ui.designer.mobile.ScanCodeMobileDefinePane; -/** - * 文本控件 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/30 - */ -public class TextEditorMobilePropertyUI extends AbstractWidgetPropertyUIProvider { +public class ScanCodeMobilePropertyUI extends AbstractWidgetPropertyUIProvider { private XCreator xCreator; - public TextEditorMobilePropertyUI(XTextEditor xTextEditor) { + public ScanCodeMobilePropertyUI(XTextEditor xTextEditor) { this.xCreator = xTextEditor; } @@ -29,7 +22,7 @@ public class TextEditorMobilePropertyUI extends AbstractWidgetPropertyUIProvider @Override public BasicPane createWidgetAttrPane() { - return new TextEditorMobileDefinePane(xCreator); + return new ScanCodeMobileDefinePane(xCreator); } @Override diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java deleted file mode 100644 index 1c24e06bce..0000000000 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fr.design.designer.properties.mobile; - -import com.fr.design.designer.creator.XCreator; -import com.fr.design.dialog.BasicPane; -import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; -import com.fr.design.gui.itable.AbstractPropertyTable; -import com.fr.design.widget.ui.designer.mobile.TextAreaAdvancedDefinePane; - -/** - * 文本域控件移动端属性 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/29 - */ -public class TextAreaMobilePropertyUI extends AbstractWidgetPropertyUIProvider { - private XCreator xCreator; - - public TextAreaMobilePropertyUI(XCreator xCreator) { - this.xCreator = xCreator; - } - - @Override - public AbstractPropertyTable createWidgetAttrTable() { - return null; - } - - @Override - public BasicPane createWidgetAttrPane() { - return new TextAreaAdvancedDefinePane(xCreator); - } - - @Override - public String tableTitle() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java deleted file mode 100644 index 57faab6a72..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.fr.design.widget.ui.designer.mobile; - -import com.fr.design.designer.creator.XCreator; -import com.fr.design.foldablepane.UIExpandablePane; -import com.fr.design.gui.frpane.AttributeChangeListener; -import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.FRGUIPaneFactory; -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.form.ui.TextEditor; - -import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.FlowLayout; - -/** - *

文本类组件移动端高级属性的定义面板,基础扩展可以直接继承此面板 - *

往内部添加其他配置 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/30 - */ -public class BaseTextEditorMobileDefinePane extends MobileWidgetDefinePane { - - private XCreator xCreator; - protected MobileTextEditSettingPane textSettingPane; - - public BaseTextEditorMobileDefinePane(XCreator xCreator) { - this.xCreator = xCreator; - } - - @Override - public void initPropertyGroups(Object source) { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5); - addPropertyPanesToContainer(container); - this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH); - this.repaint(); - } - - /** - * 添加其他属性面板 - * - * @param container 展开容器 - */ - protected void addPropertyPanesToContainer(JPanel container) { - initSettingPane(container); - } - - /** - * 初始化文本类基础面板 - * - * @param container - */ - protected void initSettingPane(JPanel container) { - textSettingPane = new MobileTextEditSettingPane(); - container.add(textSettingPane); - } - - @Override - public void populate(FormDesigner designer) { - TextEditor textEditor = (TextEditor) xCreator.toData(); - textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); - this.bindListeners2Widgets(); - } - - protected void bindListeners2Widgets() { - reInitAllListeners(); - AttributeChangeListener changeListener = new AttributeChangeListener() { - @Override - public void attributeChange() { - update(); - } - }; - this.addAttributeChangeListener(changeListener); - } - - private void reInitAllListeners() { - initListener(this); - } - - @Override - public void update() { - TextEditor textEditor = (TextEditor) xCreator.toData(); - textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); - DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); - } - - public XCreator getxCreator() { - return xCreator; - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java deleted file mode 100644 index 75c6dbefc0..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java +++ /dev/null @@ -1,33 +0,0 @@ -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.form.ui.NumberEditor; - -/** - * 数字控件 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/30 - */ -public class NumberEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { - public NumberEditorMobileDefinePane(XCreator xCreator) { - super(xCreator); - } - - @Override - public void populate(FormDesigner designer) { - NumberEditor numberEditor = (NumberEditor) getxCreator().toData(); - textSettingPane.populateBean(numberEditor.getMobileTextEditAttr()); - this.bindListeners2Widgets(); - } - - @Override - public void update() { - NumberEditor numberEditor = (NumberEditor) getxCreator().toData(); - textSettingPane.updateBean(numberEditor.getMobileTextEditAttr()); - DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java deleted file mode 100644 index 68c878b459..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fr.design.widget.ui.designer.mobile; - -import com.fr.design.designer.creator.XCreator; -import com.fr.design.widget.ui.designer.mobile.component.MobilePasswordEditSettingPane; - -import javax.swing.JPanel; - -/** - * 密码控件移动端高级属性 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/30 - */ -public class PasswordMobileDefinePane extends BaseTextEditorMobileDefinePane { - public PasswordMobileDefinePane(XCreator xCreator) { - super(xCreator); - } - - @Override - protected void initSettingPane(JPanel container) { - textSettingPane = new MobilePasswordEditSettingPane(); - container.add(textSettingPane); - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java new file mode 100644 index 0000000000..71c35574a3 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java @@ -0,0 +1,63 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.base.mobile.MobileScanCodeAttr; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.widget.ui.designer.mobile.component.MobileTextFieldInputSettingPane; +import com.fr.form.ui.TextEditor; + +import java.awt.BorderLayout; + + +public class ScanCodeMobileDefinePane extends MobileWidgetDefinePane { + + private XCreator xCreator; + private MobileTextFieldInputSettingPane settingPane; + + public ScanCodeMobileDefinePane(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + settingPane = new MobileTextFieldInputSettingPane(); + this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, settingPane), BorderLayout.NORTH); + this.repaint(); + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + AttributeChangeListener changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + this.addAttributeChangeListener(changeListener); + } + + private void reInitAllListeners() { + initListener(this); + } + + @Override + public void populate(FormDesigner designer) { + MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) xCreator.toData()).getMobileScanCodeAttr(); + settingPane.populateBean(mobileScanCodeAttr); + this.bindListeners2Widgets(); + } + + @Override + public void update() { + MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) xCreator.toData()).getMobileScanCodeAttr(); + settingPane.updateBean(mobileScanCodeAttr); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); + } + +} diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java deleted file mode 100644 index ccc3194f9f..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fr.design.widget.ui.designer.mobile; - -import com.fr.design.designer.creator.XCreator; -import com.fr.design.widget.ui.designer.mobile.component.MobileTextAreaSettingPane; - -import javax.swing.JPanel; - -/** - * 文本域控件 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/29 - */ -public class TextAreaAdvancedDefinePane extends BaseTextEditorMobileDefinePane { - public TextAreaAdvancedDefinePane(XCreator xCreator) { - super(xCreator); - } - - @Override - protected void initSettingPane(JPanel container) { - textSettingPane = new MobileTextAreaSettingPane(); - container.add(textSettingPane); - } -} \ No newline at end of file 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 deleted file mode 100644 index 17342a372c..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java +++ /dev/null @@ -1,55 +0,0 @@ -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; - -import javax.swing.JPanel; - -/** - * 文本控件移动端属性 - * 输入方式: - * 输入框属性: - * - * @author hades - * @since 11.0 - * Created on 2018/11/27 - */ -public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { - /** - * 输入方式 - */ - private MobileTextFieldInputSettingPane inputSettingPane; - - public TextEditorMobileDefinePane(XCreator xCreator) { - super(xCreator); - } - - @Override - protected void initSettingPane(JPanel container) { - inputSettingPane = new MobileTextFieldInputSettingPane(); - textSettingPane = new MobileTextEditSettingPane(); - container.add(inputSettingPane); - container.add(textSettingPane); - } - - - @Override - public void populate(FormDesigner designer) { - super.populate(designer); - TextEditor textEditor = (TextEditor) getxCreator().toData(); - inputSettingPane.populateBean(textEditor.getMobileScanCodeAttr()); - this.bindListeners2Widgets(); - } - @Override - public void update() { - super.update(); - TextEditor textEditor = (TextEditor) getxCreator().toData(); - inputSettingPane.updateBean(textEditor.getMobileScanCodeAttr()); - DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); - } - -} 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 deleted file mode 100644 index db475dc569..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.fr.design.widget.ui.designer.mobile.component; - -import com.fr.base.mobile.MobileTextEditAttr; -import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.i18n.Toolkit; - -import java.awt.BorderLayout; - -/** - * 密码控件编辑属性设置面板 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/30 - */ -public class MobilePasswordEditSettingPane extends MobileTextEditSettingPane { - // 显示字数统计 - private UICheckBox showPassword; - - public MobilePasswordEditSettingPane() { - super(); - showPassword = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Show_Password"), false); - this.add(showPassword, BorderLayout.NORTH); - } - - @Override - protected boolean getClearDefaultState() { - return true; - } - - @Override - public void populateBean(MobileTextEditAttr ob) { - super.populateBean(ob); - // 要兼容处理一下,为null 的话赋默认值,默认开启 - this.showPassword.setSelected(ob.isShowPassword() == null || ob.isShowPassword()); - } - - @Override - public void updateBean(MobileTextEditAttr ob) { - super.updateBean(ob); - ob.setShowPassword(showPassword.isSelected()); - } -} \ No newline at end of file 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 deleted file mode 100644 index d660508e6e..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fr.design.widget.ui.designer.mobile.component; - -import com.fr.base.mobile.MobileTextEditAttr; -import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.i18n.Toolkit; - -import java.awt.BorderLayout; - -/** - * 文本域控件 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/29 - */ -public class MobileTextAreaSettingPane extends MobileTextEditSettingPane { - // 显示字数统计 - private UICheckBox showWordCount; - - public MobileTextAreaSettingPane() { - super(); - showWordCount = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Show_Word_Count"), false); - this.add(showWordCount, BorderLayout.NORTH); - } - - @Override - public void populateBean(MobileTextEditAttr ob) { - super.populateBean(ob); - // 要兼容处理一下,为null 的话赋默认值,默认不开启 - this.showWordCount.setSelected(ob.isShowWordCount() != null && ob.isShowWordCount()); - } - - @Override - public void updateBean(MobileTextEditAttr ob) { - super.updateBean(ob); - ob.setShowWordCount(showWordCount.isSelected()); - } -} \ No newline at end of file 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 deleted file mode 100644 index 56d340e4d0..0000000000 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.fr.design.widget.ui.designer.mobile.component; - -import com.fr.base.mobile.MobileTextEditAttr; -import com.fr.design.beans.BasicBeanPane; -import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.VerticalFlowLayout; - -import java.awt.BorderLayout; -import java.awt.FlowLayout; - -/** - * 文本类基础设置 - * - * @author Coral.Chen - * @since 11.0 - * Created on 2023/3/29 - */ -public class MobileTextEditSettingPane extends BasicBeanPane { - // 允许一键清空 - protected UICheckBox allowOneClickClear; - - public MobileTextEditSettingPane() { - initLayout(); - allowOneClickClear = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Allow_One_Click_Clear"), getClearDefaultState()); - this.add(allowOneClickClear, BorderLayout.NORTH); - } - - protected boolean getClearDefaultState() { - return false; - } - - protected void initLayout() { - VerticalFlowLayout verticalFlowLayout = new VerticalFlowLayout(FlowLayout.LEADING, 0, 5); - verticalFlowLayout.setAlignLeft(true); - this.setLayout(verticalFlowLayout); - } - - @Override - public void populateBean(MobileTextEditAttr ob) { - allowOneClickClear.setSelected(ob.isAllowOneClickClear() != null && ob.isAllowOneClickClear()); - } - - @Override - public MobileTextEditAttr updateBean() { - // do nothing - return null; - } - - @Override - public void updateBean(MobileTextEditAttr ob) { - ob.setAllowOneClickClear(allowOneClickClear.isSelected()); - } - - @Override - protected String title4PopupWindow() { - return null; - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java index b736230dd7..cdddc3e79f 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java @@ -2,20 +2,13 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.mobile.MobileScanCodeAttr; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.constants.LayoutConstants; -import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.layout.VerticalFlowLayout; -import javax.swing.ButtonGroup; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Component; +import java.awt.FlowLayout; /** * @author hades @@ -28,39 +21,15 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane { - UICheckBox source = (UICheckBox) e.getSource(); - // 更新面板是否可见 - updateNfcContentTypePane(source.isSelected(), nfcContentTypePane.getSelectedType()); - }); - initComponents(); - // 初始状态,内容类型面板不可见 - nfcContentTypePane.setVisible(false); - } - - private void initComponents() { - Component[][] components = new Component[][]{ - new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Mobile_Input_Way")), manualInputCheckBox}, - new Component[]{null, scanCodeCheckBox}, - new Component[]{null, nfcInputCheckBox}, - new Component[]{null, nfcContentTypePane}, - }; - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; - JPanel settingPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.HGAP_LARGE, LayoutConstants.VGAP_LARGE); + settingPane.add(manualInputCheckBox); + settingPane.add(scanCodeCheckBox); + settingPane.add(nfcInputCheckBox); this.add(settingPane, BorderLayout.NORTH); } @@ -69,7 +38,6 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane Date: Wed, 12 Apr 2023 16:17:31 +0800 Subject: [PATCH 084/625] =?UTF-8?q?REPORT-91074=20=E3=80=90=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E3=80=91=E8=B6=85=E9=93=BE=E6=8E=A5=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/community/BBSAction.java | 16 +++- .../design/actions/community/BugAction.java | 16 +++- .../actions/community/CenterAction.java | 15 ++- .../actions/community/CusDemandAction.java | 18 +++- .../actions/community/FacebookFansAction.java | 16 +++- .../design/actions/community/NeedAction.java | 16 +++- .../actions/community/QuestionAction.java | 16 +++- .../design/actions/community/SignAction.java | 17 +++- .../actions/community/StudyPlanAction.java | 15 ++- .../actions/community/TechSolutionAction.java | 15 ++- .../community/TemplateStoreAction.java | 19 ++-- .../fr/design/actions/community/UpAction.java | 14 ++- .../community/WorkOrderCenterAction.java | 15 ++- .../design/actions/help/TutorialAction.java | 14 ++- .../data/datapane/ESDStrategyConfigPane.java | 16 +++- .../preview/sql/PreviewPerformedSqlPane.java | 14 ++- .../callback/handle/PluginCallBackHelper.java | 15 ++- .../style/TranslucentBorderSpecialPane.java | 16 +++- .../com/fr/design/i18n/LocaleLinkFactory.java | 94 +++++++++++++++++++ .../JSContentWithDescriptionPane.java | 53 ++++++----- .../design/locale/impl/BbsRegisterMark.java | 32 +++---- .../fr/design/locale/impl/BbsResetMark.java | 34 +++---- .../fr/design/locale/impl/BbsSpaceMark.java | 34 +++---- .../fr/design/login/DesignerLoginBridge.java | 20 +++- .../mainframe/check/CheckFontInfoDialog.java | 16 +++- .../update/actions/NewFeatureAction.java | 20 ++-- .../com/fr/env/RemoteDesignLocaleMark.java | 28 +++--- .../com/fr/env/SyncFailedPluginsDialog.java | 31 ++++-- .../fr/env/detect/base/DetectorConstants.java | 26 ++++- .../share/ui/actions/Jump2DetailAction.java | 21 +++-- .../share/ui/online/OnlineWidgetRepoPane.java | 20 ++-- .../replace/ui/ITReplaceWestPanel.java | 14 ++- .../mainframe/socketio/DesignerSocketIO.java | 14 ++- .../fr/design/report/ExportUniversalPane.java | 14 ++- 34 files changed, 553 insertions(+), 201 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java diff --git a/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java b/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java index 1acbbe4170..d93e7ff244 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java @@ -1,14 +1,22 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; - -import javax.swing.*; +import javax.swing.KeyStroke; public class BBSAction extends AbstractDesignerSSO { + /** + * 云中心帆软社区页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Bbs"; + + /** + * 云中心帆软社区页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Bbs_Default"; public BBSAction() { this.setMenuKeySet(BBS); @@ -20,7 +28,7 @@ public class BBSAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs", "http://bbs.fanruan.com/"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet BBS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java b/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java index 5365e556b6..ac732b9481 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java @@ -1,13 +1,23 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; -import javax.swing.*; +import javax.swing.KeyStroke; public class BugAction extends AbstractDesignerSSO { + /** + * 云中心产品反馈页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Bugs"; + + /** + * 云中心产品反馈页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Bugs_Default"; + public BugAction() { this.setMenuKeySet(BUG); this.setName(getMenuKeySet().getMenuName()); @@ -17,7 +27,7 @@ public class BugAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.bugs", "https://service.fanruan.com/PF/FR/feedback?type=2"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet BUG = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java index 6ae03f1a8a..35affba875 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; import javax.swing.KeyStroke; @@ -9,6 +9,17 @@ import javax.swing.KeyStroke; * Created by XINZAI on 2018/8/23. */ public class CenterAction extends UpAction { + + /** + * 云中心活动中心页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Act_Center"; + + /** + * 云中心活动中心页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Act_Center_Default"; + public CenterAction() { this.setMenuKeySet(CENTER); this.setName(getMenuKeySet().getMenuName()); @@ -18,7 +29,7 @@ public class CenterAction extends UpAction { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.center", "http://bbs.fanruan.com/events/"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet CENTER = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java b/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java index 007eeb9abf..6cf96dbae9 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java @@ -1,18 +1,28 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; - +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.BrowseUtils; -import com.fr.general.CloudCenter; -import javax.swing.KeyStroke; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; /** * Created by XINZAI on 2018/8/23. */ public class CusDemandAction extends UpAction{ + + /** + * 云中心发布需求页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Demand"; + + /** + * 云中心发布需求页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Demand_Default"; + public CusDemandAction() { this.setMenuKeySet(DEMAND); @@ -25,7 +35,7 @@ public class CusDemandAction extends UpAction{ @Override public void actionPerformed(ActionEvent arg0) { - String url = CloudCenter.getInstance().acquireUrlByKind("bbs.demand", "https://market.fanruan.com/demand"); + String url = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); BrowseUtils.browser(url); } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java index e5ff4dd472..179330d299 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java @@ -1,14 +1,24 @@ package com.fr.design.actions.community; -import com.fr.base.svg.IconUtils; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.BrowseUtils; -import com.fr.general.CloudCenter; + import javax.swing.KeyStroke; import java.awt.event.ActionEvent; public class FacebookFansAction extends UpAction { + /** + * 云中心facebook页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_FaceBook"; + + /** + * 云中心facebook页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_FaceBook_Default"; + public FacebookFansAction() { this.setMenuKeySet(FACEBOOKFANS); this.setName(getMenuKeySet().getMenuName()); @@ -18,7 +28,7 @@ public class FacebookFansAction extends UpAction { @Override public void actionPerformed(ActionEvent arg0) { - BrowseUtils.browser(CloudCenter.getInstance().acquireUrlByKind("facebook.fans.tw", "https://www.facebook.com/twfinereport")); + BrowseUtils.browser(LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink()); } public static final MenuKeySet FACEBOOKFANS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java b/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java index 62d4b9c95f..0116db84bd 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java @@ -1,13 +1,23 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; -import javax.swing.*; +import javax.swing.KeyStroke; public class NeedAction extends AbstractDesignerSSO { + /** + * 云中心产品反馈页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Need"; + + /** + * 云中心产品反馈页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Need_Default"; + public NeedAction() { this.setMenuKeySet(NEED); this.setName(getMenuKeySet().getMenuName()); @@ -18,7 +28,7 @@ public class NeedAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.needs", "https://service.fanruan.com/PF/FR/feedback?type=1"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet NEED = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java index 5b44112254..fea2df3037 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java @@ -1,13 +1,23 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; -import javax.swing.*; +import javax.swing.KeyStroke; public class QuestionAction extends AbstractDesignerSSO { + /** + * 云中心问答页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Question"; + + /** + * 云中心问答页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Question_Default"; + public QuestionAction() { this.setMenuKeySet(QUESTIONS); this.setName(getMenuKeySet().getMenuName()); @@ -18,7 +28,7 @@ public class QuestionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.questions", "http://bbs.fanruan.com/wenda"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet QUESTIONS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java index 8c29ee5e66..3b785ff43b 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java @@ -1,14 +1,23 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; - -import javax.swing.*; +import javax.swing.KeyStroke; public class SignAction extends AbstractDesignerSSO { + /** + * 云中心认证落地页在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Aut"; + + /** + * 云中心认证落地页默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Aut_Default"; + public SignAction() { this.setMenuKeySet(SIGN); this.setName(getMenuKeySet().getMenuName()); @@ -18,7 +27,7 @@ public class SignAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.aut", "https://bbs.fanruan.com/certification/"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet SIGN = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java b/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java index d0dcc4195d..757abd8ea8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java @@ -1,10 +1,21 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.login.AbstractDesignerSSO; -import com.fr.general.CloudCenter; public class StudyPlanAction extends AbstractDesignerSSO { + + /** + * 云中心帆软学院在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Study"; + + /** + * 云中心帆软学院默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Study_Default"; + public StudyPlanAction() { this.setName(Toolkit.i18nText("Fine-Design_Study_Plan")); this.setSmallIcon("/com/fr/design/images/bbs/studyPlan"); @@ -12,6 +23,6 @@ public class StudyPlanAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.studyPlan", "https://edu.fanruan.com/studypath/finereport"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java index 8975555780..7ab6ece6e2 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java @@ -1,8 +1,8 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; import javax.swing.KeyStroke; @@ -10,6 +10,17 @@ import javax.swing.KeyStroke; * Created by XINZAI on 2018/8/23. */ public class TechSolutionAction extends AbstractDesignerSSO { + + /** + * 云中心社区在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Community"; + + /** + * 云中心社区默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Community_Default"; + public TechSolutionAction() { this.setMenuKeySet(TSO); this.setName(getMenuKeySet().getMenuName()); @@ -20,7 +31,7 @@ public class TechSolutionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.solution", "http://bbs.fanruan.com/forum-113-1.html"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet TSO = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java index eec904ebd6..b07c2fb3a7 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java @@ -1,21 +1,28 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; -import com.fr.design.actions.UpdateAction; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.mainframe.share.collect.ComponentCollector; import com.fr.design.menu.MenuKeySet; -import com.fr.design.utils.BrowseUtils; -import com.fr.general.CloudCenter; import javax.swing.KeyStroke; -import java.awt.event.ActionEvent; /** * created by Harrison on 2020/03/24 **/ public class TemplateStoreAction extends AbstractDesignerSSO { - + + /** + * 云中心组件商城模板在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Market_Template"; + + /** + * 云中心组件商城模板默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Template_Default"; + public TemplateStoreAction() { this.setMenuKeySet(TEMPLATE); @@ -47,6 +54,6 @@ public class TemplateStoreAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { ComponentCollector.getInstance().collectTepMenuEnterClick(); - return CloudCenter.getInstance().acquireUrlByKind("design.market.template", "https://market.fanruan.com/template"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java index 05022ecf8c..6881019b2d 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java @@ -1,14 +1,24 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; import javax.swing.KeyStroke; public class UpAction extends AbstractDesignerSSO { + /** + * 云中心工单中心在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Bbs_Update"; + + /** + * 云中心工单中心默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Bbs_Update_Default"; + public UpAction() { this.setMenuKeySet(UPDATE); this.setName(getMenuKeySet().getMenuName()); @@ -18,7 +28,7 @@ public class UpAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.update", "http://bbs.fanruan.com/forum.php?mod=collection&action=view&ctid=10"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); } public static final MenuKeySet UPDATE = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java index d1168eca70..4d6508cea9 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; -import com.fr.general.CloudCenter; /** * @Description 工单中心 @@ -9,6 +9,17 @@ import com.fr.general.CloudCenter; * @Date 2021/3/8 14:02 **/ public class WorkOrderCenterAction extends UpAction { + + /** + * 云中心工单中心在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Work_Order_Center"; + + /** + * 云中心工单中心默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Work_Order_Center_Default"; + public WorkOrderCenterAction() { this.setSmallIcon("/com/fr/design/images/bbs/workOrderCenter"); this.setName(Toolkit.i18nText("Fine-Design_Basic_Commuinity_Work_Order_Center")); @@ -16,6 +27,6 @@ public class WorkOrderCenterAction extends UpAction { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind("bbs.work.order.center", "https://service.fanruan.com/ticket"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java index 51a390c82d..4f215abc08 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java @@ -1,9 +1,9 @@ package com.fr.design.actions.help; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; -import com.fr.general.CloudCenter; import com.fr.general.GeneralContext; import com.fr.general.http.HttpToolbox; import com.fr.stable.CommonUtils; @@ -18,6 +18,16 @@ import java.awt.event.KeyEvent; public class TutorialAction extends AbstractDesignerSSO { + /** + * 云中心社区帮助文档在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Help"; + + /** + * 云中心社区帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Help_Default"; + public TutorialAction() { this.setMenuKeySet(HELP_TUTORIAL); this.setName(getMenuKeySet().getMenuName()); @@ -28,7 +38,7 @@ public class TutorialAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return CloudCenter.getInstance().acquireUrlByKind(createDocKey(), "http://help.finereport.com"); + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } // 生成帮助文档 sitecenter key, help.zh_CN.10 diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java index f3df21df9c..5643086ecc 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java @@ -6,6 +6,7 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.common.CacheConstants; @@ -29,8 +30,8 @@ import java.net.URI; import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; -import java.util.List; import java.util.Date; +import java.util.List; /** * @author rinoux @@ -38,7 +39,18 @@ import java.util.Date; * Created by rinoux on 2020/7/22 */ public class ESDStrategyConfigPane extends BasicBeanPane { - private static final String CRON_HELP_URL = "http://help.fanruan.com/finereport/doc-view-693.html"; + + /** + * 云中心定时调度执行频率表达式设定帮助文档链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Cron_Help"; + + /** + * 云中心定时调度执行频率表达式设定帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Cron_Help_Default"; + + private static final String CRON_HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); private UIRadioButton selectAutoUpdate; private UIRadioButton selectBySchema; private UICheckBox shouldEvolve; diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java index c0239c8fad..55bef18aad 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java @@ -11,12 +11,12 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.parameter.ParameterInputPane; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.general.CloudCenter; import com.fr.general.GeneralContext; import com.fr.log.FineLoggerFactory; import com.fr.plugin.injectable.PluginModule; @@ -63,6 +63,16 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener { private UILabel imageLabel; + /** + * 云中心防止sql注入帮助文档链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design_Basic_Sql_Injection_Prevention_Help"; + + /** + * 云中心防止sql注入帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design_Basic_Sql_Injection_Prevention_Help_Default"; + public PreviewPerformedSqlPane(Frame frame, String sql) { this(frame, sql, null, null, false); } @@ -84,7 +94,7 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener { JLabel label = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql_Message") + Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention") + Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); messagePanel.add(label); } else { - MessageWithLink message = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Front_Message"), Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention"), CloudCenter.getInstance().acquireConf(Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention_Help"), "https://help.fanruan.com/finereport/doc-view-2219.html"), Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); + MessageWithLink message = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Front_Message"), Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention"), LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(), Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); messagePanel.add(message); } // 提示图标 diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java index fc5f957f63..c2e6d1ab0c 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java @@ -2,6 +2,7 @@ package com.fr.design.extra.exe.callback.handle; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.link.MessageWithLink; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.control.PluginTaskResult; @@ -16,7 +17,19 @@ public class PluginCallBackHelper { private static final String REFERENCE = Toolkit.i18nText("Fine-Design_Basic_Plugin_File_Validate_Reference"); private static final String HELP_DOCUMENT_NAME = Toolkit.i18nText("Fine-Design_Basic_Plugin_File_Validate_HELP_DOCUMENT_NAME"); private static final String CONNECTOR = "-"; - private static final String HELP_DOCUMENT_LINK = Toolkit.i18nText("Fine-Design_Basic_Plugin_File_Validate_HELP_DOCUMENT_LINK"); + + /** + * 云中心第三方插件安装失败说明帮助文档在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design_Basic_Plugin_File_Validate_HELP_DOCUMENT_LINK"; + + /** + * 云中心第三方插件安装失败说明帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design_Basic_Plugin_File_Validate_HELP_DOCUMENT_LINK_Default"; + + + private static final String HELP_DOCUMENT_LINK = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); /** diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java index cc49820de5..540984595c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java @@ -16,6 +16,7 @@ import com.fr.design.gui.frpane.UIPercentDragPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -26,8 +27,8 @@ import com.fr.design.style.color.NewColorSelectBox; import com.fr.env.utils.DesignerInteractionHistory; import com.fr.general.Background; import com.fr.general.IOUtils; -import com.fr.i18n.UrlI18nManager; import com.fr.general.act.BorderPacker; +import com.fr.i18n.UrlI18nManager; import com.fr.stable.Constants; import com.fr.stable.GraphDrawHelper; import com.fr.stable.ProjectLibrary; @@ -78,7 +79,18 @@ import java.util.Arrays; public class TranslucentBorderSpecialPane extends AbstractBorderPackerPane implements UIObserver { private final int SETTING_LABEL_WIDTH = 60; private final Style DEFAULT_IMAGE_LAYOUT_STYLE = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_DEFAULT); - private final String TWEAK_NINE_POINT_HELP_URL = "https://help.fanruan.com/finereport/doc-view-4135.html"; + + /** + * 云中心点九图帮助文档在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Nine_Patch"; + + /** + * 云中心点九图帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Nine_Patch_Default"; + + private final String TWEAK_NINE_POINT_HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); private UIObserverListener uiObserverListener; diff --git a/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java b/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java new file mode 100644 index 0000000000..0b407c2cdc --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java @@ -0,0 +1,94 @@ +package com.fr.design.i18n; + +import com.fr.general.CloudCenter; +import com.fr.stable.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 生成根据配置项key获取云中心链接对应key的链接获取器的工厂类 + * 目前仅放在设计器模块下使用,拓展可以结合cbb中的内容自定义资源路径 + * + * @author obo + * @since 11.0 + * Created on 2023/4/7 + */ +public final class LocaleLinkFactory { + + private LocaleLinkFactory(){}; + + /** + * 单一实例 + */ + private static final LocaleLinkFactory INSTANCE = new LocaleLinkFactory(); + + /** + * 返回LocaleLinkFactory的单一实例 + * + * @return LocaleLinkFactory单一实例 + */ + public static LocaleLinkFactory getInstance(){ + return INSTANCE; + } + + /** + * 存放特定配置文件key及其对应的LinkProvider + */ + private static final Map MAP = new HashMap<>(); + + /** + * 根据配置文件项中的key初始化对应的生成器 + * + * @param propsKey 配置项key + * @param defaultKey 默认链接项key + * @return 对应的生成器 + */ + public LocaleLinkProvider getOrCreateProvider(String propsKey, String defaultKey) { + if(MAP.containsKey(propsKey)) { + return MAP.get(propsKey); + } else { + LocaleLinkProvider provider = new LocaleLinkProvider(propsKey, defaultKey); + MAP.put(propsKey, provider); + return provider; + } + } + + /** + * 对应配置项key的链接生成器 + * + * @author obo + * @since 11.0 + * Created on 2023/4/7 + */ + public static class LocaleLinkProvider { + + /** + * 配置文件项key + */ + private final String propsKey; + + /** + * 默认跳转链接配置项key + */ + private final String defaultKey; + private LocaleLinkProvider(String propsKey, String defaultKey) { + this.propsKey = propsKey; + this.defaultKey = defaultKey; + } + + /** + * 获取对应链接 + * + * @return 链接 + */ + public String getLink() { + String cloudKey = DesignI18nImpl.getInstance().i18nText(this.propsKey); + String url = CloudCenter.getInstance().acquireUrlByKind(cloudKey); + if(StringUtils.isEmpty(url)) { + return DesignI18nImpl.getInstance().i18nText(this.defaultKey); + } + return url; + } + } +} 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 8e8ef45b9f..7e7ac1ff72 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 @@ -14,11 +14,11 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itextfield.PlaceholderTextField; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.jsapi.JSAPITreeHelper; import com.fr.design.javascript.jsapi.JSAPIUserObject; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; @@ -26,6 +26,25 @@ import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; + +import javax.swing.BorderFactory; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; @@ -50,24 +69,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import javax.swing.BorderFactory; -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; public class JSContentWithDescriptionPane extends JSContentPane implements KeyListener { @@ -108,8 +109,6 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private static final String URL_FOR_TEST_NETWORK = "https://www.baidu.com"; - private static final String DOCUMENT_SEARCH_URL = "https://help.fanruan.com/finereport/api-helpdoc-title-"; - private String currentValue; private static CardLayout card; @@ -117,6 +116,16 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private static final String RELOAD_CARD = "reloadCard"; private static final String DOC_LIST_CARD = "docListCard"; + /** + * 云中心Js高级编辑器帮助链接前缀在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Js_Editor"; + + /** + * 云中心Js高级编辑器帮助链接前缀在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Js_Editor_Default"; + public JSContentWithDescriptionPane(String[] args) { this.setLayout(new BorderLayout()); //=============================== @@ -352,7 +361,7 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private void doHelpDocumentSearch() { Object value = interfaceNameList.getSelectedValue(); if (value != null) { - String url = CloudCenter.getInstance().acquireUrlByKind("af.doc_search", DOCUMENT_SEARCH_URL) + value.toString(); + String url = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); try { String result = HttpToolbox.get(url); JSONObject jsonObject = new JSONObject(result); diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java index afe1c8eef3..5e497fe896 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java @@ -1,13 +1,8 @@ package com.fr.design.locale.impl; -import com.fr.general.CloudCenter; -import com.fr.general.GeneralContext; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.general.locale.LocaleMark; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - /** * @author hades * @version 10.0 @@ -15,24 +10,19 @@ import java.util.Map; */ public class BbsRegisterMark implements LocaleMark { - private final Map map = new HashMap<>(); - private static final String BBS_REGISTER_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.register", "https://id.fanruan.com/register/register.php?clueSource=activityfr"); - private static final String BBS_REGISTER_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.register", "https://id.fanruan.com/register/register.php?clueSource=activityfr"); - private static final String BBS_REGISTER_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US", "https://id.fanruan.com/en/register/register.php"); - private static final String BBS_REGISTER_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US", "https://id.fanruan.com/en/register/register.php"); - private static final String BBS_REGISTER_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US", "https://id.fanruan.com/en/register/register.php"); + /** + * 云中心新账户中心链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_New_Account_Center"; - public BbsRegisterMark() { - map.put(Locale.CHINA, BBS_REGISTER_CN); - map.put(Locale.KOREA, BBS_REGISTER_KR); - map.put(Locale.JAPAN, BBS_REGISTER_JP); - map.put(Locale.US, BBS_REGISTER_EN); - map.put(Locale.TAIWAN, BBS_REGISTER_TW); - } + /** + * 云中心新账户中心链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_New_Account_Center_Default"; + public BbsRegisterMark() {} @Override public String getValue() { - String result = map.get(GeneralContext.getLocale()); - return result == null ? BBS_REGISTER_EN : result; + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } } diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java index 27db28e416..4a97f68304 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java @@ -1,13 +1,8 @@ package com.fr.design.locale.impl; -import com.fr.general.CloudCenter; -import com.fr.general.GeneralContext; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.general.locale.LocaleMark; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - /** * @author hades * @version 10.0 @@ -15,24 +10,21 @@ import java.util.Map; */ public class BbsResetMark implements LocaleMark { - private final Map map = new HashMap<>(); - private static final String BBS_RESET_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.reset", "https://id.fanruan.com/forget/forget.php?clue=activityfr"); - private static final String BBS_RESET_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.reset", "https://id.fanruan.com/forget/forget.php?clue=activityfr"); - private static final String BBS_RESET_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US", "https://id.fanruan.com/en/forget/forget.php"); - private static final String BBS_RESET_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US", "https://id.fanruan.com/en/forget/forget.php"); - private static final String BBS_RESET_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US", "https://id.fanruan.com/en/forget/forget.php"); - public BbsResetMark() { - map.put(Locale.CHINA, BBS_RESET_CN); - map.put(Locale.KOREA, BBS_RESET_KR); - map.put(Locale.JAPAN, BBS_RESET_JP); - map.put(Locale.US, BBS_RESET_EN); - map.put(Locale.TAIWAN, BBS_RESET_TW); - } + /** + * 云中心老账户中心链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Account_Center"; + + /** + * 云中心老账户中心链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Account_Center_Default"; + + public BbsResetMark() {} @Override public String getValue() { - String result = map.get(GeneralContext.getLocale()); - return result == null ? BBS_RESET_EN : result; + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } } diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java index 999c732845..1574b4e6b5 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java @@ -1,13 +1,8 @@ package com.fr.design.locale.impl; -import com.fr.general.CloudCenter; -import com.fr.general.GeneralContext; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.general.locale.LocaleMark; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - /** * @author hades * @version 10.0 @@ -15,25 +10,20 @@ import java.util.Map; */ public class BbsSpaceMark implements LocaleMark { - private final Map map = new HashMap<>(); - private static final String BBS_SPACE_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.default", "http://bbs.fanruan.com/home.php?mod=space&do=pm"); - private static final String BBS_SPACE_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.default", "http://bbs.fanruan.com/home.php?mod=space&do=pm"); - private static final String BBS_SPACE_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US", "https://community.finereport.com/home.php?mod=space&do=pm"); - private static final String BBS_SPACE_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US", "https://community.finereport.com/home.php?mod=space&do=pm"); - private static final String BBS_SPACE_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US", "https://community.finereport.com/home.php?mod=space&do=pm"); + /** + * 云中心帆软社区消息中心链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Message_Center"; - public BbsSpaceMark() { - map.put(Locale.CHINA, BBS_SPACE_CN); - map.put(Locale.KOREA, BBS_SPACE_KR); - map.put(Locale.JAPAN, BBS_SPACE_JP); - map.put(Locale.US, BBS_SPACE_EN); - map.put(Locale.TAIWAN, BBS_SPACE_TW); - } + /** + * 云中心帆软社区消息中心链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Message_Center_Default"; + + public BbsSpaceMark() {} @Override public String getValue() { - String result = map.get(GeneralContext.getLocale()); - return result == null ? BBS_SPACE_EN : result; + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } - } diff --git a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java index 4d0ba8a41c..113ee8e6e8 100644 --- a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java +++ b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java @@ -5,6 +5,7 @@ import com.fr.design.bridge.exec.JSCallback; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.locale.impl.BbsResetMark; @@ -23,15 +24,16 @@ import com.fr.log.FineLoggerFactory; import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.JSFunction; import com.teamdev.jxbrowser.chromium.JSObject; + +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URI; import java.util.Map; import java.util.Set; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; /** * @author Lanlan @@ -40,6 +42,16 @@ import javax.swing.SwingUtilities; */ public class DesignerLoginBridge { + /** + * 云中心组件商城模板在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Market_Template"; + + /** + * 云中心组件商城模板默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Template_Default"; + private Map params; public static DesignerLoginBridge getBridge(Browser browser, Map params) { @@ -71,7 +83,7 @@ public class DesignerLoginBridge { getHyperlinkPane( com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Title"), com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Hyperlink_Text"), - CloudCenter.getInstance().acquireUrlByKind("designer.premium.template", "https://market.fanruan.com/template") + LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink() ) ); } else if (source == DesignerLoginSource.BBS_JUMP) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java index 0671ed1b63..6355b034f6 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java @@ -4,10 +4,10 @@ import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.DesignSizeI18nManager; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.general.CloudCenter; import com.fr.general.IOUtils; import javax.swing.BorderFactory; @@ -39,17 +39,27 @@ public class CheckFontInfoDialog extends JDialog implements ActionListener { private UILabel directUiLabel; private UILabel detailLabel; + /** + * 云中心插件管理帮助文档在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Server_Install_Font"; + + /** + * 云中心插件管理默认帮助文档在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Server_Install_Font_Default"; + public CheckFontInfoDialog(Frame parent, String areaText) { super(parent,true); //提示信息 JPanel imagePanel = new JPanel(); imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/warnings/warning32.png")); imagePanel.add(imageLabel); - + String link = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); MessageWithLink linkMessage = new MessageWithLink(Toolkit.i18nText("Fine_Designer_Check_Font_Message"), Toolkit.i18nText("Fine_Designer_Check_Font_Install_Font"), - CloudCenter.getInstance().acquireUrlByKind("help.install.font", "https://help.fanruan.com/finereport/doc-view-3999.html")); + link); linkMessage.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink")); messagePanel.add(linkMessage); diff --git a/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java b/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java index 56db4cee9e..785d47c1be 100644 --- a/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java +++ b/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java @@ -1,9 +1,8 @@ package com.fr.design.update.actions; -import com.fr.common.util.Strings; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.utils.BrowseUtils; -import com.fr.general.CloudCenter; import com.fr.log.FineLoggerFactory; import java.awt.event.ActionEvent; @@ -16,17 +15,22 @@ import java.awt.event.ActionListener; * */ public class NewFeatureAction implements ActionListener { + /** + * 云中心更新日志索引在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Latest_Update_Detail"; - public static String DEFAULT_UPDATE_DETAIL_URL = "https://help.fanruan.com/finereport/doc-view-4699.html"; + /** + * 云中心更新日志索引默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Latest_Update_Detail_Default"; + + public static String DEFAULT_UPDATE_DETAIL_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); @Override public void actionPerformed(ActionEvent e) { try { - String url = CloudCenter.getInstance().acquireConf("fr.latest.update.detil"); - if (Strings.isEmpty(url)) { - url = DEFAULT_UPDATE_DETAIL_URL; - } - BrowseUtils.browser(url); + BrowseUtils.browser(DEFAULT_UPDATE_DETAIL_URL); } catch (Exception ex) { FineLoggerFactory.getLogger().error(ex.getMessage()); } diff --git a/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java b/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java index 877a9224b2..4a06fc2a21 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java +++ b/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java @@ -1,11 +1,7 @@ package com.fr.env; -import com.fr.general.CloudCenter; -import com.fr.general.GeneralContext; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.general.locale.LocaleMark; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; /** * @author hades @@ -14,23 +10,21 @@ import java.util.Map; */ public class RemoteDesignLocaleMark implements LocaleMark { - private Map map = new HashMap<>(); - private static final String REMOTE_DESIGN_CN = CloudCenter.getInstance().acquireUrlByKind("help.remote.design.zh_CN", "https://help.fanruan.com/finereport/doc-view-3925.html"); - private static final String REMOTE_DESIGN_EN = CloudCenter.getInstance().acquireUrlByKind("help.remote.design.en_US", "https://help.fanruan.com/finereport-en/doc-view-3862.html"); + /** + * 云中心远程设计常见问题链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Remote_Design_Question"; + /** + * 云中心远程设计常见问题链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Remote_Design_Question_Default"; - public RemoteDesignLocaleMark() { - map.put(Locale.CHINA, REMOTE_DESIGN_CN); - map.put(Locale.KOREA, REMOTE_DESIGN_EN); - map.put(Locale.JAPAN, REMOTE_DESIGN_EN); - map.put(Locale.US, REMOTE_DESIGN_EN); - map.put(Locale.TAIWAN, REMOTE_DESIGN_CN); - } + public RemoteDesignLocaleMark() {} @Override public String getValue() { - String result = map.get(GeneralContext.getLocale()); - return result == null ? REMOTE_DESIGN_CN : result; + return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); } } diff --git a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java index fd4b98e33e..7eb6327331 100644 --- a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java +++ b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java @@ -6,25 +6,18 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.i18n.DesignSizeI18nManager; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; import com.fr.general.IOUtils; import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.stable.StringUtils; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.Locale; + import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JDialog; @@ -33,6 +26,14 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.Locale; /** * @author pengda @@ -47,6 +48,16 @@ public class SyncFailedPluginsDialog extends JDialog { private RestartHelper restartHelper = new RestartHelper(); private UIButton restartButton; private boolean show = false; + + /** + * 云中心插件管理帮助文档在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Plugin_Management"; + + /** + * 云中心插件管理默认帮助文档在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Plugin_Management_Default"; public SyncFailedPluginsDialog(JFrame parent, JSONArray syncFailedPlugins) { super(parent, true); JPanel body = FRGUIPaneFactory.createBorderLayout_L_Pane(); @@ -62,7 +73,7 @@ public class SyncFailedPluginsDialog extends JDialog { JPanel messagePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); MessageWithLink messageWithLink = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugin_Fail_Suggestion"),Toolkit.i18nText("Fine-Design_Basic_Sync_Deal_Immediately"), - CloudCenter.getInstance().acquireUrlByKind("help.installplugins", "https://help.fanruan.com/finereport/doc-view-2198.html")); + LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink()); messageWithLink.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.env.SyncFailedPluginsDialog.messageWithLink")); messagePane.add(messageWithLink); diff --git a/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java b/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java index 4e4592dcde..bb157a0811 100644 --- a/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java +++ b/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java @@ -1,13 +1,33 @@ package com.fr.env.detect.base; +import com.fr.design.i18n.LocaleLinkFactory; + /** * created by Harrison on 2022/05/25 **/ public class DetectorConstants { + /** + * 云中心FineDB异常检测帮助文档在配置文件中对应的配置文件key + */ + private static final String FINE_DB_HELP_PROPS_LINK_KEY = "Fine-Design-CloudCenter_FineDB_Exception_Check"; + + /** + * 云中心FineDB异常检测帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String FINE_DB_HELP_PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_FineDB_Exception_Check_Default"; + + /** + * 云中心FineDB异常检测帮助文档在配置文件中对应的配置文件key + */ + private static final String JAR_HELP_PROPS_LINK_KEY = "Fine-Design-CloudCenter_Jar_Exception_Check"; + + /** + * 云中心FineDB异常检测帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String JAR_HELP_PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Jar_Exception_Check_Default"; + public static final String JAR_HELP_LINK = LocaleLinkFactory.getInstance().getOrCreateProvider(JAR_HELP_PROPS_LINK_KEY, JAR_HELP_PROPS_LINK_KEY_DEFAULT).getLink();; - public static final String JAR_HELP_LINK = "https://help.fanruan.com/finereport/doc-view-4700.html?source=3"; - - public static final String FINE_DB_HELP_LINK = "https://help.fanruan.com/finereport/doc-view-4701.html?source=3"; + public static final String FINE_DB_HELP_LINK = LocaleLinkFactory.getInstance().getOrCreateProvider(FINE_DB_HELP_PROPS_LINK_KEY, FINE_DB_HELP_PROPS_LINK_KEY_DEFAULT).getLink(); public static final String SEPARATOR = "、"; public static final String BR_TAG = "
"; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java index 9df0313820..6bac549969 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java @@ -1,17 +1,11 @@ package com.fr.design.mainframe.share.ui.actions; -import com.fr.design.actions.UpdateAction; -import com.fr.design.gui.imenu.UIMenuItem; -import com.fr.design.gui.imenu.UIMenuItemUI; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; -import com.fr.design.mainframe.share.ui.constants.ColorConstants; import com.fr.design.mainframe.share.ui.online.CarouselStateManger; import com.fr.stable.StringUtils; import javax.swing.Action; -import javax.swing.BorderFactory; -import javax.swing.SwingConstants; -import java.awt.Color; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.io.IOException; @@ -24,7 +18,18 @@ import java.net.URISyntaxException; * Created by Starryi on 2021/9/28 */ public class Jump2DetailAction extends SharedComponentPopupAction { - private static final String ONLINE_WIDGET_DETAIL_FORMATTED_URL = "https://market.fanruan.com/reuse/%s"; + + /** + * 云中心组件市场组件详情在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Market_Detail"; + + /** + * 云中心组件市场组件详情默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Detail_Default"; + + private static final String ONLINE_WIDGET_DETAIL_FORMATTED_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); private final String id; public Jump2DetailAction(String id) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java index b4d3bcc68d..6f3a33b0d3 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java @@ -2,35 +2,30 @@ package com.fr.design.mainframe.share.ui.online; import com.fr.base.BaseUtils; import com.fr.base.Style; -import com.fr.config.constant.Constant; import com.fr.design.dialog.BasicPane; import com.fr.design.form.util.FontTransformUtil; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.share.ui.base.LoadingPane; import com.fr.design.mainframe.share.ui.base.MouseClickListener; import com.fr.design.mainframe.share.ui.online.mini.MiniComponentShopDialog; import com.fr.design.mainframe.share.util.OnlineShopUtils; -import com.fr.design.mainframe.theme.edit.ui.LabelUtils; import com.fr.form.share.bean.OnlineShareWidget; import com.fr.general.FRFont; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; -import com.fr.stable.Constants; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; -import javax.swing.BoxLayout; import javax.swing.JPanel; -import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.SwingWorker; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; -import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; @@ -47,7 +42,18 @@ import java.util.concurrent.ExecutionException; * Created by kerry on 2020-10-16 */ public class OnlineWidgetRepoPane extends BasicPane { - private static final String MARKET_URL = "https://market.fanruan.com/reuse"; + + /** + * 云中心组件市场在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Market"; + + /** + * 云中心组件市场默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Default"; + + private static final String MARKET_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); private static List[] sharableWidgets; private OnlineWidgetTabPane componentTabPane; private boolean isShowPackagePanel = false; diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java index a01fa3909e..9fbd95ae7b 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java @@ -4,10 +4,10 @@ import com.fr.base.svg.IconUtils; import com.fr.design.actions.replace.info.Info; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ui.base.MouseClickListener; import com.fr.design.utils.BrowseUtils; -import com.fr.general.CloudCenter; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -35,7 +35,17 @@ public class ITReplaceWestPanel { private UIToggleButton contentButton; private UIToggleButton settingButton; private static final Icon HELP_ICON = IconUtils.readIcon("com/fr/design/images/buttonicon/replace_help.svg"); - private static final String HELP_URL = CloudCenter.getInstance().acquireUrlByKind("design.replace.help", "https://help.fanruan.com/finereport/doc-view-4954.html?source=3"); + + /** + * 云中心定时调度执行频率表达式设定帮助文档链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Template_Level_Search_Replace"; + + /** + * 云中心定时调度执行频率表达式设定帮助文档默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Template_Level_Search_Replace_Default"; + private static final String HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); private static final int FILL_COUNT = 11; public static final int LEFT_WIDTH = 100; public static final String CONTENT_TEXT = "" + Toolkit.i18nText("Fine-Design_Basic_Templates_Content") + ""; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index d8f7265f7d..14bb550226 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -7,6 +7,7 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceInfoContext; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -17,7 +18,6 @@ import com.fr.design.mainframe.toast.ToastMsgDialog; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.BrowseUtils; import com.fr.event.EventDispatcher; -import com.fr.general.CloudCenter; import com.fr.log.FineLoggerFactory; import com.fr.serialization.SerializerHelper; import com.fr.stable.ArrayUtils; @@ -58,7 +58,17 @@ public class DesignerSocketIO { Disconnecting } - private static final String WEBSOCKET_HELP_DOC = CloudCenter.getInstance().acquireUrlByKind("websocketConnect", "https://help.fanruan.com/finereport/doc-view-2512.html"); + /** + * 云中心特殊字符导出在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_WebSocket"; + + /** + * 云中心特殊字符导出默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_WebSocket_Default"; + + private static final String WEBSOCKET_HELP_DOC = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); private static final String HTTPS = "https"; private static final String HTTP = "http"; private static Socket socket = null; diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java index 5fe52560dc..fe6fbc609e 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java @@ -6,10 +6,10 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.LocaleLinkFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.BrowseUtils; -import com.fr.general.CloudCenter; import com.fr.io.attr.ReportExportAttr; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; @@ -30,7 +30,17 @@ import java.awt.event.ActionListener; */ public class ExportUniversalPane extends BasicPane { - private static final String HELP_URL = CloudCenter.getInstance().acquireUrlByKind("help.alt_font.zh_CN", "https://help.fanruan.com/finereport/doc-view-4707.html"); + /** + * 云中心特殊字符导出在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Alt_Font_Export"; + + /** + * 云中心特殊字符导出默认链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Alt_Font_Export_Default"; + + private static final String HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); private UICheckBox specialCharacterExport; // 密码支持公式 From 66ea9bec5a9071baaca33c0d9eeedd4cdfc4c23c Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 12 Apr 2023 18:07:57 +0800 Subject: [PATCH 085/625] =?UTF-8?q?REPORT-91074=20=E3=80=90=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E3=80=91=E8=B6=85=E9=93=BE=E6=8E=A5=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/community/BBSAction.java | 4 +- .../design/actions/community/BugAction.java | 4 +- .../actions/community/CenterAction.java | 4 +- .../actions/community/CusDemandAction.java | 4 +- .../actions/community/FacebookFansAction.java | 4 +- .../design/actions/community/NeedAction.java | 4 +- .../actions/community/QuestionAction.java | 4 +- .../design/actions/community/SignAction.java | 4 +- .../actions/community/StudyPlanAction.java | 4 +- .../actions/community/TechSolutionAction.java | 4 +- .../community/TemplateStoreAction.java | 4 +- .../fr/design/actions/community/UpAction.java | 4 +- .../community/WorkOrderCenterAction.java | 4 +- .../design/actions/help/TutorialAction.java | 4 +- .../data/datapane/ESDStrategyConfigPane.java | 4 +- .../preview/sql/PreviewPerformedSqlPane.java | 4 +- .../callback/handle/PluginCallBackHelper.java | 4 +- .../style/TranslucentBorderSpecialPane.java | 4 +- .../com/fr/design/i18n/LocaleLinkFactory.java | 94 ------------------- .../com/fr/design/i18n/LocaleLinkProvide.java | 47 ++++++++++ .../JSContentWithDescriptionPane.java | 4 +- .../design/locale/impl/BbsRegisterMark.java | 4 +- .../fr/design/locale/impl/BbsResetMark.java | 4 +- .../fr/design/locale/impl/BbsSpaceMark.java | 4 +- .../fr/design/login/DesignerLoginBridge.java | 4 +- .../mainframe/check/CheckFontInfoDialog.java | 4 +- .../update/actions/NewFeatureAction.java | 4 +- .../com/fr/env/RemoteDesignLocaleMark.java | 4 +- .../com/fr/env/SyncFailedPluginsDialog.java | 4 +- .../fr/env/detect/base/DetectorConstants.java | 6 +- .../share/ui/actions/Jump2DetailAction.java | 4 +- .../share/ui/online/OnlineWidgetRepoPane.java | 4 +- .../replace/ui/ITReplaceWestPanel.java | 4 +- .../mainframe/socketio/DesignerSocketIO.java | 4 +- .../fr/design/report/ExportUniversalPane.java | 4 +- 35 files changed, 114 insertions(+), 161 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java create mode 100644 designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvide.java diff --git a/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java b/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java index d93e7ff244..999d7d59ed 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class BBSAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet BBS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java b/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java index ac732b9481..7e90a3b684 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -27,7 +27,7 @@ public class BugAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet BUG = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java index 35affba875..e634e58fc7 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.menu.MenuKeySet; import javax.swing.KeyStroke; @@ -29,7 +29,7 @@ public class CenterAction extends UpAction { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet CENTER = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java b/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java index 6cf96dbae9..5afa19cea1 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.BrowseUtils; @@ -35,7 +35,7 @@ public class CusDemandAction extends UpAction{ @Override public void actionPerformed(ActionEvent arg0) { - String url = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + String url = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); BrowseUtils.browser(url); } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java index 179330d299..79b8f57760 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.BrowseUtils; @@ -28,7 +28,7 @@ public class FacebookFansAction extends UpAction { @Override public void actionPerformed(ActionEvent arg0) { - BrowseUtils.browser(LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink()); + BrowseUtils.browser(LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT)); } public static final MenuKeySet FACEBOOKFANS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java b/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java index 0116db84bd..cf7bf7c1e0 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class NeedAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet NEED = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java index fea2df3037..fb3bf4ec34 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class QuestionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet QUESTIONS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java index 3b785ff43b..7a0b26eb20 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -27,7 +27,7 @@ public class SignAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet SIGN = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java b/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java index 757abd8ea8..402b62eb3f 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.login.AbstractDesignerSSO; @@ -23,6 +23,6 @@ public class StudyPlanAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java index 7ab6ece6e2..46fdefff45 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -31,7 +31,7 @@ public class TechSolutionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet TSO = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java index b07c2fb3a7..ebc8bfbb54 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.mainframe.share.collect.ComponentCollector; import com.fr.design.menu.MenuKeySet; @@ -54,6 +54,6 @@ public class TemplateStoreAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { ComponentCollector.getInstance().collectTepMenuEnterClick(); - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java index 6881019b2d..4385f1d466 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class UpAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet UPDATE = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java index 4d6508cea9..e34443e720 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; /** @@ -27,6 +27,6 @@ public class WorkOrderCenterAction extends UpAction { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java index 4f215abc08..1712272685 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.help; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -38,7 +38,7 @@ public class TutorialAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } // 生成帮助文档 sitecenter key, help.zh_CN.10 diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java index 5643086ecc..ce3464bc9e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java @@ -6,7 +6,7 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.common.CacheConstants; @@ -50,7 +50,7 @@ public class ESDStrategyConfigPane extends BasicBeanPane { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Cron_Help_Default"; - private static final String CRON_HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private static final String CRON_HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private UIRadioButton selectAutoUpdate; private UIRadioButton selectBySchema; private UICheckBox shouldEvolve; diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java index 55bef18aad..c32fa2dcf4 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java @@ -11,7 +11,7 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -94,7 +94,7 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener { JLabel label = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql_Message") + Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention") + Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); messagePanel.add(label); } else { - MessageWithLink message = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Front_Message"), Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention"), LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(), Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); + MessageWithLink message = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Front_Message"), Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention"), LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT), Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); messagePanel.add(message); } // 提示图标 diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java index c2e6d1ab0c..f672eb15bd 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java @@ -2,7 +2,7 @@ package com.fr.design.extra.exe.callback.handle; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.link.MessageWithLink; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.control.PluginTaskResult; @@ -29,7 +29,7 @@ public class PluginCallBackHelper { private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design_Basic_Plugin_File_Validate_HELP_DOCUMENT_LINK_Default"; - private static final String HELP_DOCUMENT_LINK = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private static final String HELP_DOCUMENT_LINK = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); /** diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java index 540984595c..d126716474 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java @@ -16,7 +16,7 @@ import com.fr.design.gui.frpane.UIPercentDragPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -90,7 +90,7 @@ public class TranslucentBorderSpecialPane extends AbstractBorderPackerPane imple */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Nine_Patch_Default"; - private final String TWEAK_NINE_POINT_HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private final String TWEAK_NINE_POINT_HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private UIObserverListener uiObserverListener; diff --git a/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java b/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java deleted file mode 100644 index 0b407c2cdc..0000000000 --- a/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkFactory.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.fr.design.i18n; - -import com.fr.general.CloudCenter; -import com.fr.stable.StringUtils; - -import java.util.HashMap; -import java.util.Map; - -/** - * 生成根据配置项key获取云中心链接对应key的链接获取器的工厂类 - * 目前仅放在设计器模块下使用,拓展可以结合cbb中的内容自定义资源路径 - * - * @author obo - * @since 11.0 - * Created on 2023/4/7 - */ -public final class LocaleLinkFactory { - - private LocaleLinkFactory(){}; - - /** - * 单一实例 - */ - private static final LocaleLinkFactory INSTANCE = new LocaleLinkFactory(); - - /** - * 返回LocaleLinkFactory的单一实例 - * - * @return LocaleLinkFactory单一实例 - */ - public static LocaleLinkFactory getInstance(){ - return INSTANCE; - } - - /** - * 存放特定配置文件key及其对应的LinkProvider - */ - private static final Map MAP = new HashMap<>(); - - /** - * 根据配置文件项中的key初始化对应的生成器 - * - * @param propsKey 配置项key - * @param defaultKey 默认链接项key - * @return 对应的生成器 - */ - public LocaleLinkProvider getOrCreateProvider(String propsKey, String defaultKey) { - if(MAP.containsKey(propsKey)) { - return MAP.get(propsKey); - } else { - LocaleLinkProvider provider = new LocaleLinkProvider(propsKey, defaultKey); - MAP.put(propsKey, provider); - return provider; - } - } - - /** - * 对应配置项key的链接生成器 - * - * @author obo - * @since 11.0 - * Created on 2023/4/7 - */ - public static class LocaleLinkProvider { - - /** - * 配置文件项key - */ - private final String propsKey; - - /** - * 默认跳转链接配置项key - */ - private final String defaultKey; - private LocaleLinkProvider(String propsKey, String defaultKey) { - this.propsKey = propsKey; - this.defaultKey = defaultKey; - } - - /** - * 获取对应链接 - * - * @return 链接 - */ - public String getLink() { - String cloudKey = DesignI18nImpl.getInstance().i18nText(this.propsKey); - String url = CloudCenter.getInstance().acquireUrlByKind(cloudKey); - if(StringUtils.isEmpty(url)) { - return DesignI18nImpl.getInstance().i18nText(this.defaultKey); - } - return url; - } - } -} diff --git a/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvide.java b/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvide.java new file mode 100644 index 0000000000..e7379137ff --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvide.java @@ -0,0 +1,47 @@ +package com.fr.design.i18n; + +import com.fr.general.CloudCenter; +import com.fr.stable.StringUtils; + +/** + * 国际化链接获取工具 + * 根据配置文件key获取云中心key对应的链接或者默认链接 + * + * @author obo + * @since 11.0 + * Created on 2023/4/7 + */ +public final class LocaleLinkProvide { + + private LocaleLinkProvide(){}; + + /** + * 单一实例 + */ + private static final LocaleLinkProvide INSTANCE = new LocaleLinkProvide(); + + /** + * 返回LocaleLinkProvide的单一实例 + * + * @return LocaleLinkProvide单一实例 + */ + public static LocaleLinkProvide getInstance(){ + return INSTANCE; + } + + /** + * 根据配置文件项中的key获取链接 + * + * @param propsKey 配置项key + * @param defaultKey 默认链接项key + * @return 对应的生成器 + */ + public String getLink(String propsKey, String defaultKey) { + String cloudKey = DesignI18nImpl.getInstance().i18nText(propsKey); + String url = CloudCenter.getInstance().acquireUrlByKind(cloudKey); + if(StringUtils.isEmpty(url)) { + return DesignI18nImpl.getInstance().i18nText(defaultKey); + } + return url; + } +} 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 7e7ac1ff72..bd7efabe84 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 @@ -14,7 +14,7 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itextfield.PlaceholderTextField; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.jsapi.JSAPITreeHelper; import com.fr.design.javascript.jsapi.JSAPIUserObject; @@ -361,7 +361,7 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private void doHelpDocumentSearch() { Object value = interfaceNameList.getSelectedValue(); if (value != null) { - String url = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + String url = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); try { String result = HttpToolbox.get(url); JSONObject jsonObject = new JSONObject(result); diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java index 5e497fe896..593a3cae08 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java @@ -1,6 +1,6 @@ package com.fr.design.locale.impl; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.general.locale.LocaleMark; /** @@ -23,6 +23,6 @@ public class BbsRegisterMark implements LocaleMark { @Override public String getValue() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java index 4a97f68304..18431ba23b 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java @@ -1,6 +1,6 @@ package com.fr.design.locale.impl; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.general.locale.LocaleMark; /** @@ -25,6 +25,6 @@ public class BbsResetMark implements LocaleMark { @Override public String getValue() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java index 1574b4e6b5..112521749a 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java @@ -1,6 +1,6 @@ package com.fr.design.locale.impl; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.general.locale.LocaleMark; /** @@ -24,6 +24,6 @@ public class BbsSpaceMark implements LocaleMark { public BbsSpaceMark() {} @Override public String getValue() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java index 113ee8e6e8..109c19e364 100644 --- a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java +++ b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java @@ -5,7 +5,7 @@ import com.fr.design.bridge.exec.JSCallback; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.locale.impl.BbsResetMark; @@ -83,7 +83,7 @@ public class DesignerLoginBridge { getHyperlinkPane( com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Title"), com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Hyperlink_Text"), - LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink() + LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT) ) ); } else if (source == DesignerLoginSource.BBS_JUMP) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java index 6355b034f6..e68282f26a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java @@ -4,7 +4,7 @@ import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.DesignSizeI18nManager; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; @@ -55,7 +55,7 @@ public class CheckFontInfoDialog extends JDialog implements ActionListener { JPanel imagePanel = new JPanel(); imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/warnings/warning32.png")); imagePanel.add(imageLabel); - String link = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + String link = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); MessageWithLink linkMessage = new MessageWithLink(Toolkit.i18nText("Fine_Designer_Check_Font_Message"), Toolkit.i18nText("Fine_Designer_Check_Font_Install_Font"), diff --git a/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java b/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java index 785d47c1be..09d627b751 100644 --- a/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java +++ b/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java @@ -1,7 +1,7 @@ package com.fr.design.update.actions; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.utils.BrowseUtils; import com.fr.log.FineLoggerFactory; @@ -25,7 +25,7 @@ public class NewFeatureAction implements ActionListener { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Latest_Update_Detail_Default"; - public static String DEFAULT_UPDATE_DETAIL_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + public static String DEFAULT_UPDATE_DETAIL_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); @Override public void actionPerformed(ActionEvent e) { diff --git a/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java b/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java index 4a06fc2a21..89a28dc3e0 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java +++ b/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java @@ -1,6 +1,6 @@ package com.fr.env; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.general.locale.LocaleMark; /** @@ -24,7 +24,7 @@ public class RemoteDesignLocaleMark implements LocaleMark { @Override public String getValue() { - return LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java index 7eb6327331..f3a8eb2685 100644 --- a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java +++ b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java @@ -6,7 +6,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.i18n.DesignSizeI18nManager; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -73,7 +73,7 @@ public class SyncFailedPluginsDialog extends JDialog { JPanel messagePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); MessageWithLink messageWithLink = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugin_Fail_Suggestion"),Toolkit.i18nText("Fine-Design_Basic_Sync_Deal_Immediately"), - LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink()); + LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT)); messageWithLink.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.env.SyncFailedPluginsDialog.messageWithLink")); messagePane.add(messageWithLink); diff --git a/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java b/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java index bb157a0811..4be5875899 100644 --- a/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java +++ b/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java @@ -1,6 +1,6 @@ package com.fr.env.detect.base; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; /** * created by Harrison on 2022/05/25 @@ -25,9 +25,9 @@ public class DetectorConstants { * 云中心FineDB异常检测帮助文档默认链接在配置文件中对应的配置文件key */ private static final String JAR_HELP_PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Jar_Exception_Check_Default"; - public static final String JAR_HELP_LINK = LocaleLinkFactory.getInstance().getOrCreateProvider(JAR_HELP_PROPS_LINK_KEY, JAR_HELP_PROPS_LINK_KEY_DEFAULT).getLink();; + public static final String JAR_HELP_LINK = LocaleLinkProvide.getInstance().getLink(JAR_HELP_PROPS_LINK_KEY, JAR_HELP_PROPS_LINK_KEY_DEFAULT);; - public static final String FINE_DB_HELP_LINK = LocaleLinkFactory.getInstance().getOrCreateProvider(FINE_DB_HELP_PROPS_LINK_KEY, FINE_DB_HELP_PROPS_LINK_KEY_DEFAULT).getLink(); + public static final String FINE_DB_HELP_LINK = LocaleLinkProvide.getInstance().getLink(FINE_DB_HELP_PROPS_LINK_KEY, FINE_DB_HELP_PROPS_LINK_KEY_DEFAULT); public static final String SEPARATOR = "、"; public static final String BR_TAG = "
"; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java index 6bac549969..8a77b28e04 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java @@ -1,6 +1,6 @@ package com.fr.design.mainframe.share.ui.actions; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ui.online.CarouselStateManger; import com.fr.stable.StringUtils; @@ -29,7 +29,7 @@ public class Jump2DetailAction extends SharedComponentPopupAction { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Detail_Default"; - private static final String ONLINE_WIDGET_DETAIL_FORMATTED_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private static final String ONLINE_WIDGET_DETAIL_FORMATTED_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private final String id; public Jump2DetailAction(String id) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java index 6f3a33b0d3..f49924cce6 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java @@ -5,7 +5,7 @@ import com.fr.base.Style; import com.fr.design.dialog.BasicPane; import com.fr.design.form.util.FontTransformUtil; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.share.ui.base.LoadingPane; @@ -53,7 +53,7 @@ public class OnlineWidgetRepoPane extends BasicPane { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Default"; - private static final String MARKET_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private static final String MARKET_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private static List[] sharableWidgets; private OnlineWidgetTabPane componentTabPane; private boolean isShowPackagePanel = false; diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java index 9fbd95ae7b..0ed6b36b45 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java @@ -4,7 +4,7 @@ import com.fr.base.svg.IconUtils; import com.fr.design.actions.replace.info.Info; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ui.base.MouseClickListener; import com.fr.design.utils.BrowseUtils; @@ -45,7 +45,7 @@ public class ITReplaceWestPanel { * 云中心定时调度执行频率表达式设定帮助文档默认链接在配置文件中对应的配置文件key */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Template_Level_Search_Replace_Default"; - private static final String HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private static final String HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private static final int FILL_COUNT = 11; public static final int LEFT_WIDTH = 100; public static final String CONTENT_TEXT = "" + Toolkit.i18nText("Fine-Design_Basic_Templates_Content") + ""; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 14bb550226..151b7d1e2d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -7,7 +7,7 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceInfoContext; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -68,7 +68,7 @@ public class DesignerSocketIO { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_WebSocket_Default"; - private static final String WEBSOCKET_HELP_DOC = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private static final String WEBSOCKET_HELP_DOC = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private static final String HTTPS = "https"; private static final String HTTP = "http"; private static Socket socket = null; diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java index fe6fbc609e..1e83032abb 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java @@ -6,7 +6,7 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkFactory; +import com.fr.design.i18n.LocaleLinkProvide; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.BrowseUtils; @@ -40,7 +40,7 @@ public class ExportUniversalPane extends BasicPane { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Alt_Font_Export_Default"; - private static final String HELP_URL = LocaleLinkFactory.getInstance().getOrCreateProvider(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT).getLink(); + private static final String HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private UICheckBox specialCharacterExport; // 密码支持公式 From 43ffd9ab48de9e34b73ed9d072884d837520a64c Mon Sep 17 00:00:00 2001 From: "coral.chen@fanruan.com" Date: Thu, 13 Apr 2023 10:14:01 +0800 Subject: [PATCH 086/625] =?UTF-8?q?REPORT-89863=20=E3=80=90=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E3=80=91=E7=A7=BB=E5=8A=A8=E7=AB=AFNFC?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AF=BB=E5=8F=96uid=E4=BF=A1=E6=81=AF---?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E6=94=AF=E6=92=91=20=E3=80=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91=E4=BB=BB=E5=8A=A1REPORT-90?= =?UTF-8?q?316=20=E5=BB=B6=E6=9C=9F=EF=BC=8C=E5=9B=9E=E9=80=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=BD=B1=E5=93=8D=E4=BA=86=E8=BF=99=E9=83=A8=E5=88=86?= =?UTF-8?q?=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E5=8E=9F=E6=9D=A5=E7=9A=84=E8=A7=84=E6=A0=BC?= =?UTF-8?q?=E6=8A=8A=E6=96=B0=E9=9D=A2=E6=9D=BF=E5=8A=A0=E4=B8=8A=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MobileTextFieldInputSettingPane.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java index cdddc3e79f..fb9daa30f3 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java @@ -2,10 +2,13 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.mobile.MobileScanCodeAttr; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.VerticalFlowLayout; +import javax.swing.ButtonGroup; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.FlowLayout; @@ -21,15 +24,28 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane { + UICheckBox source = (UICheckBox) e.getSource(); + // 更新面板是否可见 + updateNfcContentTypePane(source.isSelected(), nfcContentTypePane.getSelectedType()); + }); settingPane.add(manualInputCheckBox); settingPane.add(scanCodeCheckBox); settingPane.add(nfcInputCheckBox); + settingPane.add(nfcContentTypePane); + // 初始状态,内容类型面板不可见 + nfcContentTypePane.setVisible(false); this.add(settingPane, BorderLayout.NORTH); } @@ -38,6 +54,7 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane Date: Thu, 13 Apr 2023 14:12:36 +0800 Subject: [PATCH 087/625] =?UTF-8?q?REPORT-91074=20=E3=80=90=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E3=80=91=E8=B6=85=E9=93=BE=E6=8E=A5=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/actions/community/BBSAction.java | 4 ++-- .../com/fr/design/actions/community/BugAction.java | 4 ++-- .../fr/design/actions/community/CenterAction.java | 4 ++-- .../fr/design/actions/community/CusDemandAction.java | 4 ++-- .../design/actions/community/FacebookFansAction.java | 4 ++-- .../com/fr/design/actions/community/NeedAction.java | 4 ++-- .../fr/design/actions/community/QuestionAction.java | 4 ++-- .../com/fr/design/actions/community/SignAction.java | 4 ++-- .../fr/design/actions/community/StudyPlanAction.java | 4 ++-- .../design/actions/community/TechSolutionAction.java | 4 ++-- .../actions/community/TemplateStoreAction.java | 4 ++-- .../com/fr/design/actions/community/UpAction.java | 4 ++-- .../actions/community/WorkOrderCenterAction.java | 4 ++-- .../com/fr/design/actions/help/TutorialAction.java | 4 ++-- .../design/data/datapane/ESDStrategyConfigPane.java | 4 ++-- .../preview/sql/PreviewPerformedSqlPane.java | 4 ++-- .../exe/callback/handle/PluginCallBackHelper.java | 4 ++-- .../gui/style/TranslucentBorderSpecialPane.java | 4 ++-- ...ocaleLinkProvide.java => LocaleLinkProvider.java} | 12 ++++++------ .../javascript/JSContentWithDescriptionPane.java | 4 ++-- .../com/fr/design/locale/impl/BbsRegisterMark.java | 4 ++-- .../java/com/fr/design/locale/impl/BbsResetMark.java | 4 ++-- .../java/com/fr/design/locale/impl/BbsSpaceMark.java | 4 ++-- .../com/fr/design/login/DesignerLoginBridge.java | 4 ++-- .../design/mainframe/check/CheckFontInfoDialog.java | 4 ++-- .../fr/design/update/actions/NewFeatureAction.java | 4 ++-- .../main/java/com/fr/env/RemoteDesignLocaleMark.java | 4 ++-- .../java/com/fr/env/SyncFailedPluginsDialog.java | 4 ++-- .../com/fr/env/detect/base/DetectorConstants.java | 6 +++--- .../share/ui/actions/Jump2DetailAction.java | 4 ++-- .../share/ui/online/OnlineWidgetRepoPane.java | 4 ++-- .../actions/replace/ui/ITReplaceWestPanel.java | 4 ++-- .../design/mainframe/socketio/DesignerSocketIO.java | 4 ++-- .../com/fr/design/report/ExportUniversalPane.java | 4 ++-- 34 files changed, 73 insertions(+), 73 deletions(-) rename designer-base/src/main/java/com/fr/design/i18n/{LocaleLinkProvide.java => LocaleLinkProvider.java} (75%) diff --git a/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java b/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java index 999d7d59ed..ed487578c8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class BBSAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet BBS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java b/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java index 7e90a3b684..9da1539a5a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/BugAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -27,7 +27,7 @@ public class BugAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet BUG = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java index e634e58fc7..093070b55c 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.menu.MenuKeySet; import javax.swing.KeyStroke; @@ -29,7 +29,7 @@ public class CenterAction extends UpAction { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet CENTER = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java b/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java index 5afa19cea1..ef4cea39de 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.BrowseUtils; @@ -35,7 +35,7 @@ public class CusDemandAction extends UpAction{ @Override public void actionPerformed(ActionEvent arg0) { - String url = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + String url = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); BrowseUtils.browser(url); } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java index 79b8f57760..05ef85e44f 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.menu.MenuKeySet; import com.fr.design.utils.BrowseUtils; @@ -28,7 +28,7 @@ public class FacebookFansAction extends UpAction { @Override public void actionPerformed(ActionEvent arg0) { - BrowseUtils.browser(LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT)); + BrowseUtils.browser(LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT)); } public static final MenuKeySet FACEBOOKFANS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java b/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java index cf7bf7c1e0..33279060b6 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class NeedAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet NEED = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java index fb3bf4ec34..e56359139a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class QuestionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet QUESTIONS = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java index 7a0b26eb20..29817e36a6 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/SignAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -27,7 +27,7 @@ public class SignAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet SIGN = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java b/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java index 402b62eb3f..0d2e79905d 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/StudyPlanAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.login.AbstractDesignerSSO; @@ -23,6 +23,6 @@ public class StudyPlanAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java index 46fdefff45..f0e4f3ac30 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -31,7 +31,7 @@ public class TechSolutionAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet TSO = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java b/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java index ebc8bfbb54..3c17df9b56 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.mainframe.share.collect.ComponentCollector; import com.fr.design.menu.MenuKeySet; @@ -54,6 +54,6 @@ public class TemplateStoreAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { ComponentCollector.getInstance().collectTepMenuEnterClick(); - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java index 4385f1d466..e0c6404836 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/UpAction.java @@ -1,7 +1,7 @@ package com.fr.design.actions.community; import com.fr.base.BaseUtils; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -28,7 +28,7 @@ public class UpAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY ,PROPS_LINK_KEY_DEFAULT); } public static final MenuKeySet UPDATE = new MenuKeySet() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java index e34443e720..03e634a4ad 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.community; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; /** @@ -27,6 +27,6 @@ public class WorkOrderCenterAction extends UpAction { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java index 1712272685..1a4bccfa4a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java @@ -1,6 +1,6 @@ package com.fr.design.actions.help; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.login.AbstractDesignerSSO; import com.fr.design.menu.MenuKeySet; @@ -38,7 +38,7 @@ public class TutorialAction extends AbstractDesignerSSO { @Override public String getJumpUrl() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } // 生成帮助文档 sitecenter key, help.zh_CN.10 diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java index ce3464bc9e..0106654e8f 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/ESDStrategyConfigPane.java @@ -6,7 +6,7 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.common.CacheConstants; @@ -50,7 +50,7 @@ public class ESDStrategyConfigPane extends BasicBeanPane { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Cron_Help_Default"; - private static final String CRON_HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private static final String CRON_HELP_URL = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private UIRadioButton selectAutoUpdate; private UIRadioButton selectBySchema; private UICheckBox shouldEvolve; diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java index c32fa2dcf4..c4996d539e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java @@ -11,7 +11,7 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -94,7 +94,7 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener { JLabel label = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql_Message") + Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention") + Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); messagePanel.add(label); } else { - MessageWithLink message = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Front_Message"), Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention"), LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT), Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); + MessageWithLink message = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Front_Message"), Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention"), LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT), Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); messagePanel.add(message); } // 提示图标 diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java b/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java index f672eb15bd..8fe64dc29a 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/callback/handle/PluginCallBackHelper.java @@ -2,7 +2,7 @@ package com.fr.design.extra.exe.callback.handle; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.link.MessageWithLink; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.plugin.error.PluginErrorCode; import com.fr.plugin.manage.control.PluginTaskResult; @@ -29,7 +29,7 @@ public class PluginCallBackHelper { private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design_Basic_Plugin_File_Validate_HELP_DOCUMENT_LINK_Default"; - private static final String HELP_DOCUMENT_LINK = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private static final String HELP_DOCUMENT_LINK = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); /** diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java index d126716474..0fb3706afb 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TranslucentBorderSpecialPane.java @@ -16,7 +16,7 @@ import com.fr.design.gui.frpane.UIPercentDragPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -90,7 +90,7 @@ public class TranslucentBorderSpecialPane extends AbstractBorderPackerPane imple */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Nine_Patch_Default"; - private final String TWEAK_NINE_POINT_HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private final String TWEAK_NINE_POINT_HELP_URL = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private UIObserverListener uiObserverListener; diff --git a/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvide.java b/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvider.java similarity index 75% rename from designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvide.java rename to designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvider.java index e7379137ff..4a819069a7 100644 --- a/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvide.java +++ b/designer-base/src/main/java/com/fr/design/i18n/LocaleLinkProvider.java @@ -11,21 +11,21 @@ import com.fr.stable.StringUtils; * @since 11.0 * Created on 2023/4/7 */ -public final class LocaleLinkProvide { +public final class LocaleLinkProvider { - private LocaleLinkProvide(){}; + private LocaleLinkProvider(){}; /** * 单一实例 */ - private static final LocaleLinkProvide INSTANCE = new LocaleLinkProvide(); + private static final LocaleLinkProvider INSTANCE = new LocaleLinkProvider(); /** - * 返回LocaleLinkProvide的单一实例 + * 返回LocaleLinkProvider的单一实例 * - * @return LocaleLinkProvide单一实例 + * @return LocaleLinkProvider单一实例 */ - public static LocaleLinkProvide getInstance(){ + public static LocaleLinkProvider getInstance(){ return INSTANCE; } 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 bd7efabe84..e204a3342b 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 @@ -14,7 +14,7 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itextfield.PlaceholderTextField; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.jsapi.JSAPITreeHelper; import com.fr.design.javascript.jsapi.JSAPIUserObject; @@ -361,7 +361,7 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private void doHelpDocumentSearch() { Object value = interfaceNameList.getSelectedValue(); if (value != null) { - String url = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + String url = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); try { String result = HttpToolbox.get(url); JSONObject jsonObject = new JSONObject(result); diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java index 593a3cae08..dfa425a3c0 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java @@ -1,6 +1,6 @@ package com.fr.design.locale.impl; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.general.locale.LocaleMark; /** @@ -23,6 +23,6 @@ public class BbsRegisterMark implements LocaleMark { @Override public String getValue() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java index 18431ba23b..49092d4f25 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java @@ -1,6 +1,6 @@ package com.fr.design.locale.impl; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.general.locale.LocaleMark; /** @@ -25,6 +25,6 @@ public class BbsResetMark implements LocaleMark { @Override public String getValue() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java index 112521749a..a0b21d271a 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java @@ -1,6 +1,6 @@ package com.fr.design.locale.impl; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.general.locale.LocaleMark; /** @@ -24,6 +24,6 @@ public class BbsSpaceMark implements LocaleMark { public BbsSpaceMark() {} @Override public String getValue() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java index 109c19e364..4789cc4f9b 100644 --- a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java +++ b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java @@ -5,7 +5,7 @@ import com.fr.design.bridge.exec.JSCallback; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.locale.impl.BbsResetMark; @@ -83,7 +83,7 @@ public class DesignerLoginBridge { getHyperlinkPane( com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Title"), com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Hyperlink_Text"), - LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT) + LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT) ) ); } else if (source == DesignerLoginSource.BBS_JUMP) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java index e68282f26a..8274b65355 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java @@ -4,7 +4,7 @@ import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.DesignSizeI18nManager; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; @@ -55,7 +55,7 @@ public class CheckFontInfoDialog extends JDialog implements ActionListener { JPanel imagePanel = new JPanel(); imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/warnings/warning32.png")); imagePanel.add(imageLabel); - String link = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + String link = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); MessageWithLink linkMessage = new MessageWithLink(Toolkit.i18nText("Fine_Designer_Check_Font_Message"), Toolkit.i18nText("Fine_Designer_Check_Font_Install_Font"), diff --git a/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java b/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java index 09d627b751..320a2a23dc 100644 --- a/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java +++ b/designer-base/src/main/java/com/fr/design/update/actions/NewFeatureAction.java @@ -1,7 +1,7 @@ package com.fr.design.update.actions; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.utils.BrowseUtils; import com.fr.log.FineLoggerFactory; @@ -25,7 +25,7 @@ public class NewFeatureAction implements ActionListener { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Latest_Update_Detail_Default"; - public static String DEFAULT_UPDATE_DETAIL_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + public static String DEFAULT_UPDATE_DETAIL_URL = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); @Override public void actionPerformed(ActionEvent e) { diff --git a/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java b/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java index 89a28dc3e0..dd95323617 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java +++ b/designer-base/src/main/java/com/fr/env/RemoteDesignLocaleMark.java @@ -1,6 +1,6 @@ package com.fr.env; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.general.locale.LocaleMark; /** @@ -24,7 +24,7 @@ public class RemoteDesignLocaleMark implements LocaleMark { @Override public String getValue() { - return LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); } } diff --git a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java index f3a8eb2685..a0b07bd2c0 100644 --- a/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java +++ b/designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java @@ -6,7 +6,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.i18n.DesignSizeI18nManager; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -73,7 +73,7 @@ public class SyncFailedPluginsDialog extends JDialog { JPanel messagePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); MessageWithLink messageWithLink = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugin_Fail_Suggestion"),Toolkit.i18nText("Fine-Design_Basic_Sync_Deal_Immediately"), - LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT)); + LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT)); messageWithLink.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.env.SyncFailedPluginsDialog.messageWithLink")); messagePane.add(messageWithLink); diff --git a/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java b/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java index 4be5875899..61f08c344c 100644 --- a/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java +++ b/designer-base/src/main/java/com/fr/env/detect/base/DetectorConstants.java @@ -1,6 +1,6 @@ package com.fr.env.detect.base; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; /** * created by Harrison on 2022/05/25 @@ -25,9 +25,9 @@ public class DetectorConstants { * 云中心FineDB异常检测帮助文档默认链接在配置文件中对应的配置文件key */ private static final String JAR_HELP_PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Jar_Exception_Check_Default"; - public static final String JAR_HELP_LINK = LocaleLinkProvide.getInstance().getLink(JAR_HELP_PROPS_LINK_KEY, JAR_HELP_PROPS_LINK_KEY_DEFAULT);; + public static final String JAR_HELP_LINK = LocaleLinkProvider.getInstance().getLink(JAR_HELP_PROPS_LINK_KEY, JAR_HELP_PROPS_LINK_KEY_DEFAULT);; - public static final String FINE_DB_HELP_LINK = LocaleLinkProvide.getInstance().getLink(FINE_DB_HELP_PROPS_LINK_KEY, FINE_DB_HELP_PROPS_LINK_KEY_DEFAULT); + public static final String FINE_DB_HELP_LINK = LocaleLinkProvider.getInstance().getLink(FINE_DB_HELP_PROPS_LINK_KEY, FINE_DB_HELP_PROPS_LINK_KEY_DEFAULT); public static final String SEPARATOR = "、"; public static final String BR_TAG = "
"; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java index 8a77b28e04..b4d546727b 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/actions/Jump2DetailAction.java @@ -1,6 +1,6 @@ package com.fr.design.mainframe.share.ui.actions; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ui.online.CarouselStateManger; import com.fr.stable.StringUtils; @@ -29,7 +29,7 @@ public class Jump2DetailAction extends SharedComponentPopupAction { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Detail_Default"; - private static final String ONLINE_WIDGET_DETAIL_FORMATTED_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private static final String ONLINE_WIDGET_DETAIL_FORMATTED_URL = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private final String id; public Jump2DetailAction(String id) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java index f49924cce6..e7b60ce926 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetRepoPane.java @@ -5,7 +5,7 @@ import com.fr.base.Style; import com.fr.design.dialog.BasicPane; import com.fr.design.form.util.FontTransformUtil; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.share.ui.base.LoadingPane; @@ -53,7 +53,7 @@ public class OnlineWidgetRepoPane extends BasicPane { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Default"; - private static final String MARKET_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private static final String MARKET_URL = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private static List[] sharableWidgets; private OnlineWidgetTabPane componentTabPane; private boolean isShowPackagePanel = false; diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java index 0ed6b36b45..c4914c9622 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java @@ -4,7 +4,7 @@ import com.fr.base.svg.IconUtils; import com.fr.design.actions.replace.info.Info; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ui.base.MouseClickListener; import com.fr.design.utils.BrowseUtils; @@ -45,7 +45,7 @@ public class ITReplaceWestPanel { * 云中心定时调度执行频率表达式设定帮助文档默认链接在配置文件中对应的配置文件key */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Template_Level_Search_Replace_Default"; - private static final String HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private static final String HELP_URL = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private static final int FILL_COUNT = 11; public static final int LEFT_WIDTH = 100; public static final String CONTENT_TEXT = "" + Toolkit.i18nText("Fine-Design_Basic_Templates_Content") + ""; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 151b7d1e2d..4b5c287ff5 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -7,7 +7,7 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceInfoContext; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; @@ -68,7 +68,7 @@ public class DesignerSocketIO { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_WebSocket_Default"; - private static final String WEBSOCKET_HELP_DOC = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private static final String WEBSOCKET_HELP_DOC = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private static final String HTTPS = "https"; private static final String HTTP = "http"; private static Socket socket = null; diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java index 1e83032abb..4da3b89e81 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java @@ -6,7 +6,7 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.i18n.LocaleLinkProvide; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.BrowseUtils; @@ -40,7 +40,7 @@ public class ExportUniversalPane extends BasicPane { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Alt_Font_Export_Default"; - private static final String HELP_URL = LocaleLinkProvide.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + private static final String HELP_URL = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); private UICheckBox specialCharacterExport; // 密码支持公式 From 463f8d9e61fe61948944e43a144dec9f07c995f0 Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 13 Apr 2023 19:46:07 +0800 Subject: [PATCH 088/625] =?UTF-8?q?REPORT-75308=20FVS=E5=A4=A7=E5=B1=8F?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=94=AF=E6=8C=81=E5=90=8C=E6=97=B6=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=A4=9A=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/CloseCurrentTemplateAction.java | 8 +- .../fr/design/actions/file/RenameAction.java | 4 +- .../design/actions/file/SwitchExistEnv.java | 2 +- .../java/com/fr/design/file/CloseOption.java | 43 ++ .../design/file/HistoryTemplateListCache.java | 41 +- .../file/MultiTemplateTabMenuFactory.java | 346 +++++++++++++ .../fr/design/file/MultiTemplateTabPane.java | 486 ++---------------- .../fr/design/file/MutilTempalteTabPane.java | 6 +- .../com/fr/design/file/NewTemplatePane.java | 6 +- .../fr/design/file/SaveSomeTemplatePane.java | 19 +- .../fr/design/file/TemplateTabManager.java | 253 +++++++++ .../file/TemplateTabOperateProvider.java | 114 ++++ .../file/impl/AbstractTemplateTabOperate.java | 332 ++++++++++++ .../file/impl/DefaultTemplateTabOperate.java | 31 ++ .../file/impl/EmptyTemplateTabOperator.java | 109 ++++ .../mainframe/CenterRegionContainerPane.java | 29 +- .../mainframe/DefaultToolKitConfig.java | 8 + .../fr/design/mainframe/DesignerFrame.java | 8 +- .../DesignerFrameFileDealerPane.java | 15 +- .../com/fr/design/mainframe/JTemplate.java | 21 +- .../mainframe/ToolKitConfigStrategy.java | 10 + .../mainframe/toolbar/ToolBarMenuDock.java | 4 +- .../vcs/ui/FileVersionCellEditor.java | 8 +- .../mainframe/vcs/ui/FileVersionsPanel.java | 8 +- .../com/fr/design/worker/open/OpenWorker.java | 4 +- .../designer/toolbar/TemplateTransformer.java | 8 +- .../main/java/com/fr/start/BaseDesigner.java | 6 +- .../start/common/DesignerOpenEmptyPanel.java | 4 +- .../fr/design/fit/common/TemplateTool.java | 4 +- .../fr/design/preview/DeveloperPreview.java | 5 +- .../com/fr/design/mainframe/JWorkBook.java | 4 +- .../main/java/com/fr/start/MainDesigner.java | 4 +- 32 files changed, 1426 insertions(+), 524 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/file/CloseOption.java create mode 100644 designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java create mode 100644 designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java create mode 100644 designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java create mode 100644 designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java create mode 100644 designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java diff --git a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java index 22263a871e..b2ab237d7d 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java @@ -3,7 +3,7 @@ package com.fr.design.actions.file; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; @@ -28,9 +28,9 @@ public class CloseCurrentTemplateAction extends UpdateAction { * @param e 事件 */ public void actionPerformed(ActionEvent e) { - MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); - MultiTemplateTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); - MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + TemplateTabManager.getInstance().setCloseCurrent(true); + TemplateTabManager.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + TemplateTabManager.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java b/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java index 842292ce2a..33f51b77aa 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java @@ -7,7 +7,7 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.FileOperations; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; @@ -88,7 +88,7 @@ public class RenameAction extends UpdateAction { } new FileRenameDialog(node); - MultiTemplateTabPane.getInstance().repaint(); + TemplateTabManager.getInstance().refresh(); DesignerFrameFileDealerPane.getInstance().stateChange(); } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index 33761a92e2..e38a39895a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -68,7 +68,7 @@ public class SwitchExistEnv extends MenuDef { EnvChangeEntrance.getInstance().chooseEnv(envName); } else { SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true); - if (saveSomeTemplatePane.showSavePane()) { + if (saveSomeTemplatePane.showSavePane(true)) { // 用户模板保存后,才进行切换目录操作 EnvChangeEntrance.getInstance().switch2Env(envName); } diff --git a/designer-base/src/main/java/com/fr/design/file/CloseOption.java b/designer-base/src/main/java/com/fr/design/file/CloseOption.java new file mode 100644 index 0000000000..c88e7658c8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/CloseOption.java @@ -0,0 +1,43 @@ +package com.fr.design.file; + +import com.fr.design.i18n.Toolkit; + +public enum CloseOption { + Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { + @Override + public boolean shouldClose(int tplIndex, int i) { + return i < tplIndex; + } + }, + + Right(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Right")) { + @Override + public boolean shouldClose(int tplIndex, int i) { + return i > tplIndex; + } + + }, All(Toolkit.i18nText("Fine-Design_Close_All_templates")), + + Others(Toolkit.i18nText("Fine-Design_Close_Other_templates")) { + @Override + public boolean shouldClose(int tplIndex, int i) { + return i != tplIndex; + } + }; + + + private String optionName; + + public String getOptionName() { + return this.optionName; + } + + CloseOption(String optionName) { + this.optionName = optionName; + } + + public boolean shouldClose(int tplIndex, int i) { + return true; + } + +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 86820aa227..083aa2ed08 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -75,7 +75,7 @@ public class HistoryTemplateListCache implements CallbackEvent { historyList.remove(contains(selected)); selected.getEditingFILE().closeTemplate(); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Closed_Warn_Text", selected.getEditingFILE().getName())); - MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); + TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } @@ -134,10 +134,10 @@ public class HistoryTemplateListCache implements CallbackEvent { if (contains(jt) == -1) { addHistory(); } - MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); + TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); //设置tab栏为当前选中的那一栏 if (editingTemplate != null) { - MultiTemplateTabPane.getInstance().setSelectedIndex(contains(jt)); + TemplateTabManager.getInstance().resetSelectIndex(jt); } } @@ -268,13 +268,14 @@ public class HistoryTemplateListCache implements CallbackEvent { boolean replaceWithJVirtualTemplate = overTemplate.getEditingFILE().exists() && overTemplate.isALLSaved() && overTemplate != editingTemplate - && overTemplate.checkEnable(); + && overTemplate.checkEnable() + && overTemplate.supportCache(); if (replaceWithJVirtualTemplate) { closeVirtualSelectedReport(overTemplate); historyList.set(i, new JVirtualTemplate(overTemplate.getEditingFILE())); } } - MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); + TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); } @@ -285,35 +286,27 @@ public class HistoryTemplateListCache implements CallbackEvent { // path like reportlets/xx/xxx/xxx String path = file.getPath() + suffix; - - ListIterator> iterator = historyList.listIterator(); - + List list = new ArrayList(); + for(JTemplate jTemplate : historyList){ + list.add(jTemplate); + } + ListIterator> iterator = list.listIterator(); while (iterator.hasNext()) { JTemplate template = iterator.next(); String tPath = template.getPath(); if (isDir ? tPath.startsWith(path) : tPath.equals(path)) { - int size = getHistoryCount(); - iterator.remove(); - int index = iterator.nextIndex(); - if (size == index + 1 && index > 0) { - //如果删除的是后一个Tab,则定位到前一个 - MultiTemplateTabPane.getInstance().setSelectedIndex(index - 1); - } + historyList.remove(template); + TemplateTabManager.getInstance().deleteOpenedTemplate(template); } } - //如果打开过,则删除,实时刷新多tab面板 - int openFileCount = getHistoryCount(); - if (openFileCount == 0) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); - } - JTemplate selectedFile = MultiTemplateTabPane.getInstance().getSelectedFile(); + JTemplate selectedFile = TemplateTabManager.getInstance().getSelectedFile(); if (!isCurrentEditingFile(selectedFile.getPath())) { //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 DesignerContext.getDesignerFrame().activateJTemplate(selectedFile); } - MultiTemplateTabPane.getInstance().repaint(); + TemplateTabManager.getInstance().refresh(); } @@ -474,7 +467,7 @@ public class HistoryTemplateListCache implements CallbackEvent { int index = contains(this.editingTemplate); this.editingTemplate = jt; historyList.set(index, jt); - MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); - MultiTemplateTabPane.getInstance().setSelectedIndex(contains(jt)); + TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); + TemplateTabManager.getInstance().resetSelectIndex(jt); } } 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 new file mode 100644 index 0000000000..a67e129f78 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java @@ -0,0 +1,346 @@ +package com.fr.design.file; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.imenu.UIMenuItem; +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.file.FILE; +import com.fr.general.IOUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.collections.CollectionUtils; +import com.fr.third.javax.annotation.Nonnull; + +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author Carlson + * @version 11.0 + * @description + **/ +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 int ITEM_SIZE = 25; + + private UIScrollPopUpMenu menu = null; + + private static MultiTemplateTabMenuFactory INSTANCE = new MultiTemplateTabMenuFactory(); + + private MultiTemplateTabMenuFactory() { + + } + + public static MultiTemplateTabMenuFactory getInstance() { + return INSTANCE; + } + + /** + * tab上的下拉菜单 + */ + public UIScrollPopUpMenu createMenu() { + menu = new UIScrollPopUpMenu(); + menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); + + menu.add(initCloseOther()); + menu.add(createEmptyRow()); + menu.addSeparator(); + menu.add(createEmptyRow()); + menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Current_Category_Templates"))); + Component[] items = createCurrentCategory(); + for (Component item : items) { + menu.add(item); + } + items = createOtherCategory(); + if (items.length > 0) { + menu.addSeparator(); + menu.add(createEmptyRow()); + menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Other_Category_Templates"))); + for (Component item : items) { + menu.add(item); + } + } + Dimension dimension = menu.getPreferredSize(); + dimension.width += ITEM_SIZE; + menu.setPreferredSize(dimension); + return menu; + } + + /** + * 关闭其它按钮 + */ + private UIMenuItem initCloseOther() { + UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_Tab_Close_Other_Templates_Of_Current_Category")); + closeOther.setHorizontalAlignment(SwingConstants.CENTER); + Dimension dimension = closeOther.getPreferredSize(); + dimension.height = ITEM_SIZE; + closeOther.setPreferredSize(dimension); + closeOther.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + TemplateTabManager.getInstance().closeOthers(); + } + + }); + if (TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() <= 1) { + closeOther.setEnabled(false); + } + return closeOther; + } + + private void closeAndFreeLock(@Nonnull JTemplate template) { + FILE file = template.getEditingFILE(); + // 只有是环境内的文件,才执行释放锁 + if (file != null && file.isEnvFile()) { + // release lock + TemplateResourceManager.getResource().closeTemplate(file.getPath()); + } + } + + /** + * 美观用 + */ + private JPanel createEmptyRow() { + return new JPanel() { + @Override + public Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + d.height = 1; + return d; + } + }; + } + + /** + * 模板分类item + */ + private UIButton createCategory(String categoryName) { + UIButton button = new UIButton(categoryName); + button.setBorderPainted(false); + button.setExtraPainted(false); + button.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + button.setHorizontalAlignment(SwingConstants.LEFT); + button.setForeground(UIConstants.FLESH_BLUE); + return button; + } + + /** + * 创建 当前分类模板 item数组 + */ + private Component[] createCurrentCategory() { + return createListDownItem(TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates()); + } + + /** + * 创建 其它分类模板 item数组 + */ + private Component[] createOtherCategory() { + List> openedTemplates = new ArrayList<>(); + Map>> map = TemplateTabManager.getInstance().getAllOpenedTemplateMap(); + for (Map.Entry>> entry : map.entrySet()) { + if (!StringUtils.equals(TemplateTabManager.getInstance().getCurrentOperator().getOperatorType(), entry.getKey())) { + openedTemplates.addAll(entry.getValue()); + } + } + return createListDownItem(openedTemplates); + } + + /** + * 根据template列表创建多个item + */ + private Component[] createListDownItem(List> openedTemplates) { + if (!CollectionUtils.isEmpty(openedTemplates)) { + Component[] templates = new Component[openedTemplates.size()]; + for (int i = 0; i < openedTemplates.size(); i++) { + templates[i] = createListDownMenuItem(openedTemplates.get(i)); + } + return templates; + } + return new Component[0]; + } + + /** + * 根据template对象创建item + */ + private Component createListDownMenuItem(JTemplate template) { + JPanel jPanel = new JPanel(); + jPanel.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); + jPanel.setLayout(new BorderLayout()); + + MenuItemButtonGroup menuItemButtonGroup = new MenuItemButtonGroup(template); + if (template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { + menuItemButtonGroup.templateButton.setForeground(UIConstants.FLESH_BLUE); + } + + jPanel.add(menuItemButtonGroup.iconButton, BorderLayout.WEST); + jPanel.add(menuItemButtonGroup.templateButton, BorderLayout.CENTER); + jPanel.add(menuItemButtonGroup.closeButton, BorderLayout.EAST); + + return jPanel; + } + + /** + * menu的item由模板图标、模板名、模板关闭按钮组成 + */ + private class MenuItemButtonGroup { + + private final UIButton iconButton; + private final UIButton templateButton; + private final UIButton closeButton; + + public MenuItemButtonGroup(JTemplate template) { + iconButton = createIconButton(template); + templateButton = createTemplateButton(template); + closeButton = createCloseButton(); + initListener(template); + } + + /** + * item[0] 模板图标按钮初始化 + */ + private UIButton createIconButton(JTemplate template) { + UIButton button = new UIButton(template.getIcon(), template.getIcon(), template.getIcon()); + button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + return button; + } + + /** + * item[1] 切换模板按钮初始化 + */ + private UIButton createTemplateButton(JTemplate template) { + UIButton button = new UIButton(TemplateUtils.createLockeTemplatedName(template, template.getTemplateName())); + button.setBorderPainted(false); + button.setExtraPainted(false); + button.setPreferredSize(new Dimension(menu.getWidth() - ITEM_SIZE * 2, ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + button.setHorizontalAlignment(SwingConstants.LEFT); + return button; + } + + /** + * item[2] 关闭模板图标按钮初始化 + */ + private UIButton createCloseButton() { + UIButton button = new UIButton(CLOSE, MOUSE_OVER_CLOSE, MOUSE_PRESS_CLOSE); + button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + button.setVisible(false); + return button; + } + + private void initListener(JTemplate template) { + initIconButtonListener(); + initTemplateButtonListener(template); + initCloseButtonListener(template); + } + + /** + * item[0] 模板图标按钮鼠标事件 + */ + private void initIconButtonListener() { + iconButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * item[1] 切换模板按钮鼠标事件 + */ + private void initTemplateButtonListener(JTemplate template) { + templateButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + menu.setVisible(false); + TemplateTabManager.getInstance().switchByJTemplate(template); + } + + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * item[2] 关闭模板按钮鼠标事件 + */ + private void initCloseButtonListener(JTemplate template) { + closeButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + menu.setVisible(false); + TemplateTabManager.getInstance().closeByJTemplate(template); + } + + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * mouse移入item范围 + */ + private void fireMouseEnteredEvent() { + iconButton.setBackground(UIConstants.HOVER_BLUE); + templateButton.setBackground(UIConstants.HOVER_BLUE); + closeButton.setBackground(UIConstants.HOVER_BLUE); + closeButton.setVisible(true); + } + + /** + * mouse移出item范围 + */ + private void fireMouseExitedEvent() { + iconButton.setBackground(UIConstants.NORMAL_BACKGROUND); + templateButton.setBackground(UIConstants.NORMAL_BACKGROUND); + closeButton.setBackground(UIConstants.NORMAL_BACKGROUND); + closeButton.setVisible(false); + } + + } + +} 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 8e302fd977..efc4565e00 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 @@ -1,38 +1,28 @@ package com.fr.design.file; -import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.base.svg.IconUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.file.LocateAction; import com.fr.design.constants.UIConstants; -import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; -import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.TemplateSavingChecker; -import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.TemplateUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; -import com.fr.design.worker.WorkerManager; -import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.file.FILE; -import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; -import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; import com.fr.third.javax.annotation.Nonnull; -import com.fr.workspace.WorkContext; -import com.fr.workspace.server.lock.TplOperator; import javax.swing.BorderFactory; import javax.swing.ButtonModel; @@ -41,7 +31,6 @@ import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.MenuElement; @@ -69,12 +58,6 @@ import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; -import java.util.List; - -import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; -import static javax.swing.JOptionPane.OK_CANCEL_OPTION; -import static javax.swing.JOptionPane.OK_OPTION; -import static javax.swing.JOptionPane.WARNING_MESSAGE; /** * 改个名字,一个拼写 n 个错误 @@ -114,10 +97,6 @@ public class MultiTemplateTabPane extends JComponent { private static MultiTemplateTabPane THIS; - //用于存放工作簿 - private java.util.List> openedTemplate; - //选中的Tab项 - private int selectedIndex = 0; // private int mouseOveredIndex = -1; @@ -136,16 +115,11 @@ public class MultiTemplateTabPane extends JComponent { //记录关闭按钮的状态 private int closeIconIndex = -1; - private boolean isCloseCurrent = false; + private Icon clodeMode = CLOSE; private Icon listDownMode = LIST_DOWN; private boolean isShowList = false; - //自动新建的模板B若没有进行任何编辑,切换到其他 - // - // 模板时,模板B会自动关闭 - private JTemplate temTemplate = null; - public static MultiTemplateTabPane getInstance() { if (THIS == null) { @@ -165,8 +139,6 @@ public class MultiTemplateTabPane extends JComponent { this.setBorder(null); this.setForeground(new Color(58, 56, 58)); this.setFont(DesignUtils.getDefaultGUIFont().applySize(12)); - openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); - selectedIndex = openedTemplate.size() - 1; AWTEventListener awt = new AWTEventListener() { @Override public void eventDispatched(AWTEvent event) { @@ -206,45 +178,13 @@ public class MultiTemplateTabPane extends JComponent { //根据当前i18n语言环境,动态调整popupMenu的宽度 menu.setPreferredSize(new Dimension((int) DesignSizeI18nManager.getInstance(). i18nDimension("com.fr.design.file.MultiTemplateTabPane.popUpMenu").getWidth(), height)); - GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), e.getX(), MultiTemplateTabPane.getInstance().getY() - 1 + MultiTemplateTabPane.getInstance().getHeight()); + GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, e.getX(), MultiTemplateTabPane.this.getY() - 1 + MultiTemplateTabPane.this.getHeight()); } } } }); } - enum CloseOption { - Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { - @Override - boolean shouldClose(int tplIndex, int i) { - return i < tplIndex; - } - }, - Right(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Right")) { - @Override - boolean shouldClose(int tplIndex, int i) { - return i > tplIndex; - } - }, - All(Toolkit.i18nText("Fine-Design_Close_All_templates")), - Others(Toolkit.i18nText("Fine-Design_Close_Other_templates")) { - @Override - boolean shouldClose(int tplIndex, int i) { - return i != tplIndex; - } - }; - - - String optionName; - - CloseOption(String optionName) { - this.optionName = optionName; - } - - boolean shouldClose(int tplIndex, int i) { - return true; - } - } private static class CloseMenuItemJSeparator extends JSeparator { @Override @@ -272,41 +212,10 @@ public class MultiTemplateTabPane extends JComponent { @Override public void actionPerformed(ActionEvent e) { - //处于搜索模式时,先退出搜索模式,再定位 - if (TemplateTreeSearchManager.getInstance().isInSearchMode()) { - TemplateTreeSearchManager.getInstance().outOfSearchMode(); - TemplateTreePane.getInstance().refreshDockingView(); - } - JTemplate template = openedTemplate.get(this.tplIndex); - locateTemplate(template); + //DefaultTemplateTabOperate.getInstance().locateTemplateInTree(this.tplIndex); + TemplateTabManager.getInstance().getCurrentOperator().locateTemplateInTree(this.tplIndex); } - private void locateTemplate(JTemplate template) { - FILE currentTemplate = template.getEditingFILE(); - //模板不属于当前环境,跟预览一样先提示保存,再定位模板 - //如果是拖拽进来的模板单单用exist不能判断,这边参考预览的判断逻辑(browserTemplate),补充一下 - if (!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) { - int selVal = showConfirmDialog( - DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), - Toolkit.i18nText("Fine-Design_Basic_Preview_Tool_Tips"), - OK_CANCEL_OPTION, - WARNING_MESSAGE - ); - if (OK_OPTION == selVal) { - CallbackSaveWorker worker = template.saveAs(); - worker.start(template.getRuntimeId()); - worker.addSuccessCallback(new Runnable() { - @Override - public void run() { - gotoEditingTemplateLeaf(template.getPath()); - } - }); - } - } else { - gotoEditingTemplateLeaf(template.getPath()); - } - } } private class RightMenuCloseAction extends UpdateAction { @@ -316,80 +225,15 @@ public class MultiTemplateTabPane extends JComponent { public RightMenuCloseAction(CloseOption option, int tplIndex) { this.option = option; - this.setName(option.optionName); + this.setName(option.getOptionName()); this.tplIndex = tplIndex; } @Override public void actionPerformed(ActionEvent e) { - SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); - if (saveSomeTempaltePane.showSavePane()) { - - 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); - - if (option == CloseOption.All) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); - } else { - DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); - } - - MultiTemplateTabPane.getInstance().repaint(); - } - } - - private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate) { - for (int i = 0; i < templates.length; i++) { - if (option.shouldClose(tplIndex, i)) { - JTemplate jTemplate = templates[i]; - if (jTemplate == currentTemplate) { - currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; - } - //判断关闭的模板是不是格式刷的被参照的模板 - openedTemplate.remove(jTemplate); - if (jTemplate != currentTemplate) { - MultiTemplateTabPane.getInstance().closeFormat(jTemplate); - HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); - closeAndFreeLock(jTemplate); - } - } - } - } - - private void closeAndFreeLock(@Nonnull JTemplate template) { - FILE file = template.getEditingFILE(); - // 只有是环境内的文件,才执行释放锁 - if (file != null && file.isEnvFile()) { - // release lock - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); - } - } - } - - public JTemplate getSelectedFile() { - if (openedTemplate.size() == selectedIndex) { - selectedIndex = Math.max(--selectedIndex, 0); - } - return openedTemplate.get(selectedIndex); - } - - - /** - * 关闭掉当前已打开文件列表中指定的文件 - * - * @param file 指定的文件 - */ - public void closeFileTemplate(FILE file) { - for (JTemplate temp : openedTemplate) { - if (ComparatorUtils.equals(file, temp.getEditingFILE())) { - closeSpecifiedTemplate(temp); - break; - } + TemplateTabManager.getInstance().getCurrentOperator().closeAction(option, this.tplIndex); + MultiTemplateTabPane.this.repaint(); } } @@ -409,7 +253,9 @@ public class MultiTemplateTabPane extends JComponent { closeOther.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (openedTemplate.size() == 1) { + //int tabSize = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); + int tabSize = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); + if (tabSize == 1) { return; } if (!TemplateSavingChecker.check()) { @@ -418,29 +264,28 @@ public class MultiTemplateTabPane extends JComponent { SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); //点击关闭其他模板,并且点击确定保存 if (saveSomeTempaltePane.showSavePane()) { - JTemplate[] panes = new JTemplate[openedTemplate.size()]; - for (int i = 0; i < openedTemplate.size(); i++) { - panes[i] = openedTemplate.get(i); + JTemplate[] panes = new JTemplate[tabSize]; + for (int i = 0; i < tabSize; i++) { + panes[i] = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); } for (int i = 0; i < panes.length; i++) { - if (i != selectedIndex) { + if (i != TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { JTemplate jTemplate = panes[i]; //判断关闭的模板是不是格式刷的被参照的模板 - openedTemplate.remove(jTemplate); - closeFormat(jTemplate); + TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().remove(jTemplate); + TemplateTabManager.getInstance().closeFormat(jTemplate); HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); closeAndFreeLock(jTemplate); } } JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - HistoryTemplateListCache.getInstance().removeAllHistory(); - DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); + TemplateTabManager.getInstance().resetSelectIndex(currentTemplate); THIS.repaint(); } //如果取消保存了,则不关闭其他模板 } }); - if (openedTemplate.size() == 1) { + if (TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() == 1) { closeOther.setEnabled(false); } return closeOther; @@ -448,21 +293,22 @@ public class MultiTemplateTabPane extends JComponent { private UIMenuItem[] createListDownTemplate() { - UIMenuItem[] templates = new UIMenuItem[openedTemplate.size()]; - for (int i = 0; i < openedTemplate.size(); i++) { + int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); + UIMenuItem[] templates = new UIMenuItem[templateTabCount]; + for (int i = 0; i < templateTabCount; i++) { final int index = i; - final JTemplate tem = openedTemplate.get(i); + final JTemplate tem = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); templates[i].setUI(new UIListDownItemUI()); setListDownItemPreferredSize(templates[i]); - if (i == selectedIndex) { + if (i == TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { //画选中的高亮 templates[i].setBackground(UIConstants.SHADOW_CENTER); } templates[i].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - selectedIndex = index; + TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(index); tem.activeNewJTemplate(); } }); @@ -478,68 +324,13 @@ public class MultiTemplateTabPane extends JComponent { private String tempalteShowName(JTemplate template) { - String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()); - if (!template.isSaved() && !name.endsWith(" *")) { - name += " *"; - } - return name; - } - - /** - * 刷新打开模板 - * - * @param history 模板 - */ - public void refreshOpenedTemplate(List> history) { - openedTemplate = history; - } - - public void setTemTemplate(JTemplate auotCreate) { - temTemplate = auotCreate; + return TemplateTabManager.getInstance().getTemplateShowName(template); } private void showListDown() { - - UIScrollPopUpMenu menu = new UIScrollPopUpMenu(); - menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); - menu.add(initCloseOther()); - JSeparator separator = new JSeparator() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }; - menu.add(new JPanel() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }); - separator.setForeground(UIConstants.LINE_COLOR); - menu.add(separator); - menu.add(new JPanel() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }); - UIMenuItem[] items = createListDownTemplate(); - for (int i = 0; i < items.length; i++) { - menu.add(items[i]); - } - GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), MultiTemplateTabPane.getInstance().getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); - } - - - public void setSelectedIndex(int index) { - selectedIndex = index; + UIScrollPopUpMenu menu = MultiTemplateTabMenuFactory.getInstance().createMenu(); + GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, MultiTemplateTabPane.this.getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); } @@ -566,15 +357,18 @@ public class MultiTemplateTabPane extends JComponent { paintDefaultBackground(g2d); //最多能画的个数 int maxTemplateNum = (int) (maxWidth) / MINWIDTH; + int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); + int currentSelectedIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); //计算开始画的最小模板index和最大模板index calMinAndMaxIndex(maxTemplateNum); calculateRealAverageWidth(maxWidth, maxTemplateNum); int maxStringlength = calculateStringMaxLength(); - if (selectedIndex >= openedTemplate.size()) { - selectedIndex = openedTemplate.size() - 1; + if ( currentSelectedIndex >= templateTabCount) { + TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex( + templateTabCount - 1); } - if (selectedIndex < 0) { - selectedIndex = 0; + if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() < 0) { + TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(0); } double templateStartX = 0; startX = new int[maxPaintIndex - minPaintIndex + 1]; @@ -582,7 +376,7 @@ public class MultiTemplateTabPane extends JComponent { //从可以开始展示在tab面板上的tab开始画 for (int i = minPaintIndex; i <= maxPaintIndex; i++) { - JTemplate template = openedTemplate.get(i); + JTemplate template = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); Icon icon = template.getIcon(); String name = tempalteShowName(template); //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 @@ -599,7 +393,7 @@ public class MultiTemplateTabPane extends JComponent { } else { selectedIcon = CLOSE; } - if (i == selectedIndex) { + if (i == TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { if (template.isSaving()) { selectedIcon = WHITE_SAVING_CLOSE_ICON; } @@ -608,7 +402,7 @@ public class MultiTemplateTabPane extends JComponent { if (template.isSaving()) { selectedIcon = GREY_SAVING_CLOSE_ICON; } - boolean isLeft = i < selectedIndex; + boolean isLeft = i < TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); } templateStartX += realWidth; @@ -684,38 +478,39 @@ public class MultiTemplateTabPane extends JComponent { } private void calMinAndMaxIndex(int maxTemplateNum) { + int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); //如果个数大于最多能容纳的个数,则多余的进行处理 - if (openedTemplate.size() > maxTemplateNum) { + if (templateTabCount > maxTemplateNum) { //所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现 - if (selectedIndex >= maxPaintIndex) { - minPaintIndex = selectedIndex - maxTemplateNum + 1; - maxPaintIndex = selectedIndex; + if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= maxPaintIndex) { + minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; + maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); if (minPaintIndex <= 0) { minPaintIndex = 0; maxPaintIndex = maxTemplateNum - 1; } - } else if (selectedIndex <= minPaintIndex) { + } else if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() <= minPaintIndex) { //所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现 - minPaintIndex = selectedIndex; + minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); maxPaintIndex = minPaintIndex + maxTemplateNum - 1; - if (maxPaintIndex > openedTemplate.size() - 1) { - maxPaintIndex = openedTemplate.size() - 1; + if (maxPaintIndex > templateTabCount- 1) { + maxPaintIndex = templateTabCount - 1; } } else { - if (selectedIndex >= openedTemplate.size() - 1) { - selectedIndex = openedTemplate.size() - 1; - maxPaintIndex = selectedIndex; - minPaintIndex = selectedIndex - maxTemplateNum + 1; + if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= templateTabCount - 1) { + TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(templateTabCount - 1); + maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); + minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; } else { maxPaintIndex = minPaintIndex + maxTemplateNum - 1; - if (maxPaintIndex > openedTemplate.size() - 1) { - maxPaintIndex = openedTemplate.size() - 1; + if (maxPaintIndex > templateTabCount - 1) { + maxPaintIndex = templateTabCount - 1; } } } } else { minPaintIndex = 0; - maxPaintIndex = openedTemplate.size() - 1; + maxPaintIndex = templateTabCount - 1; } } @@ -723,7 +518,7 @@ public class MultiTemplateTabPane extends JComponent { //个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 private void calculateRealAverageWidth(double maxwidth, int templateNum) { - int num = openedTemplate.size() > templateNum ? templateNum : openedTemplate.size(); + int num = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() > templateNum ? templateNum : TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); realWidth = (int) (maxwidth / (num)); if (realWidth > MAXWIDTH) { realWidth = MAXWIDTH; @@ -888,50 +683,6 @@ public class MultiTemplateTabPane extends JComponent { } - public void setIsCloseCurrent(boolean isCloseCurrent) { - this.isCloseCurrent = isCloseCurrent; - - } - - /** - * 关闭模板 - * - * @param specifiedTemplate 模板 - */ - public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { - if (specifiedTemplate == null) { - return; - } - - if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { - specifiedTemplate.stopEditing(); - int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", - Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (returnVal == JOptionPane.YES_OPTION) { - CallbackSaveWorker worker = specifiedTemplate.save(); - worker.addSuccessCallback(new Runnable() { - @Override - public void run() { - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); - closeTpl(specifiedTemplate); - } - }); - worker.start(specifiedTemplate.getRuntimeId()); - } else if (returnVal == JOptionPane.NO_OPTION) { - closeTpl(specifiedTemplate); - } - } else { - closeTpl(specifiedTemplate); - } - - } - - private void closeTpl(@Nonnull JTemplate specifiedTemplate) { - HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); - closeAndFreeLock(specifiedTemplate); - activePrevTemplateAfterClose(); - } - private void closeAndFreeLock(@Nonnull JTemplate template) { FILE file = template.getEditingFILE(); // 只有是环境内的文件,才执行释放锁 @@ -941,70 +692,6 @@ public class MultiTemplateTabPane extends JComponent { } } - /** - * 后台关闭当前编辑模板 - */ - public void closeCurrentTpl() { - JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - this.setIsCloseCurrent(true); - this.closeFormat(jTemplate); - this.closeSpecifiedTemplate(jTemplate); - } - - /** - * 关闭模板 - * - * @param closedTemplate 模板 - */ - public void closeFormat(JTemplate closedTemplate) { - //表单不需要处理 - if (!closedTemplate.isJWorkBook()) { - return; - } - - if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) { - return; - } - - //是被参照的模板被关闭,则重置格式刷 - closedTemplate.doConditionCancelFormat(); - } - - /** - * 关闭掉一个模板之后激活新的待显示模板 - */ - public void activePrevTemplateAfterClose() { - if (openedTemplate.isEmpty()) { - //新建并激活模板 - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); - selectedIndex = 0; - //此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate - temTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - - } else { - // 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板; - // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 - if (closeIconIndex == selectedIndex || isCloseCurrent) { - // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 - if (selectedIndex >= maxPaintIndex) { - // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true - selectedIndex--; - } - isCloseCurrent = false; - } - // 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index - else { - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - selectedIndex = HistoryTemplateListCache.getInstance().contains(template); - } - if (selectedIndex < openedTemplate.size()) { - //如果是已后台关闭的模板,则重新打开文件 - openedTemplate.get(selectedIndex).activeOldJTemplate(); - } - - } - } - private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; @@ -1036,29 +723,6 @@ public class MultiTemplateTabPane extends JComponent { return -1; } - - /** - * 处理自动新建的模板 在切换时的处理 - */ - public void doWithtemTemplate() { - //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 - //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 - if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { - return; - } - - if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) { - temTemplate = null; - } - - //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 - if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { - HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate); - temTemplate = null; - setSelectedIndex(HistoryTemplateListCache.getInstance().contains(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())); - } - } - private class UIListDownItemUI extends BasicMenuItemUI { @Override protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { @@ -1161,44 +825,13 @@ public class MultiTemplateTabPane extends JComponent { closeIconIndex = getTemplateIndex(evtX); clodeMode = MOUSE_PRESS_CLOSE; //关闭close图标所在的模板{ - JTemplate template = openedTemplate.get(closeIconIndex); - if (template.isOpening()) { - WorkerManager.getInstance().cancelWorker(template.getPath()); - } else if (template.isSaving()) { - boolean completed = WorkerManager.getInstance().isCompleted(template.getTarget().getTemplateID()); - if (!completed) { - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Close_Template_Tip", template.getEditingFILE().getName())); - return; - } - } - //参考CloseCurrentTemplateAction,在closeFormat与closeSpecifiedTemplate之前要先设定isCloseCurrent,这样关闭之后才会自动切换tab - if (checkCurrentClose(template)) { - setIsCloseCurrent(true); - } - closeFormat(template); - closeSpecifiedTemplate(template); - DesignerContext.getDesignerFrame().getContentFrame().repaint(); + TemplateTabManager.getInstance().getCurrentOperator().closeByIndex(closeIconIndex); isShowList = false; } else { //没有点击关闭和ListDown按钮,则切换到点击的模板处 closeIconIndex = -1; clodeMode = CLOSE; - int tempSelectedIndex = selectedIndex; - if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) { - openedTemplate.get(selectedIndex).stopEditing(); - selectedIndex = getTemplateIndex(evtX); - //如果在权限编辑情况下,不允许切换到表单类型的工作簿 - if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") - + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); - MultiTemplateTabPane.this.repaint(); - return; - } - JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); - evtXTemplate.activeNewJTemplate(); - } + TemplateTabManager.getInstance().getCurrentOperator().switchTpl(getTemplateIndex(evtX)); isShowList = false; } MultiTemplateTabPane.this.repaint(); @@ -1209,11 +842,6 @@ public class MultiTemplateTabPane extends JComponent { } - private boolean checkCurrentClose(JTemplate template) { - JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - return JTemplate.isValid(currentTemplate) && ComparatorUtils.equals(template.getPath(), currentTemplate.getPath()); - } - private class MultiTemplateTabMouseMotionListener implements MouseMotionListener { /** * 鼠标拖拽 @@ -1237,7 +865,7 @@ public class MultiTemplateTabPane extends JComponent { //看是否需要显示toolTip if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { - setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); + setToolTipText(TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(mouseOveredIndex).getEditingFILE().getName()); } else { setToolTipText(null); } diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index 36e0b58754..d92533552c 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -1,5 +1,7 @@ package com.fr.design.file; +import com.fr.design.file.impl.DefaultTemplateTabOperate; + /** * @author shine * @version 10.0 @@ -14,11 +16,11 @@ public class MutilTempalteTabPane { } public void setIsCloseCurrent(boolean b) { - MultiTemplateTabPane.getInstance().setIsCloseCurrent(b); + TemplateTabManager.getInstance().setCloseCurrent(b); } public void activePrevTemplateAfterClose() { - MultiTemplateTabPane.getInstance().activePrevTemplateAfterClose(); + DefaultTemplateTabOperate.getInstance().activePrevTemplateAfterClose(true); } } diff --git a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java index dae921a1c8..9949888349 100644 --- a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java @@ -81,11 +81,15 @@ public abstract class NewTemplatePane extends JComponent implements MouseListene } if (isOverNewIcon(evtX) && newWorkBookIconMode != GRAY_NEW_CPT) { newWorkBookIconMode = getMousePressNew(); - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + createNewTemplate(); } this.repaint(); } + protected void createNewTemplate() { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } + /** *鼠标松开 * @param e 事件 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 72945b31c9..96d72d34c1 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 @@ -3,8 +3,8 @@ package com.fr.design.file; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; -import com.fr.design.dialog.FineJOptionPane; import com.fr.design.event.StateChangeListener; +import com.fr.design.file.impl.DefaultTemplateTabOperate; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; @@ -19,10 +19,10 @@ import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import javax.swing.*; -import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; +import java.util.List; /** * Author : daisy @@ -152,7 +152,16 @@ public class SaveSomeTemplatePane extends BasicPane { public boolean showSavePane() { - populate(); + return showSavePane(false); + } + + public boolean showSavePane(boolean switchEnv) { + return switchEnv ? + showSavePane(DefaultTemplateTabOperate.getInstance().getOpenedJTemplates()) : + showSavePane(HistoryTemplateListPane.getInstance().getHistoryList()); + } + public boolean showSavePane(List> jTemplates) { + populate(jTemplates); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { dialog.setVisible(true); @@ -162,8 +171,8 @@ public class SaveSomeTemplatePane extends BasicPane { return isAllSaved; } - public void populate() { - java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); + + private void populate(java.util.List> opendedTemplate) { JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); for (int i = 0; i < opendedTemplate.size(); i++) { if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) { diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java new file mode 100644 index 0000000000..22a0bc37e4 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java @@ -0,0 +1,253 @@ +package com.fr.design.file; + +import com.finebi.cbb.utils.CompareUtils; +import com.fr.design.file.impl.DefaultTemplateTabOperate; +import com.fr.design.file.impl.EmptyTemplateTabOperator; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.file.FILE; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TemplateTabManager { + private static class HOLDER { + private static final TemplateTabManager singleton = new TemplateTabManager(); + } + + public static TemplateTabManager getInstance() { + return HOLDER.singleton; + } + + private TemplateTabManager() { + list.add(DefaultTemplateTabOperate.getInstance()); + } + + private List list = new ArrayList<>(); + + public void register(TemplateTabOperateProvider templateTabOperateProvider) { + this.list.add(templateTabOperateProvider); + } + + public void remove(TemplateTabOperateProvider templateTabOperateProvider) { + this.list.remove(templateTabOperateProvider); + } + + private boolean isCloseCurrent = false; + //自动新建的模板B若没有进行任何编辑,切换到其他 + + // 模板时,模板B会自动关闭 + private JTemplate temTemplate = null; + + + public boolean isCloseCurrent() { + return isCloseCurrent; + } + + public void setCloseCurrent(boolean closeCurrent) { + isCloseCurrent = closeCurrent; + } + + public void setTemTemplate(JTemplate temTemplate) { + this.temTemplate = temTemplate; + } + + public void refresh() { + getCurrentOperator().refresh(); + } + + /** + * 从模板树删除文件 + */ + public void deleteOpenedTemplate(JTemplate template) { + TemplateTabOperateProvider provider = getOperatorByTemplate(template); + provider.deleteOpenedTemplate(template); + this.refresh(); + } + + public JTemplate getSelectedFile() { + return getCurrentOperator().getSelectedFile(); + } + + /** + * 关闭掉当前文件列表中指定的文件 + * + * @param file 指定的文件 + */ + public void closeFileTemplate(FILE file) { + for (TemplateTabOperateProvider provider : list) { + provider.closeFileTemplate(file); + } + } + + /** + * 关闭指定模板 + * + * @param specifiedTemplate + */ + public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { + getCurrentOperator().closeSpecifiedTemplate(specifiedTemplate); + } + + + /** + * 刷新打开模板 + * + * @param tempalteLsit + */ + public void refreshOpenedTemplate(List> tempalteLsit) { + for (TemplateTabOperateProvider provider : list) { + provider.refreshOpenedTemplate(tempalteLsit); + } + } + + + /** + * 处理自动新建的模板 在切换时的处理 + */ + public void doWithtemTemplate() { + //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 + //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 + if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { + return; + } + + if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) { + temTemplate = null; + } + + //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 + if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { + HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate); + temTemplate = null; + resetSelectIndex(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + } + } + + + public void resetSelectIndex(JTemplate jTemplate) { + getCurrentOperator().resetSelectIndex(jTemplate); + } + + + public void activeNewTemplate() { + //先看其他模式中是否有已打开的模板,有的话切换过去 + for (TemplateTabOperateProvider templateTabOperateProvider : list) { + if (templateTabOperateProvider.getOpenedJTemplates().size() != 0) { + templateTabOperateProvider.getSelectedFile().activeNewJTemplate(); + refresh(); + return; + + } + } + //都没有的话,新建并激活模板 + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + //此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate + TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + refresh(); + } + + /** + * 后台关闭当前编辑模板 + */ + public void closeCurrentTpl() { + JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + this.setCloseCurrent(true); + this.closeFormat(jTemplate); + this.closeSpecifiedTemplate(jTemplate); + } + + + /** + * 关闭指定索引值模板 + * + * @param index + */ + public void closeByIndex(int index) { + getCurrentOperator().closeByIndex(index); + } + + /** + * 关闭指定索引值模板 + * + * @param jTemplate + */ + public void closeByJTemplate(JTemplate jTemplate) { + TemplateTabOperateProvider operator = getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType()); + operator.closeByIndex(operator.getJTemplateIndex(jTemplate)); + } + + /** + * 切换到指定tab栏的指定索引值模板 + * + * @param jTemplate + */ + public void switchByJTemplate(JTemplate jTemplate) { + TemplateTabOperateProvider operator = getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType()); + operator.switchTpl(operator.getJTemplateIndex(jTemplate)); + } + + /** + * 获取所有打开的模板map + * + * @return + */ + public Map>> getAllOpenedTemplateMap() { + Map>> resultMap = new HashMap<>(); + for (TemplateTabOperateProvider provider : list) { + resultMap.put(provider.getOperatorType(), provider.getOpenedJTemplates()); + } + return resultMap; + } + + public void closeOthers() { + TemplateTabOperateProvider currentOperator = getCurrentOperator(); + currentOperator.closeAction(CloseOption.Others, + currentOperator.getJTemplateIndex(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())); + } + + public String getTemplateShowName(JTemplate temTemplate){ + return getCurrentOperator().getTemplateShowName(temTemplate); + } + + + /** + * 关闭模板 + * + * @param closedTemplate 模板 + */ + public void closeFormat(JTemplate closedTemplate) { + //表单不需要处理 + if (!closedTemplate.isJWorkBook()) { + return; + } + + if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) { + return; + } + + //是被参照的模板被关闭,则重置格式刷 + closedTemplate.doConditionCancelFormat(); + } + + + public TemplateTabOperateProvider getCurrentOperator() { + return getOperatorByTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + } + + private TemplateTabOperateProvider getOperatorByTemplate(JTemplate jTemplate) { + return getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType()); + } + + private TemplateTabOperateProvider getOperatorByOperatorType(String type) { + for (TemplateTabOperateProvider provider : list) { + if (CompareUtils.isEqual(provider.getOperatorType(), type)) { + return provider; + } + } + return EmptyTemplateTabOperator.getInstance(); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java new file mode 100644 index 0000000000..ff913f3342 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java @@ -0,0 +1,114 @@ +package com.fr.design.file; + + +import com.fr.design.mainframe.JTemplate; +import com.fr.file.FILE; + +import java.util.List; + +public interface TemplateTabOperateProvider { + /** + * 找到模板树中的位置 + */ + void locateTemplateInTree(int tplIndex); + + + /** + * 右键一系列关闭操作 + * + * @param option closeType + * @param index + */ + void closeAction(CloseOption option, int index); + + + /** + * 切换模板 + * + * @param templateIndex 模板索引值 + */ + void switchTpl(int templateIndex); + + + /** + * 获取打开模板的基本信息 + * + * @return + */ + List> getOpenedJTemplates(); + + + void closeByIndex(int index); + /** + * 关闭指定模板 + * + * @param specifiedTemplate + */ + void closeSpecifiedTemplate(JTemplate specifiedTemplate); + /** + * 删除已打开的模板 + */ + void deleteOpenedTemplate(JTemplate template); + + /** + * 获取选中模板 + * @return + */ + JTemplate getSelectedFile(); + + /** + * 刷新ui + */ + void refresh(); + + /** + * 重置下选中的Index + * @param jTemplate + */ + void resetSelectIndex(JTemplate jTemplate); + + /** + * 刷新下打开的模板list + * @param list + */ + void refreshOpenedTemplate(List> list); + + /** + * 关闭指定节点 + * @param file + */ + void closeFileTemplate(FILE file); + + /** + * 获取操作类型标识 + * @return + */ + String getOperatorType(); + + /** + * 获取当前选中模板的index + * @return + */ + int getSelectIndex(); + + /** + * 设置当前选中模板的index + * @return + */ + void setSelectIndex(int index); + + /** + * 获取指定模板在operator中的索引值 + * @param jTemplate + * @return + */ + int getJTemplateIndex(JTemplate jTemplate); + + /** + * 获取template在tab中显示的名称 + * @param jTemplate + * @return + */ + String getTemplateShowName(JTemplate jTemplate); + +} diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java new file mode 100644 index 0000000000..b6bee6e6d8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java @@ -0,0 +1,332 @@ +package com.fr.design.file.impl; + +import com.finebi.cbb.utils.CompareUtils; +import com.fr.base.vcs.DesignerMode; +import com.fr.design.actions.file.LocateAction; +import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.file.CloseOption; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.SaveSomeTemplatePane; +import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.TemplateTabOperateProvider; +import com.fr.design.file.TemplateTreePane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; +import com.fr.design.utils.TemplateUtils; +import com.fr.design.worker.WorkerManager; +import com.fr.design.worker.save.CallbackSaveWorker; +import com.fr.file.FILE; +import com.fr.file.FileNodeFILE; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.third.javax.annotation.Nonnull; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.lock.TplOperator; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; +import static javax.swing.JOptionPane.*; + +public abstract class AbstractTemplateTabOperate implements TemplateTabOperateProvider { + //用于存放工作簿 + protected java.util.List> openedTemplate = new ArrayList<>(); + //选中的Tab项 + protected int selectedIndex = -1; + + public AbstractTemplateTabOperate() { + + } + + @Override + public void locateTemplateInTree(int tplIndex) { + //处于搜索模式时,先退出搜索模式,再定位 + if (TemplateTreeSearchManager.getInstance().isInSearchMode()) { + TemplateTreeSearchManager.getInstance().outOfSearchMode(); + TemplateTreePane.getInstance().refreshDockingView(); + } + JTemplate template = openedTemplate.get(tplIndex); + locateTemplate(template); + } + + private void locateTemplate(JTemplate template) { + FILE currentTemplate = template.getEditingFILE(); + //模板不属于当前环境,跟预览一样先提示保存,再定位模板 + //如果是拖拽进来的模板单单用exist不能判断,这边参考预览的判断逻辑(browserTemplate),补充一下 + if ((!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) && template.canBeSaved()) { + int selVal = showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), Toolkit.i18nText("Fine-Design_Basic_Preview_Tool_Tips"), OK_CANCEL_OPTION, WARNING_MESSAGE); + if (OK_OPTION == selVal) { + CallbackSaveWorker worker = template.saveAs(); + worker.start(template.getRuntimeId()); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + LocateAction.gotoEditingTemplateLeaf(template.getPath()); + } + }); + } + } else { + LocateAction.gotoEditingTemplateLeaf(template.getPath()); + } + } + + @Override + public void closeAction(CloseOption option, int index) { + SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(true); + if (saveSomeTempaltePane.showSavePane(this.openedTemplate)) { + + 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, option, index); + + if (openedTemplate.isEmpty()) { + TemplateTabManager.getInstance().activeNewTemplate(); + selectedIndex = 0; + } else { + DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); + } + } + } + + public void closeByIndex(int index) { + //关闭close图标所在的模板{ + JTemplate template = openedTemplate.get(index); + if (template.isOpening()) { + WorkerManager.getInstance().cancelWorker(template.getPath()); + } else if (template.isSaving()) { + boolean completed = WorkerManager.getInstance().isCompleted(template.getTarget().getTemplateID()); + if (!completed) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Close_Template_Tip", template.getEditingFILE().getName())); + return; + } + } + //参考CloseCurrentTemplateAction,在closeFormat与closeSpecifiedTemplate之前要先设定isCloseCurrent,这样关闭之后才会自动切换tab + if (checkCurrentClose(template)) { + TemplateTabManager.getInstance().setCloseCurrent(true); + } + TemplateTabManager.getInstance().closeFormat(template); + closeSpecifiedTemplate(template); + DesignerContext.getDesignerFrame().getContentFrame().repaint(); + } + + private boolean checkCurrentClose(JTemplate template) { + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + return JTemplate.isValid(currentTemplate) && ComparatorUtils.equals(template.getPath(), currentTemplate.getPath()); + } + + private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate, CloseOption option, int tplIndex) { + for (int i = 0; i < templates.length; i++) { + if (option.shouldClose(tplIndex, i)) { + JTemplate jTemplate = templates[i]; + if (jTemplate == currentTemplate) { + currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; + } + //判断关闭的模板是不是格式刷的被参照的模板 + openedTemplate.remove(jTemplate); + if (jTemplate != currentTemplate) { + TemplateTabManager.getInstance().closeFormat(jTemplate); + HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); + closeAndFreeLock(jTemplate); + } + } + } + } + + private void closeAndFreeLock(@Nonnull JTemplate template) { + FILE file = template.getEditingFILE(); + // 只有是环境内的文件,才执行释放锁 + if (file != null && file.isEnvFile()) { + // release lock + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); + } + } + + @Override + public void switchTpl(int templateIndex) { + int tempSelectedIndex = selectedIndex; + JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if ((selectedIndex != templateIndex || !this.accept(jTemplate.getTemplateTabOperatorType())) + && templateIndex != -1) { + openedTemplate.get(selectedIndex).stopEditing(); + selectedIndex = templateIndex; + //如果在权限编辑情况下,不允许切换到表单类型的工作簿 + if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); + return; + } + JTemplate evtXTemplate = openedTemplate.get(templateIndex); + evtXTemplate.activeNewJTemplate(); + } + } + + @Override + public void deleteOpenedTemplate(JTemplate template) { + if (!openedTemplate.contains(template)) { + return; + } + openedTemplate.remove(template); + if (openedTemplate.size() == 0) { + TemplateTabManager.getInstance().activeNewTemplate(); + return; + } + if (openedTemplate.size() == selectedIndex) { + //如果删除的是后一个Tab,则定位到前一个 + this.selectedIndex--; + } + } + + @Override + public JTemplate getSelectedFile() { + if (openedTemplate.size() == selectedIndex) { + selectedIndex = Math.max(--selectedIndex, 0); + } + return openedTemplate.get(selectedIndex); + } + + + /** + * 关闭掉当前已打开文件列表中指定的文件 + * + * @param file 指定的文件 + */ + public void closeFileTemplate(FILE file) { + for (JTemplate temp : openedTemplate) { + if (ComparatorUtils.equals(file, temp.getEditingFILE())) { + closeSpecifiedTemplate(temp); + break; + } + } + + } + + + /** + * 关闭模板 + * + * @param specifiedTemplate 模板 + */ + public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { + if (specifiedTemplate == null && !openedTemplate.contains(specifiedTemplate)) { + return; + } + + if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { + specifiedTemplate.stopEditing(); + int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (returnVal == JOptionPane.YES_OPTION) { + CallbackSaveWorker worker = specifiedTemplate.save(); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + closeTpl(specifiedTemplate); + } + }); + worker.start(specifiedTemplate.getRuntimeId()); + } else if (returnVal == JOptionPane.NO_OPTION) { + closeTpl(specifiedTemplate); + } + } else { + closeTpl(specifiedTemplate); + } + + } + + private void closeTpl(@Nonnull JTemplate specifiedTemplate) { + HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); + closeAndFreeLock(specifiedTemplate); + activePrevTemplateAfterClose(specifiedTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + } + + /** + * 关闭掉一个模板之后激活新的待显示模板 + */ + public void activePrevTemplateAfterClose(boolean isCurrentSelectedTpl) { + if (openedTemplate.isEmpty()) { + TemplateTabManager.getInstance().activeNewTemplate(); + selectedIndex = 0; + } else { + // 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板; + // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 + if (isCurrentSelectedTpl || TemplateTabManager.getInstance().isCloseCurrent()) { + // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 + if (selectedIndex >= openedTemplate.size()) { + // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true + selectedIndex--; + } + TemplateTabManager.getInstance().setCloseCurrent(false); + } + // 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index + else { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + selectedIndex = this.openedTemplate.indexOf(template); + } + if (selectedIndex < openedTemplate.size()) { + //如果是已后台关闭的模板,则重新打开文件 + openedTemplate.get(selectedIndex).activeOldJTemplate(); + } + + } + TemplateTabManager.getInstance().refresh(); + } + + @Override + public void resetSelectIndex(JTemplate jTemplate) { + this.selectedIndex = openedTemplate.indexOf(jTemplate); + TemplateTabManager.getInstance().refresh(); + } + + public void refreshOpenedTemplate(List> list) { + List> result = new ArrayList<>(); + for (JTemplate jTemplate : list) { + if (this.accept(jTemplate.getTemplateTabOperatorType())) { + result.add(jTemplate); + } + } + this.openedTemplate = result; + TemplateTabManager.getInstance().refresh(); + } + + public List> getOpenedJTemplates() { + return this.openedTemplate; + } + + @Override + public void setSelectIndex(int index) { + this.selectedIndex = index; + } + + @Override + public int getSelectIndex() { + return this.selectedIndex; + } + + @Override + public int getJTemplateIndex(JTemplate jTemplate) { + return this.openedTemplate.indexOf(jTemplate); + } + + public boolean accept(String type) { + return CompareUtils.isEqual(getOperatorType(), type); + } + + + @Override + public String getTemplateShowName(JTemplate template) { + String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()); + if (!template.isSaved() && !name.endsWith(" *")) { + name += " *"; + } + return name; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java new file mode 100644 index 0000000000..511b74894f --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java @@ -0,0 +1,31 @@ +package com.fr.design.file.impl; + +import com.fr.design.file.MultiTemplateTabPane; + +public class DefaultTemplateTabOperate extends AbstractTemplateTabOperate { + + public static final String OPERATOR_TYPE = "DEFAULT_TEMPLATE_TAB_OPERATOR"; + + private static class HOLDER { + private static final DefaultTemplateTabOperate singleton = new DefaultTemplateTabOperate(); + } + + private DefaultTemplateTabOperate() { + super(); + } + + public static DefaultTemplateTabOperate getInstance() { + return HOLDER.singleton; + } + + @Override + public void refresh() { + MultiTemplateTabPane.getInstance().repaint(); + } + + @Override + public String getOperatorType() { + return OPERATOR_TYPE; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java new file mode 100644 index 0000000000..804874138d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java @@ -0,0 +1,109 @@ +package com.fr.design.file.impl; + +import com.fr.design.file.CloseOption; +import com.fr.design.file.TemplateTabOperateProvider; +import com.fr.design.mainframe.JTemplate; +import com.fr.file.FILE; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { + private static class HOLDER { + private static final EmptyTemplateTabOperator singleton = new EmptyTemplateTabOperator(); + } + + + private EmptyTemplateTabOperator() { + + } + + public static EmptyTemplateTabOperator getInstance() { + return HOLDER.singleton; + } + + @Override + public void locateTemplateInTree(int tplIndex) { + + } + + @Override + public void closeAction(CloseOption option, int index) { + + } + + @Override + public void closeByIndex(int index) { + + } + + @Override + public void switchTpl(int templateIndex) { + + } + + @Override + public List> getOpenedJTemplates() { + return new ArrayList<>(); + } + + @Override + public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { + + } + + @Override + public void deleteOpenedTemplate(JTemplate template) { + + } + + @Override + public JTemplate getSelectedFile() { + return null; + } + + @Override + public void refresh() { + + } + + @Override + public void resetSelectIndex(JTemplate jTemplate) { + + } + + @Override + public void refreshOpenedTemplate(List> list) { + + } + + @Override + public void closeFileTemplate(FILE file) { + + } + @Override + public String getOperatorType() { + return StringUtils.EMPTY; + } + + @Override + public int getSelectIndex() { + return 0; + } + + @Override + public void setSelectIndex(int index) { + + } + + @Override + public int getJTemplateIndex(JTemplate jTemplate) { + return 0; + } + + @Override + public String getTemplateShowName(JTemplate jTemplate) { + return StringUtils.EMPTY; + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index b18b346525..63c00deaaf 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -230,12 +230,11 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); - if (strategy.hasToolBarPane(plus)) { - this.add(toolbarPane, BorderLayout.NORTH); - } else { - this.remove(toolbarPane); + JPanel customNorthPane = strategy.customNorthPane(toolbarPane,plus); + if (!isExist(customNorthPane)){ + this.removeNorth(); + this.add(customNorthPane, BorderLayout.NORTH); } - if (strategy.hasTemplateTabPane(plus)) { eastCenterPane.add(templateTabPane, BorderLayout.CENTER); } else { @@ -250,6 +249,26 @@ public class CenterRegionContainerPane extends JPanel { resetByDesignMode(); } + private void removeNorth(){ + Component[] components = this.getComponents(); + for(Component c : components){ + if (c!= centerTemplateCardPane){ + this.remove(c); + } + } + } + + + private boolean isExist(JPanel customNorthPane) { + Component[] components = this.getComponents(); + for (Component component : components) { + if (component == customNorthPane) { + return true; + } + } + return false; + } + private void resetByDesignMode() { if (DesignModeContext.isDuchampMode()) { eastPane.remove(largeToolbar); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java b/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java index 305c44aa21..581dc54cb8 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java @@ -3,6 +3,9 @@ package com.fr.design.mainframe; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; +import javax.swing.JPanel; + + public class DefaultToolKitConfig implements ToolKitConfigStrategy { @Override public boolean hasTemplateTabPane(ToolBarMenuDockPlus plus) { @@ -18,4 +21,9 @@ public class DefaultToolKitConfig implements ToolKitConfigStrategy { public boolean hasToolBarPane(ToolBarMenuDockPlus plus) { return plus.hasToolBarPane(); } + + @Override + public JPanel customNorthPane(JPanel toolBarPane, ToolBarMenuDockPlus plus) { + return toolBarPane; + } } 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..2f05dbbeb2 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 @@ -19,11 +19,7 @@ import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.event.DesignerOpenedListener; import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MultiTemplateTabPane; -import com.fr.design.file.SaveSomeTemplatePane; -import com.fr.design.file.TemplateTreePane; +import com.fr.design.file.*; import com.fr.design.fun.OemProcessor; import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider; import com.fr.design.gui.iprogressbar.ProgressDialog; @@ -1110,7 +1106,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta // 新的form不往前兼容 if (inValidDesigner(jt)) { this.addAndActivateJTemplate(); - MultiTemplateTabPane.getInstance().setTemTemplate( + TemplateTabManager.getInstance().setTemTemplate( HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); } else { this.addAndActivateJTemplate(jt); 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..a07bfe1f1d 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 @@ -17,12 +17,7 @@ import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.data.tabledata.ResponseDataSourceChange; import com.fr.design.dialog.FineJOptionPane; -import com.fr.design.file.FileOperations; -import com.fr.design.file.FileToolbarStateChangeListener; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MultiTemplateTabPane; -import com.fr.design.file.TemplateTreePane; +import com.fr.design.file.*; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenuHighLight; @@ -275,7 +270,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); HistoryTemplateListPane.getInstance().setCurrentEditingTemplate(jt); //处理自动新建的模板 - MultiTemplateTabPane.getInstance().doWithtemTemplate(); + TemplateTabManager.getInstance().doWithtemTemplate(); if (DesignerMode.isAuthorityEditing()) { RolesAlreadyEditedPane.getInstance().refreshDockingView(); } @@ -547,10 +542,10 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { if (isCurrentEditing) { - MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); + TemplateTabManager.getInstance().setCloseCurrent(true); } - MultiTemplateTabPane.getInstance().closeFormat(jTemplate); - MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jTemplate); + TemplateTabManager.getInstance().closeFormat(jTemplate); + TemplateTabManager.getInstance().closeSpecifiedTemplate(jTemplate); return; } } 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 0082e091f3..b8fef1b007 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 @@ -30,9 +30,8 @@ import com.fr.design.designer.DesignerProxy; import com.fr.design.designer.TargetComponent; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.InformationWarnPane; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.TemplateResourceManager; +import com.fr.design.file.*; +import com.fr.design.file.impl.DefaultTemplateTabOperate; import com.fr.design.fun.DesignerFrameUpButtonProvider; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.PreviewProvider; @@ -615,7 +614,7 @@ public abstract class JTemplate> * @return 是则返回true */ public boolean isALLSaved() { - return this.saved && this.authoritySaved; + return this.saved && this.authoritySaved && this.canBeSaved(); } @@ -1979,7 +1978,11 @@ public abstract class JTemplate> public void setDesignerUIMode() { DesignerUIModeConfig.getInstance().setAbsoluteMeasureUIMode(); } - + + public String getTemplateTabOperatorType(){ + return DefaultTemplateTabOperate.OPERATOR_TYPE; + } + /** * 判断当前的模板是否是有效的模板 * @@ -1989,4 +1992,12 @@ public abstract class JTemplate> public static boolean isValid(JTemplate jt) { return jt != null && jt != JNullTemplate.NULL; } + + public boolean canBeSaved(){ + return true; + } + + public boolean supportCache(){ + return true; + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/ToolKitConfigStrategy.java b/designer-base/src/main/java/com/fr/design/mainframe/ToolKitConfigStrategy.java index 67b1409b36..f2feff8042 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/ToolKitConfigStrategy.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/ToolKitConfigStrategy.java @@ -2,6 +2,9 @@ package com.fr.design.mainframe; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; +import javax.swing.JPanel; + + public interface ToolKitConfigStrategy { /** @@ -24,4 +27,11 @@ public interface ToolKitConfigStrategy { * @return */ boolean hasToolBarPane(ToolBarMenuDockPlus plus); + /** + * 定制工具栏 + * @param toolBarPane + * @param plus + * @return + */ + JPanel customNorthPane(JPanel toolBarPane, ToolBarMenuDockPlus plus); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 3372e2ad13..37812c106f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -416,9 +416,7 @@ public abstract class ToolBarMenuDock { menuDef.addShortCut(new OpenRecentReportMenuDef()); - if (!DesignModeContext.isDuchampMode()) { - addCloseCurrentTemplateAction(menuDef); - } + addCloseCurrentTemplateAction(menuDef); scs = plus.shortcut4FileMenu(); if (!ArrayUtils.isEmpty(scs)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java index 8cff3ffbb1..6bfc39b78e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java @@ -1,7 +1,7 @@ package com.fr.design.mainframe.vcs.ui; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.JTemplate; @@ -57,9 +57,9 @@ public class FileVersionCellEditor extends AbstractCellEditor implements TableCe jt.stopEditing(); //只有模板路径一致时关闭当前模板 if (ComparatorUtils.equals(fileOfVersion, jt.getPath())) { - MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); - MultiTemplateTabPane.getInstance().closeFormat(jt); - MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt); + TemplateTabManager.getInstance().setCloseCurrent(true); + TemplateTabManager.getInstance().closeFormat(jt); + TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); } //再打开cache中的模板 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java index 4dd14bce6d..47a95f2620 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java @@ -5,7 +5,7 @@ import com.fr.design.base.mode.DesignModeContext; import com.fr.design.base.mode.DesignerMode; import com.fr.design.dialog.BasicPane; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; @@ -115,9 +115,9 @@ public class FileVersionsPanel extends BasicPane { // 关闭当前打开的版本 JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); - MultiTemplateTabPane.getInstance().closeFormat(jt); - MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt); + TemplateTabManager.getInstance().setCloseCurrent(true); + TemplateTabManager.getInstance().closeFormat(jt); + TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); updateDesignerFrame(true); diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java index d9c8568bf9..baa73fc53a 100644 --- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -3,7 +3,7 @@ package com.fr.design.worker.open; import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.file.TemplateTreePane; import com.fr.design.i18n.Toolkit; import com.fr.design.lock.LockInfoDialog; @@ -87,7 +87,7 @@ public class OpenWorker extends SwingWorker { UIManager.getIcon("OptionPane.errorIcon")); } if (cause.getCause() instanceof TplLockedException) { - MultiTemplateTabPane.getInstance().closeCurrentTpl(); + TemplateTabManager.getInstance().closeCurrentTpl(); TemplateTreePane.getInstance().getFileNode().setLock(UUID.randomUUID().toString()); LockInfoDialog.show(null); } diff --git a/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java b/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java index 1a6e2bf1c8..f277320dd0 100644 --- a/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java +++ b/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java @@ -2,7 +2,7 @@ package com.fr.nx.app.designer.toolbar; import com.fr.base.extension.FileExtension; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.file.FILE; @@ -103,9 +103,9 @@ public enum TemplateTransformer { DesignerContext.getDesignerFrame().openTemplate(file); return; } - MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); - MultiTemplateTabPane.getInstance().closeFormat(jt); - MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt); + TemplateTabManager.getInstance().setCloseCurrent(true); + TemplateTabManager.getInstance().closeFormat(jt); + TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); DesignerContext.getDesignerFrame().openTemplate(file); } diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 44228c2a4a..50f2cd35c0 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -8,7 +8,7 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.DesignerStartOpenFileProcessor; import com.fr.design.fun.impl.DesignerStartWithEmptyFile; @@ -193,7 +193,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } else { df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 - MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } } @@ -253,7 +253,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { private boolean createNewTemplate(DesignerFrame df) { df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 - MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); return true; } diff --git a/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java b/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java index b42cc4ed8f..5dcaa147ac 100644 --- a/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java +++ b/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java @@ -3,7 +3,7 @@ package com.fr.start.common; import com.fr.base.svg.IconUtils; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; @@ -59,7 +59,7 @@ public class DesignerOpenEmptyPanel extends JPanel { HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(null); df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 - MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } }); createButton.setBorder(new EmptyBorder(0, 10, 0, 10)); diff --git a/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java b/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java index 04633435be..c362ae76d1 100644 --- a/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java +++ b/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java @@ -1,7 +1,7 @@ package com.fr.design.fit.common; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.fit.NewJForm; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; @@ -86,7 +86,7 @@ public class TemplateTool { JTemplate oldJTemplate = jTemplateList.get(i); if (oldJTemplate != null && ComparatorUtils.equals(oldJTemplate.getEditingFILE(), newJTemplate.getEditingFILE())) { jTemplateList.set(i, newJTemplate); - MultiTemplateTabPane.getInstance().refreshOpenedTemplate(jTemplateList); + TemplateTabManager.getInstance().refreshOpenedTemplate(jTemplateList); return; } } diff --git a/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java b/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java index 4afacee781..03e8e2b445 100644 --- a/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java +++ b/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java @@ -1,7 +1,8 @@ package com.fr.design.preview; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.impl.AbstractPreviewProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JForm; @@ -66,7 +67,7 @@ public class DeveloperPreview extends AbstractPreviewProvider { } private void onPreview(JTemplate jt) { - MultiTemplateTabPane.getInstance().closeCurrentTpl(); + TemplateTabManager.getInstance().closeCurrentTpl(); jt.generateForBiddenTemplate(); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index f9c086a50b..5ba4838d6e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -39,7 +39,7 @@ import com.fr.design.designer.TargetComponent; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.fun.PreviewProvider; import com.fr.design.fun.PropertyItemPaneProvider; import com.fr.design.fun.ReportSupportedFileUIProvider; @@ -1175,7 +1175,7 @@ public class JWorkBook extends JTemplate { public boolean saveShareFile() { FILE newFile = createNewEmptyFile(); //如果文件已经打开, 那么就覆盖关闭掉他 - MultiTemplateTabPane.getInstance().closeFileTemplate(newFile); + TemplateTabManager.getInstance().closeFileTemplate(newFile); final WorkBook tpl = this.getTarget(); // 弹出输入参数 java.util.Map parameterMap = inputParameters(tpl); diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 7b974d871c..55b6548ac5 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -17,6 +17,7 @@ import com.fr.design.deeplink.DeepLinkManager; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTabManager; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; import com.fr.design.gui.ibutton.UIButton; @@ -409,8 +410,7 @@ public class MainDesigner extends BaseDesigner { return; } saveButton.setEnabled(!jt.isSaved() && !DesignModeContext.isVcsMode() && jt.checkEnable()); - MultiTemplateTabPane.getInstance().refreshOpenedTemplate(HistoryTemplateListCache.getInstance().getHistoryList()); - MultiTemplateTabPane.getInstance().repaint(); + TemplateTabManager.getInstance().refreshOpenedTemplate(HistoryTemplateListCache.getInstance().getHistoryList()); if (DesignerEnvManager.getEnvManager().isSupportUndo()) { undo.setEnabled(jt.canUndo()); redo.setEnabled(jt.canRedo()); From 7f70d695d6d9e226c9a5ec0b75dd7290e3690fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 14 Apr 2023 11:08:09 +0800 Subject: [PATCH 089/625] =?UTF-8?q?REPORT-83195=20=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E7=82=B9=E4=BC=98=E5=8C=96-=E4=BF=9D=E5=AD=98=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/JTemplate.java | 115 ++++++++++++++---- .../com/fr/design/worker/save/SaveWorker.java | 51 +++++--- .../fr/design/worker/save/type/SaveType.java | 50 ++++++++ .../worker/save/type/SaveTypeWorker.java | 75 ++++++++++++ 4 files changed, 255 insertions(+), 36 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/worker/save/type/SaveType.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java 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 0082e091f3..229ba848d8 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 @@ -61,6 +61,8 @@ import com.fr.design.utils.DesignUtils; import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.design.worker.save.EmptyCallBackSaveWorker; import com.fr.design.worker.save.SaveFailureHandler; +import com.fr.design.worker.save.type.SaveType; +import com.fr.design.worker.save.type.SaveTypeWorker; import com.fr.design.write.submit.DBManipulationInWidgetEventPane; import com.fr.design.write.submit.DBManipulationPane; import com.fr.event.EventDispatcher; @@ -1687,24 +1689,7 @@ public abstract class JTemplate> if (!editingFILE.exists()) { return saveAs(showLoc); } - - CallbackSaveWorker worker = new CallbackSaveWorker(new Callable() { - @Override - public Boolean call() throws Exception { - return saveRealFileByWorker(); - } - }, this); - - worker.addSuccessCallback(new Runnable() { - @Override - public void run() { - callBackForSave(); - //在保存后的回调中执行预编译流程 - CptCompileUtil.compile(JTemplate.this); - } - }); - - return worker; + return getSaveCallBackSaveWorker(); } /** @@ -1750,6 +1735,8 @@ public abstract class JTemplate> } } + + private CallbackSaveWorker saveAs(boolean showLoc) { FILE editingFILE = this.getEditingFILE(); if (editingFILE == null) { @@ -1771,7 +1758,6 @@ public abstract class JTemplate> // 目标文件 editingFILE = fileChooser.getSelectedFILE(); } - FILE finalEditingFILE = editingFILE; CallbackSaveWorker worker = new CallbackSaveWorker(new Callable() { @Override @@ -1872,10 +1858,95 @@ public abstract class JTemplate> return saveAs(true); } + /** + * 获取保存用到的saveWorker + */ + private CallbackSaveWorker getSaveCallBackSaveWorker() { + CallbackSaveWorker worker = new CallbackSaveWorker(new Callable() { + @Override + public Boolean call() throws Exception { + return saveRealFileByWorker(); + } + }, this); + + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + callBackForSave(); + //在保存后的回调中执行预编译流程 + CptCompileUtil.compile(JTemplate.this); + } + }); + return worker; + } + + /** + * 获取保存的类别执行的callable + */ + private Callable getSaveTypeCallable() { + return () -> { + fireJTemplateSaveBefore(); + FILE editingFILE = getEditingFILE(); + // carl:editingFILE没有,当然不存了,虽然不会有这种情况 + if (editingFILE == null) { + return SaveType.TypeEnum.EMPTY; + } + // 检查一下editingFILE是不是已存在的文件,如果不存在则用saveAs + if (!editingFILE.exists()) { + return SaveType.TypeEnum.SAVE_AS; + } + return SaveType.TypeEnum.SAVE; + }; + } + + /** + * 根据保存类型获取对应的saveWorker + * + * @param saveType 保存类型 + */ + private CallbackSaveWorker getSaveTypeWorker(SaveType saveType) { + CallbackSaveWorker callbackSaveWorker; + switch (saveType.getType()) { + case EMPTY: + callbackSaveWorker = new EmptyCallBackSaveWorker(); + break; + case SAVE: + callbackSaveWorker = getSaveCallBackSaveWorker(); + break; + default: + callbackSaveWorker = saveAs(true); + } + return callbackSaveWorker; + } + + + @Override public void saveDirectly() { - CallbackSaveWorker worker = save(); - worker.start(getRuntimeId()); + new SaveTypeWorker(getSaveTypeCallable(), this) { + @Override + protected void done() { + try { + SaveType saveType = get(); + CallbackSaveWorker callbackSaveWorker = getSaveTypeWorker(saveType); + //告诉一下后面执行的saveWorker,当前判断文件是否存在的操作是否已经进行了开始转圈的那个等待动画,避免重复 + callbackSaveWorker.setSlowly(saveType.isSlowly()); + callbackSaveWorker.start(getRuntimeId()); + //如果是空也就是不保存,需要恢复一下界面(如果saveTypeWorker里进行了操作的话) + if (callbackSaveWorker instanceof EmptyCallBackSaveWorker) { + setSaving(false); + if (saveType.isSlowly()) { + if (ComparatorUtils.equals(getName(), HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getName())) { + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().hideCover(); + } + } + DesignerFrameFileDealerPane.getInstance().stateChange(); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + }.start(); } @Override @@ -1979,7 +2050,7 @@ public abstract class JTemplate> public void setDesignerUIMode() { DesignerUIModeConfig.getInstance().setAbsoluteMeasureUIMode(); } - + /** * 判断当前的模板是否是有效的模板 * diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index 60d797c3e9..188aedacb9 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -5,12 +5,15 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; +import com.fr.design.ui.util.UIUtil; import com.fr.design.worker.WorkerManager; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; + import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; + +import com.fr.third.org.apache.commons.lang3.time.StopWatch; + import javax.swing.SwingWorker; /** @@ -34,6 +37,14 @@ public class SaveWorker extends SwingWorker { private boolean slowly; + public boolean isSlowly() { + return slowly; + } + + public void setSlowly(boolean slowly) { + this.slowly = slowly; + } + public SaveWorker(Callable callable, JTemplate template) { this.callable = callable; this.template = template; @@ -47,10 +58,11 @@ public class SaveWorker extends SwingWorker { @Override protected void done() { try { - success = get(); + success = get(); } catch (Exception e) { processResult(); FineLoggerFactory.getLogger().error(e.getMessage(), e); + WorkerManager.getInstance().removeWorker(taskName); SaveFailureHandler.getInstance().process(e); return; } @@ -62,6 +74,7 @@ public class SaveWorker extends SwingWorker { // 恢复界面 if (slowly && ComparatorUtils.equals(this.template.getName(), HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getName())) { DesignerContext.getDesignerFrame().getCenterTemplateCardPane().hideCover(); + slowly = false; } DesignerFrameFileDealerPane.getInstance().stateChange(); WorkerManager.getInstance().removeWorker(taskName); @@ -69,21 +82,31 @@ public class SaveWorker extends SwingWorker { public void start(String taskName) { this.taskName = taskName; + StopWatch stopWatch = StopWatch.createStarted(); this.template.setSaving(true); this.execute(); // worker纳入管理 WorkerManager.getInstance().registerWorker(taskName, this); - try { - this.get(TIME_OUT, TimeUnit.MILLISECONDS); - } catch (TimeoutException timeoutException) { - slowly = true; - // 开始禁用 - EastRegionContainerPane.getInstance().updateAllPropertyPane(); - DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showCover(); - DesignerFrameFileDealerPane.getInstance().stateChange(); - } catch (Exception exception) { - FineLoggerFactory.getLogger().error(exception.getMessage(), exception); - WorkerManager.getInstance().removeWorker(taskName); + if (!slowly) { + new Thread(() -> { + while (true) { + if (stopWatch.getTime() > TIME_OUT || isDone()) { + if (!isDone()) { + slowly = true; + UIUtil.invokeLaterIfNeeded(() -> { + // 开始禁用 + if (slowly) { + EastRegionContainerPane.getInstance().updateAllPropertyPane(); + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showCover(); + DesignerFrameFileDealerPane.getInstance().stateChange(); + } + }); + } + stopWatch.stop(); + break; + } + } + }).start(); } } } diff --git a/designer-base/src/main/java/com/fr/design/worker/save/type/SaveType.java b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveType.java new file mode 100644 index 0000000000..63cf6c4c7e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveType.java @@ -0,0 +1,50 @@ +package com.fr.design.worker.save.type; + +/** + * 保存的类别 + * + * @author John.Ying + * @since 11.0 + * Created on 2023/4/14 + */ +public class SaveType { + + private TypeEnum type; + //保存时间是否慢(是否展示了保存中的UI界面) + private boolean slowly; + + public TypeEnum getType() { + return type; + } + + public void setType(TypeEnum saveType) { + this.type = saveType; + } + + public boolean isSlowly() { + return slowly; + } + + public void setSlowly(boolean slowly) { + this.slowly = slowly; + } + + /** + * 保存类型:save or saveAs or empty + */ + public enum TypeEnum { + /** + * 保存 + */ + SAVE, + /** + * 另存 + */ + SAVE_AS, + /** + * 空保存 + */ + EMPTY; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java new file mode 100644 index 0000000000..e087f701f7 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java @@ -0,0 +1,75 @@ +package com.fr.design.worker.save.type; + + +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrameFileDealerPane; +import com.fr.design.mainframe.EastRegionContainerPane; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.ui.util.UIUtil; +import com.fr.third.org.apache.commons.lang3.time.StopWatch; + +import javax.swing.SwingWorker; +import java.util.concurrent.Callable; + +/** + * 判断保存类别时执行的worker + * + * @author John.Ying + * @since 11.0 + * Created on 2023/4/14 + */ +public class SaveTypeWorker extends SwingWorker { + + private final Callable callable; + + private static final int TIME_OUT = 400; + + private final JTemplate template; + + private final SaveType saveType; + + public SaveTypeWorker(Callable callable, JTemplate template) { + this.callable = callable; + this.template = template; + this.saveType = new SaveType(); + } + + @Override + protected SaveType doInBackground() throws Exception { + this.saveType.setType(callable.call()); + return this.saveType; + } + + @Override + protected void done() { + + } + + /** + * 启动saveTypeWorker + */ + public void start() { + StopWatch stopWatch = StopWatch.createStarted(); + this.template.setSaving(true); + this.execute(); + new Thread(() -> { + while (true) { + //大于最大等待时间或者worker已经完成该线程都要结束循环 + if (stopWatch.getTime() > TIME_OUT || isDone()) { + //如果是大于最大等待时间结束的,就需要进行等待中界面的覆盖 + if (!isDone()) { + saveType.setSlowly(true); + UIUtil.invokeLaterIfNeeded(() -> { + // 开始禁用 + EastRegionContainerPane.getInstance().updateAllPropertyPane(); + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showCover(); + DesignerFrameFileDealerPane.getInstance().stateChange(); + }); + } + stopWatch.stop(); + break; + } + } + }).start(); + } +} From 437c05bbc0959de6b61fa468c2877f77338e6988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 14 Apr 2023 11:39:01 +0800 Subject: [PATCH 090/625] =?UTF-8?q?REPORT-83195=20=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E7=82=B9=E4=BC=98=E5=8C=96-=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=B7=BB=E5=8A=A0=E5=9B=BE=E8=A1=A8=E5=8D=A1?= =?UTF-8?q?=E6=AD=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/ChartPropertyPane.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index 4efe977ff3..8e6b80c53a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -9,6 +9,7 @@ import com.fr.base.chart.BaseChartCollection; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; +import com.fr.decision.webservice.v10.map.geojson.helper.GEOJSONHelper; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.designer.TargetComponent; import com.fr.design.gui.chart.BaseChartPropertyPane; @@ -19,6 +20,7 @@ import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.BorderFactory; import javax.swing.Icon; +import javax.swing.SwingWorker; import java.awt.BorderLayout; import java.awt.Component; @@ -95,16 +97,25 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * @param ePane 面板 */ public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { - String chartID = collection.getSelectedChartProvider(ChartProvider.class).getID(); - updateChartEditPane(collection.getSelectedChartProvider(ChartProvider.class).getID()); - setSupportCellData(true); - this.container.setEPane(ePane); - - if (ChartTypeManager.getInstance().chartExit(chartID)) { - chartEditPane.populate(collection); - } else { - GUICoreUtils.setEnabled(chartEditPane, false); - } + new SwingWorker() { + @Override + protected Void doInBackground() throws Exception { + GEOJSONHelper.getInstance(); + return null; + } + @Override + protected void done() { + String chartID = collection.getSelectedChartProvider(ChartProvider.class).getID(); + updateChartEditPane(collection.getSelectedChartProvider(ChartProvider.class).getID()); + setSupportCellData(true); + container.setEPane(ePane); + if (ChartTypeManager.getInstance().chartExit(chartID)) { + chartEditPane.populate(collection); + } else { + GUICoreUtils.setEnabled(chartEditPane, false); + } + } + }.execute(); } /** From ca53cd0f6e84fa93a91795747b631f58b301b543 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 13:35:38 +0800 Subject: [PATCH 091/625] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/CloseOption.java | 11 +++++ .../file/MultiTemplateTabMenuFactory.java | 8 +++- .../fr/design/file/SaveSomeTemplatePane.java | 15 +++++++ .../fr/design/file/TemplateTabManager.java | 40 ++++++++++++++--- .../file/TemplateTabOperateProvider.java | 9 ++++ .../file/impl/AbstractTemplateTabOperate.java | 44 ++++++++++++++----- .../file/impl/DefaultTemplateTabOperate.java | 13 +++++- .../file/impl/EmptyTemplateTabOperator.java | 13 +++++- .../fr/design/mainframe/DesignerFrame.java | 6 ++- .../DesignerFrameFileDealerPane.java | 7 ++- .../com/fr/design/mainframe/JTemplate.java | 13 +++++- 11 files changed, 154 insertions(+), 25 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/CloseOption.java b/designer-base/src/main/java/com/fr/design/file/CloseOption.java index c88e7658c8..79667dec0f 100644 --- a/designer-base/src/main/java/com/fr/design/file/CloseOption.java +++ b/designer-base/src/main/java/com/fr/design/file/CloseOption.java @@ -2,6 +2,11 @@ package com.fr.design.file; import com.fr.design.i18n.Toolkit; +/** + * @author kerry + * @since 11.0 + * created on 2023-04-14 + **/ public enum CloseOption { Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { @Override @@ -36,6 +41,12 @@ public enum CloseOption { this.optionName = optionName; } + /** + * 判断指定索引模板是否应该被关闭 + * @param tplIndex + * @param i + * @return + */ public boolean shouldClose(int tplIndex, int i) { return true; } 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 a67e129f78..edbe9cbab3 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 @@ -30,8 +30,8 @@ import java.util.Map; /** * @author Carlson - * @version 11.0 - * @description + * @since 11.0 + * created on 2023-04-14 **/ public class MultiTemplateTabMenuFactory { @@ -49,6 +49,10 @@ public class MultiTemplateTabMenuFactory { } + /** + * 返回右侧下拉菜单的工厂类 + * @return + */ public static MultiTemplateTabMenuFactory getInstance() { return INSTANCE; } 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 96d72d34c1..715cc94ba0 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 @@ -151,15 +151,30 @@ public class SaveSomeTemplatePane extends BasicPane { } + /** + * 显示未保存弹窗 + * @return + */ public boolean showSavePane() { return showSavePane(false); } + /** + * 显示未保存弹窗 + * @param switchEnv + * @return + */ public boolean showSavePane(boolean switchEnv) { return switchEnv ? showSavePane(DefaultTemplateTabOperate.getInstance().getOpenedJTemplates()) : showSavePane(HistoryTemplateListPane.getInstance().getHistoryList()); } + + /** + * 显示未保存弹窗 + * @param jTemplates + * @return + */ public boolean showSavePane(List> jTemplates) { populate(jTemplates); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java index 22a0bc37e4..da151d9b0f 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java @@ -12,13 +12,22 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * @author kerry + * @since 11.0 + * created on 2023-04-14 + **/ public class TemplateTabManager { private static class HOLDER { - private static final TemplateTabManager singleton = new TemplateTabManager(); + private static final TemplateTabManager SINGLETON = new TemplateTabManager(); } + /** + * 返回TemplateTabManager单例对象 + * @return + */ public static TemplateTabManager getInstance() { - return HOLDER.singleton; + return HOLDER.SINGLETON; } private TemplateTabManager() { @@ -27,15 +36,23 @@ public class TemplateTabManager { private List list = new ArrayList<>(); + /** + * 支持注册新的Operator + * @param templateTabOperateProvider + */ public void register(TemplateTabOperateProvider templateTabOperateProvider) { this.list.add(templateTabOperateProvider); } + /** + * 移除operator + * @param templateTabOperateProvider + */ public void remove(TemplateTabOperateProvider templateTabOperateProvider) { this.list.remove(templateTabOperateProvider); } - private boolean isCloseCurrent = false; + private boolean closeCurrent = false; //自动新建的模板B若没有进行任何编辑,切换到其他 // 模板时,模板B会自动关闭 @@ -43,17 +60,20 @@ public class TemplateTabManager { public boolean isCloseCurrent() { - return isCloseCurrent; + return closeCurrent; } public void setCloseCurrent(boolean closeCurrent) { - isCloseCurrent = closeCurrent; + this.closeCurrent = closeCurrent; } public void setTemTemplate(JTemplate temTemplate) { this.temTemplate = temTemplate; } + /** + * 刷新tab栏 + */ public void refresh() { getCurrentOperator().refresh(); } @@ -127,11 +147,18 @@ public class TemplateTabManager { } + /** + * 重置选中index + * @param jTemplate + */ public void resetSelectIndex(JTemplate jTemplate) { getCurrentOperator().resetSelectIndex(jTemplate); } + /** + * 激活新模板 + */ public void activeNewTemplate() { //先看其他模式中是否有已打开的模板,有的话切换过去 for (TemplateTabOperateProvider templateTabOperateProvider : list) { @@ -202,6 +229,9 @@ public class TemplateTabManager { return resultMap; } + /** + * 关闭其他 + */ public void closeOthers() { TemplateTabOperateProvider currentOperator = getCurrentOperator(); currentOperator.closeAction(CloseOption.Others, diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java index ff913f3342..7bcc816526 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java @@ -6,6 +6,11 @@ import com.fr.file.FILE; import java.util.List; +/** + * @author kerry + * @since 11.0 + * created on 2023-04-14 + **/ public interface TemplateTabOperateProvider { /** * 找到模板树中的位置 @@ -38,6 +43,10 @@ public interface TemplateTabOperateProvider { List> getOpenedJTemplates(); + /** + * 根据指定索引关闭模板 + * @param index + */ void closeByIndex(int index); /** * 关闭指定模板 diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java index b6bee6e6d8..e42b336f57 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java @@ -25,18 +25,25 @@ import com.fr.third.javax.annotation.Nonnull; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; -import javax.swing.*; +import javax.swing.JOptionPane; import java.util.ArrayList; import java.util.List; import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; -import static javax.swing.JOptionPane.*; - +import static javax.swing.JOptionPane.OK_CANCEL_OPTION; +import static javax.swing.JOptionPane.OK_OPTION; +import static javax.swing.JOptionPane.WARNING_MESSAGE; + +/** + * @author kerry + * @since 11.0 + * created on 2023-04-14 + **/ public abstract class AbstractTemplateTabOperate implements TemplateTabOperateProvider { //用于存放工作簿 - protected java.util.List> openedTemplate = new ArrayList<>(); + private java.util.List> openedTemplate = new ArrayList<>(); //选中的Tab项 - protected int selectedIndex = -1; + private int selectedIndex = -1; public AbstractTemplateTabOperate() { @@ -57,7 +64,8 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr FILE currentTemplate = template.getEditingFILE(); //模板不属于当前环境,跟预览一样先提示保存,再定位模板 //如果是拖拽进来的模板单单用exist不能判断,这边参考预览的判断逻辑(browserTemplate),补充一下 - if ((!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) && template.canBeSaved()) { + boolean needSave = (!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) && template.canBeSaved(); + if (needSave) { int selVal = showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), Toolkit.i18nText("Fine-Design_Basic_Preview_Tool_Tips"), OK_CANCEL_OPTION, WARNING_MESSAGE); if (OK_OPTION == selVal) { CallbackSaveWorker worker = template.saveAs(); @@ -96,6 +104,10 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr } } + /** + * 根据指定索引值关闭模板 + * @param index + */ public void closeByIndex(int index) { //关闭close图标所在的模板{ JTemplate template = openedTemplate.get(index); @@ -153,18 +165,19 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr public void switchTpl(int templateIndex) { int tempSelectedIndex = selectedIndex; JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if ((selectedIndex != templateIndex || !this.accept(jTemplate.getTemplateTabOperatorType())) - && templateIndex != -1) { + boolean shouldSwitch = (selectedIndex != templateIndex || !this.accept(jTemplate.getTemplateTabOperatorType())) + && templateIndex != -1; + if (shouldSwitch) { openedTemplate.get(selectedIndex).stopEditing(); selectedIndex = templateIndex; //如果在权限编辑情况下,不允许切换到表单类型的工作簿 if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), WARNING_MESSAGE); return; } - JTemplate evtXTemplate = openedTemplate.get(templateIndex); - evtXTemplate.activeNewJTemplate(); + JTemplate evtTemplate = openedTemplate.get(templateIndex); + evtTemplate.activeNewJTemplate(); } } @@ -285,6 +298,10 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr TemplateTabManager.getInstance().refresh(); } + /** + * 刷新已打开的模板 + * @param list + */ public void refreshOpenedTemplate(List> list) { List> result = new ArrayList<>(); for (JTemplate jTemplate : list) { @@ -315,6 +332,11 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr return this.openedTemplate.indexOf(jTemplate); } + /** + * 是否支持指定操作类型 + * @param type + * @return + */ public boolean accept(String type) { return CompareUtils.isEqual(getOperatorType(), type); } diff --git a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java index 511b74894f..ae8ea292a9 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java @@ -2,20 +2,29 @@ package com.fr.design.file.impl; import com.fr.design.file.MultiTemplateTabPane; +/** + * @author kerry + * @since 11.0 + * created on 2023-04-14 + **/ public class DefaultTemplateTabOperate extends AbstractTemplateTabOperate { public static final String OPERATOR_TYPE = "DEFAULT_TEMPLATE_TAB_OPERATOR"; private static class HOLDER { - private static final DefaultTemplateTabOperate singleton = new DefaultTemplateTabOperate(); + private static final DefaultTemplateTabOperate SINGLETON = new DefaultTemplateTabOperate(); } private DefaultTemplateTabOperate() { super(); } + /** + * 返回DefaultTemplateTabOperate 单例 + * @return + */ public static DefaultTemplateTabOperate getInstance() { - return HOLDER.singleton; + return HOLDER.SINGLETON; } @Override diff --git a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java index 804874138d..4afe59f16b 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java @@ -9,9 +9,14 @@ import com.fr.stable.StringUtils; import java.util.ArrayList; import java.util.List; +/** + * @author kerry + * @since 11.0 + * created on 2023-04-14 + **/ public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { private static class HOLDER { - private static final EmptyTemplateTabOperator singleton = new EmptyTemplateTabOperator(); + private static final EmptyTemplateTabOperator SINGLETON = new EmptyTemplateTabOperator(); } @@ -19,8 +24,12 @@ public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { } + /** + * 返回空的模板taboperator单例 + * @return + */ public static EmptyTemplateTabOperator getInstance() { - return HOLDER.singleton; + return HOLDER.SINGLETON; } @Override 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 2f05dbbeb2..8b63b73e96 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 @@ -19,7 +19,11 @@ import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.event.DesignerOpenedListener; import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; -import com.fr.design.file.*; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.SaveSomeTemplatePane; +import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.OemProcessor; import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider; import com.fr.design.gui.iprogressbar.ProgressDialog; 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 a07bfe1f1d..80fccc95cb 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 @@ -17,7 +17,12 @@ import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.data.tabledata.ResponseDataSourceChange; import com.fr.design.dialog.FineJOptionPane; -import com.fr.design.file.*; +import com.fr.design.file.FileOperations; +import com.fr.design.file.FileToolbarStateChangeListener; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenuHighLight; 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 b8fef1b007..dbf63e077c 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 @@ -30,7 +30,9 @@ import com.fr.design.designer.DesignerProxy; import com.fr.design.designer.TargetComponent; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.InformationWarnPane; -import com.fr.design.file.*; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.TemplateResourceManager; import com.fr.design.file.impl.DefaultTemplateTabOperate; import com.fr.design.fun.DesignerFrameUpButtonProvider; import com.fr.design.fun.MenuHandler; @@ -1993,10 +1995,19 @@ public abstract class JTemplate> return jt != null && jt != JNullTemplate.NULL; } + /** + * 当前模板是否可以被保存 + * @return 是/否 + */ public boolean canBeSaved(){ return true; } + /** + * 当前的模板是否支持缓存 + * + * @return 是/否 + */ public boolean supportCache(){ return true; } From 808f940df284f1f95e0d4550383f65dedba6ec64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 14 Apr 2023 13:41:06 +0800 Subject: [PATCH 092/625] =?UTF-8?q?REPORT-83195=20=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E7=82=B9=E4=BC=98=E5=8C=96-=E5=BC=80=E5=8F=91=E8=80=85?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/carton/SwitchForSwingChecker.java | 74 ++++++++- .../design/carton/developer/AwtEventInfo.java | 73 +++++++++ .../developer/EventDispatchDeveloperMode.java | 146 ++++++++++++++++++ 3 files changed, 288 insertions(+), 5 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java create mode 100644 designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java diff --git a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java index 683179293e..837bdb1c8b 100644 --- a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java +++ b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java @@ -1,6 +1,7 @@ package com.fr.design.carton; +import com.fr.design.carton.developer.EventDispatchDeveloperMode; import com.fr.design.i18n.Toolkit; import com.fr.general.GeneralUtils; import com.fr.json.JSON; @@ -29,11 +30,22 @@ import java.util.Map; import java.util.Date; import java.util.Calendar; + public class SwitchForSwingChecker implements XMLReadable, XMLWriter { /** * Designer4Debug类名 */ private static final String DEBUG_MAIN_CLASS_NAME = "com.fr.start.Designer4Debug"; + + /** + * 真正主类 + */ + private static final String NORMAL_MAIN_CLASS_NAME = "com.fr.start.MainDesigner"; + + /** + * 开发者模式jvm参数 + */ + private static final String CARTON_DEVELOPER_JVM_PARAM = "cartonDeveloper"; /** * XML标签 */ @@ -249,11 +261,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { */ public static void initThreadMonitoring () { String mainClass = System.getProperty("sun.java.command"); - //判断一下,如果是以Designer4Debug启动,就不注册代码,不然会覆盖掉SwingExplorer,导致其无法使用 - if (!StringUtils.equals(mainClass, DEBUG_MAIN_CLASS_NAME)) { - EventDispatchThreadHangMonitor.initMonitoring(); - AppContext.getAppContext().put(SwingWorker.class, CartonThreadExecutorPool.getTimerThreadExecutorPool()); - } + MainClassType.getMainClassType(mainClass).initEventQueue(); } /** @@ -309,4 +317,60 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { writer.end(); } + /** + * 根据程序启动类路径进行区分 + * + * @author John.Ying + * @since 11.0 + * Created on 2023/4/14 + */ + enum MainClassType { + /** + * 用mainDesigner启动 + */ + MAIN(NORMAL_MAIN_CLASS_NAME) { + @Override + void initEventQueue() { + if (StringUtils.equals("true", System.getProperty(CARTON_DEVELOPER_JVM_PARAM))) { + EventDispatchDeveloperMode.INSTANCE.initMonitoring(); + } else { + EventDispatchThreadHangMonitor.initMonitoring(); + AppContext.getAppContext().put(SwingWorker.class, CartonThreadExecutorPool.getTimerThreadExecutorPool()); + } + } + }, + + /** + * designer4debug启动 + */ + DEBUG_MAIN(DEBUG_MAIN_CLASS_NAME) { + @Override + void initEventQueue() { + + } + }; + + MainClassType(String classPath) { + this.classPath = classPath; + } + + String classPath; + + /** + * 初始化重写的EDT + */ + abstract void initEventQueue(); + + /** + * @param classPath 启动类路径 + */ + static MainClassType getMainClassType(String classPath) { + for (MainClassType mainClassType : MainClassType.values()) { + if (StringUtils.equals(classPath, mainClassType.classPath)) { + return mainClassType; + } + } + return MAIN; + } + } } diff --git a/designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java b/designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java new file mode 100644 index 0000000000..77274a36ab --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java @@ -0,0 +1,73 @@ +package com.fr.design.carton.developer; + +import java.awt.AWTEvent; + +/** + * EDT事件的包装类,用来额外处理信息 + * + * @author John.Ying + * @since 11.0 + * Created on 2023/4/14 + */ +public class AwtEventInfo { + //获取执行该事件的线程 + private final Thread eventDispatchThread = Thread.currentThread(); + //在队列中等待执行的事件最后未执行的时间,当有一个事件执行完后就遍历dispatches给该值赋当前时间 + private long lastDispatchTimeMillis = System.currentTimeMillis(); + //事件开始的时间 + private final long startDispatchTimeMillis = System.currentTimeMillis(); + //awt事件 + private AWTEvent awtEvent; + //事件堆栈 + private StackTraceElement[] stackTrace; + + /** + * 检查是否要给堆栈赋值 + */ + public void checkForHang() { + if (isNeedToStackTrace()) { + this.stackTrace = eventDispatchThread.getStackTrace(); + } + } + + /** + * 是否需要赋值堆栈满足 + * 耗时>20ms + */ + private boolean isNeedToStackTrace() { + return (System.currentTimeMillis() - startDispatchTimeMillis) > EventDispatchDeveloperMode.MAX_TIME + && stackTrace == null; + } + + public Thread getEventDispatchThread() { + return eventDispatchThread; + } + + public long getLastDispatchTimeMillis() { + return lastDispatchTimeMillis; + } + + public void setLastDispatchTimeMillis(long lastDispatchTimeMillis) { + this.lastDispatchTimeMillis = lastDispatchTimeMillis; + } + + public long getStartDispatchTimeMillis() { + return startDispatchTimeMillis; + } + + public AWTEvent getAwtEvent() { + return awtEvent; + } + + public void setAwtEvent(AWTEvent awtEvent) { + this.awtEvent = awtEvent; + } + + public StackTraceElement[] getStackTrace() { + return stackTrace; + } + + public void setStackTrace(StackTraceElement[] stackTrace) { + this.stackTrace = stackTrace; + } +} diff --git a/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java b/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java new file mode 100644 index 0000000000..4fd136da37 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java @@ -0,0 +1,146 @@ +package com.fr.design.carton.developer; + + +import com.fr.concurrent.FineExecutors; +import com.fr.design.carton.EventDispatchThreadHangMonitor; +import com.fr.design.ui.util.UIUtil; +import com.fr.log.FineLoggerFactory; + +import java.awt.AWTEvent; +import java.awt.EventQueue; +import java.awt.Toolkit; +import java.util.LinkedList; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * 开发者模式重写的EDT + * + * @author John.Ying + * @since 11.0 + * Created on 2023/4/14 + */ +public final class EventDispatchDeveloperMode extends EventQueue { + + /** + * 该链表为主要的实现定时任务的容器,在重写的dispatchEvent中由pre方法将DispatchInfo加入到链表,由post方法remove + */ + private final LinkedList dispatches = new LinkedList<>(); + /** + * 开启间隔检测后两次检测的相隔时间ms + */ + public static final long CHECK_INTERVAL_MS = 5; + + private Timer timer; + + /** + * edt事件最大允许的时间 + */ + public static final long MAX_TIME = 20; + public static final EventDispatchDeveloperMode INSTANCE = new EventDispatchDeveloperMode(); + + @Override + protected void dispatchEvent(AWTEvent event) { + try { + preDispatchEvent(event); + super.dispatchEvent(event); + } finally { + postDispatchEvent(); + } + } + + /** + * 事件分发前处理 + */ + private synchronized void preDispatchEvent(AWTEvent event) { + synchronized (dispatches) { + AwtEventInfo awtEventInfo = new AwtEventInfo(); + awtEventInfo.setAwtEvent(event); + dispatches.addLast(awtEventInfo); + } + } + + /** + * 事件分发后处理 + */ + private synchronized void postDispatchEvent() { + synchronized (dispatches) { + AwtEventInfo awtEventInfo = dispatches.removeLast(); + //嵌套最深的事件执行完毕后刷新链表中其他事件的lastDispatchTimeMillis + Thread currentEventDispatchThread = Thread.currentThread(); + for (AwtEventInfo info : dispatches) { + info.setLastDispatchTimeMillis(System.currentTimeMillis()); + } + long nowTime = System.currentTimeMillis(); + long totalTime = nowTime - awtEventInfo.getStartDispatchTimeMillis(); + long continuationTime = nowTime - awtEventInfo.getLastDispatchTimeMillis(); + if (continuationTime > MAX_TIME) { + FineLoggerFactory.getLogger() + .warn("awt event spend time more than 20ms, totalTime {} continuationTime {} the stack is {}" + , totalTime, continuationTime, EventDispatchThreadHangMonitor.stackTraceToStringForConsole(awtEventInfo.getStackTrace())); + } + } + } + + /** + * 将swing中默认的EventQueue换成自己的 + */ + public void initMonitoring() { + UIUtil.invokeLaterIfNeeded(() -> Toolkit.getDefaultToolkit().getSystemEventQueue().push(INSTANCE)); + initTimer(); + startFilterModalWindow(); + } + + /** + * Sets up a timer to check for hangs frequently. + * 初始化一个Timer + */ + public void initTimer() { + final long initialDelayMs = 0; + final boolean daemon = true; + timer = new Timer("EventDispatchDeveloperMode", daemon); + timer.schedule(new HangChecker(), initialDelayMs, CHECK_INTERVAL_MS); + } + + /** + * /消除Timer + */ + public void stopTimer() { + if (timer != null) { + timer.cancel(); + } + } + + /** + * /定时执行的任务 + */ + public class HangChecker extends TimerTask { + @Override + public void run() { + synchronized (dispatches) { + //如果链表为空定时检测就不进行 + if (dispatches.isEmpty()) { + return; + } + dispatches.getLast().checkForHang(); + } + } + } + + /** + * 消除模态框影响 + */ + public void startFilterModalWindow() { + ScheduledExecutorService scheduledExecutorService = FineExecutors.newSingleThreadScheduledExecutor(); + scheduledExecutorService.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + UIUtil.invokeLaterIfNeeded(() -> { + //不用干事,切个片就可以 + }); + } + }, 0, 10, TimeUnit.MILLISECONDS); + } +} From b682394b3ec451d4b7b75e4a9f448628f9196269 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 13:51:00 +0800 Subject: [PATCH 093/625] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/CloseOption.java | 16 +++++++++++++++- .../com/fr/design/file/MultiTemplateTabPane.java | 4 ++-- .../com/fr/design/file/TemplateTabManager.java | 4 ++-- .../file/impl/AbstractTemplateTabOperate.java | 5 +++-- .../file/impl/DefaultTemplateTabOperate.java | 4 ++-- .../file/impl/EmptyTemplateTabOperator.java | 4 ++-- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/CloseOption.java b/designer-base/src/main/java/com/fr/design/file/CloseOption.java index 79667dec0f..ecb70d6a5f 100644 --- a/designer-base/src/main/java/com/fr/design/file/CloseOption.java +++ b/designer-base/src/main/java/com/fr/design/file/CloseOption.java @@ -8,6 +8,10 @@ import com.fr.design.i18n.Toolkit; * created on 2023-04-14 **/ public enum CloseOption { + + /** + * 关闭左侧所有模板 + */ Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { @Override public boolean shouldClose(int tplIndex, int i) { @@ -15,14 +19,24 @@ public enum CloseOption { } }, + /** + * 关闭右侧所有模板 + */ Right(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Right")) { @Override public boolean shouldClose(int tplIndex, int i) { return i > tplIndex; } + }, - }, All(Toolkit.i18nText("Fine-Design_Close_All_templates")), + /** + * 关闭所有模板 + */ + All(Toolkit.i18nText("Fine-Design_Close_All_templates")), + /** + * 关闭其他模板 + */ Others(Toolkit.i18nText("Fine-Design_Close_Other_templates")) { @Override public boolean shouldClose(int tplIndex, int i) { 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 efc4565e00..0fd4bdecf9 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 @@ -402,8 +402,8 @@ public class MultiTemplateTabPane extends JComponent { if (template.isSaving()) { selectedIcon = GREY_SAVING_CLOSE_ICON; } - boolean isLeft = i < TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); - startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); + boolean left = i < TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); + startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, left, mouseOveredIndex, i); } templateStartX += realWidth; } diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java index da151d9b0f..f7fb354b3f 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java @@ -18,7 +18,7 @@ import java.util.Map; * created on 2023-04-14 **/ public class TemplateTabManager { - private static class HOLDER { + private static class Holder { private static final TemplateTabManager SINGLETON = new TemplateTabManager(); } @@ -27,7 +27,7 @@ public class TemplateTabManager { * @return */ public static TemplateTabManager getInstance() { - return HOLDER.SINGLETON; + return Holder.SINGLETON; } private TemplateTabManager() { diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java index e42b336f57..1f089c5773 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java @@ -40,6 +40,7 @@ import static javax.swing.JOptionPane.WARNING_MESSAGE; * created on 2023-04-14 **/ public abstract class AbstractTemplateTabOperate implements TemplateTabOperateProvider { + private static final String UNSAVED_SUFFIX = " *"; //用于存放工作簿 private java.util.List> openedTemplate = new ArrayList<>(); //选中的Tab项 @@ -345,8 +346,8 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr @Override public String getTemplateShowName(JTemplate template) { String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()); - if (!template.isSaved() && !name.endsWith(" *")) { - name += " *"; + if (!template.isSaved() && !name.endsWith(UNSAVED_SUFFIX)) { + name += UNSAVED_SUFFIX; } return name; } diff --git a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java index ae8ea292a9..1dec669cc4 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java @@ -11,7 +11,7 @@ public class DefaultTemplateTabOperate extends AbstractTemplateTabOperate { public static final String OPERATOR_TYPE = "DEFAULT_TEMPLATE_TAB_OPERATOR"; - private static class HOLDER { + private static class Holder { private static final DefaultTemplateTabOperate SINGLETON = new DefaultTemplateTabOperate(); } @@ -24,7 +24,7 @@ public class DefaultTemplateTabOperate extends AbstractTemplateTabOperate { * @return */ public static DefaultTemplateTabOperate getInstance() { - return HOLDER.SINGLETON; + return Holder.SINGLETON; } @Override diff --git a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java index 4afe59f16b..f5e2b93d5b 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java @@ -15,7 +15,7 @@ import java.util.List; * created on 2023-04-14 **/ public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { - private static class HOLDER { + private static class Holder { private static final EmptyTemplateTabOperator SINGLETON = new EmptyTemplateTabOperator(); } @@ -29,7 +29,7 @@ public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { * @return */ public static EmptyTemplateTabOperator getInstance() { - return HOLDER.SINGLETON; + return Holder.SINGLETON; } @Override From 196d9182e7095473304b13fc2344c68cfb1d0fe6 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 14:03:26 +0800 Subject: [PATCH 094/625] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/file/TemplateTabManager.java | 1 + .../main/java/com/fr/design/file/TemplateTabOperateProvider.java | 1 + .../java/com/fr/design/file/impl/AbstractTemplateTabOperate.java | 1 + .../java/com/fr/design/file/impl/DefaultTemplateTabOperate.java | 1 + .../java/com/fr/design/file/impl/EmptyTemplateTabOperator.java | 1 + 5 files changed, 5 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java index f7fb354b3f..f5dca0c005 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; /** + * 模板tab的操作统一管理类 * @author kerry * @since 11.0 * created on 2023-04-14 diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java index 7bcc816526..98d48ad4af 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java @@ -7,6 +7,7 @@ import com.fr.file.FILE; import java.util.List; /** + * 模板tab的操作接口 * @author kerry * @since 11.0 * created on 2023-04-14 diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java index 1f089c5773..7793a26dcf 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java @@ -35,6 +35,7 @@ import static javax.swing.JOptionPane.OK_OPTION; import static javax.swing.JOptionPane.WARNING_MESSAGE; /** + * 模板tab的操作抽象类 * @author kerry * @since 11.0 * created on 2023-04-14 diff --git a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java index 1dec669cc4..90853568dd 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java @@ -3,6 +3,7 @@ package com.fr.design.file.impl; import com.fr.design.file.MultiTemplateTabPane; /** + * 默认的模板tab的操作类 * @author kerry * @since 11.0 * created on 2023-04-14 diff --git a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java index f5e2b93d5b..3f4ef4d99f 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.List; /** + * 空的模板tab的操作类 * @author kerry * @since 11.0 * created on 2023-04-14 From c65ac20bb1b75ebd6f96f846fcb20e4e0df09934 Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 14 Apr 2023 14:35:28 +0800 Subject: [PATCH 095/625] =?UTF-8?q?REPORT-92161=20=E5=8F=8D=E8=89=B2?= =?UTF-8?q?=E9=97=AE=E9=A2=98,=E6=8A=8A=E9=80=89=E4=B8=AD=E5=8F=98?= =?UTF-8?q?=E8=89=B2=E7=9A=84=E9=80=BB=E8=BE=91=E6=8F=90=E5=87=BA,?= =?UTF-8?q?=E5=92=8CsetIcon=E5=88=86=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/gui/controlpane/JListControlPane.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index 37134ec995..4e1ce9c617 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -377,15 +377,15 @@ public abstract class JListControlPane extends JControlPane implements ListContr this.textLabel.setText(nameable.getName()); boolean iconSet = false; for (NameableCreator creator : JListControlPane.this.creators()) { + if(isSelected) { + this.textLabel.setBackground(selectedBgColor); + this.textLabel.setForeground(Color.WHITE); + } else { + this.textLabel.setBackground(Color.WHITE); + this.textLabel.setForeground(Color.BLACK); + } if (creator.menuIcon() != null && creator.acceptObject2Populate(nameable) != null) { this.iconLabel.setIcon(creator.menuIcon()); - if(isSelected) { - this.textLabel.setBackground(selectedBgColor); - this.textLabel.setForeground(Color.WHITE); - } else { - this.textLabel.setBackground(Color.WHITE); - this.textLabel.setForeground(Color.BLACK); - } this.setToolTipText(creator.createTooltip()); iconSet = true; break; From dcdbd2ac61b22ebae997972f4bf9c0e2b906d291 Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 14 Apr 2023 14:45:36 +0800 Subject: [PATCH 096/625] =?UTF-8?q?REPORT-92161=20=E5=8F=8D=E8=89=B2?= =?UTF-8?q?=E9=97=AE=E9=A2=98,=E6=8A=8A=E9=80=89=E4=B8=AD=E5=8F=98?= =?UTF-8?q?=E8=89=B2=E7=9A=84=E9=80=BB=E8=BE=91=E6=8F=90=E5=87=BA,?= =?UTF-8?q?=E5=92=8CsetIcon=E5=88=86=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/gui/controlpane/JListControlPane.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index 4e1ce9c617..93cdc4e4e2 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -376,14 +376,14 @@ public abstract class JListControlPane extends JControlPane implements ListContr Nameable nameable = element.wrapper; this.textLabel.setText(nameable.getName()); boolean iconSet = false; + if(isSelected) { + this.textLabel.setBackground(selectedBgColor); + this.textLabel.setForeground(Color.WHITE); + } else { + this.textLabel.setBackground(Color.WHITE); + this.textLabel.setForeground(Color.BLACK); + } for (NameableCreator creator : JListControlPane.this.creators()) { - if(isSelected) { - this.textLabel.setBackground(selectedBgColor); - this.textLabel.setForeground(Color.WHITE); - } else { - this.textLabel.setBackground(Color.WHITE); - this.textLabel.setForeground(Color.BLACK); - } if (creator.menuIcon() != null && creator.acceptObject2Populate(nameable) != null) { this.iconLabel.setIcon(creator.menuIcon()); this.setToolTipText(creator.createTooltip()); From 0b4917e0ea6f21117bcd9d90897689a1abeb44e0 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 14:47:04 +0800 Subject: [PATCH 097/625] =?UTF-8?q?fix=EF=BC=9A=E5=A4=84=E7=90=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabPane.java | 184 +++++++++--------- .../fr/design/file/SaveSomeTemplatePane.java | 7 + .../fr/design/file/TemplateTabManager.java | 7 + .../file/TemplateTabOperateProvider.java | 5 + .../file/impl/AbstractTemplateTabOperate.java | 8 + 5 files changed, 123 insertions(+), 88 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 0fd4bdecf9..01e45816eb 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 @@ -13,16 +13,13 @@ import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; -import com.fr.design.mainframe.TemplateSavingChecker; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.TemplateUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.file.FILE; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.stable.Constants; -import com.fr.third.javax.annotation.Nonnull; import javax.swing.BorderFactory; import javax.swing.ButtonModel; @@ -31,10 +28,8 @@ import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; -import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.MenuElement; -import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.plaf.basic.BasicMenuItemUI; import java.awt.AWTEvent; @@ -48,7 +43,6 @@ import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -58,6 +52,7 @@ import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; +import java.util.List; /** * 改个名字,一个拼写 n 个错误 @@ -238,90 +233,60 @@ public class MultiTemplateTabPane extends JComponent { } - @Override - public Dimension getPreferredSize() { - Dimension dimension = super.getPreferredSize(); - dimension.height = HEIGHT; - return dimension; + /** + * 留作兼容 + * @return + */ + @Deprecated + public JTemplate getSelectedFile() { + return TemplateTabManager.getInstance().getSelectedFile(); } - private UIMenuItem initCloseOther() { - UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); - // Yvan: 英文下文本显示不全,后续发现如果将模板名设置的比较短,其它语言也会出现显示不全的问题,所以设置一下文本水平居中 - closeOther.setHorizontalAlignment(SwingConstants.CENTER); - setListDownItemPreferredSize(closeOther); - closeOther.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //int tabSize = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); - int tabSize = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); - if (tabSize == 1) { - return; - } - if (!TemplateSavingChecker.check()) { - return; - } - SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); - //点击关闭其他模板,并且点击确定保存 - if (saveSomeTempaltePane.showSavePane()) { - JTemplate[] panes = new JTemplate[tabSize]; - for (int i = 0; i < tabSize; i++) { - panes[i] = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); - } - for (int i = 0; i < panes.length; i++) { - if (i != TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { - JTemplate jTemplate = panes[i]; - //判断关闭的模板是不是格式刷的被参照的模板 - TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().remove(jTemplate); - TemplateTabManager.getInstance().closeFormat(jTemplate); - HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); - closeAndFreeLock(jTemplate); - } - } - JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - TemplateTabManager.getInstance().resetSelectIndex(currentTemplate); - THIS.repaint(); - } - //如果取消保存了,则不关闭其他模板 - } - }); - if (TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() == 1) { - closeOther.setEnabled(false); - } - return closeOther; + /** + * 关闭掉当前已打开文件列表中指定的文件 + * + * @param file 指定的文件 + */ + @Deprecated + public void closeFileTemplate(FILE file) { + TemplateTabManager.getInstance().closeFileTemplate(file); } - private UIMenuItem[] createListDownTemplate() { - int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); - UIMenuItem[] templates = new UIMenuItem[templateTabCount]; - for (int i = 0; i < templateTabCount; i++) { - final int index = i; - final JTemplate tem = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); - templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); - templates[i].setUI(new UIListDownItemUI()); - setListDownItemPreferredSize(templates[i]); - if (i == TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { - //画选中的高亮 - templates[i].setBackground(UIConstants.SHADOW_CENTER); - } - templates[i].addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(index); - tem.activeNewJTemplate(); - } - }); - } - return templates; + /** + * 刷新打开模板 + * + * @param history 模板 + */ + @Deprecated + public void refreshOpenedTemplate(List> history) { + TemplateTabManager.getInstance().refreshOpenedTemplate(history); } - private void setListDownItemPreferredSize(UIMenuItem item) { - Dimension dimension = item.getPreferredSize(); - dimension.height = LIST_DOWN_HEIGHT; - item.setPreferredSize(dimension); + /** + * 设置临时Template + * @param auotCreate + */ + @Deprecated + public void setTemTemplate(JTemplate auotCreate) { + TemplateTabManager.getInstance().setTemTemplate(auotCreate); } + /** + * 设置选中模板索引 + * @param index + */ + @Deprecated + public void setSelectedIndex(int index) { + TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(index); + } + + @Override + public Dimension getPreferredSize() { + Dimension dimension = super.getPreferredSize(); + dimension.height = HEIGHT; + return dimension; + } private String tempalteShowName(JTemplate template) { return TemplateTabManager.getInstance().getTemplateShowName(template); @@ -682,14 +647,23 @@ public class MultiTemplateTabPane extends JComponent { generalPath.closePath(); } + /** + * 设置是否关闭当前打开的模板 + * @param isCloseCurrent + */ + @Deprecated + public void setIsCloseCurrent(boolean isCloseCurrent) { + TemplateTabManager.getInstance().setCloseCurrent(isCloseCurrent); + } - private void closeAndFreeLock(@Nonnull JTemplate template) { - FILE file = template.getEditingFILE(); - // 只有是环境内的文件,才执行释放锁 - if (file != null && file.isEnvFile()) { - // release lock - TemplateResourceManager.getResource().closeTemplate(file.getPath()); - } + /** + * 关闭模板 + * + * @param specifiedTemplate 模板 + */ + @Deprecated + public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { + TemplateTabManager.getInstance().closeSpecifiedTemplate(specifiedTemplate); } @@ -710,6 +684,40 @@ public class MultiTemplateTabPane extends JComponent { return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); } + /** + * 后台关闭当前编辑模板 + */ + @Deprecated + public void closeCurrentTpl() { + TemplateTabManager.getInstance().closeCurrentTpl(); + } + + /** + * 关闭模板 + * + * @param closedTemplate 模板 + */ + @Deprecated + public void closeFormat(JTemplate closedTemplate) { + TemplateTabManager.getInstance().closeFormat(closedTemplate); + } + + /** + * 关闭掉一个模板之后激活新的待显示模板 + */ + @Deprecated + public void activePrevTemplateAfterClose() { + TemplateTabManager.getInstance().activePrevTemplateAfterClose(); + } + + /** + * 处理自动新建的模板 在切换时的处理 + */ + @Deprecated + public void doWithtemTemplate() { + TemplateTabManager.getInstance().doWithtemTemplate(); + } + private int getTemplateIndex(int evtX) { int textX = 0; 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 715cc94ba0..c83c5ca800 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 @@ -186,6 +186,13 @@ public class SaveSomeTemplatePane extends BasicPane { return isAllSaved; } + /** + * 兼容方法 + */ + @Deprecated + public void populate() { + populate(HistoryTemplateListPane.getInstance().getHistoryList()); + } private void populate(java.util.List> opendedTemplate) { JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java index f5dca0c005..499706f523 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java @@ -230,6 +230,13 @@ public class TemplateTabManager { return resultMap; } + /** + * 留作兼容 + */ + public void activePrevTemplateAfterClose(){ + getCurrentOperator().activePrevTemplateAfterClose(); + } + /** * 关闭其他 */ diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java index 98d48ad4af..a9a317a8b4 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java @@ -121,4 +121,9 @@ public interface TemplateTabOperateProvider { */ String getTemplateShowName(JTemplate jTemplate); + + /** + * 留作兼容,在关闭模板后激活前一个模板 + */ + void activePrevTemplateAfterClose(); } diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java index 7793a26dcf..3f67fb69b2 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java @@ -262,6 +262,14 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr activePrevTemplateAfterClose(specifiedTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); } + /** + * 关闭掉一个模板之后激活新的待显示模板 + */ + @Override + public void activePrevTemplateAfterClose(){ + activePrevTemplateAfterClose(TemplateTabManager.getInstance().isCloseCurrent()); + } + /** * 关闭掉一个模板之后激活新的待显示模板 */ From c600233de6061525f41c6945b1414e1217899f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 14 Apr 2023 15:08:58 +0800 Subject: [PATCH 098/625] =?UTF-8?q?REPORT-83195=20=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E7=82=B9=E4=BC=98=E5=8C=96-=E6=A0=B9=E6=8D=AE=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../developer/EventDispatchDeveloperMode.java | 37 ++++++++----------- .../com/fr/design/worker/save/SaveWorker.java | 37 +++++++++---------- .../worker/save/type/SaveTypeWorker.java | 10 ++++- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java b/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java index 4fd136da37..a87e900ac1 100644 --- a/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java +++ b/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java @@ -1,6 +1,7 @@ package com.fr.design.carton.developer; +import com.aspose.words.Run; import com.fr.concurrent.FineExecutors; import com.fr.design.carton.EventDispatchThreadHangMonitor; import com.fr.design.ui.util.UIUtil; @@ -33,7 +34,9 @@ public final class EventDispatchDeveloperMode extends EventQueue { */ public static final long CHECK_INTERVAL_MS = 5; - private Timer timer; + private static final int CORE_THREAD_SIZE = 5; + + private ScheduledExecutorService timer; /** * edt事件最大允许的时间 @@ -76,6 +79,7 @@ public final class EventDispatchDeveloperMode extends EventQueue { long nowTime = System.currentTimeMillis(); long totalTime = nowTime - awtEventInfo.getStartDispatchTimeMillis(); long continuationTime = nowTime - awtEventInfo.getLastDispatchTimeMillis(); + //判断连续执行时间是否超过了20ms,超过了则进行提示 if (continuationTime > MAX_TIME) { FineLoggerFactory.getLogger() .warn("awt event spend time more than 20ms, totalTime {} continuationTime {} the stack is {}" @@ -99,26 +103,8 @@ public final class EventDispatchDeveloperMode extends EventQueue { */ public void initTimer() { final long initialDelayMs = 0; - final boolean daemon = true; - timer = new Timer("EventDispatchDeveloperMode", daemon); - timer.schedule(new HangChecker(), initialDelayMs, CHECK_INTERVAL_MS); - } - - /** - * /消除Timer - */ - public void stopTimer() { - if (timer != null) { - timer.cancel(); - } - } - - /** - * /定时执行的任务 - */ - public class HangChecker extends TimerTask { - @Override - public void run() { + timer = FineExecutors.newScheduledThreadPool(CORE_THREAD_SIZE); + timer.schedule(() -> { synchronized (dispatches) { //如果链表为空定时检测就不进行 if (dispatches.isEmpty()) { @@ -126,6 +112,15 @@ public final class EventDispatchDeveloperMode extends EventQueue { } dispatches.getLast().checkForHang(); } + }, initialDelayMs, TimeUnit.MILLISECONDS); + } + + /** + * /消除Timer + */ + public void stopTimer() { + if (timer != null) { + timer.shutdown(); } } diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index 188aedacb9..cd1fcb3dd0 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -7,6 +7,7 @@ import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.ui.util.UIUtil; import com.fr.design.worker.WorkerManager; +import com.fr.design.worker.save.type.SaveTypeWorker; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; @@ -87,26 +88,24 @@ public class SaveWorker extends SwingWorker { this.execute(); // worker纳入管理 WorkerManager.getInstance().registerWorker(taskName, this); - if (!slowly) { - new Thread(() -> { - while (true) { - if (stopWatch.getTime() > TIME_OUT || isDone()) { - if (!isDone()) { - slowly = true; - UIUtil.invokeLaterIfNeeded(() -> { - // 开始禁用 - if (slowly) { - EastRegionContainerPane.getInstance().updateAllPropertyPane(); - DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showCover(); - DesignerFrameFileDealerPane.getInstance().stateChange(); - } - }); - } - stopWatch.stop(); - break; + SaveTypeWorker.saveTypePool.execute(() -> { + while (true) { + if (stopWatch.getTime() > TIME_OUT || isDone()) { + if (!isDone()) { + slowly = true; + UIUtil.invokeLaterIfNeeded(() -> { + // 开始禁用 + if (slowly) { + EastRegionContainerPane.getInstance().updateAllPropertyPane(); + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showCover(); + DesignerFrameFileDealerPane.getInstance().stateChange(); + } + }); } + stopWatch.stop(); + break; } - }).start(); - } + } + }); } } diff --git a/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java index e087f701f7..b004dea7d2 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java @@ -1,6 +1,7 @@ package com.fr.design.worker.save.type; +import com.fr.concurrent.FineExecutors; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.EastRegionContainerPane; @@ -10,6 +11,7 @@ import com.fr.third.org.apache.commons.lang3.time.StopWatch; import javax.swing.SwingWorker; import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; /** * 判断保存类别时执行的worker @@ -20,6 +22,8 @@ import java.util.concurrent.Callable; */ public class SaveTypeWorker extends SwingWorker { + public static final ExecutorService saveTypePool = FineExecutors.newSingleThreadExecutor(); + private final Callable callable; private static final int TIME_OUT = 400; @@ -28,6 +32,8 @@ public class SaveTypeWorker extends SwingWorker { private final SaveType saveType; + + public SaveTypeWorker(Callable callable, JTemplate template) { this.callable = callable; this.template = template; @@ -52,7 +58,7 @@ public class SaveTypeWorker extends SwingWorker { StopWatch stopWatch = StopWatch.createStarted(); this.template.setSaving(true); this.execute(); - new Thread(() -> { + saveTypePool.execute(() -> { while (true) { //大于最大等待时间或者worker已经完成该线程都要结束循环 if (stopWatch.getTime() > TIME_OUT || isDone()) { @@ -70,6 +76,6 @@ public class SaveTypeWorker extends SwingWorker { break; } } - }).start(); + }); } } From e1c6e99c1b7fbf674b5d208276c5cdbe7a914588 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 15:09:14 +0800 Subject: [PATCH 099/625] =?UTF-8?q?fix=EF=BC=9A=E4=BB=A3=E7=A0=81=E8=A7=84?= =?UTF-8?q?=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/file/MultiTemplateTabPane.java | 6 +++--- 1 file changed, 3 insertions(+), 3 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 01e45816eb..3078c54d1e 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 @@ -668,14 +668,14 @@ public class MultiTemplateTabPane extends JComponent { private boolean isOverCloseIcon(int evtX) { - boolean isOverCloseIcon = false; + boolean overCloseIcon = false; for (int i = 0; i < startX.length; i++) { if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) { - isOverCloseIcon = true; + overCloseIcon = true; break; } } - return isOverCloseIcon; + return overCloseIcon; } From e2c4db30a80b8686c87b9ee7b151bf6456f21a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 14 Apr 2023 15:10:03 +0800 Subject: [PATCH 100/625] =?UTF-8?q?REPORT-83195=20=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E7=82=B9=E4=BC=98=E5=8C=96-=E6=A0=B9=E6=8D=AE=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/carton/developer/EventDispatchDeveloperMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java b/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java index a87e900ac1..5381ff7ff2 100644 --- a/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java +++ b/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java @@ -34,7 +34,7 @@ public final class EventDispatchDeveloperMode extends EventQueue { */ public static final long CHECK_INTERVAL_MS = 5; - private static final int CORE_THREAD_SIZE = 5; + private static final int CORE_THREAD_SIZE = 1; private ScheduledExecutorService timer; From 135f588ff103020ae0f75b28ff8bcdedd714c1c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 14 Apr 2023 15:15:38 +0800 Subject: [PATCH 101/625] =?UTF-8?q?REPORT-83195=20=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E7=82=B9=E4=BC=98=E5=8C=96-=E6=A0=B9=E6=8D=AE=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/carton/SwitchForSwingChecker.java | 5 +++-- .../src/main/java/com/fr/design/worker/save/SaveWorker.java | 2 +- .../java/com/fr/design/worker/save/type/SaveTypeWorker.java | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java index 837bdb1c8b..2f884bc301 100644 --- a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java +++ b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java @@ -58,6 +58,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { * 简单记录事件执行时间的开关 */ private static boolean easyChecker = false; + /** * 一个标识位用于区分耗时任务时长检测(简单检测)和timer检测 */ @@ -331,7 +332,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { MAIN(NORMAL_MAIN_CLASS_NAME) { @Override void initEventQueue() { - if (StringUtils.equals("true", System.getProperty(CARTON_DEVELOPER_JVM_PARAM))) { + if (StringUtils.equals(TURE_JVM, System.getProperty(CARTON_DEVELOPER_JVM_PARAM))) { EventDispatchDeveloperMode.INSTANCE.initMonitoring(); } else { EventDispatchThreadHangMonitor.initMonitoring(); @@ -353,7 +354,7 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { MainClassType(String classPath) { this.classPath = classPath; } - + public static final String TURE_JVM = "true"; String classPath; /** diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index cd1fcb3dd0..83b7c50d49 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -88,7 +88,7 @@ public class SaveWorker extends SwingWorker { this.execute(); // worker纳入管理 WorkerManager.getInstance().registerWorker(taskName, this); - SaveTypeWorker.saveTypePool.execute(() -> { + SaveTypeWorker.SAVE_TYPE_POOL.execute(() -> { while (true) { if (stopWatch.getTime() > TIME_OUT || isDone()) { if (!isDone()) { diff --git a/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java index b004dea7d2..d415537eb4 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/type/SaveTypeWorker.java @@ -22,7 +22,7 @@ import java.util.concurrent.ExecutorService; */ public class SaveTypeWorker extends SwingWorker { - public static final ExecutorService saveTypePool = FineExecutors.newSingleThreadExecutor(); + public static final ExecutorService SAVE_TYPE_POOL = FineExecutors.newSingleThreadExecutor(); private final Callable callable; @@ -58,7 +58,7 @@ public class SaveTypeWorker extends SwingWorker { StopWatch stopWatch = StopWatch.createStarted(); this.template.setSaving(true); this.execute(); - saveTypePool.execute(() -> { + SAVE_TYPE_POOL.execute(() -> { while (true) { //大于最大等待时间或者worker已经完成该线程都要结束循环 if (stopWatch.getTime() > TIME_OUT || isDone()) { From 855a032de3113a05f41ba3d2984c17ac767c41fc Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 14 Apr 2023 15:26:09 +0800 Subject: [PATCH 102/625] =?UTF-8?q?REPORT-93901=20=E6=89=93=E5=BC=80js?= =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=BC=96=E8=BE=91=E7=95=8C=E9=9D=A2=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E5=8D=A1=E6=AD=BB=E9=9C=80=E9=87=8D=E5=90=AF?= =?UTF-8?q?=20&=20REPORT-83195=20=E5=8D=A1=E9=A1=BF=E7=82=B9=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E5=8D=A1=E9=A1=BF/=E5=8D=A1=E6=AD=BB=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JSContentWithDescriptionPane.java | 62 +++++++++++++------ 1 file changed, 44 insertions(+), 18 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 8e8ef45b9f..dc74d7e991 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 @@ -50,6 +50,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.concurrent.ExecutionException; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; @@ -59,6 +60,7 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTree; +import javax.swing.SwingWorker; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TreeSelectionEvent; @@ -352,27 +354,51 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private void doHelpDocumentSearch() { Object value = interfaceNameList.getSelectedValue(); if (value != null) { - String url = CloudCenter.getInstance().acquireUrlByKind("af.doc_search", DOCUMENT_SEARCH_URL) + value.toString(); - try { - String result = HttpToolbox.get(url); - JSONObject jsonObject = new JSONObject(result); - JSONArray jsonArray = jsonObject.optJSONArray("list"); - if (jsonArray != null) { - DefaultListModel helpDOCModel = (DefaultListModel) helpDOCList.getModel(); - helpDOCModel.clear(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject resultJSONObject = jsonArray.optJSONObject(i); - String docURL = resultJSONObject.optString("url"); - String name = resultJSONObject.optString("title").trim(); - HelpDocument helpDocument = new HelpDocument(docURL, name); - helpDOCModel.addElement(helpDocument); + new SwingWorker, Void>() { + @Override + protected List doInBackground() throws Exception { + List helpDocuments = new ArrayList<>(); + updateHelpDocuments(value, helpDocuments); + return helpDocuments; + } + + @Override + protected void done() { + try { + List helpDocuments = get(); + DefaultListModel helpDOCModel = (DefaultListModel) helpDOCList.getModel(); + helpDOCModel.clear(); + for (HelpDocument helpDocument : helpDocuments) { + helpDOCModel.addElement(helpDocument); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); } } - } catch (JSONException e) { - FineLoggerFactory.getLogger().debug(e.getMessage(), e); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + + }.execute(); + } + } + + private void updateHelpDocuments(Object value, List helpDocuments) { + String url = CloudCenter.getInstance().acquireUrlByKind("af.doc_search", DOCUMENT_SEARCH_URL) + value.toString(); + try { + String result = HttpToolbox.get(url); + JSONObject jsonObject = new JSONObject(result); + JSONArray jsonArray = jsonObject.optJSONArray("list"); + if (jsonArray != null) { + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject resultJSONObject = jsonArray.optJSONObject(i); + String docURL = resultJSONObject.optString("url"); + String name = resultJSONObject.optString("title").trim(); + HelpDocument helpDocument = new HelpDocument(docURL, name); + helpDocuments.add(helpDocument); + } } + } catch (JSONException e) { + FineLoggerFactory.getLogger().debug(e.getMessage(), e); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } From f44541c77e9f786b3221945f71b24194d71dd9fd Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 14 Apr 2023 15:29:13 +0800 Subject: [PATCH 103/625] =?UTF-8?q?REPORT-93901=20=E6=89=93=E5=BC=80js?= =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=BC=96=E8=BE=91=E7=95=8C=E9=9D=A2=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E5=8D=A1=E6=AD=BB=E9=9C=80=E9=87=8D=E5=90=AF?= =?UTF-8?q?=20&=20REPORT-83195=20=E5=8D=A1=E9=A1=BF=E7=82=B9=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E5=8D=A1=E9=A1=BF/=E5=8D=A1=E6=AD=BB=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= 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 dc74d7e991..3be90999f1 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 @@ -372,7 +372,7 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi helpDOCModel.addElement(helpDocument); } } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } From 0671f5442e72d333d871cfaaf7e88c944ade9fc6 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 14 Apr 2023 15:44:28 +0800 Subject: [PATCH 104/625] =?UTF-8?q?REPORT-93901=20=E6=89=93=E5=BC=80js?= =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=BC=96=E8=BE=91=E7=95=8C=E9=9D=A2=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E5=8D=A1=E6=AD=BB=E9=9C=80=E9=87=8D=E5=90=AF?= =?UTF-8?q?=20&=20REPORT-83195=20=E5=8D=A1=E9=A1=BF=E7=82=B9=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E5=8D=A1=E9=A1=BF/=E5=8D=A1=E6=AD=BB=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= 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 3be90999f1..e2a8dd0d5c 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 @@ -356,7 +356,7 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi if (value != null) { new SwingWorker, Void>() { @Override - protected List doInBackground() throws Exception { + protected List doInBackground() { List helpDocuments = new ArrayList<>(); updateHelpDocuments(value, helpDocuments); return helpDocuments; From b1486e5031b001c6334a7c04325d1121355c6f8b Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 15:50:10 +0800 Subject: [PATCH 105/625] =?UTF-8?q?fix=EF=BC=9A=E4=BB=A3=E7=A0=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/impl/EmptyTemplateTabOperator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java index 3f4ef4d99f..9951157fde 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java @@ -116,4 +116,9 @@ public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { public String getTemplateShowName(JTemplate jTemplate) { return StringUtils.EMPTY; } + + @Override + public void activePrevTemplateAfterClose() { + + } } From 5155311b6e203d96432a8db4019fd75b05b6bd9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Fri, 14 Apr 2023 16:04:58 +0800 Subject: [PATCH 106/625] =?UTF-8?q?REPORT-83195=20=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E7=82=B9=E4=BC=98=E5=8C=96-=E5=9B=9E=E9=80=80=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E5=BC=80=E5=8F=91=E8=80=85=E6=A8=A1=E5=BC=8F=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=AE=BE=E8=AE=A1=E6=9C=89?= =?UTF-8?q?=E7=82=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/carton/SwitchForSwingChecker.java | 75 +--------- .../design/carton/developer/AwtEventInfo.java | 73 --------- .../developer/EventDispatchDeveloperMode.java | 141 ------------------ 3 files changed, 5 insertions(+), 284 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java delete mode 100644 designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java diff --git a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java index 2f884bc301..683179293e 100644 --- a/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java +++ b/designer-base/src/main/java/com/fr/design/carton/SwitchForSwingChecker.java @@ -1,7 +1,6 @@ package com.fr.design.carton; -import com.fr.design.carton.developer.EventDispatchDeveloperMode; import com.fr.design.i18n.Toolkit; import com.fr.general.GeneralUtils; import com.fr.json.JSON; @@ -30,22 +29,11 @@ import java.util.Map; import java.util.Date; import java.util.Calendar; - public class SwitchForSwingChecker implements XMLReadable, XMLWriter { /** * Designer4Debug类名 */ private static final String DEBUG_MAIN_CLASS_NAME = "com.fr.start.Designer4Debug"; - - /** - * 真正主类 - */ - private static final String NORMAL_MAIN_CLASS_NAME = "com.fr.start.MainDesigner"; - - /** - * 开发者模式jvm参数 - */ - private static final String CARTON_DEVELOPER_JVM_PARAM = "cartonDeveloper"; /** * XML标签 */ @@ -58,7 +46,6 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { * 简单记录事件执行时间的开关 */ private static boolean easyChecker = false; - /** * 一个标识位用于区分耗时任务时长检测(简单检测)和timer检测 */ @@ -262,7 +249,11 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { */ public static void initThreadMonitoring () { String mainClass = System.getProperty("sun.java.command"); - MainClassType.getMainClassType(mainClass).initEventQueue(); + //判断一下,如果是以Designer4Debug启动,就不注册代码,不然会覆盖掉SwingExplorer,导致其无法使用 + if (!StringUtils.equals(mainClass, DEBUG_MAIN_CLASS_NAME)) { + EventDispatchThreadHangMonitor.initMonitoring(); + AppContext.getAppContext().put(SwingWorker.class, CartonThreadExecutorPool.getTimerThreadExecutorPool()); + } } /** @@ -318,60 +309,4 @@ public class SwitchForSwingChecker implements XMLReadable, XMLWriter { writer.end(); } - /** - * 根据程序启动类路径进行区分 - * - * @author John.Ying - * @since 11.0 - * Created on 2023/4/14 - */ - enum MainClassType { - /** - * 用mainDesigner启动 - */ - MAIN(NORMAL_MAIN_CLASS_NAME) { - @Override - void initEventQueue() { - if (StringUtils.equals(TURE_JVM, System.getProperty(CARTON_DEVELOPER_JVM_PARAM))) { - EventDispatchDeveloperMode.INSTANCE.initMonitoring(); - } else { - EventDispatchThreadHangMonitor.initMonitoring(); - AppContext.getAppContext().put(SwingWorker.class, CartonThreadExecutorPool.getTimerThreadExecutorPool()); - } - } - }, - - /** - * designer4debug启动 - */ - DEBUG_MAIN(DEBUG_MAIN_CLASS_NAME) { - @Override - void initEventQueue() { - - } - }; - - MainClassType(String classPath) { - this.classPath = classPath; - } - public static final String TURE_JVM = "true"; - String classPath; - - /** - * 初始化重写的EDT - */ - abstract void initEventQueue(); - - /** - * @param classPath 启动类路径 - */ - static MainClassType getMainClassType(String classPath) { - for (MainClassType mainClassType : MainClassType.values()) { - if (StringUtils.equals(classPath, mainClassType.classPath)) { - return mainClassType; - } - } - return MAIN; - } - } } diff --git a/designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java b/designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java deleted file mode 100644 index 77274a36ab..0000000000 --- a/designer-base/src/main/java/com/fr/design/carton/developer/AwtEventInfo.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.fr.design.carton.developer; - -import java.awt.AWTEvent; - -/** - * EDT事件的包装类,用来额外处理信息 - * - * @author John.Ying - * @since 11.0 - * Created on 2023/4/14 - */ -public class AwtEventInfo { - //获取执行该事件的线程 - private final Thread eventDispatchThread = Thread.currentThread(); - //在队列中等待执行的事件最后未执行的时间,当有一个事件执行完后就遍历dispatches给该值赋当前时间 - private long lastDispatchTimeMillis = System.currentTimeMillis(); - //事件开始的时间 - private final long startDispatchTimeMillis = System.currentTimeMillis(); - //awt事件 - private AWTEvent awtEvent; - //事件堆栈 - private StackTraceElement[] stackTrace; - - /** - * 检查是否要给堆栈赋值 - */ - public void checkForHang() { - if (isNeedToStackTrace()) { - this.stackTrace = eventDispatchThread.getStackTrace(); - } - } - - /** - * 是否需要赋值堆栈满足 - * 耗时>20ms - */ - private boolean isNeedToStackTrace() { - return (System.currentTimeMillis() - startDispatchTimeMillis) > EventDispatchDeveloperMode.MAX_TIME - && stackTrace == null; - } - - public Thread getEventDispatchThread() { - return eventDispatchThread; - } - - public long getLastDispatchTimeMillis() { - return lastDispatchTimeMillis; - } - - public void setLastDispatchTimeMillis(long lastDispatchTimeMillis) { - this.lastDispatchTimeMillis = lastDispatchTimeMillis; - } - - public long getStartDispatchTimeMillis() { - return startDispatchTimeMillis; - } - - public AWTEvent getAwtEvent() { - return awtEvent; - } - - public void setAwtEvent(AWTEvent awtEvent) { - this.awtEvent = awtEvent; - } - - public StackTraceElement[] getStackTrace() { - return stackTrace; - } - - public void setStackTrace(StackTraceElement[] stackTrace) { - this.stackTrace = stackTrace; - } -} diff --git a/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java b/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java deleted file mode 100644 index 5381ff7ff2..0000000000 --- a/designer-base/src/main/java/com/fr/design/carton/developer/EventDispatchDeveloperMode.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.fr.design.carton.developer; - - -import com.aspose.words.Run; -import com.fr.concurrent.FineExecutors; -import com.fr.design.carton.EventDispatchThreadHangMonitor; -import com.fr.design.ui.util.UIUtil; -import com.fr.log.FineLoggerFactory; - -import java.awt.AWTEvent; -import java.awt.EventQueue; -import java.awt.Toolkit; -import java.util.LinkedList; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -/** - * 开发者模式重写的EDT - * - * @author John.Ying - * @since 11.0 - * Created on 2023/4/14 - */ -public final class EventDispatchDeveloperMode extends EventQueue { - - /** - * 该链表为主要的实现定时任务的容器,在重写的dispatchEvent中由pre方法将DispatchInfo加入到链表,由post方法remove - */ - private final LinkedList dispatches = new LinkedList<>(); - /** - * 开启间隔检测后两次检测的相隔时间ms - */ - public static final long CHECK_INTERVAL_MS = 5; - - private static final int CORE_THREAD_SIZE = 1; - - private ScheduledExecutorService timer; - - /** - * edt事件最大允许的时间 - */ - public static final long MAX_TIME = 20; - public static final EventDispatchDeveloperMode INSTANCE = new EventDispatchDeveloperMode(); - - @Override - protected void dispatchEvent(AWTEvent event) { - try { - preDispatchEvent(event); - super.dispatchEvent(event); - } finally { - postDispatchEvent(); - } - } - - /** - * 事件分发前处理 - */ - private synchronized void preDispatchEvent(AWTEvent event) { - synchronized (dispatches) { - AwtEventInfo awtEventInfo = new AwtEventInfo(); - awtEventInfo.setAwtEvent(event); - dispatches.addLast(awtEventInfo); - } - } - - /** - * 事件分发后处理 - */ - private synchronized void postDispatchEvent() { - synchronized (dispatches) { - AwtEventInfo awtEventInfo = dispatches.removeLast(); - //嵌套最深的事件执行完毕后刷新链表中其他事件的lastDispatchTimeMillis - Thread currentEventDispatchThread = Thread.currentThread(); - for (AwtEventInfo info : dispatches) { - info.setLastDispatchTimeMillis(System.currentTimeMillis()); - } - long nowTime = System.currentTimeMillis(); - long totalTime = nowTime - awtEventInfo.getStartDispatchTimeMillis(); - long continuationTime = nowTime - awtEventInfo.getLastDispatchTimeMillis(); - //判断连续执行时间是否超过了20ms,超过了则进行提示 - if (continuationTime > MAX_TIME) { - FineLoggerFactory.getLogger() - .warn("awt event spend time more than 20ms, totalTime {} continuationTime {} the stack is {}" - , totalTime, continuationTime, EventDispatchThreadHangMonitor.stackTraceToStringForConsole(awtEventInfo.getStackTrace())); - } - } - } - - /** - * 将swing中默认的EventQueue换成自己的 - */ - public void initMonitoring() { - UIUtil.invokeLaterIfNeeded(() -> Toolkit.getDefaultToolkit().getSystemEventQueue().push(INSTANCE)); - initTimer(); - startFilterModalWindow(); - } - - /** - * Sets up a timer to check for hangs frequently. - * 初始化一个Timer - */ - public void initTimer() { - final long initialDelayMs = 0; - timer = FineExecutors.newScheduledThreadPool(CORE_THREAD_SIZE); - timer.schedule(() -> { - synchronized (dispatches) { - //如果链表为空定时检测就不进行 - if (dispatches.isEmpty()) { - return; - } - dispatches.getLast().checkForHang(); - } - }, initialDelayMs, TimeUnit.MILLISECONDS); - } - - /** - * /消除Timer - */ - public void stopTimer() { - if (timer != null) { - timer.shutdown(); - } - } - - /** - * 消除模态框影响 - */ - public void startFilterModalWindow() { - ScheduledExecutorService scheduledExecutorService = FineExecutors.newSingleThreadScheduledExecutor(); - scheduledExecutorService.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - UIUtil.invokeLaterIfNeeded(() -> { - //不用干事,切个片就可以 - }); - } - }, 0, 10, TimeUnit.MILLISECONDS); - } -} From 5ea46e516d6a1f8fa6643cb542241be882f4ddf7 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 16:28:08 +0800 Subject: [PATCH 107/625] =?UTF-8?q?fix=EF=BC=9A=E4=BB=A3=E7=A0=81=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/MultiTemplateTabMenuFactory.java | 1 + 1 file changed, 1 insertion(+) 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 edbe9cbab3..3ba3fe79eb 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 @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; /** + * 右侧下拉菜单的工厂类 * @author Carlson * @since 11.0 * created on 2023-04-14 From 16259563b3f8da9b3d107c17bff763b77d9101f0 Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 16:50:47 +0800 Subject: [PATCH 108/625] =?UTF-8?q?fix=EF=BC=9A=E4=BB=A3=E7=A0=81=E8=A7=84?= =?UTF-8?q?=E8=8C=83?= 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 +- .../src/main/java/com/fr/design/mainframe/JTemplate.java | 2 +- 2 files changed, 2 insertions(+), 2 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 3078c54d1e..0292bb8f95 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 @@ -56,7 +56,7 @@ import java.util.List; /** * 改个名字,一个拼写 n 个错误 - * + * 模板tab的操作和ui已拆分,后续需要添加模板tab的操作在 TemplateTabManager 中添加 * @author daisy * @version 11.0 *

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 dbf63e077c..cb2831fc33 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 @@ -616,7 +616,7 @@ public abstract class JTemplate> * @return 是则返回true */ public boolean isALLSaved() { - return this.saved && this.authoritySaved && this.canBeSaved(); + return this.canBeSaved() && this.saved && this.authoritySaved; } From 6584f614a4e46d66f39278c593fedaf451a545ac Mon Sep 17 00:00:00 2001 From: kerry Date: Fri, 14 Apr 2023 17:05:18 +0800 Subject: [PATCH 109/625] =?UTF-8?q?=E6=94=B9=E4=B8=8B=E7=B1=BB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/file/TemplateTabManager.java | 4 ++-- ...plateTabOperator.java => EmptyTemplateTabOperate.java} | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) rename designer-base/src/main/java/com/fr/design/file/impl/{EmptyTemplateTabOperator.java => EmptyTemplateTabOperate.java} (87%) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java index 499706f523..fe294f222f 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java @@ -2,7 +2,7 @@ package com.fr.design.file; import com.finebi.cbb.utils.CompareUtils; import com.fr.design.file.impl.DefaultTemplateTabOperate; -import com.fr.design.file.impl.EmptyTemplateTabOperator; +import com.fr.design.file.impl.EmptyTemplateTabOperate; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.file.FILE; @@ -285,7 +285,7 @@ public class TemplateTabManager { return provider; } } - return EmptyTemplateTabOperator.getInstance(); + return EmptyTemplateTabOperate.getInstance(); } } diff --git a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java similarity index 87% rename from designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java rename to designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java index 9951157fde..c35a4bf655 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperator.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java @@ -15,13 +15,13 @@ import java.util.List; * @since 11.0 * created on 2023-04-14 **/ -public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { +public class EmptyTemplateTabOperate implements TemplateTabOperateProvider { private static class Holder { - private static final EmptyTemplateTabOperator SINGLETON = new EmptyTemplateTabOperator(); + private static final EmptyTemplateTabOperate SINGLETON = new EmptyTemplateTabOperate(); } - private EmptyTemplateTabOperator() { + private EmptyTemplateTabOperate() { } @@ -29,7 +29,7 @@ public class EmptyTemplateTabOperator implements TemplateTabOperateProvider { * 返回空的模板taboperator单例 * @return */ - public static EmptyTemplateTabOperator getInstance() { + public static EmptyTemplateTabOperate getInstance() { return Holder.SINGLETON; } From 2fd647f030254ba91ad79b14edb253219c204bbc Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 14 Apr 2023 17:26:45 +0800 Subject: [PATCH 110/625] =?UTF-8?q?REPORT-91074=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JSContentWithDescriptionPane.java | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 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 e2a8dd0d5c..c42e3b80d4 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 @@ -18,7 +18,6 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.jsapi.JSAPITreeHelper; import com.fr.design.javascript.jsapi.JSAPIUserObject; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; @@ -26,6 +25,26 @@ import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; + +import javax.swing.BorderFactory; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.SwingWorker; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; @@ -51,25 +70,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.ExecutionException; -import javax.swing.BorderFactory; -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.SwingWorker; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; public class JSContentWithDescriptionPane extends JSContentPane implements KeyListener { @@ -119,6 +119,15 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private static final String RELOAD_CARD = "reloadCard"; private static final String DOC_LIST_CARD = "docListCard"; + /** + * 云中心Js高级编辑器帮助链接前缀在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Js_Editor"; + + /** + * 云中心Js高级编辑器帮助链接前缀在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Js_Editor_Default"; public JSContentWithDescriptionPane(String[] args) { this.setLayout(new BorderLayout()); //=============================== @@ -381,7 +390,7 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi } private void updateHelpDocuments(Object value, List helpDocuments) { - String url = CloudCenter.getInstance().acquireUrlByKind("af.doc_search", DOCUMENT_SEARCH_URL) + value.toString(); + String url = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); try { String result = HttpToolbox.get(url); JSONObject jsonObject = new JSONObject(result); From 69f2982c2bdd19c69e3d2285016b8666cb02a0ca Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 14 Apr 2023 17:31:14 +0800 Subject: [PATCH 111/625] =?UTF-8?q?REPORT-91074=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/javascript/JSContentWithDescriptionPane.java | 1 + 1 file changed, 1 insertion(+) 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 c42e3b80d4..3b8d04ffb3 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 @@ -14,6 +14,7 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itextfield.PlaceholderTextField; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.jsapi.JSAPITreeHelper; import com.fr.design.javascript.jsapi.JSAPIUserObject; From 817eed5c799360a1aaac93b69b2c0df58725187e Mon Sep 17 00:00:00 2001 From: kerry Date: Mon, 17 Apr 2023 18:48:58 +0800 Subject: [PATCH 112/625] =?UTF-8?q?REPORT-75308=20FVS=E5=A4=A7=E5=B1=8F?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=94=AF=E6=8C=81=E5=90=8C=E6=97=B6=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=A4=9A=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/SwitchExistEnv.java | 2 +- .../fr/design/file/SaveSomeTemplatePane.java | 19 ++++----------- .../file/impl/AbstractTemplateTabOperate.java | 24 ++++++++++++++----- .../com/fr/design/mainframe/JTemplate.java | 8 +++++++ 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index e38a39895a..33761a92e2 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -68,7 +68,7 @@ public class SwitchExistEnv extends MenuDef { EnvChangeEntrance.getInstance().chooseEnv(envName); } else { SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true); - if (saveSomeTemplatePane.showSavePane(true)) { + if (saveSomeTemplatePane.showSavePane()) { // 用户模板保存后,才进行切换目录操作 EnvChangeEntrance.getInstance().switch2Env(envName); } 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 c83c5ca800..23dfe83a57 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 @@ -84,6 +84,7 @@ public class SaveSomeTemplatePane extends BasicPane { for (int i = 0; i < unSavedTemplate.size(); i++) { templateCheckBoxes[i] = new UICheckBox(unSavedTemplate.get(i).getEditingFILE().getName()); templateCheckBoxes[i].setSelected(true); + templateCheckBoxes[i].setEnabled(!unSavedTemplate.get(i).mustSaveBeforeSwitchEnv()); } final UIList templatesList = new UIList(templateCheckBoxes); @@ -103,7 +104,9 @@ public class SaveSomeTemplatePane extends BasicPane { boolean isSelected = chooseAllCheckBox.isSelected(); for (int i = 0; i < templatesList.getModel().getSize(); i++) { UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(i); - checkBox.setSelected(isSelected); + boolean mustSaveBeforeSwitchEnv = unSavedTemplate.get(i).mustSaveBeforeSwitchEnv(); + checkBox.setSelected(mustSaveBeforeSwitchEnv || isSelected); + templateCheckBoxes[i].setEnabled(!mustSaveBeforeSwitchEnv); } templatesList.repaint(); } @@ -150,24 +153,12 @@ public class SaveSomeTemplatePane extends BasicPane { return count; } - /** * 显示未保存弹窗 * @return */ public boolean showSavePane() { - return showSavePane(false); - } - - /** - * 显示未保存弹窗 - * @param switchEnv - * @return - */ - public boolean showSavePane(boolean switchEnv) { - return switchEnv ? - showSavePane(DefaultTemplateTabOperate.getInstance().getOpenedJTemplates()) : - showSavePane(HistoryTemplateListPane.getInstance().getHistoryList()); + return showSavePane(HistoryTemplateListPane.getInstance().getHistoryList()); } /** diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java index 3f67fb69b2..75319d7e70 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java @@ -45,7 +45,7 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr //用于存放工作簿 private java.util.List> openedTemplate = new ArrayList<>(); //选中的Tab项 - private int selectedIndex = -1; + private int selectedIndex = 0; public AbstractTemplateTabOperate() { @@ -257,9 +257,10 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr } private void closeTpl(@Nonnull JTemplate specifiedTemplate) { + JTemplate currentSelectedFile = getSelectedFile(); HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); closeAndFreeLock(specifiedTemplate); - activePrevTemplateAfterClose(specifiedTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + activePrevTemplateAfterClose(specifiedTemplate == currentSelectedFile, currentSelectedFile); } /** @@ -270,12 +271,24 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr activePrevTemplateAfterClose(TemplateTabManager.getInstance().isCloseCurrent()); } + /** * 关闭掉一个模板之后激活新的待显示模板 */ public void activePrevTemplateAfterClose(boolean isCurrentSelectedTpl) { + activePrevTemplateAfterClose(isCurrentSelectedTpl, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + } + + /** + * 关闭掉一个模板之后激活新的待显示模板 + */ + public void activePrevTemplateAfterClose(boolean isCurrentSelectedTpl, JTemplate currentSelectedJTemplate) { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean couldSwitch = template != null && this.accept(template.getTemplateTabOperatorType()); if (openedTemplate.isEmpty()) { - TemplateTabManager.getInstance().activeNewTemplate(); + if (couldSwitch){ + TemplateTabManager.getInstance().activeNewTemplate(); + } selectedIndex = 0; } else { // 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板; @@ -290,10 +303,9 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr } // 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index else { - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - selectedIndex = this.openedTemplate.indexOf(template); + selectedIndex = this.openedTemplate.indexOf(currentSelectedJTemplate); } - if (selectedIndex < openedTemplate.size()) { + if ( selectedIndex < openedTemplate.size() && couldSwitch) { //如果是已后台关闭的模板,则重新打开文件 openedTemplate.get(selectedIndex).activeOldJTemplate(); } 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 3ede09d5ec..a92d59d072 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 @@ -2082,4 +2082,12 @@ public abstract class JTemplate> public boolean supportCache(){ return true; } + + /** + * 切换环境之前是否一定要保存 + * @return + */ + public boolean mustSaveBeforeSwitchEnv(){ + return false; + } } From cb75658d64b6b329175f601404ee57beacbed867 Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 18 Apr 2023 10:03:55 +0800 Subject: [PATCH 113/625] =?UTF-8?q?fix=EF=BC=9A=E5=85=88=E6=94=B9=E5=9B=9E?= =?UTF-8?q?=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/impl/AbstractTemplateTabOperate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java index 75319d7e70..6406c1d46b 100644 --- a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java +++ b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java @@ -45,7 +45,7 @@ public abstract class AbstractTemplateTabOperate implements TemplateTabOperatePr //用于存放工作簿 private java.util.List> openedTemplate = new ArrayList<>(); //选中的Tab项 - private int selectedIndex = 0; + private int selectedIndex = -1; public AbstractTemplateTabOperate() { From cb2f63f31d52b38ccd56365827b4e5acfb5f4a8c Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 18 Apr 2023 17:30:53 +0800 Subject: [PATCH 114/625] =?UTF-8?q?REPORT-75308=20=20=E6=96=B9=E6=A1=88?= =?UTF-8?q?=E5=9B=9E=E9=80=80=EF=BC=8C=E4=BD=BF=E7=94=A8=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/CloseCurrentTemplateAction.java | 8 +- .../fr/design/actions/file/RenameAction.java | 4 +- .../java/com/fr/design/file/CloseOption.java | 68 --- .../design/file/HistoryTemplateListCache.java | 41 +- .../file/MultiTemplateTabMenuFactory.java | 351 ----------- .../fr/design/file/MultiTemplateTabPane.java | 576 ++++++++++++++---- .../fr/design/file/MutilTempalteTabPane.java | 6 +- .../com/fr/design/file/NewTemplatePane.java | 6 +- .../fr/design/file/SaveSomeTemplatePane.java | 34 +- .../fr/design/file/TemplateTabManager.java | 291 --------- .../file/TemplateTabOperateProvider.java | 129 ---- .../file/impl/AbstractTemplateTabOperate.java | 376 ------------ .../file/impl/DefaultTemplateTabOperate.java | 41 -- .../file/impl/EmptyTemplateTabOperate.java | 124 ---- .../fr/design/mainframe/DesignerFrame.java | 4 +- .../DesignerFrameFileDealerPane.java | 10 +- .../com/fr/design/mainframe/JTemplate.java | 32 +- .../mainframe/toolbar/ToolBarMenuDock.java | 4 +- .../vcs/ui/FileVersionCellEditor.java | 8 +- .../mainframe/vcs/ui/FileVersionsPanel.java | 8 +- .../com/fr/design/worker/open/OpenWorker.java | 4 +- .../designer/toolbar/TemplateTransformer.java | 8 +- .../main/java/com/fr/start/BaseDesigner.java | 6 +- .../start/common/DesignerOpenEmptyPanel.java | 4 +- .../fr/design/fit/common/TemplateTool.java | 4 +- .../fr/design/preview/DeveloperPreview.java | 5 +- .../com/fr/design/mainframe/JWorkBook.java | 4 +- .../main/java/com/fr/start/MainDesigner.java | 4 +- 28 files changed, 547 insertions(+), 1613 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/file/CloseOption.java delete mode 100644 designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java delete mode 100644 designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java delete mode 100644 designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java delete mode 100644 designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java delete mode 100644 designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java delete mode 100644 designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java diff --git a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java index b2ab237d7d..22263a871e 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java @@ -3,7 +3,7 @@ package com.fr.design.actions.file; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; @@ -28,9 +28,9 @@ public class CloseCurrentTemplateAction extends UpdateAction { * @param e 事件 */ public void actionPerformed(ActionEvent e) { - TemplateTabManager.getInstance().setCloseCurrent(true); - TemplateTabManager.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); - TemplateTabManager.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); + MultiTemplateTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java b/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java index 33f51b77aa..842292ce2a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java @@ -7,7 +7,7 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.FileOperations; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; @@ -88,7 +88,7 @@ public class RenameAction extends UpdateAction { } new FileRenameDialog(node); - TemplateTabManager.getInstance().refresh(); + MultiTemplateTabPane.getInstance().repaint(); DesignerFrameFileDealerPane.getInstance().stateChange(); } diff --git a/designer-base/src/main/java/com/fr/design/file/CloseOption.java b/designer-base/src/main/java/com/fr/design/file/CloseOption.java deleted file mode 100644 index ecb70d6a5f..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/CloseOption.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.fr.design.file; - -import com.fr.design.i18n.Toolkit; - -/** - * @author kerry - * @since 11.0 - * created on 2023-04-14 - **/ -public enum CloseOption { - - /** - * 关闭左侧所有模板 - */ - Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { - @Override - public boolean shouldClose(int tplIndex, int i) { - return i < tplIndex; - } - }, - - /** - * 关闭右侧所有模板 - */ - Right(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Right")) { - @Override - public boolean shouldClose(int tplIndex, int i) { - return i > tplIndex; - } - }, - - /** - * 关闭所有模板 - */ - All(Toolkit.i18nText("Fine-Design_Close_All_templates")), - - /** - * 关闭其他模板 - */ - Others(Toolkit.i18nText("Fine-Design_Close_Other_templates")) { - @Override - public boolean shouldClose(int tplIndex, int i) { - return i != tplIndex; - } - }; - - - private String optionName; - - public String getOptionName() { - return this.optionName; - } - - CloseOption(String optionName) { - this.optionName = optionName; - } - - /** - * 判断指定索引模板是否应该被关闭 - * @param tplIndex - * @param i - * @return - */ - public boolean shouldClose(int tplIndex, int i) { - return true; - } - -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 083aa2ed08..86820aa227 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -75,7 +75,7 @@ public class HistoryTemplateListCache implements CallbackEvent { historyList.remove(contains(selected)); selected.getEditingFILE().closeTemplate(); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Closed_Warn_Text", selected.getEditingFILE().getName())); - TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); + MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } @@ -134,10 +134,10 @@ public class HistoryTemplateListCache implements CallbackEvent { if (contains(jt) == -1) { addHistory(); } - TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); + MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); //设置tab栏为当前选中的那一栏 if (editingTemplate != null) { - TemplateTabManager.getInstance().resetSelectIndex(jt); + MultiTemplateTabPane.getInstance().setSelectedIndex(contains(jt)); } } @@ -268,14 +268,13 @@ public class HistoryTemplateListCache implements CallbackEvent { boolean replaceWithJVirtualTemplate = overTemplate.getEditingFILE().exists() && overTemplate.isALLSaved() && overTemplate != editingTemplate - && overTemplate.checkEnable() - && overTemplate.supportCache(); + && overTemplate.checkEnable(); if (replaceWithJVirtualTemplate) { closeVirtualSelectedReport(overTemplate); historyList.set(i, new JVirtualTemplate(overTemplate.getEditingFILE())); } } - TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); + MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); } @@ -286,27 +285,35 @@ public class HistoryTemplateListCache implements CallbackEvent { // path like reportlets/xx/xxx/xxx String path = file.getPath() + suffix; - List list = new ArrayList(); - for(JTemplate jTemplate : historyList){ - list.add(jTemplate); - } - ListIterator> iterator = list.listIterator(); + + ListIterator> iterator = historyList.listIterator(); + while (iterator.hasNext()) { JTemplate template = iterator.next(); String tPath = template.getPath(); if (isDir ? tPath.startsWith(path) : tPath.equals(path)) { - historyList.remove(template); - TemplateTabManager.getInstance().deleteOpenedTemplate(template); + int size = getHistoryCount(); + iterator.remove(); + int index = iterator.nextIndex(); + if (size == index + 1 && index > 0) { + //如果删除的是后一个Tab,则定位到前一个 + MultiTemplateTabPane.getInstance().setSelectedIndex(index - 1); + } } } + //如果打开过,则删除,实时刷新多tab面板 + int openFileCount = getHistoryCount(); + if (openFileCount == 0) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } - JTemplate selectedFile = TemplateTabManager.getInstance().getSelectedFile(); + JTemplate selectedFile = MultiTemplateTabPane.getInstance().getSelectedFile(); if (!isCurrentEditingFile(selectedFile.getPath())) { //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 DesignerContext.getDesignerFrame().activateJTemplate(selectedFile); } - TemplateTabManager.getInstance().refresh(); + MultiTemplateTabPane.getInstance().repaint(); } @@ -467,7 +474,7 @@ public class HistoryTemplateListCache implements CallbackEvent { int index = contains(this.editingTemplate); this.editingTemplate = jt; historyList.set(index, jt); - TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); - TemplateTabManager.getInstance().resetSelectIndex(jt); + MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList); + MultiTemplateTabPane.getInstance().setSelectedIndex(contains(jt)); } } 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 deleted file mode 100644 index 3ba3fe79eb..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java +++ /dev/null @@ -1,351 +0,0 @@ -package com.fr.design.file; - -import com.fr.design.constants.UIConstants; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.imenu.UIMenuItem; -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.file.FILE; -import com.fr.general.IOUtils; -import com.fr.stable.StringUtils; -import com.fr.stable.collections.CollectionUtils; -import com.fr.third.javax.annotation.Nonnull; - -import javax.swing.BorderFactory; -import javax.swing.Icon; -import javax.swing.JPanel; -import javax.swing.SwingConstants; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 右侧下拉菜单的工厂类 - * @author Carlson - * @since 11.0 - * created on 2023-04-14 - **/ -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 int ITEM_SIZE = 25; - - private UIScrollPopUpMenu menu = null; - - private static MultiTemplateTabMenuFactory INSTANCE = new MultiTemplateTabMenuFactory(); - - private MultiTemplateTabMenuFactory() { - - } - - /** - * 返回右侧下拉菜单的工厂类 - * @return - */ - public static MultiTemplateTabMenuFactory getInstance() { - return INSTANCE; - } - - /** - * tab上的下拉菜单 - */ - public UIScrollPopUpMenu createMenu() { - menu = new UIScrollPopUpMenu(); - menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); - - menu.add(initCloseOther()); - menu.add(createEmptyRow()); - menu.addSeparator(); - menu.add(createEmptyRow()); - menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Current_Category_Templates"))); - Component[] items = createCurrentCategory(); - for (Component item : items) { - menu.add(item); - } - items = createOtherCategory(); - if (items.length > 0) { - menu.addSeparator(); - menu.add(createEmptyRow()); - menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Other_Category_Templates"))); - for (Component item : items) { - menu.add(item); - } - } - Dimension dimension = menu.getPreferredSize(); - dimension.width += ITEM_SIZE; - menu.setPreferredSize(dimension); - return menu; - } - - /** - * 关闭其它按钮 - */ - private UIMenuItem initCloseOther() { - UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_Tab_Close_Other_Templates_Of_Current_Category")); - closeOther.setHorizontalAlignment(SwingConstants.CENTER); - Dimension dimension = closeOther.getPreferredSize(); - dimension.height = ITEM_SIZE; - closeOther.setPreferredSize(dimension); - closeOther.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - TemplateTabManager.getInstance().closeOthers(); - } - - }); - if (TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() <= 1) { - closeOther.setEnabled(false); - } - return closeOther; - } - - private void closeAndFreeLock(@Nonnull JTemplate template) { - FILE file = template.getEditingFILE(); - // 只有是环境内的文件,才执行释放锁 - if (file != null && file.isEnvFile()) { - // release lock - TemplateResourceManager.getResource().closeTemplate(file.getPath()); - } - } - - /** - * 美观用 - */ - private JPanel createEmptyRow() { - return new JPanel() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }; - } - - /** - * 模板分类item - */ - private UIButton createCategory(String categoryName) { - UIButton button = new UIButton(categoryName); - button.setBorderPainted(false); - button.setExtraPainted(false); - button.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - button.setHorizontalAlignment(SwingConstants.LEFT); - button.setForeground(UIConstants.FLESH_BLUE); - return button; - } - - /** - * 创建 当前分类模板 item数组 - */ - private Component[] createCurrentCategory() { - return createListDownItem(TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates()); - } - - /** - * 创建 其它分类模板 item数组 - */ - private Component[] createOtherCategory() { - List> openedTemplates = new ArrayList<>(); - Map>> map = TemplateTabManager.getInstance().getAllOpenedTemplateMap(); - for (Map.Entry>> entry : map.entrySet()) { - if (!StringUtils.equals(TemplateTabManager.getInstance().getCurrentOperator().getOperatorType(), entry.getKey())) { - openedTemplates.addAll(entry.getValue()); - } - } - return createListDownItem(openedTemplates); - } - - /** - * 根据template列表创建多个item - */ - private Component[] createListDownItem(List> openedTemplates) { - if (!CollectionUtils.isEmpty(openedTemplates)) { - Component[] templates = new Component[openedTemplates.size()]; - for (int i = 0; i < openedTemplates.size(); i++) { - templates[i] = createListDownMenuItem(openedTemplates.get(i)); - } - return templates; - } - return new Component[0]; - } - - /** - * 根据template对象创建item - */ - private Component createListDownMenuItem(JTemplate template) { - JPanel jPanel = new JPanel(); - jPanel.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); - jPanel.setLayout(new BorderLayout()); - - MenuItemButtonGroup menuItemButtonGroup = new MenuItemButtonGroup(template); - if (template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { - menuItemButtonGroup.templateButton.setForeground(UIConstants.FLESH_BLUE); - } - - jPanel.add(menuItemButtonGroup.iconButton, BorderLayout.WEST); - jPanel.add(menuItemButtonGroup.templateButton, BorderLayout.CENTER); - jPanel.add(menuItemButtonGroup.closeButton, BorderLayout.EAST); - - return jPanel; - } - - /** - * menu的item由模板图标、模板名、模板关闭按钮组成 - */ - private class MenuItemButtonGroup { - - private final UIButton iconButton; - private final UIButton templateButton; - private final UIButton closeButton; - - public MenuItemButtonGroup(JTemplate template) { - iconButton = createIconButton(template); - templateButton = createTemplateButton(template); - closeButton = createCloseButton(); - initListener(template); - } - - /** - * item[0] 模板图标按钮初始化 - */ - private UIButton createIconButton(JTemplate template) { - UIButton button = new UIButton(template.getIcon(), template.getIcon(), template.getIcon()); - button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - return button; - } - - /** - * item[1] 切换模板按钮初始化 - */ - private UIButton createTemplateButton(JTemplate template) { - UIButton button = new UIButton(TemplateUtils.createLockeTemplatedName(template, template.getTemplateName())); - button.setBorderPainted(false); - button.setExtraPainted(false); - button.setPreferredSize(new Dimension(menu.getWidth() - ITEM_SIZE * 2, ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - button.setHorizontalAlignment(SwingConstants.LEFT); - return button; - } - - /** - * item[2] 关闭模板图标按钮初始化 - */ - private UIButton createCloseButton() { - UIButton button = new UIButton(CLOSE, MOUSE_OVER_CLOSE, MOUSE_PRESS_CLOSE); - button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); - button.setOpaque(true); - button.setBackground(UIConstants.NORMAL_BACKGROUND); - button.setVisible(false); - return button; - } - - private void initListener(JTemplate template) { - initIconButtonListener(); - initTemplateButtonListener(template); - initCloseButtonListener(template); - } - - /** - * item[0] 模板图标按钮鼠标事件 - */ - private void initIconButtonListener() { - iconButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(MouseEvent e) { - fireMouseEnteredEvent(); - } - - @Override - public void mouseExited(MouseEvent e) { - fireMouseExitedEvent(); - } - }); - } - - /** - * item[1] 切换模板按钮鼠标事件 - */ - private void initTemplateButtonListener(JTemplate template) { - templateButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - menu.setVisible(false); - TemplateTabManager.getInstance().switchByJTemplate(template); - } - - @Override - public void mouseEntered(MouseEvent e) { - fireMouseEnteredEvent(); - } - - @Override - public void mouseExited(MouseEvent e) { - fireMouseExitedEvent(); - } - }); - } - - /** - * item[2] 关闭模板按钮鼠标事件 - */ - private void initCloseButtonListener(JTemplate template) { - closeButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - menu.setVisible(false); - TemplateTabManager.getInstance().closeByJTemplate(template); - } - - @Override - public void mouseEntered(MouseEvent e) { - fireMouseEnteredEvent(); - } - - @Override - public void mouseExited(MouseEvent e) { - fireMouseExitedEvent(); - } - }); - } - - /** - * mouse移入item范围 - */ - private void fireMouseEnteredEvent() { - iconButton.setBackground(UIConstants.HOVER_BLUE); - templateButton.setBackground(UIConstants.HOVER_BLUE); - closeButton.setBackground(UIConstants.HOVER_BLUE); - closeButton.setVisible(true); - } - - /** - * mouse移出item范围 - */ - private void fireMouseExitedEvent() { - iconButton.setBackground(UIConstants.NORMAL_BACKGROUND); - templateButton.setBackground(UIConstants.NORMAL_BACKGROUND); - closeButton.setBackground(UIConstants.NORMAL_BACKGROUND); - closeButton.setVisible(false); - } - - } - -} 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 0292bb8f95..8e302fd977 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 @@ -1,25 +1,38 @@ package com.fr.design.file; +import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.base.svg.IconUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.file.LocateAction; import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.TemplateSavingChecker; +import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; import com.fr.design.utils.DesignUtils; +import com.fr.design.utils.TemplateUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.design.worker.WorkerManager; +import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.file.FILE; +import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; +import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; +import com.fr.third.javax.annotation.Nonnull; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.lock.TplOperator; import javax.swing.BorderFactory; import javax.swing.ButtonModel; @@ -28,8 +41,11 @@ import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.MenuElement; +import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.plaf.basic.BasicMenuItemUI; import java.awt.AWTEvent; @@ -43,6 +59,7 @@ import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -54,9 +71,14 @@ import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.util.List; +import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; +import static javax.swing.JOptionPane.OK_CANCEL_OPTION; +import static javax.swing.JOptionPane.OK_OPTION; +import static javax.swing.JOptionPane.WARNING_MESSAGE; + /** * 改个名字,一个拼写 n 个错误 - * 模板tab的操作和ui已拆分,后续需要添加模板tab的操作在 TemplateTabManager 中添加 + * * @author daisy * @version 11.0 *

@@ -92,6 +114,10 @@ public class MultiTemplateTabPane extends JComponent { private static MultiTemplateTabPane THIS; + //用于存放工作簿 + private java.util.List> openedTemplate; + //选中的Tab项 + private int selectedIndex = 0; // private int mouseOveredIndex = -1; @@ -110,11 +136,16 @@ public class MultiTemplateTabPane extends JComponent { //记录关闭按钮的状态 private int closeIconIndex = -1; - + private boolean isCloseCurrent = false; private Icon clodeMode = CLOSE; private Icon listDownMode = LIST_DOWN; private boolean isShowList = false; + //自动新建的模板B若没有进行任何编辑,切换到其他 + // + // 模板时,模板B会自动关闭 + private JTemplate temTemplate = null; + public static MultiTemplateTabPane getInstance() { if (THIS == null) { @@ -134,6 +165,8 @@ public class MultiTemplateTabPane extends JComponent { this.setBorder(null); this.setForeground(new Color(58, 56, 58)); this.setFont(DesignUtils.getDefaultGUIFont().applySize(12)); + openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); + selectedIndex = openedTemplate.size() - 1; AWTEventListener awt = new AWTEventListener() { @Override public void eventDispatched(AWTEvent event) { @@ -173,13 +206,45 @@ public class MultiTemplateTabPane extends JComponent { //根据当前i18n语言环境,动态调整popupMenu的宽度 menu.setPreferredSize(new Dimension((int) DesignSizeI18nManager.getInstance(). i18nDimension("com.fr.design.file.MultiTemplateTabPane.popUpMenu").getWidth(), height)); - GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, e.getX(), MultiTemplateTabPane.this.getY() - 1 + MultiTemplateTabPane.this.getHeight()); + GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), e.getX(), MultiTemplateTabPane.getInstance().getY() - 1 + MultiTemplateTabPane.getInstance().getHeight()); } } } }); } + enum CloseOption { + Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { + @Override + boolean shouldClose(int tplIndex, int i) { + return i < tplIndex; + } + }, + Right(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Right")) { + @Override + boolean shouldClose(int tplIndex, int i) { + return i > tplIndex; + } + }, + All(Toolkit.i18nText("Fine-Design_Close_All_templates")), + Others(Toolkit.i18nText("Fine-Design_Close_Other_templates")) { + @Override + boolean shouldClose(int tplIndex, int i) { + return i != tplIndex; + } + }; + + + String optionName; + + CloseOption(String optionName) { + this.optionName = optionName; + } + + boolean shouldClose(int tplIndex, int i) { + return true; + } + } private static class CloseMenuItemJSeparator extends JSeparator { @Override @@ -207,10 +272,41 @@ public class MultiTemplateTabPane extends JComponent { @Override public void actionPerformed(ActionEvent e) { - //DefaultTemplateTabOperate.getInstance().locateTemplateInTree(this.tplIndex); - TemplateTabManager.getInstance().getCurrentOperator().locateTemplateInTree(this.tplIndex); + //处于搜索模式时,先退出搜索模式,再定位 + if (TemplateTreeSearchManager.getInstance().isInSearchMode()) { + TemplateTreeSearchManager.getInstance().outOfSearchMode(); + TemplateTreePane.getInstance().refreshDockingView(); + } + JTemplate template = openedTemplate.get(this.tplIndex); + locateTemplate(template); } + private void locateTemplate(JTemplate template) { + FILE currentTemplate = template.getEditingFILE(); + //模板不属于当前环境,跟预览一样先提示保存,再定位模板 + //如果是拖拽进来的模板单单用exist不能判断,这边参考预览的判断逻辑(browserTemplate),补充一下 + if (!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) { + int selVal = showConfirmDialog( + DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), + Toolkit.i18nText("Fine-Design_Basic_Preview_Tool_Tips"), + OK_CANCEL_OPTION, + WARNING_MESSAGE + ); + if (OK_OPTION == selVal) { + CallbackSaveWorker worker = template.saveAs(); + worker.start(template.getRuntimeId()); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + gotoEditingTemplateLeaf(template.getPath()); + } + }); + } + } else { + gotoEditingTemplateLeaf(template.getPath()); + } + } } private class RightMenuCloseAction extends UpdateAction { @@ -220,82 +316,230 @@ public class MultiTemplateTabPane extends JComponent { public RightMenuCloseAction(CloseOption option, int tplIndex) { this.option = option; - this.setName(option.getOptionName()); + this.setName(option.optionName); this.tplIndex = tplIndex; } @Override public void actionPerformed(ActionEvent e) { - TemplateTabManager.getInstance().getCurrentOperator().closeAction(option, this.tplIndex); - MultiTemplateTabPane.this.repaint(); + SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); + if (saveSomeTempaltePane.showSavePane()) { + + 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); + + if (option == CloseOption.All) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } else { + DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); + } + + MultiTemplateTabPane.getInstance().repaint(); + } + } + + private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate) { + for (int i = 0; i < templates.length; i++) { + if (option.shouldClose(tplIndex, i)) { + JTemplate jTemplate = templates[i]; + if (jTemplate == currentTemplate) { + currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; + } + //判断关闭的模板是不是格式刷的被参照的模板 + openedTemplate.remove(jTemplate); + if (jTemplate != currentTemplate) { + MultiTemplateTabPane.getInstance().closeFormat(jTemplate); + HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); + closeAndFreeLock(jTemplate); + } + } + } } + private void closeAndFreeLock(@Nonnull JTemplate template) { + FILE file = template.getEditingFILE(); + // 只有是环境内的文件,才执行释放锁 + if (file != null && file.isEnvFile()) { + // release lock + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); + } + } } - /** - * 留作兼容 - * @return - */ - @Deprecated public JTemplate getSelectedFile() { - return TemplateTabManager.getInstance().getSelectedFile(); + if (openedTemplate.size() == selectedIndex) { + selectedIndex = Math.max(--selectedIndex, 0); + } + return openedTemplate.get(selectedIndex); } + /** * 关闭掉当前已打开文件列表中指定的文件 * * @param file 指定的文件 */ - @Deprecated public void closeFileTemplate(FILE file) { - TemplateTabManager.getInstance().closeFileTemplate(file); + for (JTemplate temp : openedTemplate) { + if (ComparatorUtils.equals(file, temp.getEditingFILE())) { + closeSpecifiedTemplate(temp); + break; + } + } + } + @Override + public Dimension getPreferredSize() { + Dimension dimension = super.getPreferredSize(); + dimension.height = HEIGHT; + return dimension; + } + + private UIMenuItem initCloseOther() { + UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); + // Yvan: 英文下文本显示不全,后续发现如果将模板名设置的比较短,其它语言也会出现显示不全的问题,所以设置一下文本水平居中 + closeOther.setHorizontalAlignment(SwingConstants.CENTER); + setListDownItemPreferredSize(closeOther); + closeOther.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (openedTemplate.size() == 1) { + return; + } + if (!TemplateSavingChecker.check()) { + return; + } + SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); + //点击关闭其他模板,并且点击确定保存 + if (saveSomeTempaltePane.showSavePane()) { + JTemplate[] panes = new JTemplate[openedTemplate.size()]; + for (int i = 0; i < openedTemplate.size(); i++) { + panes[i] = openedTemplate.get(i); + } + for (int i = 0; i < panes.length; i++) { + if (i != selectedIndex) { + JTemplate jTemplate = panes[i]; + //判断关闭的模板是不是格式刷的被参照的模板 + openedTemplate.remove(jTemplate); + closeFormat(jTemplate); + HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); + closeAndFreeLock(jTemplate); + } + } + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + HistoryTemplateListCache.getInstance().removeAllHistory(); + DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); + THIS.repaint(); + } + //如果取消保存了,则不关闭其他模板 + } + }); + if (openedTemplate.size() == 1) { + closeOther.setEnabled(false); + } + return closeOther; + } + + + private UIMenuItem[] createListDownTemplate() { + UIMenuItem[] templates = new UIMenuItem[openedTemplate.size()]; + for (int i = 0; i < openedTemplate.size(); i++) { + final int index = i; + final JTemplate tem = openedTemplate.get(i); + templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); + templates[i].setUI(new UIListDownItemUI()); + setListDownItemPreferredSize(templates[i]); + if (i == selectedIndex) { + //画选中的高亮 + templates[i].setBackground(UIConstants.SHADOW_CENTER); + } + templates[i].addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + selectedIndex = index; + tem.activeNewJTemplate(); + } + }); + } + return templates; + } + + private void setListDownItemPreferredSize(UIMenuItem item) { + Dimension dimension = item.getPreferredSize(); + dimension.height = LIST_DOWN_HEIGHT; + item.setPreferredSize(dimension); + } + + + private String tempalteShowName(JTemplate template) { + String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()); + if (!template.isSaved() && !name.endsWith(" *")) { + name += " *"; + } + return name; + } /** * 刷新打开模板 * * @param history 模板 */ - @Deprecated public void refreshOpenedTemplate(List> history) { - TemplateTabManager.getInstance().refreshOpenedTemplate(history); + openedTemplate = history; } - /** - * 设置临时Template - * @param auotCreate - */ - @Deprecated public void setTemTemplate(JTemplate auotCreate) { - TemplateTabManager.getInstance().setTemTemplate(auotCreate); + temTemplate = auotCreate; } - /** - * 设置选中模板索引 - * @param index - */ - @Deprecated - public void setSelectedIndex(int index) { - TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(index); - } - @Override - public Dimension getPreferredSize() { - Dimension dimension = super.getPreferredSize(); - dimension.height = HEIGHT; - return dimension; - } + private void showListDown() { - private String tempalteShowName(JTemplate template) { - return TemplateTabManager.getInstance().getTemplateShowName(template); + UIScrollPopUpMenu menu = new UIScrollPopUpMenu(); + menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); + menu.add(initCloseOther()); + JSeparator separator = new JSeparator() { + @Override + public Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + d.height = 1; + return d; + } + }; + menu.add(new JPanel() { + @Override + public Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + d.height = 1; + return d; + } + }); + separator.setForeground(UIConstants.LINE_COLOR); + menu.add(separator); + menu.add(new JPanel() { + @Override + public Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + d.height = 1; + return d; + } + }); + UIMenuItem[] items = createListDownTemplate(); + for (int i = 0; i < items.length; i++) { + menu.add(items[i]); + } + GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), MultiTemplateTabPane.getInstance().getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); } - private void showListDown() { - UIScrollPopUpMenu menu = MultiTemplateTabMenuFactory.getInstance().createMenu(); - GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, MultiTemplateTabPane.this.getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); + public void setSelectedIndex(int index) { + selectedIndex = index; } @@ -322,18 +566,15 @@ public class MultiTemplateTabPane extends JComponent { paintDefaultBackground(g2d); //最多能画的个数 int maxTemplateNum = (int) (maxWidth) / MINWIDTH; - int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); - int currentSelectedIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); //计算开始画的最小模板index和最大模板index calMinAndMaxIndex(maxTemplateNum); calculateRealAverageWidth(maxWidth, maxTemplateNum); int maxStringlength = calculateStringMaxLength(); - if ( currentSelectedIndex >= templateTabCount) { - TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex( - templateTabCount - 1); + if (selectedIndex >= openedTemplate.size()) { + selectedIndex = openedTemplate.size() - 1; } - if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() < 0) { - TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(0); + if (selectedIndex < 0) { + selectedIndex = 0; } double templateStartX = 0; startX = new int[maxPaintIndex - minPaintIndex + 1]; @@ -341,7 +582,7 @@ public class MultiTemplateTabPane extends JComponent { //从可以开始展示在tab面板上的tab开始画 for (int i = minPaintIndex; i <= maxPaintIndex; i++) { - JTemplate template = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); + JTemplate template = openedTemplate.get(i); Icon icon = template.getIcon(); String name = tempalteShowName(template); //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 @@ -358,7 +599,7 @@ public class MultiTemplateTabPane extends JComponent { } else { selectedIcon = CLOSE; } - if (i == TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { + if (i == selectedIndex) { if (template.isSaving()) { selectedIcon = WHITE_SAVING_CLOSE_ICON; } @@ -367,8 +608,8 @@ public class MultiTemplateTabPane extends JComponent { if (template.isSaving()) { selectedIcon = GREY_SAVING_CLOSE_ICON; } - boolean left = i < TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); - startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, left, mouseOveredIndex, i); + boolean isLeft = i < selectedIndex; + startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); } templateStartX += realWidth; } @@ -443,39 +684,38 @@ public class MultiTemplateTabPane extends JComponent { } private void calMinAndMaxIndex(int maxTemplateNum) { - int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); //如果个数大于最多能容纳的个数,则多余的进行处理 - if (templateTabCount > maxTemplateNum) { + if (openedTemplate.size() > maxTemplateNum) { //所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现 - if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= maxPaintIndex) { - minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; - maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); + if (selectedIndex >= maxPaintIndex) { + minPaintIndex = selectedIndex - maxTemplateNum + 1; + maxPaintIndex = selectedIndex; if (minPaintIndex <= 0) { minPaintIndex = 0; maxPaintIndex = maxTemplateNum - 1; } - } else if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() <= minPaintIndex) { + } else if (selectedIndex <= minPaintIndex) { //所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现 - minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); + minPaintIndex = selectedIndex; maxPaintIndex = minPaintIndex + maxTemplateNum - 1; - if (maxPaintIndex > templateTabCount- 1) { - maxPaintIndex = templateTabCount - 1; + if (maxPaintIndex > openedTemplate.size() - 1) { + maxPaintIndex = openedTemplate.size() - 1; } } else { - if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= templateTabCount - 1) { - TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(templateTabCount - 1); - maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); - minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; + if (selectedIndex >= openedTemplate.size() - 1) { + selectedIndex = openedTemplate.size() - 1; + maxPaintIndex = selectedIndex; + minPaintIndex = selectedIndex - maxTemplateNum + 1; } else { maxPaintIndex = minPaintIndex + maxTemplateNum - 1; - if (maxPaintIndex > templateTabCount - 1) { - maxPaintIndex = templateTabCount - 1; + if (maxPaintIndex > openedTemplate.size() - 1) { + maxPaintIndex = openedTemplate.size() - 1; } } } } else { minPaintIndex = 0; - maxPaintIndex = templateTabCount - 1; + maxPaintIndex = openedTemplate.size() - 1; } } @@ -483,7 +723,7 @@ public class MultiTemplateTabPane extends JComponent { //个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 private void calculateRealAverageWidth(double maxwidth, int templateNum) { - int num = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() > templateNum ? templateNum : TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); + int num = openedTemplate.size() > templateNum ? templateNum : openedTemplate.size(); realWidth = (int) (maxwidth / (num)); if (realWidth > MAXWIDTH) { realWidth = MAXWIDTH; @@ -647,13 +887,10 @@ public class MultiTemplateTabPane extends JComponent { generalPath.closePath(); } - /** - * 设置是否关闭当前打开的模板 - * @param isCloseCurrent - */ - @Deprecated + public void setIsCloseCurrent(boolean isCloseCurrent) { - TemplateTabManager.getInstance().setCloseCurrent(isCloseCurrent); + this.isCloseCurrent = isCloseCurrent; + } /** @@ -661,35 +898,57 @@ public class MultiTemplateTabPane extends JComponent { * * @param specifiedTemplate 模板 */ - @Deprecated public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { - TemplateTabManager.getInstance().closeSpecifiedTemplate(specifiedTemplate); - } - + if (specifiedTemplate == null) { + return; + } - private boolean isOverCloseIcon(int evtX) { - boolean overCloseIcon = false; - for (int i = 0; i < startX.length; i++) { - if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) { - overCloseIcon = true; - break; + if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { + specifiedTemplate.stopEditing(); + int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", + Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (returnVal == JOptionPane.YES_OPTION) { + CallbackSaveWorker worker = specifiedTemplate.save(); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + closeTpl(specifiedTemplate); + } + }); + worker.start(specifiedTemplate.getRuntimeId()); + } else if (returnVal == JOptionPane.NO_OPTION) { + closeTpl(specifiedTemplate); } + } else { + closeTpl(specifiedTemplate); } - return overCloseIcon; + } + private void closeTpl(@Nonnull JTemplate specifiedTemplate) { + HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); + closeAndFreeLock(specifiedTemplate); + activePrevTemplateAfterClose(); + } - private boolean isOverListDown(int evtX) { - int maxWidth = getWidth() - LIST_BUTTON_WIDTH; - return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); + private void closeAndFreeLock(@Nonnull JTemplate template) { + FILE file = template.getEditingFILE(); + // 只有是环境内的文件,才执行释放锁 + if (file != null && file.isEnvFile()) { + // release lock + TemplateResourceManager.getResource().closeTemplate(file.getPath()); + } } /** * 后台关闭当前编辑模板 */ - @Deprecated public void closeCurrentTpl() { - TemplateTabManager.getInstance().closeCurrentTpl(); + JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + this.setIsCloseCurrent(true); + this.closeFormat(jTemplate); + this.closeSpecifiedTemplate(jTemplate); } /** @@ -697,25 +956,71 @@ public class MultiTemplateTabPane extends JComponent { * * @param closedTemplate 模板 */ - @Deprecated public void closeFormat(JTemplate closedTemplate) { - TemplateTabManager.getInstance().closeFormat(closedTemplate); + //表单不需要处理 + if (!closedTemplate.isJWorkBook()) { + return; + } + + if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) { + return; + } + + //是被参照的模板被关闭,则重置格式刷 + closedTemplate.doConditionCancelFormat(); } /** * 关闭掉一个模板之后激活新的待显示模板 */ - @Deprecated public void activePrevTemplateAfterClose() { - TemplateTabManager.getInstance().activePrevTemplateAfterClose(); + if (openedTemplate.isEmpty()) { + //新建并激活模板 + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + selectedIndex = 0; + //此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate + temTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + + } else { + // 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板; + // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 + if (closeIconIndex == selectedIndex || isCloseCurrent) { + // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 + if (selectedIndex >= maxPaintIndex) { + // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true + selectedIndex--; + } + isCloseCurrent = false; + } + // 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index + else { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + selectedIndex = HistoryTemplateListCache.getInstance().contains(template); + } + if (selectedIndex < openedTemplate.size()) { + //如果是已后台关闭的模板,则重新打开文件 + openedTemplate.get(selectedIndex).activeOldJTemplate(); + } + + } } - /** - * 处理自动新建的模板 在切换时的处理 - */ - @Deprecated - public void doWithtemTemplate() { - TemplateTabManager.getInstance().doWithtemTemplate(); + + private boolean isOverCloseIcon(int evtX) { + boolean isOverCloseIcon = false; + for (int i = 0; i < startX.length; i++) { + if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) { + isOverCloseIcon = true; + break; + } + } + return isOverCloseIcon; + } + + + private boolean isOverListDown(int evtX) { + int maxWidth = getWidth() - LIST_BUTTON_WIDTH; + return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); } @@ -731,6 +1036,29 @@ public class MultiTemplateTabPane extends JComponent { return -1; } + + /** + * 处理自动新建的模板 在切换时的处理 + */ + public void doWithtemTemplate() { + //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 + //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 + if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { + return; + } + + if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) { + temTemplate = null; + } + + //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 + if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { + HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate); + temTemplate = null; + setSelectedIndex(HistoryTemplateListCache.getInstance().contains(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())); + } + } + private class UIListDownItemUI extends BasicMenuItemUI { @Override protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { @@ -833,13 +1161,44 @@ public class MultiTemplateTabPane extends JComponent { closeIconIndex = getTemplateIndex(evtX); clodeMode = MOUSE_PRESS_CLOSE; //关闭close图标所在的模板{ - TemplateTabManager.getInstance().getCurrentOperator().closeByIndex(closeIconIndex); + JTemplate template = openedTemplate.get(closeIconIndex); + if (template.isOpening()) { + WorkerManager.getInstance().cancelWorker(template.getPath()); + } else if (template.isSaving()) { + boolean completed = WorkerManager.getInstance().isCompleted(template.getTarget().getTemplateID()); + if (!completed) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Close_Template_Tip", template.getEditingFILE().getName())); + return; + } + } + //参考CloseCurrentTemplateAction,在closeFormat与closeSpecifiedTemplate之前要先设定isCloseCurrent,这样关闭之后才会自动切换tab + if (checkCurrentClose(template)) { + setIsCloseCurrent(true); + } + closeFormat(template); + closeSpecifiedTemplate(template); + DesignerContext.getDesignerFrame().getContentFrame().repaint(); isShowList = false; } else { //没有点击关闭和ListDown按钮,则切换到点击的模板处 closeIconIndex = -1; clodeMode = CLOSE; - TemplateTabManager.getInstance().getCurrentOperator().switchTpl(getTemplateIndex(evtX)); + int tempSelectedIndex = selectedIndex; + if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) { + openedTemplate.get(selectedIndex).stopEditing(); + selectedIndex = getTemplateIndex(evtX); + //如果在权限编辑情况下,不允许切换到表单类型的工作簿 + if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); + MultiTemplateTabPane.this.repaint(); + return; + } + JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); + evtXTemplate.activeNewJTemplate(); + } isShowList = false; } MultiTemplateTabPane.this.repaint(); @@ -850,6 +1209,11 @@ public class MultiTemplateTabPane extends JComponent { } + private boolean checkCurrentClose(JTemplate template) { + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + return JTemplate.isValid(currentTemplate) && ComparatorUtils.equals(template.getPath(), currentTemplate.getPath()); + } + private class MultiTemplateTabMouseMotionListener implements MouseMotionListener { /** * 鼠标拖拽 @@ -873,7 +1237,7 @@ public class MultiTemplateTabPane extends JComponent { //看是否需要显示toolTip if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { - setToolTipText(TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(mouseOveredIndex).getEditingFILE().getName()); + setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); } else { setToolTipText(null); } diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index d92533552c..36e0b58754 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -1,7 +1,5 @@ package com.fr.design.file; -import com.fr.design.file.impl.DefaultTemplateTabOperate; - /** * @author shine * @version 10.0 @@ -16,11 +14,11 @@ public class MutilTempalteTabPane { } public void setIsCloseCurrent(boolean b) { - TemplateTabManager.getInstance().setCloseCurrent(b); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(b); } public void activePrevTemplateAfterClose() { - DefaultTemplateTabOperate.getInstance().activePrevTemplateAfterClose(true); + MultiTemplateTabPane.getInstance().activePrevTemplateAfterClose(); } } diff --git a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java index 9949888349..dae921a1c8 100644 --- a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java @@ -81,15 +81,11 @@ public abstract class NewTemplatePane extends JComponent implements MouseListene } if (isOverNewIcon(evtX) && newWorkBookIconMode != GRAY_NEW_CPT) { newWorkBookIconMode = getMousePressNew(); - createNewTemplate(); + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); } this.repaint(); } - protected void createNewTemplate() { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); - } - /** *鼠标松开 * @param e 事件 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 23dfe83a57..72945b31c9 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 @@ -3,8 +3,8 @@ package com.fr.design.file; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.event.StateChangeListener; -import com.fr.design.file.impl.DefaultTemplateTabOperate; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; @@ -19,10 +19,10 @@ import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import javax.swing.*; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; -import java.util.List; /** * Author : daisy @@ -84,7 +84,6 @@ public class SaveSomeTemplatePane extends BasicPane { for (int i = 0; i < unSavedTemplate.size(); i++) { templateCheckBoxes[i] = new UICheckBox(unSavedTemplate.get(i).getEditingFILE().getName()); templateCheckBoxes[i].setSelected(true); - templateCheckBoxes[i].setEnabled(!unSavedTemplate.get(i).mustSaveBeforeSwitchEnv()); } final UIList templatesList = new UIList(templateCheckBoxes); @@ -104,9 +103,7 @@ public class SaveSomeTemplatePane extends BasicPane { boolean isSelected = chooseAllCheckBox.isSelected(); for (int i = 0; i < templatesList.getModel().getSize(); i++) { UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(i); - boolean mustSaveBeforeSwitchEnv = unSavedTemplate.get(i).mustSaveBeforeSwitchEnv(); - checkBox.setSelected(mustSaveBeforeSwitchEnv || isSelected); - templateCheckBoxes[i].setEnabled(!mustSaveBeforeSwitchEnv); + checkBox.setSelected(isSelected); } templatesList.repaint(); } @@ -153,21 +150,9 @@ public class SaveSomeTemplatePane extends BasicPane { return count; } - /** - * 显示未保存弹窗 - * @return - */ - public boolean showSavePane() { - return showSavePane(HistoryTemplateListPane.getInstance().getHistoryList()); - } - /** - * 显示未保存弹窗 - * @param jTemplates - * @return - */ - public boolean showSavePane(List> jTemplates) { - populate(jTemplates); + public boolean showSavePane() { + populate(); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { dialog.setVisible(true); @@ -177,15 +162,8 @@ public class SaveSomeTemplatePane extends BasicPane { return isAllSaved; } - /** - * 兼容方法 - */ - @Deprecated public void populate() { - populate(HistoryTemplateListPane.getInstance().getHistoryList()); - } - - private void populate(java.util.List> opendedTemplate) { + java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); for (int i = 0; i < opendedTemplate.size(); i++) { if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) { diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java deleted file mode 100644 index fe294f222f..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.fr.design.file; - -import com.finebi.cbb.utils.CompareUtils; -import com.fr.design.file.impl.DefaultTemplateTabOperate; -import com.fr.design.file.impl.EmptyTemplateTabOperate; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.JTemplate; -import com.fr.file.FILE; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 模板tab的操作统一管理类 - * @author kerry - * @since 11.0 - * created on 2023-04-14 - **/ -public class TemplateTabManager { - private static class Holder { - private static final TemplateTabManager SINGLETON = new TemplateTabManager(); - } - - /** - * 返回TemplateTabManager单例对象 - * @return - */ - public static TemplateTabManager getInstance() { - return Holder.SINGLETON; - } - - private TemplateTabManager() { - list.add(DefaultTemplateTabOperate.getInstance()); - } - - private List list = new ArrayList<>(); - - /** - * 支持注册新的Operator - * @param templateTabOperateProvider - */ - public void register(TemplateTabOperateProvider templateTabOperateProvider) { - this.list.add(templateTabOperateProvider); - } - - /** - * 移除operator - * @param templateTabOperateProvider - */ - public void remove(TemplateTabOperateProvider templateTabOperateProvider) { - this.list.remove(templateTabOperateProvider); - } - - private boolean closeCurrent = false; - //自动新建的模板B若没有进行任何编辑,切换到其他 - - // 模板时,模板B会自动关闭 - private JTemplate temTemplate = null; - - - public boolean isCloseCurrent() { - return closeCurrent; - } - - public void setCloseCurrent(boolean closeCurrent) { - this.closeCurrent = closeCurrent; - } - - public void setTemTemplate(JTemplate temTemplate) { - this.temTemplate = temTemplate; - } - - /** - * 刷新tab栏 - */ - public void refresh() { - getCurrentOperator().refresh(); - } - - /** - * 从模板树删除文件 - */ - public void deleteOpenedTemplate(JTemplate template) { - TemplateTabOperateProvider provider = getOperatorByTemplate(template); - provider.deleteOpenedTemplate(template); - this.refresh(); - } - - public JTemplate getSelectedFile() { - return getCurrentOperator().getSelectedFile(); - } - - /** - * 关闭掉当前文件列表中指定的文件 - * - * @param file 指定的文件 - */ - public void closeFileTemplate(FILE file) { - for (TemplateTabOperateProvider provider : list) { - provider.closeFileTemplate(file); - } - } - - /** - * 关闭指定模板 - * - * @param specifiedTemplate - */ - public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { - getCurrentOperator().closeSpecifiedTemplate(specifiedTemplate); - } - - - /** - * 刷新打开模板 - * - * @param tempalteLsit - */ - public void refreshOpenedTemplate(List> tempalteLsit) { - for (TemplateTabOperateProvider provider : list) { - provider.refreshOpenedTemplate(tempalteLsit); - } - } - - - /** - * 处理自动新建的模板 在切换时的处理 - */ - public void doWithtemTemplate() { - //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 - //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 - if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { - return; - } - - if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) { - temTemplate = null; - } - - //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 - if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { - HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate); - temTemplate = null; - resetSelectIndex(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); - } - } - - - /** - * 重置选中index - * @param jTemplate - */ - public void resetSelectIndex(JTemplate jTemplate) { - getCurrentOperator().resetSelectIndex(jTemplate); - } - - - /** - * 激活新模板 - */ - public void activeNewTemplate() { - //先看其他模式中是否有已打开的模板,有的话切换过去 - for (TemplateTabOperateProvider templateTabOperateProvider : list) { - if (templateTabOperateProvider.getOpenedJTemplates().size() != 0) { - templateTabOperateProvider.getSelectedFile().activeNewJTemplate(); - refresh(); - return; - - } - } - //都没有的话,新建并激活模板 - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); - //此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate - TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); - refresh(); - } - - /** - * 后台关闭当前编辑模板 - */ - public void closeCurrentTpl() { - JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - this.setCloseCurrent(true); - this.closeFormat(jTemplate); - this.closeSpecifiedTemplate(jTemplate); - } - - - /** - * 关闭指定索引值模板 - * - * @param index - */ - public void closeByIndex(int index) { - getCurrentOperator().closeByIndex(index); - } - - /** - * 关闭指定索引值模板 - * - * @param jTemplate - */ - public void closeByJTemplate(JTemplate jTemplate) { - TemplateTabOperateProvider operator = getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType()); - operator.closeByIndex(operator.getJTemplateIndex(jTemplate)); - } - - /** - * 切换到指定tab栏的指定索引值模板 - * - * @param jTemplate - */ - public void switchByJTemplate(JTemplate jTemplate) { - TemplateTabOperateProvider operator = getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType()); - operator.switchTpl(operator.getJTemplateIndex(jTemplate)); - } - - /** - * 获取所有打开的模板map - * - * @return - */ - public Map>> getAllOpenedTemplateMap() { - Map>> resultMap = new HashMap<>(); - for (TemplateTabOperateProvider provider : list) { - resultMap.put(provider.getOperatorType(), provider.getOpenedJTemplates()); - } - return resultMap; - } - - /** - * 留作兼容 - */ - public void activePrevTemplateAfterClose(){ - getCurrentOperator().activePrevTemplateAfterClose(); - } - - /** - * 关闭其他 - */ - public void closeOthers() { - TemplateTabOperateProvider currentOperator = getCurrentOperator(); - currentOperator.closeAction(CloseOption.Others, - currentOperator.getJTemplateIndex(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())); - } - - public String getTemplateShowName(JTemplate temTemplate){ - return getCurrentOperator().getTemplateShowName(temTemplate); - } - - - /** - * 关闭模板 - * - * @param closedTemplate 模板 - */ - public void closeFormat(JTemplate closedTemplate) { - //表单不需要处理 - if (!closedTemplate.isJWorkBook()) { - return; - } - - if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) { - return; - } - - //是被参照的模板被关闭,则重置格式刷 - closedTemplate.doConditionCancelFormat(); - } - - - public TemplateTabOperateProvider getCurrentOperator() { - return getOperatorByTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); - } - - private TemplateTabOperateProvider getOperatorByTemplate(JTemplate jTemplate) { - return getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType()); - } - - private TemplateTabOperateProvider getOperatorByOperatorType(String type) { - for (TemplateTabOperateProvider provider : list) { - if (CompareUtils.isEqual(provider.getOperatorType(), type)) { - return provider; - } - } - return EmptyTemplateTabOperate.getInstance(); - } - -} diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java b/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java deleted file mode 100644 index a9a317a8b4..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.fr.design.file; - - -import com.fr.design.mainframe.JTemplate; -import com.fr.file.FILE; - -import java.util.List; - -/** - * 模板tab的操作接口 - * @author kerry - * @since 11.0 - * created on 2023-04-14 - **/ -public interface TemplateTabOperateProvider { - /** - * 找到模板树中的位置 - */ - void locateTemplateInTree(int tplIndex); - - - /** - * 右键一系列关闭操作 - * - * @param option closeType - * @param index - */ - void closeAction(CloseOption option, int index); - - - /** - * 切换模板 - * - * @param templateIndex 模板索引值 - */ - void switchTpl(int templateIndex); - - - /** - * 获取打开模板的基本信息 - * - * @return - */ - List> getOpenedJTemplates(); - - - /** - * 根据指定索引关闭模板 - * @param index - */ - void closeByIndex(int index); - /** - * 关闭指定模板 - * - * @param specifiedTemplate - */ - void closeSpecifiedTemplate(JTemplate specifiedTemplate); - /** - * 删除已打开的模板 - */ - void deleteOpenedTemplate(JTemplate template); - - /** - * 获取选中模板 - * @return - */ - JTemplate getSelectedFile(); - - /** - * 刷新ui - */ - void refresh(); - - /** - * 重置下选中的Index - * @param jTemplate - */ - void resetSelectIndex(JTemplate jTemplate); - - /** - * 刷新下打开的模板list - * @param list - */ - void refreshOpenedTemplate(List> list); - - /** - * 关闭指定节点 - * @param file - */ - void closeFileTemplate(FILE file); - - /** - * 获取操作类型标识 - * @return - */ - String getOperatorType(); - - /** - * 获取当前选中模板的index - * @return - */ - int getSelectIndex(); - - /** - * 设置当前选中模板的index - * @return - */ - void setSelectIndex(int index); - - /** - * 获取指定模板在operator中的索引值 - * @param jTemplate - * @return - */ - int getJTemplateIndex(JTemplate jTemplate); - - /** - * 获取template在tab中显示的名称 - * @param jTemplate - * @return - */ - String getTemplateShowName(JTemplate jTemplate); - - - /** - * 留作兼容,在关闭模板后激活前一个模板 - */ - void activePrevTemplateAfterClose(); -} diff --git a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java deleted file mode 100644 index 6406c1d46b..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java +++ /dev/null @@ -1,376 +0,0 @@ -package com.fr.design.file.impl; - -import com.finebi.cbb.utils.CompareUtils; -import com.fr.base.vcs.DesignerMode; -import com.fr.design.actions.file.LocateAction; -import com.fr.design.dialog.FineJOptionPane; -import com.fr.design.file.CloseOption; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.SaveSomeTemplatePane; -import com.fr.design.file.TemplateTabManager; -import com.fr.design.file.TemplateTabOperateProvider; -import com.fr.design.file.TemplateTreePane; -import com.fr.design.i18n.Toolkit; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.JTemplate; -import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; -import com.fr.design.utils.TemplateUtils; -import com.fr.design.worker.WorkerManager; -import com.fr.design.worker.save.CallbackSaveWorker; -import com.fr.file.FILE; -import com.fr.file.FileNodeFILE; -import com.fr.general.ComparatorUtils; -import com.fr.log.FineLoggerFactory; -import com.fr.third.javax.annotation.Nonnull; -import com.fr.workspace.WorkContext; -import com.fr.workspace.server.lock.TplOperator; - -import javax.swing.JOptionPane; -import java.util.ArrayList; -import java.util.List; - -import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; -import static javax.swing.JOptionPane.OK_CANCEL_OPTION; -import static javax.swing.JOptionPane.OK_OPTION; -import static javax.swing.JOptionPane.WARNING_MESSAGE; - -/** - * 模板tab的操作抽象类 - * @author kerry - * @since 11.0 - * created on 2023-04-14 - **/ -public abstract class AbstractTemplateTabOperate implements TemplateTabOperateProvider { - private static final String UNSAVED_SUFFIX = " *"; - //用于存放工作簿 - private java.util.List> openedTemplate = new ArrayList<>(); - //选中的Tab项 - private int selectedIndex = -1; - - public AbstractTemplateTabOperate() { - - } - - @Override - public void locateTemplateInTree(int tplIndex) { - //处于搜索模式时,先退出搜索模式,再定位 - if (TemplateTreeSearchManager.getInstance().isInSearchMode()) { - TemplateTreeSearchManager.getInstance().outOfSearchMode(); - TemplateTreePane.getInstance().refreshDockingView(); - } - JTemplate template = openedTemplate.get(tplIndex); - locateTemplate(template); - } - - private void locateTemplate(JTemplate template) { - FILE currentTemplate = template.getEditingFILE(); - //模板不属于当前环境,跟预览一样先提示保存,再定位模板 - //如果是拖拽进来的模板单单用exist不能判断,这边参考预览的判断逻辑(browserTemplate),补充一下 - boolean needSave = (!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) && template.canBeSaved(); - if (needSave) { - int selVal = showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), Toolkit.i18nText("Fine-Design_Basic_Preview_Tool_Tips"), OK_CANCEL_OPTION, WARNING_MESSAGE); - if (OK_OPTION == selVal) { - CallbackSaveWorker worker = template.saveAs(); - worker.start(template.getRuntimeId()); - worker.addSuccessCallback(new Runnable() { - @Override - public void run() { - LocateAction.gotoEditingTemplateLeaf(template.getPath()); - } - }); - } - } else { - LocateAction.gotoEditingTemplateLeaf(template.getPath()); - } - } - - @Override - public void closeAction(CloseOption option, int index) { - SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(true); - if (saveSomeTempaltePane.showSavePane(this.openedTemplate)) { - - 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, option, index); - - if (openedTemplate.isEmpty()) { - TemplateTabManager.getInstance().activeNewTemplate(); - selectedIndex = 0; - } else { - DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); - } - } - } - - /** - * 根据指定索引值关闭模板 - * @param index - */ - public void closeByIndex(int index) { - //关闭close图标所在的模板{ - JTemplate template = openedTemplate.get(index); - if (template.isOpening()) { - WorkerManager.getInstance().cancelWorker(template.getPath()); - } else if (template.isSaving()) { - boolean completed = WorkerManager.getInstance().isCompleted(template.getTarget().getTemplateID()); - if (!completed) { - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Close_Template_Tip", template.getEditingFILE().getName())); - return; - } - } - //参考CloseCurrentTemplateAction,在closeFormat与closeSpecifiedTemplate之前要先设定isCloseCurrent,这样关闭之后才会自动切换tab - if (checkCurrentClose(template)) { - TemplateTabManager.getInstance().setCloseCurrent(true); - } - TemplateTabManager.getInstance().closeFormat(template); - closeSpecifiedTemplate(template); - DesignerContext.getDesignerFrame().getContentFrame().repaint(); - } - - private boolean checkCurrentClose(JTemplate template) { - JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - return JTemplate.isValid(currentTemplate) && ComparatorUtils.equals(template.getPath(), currentTemplate.getPath()); - } - - private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate, CloseOption option, int tplIndex) { - for (int i = 0; i < templates.length; i++) { - if (option.shouldClose(tplIndex, i)) { - JTemplate jTemplate = templates[i]; - if (jTemplate == currentTemplate) { - currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; - } - //判断关闭的模板是不是格式刷的被参照的模板 - openedTemplate.remove(jTemplate); - if (jTemplate != currentTemplate) { - TemplateTabManager.getInstance().closeFormat(jTemplate); - HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); - closeAndFreeLock(jTemplate); - } - } - } - } - - private void closeAndFreeLock(@Nonnull JTemplate template) { - FILE file = template.getEditingFILE(); - // 只有是环境内的文件,才执行释放锁 - if (file != null && file.isEnvFile()) { - // release lock - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); - } - } - - @Override - public void switchTpl(int templateIndex) { - int tempSelectedIndex = selectedIndex; - JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - boolean shouldSwitch = (selectedIndex != templateIndex || !this.accept(jTemplate.getTemplateTabOperatorType())) - && templateIndex != -1; - if (shouldSwitch) { - openedTemplate.get(selectedIndex).stopEditing(); - selectedIndex = templateIndex; - //如果在权限编辑情况下,不允许切换到表单类型的工作簿 - if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), WARNING_MESSAGE); - return; - } - JTemplate evtTemplate = openedTemplate.get(templateIndex); - evtTemplate.activeNewJTemplate(); - } - } - - @Override - public void deleteOpenedTemplate(JTemplate template) { - if (!openedTemplate.contains(template)) { - return; - } - openedTemplate.remove(template); - if (openedTemplate.size() == 0) { - TemplateTabManager.getInstance().activeNewTemplate(); - return; - } - if (openedTemplate.size() == selectedIndex) { - //如果删除的是后一个Tab,则定位到前一个 - this.selectedIndex--; - } - } - - @Override - public JTemplate getSelectedFile() { - if (openedTemplate.size() == selectedIndex) { - selectedIndex = Math.max(--selectedIndex, 0); - } - return openedTemplate.get(selectedIndex); - } - - - /** - * 关闭掉当前已打开文件列表中指定的文件 - * - * @param file 指定的文件 - */ - public void closeFileTemplate(FILE file) { - for (JTemplate temp : openedTemplate) { - if (ComparatorUtils.equals(file, temp.getEditingFILE())) { - closeSpecifiedTemplate(temp); - break; - } - } - - } - - - /** - * 关闭模板 - * - * @param specifiedTemplate 模板 - */ - public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { - if (specifiedTemplate == null && !openedTemplate.contains(specifiedTemplate)) { - return; - } - - if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { - specifiedTemplate.stopEditing(); - int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (returnVal == JOptionPane.YES_OPTION) { - CallbackSaveWorker worker = specifiedTemplate.save(); - worker.addSuccessCallback(new Runnable() { - @Override - public void run() { - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); - closeTpl(specifiedTemplate); - } - }); - worker.start(specifiedTemplate.getRuntimeId()); - } else if (returnVal == JOptionPane.NO_OPTION) { - closeTpl(specifiedTemplate); - } - } else { - closeTpl(specifiedTemplate); - } - - } - - private void closeTpl(@Nonnull JTemplate specifiedTemplate) { - JTemplate currentSelectedFile = getSelectedFile(); - HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); - closeAndFreeLock(specifiedTemplate); - activePrevTemplateAfterClose(specifiedTemplate == currentSelectedFile, currentSelectedFile); - } - - /** - * 关闭掉一个模板之后激活新的待显示模板 - */ - @Override - public void activePrevTemplateAfterClose(){ - activePrevTemplateAfterClose(TemplateTabManager.getInstance().isCloseCurrent()); - } - - - /** - * 关闭掉一个模板之后激活新的待显示模板 - */ - public void activePrevTemplateAfterClose(boolean isCurrentSelectedTpl) { - activePrevTemplateAfterClose(isCurrentSelectedTpl, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); - } - - /** - * 关闭掉一个模板之后激活新的待显示模板 - */ - public void activePrevTemplateAfterClose(boolean isCurrentSelectedTpl, JTemplate currentSelectedJTemplate) { - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - boolean couldSwitch = template != null && this.accept(template.getTemplateTabOperatorType()); - if (openedTemplate.isEmpty()) { - if (couldSwitch){ - TemplateTabManager.getInstance().activeNewTemplate(); - } - selectedIndex = 0; - } else { - // 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板; - // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 - if (isCurrentSelectedTpl || TemplateTabManager.getInstance().isCloseCurrent()) { - // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 - if (selectedIndex >= openedTemplate.size()) { - // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true - selectedIndex--; - } - TemplateTabManager.getInstance().setCloseCurrent(false); - } - // 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index - else { - selectedIndex = this.openedTemplate.indexOf(currentSelectedJTemplate); - } - if ( selectedIndex < openedTemplate.size() && couldSwitch) { - //如果是已后台关闭的模板,则重新打开文件 - openedTemplate.get(selectedIndex).activeOldJTemplate(); - } - - } - TemplateTabManager.getInstance().refresh(); - } - - @Override - public void resetSelectIndex(JTemplate jTemplate) { - this.selectedIndex = openedTemplate.indexOf(jTemplate); - TemplateTabManager.getInstance().refresh(); - } - - /** - * 刷新已打开的模板 - * @param list - */ - public void refreshOpenedTemplate(List> list) { - List> result = new ArrayList<>(); - for (JTemplate jTemplate : list) { - if (this.accept(jTemplate.getTemplateTabOperatorType())) { - result.add(jTemplate); - } - } - this.openedTemplate = result; - TemplateTabManager.getInstance().refresh(); - } - - public List> getOpenedJTemplates() { - return this.openedTemplate; - } - - @Override - public void setSelectIndex(int index) { - this.selectedIndex = index; - } - - @Override - public int getSelectIndex() { - return this.selectedIndex; - } - - @Override - public int getJTemplateIndex(JTemplate jTemplate) { - return this.openedTemplate.indexOf(jTemplate); - } - - /** - * 是否支持指定操作类型 - * @param type - * @return - */ - public boolean accept(String type) { - return CompareUtils.isEqual(getOperatorType(), type); - } - - - @Override - public String getTemplateShowName(JTemplate template) { - String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()); - if (!template.isSaved() && !name.endsWith(UNSAVED_SUFFIX)) { - name += UNSAVED_SUFFIX; - } - return name; - } - -} diff --git a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java deleted file mode 100644 index 90853568dd..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fr.design.file.impl; - -import com.fr.design.file.MultiTemplateTabPane; - -/** - * 默认的模板tab的操作类 - * @author kerry - * @since 11.0 - * created on 2023-04-14 - **/ -public class DefaultTemplateTabOperate extends AbstractTemplateTabOperate { - - public static final String OPERATOR_TYPE = "DEFAULT_TEMPLATE_TAB_OPERATOR"; - - private static class Holder { - private static final DefaultTemplateTabOperate SINGLETON = new DefaultTemplateTabOperate(); - } - - private DefaultTemplateTabOperate() { - super(); - } - - /** - * 返回DefaultTemplateTabOperate 单例 - * @return - */ - public static DefaultTemplateTabOperate getInstance() { - return Holder.SINGLETON; - } - - @Override - public void refresh() { - MultiTemplateTabPane.getInstance().repaint(); - } - - @Override - public String getOperatorType() { - return OPERATOR_TYPE; - } - -} diff --git a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java b/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java deleted file mode 100644 index c35a4bf655..0000000000 --- a/designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.fr.design.file.impl; - -import com.fr.design.file.CloseOption; -import com.fr.design.file.TemplateTabOperateProvider; -import com.fr.design.mainframe.JTemplate; -import com.fr.file.FILE; -import com.fr.stable.StringUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * 空的模板tab的操作类 - * @author kerry - * @since 11.0 - * created on 2023-04-14 - **/ -public class EmptyTemplateTabOperate implements TemplateTabOperateProvider { - private static class Holder { - private static final EmptyTemplateTabOperate SINGLETON = new EmptyTemplateTabOperate(); - } - - - private EmptyTemplateTabOperate() { - - } - - /** - * 返回空的模板taboperator单例 - * @return - */ - public static EmptyTemplateTabOperate getInstance() { - return Holder.SINGLETON; - } - - @Override - public void locateTemplateInTree(int tplIndex) { - - } - - @Override - public void closeAction(CloseOption option, int index) { - - } - - @Override - public void closeByIndex(int index) { - - } - - @Override - public void switchTpl(int templateIndex) { - - } - - @Override - public List> getOpenedJTemplates() { - return new ArrayList<>(); - } - - @Override - public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { - - } - - @Override - public void deleteOpenedTemplate(JTemplate template) { - - } - - @Override - public JTemplate getSelectedFile() { - return null; - } - - @Override - public void refresh() { - - } - - @Override - public void resetSelectIndex(JTemplate jTemplate) { - - } - - @Override - public void refreshOpenedTemplate(List> list) { - - } - - @Override - public void closeFileTemplate(FILE file) { - - } - @Override - public String getOperatorType() { - return StringUtils.EMPTY; - } - - @Override - public int getSelectIndex() { - return 0; - } - - @Override - public void setSelectIndex(int index) { - - } - - @Override - public int getJTemplateIndex(JTemplate jTemplate) { - return 0; - } - - @Override - public String getTemplateShowName(JTemplate jTemplate) { - return StringUtils.EMPTY; - } - - @Override - public void activePrevTemplateAfterClose() { - - } -} 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 8b63b73e96..e88d0c946c 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 @@ -21,8 +21,8 @@ import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.SaveSomeTemplatePane; -import com.fr.design.file.TemplateTabManager; import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.OemProcessor; import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider; @@ -1110,7 +1110,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta // 新的form不往前兼容 if (inValidDesigner(jt)) { this.addAndActivateJTemplate(); - TemplateTabManager.getInstance().setTemTemplate( + MultiTemplateTabPane.getInstance().setTemTemplate( HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); } else { this.addAndActivateJTemplate(jt); 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 80fccc95cb..8cfd263421 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 @@ -21,7 +21,7 @@ import com.fr.design.file.FileOperations; import com.fr.design.file.FileToolbarStateChangeListener; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -275,7 +275,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); HistoryTemplateListPane.getInstance().setCurrentEditingTemplate(jt); //处理自动新建的模板 - TemplateTabManager.getInstance().doWithtemTemplate(); + MultiTemplateTabPane.getInstance().doWithtemTemplate(); if (DesignerMode.isAuthorityEditing()) { RolesAlreadyEditedPane.getInstance().refreshDockingView(); } @@ -547,10 +547,10 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { if (isCurrentEditing) { - TemplateTabManager.getInstance().setCloseCurrent(true); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); } - TemplateTabManager.getInstance().closeFormat(jTemplate); - TemplateTabManager.getInstance().closeSpecifiedTemplate(jTemplate); + MultiTemplateTabPane.getInstance().closeFormat(jTemplate); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jTemplate); return; } } 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 a92d59d072..229ba848d8 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 @@ -33,7 +33,6 @@ import com.fr.design.dialog.InformationWarnPane; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.TemplateResourceManager; -import com.fr.design.file.impl.DefaultTemplateTabOperate; import com.fr.design.fun.DesignerFrameUpButtonProvider; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.PreviewProvider; @@ -618,7 +617,7 @@ public abstract class JTemplate> * @return 是则返回true */ public boolean isALLSaved() { - return this.canBeSaved() && this.saved && this.authoritySaved; + return this.saved && this.authoritySaved; } @@ -2052,10 +2051,6 @@ public abstract class JTemplate> DesignerUIModeConfig.getInstance().setAbsoluteMeasureUIMode(); } - public String getTemplateTabOperatorType(){ - return DefaultTemplateTabOperate.OPERATOR_TYPE; - } - /** * 判断当前的模板是否是有效的模板 * @@ -2065,29 +2060,4 @@ public abstract class JTemplate> public static boolean isValid(JTemplate jt) { return jt != null && jt != JNullTemplate.NULL; } - - /** - * 当前模板是否可以被保存 - * @return 是/否 - */ - public boolean canBeSaved(){ - return true; - } - - /** - * 当前的模板是否支持缓存 - * - * @return 是/否 - */ - public boolean supportCache(){ - return true; - } - - /** - * 切换环境之前是否一定要保存 - * @return - */ - public boolean mustSaveBeforeSwitchEnv(){ - return false; - } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 37812c106f..3372e2ad13 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -416,7 +416,9 @@ public abstract class ToolBarMenuDock { menuDef.addShortCut(new OpenRecentReportMenuDef()); - addCloseCurrentTemplateAction(menuDef); + if (!DesignModeContext.isDuchampMode()) { + addCloseCurrentTemplateAction(menuDef); + } scs = plus.shortcut4FileMenu(); if (!ArrayUtils.isEmpty(scs)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java index 6bfc39b78e..8cff3ffbb1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java @@ -1,7 +1,7 @@ package com.fr.design.mainframe.vcs.ui; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.JTemplate; @@ -57,9 +57,9 @@ public class FileVersionCellEditor extends AbstractCellEditor implements TableCe jt.stopEditing(); //只有模板路径一致时关闭当前模板 if (ComparatorUtils.equals(fileOfVersion, jt.getPath())) { - TemplateTabManager.getInstance().setCloseCurrent(true); - TemplateTabManager.getInstance().closeFormat(jt); - TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); + MultiTemplateTabPane.getInstance().closeFormat(jt); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt); } //再打开cache中的模板 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java index 47a95f2620..4dd14bce6d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java @@ -5,7 +5,7 @@ import com.fr.design.base.mode.DesignModeContext; import com.fr.design.base.mode.DesignerMode; import com.fr.design.dialog.BasicPane; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; @@ -115,9 +115,9 @@ public class FileVersionsPanel extends BasicPane { // 关闭当前打开的版本 JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - TemplateTabManager.getInstance().setCloseCurrent(true); - TemplateTabManager.getInstance().closeFormat(jt); - TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); + MultiTemplateTabPane.getInstance().closeFormat(jt); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt); updateDesignerFrame(true); diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java index baa73fc53a..d9c8568bf9 100644 --- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -3,7 +3,7 @@ package com.fr.design.worker.open; import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.TemplateTreePane; import com.fr.design.i18n.Toolkit; import com.fr.design.lock.LockInfoDialog; @@ -87,7 +87,7 @@ public class OpenWorker extends SwingWorker { UIManager.getIcon("OptionPane.errorIcon")); } if (cause.getCause() instanceof TplLockedException) { - TemplateTabManager.getInstance().closeCurrentTpl(); + MultiTemplateTabPane.getInstance().closeCurrentTpl(); TemplateTreePane.getInstance().getFileNode().setLock(UUID.randomUUID().toString()); LockInfoDialog.show(null); } diff --git a/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java b/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java index f277320dd0..1a6e2bf1c8 100644 --- a/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java +++ b/designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java @@ -2,7 +2,7 @@ package com.fr.nx.app.designer.toolbar; import com.fr.base.extension.FileExtension; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.file.FILE; @@ -103,9 +103,9 @@ public enum TemplateTransformer { DesignerContext.getDesignerFrame().openTemplate(file); return; } - TemplateTabManager.getInstance().setCloseCurrent(true); - TemplateTabManager.getInstance().closeFormat(jt); - TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(true); + MultiTemplateTabPane.getInstance().closeFormat(jt); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt); DesignerContext.getDesignerFrame().openTemplate(file); } diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 50f2cd35c0..44228c2a4a 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -8,7 +8,7 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.DesignerStartOpenFileProcessor; import com.fr.design.fun.impl.DesignerStartWithEmptyFile; @@ -193,7 +193,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } else { df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 - TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } } @@ -253,7 +253,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { private boolean createNewTemplate(DesignerFrame df) { df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 - TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); return true; } diff --git a/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java b/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java index 5dcaa147ac..b42cc4ed8f 100644 --- a/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java +++ b/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java @@ -3,7 +3,7 @@ package com.fr.start.common; import com.fr.base.svg.IconUtils; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; @@ -59,7 +59,7 @@ public class DesignerOpenEmptyPanel extends JPanel { HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(null); df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 - TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } }); createButton.setBorder(new EmptyBorder(0, 10, 0, 10)); diff --git a/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java b/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java index c362ae76d1..04633435be 100644 --- a/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java +++ b/designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java @@ -1,7 +1,7 @@ package com.fr.design.fit.common; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.fit.NewJForm; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; @@ -86,7 +86,7 @@ public class TemplateTool { JTemplate oldJTemplate = jTemplateList.get(i); if (oldJTemplate != null && ComparatorUtils.equals(oldJTemplate.getEditingFILE(), newJTemplate.getEditingFILE())) { jTemplateList.set(i, newJTemplate); - TemplateTabManager.getInstance().refreshOpenedTemplate(jTemplateList); + MultiTemplateTabPane.getInstance().refreshOpenedTemplate(jTemplateList); return; } } diff --git a/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java b/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java index 03e8e2b445..4afacee781 100644 --- a/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java +++ b/designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java @@ -1,8 +1,7 @@ package com.fr.design.preview; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.TemplateTabManager; -import com.fr.design.file.TemplateTreePane; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.fun.impl.AbstractPreviewProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JForm; @@ -67,7 +66,7 @@ public class DeveloperPreview extends AbstractPreviewProvider { } private void onPreview(JTemplate jt) { - TemplateTabManager.getInstance().closeCurrentTpl(); + MultiTemplateTabPane.getInstance().closeCurrentTpl(); jt.generateForBiddenTemplate(); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index 5ba4838d6e..f9c086a50b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -39,7 +39,7 @@ import com.fr.design.designer.TargetComponent; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.TemplateTabManager; +import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.fun.PreviewProvider; import com.fr.design.fun.PropertyItemPaneProvider; import com.fr.design.fun.ReportSupportedFileUIProvider; @@ -1175,7 +1175,7 @@ public class JWorkBook extends JTemplate { public boolean saveShareFile() { FILE newFile = createNewEmptyFile(); //如果文件已经打开, 那么就覆盖关闭掉他 - TemplateTabManager.getInstance().closeFileTemplate(newFile); + MultiTemplateTabPane.getInstance().closeFileTemplate(newFile); final WorkBook tpl = this.getTarget(); // 弹出输入参数 java.util.Map parameterMap = inputParameters(tpl); diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 55b6548ac5..7b974d871c 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -17,7 +17,6 @@ import com.fr.design.deeplink.DeepLinkManager; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MultiTemplateTabPane; -import com.fr.design.file.TemplateTabManager; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; import com.fr.design.gui.ibutton.UIButton; @@ -410,7 +409,8 @@ public class MainDesigner extends BaseDesigner { return; } saveButton.setEnabled(!jt.isSaved() && !DesignModeContext.isVcsMode() && jt.checkEnable()); - TemplateTabManager.getInstance().refreshOpenedTemplate(HistoryTemplateListCache.getInstance().getHistoryList()); + MultiTemplateTabPane.getInstance().refreshOpenedTemplate(HistoryTemplateListCache.getInstance().getHistoryList()); + MultiTemplateTabPane.getInstance().repaint(); if (DesignerEnvManager.getEnvManager().isSupportUndo()) { undo.setEnabled(jt.canUndo()); redo.setEnabled(jt.canRedo()); From 263fa6df3097c41a08206d2b680d422f1c98e061 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 19 Apr 2023 10:22:09 +0800 Subject: [PATCH 115/625] =?UTF-8?q?REPORT-94199=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=B6=85=E9=93=BE=E5=9B=BD=E9=99=85=E5=8C=96-?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=84=B1=E6=95=8F=E5=B8=AE=E5=8A=A9=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E8=B7=B3=E8=BD=AC=E6=9C=AA=E5=9B=BD=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/common/DesensitizationOpenPane.java | 7 +++-- .../fr/design/locale/impl/DataMaskMark.java | 30 +++++++++++++++++++ .../cell/settingpane/CellOtherSetPane.java | 6 +++- 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/locale/impl/DataMaskMark.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/DesensitizationOpenPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/DesensitizationOpenPane.java index 949069aaa8..e04c3fed0e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/DesensitizationOpenPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/DesensitizationOpenPane.java @@ -8,10 +8,12 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.VerticalFlowLayout; +import com.fr.design.locale.impl.DataMaskMark; +import com.fr.general.locale.LocaleCenter; +import com.fr.general.locale.LocaleMark; import com.fr.log.FineLoggerFactory; import javax.swing.JPanel; -import java.awt.BorderLayout; import java.awt.Desktop; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -58,7 +60,8 @@ public class DesensitizationOpenPane extends JPanel { @Override public void mouseClicked(MouseEvent event) { try { - URL url = new URL(Toolkit.i18nText("Fine-Design_Report_Desensitization_Help_Document_Url")); + LocaleMark dataMaskMark = LocaleCenter.getMark(DataMaskMark.class); + URL url = new URL(dataMaskMark.getValue()); Desktop.getDesktop().browse(url.toURI()); } catch (Exception e) { FineLoggerFactory.getLogger().error(e, "open browse of table data desensitization help document failed for {}", e.getMessage()); diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/DataMaskMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/DataMaskMark.java new file mode 100644 index 0000000000..11312657b9 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/locale/impl/DataMaskMark.java @@ -0,0 +1,30 @@ +package com.fr.design.locale.impl; + +import com.fr.design.i18n.LocaleLinkProvider; +import com.fr.general.locale.LocaleMark; + + +/** + * 根据图片信息生成获取国际化服务器图标工具 + * + * @author obo + * @since 11.0 + * Created on 2023/4/19 + */ +public class DataMaskMark implements LocaleMark { + + /** + * 云中心数据脱敏帮助链接链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Data_Mask"; + + /** + * 云中心数据脱敏默认帮助链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design_Report_Desensitization_Help_Document_Url"; + + @Override + public String getValue() { + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java index 9879ac53a4..5ac64d401a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java @@ -20,6 +20,7 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.VerticalFlowLayout; +import com.fr.design.locale.impl.DataMaskMark; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.cell.settingpane.desensitization.CellDesensitizationGroupsPane; @@ -28,6 +29,8 @@ import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; +import com.fr.general.locale.LocaleCenter; +import com.fr.general.locale.LocaleMark; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.CellDesensitizationAttr; import com.fr.report.cell.cellattr.CellGUIAttr; @@ -156,10 +159,11 @@ public class CellOtherSetPane extends AbstractCellAttrPane { // 带超链的提示信息 UILabel label = new UILabel(); + LocaleMark dataMaskMark = LocaleCenter.getMark(DataMaskMark.class); MessageWithLink hyperlink = new MessageWithLink( Toolkit.i18nText("Fine-Design_Report_Desensitization_Tip"), Toolkit.i18nText("Fine-Design_Report_Desensitization_Hyperlink"), - Toolkit.i18nText("Fine-Design_Report_Desensitization_Help_Document_Url"), + dataMaskMark.getValue(), StringUtils.EMPTY, label.getBackground(), label.getFont(), From 894e02e41374ce4173fe9cfaa2c931374ab71958 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 19 Apr 2023 13:37:16 +0800 Subject: [PATCH 116/625] =?UTF-8?q?REPORT-75308=20FVS=E5=A4=A7=E5=B1=8F?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=94=AF=E6=8C=81=E5=90=8C=E6=97=B6=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=A4=9A=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/SwitchExistEnv.java | 2 +- .../design/file/HistoryTemplateListCache.java | 7 +- .../file/MultiTemplateTabMenuFactory.java | 361 ++++++++++++++++++ .../fr/design/file/MultiTemplateTabPane.java | 205 ++++++---- .../com/fr/design/file/NewTemplatePane.java | 10 +- .../fr/design/file/SaveSomeTemplatePane.java | 33 +- .../mainframe/CenterRegionContainerPane.java | 7 + .../mainframe/DefaultToolKitConfig.java | 2 +- .../com/fr/design/mainframe/JTemplate.java | 49 +++ .../mainframe/toolbar/ToolBarMenuDock.java | 4 +- 10 files changed, 598 insertions(+), 82 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index 33761a92e2..e38a39895a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -68,7 +68,7 @@ public class SwitchExistEnv extends MenuDef { EnvChangeEntrance.getInstance().chooseEnv(envName); } else { SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true); - if (saveSomeTemplatePane.showSavePane()) { + if (saveSomeTemplatePane.showSavePane(true)) { // 用户模板保存后,才进行切换目录操作 EnvChangeEntrance.getInstance().switch2Env(envName); } diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 86820aa227..f895a4f5b4 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -268,7 +268,8 @@ public class HistoryTemplateListCache implements CallbackEvent { boolean replaceWithJVirtualTemplate = overTemplate.getEditingFILE().exists() && overTemplate.isALLSaved() && overTemplate != editingTemplate - && overTemplate.checkEnable(); + && overTemplate.checkEnable() + && overTemplate.supportCache(); if (replaceWithJVirtualTemplate) { closeVirtualSelectedReport(overTemplate); historyList.set(i, new JVirtualTemplate(overTemplate.getEditingFILE())); @@ -297,7 +298,9 @@ public class HistoryTemplateListCache implements CallbackEvent { int index = iterator.nextIndex(); if (size == index + 1 && index > 0) { //如果删除的是后一个Tab,则定位到前一个 - MultiTemplateTabPane.getInstance().setSelectedIndex(index - 1); + MultiTemplateTabPane.getInstance().setSelectedIndex( + MultiTemplateTabPane.getInstance().calNextShowJTemplateIndex(index - 1)); + } } } 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 new file mode 100644 index 0000000000..85b30f2d5b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java @@ -0,0 +1,361 @@ +package com.fr.design.file; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.imenu.UIMenuItem; +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.file.FILE; +import com.fr.general.IOUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.collections.CollectionUtils; +import com.fr.third.javax.annotation.Nonnull; + +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 右侧下拉菜单的工厂类 + * @author Carlson + * @since 11.0 + * created on 2023-04-14 + **/ +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 int ITEM_SIZE = 25; + + private UIScrollPopUpMenu menu = null; + + private static MultiTemplateTabMenuFactory INSTANCE = new MultiTemplateTabMenuFactory(); + + private MultiTemplateTabMenuFactory() { + + } + + /** + * 返回右侧下拉菜单的工厂类 + * @return + */ + public static MultiTemplateTabMenuFactory getInstance() { + return INSTANCE; + } + + /** + * tab上的下拉菜单 + */ + public UIScrollPopUpMenu createMenu() { + menu = new UIScrollPopUpMenu(); + menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); + + menu.add(initCloseOther()); + menu.add(createEmptyRow()); + menu.addSeparator(); + menu.add(createEmptyRow()); + menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Current_Category_Templates"))); + Component[] items = createCurrentCategory(); + for (Component item : items) { + menu.add(item); + } + items = createOtherCategory(); + if (items.length > 0) { + menu.addSeparator(); + menu.add(createEmptyRow()); + menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Other_Category_Templates"))); + for (Component item : items) { + menu.add(item); + } + } + Dimension dimension = menu.getPreferredSize(); + dimension.width += ITEM_SIZE; + menu.setPreferredSize(dimension); + return menu; + } + + /** + * 关闭其它按钮 + */ + private UIMenuItem initCloseOther() { + UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_Tab_Close_Other_Templates_Of_Current_Category")); + closeOther.setHorizontalAlignment(SwingConstants.CENTER); + Dimension dimension = closeOther.getPreferredSize(); + dimension.height = ITEM_SIZE; + closeOther.setPreferredSize(dimension); + String currentOperator = getCurrentTabOperatorType(); + closeOther.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + MultiTemplateTabPane.getInstance().closeAllByOperatorType(currentOperator); + } + }); + if (MultiTemplateTabPane.getInstance().getOpenedJTemplatesByOperator(currentOperator).size() <= 1) { + closeOther.setEnabled(false); + } + return closeOther; + } + + + private void closeAndFreeLock(@Nonnull JTemplate template) { + FILE file = template.getEditingFILE(); + // 只有是环境内的文件,才执行释放锁 + if (file != null && file.isEnvFile()) { + // release lock + TemplateResourceManager.getResource().closeTemplate(file.getPath()); + } + } + + /** + * 美观用 + */ + private JPanel createEmptyRow() { + return new JPanel() { + @Override + public Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + d.height = 1; + return d; + } + }; + } + + /** + * 模板分类item + */ + private UIButton createCategory(String categoryName) { + UIButton button = new UIButton(categoryName); + button.setBorderPainted(false); + button.setExtraPainted(false); + button.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + button.setHorizontalAlignment(SwingConstants.LEFT); + button.setForeground(UIConstants.FLESH_BLUE); + return button; + } + + /** + * 创建 当前分类模板 item数组 + */ + private Component[] createCurrentCategory() { + return createListDownItem(MultiTemplateTabPane.getInstance().getOpenedJTemplatesByOperator(getCurrentTabOperatorType())); + } + + private String getCurrentTabOperatorType(){ + JTemplate jTemplate= HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + return jTemplate.getTemplateTabOperatorType(); + } + + /** + * 创建 其它分类模板 item数组 + */ + private Component[] createOtherCategory() { + String currentOperator = getCurrentTabOperatorType(); + List> openedTemplates = new ArrayList<>(); + Map>> map = MultiTemplateTabPane.getInstance().getOpenedJTemplatesByCategory(); + for (Map.Entry>> entry : map.entrySet()) { + if (!StringUtils.equals(currentOperator, entry.getKey())) { + openedTemplates.addAll(entry.getValue()); + } + } + return createListDownItem(openedTemplates); + } + + /** + * 根据template列表创建多个item + */ + private Component[] createListDownItem(List> openedTemplates) { + if (!CollectionUtils.isEmpty(openedTemplates)) { + Component[] templates = new Component[openedTemplates.size()]; + for (int i = 0; i < openedTemplates.size(); i++) { + templates[i] = createListDownMenuItem(openedTemplates.get(i)); + } + return templates; + } + return new Component[0]; + } + + /** + * 根据template对象创建item + */ + private Component createListDownMenuItem(JTemplate template) { + JPanel jPanel = new JPanel(); + jPanel.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE)); + jPanel.setLayout(new BorderLayout()); + + MenuItemButtonGroup menuItemButtonGroup = new MenuItemButtonGroup(template); + if (template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { + menuItemButtonGroup.templateButton.setForeground(UIConstants.FLESH_BLUE); + } + + jPanel.add(menuItemButtonGroup.iconButton, BorderLayout.WEST); + jPanel.add(menuItemButtonGroup.templateButton, BorderLayout.CENTER); + jPanel.add(menuItemButtonGroup.closeButton, BorderLayout.EAST); + + return jPanel; + } + + /** + * menu的item由模板图标、模板名、模板关闭按钮组成 + */ + private class MenuItemButtonGroup { + + private final UIButton iconButton; + private final UIButton templateButton; + private final UIButton closeButton; + + public MenuItemButtonGroup(JTemplate template) { + iconButton = createIconButton(template); + templateButton = createTemplateButton(template); + closeButton = createCloseButton(); + initListener(template); + } + + /** + * item[0] 模板图标按钮初始化 + */ + private UIButton createIconButton(JTemplate template) { + UIButton button = new UIButton(template.getIcon(), template.getIcon(), template.getIcon()); + button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + return button; + } + + /** + * item[1] 切换模板按钮初始化 + */ + private UIButton createTemplateButton(JTemplate template) { + UIButton button = new UIButton(TemplateUtils.createLockeTemplatedName(template, template.getTemplateName())); + button.setBorderPainted(false); + button.setExtraPainted(false); + button.setPreferredSize(new Dimension(menu.getWidth() - ITEM_SIZE * 2, ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + button.setHorizontalAlignment(SwingConstants.LEFT); + return button; + } + + /** + * item[2] 关闭模板图标按钮初始化 + */ + private UIButton createCloseButton() { + UIButton button = new UIButton(CLOSE, MOUSE_OVER_CLOSE, MOUSE_PRESS_CLOSE); + button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE)); + button.setOpaque(true); + button.setBackground(UIConstants.NORMAL_BACKGROUND); + button.setVisible(false); + return button; + } + + private void initListener(JTemplate template) { + initIconButtonListener(); + initTemplateButtonListener(template); + initCloseButtonListener(template); + } + + /** + * item[0] 模板图标按钮鼠标事件 + */ + private void initIconButtonListener() { + iconButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * item[1] 切换模板按钮鼠标事件 + */ + private void initTemplateButtonListener(JTemplate template) { + templateButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + menu.setVisible(false); + MultiTemplateTabPane.getInstance().switchJTemplate(template); + } + + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * item[2] 关闭模板按钮鼠标事件 + */ + private void initCloseButtonListener(JTemplate template) { + closeButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + menu.setVisible(false); + MultiTemplateTabPane.getInstance().setIsCloseCurrent(template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + MultiTemplateTabPane.getInstance().closeFormat(template); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(template); + } + + @Override + public void mouseEntered(MouseEvent e) { + fireMouseEnteredEvent(); + } + + @Override + public void mouseExited(MouseEvent e) { + fireMouseExitedEvent(); + } + }); + } + + /** + * mouse移入item范围 + */ + private void fireMouseEnteredEvent() { + iconButton.setBackground(UIConstants.HOVER_BLUE); + templateButton.setBackground(UIConstants.HOVER_BLUE); + closeButton.setBackground(UIConstants.HOVER_BLUE); + closeButton.setVisible(true); + } + + /** + * mouse移出item范围 + */ + private void fireMouseExitedEvent() { + iconButton.setBackground(UIConstants.NORMAL_BACKGROUND); + templateButton.setBackground(UIConstants.NORMAL_BACKGROUND); + closeButton.setBackground(UIConstants.NORMAL_BACKGROUND); + closeButton.setVisible(false); + } + + } + +} 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 8e302fd977..4f292ecfe7 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 @@ -1,7 +1,6 @@ package com.fr.design.file; -import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.base.svg.IconUtils; import com.fr.base.vcs.DesignerMode; @@ -19,7 +18,6 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.TemplateSavingChecker; import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.TemplateUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.design.worker.WorkerManager; @@ -42,7 +40,6 @@ import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; -import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.MenuElement; import javax.swing.SwingConstants; @@ -70,6 +67,8 @@ import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog; import static javax.swing.JOptionPane.OK_CANCEL_OPTION; @@ -333,8 +332,10 @@ public class MultiTemplateTabPane extends JComponent { JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); closeTemplate(templates, currentTemplate); - if (option == CloseOption.All) { + if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } else if (option == CloseOption.All){ + DesignerContext.getDesignerFrame().activateJTemplate(openedTemplate.get(0)); } else { DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); } @@ -344,8 +345,9 @@ public class MultiTemplateTabPane extends JComponent { } private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate) { + String operator = currentTemplate.getTemplateTabOperatorType(); for (int i = 0; i < templates.length; i++) { - if (option.shouldClose(tplIndex, i)) { + if (option.shouldClose(tplIndex, i) && ComparatorUtils.equals(operator, templates[i].getTemplateTabOperatorType())) { JTemplate jTemplate = templates[i]; if (jTemplate == currentTemplate) { currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; @@ -378,6 +380,47 @@ public class MultiTemplateTabPane extends JComponent { return openedTemplate.get(selectedIndex); } + /** + * 关闭所有指定模板tab操作类型的模板 + * @param operatorType + */ + public void closeAllByOperatorType(String operatorType){ + SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); + if (saveSomeTempaltePane.showSavePane()) { + List> openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); + + JTemplate[] templates = new JTemplate[openedTemplate.size()]; + for (int i = 0; i < openedTemplate.size(); i++) { + templates[i] = openedTemplate.get(i); + } + closeTemplate(templates, operatorType); + + if (openedTemplate.size() == 0) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } else { + DesignerContext.getDesignerFrame().activateJTemplate(openedTemplate.get(0)); + } + MultiTemplateTabPane.getInstance().repaint(); + } + } + + /** + * 关闭指定模板 + * @param templates + * @param operatorType + */ + private static void closeTemplate(JTemplate[] templates, String operatorType) { + for (int i = 0; i < templates.length; i++) { + JTemplate jTemplate = templates[i]; + if (!ComparatorUtils.equals(operatorType, jTemplate.getTemplateTabOperatorType())){ + continue; + } + MultiTemplateTabPane.getInstance().closeFormat(jTemplate); + HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); + MultiTemplateTabPane.getInstance().closeAndFreeLock(jTemplate); + } + } + /** * 关闭掉当前已打开文件列表中指定的文件 @@ -478,11 +521,7 @@ public class MultiTemplateTabPane extends JComponent { private String tempalteShowName(JTemplate template) { - String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()); - if (!template.isSaved() && !name.endsWith(" *")) { - name += " *"; - } - return name; + return template.getTabShowName(template); } /** @@ -500,40 +539,7 @@ public class MultiTemplateTabPane extends JComponent { private void showListDown() { - - UIScrollPopUpMenu menu = new UIScrollPopUpMenu(); - menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); - menu.add(initCloseOther()); - JSeparator separator = new JSeparator() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }; - menu.add(new JPanel() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }); - separator.setForeground(UIConstants.LINE_COLOR); - menu.add(separator); - menu.add(new JPanel() { - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - d.height = 1; - return d; - } - }); - UIMenuItem[] items = createListDownTemplate(); - for (int i = 0; i < items.length; i++) { - menu.add(items[i]); - } + UIScrollPopUpMenu menu = MultiTemplateTabMenuFactory.getInstance().createMenu(); GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), MultiTemplateTabPane.getInstance().getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); } @@ -583,6 +589,9 @@ public class MultiTemplateTabPane extends JComponent { //从可以开始展示在tab面板上的tab开始画 for (int i = minPaintIndex; i <= maxPaintIndex; i++) { JTemplate template = openedTemplate.get(i); + if (!showJTemplateTab(template)){ + continue; + } Icon icon = template.getIcon(); String name = tempalteShowName(template); //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 @@ -722,8 +731,10 @@ public class MultiTemplateTabPane extends JComponent { //个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 private void calculateRealAverageWidth(double maxwidth, int templateNum) { + JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + List> showTemplates = getOpenedJTemplatesByOperator(jTemplate.getTemplateTabOperatorType()); - int num = openedTemplate.size() > templateNum ? templateNum : openedTemplate.size(); + int num = Math.min(showTemplates.size(), templateNum); realWidth = (int) (maxwidth / (num)); if (realWidth > MAXWIDTH) { realWidth = MAXWIDTH; @@ -932,7 +943,7 @@ public class MultiTemplateTabPane extends JComponent { activePrevTemplateAfterClose(); } - private void closeAndFreeLock(@Nonnull JTemplate template) { + public void closeAndFreeLock(@Nonnull JTemplate template) { FILE file = template.getEditingFILE(); // 只有是环境内的文件,才执行释放锁 if (file != null && file.isEnvFile()) { @@ -988,7 +999,7 @@ public class MultiTemplateTabPane extends JComponent { // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 if (selectedIndex >= maxPaintIndex) { // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true - selectedIndex--; + selectedIndex = calNextShowJTemplateIndex(selectedIndex - 1); } isCloseCurrent = false; } @@ -1005,6 +1016,26 @@ public class MultiTemplateTabPane extends JComponent { } } + /** + * 计算下一个可以展示的模板index + * @param currentIndex + * @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; + } + private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; @@ -1027,7 +1058,7 @@ public class MultiTemplateTabPane extends JComponent { private int getTemplateIndex(int evtX) { int textX = 0; for (int i = minPaintIndex; i <= maxPaintIndex; i++) { - int textWidth = realWidth; + int textWidth = showJTemplateTab(openedTemplate.get(i)) ? realWidth : 0; if (evtX >= textX && evtX < textX + textWidth) { return i; } @@ -1184,29 +1215,44 @@ public class MultiTemplateTabPane extends JComponent { //没有点击关闭和ListDown按钮,则切换到点击的模板处 closeIconIndex = -1; clodeMode = CLOSE; - int tempSelectedIndex = selectedIndex; - if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) { - openedTemplate.get(selectedIndex).stopEditing(); - selectedIndex = getTemplateIndex(evtX); - //如果在权限编辑情况下,不允许切换到表单类型的工作簿 - if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") - + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); - MultiTemplateTabPane.this.repaint(); - return; - } - JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); - evtXTemplate.activeNewJTemplate(); - } + switchJTemplate(getTemplateIndex(evtX)); isShowList = false; } MultiTemplateTabPane.this.repaint(); - - } + } + /** + * 切换到指定模板 + * @param jTemplate + */ + public void switchJTemplate(JTemplate jTemplate) { + int switchIndex = this.openedTemplate.indexOf(jTemplate); + if (switchIndex >= 0) { + switchJTemplate(switchIndex); + } + } + /** + * 切换到指定index + * @param switchIndex + */ + private void switchJTemplate(int switchIndex){ + int tempSelectedIndex = selectedIndex; + if (selectedIndex != switchIndex && switchIndex != -1) { + openedTemplate.get(selectedIndex).stopEditing(); + selectedIndex = switchIndex; + //如果在权限编辑情况下,不允许切换到表单类型的工作簿 + if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); + MultiTemplateTabPane.this.repaint(); + return; + } + JTemplate evtXTemplate = openedTemplate.get(switchIndex); + evtXTemplate.activeNewJTemplate(); + } } private boolean checkCurrentClose(JTemplate template) { @@ -1251,5 +1297,34 @@ public class MultiTemplateTabPane extends JComponent { } } + /** + * 判断是否显示在tab栏上 + * @param jTemplate + * @return + */ + private boolean showJTemplateTab(JTemplate jTemplate){ + JTemplate current = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + return ComparatorUtils.equals(current.getTemplateTabOperatorType(), jTemplate.getTemplateTabOperatorType()); + } + + /** + * 获取tab操作类型的模板 + * @param operator + * @return + */ + public List> getOpenedJTemplatesByOperator(String operator) { + return openedTemplate.stream().filter((jTemplate) -> ComparatorUtils.equals(jTemplate.getTemplateTabOperatorType(), operator)) + .collect(Collectors.toList()); + } + + /** + * 根据tab操作类型进行分类 + * @return + */ + public Map>> getOpenedJTemplatesByCategory() { + return openedTemplate.stream() + .collect(Collectors.groupingBy(JTemplate::getTemplateTabOperatorType)); + } + } diff --git a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java index dae921a1c8..81f82e78c6 100644 --- a/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java @@ -81,11 +81,19 @@ public abstract class NewTemplatePane extends JComponent implements MouseListene } if (isOverNewIcon(evtX) && newWorkBookIconMode != GRAY_NEW_CPT) { newWorkBookIconMode = getMousePressNew(); - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + createNewTemplate(); } this.repaint(); } + + /** + * 新建模板 + */ + protected void createNewTemplate() { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } + /** *鼠标松开 * @param e 事件 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 72945b31c9..fa8e3d385d 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 @@ -47,6 +47,7 @@ public class SaveSomeTemplatePane extends BasicPane { /** * 支持自定义设置 dialog的父窗口 + * * @param isNeedTojudgeCurrent * @param parent */ @@ -79,11 +80,14 @@ public class SaveSomeTemplatePane extends BasicPane { this.isJudgeCurrentEditingTemplate = isNeedTojudgeCurrent; } - private void initTemplatesChoosePane() { + + private void initTemplatesChoosePane(boolean judgeJTemplateMustSave) { templatesChoosePane.setBorder(BorderFactory.createTitledBorder("")); for (int i = 0; i < unSavedTemplate.size(); i++) { templateCheckBoxes[i] = new UICheckBox(unSavedTemplate.get(i).getEditingFILE().getName()); templateCheckBoxes[i].setSelected(true); + boolean needSave = judgeJTemplateMustSave && unSavedTemplate.get(i).needSaveBeforeSwitchEnv(); + templateCheckBoxes[i].setEnabled(!needSave); } final UIList templatesList = new UIList(templateCheckBoxes); @@ -103,7 +107,10 @@ public class SaveSomeTemplatePane extends BasicPane { boolean isSelected = chooseAllCheckBox.isSelected(); for (int i = 0; i < templatesList.getModel().getSize(); i++) { UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(i); - checkBox.setSelected(isSelected); + boolean mustSaveBeforeSwitchEnv = judgeJTemplateMustSave && unSavedTemplate.get(i).needSaveBeforeSwitchEnv(); + checkBox.setSelected(mustSaveBeforeSwitchEnv || isSelected); + templateCheckBoxes[i].setEnabled(!mustSaveBeforeSwitchEnv); + } templatesList.repaint(); } @@ -139,7 +146,7 @@ public class SaveSomeTemplatePane extends BasicPane { /** * 获取templateCheckBoxes中状态为选中状态的CheckBox数量 - * */ + */ private int calculateSelectedNum() { int count = 0; for (UICheckBox checkBox : templateCheckBoxes) { @@ -152,7 +159,11 @@ public class SaveSomeTemplatePane extends BasicPane { public boolean showSavePane() { - populate(); + return showSavePane(false); + } + + public boolean showSavePane(boolean judgeJTemplateMustSave) { + populate(judgeJTemplateMustSave); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { dialog.setVisible(true); @@ -162,8 +173,12 @@ public class SaveSomeTemplatePane extends BasicPane { return isAllSaved; } - public void populate() { - java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); + protected java.util.List> getOpenedTemplatesToProcess(){ + return HistoryTemplateListPane.getInstance().getHistoryList(); + } + + public void populate(boolean judgeJTemplateMustSave) { + java.util.List> opendedTemplate = getOpenedTemplatesToProcess(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); for (int i = 0; i < opendedTemplate.size(); i++) { if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) { @@ -171,10 +186,10 @@ public class SaveSomeTemplatePane extends BasicPane { } } templateCheckBoxes = new UICheckBox[unSavedTemplate.size()]; - initTemplatesChoosePane(); + initTemplatesChoosePane(judgeJTemplateMustSave); } - private boolean isneedToAdd(JTemplate template, JTemplate currentTemplate) { + protected boolean isneedToAdd(JTemplate template, JTemplate currentTemplate) { //所有模板都判断是不是保存 if (isJudgeCurrentEditingTemplate) { return !template.isALLSaved(); @@ -194,7 +209,7 @@ public class SaveSomeTemplatePane extends BasicPane { specifiedTemplate.stopEditing(); return specifiedTemplate.saveTemplate(); } - FineLoggerFactory.getLogger().info( com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); return true; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index 63c00deaaf..3cceff5a75 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -311,4 +311,11 @@ public class CenterRegionContainerPane extends JPanel { return toolbarComponentState; } + /** + * 重置下RegionContainerpane + */ + public void resetCenterRegionContainerPane(){ + templateTabPane.add(MultiTemplateTabPane.getInstance(), BorderLayout.CENTER); + } + } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java b/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java index 581dc54cb8..73daf052f1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java @@ -2,7 +2,6 @@ package com.fr.design.mainframe; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; - import javax.swing.JPanel; @@ -24,6 +23,7 @@ public class DefaultToolKitConfig implements ToolKitConfigStrategy { @Override public JPanel customNorthPane(JPanel toolBarPane, ToolBarMenuDockPlus plus) { + CenterRegionContainerPane.getInstance().resetCenterRegionContainerPane(); return toolBarPane; } } 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 229ba848d8..17a5afb2b6 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 @@ -58,6 +58,7 @@ import com.fr.design.module.DesignModuleFactory; import com.fr.design.preview.PagePreview; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; +import com.fr.design.utils.TemplateUtils; import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.design.worker.save.EmptyCallBackSaveWorker; import com.fr.design.worker.save.SaveFailureHandler; @@ -120,6 +121,8 @@ import java.util.concurrent.Callable; * 报表设计和表单设计的编辑区域(设计器编辑的IO文件) */ public abstract class JTemplate> extends TargetComponent implements ToolBarMenuDockPlus, DesignerProxy, JTemplateSave, TabChangeListener, ThemedTemplate { + + private static final String DEFAULT_TAB_OPERATOR = "DefaultTabOperator"; // TODO ALEX_SEP editingFILE这个属性一定要吗?如果非要不可,有没有可能保证不为null private static final int PREDEFINED_ICON_WIDTH = 27; @@ -2060,4 +2063,50 @@ public abstract class JTemplate> public static boolean isValid(JTemplate jt) { return jt != null && jt != JNullTemplate.NULL; } + + /** + * 获取此模板所使用的tab栏操作类型 + * @return + */ + public String getTemplateTabOperatorType(){ + return DEFAULT_TAB_OPERATOR; + } + + /** + * 当前模板是否可以被保存 + * @return 是/否 + */ + public boolean canBeSaved(){ + return true; + } + + /** + * 当前的模板是否支持缓存 + * + * @return 是/否 + */ + public boolean supportCache(){ + return true; + } + + /** + * 获取此模板在tab栏中显示的名称 + * @return + */ + public String getTabShowName(JTemplate jTemplate){ + String name = TemplateUtils.createLockeTemplatedName(jTemplate, jTemplate.getTemplateName()); + if (!jTemplate.isSaved() && !name.endsWith(" *")) { + name += " *"; + } + return name; + } + + /** + * 切换环境之前是否需要保存 + * @return + */ + public boolean needSaveBeforeSwitchEnv(){ + return false; + } + } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 3372e2ad13..37812c106f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -416,9 +416,7 @@ public abstract class ToolBarMenuDock { menuDef.addShortCut(new OpenRecentReportMenuDef()); - if (!DesignModeContext.isDuchampMode()) { - addCloseCurrentTemplateAction(menuDef); - } + addCloseCurrentTemplateAction(menuDef); scs = plus.shortcut4FileMenu(); if (!ArrayUtils.isEmpty(scs)) { From 31b455b677c7c41304554bf03f5b1706fbdef664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Wed, 19 Apr 2023 13:58:31 +0800 Subject: [PATCH 117/625] =?UTF-8?q?REPORT-93422=20=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=BC=80=E6=94=BE=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?-=E5=8E=BB=E6=8E=89=E5=8D=95=E5=85=83=E6=A0=BC=E7=9A=84?= =?UTF-8?q?=E2=80=9C=E5=AD=97=E4=BD=93=E5=A4=A7=E5=B0=8F=E2=80=9D=E5=B1=9E?= =?UTF-8?q?=E6=80=A7--=E5=87=8F=E5=B0=91=E5=86=97=E4=BD=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractWidgetAdvancedPaneProvider.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java b/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java index 6b60eb56a8..45316a9f66 100644 --- a/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java +++ b/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java @@ -1,5 +1,6 @@ package com.fr.design.fun.impl; + import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -23,4 +24,24 @@ public abstract class AbstractWidgetAdvancedPaneProvider extends AbstractProv return getClass().getName(); } + protected WidgetType widgetType = WidgetType.PARA; + + /** + * 按钮类型:单元格 or 参数面板 + * + * @author John.Ying + * @version 11.0 + * Created by John.Ying on 2023/4/18 + */ + protected enum WidgetType { + /** + * 参数面板 + */ + PARA, + /** + * 单元格 + */ + CELL; + } + } From 95af815cb43f19ea5b74326ae0e91389b5e29d46 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 19 Apr 2023 13:59:50 +0800 Subject: [PATCH 118/625] =?UTF-8?q?REPORT-94231=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=B6=85=E9=93=BE=E5=9B=BD=E9=99=85=E5=8C=96-?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E9=85=8D=E7=BD=AE=E9=9D=A2=E6=9D=BF=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=9C=AA=E5=9B=BD=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/locale/impl/LineEngineMark.java | 28 +++++++++++++++++++ .../fr/design/report/ReportEnginePane.java | 8 ++++-- 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java new file mode 100644 index 0000000000..a13617af24 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java @@ -0,0 +1,28 @@ +package com.fr.design.locale.impl; + +import com.fr.design.i18n.LocaleLinkProvider; +import com.fr.general.locale.LocaleMark; + +/** + * 根据国际化获取启用行式引擎执行层式报表帮助文档链接 + * + * @author obo + * @since 11.0 + * Created on 2023/4/19 + */ +public class LineEngineMark implements LocaleMark { + + /** + * 云中心数据脱敏帮助链接链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Line_Engine"; + + /** + * 云中心数据脱敏默认帮助链接在配置文件中对应的配置文件key + */ + private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Line_Engine_Default"; + @Override + public String getValue() { + return LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT); + } +} diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java index 15dd2a3ea3..380809faf0 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportEnginePane.java @@ -11,14 +11,15 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.locale.impl.LineEngineMark; import com.fr.design.mainframe.DesignerContext; import com.fr.design.widget.FRWidgetFactory; -import com.fr.general.SiteCenter; +import com.fr.general.locale.LocaleCenter; +import com.fr.general.locale.LocaleMark; import com.fr.log.FineLoggerFactory; import com.fr.report.core.ReportUtils; import com.fr.report.stable.LayerReportAttr; import com.fr.report.worksheet.WorkSheet; -import com.fr.stable.ProductConstants; import javax.swing.AbstractButton; import javax.swing.BorderFactory; @@ -203,7 +204,8 @@ public class ReportEnginePane extends BasicBeanPane { @Override public void mouseClicked(MouseEvent e) { try { - Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("standard.doc", ProductConstants.WEBSITE_URL))); + LocaleMark lineEngineMark = LocaleCenter.getMark(LineEngineMark.class); + Desktop.getDesktop().browse(new URI(lineEngineMark.getValue())); } catch (IOException | URISyntaxException ex) { FineLoggerFactory.getLogger().error("io exception or not find website", ex); } From d3ac3cca7d80d106a8d45bfe0f151f4244c81a06 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 19 Apr 2023 14:11:53 +0800 Subject: [PATCH 119/625] =?UTF-8?q?REPORT-94231=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=B6=85=E9=93=BE=E5=9B=BD=E9=99=85=E5=8C=96-?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E9=85=8D=E7=BD=AE=E9=9D=A2=E6=9D=BF=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=9C=AA=E5=9B=BD=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/locale/impl/LineEngineMark.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java b/designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java index a13617af24..ebb5fd09a3 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/LineEngineMark.java @@ -13,12 +13,12 @@ import com.fr.general.locale.LocaleMark; public class LineEngineMark implements LocaleMark { /** - * 云中心数据脱敏帮助链接链接在配置文件中对应的配置文件key + * 云中心启用行式引擎执行层式报表帮助链接链接在配置文件中对应的配置文件key */ private static final String PROPS_LINK_KEY = "Fine-Design-CloudCenter_Line_Engine"; /** - * 云中心数据脱敏默认帮助链接在配置文件中对应的配置文件key + * 云中心启用行式引擎执行层式报表默认帮助链接在配置文件中对应的配置文件key */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Line_Engine_Default"; @Override From 4205af519888844ec276158fd791ecb5019af456 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 19 Apr 2023 15:11:12 +0800 Subject: [PATCH 120/625] =?UTF-8?q?fix=EF=BC=9A=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MultiTemplateTabMenuFactory.java | 11 ----------- 1 file changed, 11 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 85b30f2d5b..6b5f9e324b 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 @@ -7,11 +7,9 @@ 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.file.FILE; import com.fr.general.IOUtils; import com.fr.stable.StringUtils; import com.fr.stable.collections.CollectionUtils; -import com.fr.third.javax.annotation.Nonnull; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -113,15 +111,6 @@ public class MultiTemplateTabMenuFactory { } - private void closeAndFreeLock(@Nonnull JTemplate template) { - FILE file = template.getEditingFILE(); - // 只有是环境内的文件,才执行释放锁 - if (file != null && file.isEnvFile()) { - // release lock - TemplateResourceManager.getResource().closeTemplate(file.getPath()); - } - } - /** * 美观用 */ From 3db161b224b1395eaf430f9dd442c6a30c2e5c24 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 19 Apr 2023 15:54:36 +0800 Subject: [PATCH 121/625] =?UTF-8?q?REPORT-94198=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E8=B4=9F=E8=BD=BD=E5=9D=87=E8=A1=A1=E8=8A=82?= =?UTF-8?q?=E7=82=B9=EF=BC=8C=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E8=BF=9E=E6=8E=A5=E6=96=AD=E5=BC=80=E7=9A=84?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/socketio/DesignerSocketIO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 4b5c287ff5..922e1e4724 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -32,6 +32,7 @@ import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.base.WorkspaceConstants; import com.fr.workspace.connect.WorkspaceConnectionInfo; +import com.fr.workspace.engine.exception.WorkspaceConnectionException; import com.fr.workspace.server.socket.CustomLogEvent; import com.fr.workspace.server.socket.LogEventConverter; import io.socket.client.IO; @@ -207,6 +208,7 @@ public class DesignerSocketIO { if (checkRPCConnect()) { showSocketDisconnectToast(); } else { + FineLoggerFactory.getLogger().info("检查不通过"); showRPCDisconnectDialog(); } } @@ -271,6 +273,11 @@ public class DesignerSocketIO { httpGet.setConfig(requestConfig); try { CloseableHttpResponse response = httpclient.execute(httpGet); + if (isErrorStatus(response.getStatusLine().getStatusCode())) { + //这边nginx做负载,服务器被kill掉,返回的是502,不会抛错,导致checkRPCConnect通过 + //针对500-600的错误码加个判断,其他类型的状态码暂不考虑,如果有遇到再处理,不然怕影响范围大 + throw new WorkspaceConnectionException("Response " + response.getStatusLine().toString()); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e, e.getMessage()); return false; @@ -278,6 +285,23 @@ public class DesignerSocketIO { return true; } + /** + * 错误状态码 + * 5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。代码 说明 + * 500 (服务器内部错误) 服务器遇到错误,无法完成请求。 + * 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 + * 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 + * 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 + * 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 + * 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。 + * + * @param status 错误状态码 + * @return 是否是错误状态码 + */ + private static boolean isErrorStatus(int status) { + return status >= 500 && status <= 600; + } + //配置变更监听器 private static final Emitter.Listener modifyConfig = new Emitter.Listener() { @Override From b5bc39168f297ab1ed898106e2d6f500386a0c17 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 19 Apr 2023 15:55:48 +0800 Subject: [PATCH 122/625] =?UTF-8?q?REPORT-94198=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E8=B4=9F=E8=BD=BD=E5=9D=87=E8=A1=A1=E8=8A=82?= =?UTF-8?q?=E7=82=B9=EF=BC=8C=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E8=BF=9E=E6=8E=A5=E6=96=AD=E5=BC=80=E7=9A=84?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/socketio/DesignerSocketIO.java | 1 - 1 file changed, 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 922e1e4724..3ceef3ae28 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -208,7 +208,6 @@ public class DesignerSocketIO { if (checkRPCConnect()) { showSocketDisconnectToast(); } else { - FineLoggerFactory.getLogger().info("检查不通过"); showRPCDisconnectDialog(); } } From eabb150e50051e98686f0d184993d604c382cafa Mon Sep 17 00:00:00 2001 From: "Sky.Luo" Date: Wed, 19 Apr 2023 16:47:03 +0800 Subject: [PATCH 123/625] =?UTF-8?q?REPORT-94131=20&=20REPORT-94167=20&=20R?= =?UTF-8?q?EPORT-94195=20&=20REPORT-94260=20&=20REPORT-94149=20&=20REPORT-?= =?UTF-8?q?94105=20fix:=20=E5=A2=9E=E5=8A=A0=E5=AD=98=E5=82=A8=E8=BF=87?= =?UTF-8?q?=E7=A8=8B=E6=95=B0=E6=8D=AE=E9=9B=86=E6=B7=BB=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=20&=20=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E8=8E=B7=E5=8F=96=20&=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=A2=84=E8=A7=88=E5=8F=96=E6=95=B0=E7=9A=84?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=90=BA=E5=B8=A6=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/data/DesignTableDataManager.java | 1 + 1 file changed, 1 insertion(+) 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 175af0653f..712dcbd33b 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 @@ -669,6 +669,7 @@ public abstract class DesignTableDataManager { if (needLoadingBar) { MultiResultTableDataWrapper.loadingBar.start(); } + parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); return DataOperator.getInstance().previewMultiResultTableData(tableData, parameterMap, 0); } From 02a13b696d0935477db7412320dd91c90ee48eac Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 20 Apr 2023 13:49:50 +0800 Subject: [PATCH 124/625] =?UTF-8?q?REPORT-94324=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=EF=BC=8C=E6=8A=A5=E8=A1=A8=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E4=B8=8B=E5=8F=8C=E5=87=BB=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E6=97=B6=E6=B2=A1=E6=9C=89=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/file/FILEChooserPane.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 0561319db4..b114ef2b40 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -1466,10 +1466,17 @@ public class FILEChooserPane extends BasicPane { for (int i = 0; i < this.buttonList.size(); i++) { this.buttonList.get(i).setForeground(null); if (((SetDirectoryAction) this.buttonList.get(i).getAction()).getDir() != null - && this.buttonList.get(i).getAction() instanceof SetDirectoryAction - && (ComparatorUtils.equals(((SetDirectoryAction) this.buttonList.get(i).getAction()).getDir().getPath(), dir.getPath()))) { - - this.buttonList.get(i).setForeground(Color.BLUE); + && this.buttonList.get(i).getAction() instanceof SetDirectoryAction) { + String actionPath = ((SetDirectoryAction) this.buttonList.get(i).getAction()).getDir().getPath(); + String dirPath = dir.getPath(); + //如果是报表环境,button的Action最后会跟上"/",这个是特意处理的,但是对应代码没有说明原因,不做修改 + //FILE的getPath不会带"/",这边针对这种情况加个处理,不建议直接改FILE + if (actionPath.endsWith("/") && !dirPath.endsWith("/")) { + dirPath = dirPath + "/"; + } + if (ComparatorUtils.equals(actionPath, dirPath)) { + this.buttonList.get(i).setForeground(Color.BLUE); + } } } } From c296181cb7620260a8c2d1136baf2bd80cfc2f8d Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 20 Apr 2023 14:32:04 +0800 Subject: [PATCH 125/625] =?UTF-8?q?REPORT-93215=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=90=8D=E7=A7=B0=E5=8C=85=E5=90=AB=E4=BA=8E?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E6=AC=A1=E9=80=89=E7=9A=84=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=EF=BC=8C=E4=BF=9D=E5=AD=98=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=9A=84=E8=B7=AF=E5=BE=84=E4=B8=8D=E4=BC=9A=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/file/FILEChooserPane.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index b114ef2b40..aeccebcc71 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -1486,7 +1486,7 @@ public class FILEChooserPane extends BasicPane { } public void populate(FILE dir) { - if (popDir != null && dir != null && popDir.toString().indexOf(dir.toString()) == 0) { + if (checkOnlyHighLight(dir)) { highLightButton(dir); return; } @@ -1537,6 +1537,24 @@ public class FILEChooserPane extends BasicPane { highLightButton(dir); } + /** + * 检查是不是只需要设置高亮即可 + * + * @param dir FILE + * @return 如果还要进行别的设置就返回false,如果只需要更新下高亮(通过点击上面的路径才会只需要更新高亮),返回true + */ + private boolean checkOnlyHighLight(FILE dir) { + if (popDir == null || dir == null) { + return false; + } + String popDirStr = popDir.toString(); + String dirStr = dir.toString(); + //前缀匹配是不够的,还要看下前缀匹配的下一位是不是'/' + //否则"test"和"test副本"明明不属于同个路径逻辑,也只更新高亮,应该是"test"和"test/副本"这样才可以通过 + //如果通过了indexOf的检查,因为不会存在相同的路径,popDirStr只会比dirStr大,看一下前缀匹配的下一位是不是'/',如果不是就得更新路径文本,不能只设置高亮 + return popDirStr.indexOf(dirStr) == 0 && popDirStr.length() > dirStr.length() && popDirStr.charAt(dirStr.length()) == '/'; + } + // doLayout @Override public void doLayout() { From e9383fb4bf276ed8db82fb70b628e2feb681ffca Mon Sep 17 00:00:00 2001 From: shine Date: Thu, 20 Apr 2023 14:55:51 +0800 Subject: [PATCH 126/625] =?UTF-8?q?fix:=20fvs=E5=9B=BE=E8=A1=A8=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=8D=E4=BF=9D=E5=AD=98=E4=B8=8D=E7=94=9F=E6=95=88?= =?UTF-8?q?=20#REPORT-94359?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/chart/BaseChartPropertyPane.java | 9 +++++++-- .../com/fr/design/mainframe/ChartPropertyPane.java | 10 +++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java b/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java index d4be14dcdd..9e8c1481a1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java @@ -3,6 +3,7 @@ package com.fr.design.gui.chart; import com.fr.base.chart.BaseChartCollection; import com.fr.design.designer.TargetComponent; import com.fr.design.mainframe.DockingView; +import org.jetbrains.annotations.Nullable; /** * 图表属性界面 抽象, 用于多工程协作.. @@ -14,8 +15,12 @@ public abstract class BaseChartPropertyPane extends DockingView { * 设置是否支持单元格数据. */ public abstract void setSupportCellData(boolean supportCellData); - - public abstract void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane); + + public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane) { + populateChartPropertyPane(collection, ePane, null); + } + + public abstract void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane, @Nullable Runnable callback); public abstract ChartEditPaneProvider getChartEditPane(); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index 8e6b80c53a..239eb8b8f3 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -17,6 +17,7 @@ import com.fr.design.gui.chart.ChartEditPaneProvider; import com.fr.design.gui.frpane.UITitlePanel; import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.utils.gui.GUICoreUtils; +import org.jetbrains.annotations.Nullable; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -96,7 +97,7 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * @param collection 收集图表 * @param ePane 面板 */ - public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { + public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane, @Nullable Runnable callback) { new SwingWorker() { @Override protected Void doInBackground() throws Exception { @@ -114,6 +115,9 @@ public class ChartPropertyPane extends BaseChartPropertyPane { } else { GUICoreUtils.setEnabled(chartEditPane, false); } + if (callback != null) { + callback.run(); + } } }.execute(); } @@ -123,9 +127,9 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * @param collection 收集图表 * @param ePane 面板 */ - public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane) { + public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane, @Nullable Runnable callback) { if (collection instanceof ChartCollection) { - populateChartPropertyPane((ChartCollection) collection, ePane); + populateChartPropertyPane((ChartCollection) collection, ePane, callback); } } From f7531bd0c70a83f145a5dbdbda920f3c3c7097fd Mon Sep 17 00:00:00 2001 From: shine Date: Thu, 20 Apr 2023 15:18:07 +0800 Subject: [PATCH 127/625] =?UTF-8?q?Revert=20"fix:=20fvs=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=B8=8D=E4=BF=9D=E5=AD=98=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88=20#REPORT-94359"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit e9383fb4bf276ed8db82fb70b628e2feb681ffca. --- .../com/fr/design/gui/chart/BaseChartPropertyPane.java | 9 ++------- .../com/fr/design/mainframe/ChartPropertyPane.java | 10 +++------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java b/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java index 9e8c1481a1..d4be14dcdd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java @@ -3,7 +3,6 @@ package com.fr.design.gui.chart; import com.fr.base.chart.BaseChartCollection; import com.fr.design.designer.TargetComponent; import com.fr.design.mainframe.DockingView; -import org.jetbrains.annotations.Nullable; /** * 图表属性界面 抽象, 用于多工程协作.. @@ -15,12 +14,8 @@ public abstract class BaseChartPropertyPane extends DockingView { * 设置是否支持单元格数据. */ public abstract void setSupportCellData(boolean supportCellData); - - public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane) { - populateChartPropertyPane(collection, ePane, null); - } - - public abstract void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane, @Nullable Runnable callback); + + public abstract void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane); public abstract ChartEditPaneProvider getChartEditPane(); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index 239eb8b8f3..8e6b80c53a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -17,7 +17,6 @@ import com.fr.design.gui.chart.ChartEditPaneProvider; import com.fr.design.gui.frpane.UITitlePanel; import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.utils.gui.GUICoreUtils; -import org.jetbrains.annotations.Nullable; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -97,7 +96,7 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * @param collection 收集图表 * @param ePane 面板 */ - public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane, @Nullable Runnable callback) { + public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { new SwingWorker() { @Override protected Void doInBackground() throws Exception { @@ -115,9 +114,6 @@ public class ChartPropertyPane extends BaseChartPropertyPane { } else { GUICoreUtils.setEnabled(chartEditPane, false); } - if (callback != null) { - callback.run(); - } } }.execute(); } @@ -127,9 +123,9 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * @param collection 收集图表 * @param ePane 面板 */ - public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane, @Nullable Runnable callback) { + public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane) { if (collection instanceof ChartCollection) { - populateChartPropertyPane((ChartCollection) collection, ePane, callback); + populateChartPropertyPane((ChartCollection) collection, ePane); } } From bc98c499b881297854c1a59391b465b1520d6390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 20 Apr 2023 16:16:02 +0800 Subject: [PATCH 128/625] =?UTF-8?q?REPORT-94359=20=E6=96=B0=E5=BB=BAfvs?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF-=E8=BD=AE=E6=92=AD=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E9=BD=BF=E8=BD=AE=E5=9B=BE=E6=95=B0=E6=8D=AE=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=9C=AA=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/ChartPropertyPane.java | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index 8e6b80c53a..297245960d 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -97,25 +97,16 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * @param ePane 面板 */ public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { - new SwingWorker() { - @Override - protected Void doInBackground() throws Exception { - GEOJSONHelper.getInstance(); - return null; - } - @Override - protected void done() { - String chartID = collection.getSelectedChartProvider(ChartProvider.class).getID(); - updateChartEditPane(collection.getSelectedChartProvider(ChartProvider.class).getID()); - setSupportCellData(true); - container.setEPane(ePane); - if (ChartTypeManager.getInstance().chartExit(chartID)) { - chartEditPane.populate(collection); - } else { - GUICoreUtils.setEnabled(chartEditPane, false); - } - } - }.execute(); + String chartID = collection.getSelectedChartProvider(ChartProvider.class).getID(); + updateChartEditPane(collection.getSelectedChartProvider(ChartProvider.class).getID()); + setSupportCellData(true); + this.container.setEPane(ePane); + + if (ChartTypeManager.getInstance().chartExit(chartID)) { + chartEditPane.populate(collection); + } else { + GUICoreUtils.setEnabled(chartEditPane, false); + } } /** From 67da995c385a57f50a2419e42c30b47fcd3dcb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 20 Apr 2023 16:18:37 +0800 Subject: [PATCH 129/625] =?UTF-8?q?REPORT-94359=20=E6=96=B0=E5=BB=BAfvs?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF-=E8=BD=AE=E6=92=AD=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E9=BD=BF=E8=BD=AE=E5=9B=BE=E6=95=B0=E6=8D=AE=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=9C=AA=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractWidgetAdvancedPaneProvider.java | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java b/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java index 45316a9f66..eb0c1aa477 100644 --- a/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java +++ b/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java @@ -1,6 +1,4 @@ package com.fr.design.fun.impl; - - import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -24,24 +22,4 @@ public abstract class AbstractWidgetAdvancedPaneProvider extends AbstractProv return getClass().getName(); } - protected WidgetType widgetType = WidgetType.PARA; - - /** - * 按钮类型:单元格 or 参数面板 - * - * @author John.Ying - * @version 11.0 - * Created by John.Ying on 2023/4/18 - */ - protected enum WidgetType { - /** - * 参数面板 - */ - PARA, - /** - * 单元格 - */ - CELL; - } - } From 56d0d4f9969d5e4a5328e64cca445b03f188248e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Thu, 20 Apr 2023 16:19:30 +0800 Subject: [PATCH 130/625] REPORT-94359 conflict --- .../fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java b/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java index eb0c1aa477..6b60eb56a8 100644 --- a/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java +++ b/designer-form/src/main/java/com/fr/design/fun/impl/AbstractWidgetAdvancedPaneProvider.java @@ -1,4 +1,5 @@ package com.fr.design.fun.impl; + import com.fr.design.fun.WidgetAdvancedPaneProvider; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; From dda0ca8794cd1e51b589728576dbfdfafd582de8 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 21 Apr 2023 10:12:41 +0800 Subject: [PATCH 131/625] =?UTF-8?q?REPORT-93215=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=90=8D=E7=A7=B0=E5=8C=85=E5=90=AB=E4=BA=8E?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E6=AC=A1=E9=80=89=E7=9A=84=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=EF=BC=8C=E4=BF=9D=E5=AD=98=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=9A=84=E8=B7=AF=E5=BE=84=E4=B8=8D=E4=BC=9A=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/file/FILEChooserPane.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index aeccebcc71..66b9d12d3d 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -129,6 +129,10 @@ public class FILEChooserPane extends BasicPane { public static final int JOPTIONPANE_CANCEL_OPTION = 3; + public static final String SEPARATOR_STRING = "/"; + + public static final char SEPARATOR_CHAR = '/'; + /** * alex:之所以在Pattern那里加个+,是因为有些路径会有两个甚至多个分隔符放在一起 @@ -1471,8 +1475,8 @@ public class FILEChooserPane extends BasicPane { String dirPath = dir.getPath(); //如果是报表环境,button的Action最后会跟上"/",这个是特意处理的,但是对应代码没有说明原因,不做修改 //FILE的getPath不会带"/",这边针对这种情况加个处理,不建议直接改FILE - if (actionPath.endsWith("/") && !dirPath.endsWith("/")) { - dirPath = dirPath + "/"; + if (actionPath.endsWith(SEPARATOR_STRING) && !dirPath.endsWith(SEPARATOR_STRING)) { + dirPath = dirPath + SEPARATOR_STRING; } if (ComparatorUtils.equals(actionPath, dirPath)) { this.buttonList.get(i).setForeground(Color.BLUE); @@ -1552,7 +1556,7 @@ public class FILEChooserPane extends BasicPane { //前缀匹配是不够的,还要看下前缀匹配的下一位是不是'/' //否则"test"和"test副本"明明不属于同个路径逻辑,也只更新高亮,应该是"test"和"test/副本"这样才可以通过 //如果通过了indexOf的检查,因为不会存在相同的路径,popDirStr只会比dirStr大,看一下前缀匹配的下一位是不是'/',如果不是就得更新路径文本,不能只设置高亮 - return popDirStr.indexOf(dirStr) == 0 && popDirStr.length() > dirStr.length() && popDirStr.charAt(dirStr.length()) == '/'; + return popDirStr.indexOf(dirStr) == 0 && popDirStr.length() > dirStr.length() && popDirStr.charAt(dirStr.length()) == SEPARATOR_CHAR; } // doLayout From 01a39012f70e14684ef0bbb17b8afe9d0349ae99 Mon Sep 17 00:00:00 2001 From: obo Date: Fri, 21 Apr 2023 11:12:23 +0800 Subject: [PATCH 132/625] =?UTF-8?q?REPORT-94458=20JS=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=9D=A2=E6=9D=BF=E5=B8=AE=E5=8A=A9=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E8=8E=B7=E5=8F=96=E4=B8=8D=E5=88=B0?= 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 3b8d04ffb3..74b1596207 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 @@ -391,7 +391,7 @@ 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); + 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); From 9ce5a14621f7aa3d83e6ccf790a8538f59cf0439 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 21 Apr 2023 14:15:15 +0800 Subject: [PATCH 133/625] =?UTF-8?q?REPORT-94114=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E9=9D=A2=E6=9D=BF=E5=9B=BE=E8=A1=A8=E8=B6=85=E9=93=BE?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E7=BC=BA=E5=A4=B1=20=E3=80=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91=E6=B2=A1=E6=9C=89=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=BD=93=E5=89=8D=E6=98=AF=E5=86=B3=E7=AD=96=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E5=9B=BE=E8=A1=A8=E8=BF=98=E6=98=AF=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9B=BE=E8=A1=A8=EF=BC=8C=E4=B8=A4=E8=80=85?= =?UTF-8?q?=E7=9A=84=E8=B6=85=E9=93=BE=E9=80=89=E9=A1=B9=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A4=E6=96=AD=E5=BD=93=E5=89=8D=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/VanChartHyperLinkPane.java | 19 +++++++++++++------ 1 file changed, 13 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..34375790f3 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,19 @@ 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 { + // 编辑的是决策报表中的图表,那么没有ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项 + Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class}; + for (Class aClass : classes) { + if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) { + if (ComparatorUtils.equals(aClass, clazz)) { + return false; + } } } } From 059e7cfb2c482515240d2c6a6157d1e0684c726e Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 21 Apr 2023 16:30:19 +0800 Subject: [PATCH 134/625] =?UTF-8?q?REPORT-94114=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E9=9D=A2=E6=9D=BF=E5=9B=BE=E8=A1=A8=E8=B6=85=E9=93=BE?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E7=BC=BA=E5=A4=B1=20=E4=BF=AE=E6=94=B9=20frm?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9D=97=E4=B8=AD=E7=9A=84=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E8=B6=85=E9=93=BE=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../van/chart/custom/component/VanChartHyperLinkPane.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 34375790f3..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 @@ -315,10 +315,15 @@ public class VanChartHyperLinkPane extends VanChartUIListControlPane { FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); return !ComparatorUtils.equals(clazz, formHyperlink.getClass()); } else { - // 编辑的是决策报表中的图表,那么没有ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项 + // 如果是决策报表 + 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 cab83ef74b6bc2cb1255fdafb5a84215789dd00f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=2EYing-=E5=BA=94=E5=BF=97=E6=B5=A9?= Date: Sat, 22 Apr 2023 22:08:09 +0800 Subject: [PATCH 135/625] =?UTF-8?q?REPORT-92628=20=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=BB=E9=A2=98=E5=88=87=E6=8D=A2-?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=8E=A7=E4=BB=B6=E6=9C=AA=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E6=A0=B7=E5=BC=8F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/widget/btn/ButtonConstants.java | 16 ++ .../design/widget/btn/ButtonDetailPane.java | 62 ------- .../design/widget/btn/ButtonDetailPane.java | 151 ++++++++++++++++++ .../btn/ButtonWithHotkeysDetailPane.java | 11 +- .../ui/btn/FormSubmitButtonDetailPane.java | 15 +- .../ui/btn/AppendRowButtonDefinePane.java | 20 ++- .../ui/btn/DefaultButtonDetailPane.java | 17 ++ .../ui/btn/DeleteRowButtonDefinePane.java | 17 +- .../widget/ui/btn/FreeButtonDetailPane.java | 19 ++- 9 files changed, 259 insertions(+), 69 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java rename {designer-base => designer-form}/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java (90%) diff --git a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonConstants.java b/designer-base/src/main/java/com/fr/design/widget/btn/ButtonConstants.java index 9be9a8fba4..85b2cbc08e 100644 --- a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonConstants.java +++ b/designer-base/src/main/java/com/fr/design/widget/btn/ButtonConstants.java @@ -44,4 +44,20 @@ public class ButtonConstants { StableFactory.getMarkedClass(BridgeMark.SUBMIT_BUTTON, Widget.class), StableFactory.getMarkedClass(BridgeMark.TREE_NODE_TOGGLE_BUTTON, Widget.class) }; + + public static final String[] TYPES4BUTTON4STRONGEST_CONTROL = { + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Common"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_Insert_Row"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Delete_Row"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Type_Parameter_Submit"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_TreeNode") + }; + + public static final Class[] CLASSES4BUTTON4STRONGEST_CONTROL = { + Button.class, + StableFactory.getMarkedClass(BridgeMark.APPEND_ROW_BUTTON, Widget.class), + StableFactory.getMarkedClass(BridgeMark.DELETE_ROW_BUTTON, Widget.class), + StableFactory.getMarkedClass(BridgeMark.SUBMIT_BUTTON, Widget.class), + StableFactory.getMarkedClass(BridgeMark.TREE_NODE_TOGGLE_BUTTON, Widget.class) + }; } diff --git a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java b/designer-base/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java deleted file mode 100644 index 63d678577a..0000000000 --- a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.fr.design.widget.btn; - -import com.fr.design.gui.icombobox.DictionaryComboBox; -import com.fr.design.dialog.BasicPane; -import com.fr.design.widget.btn.ButtonConstants; -import com.fr.form.ui.Button; - - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-15 - * Time : 下午6:21 - */ -public abstract class ButtonDetailPane extends BasicPane { - private List ls = new ArrayList(); - - @Override - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Button"); - } - - public void populate(T button) { - - } - - public abstract T createButton(); - - public abstract T update(); - - protected void typeChange(Object obj) { - for (int i = 0, len = ls.size(); i < len; i++) { - ls.get(i).stateChanged(new ChangeEvent(obj)); - } - } - - public void addTypeChangeListener(ChangeListener l) { - ls.add(l); - } - - public abstract Class classType(); - - protected DictionaryComboBox createButtonTypeComboBox() { - final DictionaryComboBox dictionaryComboBox = new DictionaryComboBox(ButtonConstants.CLASSES4BUTTON, ButtonConstants.TYPES4BUTTON, false); - dictionaryComboBox.setSelectedItem(classType()); - dictionaryComboBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - typeChange(dictionaryComboBox.getSelectedItem()); - } - }); - return dictionaryComboBox; - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java b/designer-form/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java new file mode 100644 index 0000000000..81e28bf296 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/btn/ButtonDetailPane.java @@ -0,0 +1,151 @@ +package com.fr.design.widget.btn; + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.fun.WidgetAdvancedPaneProvider; +import com.fr.design.gui.icombobox.DictionaryComboBox; +import com.fr.design.dialog.BasicPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.form.ui.Button; +import com.fr.general.GeneralContext; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; + + +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date : 11-11-15 + * Time : 下午6:21 + */ +public abstract class ButtonDetailPane extends BasicPane { + private List ls = new ArrayList(); + protected final List> extraPaneList = new ArrayList<>(); + protected JPanel extraPane; + protected boolean containsExtraPane; + protected static double F = TableLayout.FILL; + protected static double P = TableLayout.PREFERRED; + @Override + public String title4PopupWindow() { + return com.fr.design.i18n.Toolkit.i18nText("Button"); + } + + public void populate(T button) { + + } + + public abstract T createButton(); + + public abstract T update(); + + protected void typeChange(Object obj) { + for (int i = 0, len = ls.size(); i < len; i++) { + ls.get(i).stateChanged(new ChangeEvent(obj)); + } + } + + public void addTypeChangeListener(ChangeListener l) { + ls.add(l); + } + + public abstract Class classType(); + + protected DictionaryComboBox createButtonTypeComboBox() { +// final DictionaryComboBox dictionaryComboBox = new DictionaryComboBox(ButtonConstants.CLASSES4BUTTON, ButtonConstants.TYPES4BUTTON, false); +// dictionaryComboBox.setSelectedItem(classType()); +// dictionaryComboBox.addActionListener(new ActionListener() { +// @Override +// public void actionPerformed(ActionEvent e) { +// typeChange(dictionaryComboBox.getSelectedItem()); +// } +// }); +// return dictionaryComboBox; + return createButtonTypeComboBox(false); + } + + private DictionaryComboBox initDictionaryComboBox(DictionaryComboBox dictionaryComboBox) { + dictionaryComboBox.setSelectedItem(classType()); + dictionaryComboBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + typeChange(dictionaryComboBox.getSelectedItem()); + } + }); + return dictionaryComboBox; +// return createButtonTypeComboBox(); + } + + protected DictionaryComboBox createButtonTypeComboBox(Boolean containsExtraPane) { + final DictionaryComboBox dictionaryComboBox; + if (!containsExtraPane) { + dictionaryComboBox = new DictionaryComboBox(ButtonConstants.CLASSES4BUTTON, ButtonConstants.TYPES4BUTTON, false); + } else { + dictionaryComboBox = new DictionaryComboBox(ButtonConstants.CLASSES4BUTTON4STRONGEST_CONTROL, ButtonConstants.TYPES4BUTTON4STRONGEST_CONTROL, false); + } + return initDictionaryComboBox(dictionaryComboBox); + } + + + + protected void initExtraPane() { + initPluginListener(); + refreshExtraAdvancedPane(); + } + + protected void refreshExtraAdvancedPane() { + // do nothing + } + + protected void refreshExtraAdvancedPane(Class cls) { + extraPaneList.clear(); + boolean containsExtraPane = false; + Set> providers = ExtraDesignClassManager.getInstance().getArray(WidgetAdvancedPaneProvider.XML_TAG); + for (WidgetAdvancedPaneProvider provider : providers) { + if (!provider.accept(cls)) { + continue; + } + insertShortCut(provider.getInsertPosition(extraPaneList.size()), provider.createExtraAdvancedPane()); + containsExtraPane = true; + } + if (containsExtraPane) { + extraPane = FRGUIPaneFactory.createYBoxEmptyBorderPane(); + for (BasicBeanPane pane : extraPaneList) { + extraPane.add(pane); + } + } + this.containsExtraPane = containsExtraPane; + + } + + protected void initPluginListener() { + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { + @Override + public void on(PluginEvent event) { + refreshExtraAdvancedPane(); + } + }, pluginContext -> pluginContext.getRuntime().contain(WidgetAdvancedPaneProvider.XML_TAG)); + } + + /** + * 插入配置项面板 + * + * @param index 插入的位置 + * @param pane 配置项面板 + */ + protected void insertShortCut(int index, BasicBeanPane pane) { + int size = extraPaneList.size(); + index = Math.min(index, size); + extraPaneList.add(index, pane); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java b/designer-form/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java similarity index 90% rename from designer-base/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java rename to designer-form/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java index b75aeaa81f..904126e9d0 100644 --- a/designer-base/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java @@ -4,6 +4,7 @@ import java.awt.*; import javax.swing.*; +import com.fr.design.beans.BasicBeanPane; import com.fr.design.designer.IntervalConstants; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ilable.UILabel; @@ -42,8 +43,9 @@ public abstract class ButtonWithHotkeysDetailPane extends Butt JPanel labelPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); iconPane = new AccessibleIconEditor(); labelPane.add(iconPane); + Component comp = createCenterPane(); Component[][] n_components = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Button_Type")), createButtonTypeComboBox()}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Button_Type")), createButtonTypeComboBox(containsExtraPane)}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Name")), buttonNameTextField = new UITextField()}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Icon")), iconPane}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Button_Hot_keys")), hotkeysTextField = new UITextField()}, @@ -52,7 +54,6 @@ public abstract class ButtonWithHotkeysDetailPane extends Butt JPanel panel = TableLayoutHelper.createGapTableLayoutPane(n_components, rowSize, columnSize, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); advancePane.add(panel, BorderLayout.NORTH); - Component comp = createCenterPane(); if(comp != null ) { advancePane.add(comp,BorderLayout.CENTER); } @@ -71,6 +72,9 @@ public abstract class ButtonWithHotkeysDetailPane extends Butt iconPane.setValue(button.getIconName()); buttonNameTextField.setText(button.getText()); hotkeysTextField.setText(button.getHotkeys()); + for (BasicBeanPane pane : extraPaneList) { + pane.populateBean(button); + } } @Override @@ -79,6 +83,9 @@ public abstract class ButtonWithHotkeysDetailPane extends Butt button.setIconName((String)iconPane.getValue()); button.setText(buttonNameTextField.getText()); button.setHotkeys(hotkeysTextField.getText()); + for (BasicBeanPane pane : extraPaneList) { + pane.updateBean(button); + } return button; } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/btn/FormSubmitButtonDetailPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/btn/FormSubmitButtonDetailPane.java index acc2e76c4e..83d24e8e87 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/btn/FormSubmitButtonDetailPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/btn/FormSubmitButtonDetailPane.java @@ -1,5 +1,6 @@ package com.fr.design.widget.ui.btn; +import com.fr.design.layout.TableLayoutHelper; import com.fr.form.parameter.FormSubmitButton; import com.fr.design.widget.btn.ButtonWithHotkeysDetailPane; @@ -16,7 +17,14 @@ public class FormSubmitButtonDetailPane extends ButtonWithHotkeysDetailPane

extends Button @Override protected Component createCenterPane() { - return defineColumnRowPane = new DefineAppendColumnRowPane(); + initExtraPane(); + defineColumnRowPane = new DefineAppendColumnRowPane(); + Component[][] components = new Component[][]{ + new Component[]{defineColumnRowPane, null}, + new Component[]{extraPane, null} + }; + double[] rowSize = {P, P}; + double[] columnSize = {P, F}; + int[][] rowCount = {{1, 1},{1, 1}}; + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 10, 7); } @Override @@ -55,4 +68,9 @@ public class AppendRowButtonDefinePane extends Button public Class classType() { return AppendRowButton.class; } + + @Override + protected void refreshExtraAdvancedPane() { + super.refreshExtraAdvancedPane(AppendRowButton.class); + } } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefaultButtonDetailPane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefaultButtonDetailPane.java index e7f621ccb4..326bcbbfcc 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefaultButtonDetailPane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/btn/DefaultButtonDetailPane.java @@ -1,5 +1,6 @@ package com.fr.design.widget.ui.btn; +import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.Button; import com.fr.form.ui.FreeButton; import com.fr.design.widget.btn.ButtonWithHotkeysDetailPane; @@ -14,6 +15,16 @@ public class DefaultButtonDetailPane extends ButtonWithHotkeysDetailPane