From 7aa284f10f26d64c35c207f2e74e6513defd6b3c Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Tue, 3 Dec 2024 14:15:23 +0800 Subject: [PATCH 1/7] =?UTF-8?q?REPORT-141296=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?UI=E6=93=8D=E4=BD=9C=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 2 +- .../design/actions/file/PreferenceAction.java | 2 +- .../design/actions/file/PreferencePane.java | 155 +++++++++++------- .../tabledatapane/DBTableDataPane.java | 19 ++- .../fr/design/mainframe/DesignerFrame.java | 72 ++++---- .../theme/TemplateThemeGridControlPane.java | 17 +- .../java/com/fr/design/ui/util/UIUtil.java | 63 +++++++ .../design/cell/editor/FormulaCellEditor.java | 2 + 8 files changed, 234 insertions(+), 98 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 33be0b7fc4..1ef14ad5ef 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -515,7 +515,7 @@ public class EnvChangeEntrance { final EnvListPane envListPane = new EnvListPane(); final BasicDialog envListDialog = envListPane.showWindow(DesignerContext.getDesignerFrame()); dialog = envListDialog; - envListPane.populateEnvManager(envName); + SwingUtilities.invokeLater(() -> envListPane.populateEnvManager(envName)); envListDialog.addDialogActionListener(new DialogActionAdapter() { @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java index d571d60f34..5d716b0287 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java @@ -31,8 +31,8 @@ public class PreferenceAction extends UpdateAction { */ public void actionPerformed(ActionEvent e) { final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); - final PreferencePane preferencePane = new PreferencePane(); + // 将当前环境配置填充到PreferencePane中 preferencePane.populate(DesignerEnvManager.getEnvManager()); BasicDialog basicDialog = preferencePane.showWindow(designerFrame); 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 b526b6ae2b..6852392791 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 @@ -42,6 +42,7 @@ import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.mainframe.vcs.ui.UIPositiveIntEditor; import com.fr.design.mainframe.vcs.ui.VcsMovePanel; import com.fr.design.os.impl.SupportOSImpl; +import com.fr.design.ui.util.UIUtil; import com.fr.design.unit.UnitConvertUtil; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.widget.FRWidgetFactory; @@ -55,6 +56,7 @@ import com.fr.log.FineLoggerFactory; import com.fr.report.ReportConfigManager; import com.fr.stable.Constants; import com.fr.third.apache.logging.log4j.Level; +import com.fr.third.guava.base.Supplier; import com.fr.third.guava.collect.BiMap; import com.fr.third.guava.collect.HashBiMap; import com.fr.transaction.Configurations; @@ -67,6 +69,9 @@ import com.fr.workspace.server.vcs.VcsConfig; import com.fr.workspace.server.vcs.git.config.GcConfig; import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanSchedule; import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService; +import java.util.Arrays; +import java.util.function.Consumer; +import java.util.List; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -869,23 +874,33 @@ public class PreferencePane extends BasicPane { if (designerEnvManager == null) { return; } + // 常用 + loadCommonSettings(designerEnvManager); + // 版本管理 + loadVersionControlSettings(designerEnvManager); + // 高级 + loadAdvanceSettings(designerEnvManager); + } + /** + * 选项-常用 + * @param designerEnvManager + */ + private void loadCommonSettings(DesignerEnvManager designerEnvManager) { + // 功能设置 supportUndoCheckBox.setSelected(designerEnvManager.isSupportUndo()); if (designerEnvManager.isSupportUndo()) { maxUndoLimit.setSelectedIndex(chooseCase(designerEnvManager.getUndoLimit())); } else { maxUndoLimit.setEnabled(false); } - supportDefaultParentCalculateCheckBox.setSelected(designerEnvManager.isSupportDefaultParentCalculate()); - showTemplateMissingPlugin.setSelected(designerEnvManager.isShowTemplateMissingPlugin()); - + this.startWithEmptyFile.setSelected(designerEnvManager.isStartWithEmptyFile()); + // 编辑器设置 supportStringToFormulaBox.setSelected(designerEnvManager.isSupportStringToFormula()); - shortCutLabel.setText(getDisplayShortCut(designerEnvManager.getAutoCompleteShortcuts())); shortCutKeyStore = convert2KeyStroke(designerEnvManager.getAutoCompleteShortcuts()); - if (supportStringToFormulaBox.isSelected()) { defaultStringToFormulaBox.setEnabled(true); defaultStringToFormulaBox.setSelected(designerEnvManager.isDefaultStringToFormula()); @@ -893,13 +908,74 @@ public class PreferencePane extends BasicPane { defaultStringToFormulaBox.setEnabled(false); defaultStringToFormulaBox.setSelected(false); } + // 颜色设置 + gridLineColorTBButton.setColor(designerEnvManager.getGridLineColor()); + paginationLineColorTBButton.setColor(designerEnvManager.getPaginationLineColor()); + // 语言选择 + this.languageComboBox.setSelectedItem(designerEnvManager.getLanguage()); + // 启动页配置 + this.startupPageEnabledCheckBox.setSelected(designerEnvManager.isStartupPageEnabled()); + } + + /** + * 高级 + * @param designerEnvManager + */ + private void loadAdvanceSettings(DesignerEnvManager designerEnvManager) { + // Log导出配置 + this.logExportDirectoryField.setText(designerEnvManager.getLogLocation()); + this.logLevelComboBox.setSelectedItem(Log4jConfig.getInstance().getRootLevel()); + // 标尺单位配置 + this.pageLengthComboBox.setSelectedIndex(designerEnvManager.getPageLengthUnit()); + this.reportLengthComboBox.setSelectedIndex(designerEnvManager.getReportLengthUnit()); + // 端口设置 + this.portEditor.setValue(new Integer(designerEnvManager.getEmbedServerPort())); + // 插件管理器选项 + if (useOptimizedUPMCheckbox != null) { + useOptimizedUPMCheckbox.setSelected(true); + } + // 显示oracle所有表 + this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace()); + // 模板内存优化 + this.cachingTemplateSpinner.setValue(designerEnvManager.getCachingTemplateLimit()); + // 产品改良 + this.joinProductImproveCheckBox.setSelected(designerEnvManager.isJoinProductImprove()); + if (this.autoPushUpdateCheckBox != null) { + this.autoPushUpdateCheckBox.setSelected(designerEnvManager.isAutoPushUpdateEnabled()); + } + // 模板预览性能 + this.imageCompressPanelCheckBox.setSelected(designerEnvManager.isImageCompress()); + boolean enabled = WorkContext.getCurrent().isLocal() || WorkContext.getCurrent().isRoot(); + previewRenderSpeed.setEnabled(enabled); + previewRenderQuality.setEnabled(enabled); + previewResolutionBtnS.setEnabled(enabled); + previewResolutionBtnM.setEnabled(enabled); + // 设计器启动选项-延迟启动云端运维模块 + this.cloudAnalyticsDelayCheckBox.setSelected(designerEnvManager.isCloudAnalyticsDelay()); + List> advanceConfigLoaders = Arrays.asList( + GcConfig.getInstance()::isGcEnable, + ServerPreferenceConfig.getInstance()::isUseUniverseDBM, + ReportConfigManager.getProviderInstance()::getImageExportAttr + ); + List> advanceConfigUpdaters = Arrays.asList( + gcEnable -> updateGcConfigUI((Boolean) gcEnable), + useUniverseDBM -> useUniverseDBMCheckbox.setSelected((Boolean) useUniverseDBM), + imageExportAttr -> updateImageExportUI((ImageExportAttr) imageExportAttr) + ); + UIUtil.loadConfigsAndUpdateUI(advanceConfigLoaders, advanceConfigUpdaters); + } + + /** + * 选项-版本管理 + * @param designerEnvManager + */ + private void loadVersionControlSettings(DesignerEnvManager designerEnvManager) { VcsConfigManager vcsConfigManager = designerEnvManager.getVcsConfigManager(); //如果是集群并且是老版本则不可用 if (VcsHelper.getInstance().isLegacyMode() && WorkContext.getCurrent().isCluster()) { vcsEnableCheckBox.setEnabled(false); gcEnableCheckBox.setEnabled(false); } - if (VcsHelper.getInstance().needInit()) { vcsEnableCheckBox.setSelected(vcsConfigManager.isVcsEnable()); } else { @@ -911,71 +987,40 @@ public class PreferencePane extends BasicPane { saveIntervalEditor.setEnabled(false); useIntervalCheckBox.setEnabled(false); } - saveIntervalEditor.setValue(vcsConfigManager.getSaveInterval()); saveCommitCheckBox.setSelected(vcsConfigManager.isSaveCommit()); useIntervalCheckBox.setSelected(vcsConfigManager.isUseInterval()); - gcEnableCheckBox.setSelected(GcConfig.getInstance().isGcEnable()); - gcButton.setEnabled(gcEnableCheckBox.isSelected()); - - useVcsAutoSaveScheduleCheckBox.setSelected(vcsConfigManager.isUseAutoSave()); - useVcsAutoCleanScheduleCheckBox.setSelected(VcsConfig.getInstance().isUseV2AutoClean()); + //版本管理-存储与清理机制 + List> vcsConfigLoaders = Arrays.asList( + VcsConfig.getInstance()::isUseV2AutoClean, + VcsConfig.getInstance()::getV2CleanInterval, + VcsConfig.getInstance()::getV2RetainInterval + ); + List> vcsConfigUpdaters = Arrays.asList( + useV2AutoClean -> useVcsAutoSaveScheduleCheckBox.setSelected((Boolean) useV2AutoClean), + v2CleanInterval -> autoCleanIntervalComboBox.setSelectedIndex(getIndex((Integer) v2CleanInterval)), + v2RetainInterval -> autoCleanRetainIntervalComboBox.setSelectedIndex(getIndex((Integer) v2RetainInterval)) + ); + UIUtil.loadConfigsAndUpdateUI(vcsConfigLoaders, vcsConfigUpdaters); autoSaveIntervalEditor.setValue(vcsConfigManager.getAutoSaveInterval()); - autoCleanIntervalComboBox.setSelectedIndex(getIndex(VcsConfig.getInstance().getV2CleanInterval())); - autoCleanRetainIntervalComboBox.setSelectedIndex(getIndex(VcsConfig.getInstance().getV2RetainInterval())); - - gridLineColorTBButton.setColor(designerEnvManager.getGridLineColor()); - paginationLineColorTBButton.setColor(designerEnvManager.getPaginationLineColor()); - - this.logExportDirectoryField.setText(designerEnvManager.getLogLocation()); - - this.logLevelComboBox.setSelectedItem(Log4jConfig.getInstance().getRootLevel()); - - this.languageComboBox.setSelectedItem(designerEnvManager.getLanguage()); - - this.pageLengthComboBox.setSelectedIndex(designerEnvManager.getPageLengthUnit()); - this.reportLengthComboBox.setSelectedIndex(designerEnvManager.getReportLengthUnit()); - - this.portEditor.setValue(new Integer(designerEnvManager.getEmbedServerPort())); - - if (useOptimizedUPMCheckbox != null) { - useOptimizedUPMCheckbox.setSelected(true); - } - - useUniverseDBMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseUniverseDBM()); - - this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace()); - this.cachingTemplateSpinner.setValue(designerEnvManager.getCachingTemplateLimit()); - this.joinProductImproveCheckBox.setSelected(designerEnvManager.isJoinProductImprove()); - - if (this.autoPushUpdateCheckBox != null) { - this.autoPushUpdateCheckBox.setSelected(designerEnvManager.isAutoPushUpdateEnabled()); - } - - this.startWithEmptyFile.setSelected(designerEnvManager.isStartWithEmptyFile()); + } - this.imageCompressPanelCheckBox.setSelected(designerEnvManager.isImageCompress()); + private void updateGcConfigUI(Boolean gcEnable) { + gcEnableCheckBox.setSelected(gcEnable); + gcButton.setEnabled(gcEnable); + } - ImageExportAttr attr = ReportConfigManager.getProviderInstance().getImageExportAttr(); + private void updateImageExportUI(ImageExportAttr attr) { if (attr.getPreviewRenderQuality() == ImageExportAttr.RENDER_SPEED) { previewRenderSpeed.setSelected(true); } else { previewRenderQuality.setSelected(true); } - if (attr.getPreviewResolutionScale() == DPI_SCALE_S) { previewResolutionBtnS.setSelected(true); } else { previewResolutionBtnM.setSelected(true); } - boolean enabled = WorkContext.getCurrent().isLocal() || WorkContext.getCurrent().isRoot(); - previewRenderSpeed.setEnabled(enabled); - previewRenderQuality.setEnabled(enabled); - previewResolutionBtnS.setEnabled(enabled); - previewResolutionBtnM.setEnabled(enabled); - - this.cloudAnalyticsDelayCheckBox.setSelected(designerEnvManager.isCloudAnalyticsDelay()); - this.startupPageEnabledCheckBox.setSelected(designerEnvManager.isStartupPageEnabled()); } private int chooseCase(int sign) { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java index 1abbb6ab3d..437a4bb906 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java @@ -46,6 +46,7 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ToolBarDef; +import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.ParameterUtils; import com.fr.esd.core.strategy.config.StrategyConfig; import com.fr.esd.core.strategy.config.StrategyConfigHelper; @@ -67,7 +68,6 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import org.jetbrains.annotations.NotNull; -import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JPanel; @@ -80,7 +80,6 @@ import javax.swing.text.BadLocationException; import javax.swing.text.Document; import java.awt.BorderLayout; import java.awt.CardLayout; -import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -226,6 +225,7 @@ public class DBTableDataPane extends AbstractTableDataPane implemen addConnectionTableProcedurePaneListener(); } + private void addConnectionTableProcedurePaneListener() { this.connectionTableProcedurePane.addDoubleClickListener(new ConnectionTableProcedurePane.DoubleClickSelectedNodeOnTreeListener() { @Override @@ -511,22 +511,23 @@ public class DBTableDataPane extends AbstractTableDataPane implemen } private void populateESDComponents() { - //查找映射的配置 - this.strategyConfig = configHandler.find(); + UIUtil.executeAsyncTaskAndUpdateUI(configHandler::find, this::updateESDComponents); + } + private void updateESDComponents(StrategyConfig strategyConfig) { + this.strategyConfig = strategyConfig; boolean shouldEnable = false; StrategyConfigFrom from = StrategyConfigFrom.GLOBAL; - if (this.strategyConfig != null) { - if (this.strategyConfig.enabled()) { + if (strategyConfig != null) { + if (strategyConfig.enabled()) { shouldEnable = true; } - if (!this.strategyConfig.isUseGlobal()) { + if (!strategyConfig.isUseGlobal()) { from = StrategyConfigFrom.INDIVIDUAL; } } - - //服务器数据集不允许设置来源,只能单独配置 + // 服务器数据集不允许设置来源,只能单独配置 if (dbTableData.getScope() != StrategicTableData.Scope.TEMPLATE) { from = StrategyConfigFrom.INDIVIDUAL; this.esdConfigOption.setEnabled(false); 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 1417bd548a..aa80150da0 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 @@ -39,6 +39,7 @@ import com.fr.design.mainframe.vcs.ui.VcsMovingExitOption; import com.fr.design.menu.ShortCut; import com.fr.design.os.impl.MacOsAddListenerAction; import com.fr.design.os.impl.SupportOSImpl; +import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.TemplateUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.event.EventDispatcher; @@ -63,7 +64,6 @@ import com.fr.stable.project.ProjectConstants; import com.fr.start.OemHandler; import com.fr.start.common.DesignerOpenEmptyPanel; import com.fr.workspace.WorkContext; -import com.fr.workspace.Workspace; import com.fr.workspace.connect.WorkspaceConnectionInfo; import javax.swing.Icon; @@ -315,7 +315,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } public void resizeFrame() { - + JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (currentEditingTemplate != null) { currentEditingTemplate.setComposite(); @@ -686,37 +686,50 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * 设置标题 */ public void setTitle() { - + StringBuilder defaultTitleSB = buildDefaultTitle(); JTemplate editingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + // 当前模板是否为有效模板 + if (JTemplate.isValid(editingTemplate)) { + String path = editingTemplate.getPath(); + UIUtil.executeAsyncTaskAndUpdateUI(() -> editingTemplate.getEditingFILE().exists(), exists -> { + String finalPath = buildFinalPath(path, exists, editingTemplate); + defaultTitleSB.append(" ").append(finalPath); + setTitle(defaultTitleSB.toString()); + }); + } else { + setTitle(defaultTitleSB.toString()); + } + } + + private String buildFinalPath(String path, boolean exists, JTemplate editingTemplate) { + String finalPath = path; + if (!exists) { + finalPath = FILEFactory.MEM_PREFIX + path; + } else if (finalPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { + finalPath = WorkContext.getCurrent().getPath() + File.separator + TemplateUtils.createLockeTemplatedName(editingTemplate, path); + } + return finalPath; + } + + private StringBuilder buildDefaultTitle() { StringBuilder defaultTitleSB = new StringBuilder(); - defaultTitleSB.append(ProductConstants.APP_NAME); - defaultTitleSB.append(" "); - defaultTitleSB.append(GeneralUtils.getVersion()); - defaultTitleSB.append(" "); - defaultTitleSB.append(ProductConstants.BRANCH); - defaultTitleSB.append(" "); + defaultTitleSB.append(ProductConstants.APP_NAME).append(" ").append(GeneralUtils.getVersion()).append(" ").append(ProductConstants.BRANCH).append(" "); // james:标识登录的用户和登录的ENV String envName = DesignerEnvManager.getEnvManager().getCurEnvName(); - Workspace workspace = WorkContext.getCurrent(); - DesignerWorkspaceInfo info = DesignerEnvManager.getEnvManager().getWorkspaceInfo(envName); + String username = getCurrentUsername(envName); + // 拼接用户名、环境名以及工作环境描述 + defaultTitleSB.append(username).append("@").append(envName).append("[").append(WorkContext.getCurrent().getDescription()).append("]"); + return defaultTitleSB; + } + private String getCurrentUsername(String envName) { String username = null; + DesignerWorkspaceInfo info = DesignerEnvManager.getEnvManager().getWorkspaceInfo(envName); if (info != null) { WorkspaceConnectionInfo connection = info.getConnection(); username = connection == null ? StringUtils.EMPTY : connection.getUserName(); } - defaultTitleSB.append(username).append("@").append(envName).append("[").append(workspace.getDescription()).append("]"); - if (JTemplate.isValid(editingTemplate)) { - String path = editingTemplate.getPath(); - if (!editingTemplate.getEditingFILE().exists()) { - path = FILEFactory.MEM_PREFIX + path; - } else if (path.startsWith(ProjectConstants.REPORTLETS_NAME)) { - path = workspace.getPath() + File.separator + TemplateUtils.createLockeTemplatedName(editingTemplate, path); - } - defaultTitleSB.append(" ").append(path); - } - - setTitle(defaultTitleSB.toString()); + return username; } /** @@ -817,22 +830,22 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } } } - + public void showEmptyJTemplate() { - + DesignerOpenEmptyPanel designerOpenEmptyPanel = new DesignerOpenEmptyPanel(); BorderLayout layout = (BorderLayout) basePane.getLayout(); basePane.remove(layout.getLayoutComponent(BorderLayout.CENTER)); basePane.remove(layout.getLayoutComponent(BorderLayout.EAST)); basePane.add(designerOpenEmptyPanel, BorderLayout.CENTER); - + resetToolkitByPlus(ToolBarMenuDock.NULLAVOID); - + // 这里挺恶心的,是为了保证对插件的兼容性适配 // 不然的话,插件就会 npe // 见 https://work.fineres.com/browse/REPORT-76091 HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(JNullTemplate.NULL); - + layeredPane.repaint(); } @@ -932,6 +945,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta /** * 根据模板路径获取模板名称 + * * @param templatePath 模板路径 template.getPath() * @return 模板名 */ @@ -950,7 +964,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @return 是否停用失败 */ - private boolean currentTemplateDeactivateFail(JTemplate jt) { + private boolean currentTemplateDeactivateFail(JTemplate jt) { JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); return currentEditingTemplate != null && !currentEditingTemplate.deactivateTemplate(jt); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java index f2101b944a..57ba7ee9c9 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java @@ -19,11 +19,16 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog; import com.fr.design.menu.MenuDef; import com.fr.design.menu.ToolBarDef; +import com.fr.design.ui.util.UIUtil; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; +import com.fr.third.guava.base.Supplier; import com.fr.third.javax.annotation.Nullable; import com.fr.transaction.CallBackAdaptor; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; @@ -211,9 +216,15 @@ public class TemplateThemeGridControlPane extends Basic MenuDef menuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); menuDef.setIcon(new LazyIcon("add_popup")); menuDef.setRePaint(true); - menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Light_Theme"), config.getDefaultLightThemeName())); - menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Dark_Theme"), config.getDefaultDarkThemeName())); - + List> configLoaders = Arrays.asList( + config::getDefaultLightThemeName, + config::getDefaultDarkThemeName + ); + List> configUpdaters = Arrays.asList( + lightThemeName -> menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Light_Theme"), lightThemeName)), + darkThemeName -> menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Dark_Theme"), darkThemeName)) + ); + UIUtil.loadConfigsAndUpdateUI(configLoaders, configUpdaters); return menuDef; } diff --git a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java index c03550da2a..12ad87fca6 100644 --- a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java +++ b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java @@ -3,9 +3,13 @@ package com.fr.design.ui.util; import com.fr.log.FineLoggerFactory; import com.fr.third.guava.base.Stopwatch; import com.fr.third.guava.base.Supplier; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; import javax.swing.UIManager; import java.awt.Color; import java.util.concurrent.TimeUnit; @@ -87,4 +91,63 @@ public class UIUtil { public static Color getPanelBackageColor() { return UIManager.getColor("Panel.background"); } + + /** + * 执行异步任务并在任务完成后更新UI。 + *

+ * 该方法将执行一个耗时的后台任务,并在任务完成后将结果传递给一个回调函数来更新UI。 + * 使用 SwingWorker 来处理后台任务,确保在任务完成后回到 EDT(事件分发线程) 更新 UI。 + * + * @param 任务结果的类型 + * @param task 需要在后台执行的任务。该任务的执行过程由 Supplier 提供,返回任务的结果。 + * @param uiUpdater 在任务完成后执行的回调函数,用来处理结果并更新UI。 + */ + public static void executeAsyncTaskAndUpdateUI(Supplier task, Consumer uiUpdater) { + new SwingWorker() { + @Override + protected T doInBackground() throws Exception { + return task.get(); + } + @Override + protected void done() { + try { + T result = get(); + uiUpdater.accept(result); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }.execute(); + } + + /** + * 异步加载配置并在加载完成后更新 UI。 + * + * @param 配置对象的类型 + * @param configLoaders 配置加载器列表,每个加载器负责加载一种配置 + * @param uiUpdaters UI 更新器列表,每个更新器负责在 UI 上显示对应配置的值 + */ + public static void loadConfigsAndUpdateUI(List> configLoaders, List> uiUpdaters) { + new SwingWorker, Void>() { + @Override + protected List doInBackground() throws Exception { + List results = new ArrayList<>(); + for (Supplier configLoader : configLoaders) { + results.add(configLoader.get()); + } + return results; + } + @Override + protected void done() { + try { + List configResults = get(); + for (int i = 0; i < configResults.size(); i++) { + uiUpdaters.get(i).accept(configResults.get(i)); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }.execute(); + } } diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java b/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java index af5a86259e..8b189bf1c1 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java @@ -6,6 +6,7 @@ package com.fr.design.cell.editor; import com.fr.base.BaseFormula; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.formula.FormulaFactory; +import com.fr.design.formula.FunctionConstants; import com.fr.design.formula.UIFormula; import com.fr.design.mainframe.ElementCasePane; import com.fr.grid.Grid; @@ -27,6 +28,7 @@ public class FormulaCellEditor extends com.fr.design.cell.editor.AbstractCellEdi */ public FormulaCellEditor(ElementCasePane ePane) { super(ePane); + SwingUtilities.invokeLater(() -> FunctionConstants.PLUGIN.getGroupName()); } /** From b34b5e24ad2d9904131f267159eab2935fa7337e Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Tue, 3 Dec 2024 19:28:54 +0800 Subject: [PATCH 2/7] =?UTF-8?q?REPORT-141296=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?UI=E6=93=8D=E4=BD=9C=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/file/PreferencePane.java | 16 ++++++++++++++-- .../com/fr/design/mainframe/DesignerFrame.java | 16 ++++++++-------- .../main/java/com/fr/design/ui/util/UIUtil.java | 12 +++++++----- 3 files changed, 29 insertions(+), 15 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 6852392791..665bb518b9 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 @@ -952,6 +952,11 @@ public class PreferencePane extends BasicPane { previewResolutionBtnM.setEnabled(enabled); // 设计器启动选项-延迟启动云端运维模块 this.cloudAnalyticsDelayCheckBox.setSelected(designerEnvManager.isCloudAnalyticsDelay()); + // 异步加载高级配置 + loadAdvanceConfigAsync(); + } + + private void loadAdvanceConfigAsync() { List> advanceConfigLoaders = Arrays.asList( GcConfig.getInstance()::isGcEnable, ServerPreferenceConfig.getInstance()::isUseUniverseDBM, @@ -973,7 +978,9 @@ public class PreferencePane extends BasicPane { VcsConfigManager vcsConfigManager = designerEnvManager.getVcsConfigManager(); //如果是集群并且是老版本则不可用 if (VcsHelper.getInstance().isLegacyMode() && WorkContext.getCurrent().isCluster()) { + // 保存自动生成版本 vcsEnableCheckBox.setEnabled(false); + // 模板版本控制存储优化 gcEnableCheckBox.setEnabled(false); } if (VcsHelper.getInstance().needInit()) { @@ -982,6 +989,8 @@ public class PreferencePane extends BasicPane { vcsEnableCheckBox.setEnabled(false); vcsEnableCheckBox.setSelected(false); } + autoSaveIntervalEditor.setValue(vcsConfigManager.getAutoSaveInterval()); + //版本管理-存储与清理机制 if (!vcsEnableCheckBox.isSelected()) { saveCommitCheckBox.setEnabled(false); saveIntervalEditor.setEnabled(false); @@ -990,7 +999,11 @@ public class PreferencePane extends BasicPane { saveIntervalEditor.setValue(vcsConfigManager.getSaveInterval()); saveCommitCheckBox.setSelected(vcsConfigManager.isSaveCommit()); useIntervalCheckBox.setSelected(vcsConfigManager.isUseInterval()); - //版本管理-存储与清理机制 + // 异步加载版本管理配置 + loadVersionControlConfigsAsync(); + } + + private void loadVersionControlConfigsAsync() { List> vcsConfigLoaders = Arrays.asList( VcsConfig.getInstance()::isUseV2AutoClean, VcsConfig.getInstance()::getV2CleanInterval, @@ -1002,7 +1015,6 @@ public class PreferencePane extends BasicPane { v2RetainInterval -> autoCleanRetainIntervalComboBox.setSelectedIndex(getIndex((Integer) v2RetainInterval)) ); UIUtil.loadConfigsAndUpdateUI(vcsConfigLoaders, vcsConfigUpdaters); - autoSaveIntervalEditor.setValue(vcsConfigManager.getAutoSaveInterval()); } private void updateGcConfigUI(Boolean gcEnable) { 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 aa80150da0..8d71ae353f 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 @@ -686,18 +686,18 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * 设置标题 */ public void setTitle() { - StringBuilder defaultTitleSB = buildDefaultTitle(); + StringBuilder defaultTitle = buildDefaultTitle(); JTemplate editingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); // 当前模板是否为有效模板 if (JTemplate.isValid(editingTemplate)) { String path = editingTemplate.getPath(); UIUtil.executeAsyncTaskAndUpdateUI(() -> editingTemplate.getEditingFILE().exists(), exists -> { String finalPath = buildFinalPath(path, exists, editingTemplate); - defaultTitleSB.append(" ").append(finalPath); - setTitle(defaultTitleSB.toString()); + defaultTitle.append(" ").append(finalPath); + setTitle(defaultTitle.toString()); }); } else { - setTitle(defaultTitleSB.toString()); + setTitle(defaultTitle.toString()); } } @@ -712,14 +712,14 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } private StringBuilder buildDefaultTitle() { - StringBuilder defaultTitleSB = new StringBuilder(); - defaultTitleSB.append(ProductConstants.APP_NAME).append(" ").append(GeneralUtils.getVersion()).append(" ").append(ProductConstants.BRANCH).append(" "); + StringBuilder defaultTitle = new StringBuilder(); + defaultTitle.append(ProductConstants.APP_NAME).append(" ").append(GeneralUtils.getVersion()).append(" ").append(ProductConstants.BRANCH).append(" "); // james:标识登录的用户和登录的ENV String envName = DesignerEnvManager.getEnvManager().getCurEnvName(); String username = getCurrentUsername(envName); // 拼接用户名、环境名以及工作环境描述 - defaultTitleSB.append(username).append("@").append(envName).append("[").append(WorkContext.getCurrent().getDescription()).append("]"); - return defaultTitleSB; + defaultTitle.append(username).append("@").append(envName).append("[").append(WorkContext.getCurrent().getDescription()).append("]"); + return defaultTitle; } private String getCurrentUsername(String envName) { diff --git a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java index 12ad87fca6..b3dd08f90b 100644 --- a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java +++ b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java @@ -5,6 +5,7 @@ import com.fr.third.guava.base.Stopwatch; import com.fr.third.guava.base.Supplier; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; @@ -113,19 +114,20 @@ public class UIUtil { try { T result = get(); uiUpdater.accept(result); - } catch (Exception e) { - throw new RuntimeException(e); + } catch (InterruptedException | ExecutionException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } }.execute(); } /** - * 异步加载配置并在加载完成后更新 UI。 + * 异步加载配置并更新UI * * @param 配置对象的类型 * @param configLoaders 配置加载器列表,每个加载器负责加载一种配置 * @param uiUpdaters UI 更新器列表,每个更新器负责在 UI 上显示对应配置的值 + * 加载的过程是异步的,UI更新会在任务完成后执行。配置加载是顺序进行的,即一个配置加载完成后,才会加载下一个配置。 */ public static void loadConfigsAndUpdateUI(List> configLoaders, List> uiUpdaters) { new SwingWorker, Void>() { @@ -144,8 +146,8 @@ public class UIUtil { for (int i = 0; i < configResults.size(); i++) { uiUpdaters.get(i).accept(configResults.get(i)); } - } catch (Exception e) { - throw new RuntimeException(e); + } catch (InterruptedException | ExecutionException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } }.execute(); From e4f175b3d01f839c49cca78e0f97fa0ba388db20 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Wed, 4 Dec 2024 12:00:39 +0800 Subject: [PATCH 3/7] =?UTF-8?q?REPORT-141296=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?UI=E6=93=8D=E4=BD=9C=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/ui/util/UIUtil.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java index b3dd08f90b..eca35f0e71 100644 --- a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java +++ b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java @@ -122,12 +122,20 @@ public class UIUtil { } /** - * 异步加载配置并更新UI + * 异步加载多个配置并更新UI,每个配置加载的时间通常较短,约几十毫秒。 * * @param 配置对象的类型 * @param configLoaders 配置加载器列表,每个加载器负责加载一种配置 * @param uiUpdaters UI 更新器列表,每个更新器负责在 UI 上显示对应配置的值 - * 加载的过程是异步的,UI更新会在任务完成后执行。配置加载是顺序进行的,即一个配置加载完成后,才会加载下一个配置。 + * + *

+ * 加载过程是异步的,配置加载是顺序进行的,即一个配置加载完成后,才会加载下一个配置。 + * 配置加载任务会在后台线程中顺序执行,所有配置加载完成后,UI更新操作才会依次执行。 + *

+ * 异常模式: + * - 如果在加载某个配置时发生异常,整个任务会失败,后续的配置加载将不会继续执行。 + * - 异常会被捕获为 `ExecutionException` 或 `InterruptedException`,并在 `done()` 方法中记录日志。 + * - 配置加载过程中出现的错误会导致UI更新操作被跳过。 */ public static void loadConfigsAndUpdateUI(List> configLoaders, List> uiUpdaters) { new SwingWorker, Void>() { From 43631fb3f2e268574c5558d793e55d2d96364c6f Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Wed, 4 Dec 2024 17:27:26 +0800 Subject: [PATCH 4/7] =?UTF-8?q?REPORT-141296=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?UI=E6=93=8D=E4=BD=9C=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/PreferenceAction.java | 6 +-- .../design/actions/file/PreferencePane.java | 37 ++++++++----------- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java index 5d716b0287..4ad36b0f34 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java @@ -32,10 +32,10 @@ public class PreferenceAction extends UpdateAction { public void actionPerformed(ActionEvent e) { final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); final PreferencePane preferencePane = new PreferencePane(); - // 将当前环境配置填充到PreferencePane中 - preferencePane.populate(DesignerEnvManager.getEnvManager()); - BasicDialog basicDialog = preferencePane.showWindow(designerFrame); + basicDialog.setButtonEnabled(false); + // 将当前环境配置填充到PreferencePane中 + preferencePane.populate(basicDialog, DesignerEnvManager.getEnvManager()); basicDialog.addDialogActionListener(new DialogActionAdapter() { public void doOk() { preferencePane.update(DesignerEnvManager.getEnvManager()); 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 665bb518b9..049d0d69a8 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 @@ -870,7 +870,7 @@ public class PreferencePane extends BasicPane { * * @param designerEnvManager 设计器环境管理器 */ - public void populate(DesignerEnvManager designerEnvManager) { + public void populate(BasicDialog basicDialog, DesignerEnvManager designerEnvManager) { if (designerEnvManager == null) { return; } @@ -880,6 +880,8 @@ public class PreferencePane extends BasicPane { loadVersionControlSettings(designerEnvManager); // 高级 loadAdvanceSettings(designerEnvManager); + // 异步加载配置后启用面板确认按钮 + loadConfigsAsync(basicDialog); } /** @@ -952,20 +954,26 @@ public class PreferencePane extends BasicPane { previewResolutionBtnM.setEnabled(enabled); // 设计器启动选项-延迟启动云端运维模块 this.cloudAnalyticsDelayCheckBox.setSelected(designerEnvManager.isCloudAnalyticsDelay()); - // 异步加载高级配置 - loadAdvanceConfigAsync(); } - private void loadAdvanceConfigAsync() { + private void loadConfigsAsync(BasicDialog dialog) { List> advanceConfigLoaders = Arrays.asList( GcConfig.getInstance()::isGcEnable, ServerPreferenceConfig.getInstance()::isUseUniverseDBM, - ReportConfigManager.getProviderInstance()::getImageExportAttr + ReportConfigManager.getProviderInstance()::getImageExportAttr, + VcsConfig.getInstance()::isUseV2AutoClean, + VcsConfig.getInstance()::getV2CleanInterval, + VcsConfig.getInstance()::getV2RetainInterval, + () -> null ); List> advanceConfigUpdaters = Arrays.asList( gcEnable -> updateGcConfigUI((Boolean) gcEnable), useUniverseDBM -> useUniverseDBMCheckbox.setSelected((Boolean) useUniverseDBM), - imageExportAttr -> updateImageExportUI((ImageExportAttr) imageExportAttr) + imageExportAttr -> updateImageExportUI((ImageExportAttr) imageExportAttr), + useV2AutoClean -> useVcsAutoCleanScheduleCheckBox.setSelected(true), + v2CleanInterval -> autoCleanIntervalComboBox.setSelectedIndex(getIndex((Integer) v2CleanInterval)), + v2RetainInterval -> autoCleanRetainIntervalComboBox.setSelectedIndex(getIndex((Integer) v2RetainInterval)), + obj -> dialog.setButtonEnabled(true) ); UIUtil.loadConfigsAndUpdateUI(advanceConfigLoaders, advanceConfigUpdaters); } @@ -989,6 +997,7 @@ public class PreferencePane extends BasicPane { vcsEnableCheckBox.setEnabled(false); vcsEnableCheckBox.setSelected(false); } + useVcsAutoSaveScheduleCheckBox.setSelected(vcsConfigManager.isUseAutoSave()); autoSaveIntervalEditor.setValue(vcsConfigManager.getAutoSaveInterval()); //版本管理-存储与清理机制 if (!vcsEnableCheckBox.isSelected()) { @@ -999,22 +1008,6 @@ public class PreferencePane extends BasicPane { saveIntervalEditor.setValue(vcsConfigManager.getSaveInterval()); saveCommitCheckBox.setSelected(vcsConfigManager.isSaveCommit()); useIntervalCheckBox.setSelected(vcsConfigManager.isUseInterval()); - // 异步加载版本管理配置 - loadVersionControlConfigsAsync(); - } - - private void loadVersionControlConfigsAsync() { - List> vcsConfigLoaders = Arrays.asList( - VcsConfig.getInstance()::isUseV2AutoClean, - VcsConfig.getInstance()::getV2CleanInterval, - VcsConfig.getInstance()::getV2RetainInterval - ); - List> vcsConfigUpdaters = Arrays.asList( - useV2AutoClean -> useVcsAutoSaveScheduleCheckBox.setSelected((Boolean) useV2AutoClean), - v2CleanInterval -> autoCleanIntervalComboBox.setSelectedIndex(getIndex((Integer) v2CleanInterval)), - v2RetainInterval -> autoCleanRetainIntervalComboBox.setSelectedIndex(getIndex((Integer) v2RetainInterval)) - ); - UIUtil.loadConfigsAndUpdateUI(vcsConfigLoaders, vcsConfigUpdaters); } private void updateGcConfigUI(Boolean gcEnable) { From f17394892f408922dddae0389d3a3cf76d778b71 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Wed, 4 Dec 2024 20:27:39 +0800 Subject: [PATCH 5/7] =?UTF-8?q?REPORT-141296=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?UI=E6=93=8D=E4=BD=9C=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java index eca35f0e71..64e17e5710 100644 --- a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java +++ b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java @@ -115,7 +115,7 @@ public class UIUtil { T result = get(); uiUpdater.accept(result); } catch (InterruptedException | ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().debug(e.getMessage(), e); } } }.execute(); @@ -155,7 +155,7 @@ public class UIUtil { uiUpdaters.get(i).accept(configResults.get(i)); } } catch (InterruptedException | ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().debug(e.getMessage(), e); } } }.execute(); From a7bef7e32ae19cfcdd5857fad27123f095853cd4 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Fri, 13 Dec 2024 17:05:09 +0800 Subject: [PATCH 6/7] =?UTF-8?q?REPORT-141296=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?UI=E6=93=8D=E4=BD=9C=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 3 +- .../design/actions/file/PreferenceAction.java | 1 - .../design/actions/file/PreferencePane.java | 61 +++++---- .../com/fr/design/formula/FormulaPane.java | 8 +- .../theme/TemplateThemeGridControlPane.java | 17 +-- .../java/com/fr/design/ui/util/UIUtil.java | 40 ------ .../env/SetupDataDesignerRemoteOperator.java | 117 ++++++++++++++++++ .../fanruan/boot/env/DesignEnvComponent.java | 2 +- .../SetupDataDesignerRemoteOperator.java | 51 -------- .../design/cell/editor/FormulaCellEditor.java | 6 +- 10 files changed, 169 insertions(+), 137 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java delete mode 100644 designer-realize/src/main/java/com/fanruan/config/SetupDataDesignerRemoteOperator.java 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 1ef14ad5ef..3c219d6f5e 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -240,7 +240,6 @@ public class EnvChangeEntrance { } private static void afterSwitch() { - TemplateTreePane.getInstance().refreshDockingView(); DesignModelAdapter model = DesignModelAdapter.getCurrentModelAdapter(); if (model != null) { model.envChanged(); @@ -515,7 +514,7 @@ public class EnvChangeEntrance { final EnvListPane envListPane = new EnvListPane(); final BasicDialog envListDialog = envListPane.showWindow(DesignerContext.getDesignerFrame()); dialog = envListDialog; - SwingUtilities.invokeLater(() -> envListPane.populateEnvManager(envName)); + envListPane.populateEnvManager(envName); envListDialog.addDialogActionListener(new DialogActionAdapter() { @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java index 4ad36b0f34..eb83ec7bea 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java @@ -33,7 +33,6 @@ public class PreferenceAction extends UpdateAction { final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); final PreferencePane preferencePane = new PreferencePane(); BasicDialog basicDialog = preferencePane.showWindow(designerFrame); - basicDialog.setButtonEnabled(false); // 将当前环境配置填充到PreferencePane中 preferencePane.populate(basicDialog, DesignerEnvManager.getEnvManager()); basicDialog.addDialogActionListener(new DialogActionAdapter() { 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 049d0d69a8..032f55a952 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 @@ -8,6 +8,7 @@ import com.fine.theme.utils.FineUIStyle; import com.fine.theme.utils.FineUIUtils; import com.fr.config.Configuration; import com.fr.config.ServerPreferenceConfig; +import com.fr.config.utils.SetupDataHelper; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.dialog.BasicDialog; @@ -46,6 +47,7 @@ import com.fr.design.ui.util.UIUtil; import com.fr.design.unit.UnitConvertUtil; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.widget.FRWidgetFactory; +import com.fr.env.SetupDataDesignerRemoteOperator; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; import com.fr.general.Inter; @@ -54,6 +56,7 @@ import com.fr.io.attr.ImageExportAttr; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.report.ReportConfigManager; +import com.fr.report.ReportConfigManagerProvider; import com.fr.stable.Constants; import com.fr.third.apache.logging.log4j.Level; import com.fr.third.guava.base.Supplier; @@ -69,7 +72,9 @@ import com.fr.workspace.server.vcs.VcsConfig; import com.fr.workspace.server.vcs.git.config.GcConfig; import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanSchedule; import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService; +import java.util.ArrayList; import java.util.Arrays; +import java.util.concurrent.CountDownLatch; import java.util.function.Consumer; import java.util.List; import org.jetbrains.annotations.NotNull; @@ -259,6 +264,14 @@ public class PreferencePane extends BasicPane { put(THREE_MONTH_INDEX, THREE_MONTH_INT); } }); + + private static final List CONFIG_NAMESPACES = Arrays.asList( + VcsConfig.getInstance().getNameSpace(), + ServerPreferenceConfig.getInstance().getNameSpace(), + GcConfig.getInstance().getNameSpace(), + new ReportConfigManager().getNameSpace() + ); + public PreferencePane() { this.initComponents(); } @@ -478,7 +491,7 @@ public class PreferencePane extends BasicPane { } private VcsMovePanel createMovePane(CardLayout cardLayout, JPanel parentPane) { - return new VcsMovePanel(cardLayout, parentPane, new VcsMovePanel.MoveCallBack(){ + return new VcsMovePanel(cardLayout, parentPane, new VcsMovePanel.MoveCallBack() { @Override public void doCallBack(boolean useV2) { saveIntervalPane.setVisible(useV2); @@ -491,7 +504,7 @@ public class PreferencePane extends BasicPane { useVcsAutoSaveScheduleCheckBox.setEnabled(useV2); } }, basicDialog); - }; + } private JPanel createAutoCleanPane() { Row autoCleanPane = new Row(); @@ -880,12 +893,13 @@ public class PreferencePane extends BasicPane { loadVersionControlSettings(designerEnvManager); // 高级 loadAdvanceSettings(designerEnvManager); - // 异步加载配置后启用面板确认按钮 + // 异步加载配置 loadConfigsAsync(basicDialog); } /** * 选项-常用 + * * @param designerEnvManager */ private void loadCommonSettings(DesignerEnvManager designerEnvManager) { @@ -921,6 +935,7 @@ public class PreferencePane extends BasicPane { /** * 高级 + * * @param designerEnvManager */ private void loadAdvanceSettings(DesignerEnvManager designerEnvManager) { @@ -957,29 +972,31 @@ public class PreferencePane extends BasicPane { } private void loadConfigsAsync(BasicDialog dialog) { - List> advanceConfigLoaders = Arrays.asList( - GcConfig.getInstance()::isGcEnable, - ServerPreferenceConfig.getInstance()::isUseUniverseDBM, - ReportConfigManager.getProviderInstance()::getImageExportAttr, - VcsConfig.getInstance()::isUseV2AutoClean, - VcsConfig.getInstance()::getV2CleanInterval, - VcsConfig.getInstance()::getV2RetainInterval, - () -> null - ); - List> advanceConfigUpdaters = Arrays.asList( - gcEnable -> updateGcConfigUI((Boolean) gcEnable), - useUniverseDBM -> useUniverseDBMCheckbox.setSelected((Boolean) useUniverseDBM), - imageExportAttr -> updateImageExportUI((ImageExportAttr) imageExportAttr), - useV2AutoClean -> useVcsAutoCleanScheduleCheckBox.setSelected(true), - v2CleanInterval -> autoCleanIntervalComboBox.setSelectedIndex(getIndex((Integer) v2CleanInterval)), - v2RetainInterval -> autoCleanRetainIntervalComboBox.setSelectedIndex(getIndex((Integer) v2RetainInterval)), - obj -> dialog.setButtonEnabled(true) - ); - UIUtil.loadConfigsAndUpdateUI(advanceConfigLoaders, advanceConfigUpdaters); + UIUtil.executeAsyncTaskAndUpdateUI(() -> { + dialog.setButtonEnabled(false); + if (!WorkContext.getCurrent().isLocal()) { + SetupDataDesignerRemoteOperator.getInstance().fetchBatchConfDatas(CONFIG_NAMESPACES); + } + return null; + }, + result -> { + populateConfigs(); + dialog.setButtonEnabled(true); + }); + } + + private void populateConfigs() { + updateGcConfigUI(GcConfig.getInstance().isGcEnable()); + useUniverseDBMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseUniverseDBM()); + updateImageExportUI(ReportConfigManager.getProviderInstance().getImageExportAttr()); + useVcsAutoCleanScheduleCheckBox.setSelected(VcsConfig.getInstance().isUseV2AutoClean()); + autoCleanIntervalComboBox.setSelectedIndex(getIndex(VcsConfig.getInstance().getV2CleanInterval())); + autoCleanRetainIntervalComboBox.setSelectedIndex(getIndex(VcsConfig.getInstance().getV2RetainInterval())); } /** * 选项-版本管理 + * * @param designerEnvManager */ private void loadVersionControlSettings(DesignerEnvManager designerEnvManager) { diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index aaf95bd765..44a761f060 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -48,6 +48,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.parameter.ParameterInputNoneListenerPane; import com.fr.design.parameter.ParameterInputPane; +import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.general.FArray; @@ -1074,7 +1075,10 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { functionTypeScrollPane.setBorder(FineBorderFactory.createWrappedRoundBorder()); functionTypeList.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); initTypeListCellRenderer(); - initGroupTypeModel(); + UIUtil.executeAsyncTaskAndUpdateUI(() -> { + FunctionConstants.PLUGIN.getGroupName(); + return null; + }, result -> initGroupTypeModel()); initTypeListSelectionListener(); return this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Function_Category"), functionTypeScrollPane); } @@ -1126,6 +1130,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { //hugh: 从函数分组插件中添加分组 FunctionConstants.addFunctionGroupFromPlugins(functionTypeListModel); + functionTypeList.setSelectedIndex(0); } private void initFunctionNameListCellRenderer() { @@ -1303,7 +1308,6 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private JPanel initFunctionPane() { JPanel functionTypePane = initFunctionTypeList(); JPanel functionNamePane = initFunctionNameList(); - functionTypeList.setSelectedIndex(0); return Layouts.row(LayoutConstants.HORIZONTAL_GAP, cell(functionTypePane).weight(1), cell(functionNamePane).weight(1) ).getComponent(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java index 57ba7ee9c9..f2101b944a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeGridControlPane.java @@ -19,16 +19,11 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog; import com.fr.design.menu.MenuDef; import com.fr.design.menu.ToolBarDef; -import com.fr.design.ui.util.UIUtil; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; -import com.fr.third.guava.base.Supplier; import com.fr.third.javax.annotation.Nullable; import com.fr.transaction.CallBackAdaptor; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; @@ -216,15 +211,9 @@ public class TemplateThemeGridControlPane extends Basic MenuDef menuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); menuDef.setIcon(new LazyIcon("add_popup")); menuDef.setRePaint(true); - List> configLoaders = Arrays.asList( - config::getDefaultLightThemeName, - config::getDefaultDarkThemeName - ); - List> configUpdaters = Arrays.asList( - lightThemeName -> menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Light_Theme"), lightThemeName)), - darkThemeName -> menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Dark_Theme"), darkThemeName)) - ); - UIUtil.loadConfigsAndUpdateUI(configLoaders, configUpdaters); + menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Light_Theme"), config.getDefaultLightThemeName())); + menuDef.addShortCut(new AddThemeAction(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Manager_Pane_Create_Dark_Theme"), config.getDefaultDarkThemeName())); + return menuDef; } diff --git a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java index 64e17e5710..b7f23374ff 100644 --- a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java +++ b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java @@ -120,44 +120,4 @@ public class UIUtil { } }.execute(); } - - /** - * 异步加载多个配置并更新UI,每个配置加载的时间通常较短,约几十毫秒。 - * - * @param 配置对象的类型 - * @param configLoaders 配置加载器列表,每个加载器负责加载一种配置 - * @param uiUpdaters UI 更新器列表,每个更新器负责在 UI 上显示对应配置的值 - * - *

- * 加载过程是异步的,配置加载是顺序进行的,即一个配置加载完成后,才会加载下一个配置。 - * 配置加载任务会在后台线程中顺序执行,所有配置加载完成后,UI更新操作才会依次执行。 - *

- * 异常模式: - * - 如果在加载某个配置时发生异常,整个任务会失败,后续的配置加载将不会继续执行。 - * - 异常会被捕获为 `ExecutionException` 或 `InterruptedException`,并在 `done()` 方法中记录日志。 - * - 配置加载过程中出现的错误会导致UI更新操作被跳过。 - */ - public static void loadConfigsAndUpdateUI(List> configLoaders, List> uiUpdaters) { - new SwingWorker, Void>() { - @Override - protected List doInBackground() throws Exception { - List results = new ArrayList<>(); - for (Supplier configLoader : configLoaders) { - results.add(configLoader.get()); - } - return results; - } - @Override - protected void done() { - try { - List configResults = get(); - for (int i = 0; i < configResults.size(); i++) { - uiUpdaters.get(i).accept(configResults.get(i)); - } - } catch (InterruptedException | ExecutionException e) { - FineLoggerFactory.getLogger().debug(e.getMessage(), e); - } - } - }.execute(); - } } diff --git a/designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java b/designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java new file mode 100644 index 0000000000..11bcc94ebe --- /dev/null +++ b/designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java @@ -0,0 +1,117 @@ +package com.fr.env; + +import com.fanruan.repository.ConfigRepository; +import com.fr.config.dao.DaoContext; +import com.fr.config.dao.impl.remote.RemoteConfigOperable; +import com.fr.config.utils.ConfData; +import com.fr.config.utils.ConfigReadUtils; +import com.fr.config.utils.PrefixHandler; +import com.fr.config.utils.SetupDataOperator; +import com.fr.nx.app.web.out.widget.utils.CollectionUtils; +import com.fr.stable.StringUtils; +import com.fr.tenant.context.TenantContext; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static com.sun.org.apache.xalan.internal.xsltc.compiler.Constants.STRING; + +/** + * 设计器远程下获取Updata的操作类 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/10/14 + */ +public class SetupDataDesignerRemoteOperator implements SetupDataOperator { + + private static final SetupDataDesignerRemoteOperator INSTANCE = new SetupDataDesignerRemoteOperator(); + + private static final String EMPTY_STRING = ""; + + /** + * 单例 + */ + public static SetupDataDesignerRemoteOperator getInstance() { + return INSTANCE; + } + + /** + * 批量拉取配置 + * @param nameSpaces + */ + public void fetchBatchConfDatas(List nameSpaces) { + if(nameSpaces.isEmpty()){ + return; + } + List namespaceList = nameSpaces.stream() + .filter(namespace -> !checkRemoteConfigCacheExistence(namespace)) + .collect(Collectors.toList()); + if(CollectionUtils.isEmpty(namespaceList)){ + return; + } + ConfigRepository.getInstance().batchGetConfigsByConfigsCache(namespaceList, () -> { + batchSaveConfigs(namespaceList, TenantContext.getCurrentWithException().getId()); + return null; + }); + } + + private void batchSaveConfigs(List nameSpaces, String tenantId) { + nameSpaces.forEach(namespace -> { + String prefix = PrefixHandler.concatPrefix(namespace, EMPTY_STRING); + ConfigReadUtils.getData(prefix, tenantId); + ConfigReadUtils.getClassInfo(prefix, tenantId); + }); + } + + @Override + public ConfData getData(String prefix, String tenantId) { + String configNamespace = getConfigNameSpace(prefix); + if (checkRemoteConfigCacheExistence(configNamespace)) { + return createConfData(prefix, tenantId); + } + return ConfigRepository.getInstance().getConfigByConfigsCache(configNamespace, () -> createConfData(prefix, tenantId)); + } + + private ConfData createConfData(String prefix, String tenantId) { + ConfData data = new ConfData(); + data.setDataMap(ConfigReadUtils.getData(prefix, tenantId)); + data.setMap(ConfigReadUtils.getClassInfo(prefix, tenantId)); + return data; + } + + private String getConfigNameSpace(String id) { + + if (StringUtils.isEmpty(id)) { + throw new IllegalArgumentException("id cannot be null"); + } + int length = id.length(); + for (int i = 0; i < length; i++) { + if (PrefixHandler.SEPERATOR == id.charAt(i)) { + return id.substring(0, i); + } + } + throw new IllegalArgumentException("cannot resolve namespace of " + id); + } + + /** + * 检查远程配置缓存是否存在 + *

+ * 该方法通过判断三个远程配置相关的DAO(EntityDao、XmlEntityDao、ClassHelperDao)是否在缓存中存在指定的命名空间。 + * 如果DAO实现了RemoteConfigOperable接口,则会依次检查缓存。 + * 如果DAO不支持远程缓存检查,返回false。 + * + * @param nameSpace 命名空间 + * @return 如果三个远程DAO的缓存中都存在指定命名空间的数据,返回true;否则返回false + */ + private boolean checkRemoteConfigCacheExistence(String nameSpace) { + // 只判断一次,所有远程的Dao都实现了RemoteConfigOperable接口 + if (DaoContext.getEntityDao() instanceof RemoteConfigOperable) { + return ((RemoteConfigOperable) DaoContext.getEntityDao()).checkCacheExistence(nameSpace) && + ((RemoteConfigOperable) DaoContext.getXmlEntityDao()).checkCacheExistence(nameSpace) && + ((RemoteConfigOperable) DaoContext.getClassHelperDao()).checkCacheExistence(nameSpace); + } + // 非远程配置不支持设计器缓存检查,返回false + return false; + } +} diff --git a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java index 2612cdfae9..04612be802 100644 --- a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java +++ b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java @@ -12,7 +12,7 @@ import com.fanruan.carina.annotions.Stop; import com.fanruan.carina.annotions.Supplemental; import com.fanruan.config.ConfigProviderFactory; import com.fanruan.config.LocalConfigSource; -import com.fanruan.config.SetupDataDesignerRemoteOperator; +import com.fr.env.SetupDataDesignerRemoteOperator; import com.fanruan.config.realm.ConfigRealm; import com.fanruan.dao.context.DBContextProvider; import com.fanruan.dao.context.DBContextStarter; diff --git a/designer-realize/src/main/java/com/fanruan/config/SetupDataDesignerRemoteOperator.java b/designer-realize/src/main/java/com/fanruan/config/SetupDataDesignerRemoteOperator.java deleted file mode 100644 index bf5193c2ae..0000000000 --- a/designer-realize/src/main/java/com/fanruan/config/SetupDataDesignerRemoteOperator.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.fanruan.config; - -import com.fanruan.repository.ConfigRepository; -import com.fr.config.utils.ConfData; -import com.fr.config.utils.ConfigReadUtils; -import com.fr.config.utils.PrefixHandler; -import com.fr.config.utils.SetupDataOperator; -import com.fr.stable.StringUtils; - -/** - * 设计器远程下获取Updata的操作类 - * - * @author Destiny.Lin - * @since 11.0 - * Created on 2024/10/14 - */ -public class SetupDataDesignerRemoteOperator implements SetupDataOperator { - - private static final SetupDataDesignerRemoteOperator INSTANCE = new SetupDataDesignerRemoteOperator(); - - /** - * 单例 - */ - public static SetupDataDesignerRemoteOperator getInstance() { - return INSTANCE; - } - - @Override - public ConfData getData(String prefix, String tenantId) { - return ConfigRepository.getInstance().getConfigByConfigsCache(getConfigNameSpace(prefix), () -> { - ConfData data = new ConfData(); - data.setDataMap(ConfigReadUtils.getData(prefix, tenantId)); - data.setMap(ConfigReadUtils.getClassInfo(prefix, tenantId)); - return data; - }); - } - - private String getConfigNameSpace(String id) { - - if (StringUtils.isEmpty(id)) { - throw new IllegalArgumentException("id cannot be null"); - } - int length = id.length(); - for (int i = 0; i < length; i++) { - if (PrefixHandler.SEPERATOR == id.charAt(i)) { - return id.substring(0, i); - } - } - throw new IllegalArgumentException("cannot resolve namespace of " + id); - } -} diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java b/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java index 8b189bf1c1..012dd5d41e 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/FormulaCellEditor.java @@ -6,7 +6,6 @@ package com.fr.design.cell.editor; import com.fr.base.BaseFormula; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.formula.FormulaFactory; -import com.fr.design.formula.FunctionConstants; import com.fr.design.formula.UIFormula; import com.fr.design.mainframe.ElementCasePane; import com.fr.grid.Grid; @@ -23,12 +22,11 @@ public class FormulaCellEditor extends com.fr.design.cell.editor.AbstractCellEdi private UIFormula formulaEditorPane = null; - /** + /** * Constructor. */ public FormulaCellEditor(ElementCasePane ePane) { - super(ePane); - SwingUtilities.invokeLater(() -> FunctionConstants.PLUGIN.getGroupName()); + super(ePane); } /** From 03096799a83d0e5264c3370a07ed16bf8f6438f3 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Fri, 13 Dec 2024 18:04:48 +0800 Subject: [PATCH 7/7] =?UTF-8?q?REPORT-141296=20=E6=96=B9=E6=B3=95=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/env/SetupDataDesignerRemoteOperator.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java b/designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java index 11bcc94ebe..c0b8161fb4 100644 --- a/designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java +++ b/designer-base/src/main/java/com/fr/env/SetupDataDesignerRemoteOperator.java @@ -2,7 +2,7 @@ package com.fr.env; import com.fanruan.repository.ConfigRepository; import com.fr.config.dao.DaoContext; -import com.fr.config.dao.impl.remote.RemoteConfigOperable; +import com.fr.config.dao.impl.remote.RemoteConfigValidator; import com.fr.config.utils.ConfData; import com.fr.config.utils.ConfigReadUtils; import com.fr.config.utils.PrefixHandler; @@ -10,11 +10,9 @@ import com.fr.config.utils.SetupDataOperator; import com.fr.nx.app.web.out.widget.utils.CollectionUtils; import com.fr.stable.StringUtils; import com.fr.tenant.context.TenantContext; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import static com.sun.org.apache.xalan.internal.xsltc.compiler.Constants.STRING; /** * 设计器远程下获取Updata的操作类 @@ -105,11 +103,11 @@ public class SetupDataDesignerRemoteOperator implements SetupDataOperator { * @return 如果三个远程DAO的缓存中都存在指定命名空间的数据,返回true;否则返回false */ private boolean checkRemoteConfigCacheExistence(String nameSpace) { - // 只判断一次,所有远程的Dao都实现了RemoteConfigOperable接口 - if (DaoContext.getEntityDao() instanceof RemoteConfigOperable) { - return ((RemoteConfigOperable) DaoContext.getEntityDao()).checkCacheExistence(nameSpace) && - ((RemoteConfigOperable) DaoContext.getXmlEntityDao()).checkCacheExistence(nameSpace) && - ((RemoteConfigOperable) DaoContext.getClassHelperDao()).checkCacheExistence(nameSpace); + // 只判断一次,所有远程的Dao都实现了RemoteConfigValidator接口 + if (DaoContext.getEntityDao() instanceof RemoteConfigValidator) { + return ((RemoteConfigValidator) DaoContext.getEntityDao()).checkCacheValid(nameSpace) && + ((RemoteConfigValidator) DaoContext.getXmlEntityDao()).checkCacheValid(nameSpace) && + ((RemoteConfigValidator) DaoContext.getClassHelperDao()).checkCacheValid(nameSpace); } // 非远程配置不支持设计器缓存检查,返回false return false;