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 661d5f05ed..d38def2836 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -1,6 +1,7 @@ package com.fr.design; import com.fr.common.report.ReportState; +import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard; import com.fr.design.plugin.remind.PluginErrorDesignReminder; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicDialog; @@ -150,6 +151,8 @@ public class EnvChangeEntrance { model.envChanged(); } NotificationCenter.getInstance().clearAllNotifications(); + //切换环境后,清空粘贴板里面的内容 + TemplateTreeClipboard.getInstance().reset(); return true; } 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 c38a015107..c92291cdb2 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 @@ -238,10 +238,10 @@ public class RenameAction extends UpdateAction { private void confirmClose() { if (TemplateUtils.checkSelectedTemplateIsEditing()) { - if (FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), + if (FineJOptionPane.showConfirmDialog(this, Toolkit.i18nText("Fine-Design_Basic_Template_Is_Editing"), Toolkit.i18nText("Fine-Design_Basic_Alert"), - YES_NO_OPTION) == JOptionPane.NO_OPTION) { + YES_NO_OPTION) != JOptionPane.YES_OPTION) { return; } } diff --git a/designer-base/src/main/java/com/fr/design/deeplink/DeepLinkCore.java b/designer-base/src/main/java/com/fr/design/deeplink/DeepLinkCore.java index 8fed6e80dd..c9b80ebf72 100644 --- a/designer-base/src/main/java/com/fr/design/deeplink/DeepLinkCore.java +++ b/designer-base/src/main/java/com/fr/design/deeplink/DeepLinkCore.java @@ -43,6 +43,8 @@ public class DeepLinkCore { } private String pendingURL; + + private final List deepLinkPrepareList = new ArrayList<>(); private final List deepLinkList = new ArrayList<>(); @@ -51,6 +53,9 @@ public class DeepLinkCore { public void register(DeepLink deepLink) { if (deepLink != null) { deepLinkList.add(deepLink); + if (deepLink instanceof DeepLinkPrepare) { + deepLinkPrepareList.add((DeepLinkPrepare) deepLink); + } } } @@ -129,6 +134,11 @@ public class DeepLinkCore { private void acceptNewURL(String url) { this.pendingURL = url; + + UrlBean urlBean = UrlBean.create(this.pendingURL); + for (DeepLinkPrepare deepLinkPrepare : deepLinkPrepareList) { + deepLinkPrepare.prepare(urlBean.getUrl(), urlBean.getHost(), urlBean.getPath(), urlBean.getParams()); + } } private boolean canConsumePendingURL() { @@ -148,32 +158,11 @@ public class DeepLinkCore { } private void consumePendingURL() { - String host = null; - String path = null; - Map params = new HashMap<>(); - - URL url = null; - try { - url = new URL(null, this.pendingURL, new URLStreamHandler() { - @Override - protected URLConnection openConnection(URL u) throws IOException { - return null; - } - }); - } catch (MalformedURLException ignored) {} - - if (url != null) { - host = url.getHost(); - path = url.getPath(); - - List pairs = URLUtils.parse(url.getQuery()); - for (NameValuePair pair: pairs) { - params.put(pair.getName(), pair.getValue()); - } - } - + + UrlBean urlBean = UrlBean.create(this.pendingURL); + FineLoggerFactory.getLogger().info("consume deep link: " + this.pendingURL); - performDeepLinks(this.pendingURL, host, path, params); + performDeepLinks(urlBean.getUrl(), urlBean.getHost(), urlBean.getPath(), urlBean.getParams()); markPendingURLConsumed(); } @@ -194,4 +183,67 @@ public class DeepLinkCore { private void markPendingURLConsumed() { this.pendingURL = null; } + + private static class UrlBean { + + private String url; + + private String host; + + private String path; + + private Map params; + + public UrlBean(String url, String host, String path, Map params) { + this.url = url; + this.host = host; + this.path = path; + this.params = params; + } + + public String getUrl() { + return url; + } + + public String getHost() { + return host; + } + + public String getPath() { + return path; + } + + public Map getParams() { + return params; + } + + public static UrlBean create(String pendingUrl) { + + String host = null; + String path = null; + Map params = new HashMap<>(); + + URL url = null; + try { + url = new URL(null, pendingUrl, new URLStreamHandler() { + @Override + protected URLConnection openConnection(URL u) throws IOException { + return null; + } + }); + } catch (MalformedURLException ignored) { + } + + if (url != null) { + host = url.getHost(); + path = url.getPath(); + + List pairs = URLUtils.parse(url.getQuery()); + for (NameValuePair pair : pairs) { + params.put(pair.getName(), pair.getValue()); + } + } + return new UrlBean(pendingUrl, host, path, params); + } + } } diff --git a/designer-base/src/main/java/com/fr/design/deeplink/DeepLinkPrepare.java b/designer-base/src/main/java/com/fr/design/deeplink/DeepLinkPrepare.java new file mode 100644 index 0000000000..e74d99d8b7 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/deeplink/DeepLinkPrepare.java @@ -0,0 +1,17 @@ +package com.fr.design.deeplink; + +import java.util.Map; + +/** + * created by Harrison on 2022/08/23 + **/ +public interface DeepLinkPrepare { + + /** + * 准备 + * + * @param url 链接 + * @return 成功/失败 + */ + boolean prepare(String url, String host, String path, Map params); +} diff --git a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java b/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java index d412fb682d..3e41750585 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java +++ b/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java @@ -22,7 +22,12 @@ import static com.fr.design.utils.LinkStrUtils.LABEL; * Created by hades on 2020/10/23 */ public class MessageWithLink extends JEditorPane { - + + private static final String HTML_BODY = " 的话,将会自动点击匹配 url @@ -69,6 +74,34 @@ public class MessageWithLink extends JEditorPane { this(frontMessage, linkName, link, backMessage, color, font, LABEL.getForeground()); } + public MessageWithLink(String htmlText, Font font) { + this(setHtmlFont(htmlText, font)); + } + + + + /** + * 将指定的字体赋给html文本 + * 任何失败,返回原html文本 + * */ + private static String setHtmlFont(String htmlText, Font font) { + + try { + int bodyIndex = htmlText.indexOf(HTML_BODY); + StringBuilder sb = new StringBuilder(); + String left = htmlText.substring(0, bodyIndex + HTML_BODY.length()); + String right = htmlText.substring(bodyIndex + HTML_BODY.length()); + sb.append(left); + sb.append(String.format(HTML_STYLE_FORMAT, LinkStrUtils.generateStyle(Color.WHITE, font, Color.BLACK))); + sb.append(right); + return sb.toString(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e, e.getMessage()); + } + + return htmlText; + } + public MessageWithLink(String frontMessage, String linkName, String link, String backMessage, Color backgroundColor, Font font, Color fontColor) { super("text/html", "" + frontMessage + "" + linkName + "" + backMessage + ""); diff --git a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java index 383d5993bd..3a8af493f8 100644 --- a/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java +++ b/designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java @@ -24,6 +24,7 @@ import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.collections.CollectionUtils; @@ -217,7 +218,8 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi return false; } //确定目标目录并检查权限 - if (getDirTree().getSelectionCount() != 0 && !TemplateDirTreePane.getInstance().selectedAccess()) { + FileOperations selectedOperation = DesignerFrameFileDealerPane.getInstance().getSelectedOperation(); + if (!selectedOperation.access()) { FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied"), Toolkit.i18nText("Fine-Design_Basic_Alert"), @@ -243,7 +245,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi if (pasteNodes.isEmpty()) { //提示:复制的文件都不能黏贴 FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Unable_Delete_Locked_File"), + Toolkit.i18nText("Fine-Design_Basic_Confirm_Paste_Unlock_File"), Toolkit.i18nText("Fine-Design_Basic_Alert"), WARNING_MESSAGE); return; @@ -507,6 +509,10 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi private void copyDir(String sourceDir, String targetDir) { FileNode[] fileNodes = getFileTree().listFile(sourceDir); + if (ArrayUtils.isEmpty(fileNodes)) { + //空目录:相当于新建一个目录 + DesignerFrameFileDealerPane.getInstance().getSelectedOperation().mkdir(targetDir); + } for (FileNode fileNode : fileNodes) { if (fileNode.isDirectory()) { copyDir(StableUtils.pathJoin(fileNode.getParent(), fileNode.getName()), StableUtils.pathJoin(targetDir, fileNode.getName())); @@ -519,7 +525,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi //检查源文件是不是还存在 if (!WorkContext.getWorkResource().exist(sourcePath)) { FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Source_File_Not_Exist"), + Toolkit.i18nText("Fine-Design_Basic_Source_File_Not_Exist", sourcePath), Toolkit.i18nText("Fine-Design_Basic_Alert"), WARNING_MESSAGE); } else { 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 1e25ddb3d2..aabb6ef751 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 @@ -15,6 +15,7 @@ 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.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; @@ -258,6 +259,11 @@ public class MutilTempalteTabPane extends JComponent { @Override public void actionPerformed(ActionEvent e) { + //处于搜索模式时,先退出搜索模式,再定位 + if (TemplateTreeSearchManager.getInstance().isInSearchMode()) { + TemplateTreeSearchManager.getInstance().outOfSearchMode(); + TemplateTreePane.getInstance().refreshDockingView(); + } JTemplate template = openedTemplate.get(this.tplIndex); super.gotoEditingTemplateLeaf(template.getPath()); } @@ -287,7 +293,7 @@ public class MutilTempalteTabPane extends JComponent { JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); closeTemplate(templates, currentTemplate); - if (currentTemplate == null) { + if (option == CloseOption.All) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); } else { DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); 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 d0d2eece5c..c2a2a9c600 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 @@ -207,6 +207,16 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt selectedOperation.refresh(); } + /** + * 刷新根目录并退出搜索模式 + */ + public void refreshAndOutOfSearch() { + if (TemplateTreeSearchManager.getInstance().isInSearchMode()) { + TemplateTreeSearchManager.getInstance().outOfSearchMode(); + } + refresh(); + } + private JPanel createUpToolBarPane() { JPanel panel = new JPanel(new BorderLayout()); panel.add(toolBar, BorderLayout.CENTER); 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 29cfcadbb5..a445621146 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 @@ -1787,7 +1787,7 @@ public abstract class JTemplate> HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().template.getTemplateID())) { refreshToolArea(); } - DesignerFrameFileDealerPane.getInstance().refresh(); + DesignerFrameFileDealerPane.getInstance().refreshAndOutOfSearch(); DesignerFrameFileDealerPane.getInstance().stateChange(); } }); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateDirSearchRemindPane.java b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateDirSearchRemindPane.java index 5c0dbc65a1..9feefcb510 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateDirSearchRemindPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/manager/search/searcher/control/pane/TemplateDirSearchRemindPane.java @@ -99,18 +99,17 @@ public class TemplateDirSearchRemindPane extends JPanel implements TreeSearchSta scrollPane = new UIScrollPane(templateFileTree); scrollPane.setBorder(null); - notFoundPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5); + notFoundPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.CENTER, 0, 5); UILabel emptyPicLabel = new UILabel(); emptyPicLabel.setIcon(IconUtils.readIcon("com/fr/base/images/share/no_match_icon.png")); emptyPicLabel.setHorizontalAlignment(SwingConstants.CENTER); - emptyPicLabel.setPreferredSize(new Dimension(240, 100)); + emptyPicLabel.setPreferredSize(new Dimension(570, 100)); UILabel textLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Tree_Search_Not_Match"), SwingConstants.CENTER); textLabel.setForeground(Color.gray); textLabel.setHorizontalAlignment(SwingConstants.CENTER); - textLabel.setPreferredSize(new Dimension(240, 20)); + textLabel.setPreferredSize(new Dimension(570, 20)); notFoundPane.add(emptyPicLabel); notFoundPane.add(textLabel); - notFoundPane.setBorder(BorderFactory.createEmptyBorder(80, 0, 0, 0)); cardLayout = new CardLayout(); this.setLayout(cardLayout); diff --git a/designer-base/src/main/java/com/fr/design/utils/LinkStrUtils.java b/designer-base/src/main/java/com/fr/design/utils/LinkStrUtils.java index b7f8217b44..2bb245b449 100644 --- a/designer-base/src/main/java/com/fr/design/utils/LinkStrUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/LinkStrUtils.java @@ -42,6 +42,10 @@ public class LinkStrUtils { return "" + text + ""; } + + public static String generateLinkTagWithoutUnderLine(String link, String text) { + return "" + text + ""; + } public static String generateStyle(Color backgroundColor, Font font, Color fontColor) { diff --git a/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java b/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java index d8caf035d3..6afef4f3b6 100644 --- a/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java +++ b/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java @@ -12,6 +12,11 @@ public class DesignerStartupConfig implements XMLable { private static final DesignerStartupConfig INSTANCE = new DesignerStartupConfig(); + /** + * 加上版本,不然回滚到 1107 会有兼容问题 + */ + private static final String TAG_ENABLED = "isEnabled1108"; + public static DesignerStartupConfig getInstance() { return INSTANCE; @@ -40,14 +45,14 @@ public class DesignerStartupConfig implements XMLable { @Override public void readXML(XMLableReader reader) { if (reader.isAttr()) { - this.setEnabled(reader.getAttrAsBoolean("isEnabled", true)); + this.setEnabled(reader.getAttrAsBoolean(TAG_ENABLED, true)); } } @Override public void writeXML(XMLPrintWriter writer) { writer.startTAG(XML_TAG); - writer.attr("isEnabled", this.isEnabled()); + writer.attr(TAG_ENABLED, this.isEnabled()); writer.end(); } diff --git a/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java b/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java index c78469b450..b42a6c65bd 100644 --- a/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java +++ b/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java @@ -20,6 +20,12 @@ import java.util.Iterator; **/ public class DesignerStartupContext { + /** + * 可以启动 + * 当遇到 mac 双击启动时,需要将这里置为 false, 见 {@link FileOpen4MacDeepLink} + */ + private boolean enabled = true; + /** * 启动参数 */ @@ -79,6 +85,14 @@ public class DesignerStartupContext { return StartupContextHolder.INSTANCE; } + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + private static class StartupContextHolder { private static final DesignerStartupContext INSTANCE = new DesignerStartupContext(); } @@ -103,7 +117,7 @@ public class DesignerStartupContext { /** * 展示启动页 - * 1. 判断当前的工作目录数量 + * 1. 判断当前的工作目录数量为空或者为1 * 2. 判断是否是 demo、还是打开目标文件 * 3. 功能是否开启 * @@ -111,10 +125,20 @@ public class DesignerStartupContext { */ public boolean isShowStartupPage() { + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + return !startupArgs.isDemo() && DesignerStartupUtil.convertArgs2FILE(startupArgs.get()) == null + // 见该 field 的注释 + && enabled + && isWorkspaceValid() + && envManager.isStartupPageEnabled(); + } + + private boolean isWorkspaceValid() { + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); Iterator envNameIterator = envManager.getEnvNameIterator(); ArrayList envs = Lists.newArrayList(envNameIterator); - return !startupArgs.isDemo() && DesignerStartupUtil.convertArgs2FILE(startupArgs.get()) == null && !envs.isEmpty() && envManager.isStartupPageEnabled(); + return !envs.isEmpty() && (envs.size() != 1); } /* 预热相关 */ @@ -128,7 +152,12 @@ public class DesignerStartupContext { String curEnvName = DesignerEnvManager.getEnvManager().getCurEnvName(); DesignerWorkspaceInfo workspaceInfo = DesignerEnvManager.getEnvManager().getWorkspaceInfo(curEnvName); - return workspaceInfo.getType() == DesignerWorkspaceType.Local; + boolean valid = false; + try { + valid = workspaceInfo.checkValid(); + } catch (Exception ignore) { + } + return workspaceInfo.getType() == DesignerWorkspaceType.Local && valid; } public void setStartupPageModel(StartupPageModel startupPageModel) { diff --git a/designer-realize/src/main/java/com/fr/design/deeplink/FileOpen4MacDeepLink.java b/designer-realize/src/main/java/com/fr/design/deeplink/FileOpen4MacDeepLink.java index 6eb3ea366c..ce69e0823c 100644 --- a/designer-realize/src/main/java/com/fr/design/deeplink/FileOpen4MacDeepLink.java +++ b/designer-realize/src/main/java/com/fr/design/deeplink/FileOpen4MacDeepLink.java @@ -4,6 +4,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.file.FileFILE; import com.fr.stable.StringUtils; import com.fr.stable.os.OperatingSystem; +import com.fr.start.common.DesignerStartupContext; import com.fr.start.common.DesignerStartupUtil; import java.io.File; @@ -14,10 +15,11 @@ import java.util.Map; * @version 1.0 * Created by Starryi on 2022/1/13 */ -public class FileOpen4MacDeepLink extends DeepLink { +public class FileOpen4MacDeepLink extends DeepLink implements DeepLinkPrepare{ @Override public boolean accept(String url, String host, String path, Map params) { - return OperatingSystem.isMacos() && StringUtils.isEmpty(host) && StringUtils.isEmpty(path) && params.isEmpty(); + + return support(url, host, path, params); } @Override @@ -30,4 +32,19 @@ public class FileOpen4MacDeepLink extends DeepLink { DesignerContext.getDesignerFrame().openTemplate(new FileFILE(file)); } } + + @Override + public boolean prepare(String url, String host, String path, Map params) { + + if (support(url, host, path, params)) { + DesignerStartupContext.getInstance().setEnabled(false); + return true; + } + return false; + } + + public static boolean support(String url, String host, String path, Map params) { + + return OperatingSystem.isMacos() && StringUtils.isEmpty(host) && StringUtils.isEmpty(path) && params.isEmpty(); + } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java index d653fae953..bfd40aea32 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java @@ -252,7 +252,7 @@ public class AlphaFineFrame extends JFrame { new LoadingRightSearchResultPane() ); - this.templateResourceSearchWorkerManager = new TemplateResourceSearchWorkerManager( + templateResourceSearchWorkerManager = new TemplateResourceSearchWorkerManager( CellType.TEMPLATE_SHOP, searchTextBean -> { return TemplateResourceSearchManager.getInstance().getSearchResult(searchTextBean.getSearchText()); @@ -438,11 +438,7 @@ public class AlphaFineFrame extends JFrame { labelPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20)); labelPane.setBackground(Color.WHITE); labelContentPane = new JPanel(new BorderLayout()); - tabLabel = new UILabel(PRODUCT_NEWS); - tabLabel.setForeground(AlphaFineConstants.FOREGROUND_COLOR_6); - tabLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - tabLabel.setPreferredSize(new Dimension(60, 30)); - tabLabel.setForeground(AlphaFineConstants.LABEL_SELECTED); + tabLabel = createTabLabel(PRODUCT_NEWS); labelWestPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); labelWestPane.add(tabLabel); labelContentPane.add(labelWestPane, BorderLayout.WEST); @@ -491,6 +487,14 @@ public class AlphaFineFrame extends JFrame { return showPane; } + private UILabel createTabLabel(String labelName) { + UILabel label = new UILabel(labelName); + label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + label.setPreferredSize(new Dimension(60, 30)); + label.setForeground(AlphaFineConstants.LABEL_SELECTED); + return label; + } + public JPanel getLabelWestPane() { return labelWestPane; } @@ -588,6 +592,7 @@ public class AlphaFineFrame extends JFrame { private void refreshLabelPane() { labelWestPane.removeAll(); + tabLabel.setForeground(AlphaFineConstants.LABEL_SELECTED); labelWestPane.add(tabLabel); } @@ -658,6 +663,8 @@ public class AlphaFineFrame extends JFrame { boolean networkError; if (selectedTab.getCellType() == CellType.PRODUCT_NEWS) { networkError = productNewsSearchWorkerManager.isNetWorkError(); + } else if (selectedTab.getCellType() == CellType.TEMPLATE_SHOP) { + networkError = templateResourceSearchWorkerManager.isNetWorkError(); } else { networkError = currentSearchWorkerManager.isNetWorkError(); } @@ -669,6 +676,8 @@ public class AlphaFineFrame extends JFrame { boolean searchOver; if (selectedTab.getCellType() == CellType.PRODUCT_NEWS) { searchOver = productNewsSearchWorkerManager.isSearchOver(); + } else if (selectedTab.getCellType() == CellType.TEMPLATE_SHOP) { + searchOver = templateResourceSearchWorkerManager.isSearchOver(); } else { searchOver = currentSearchWorkerManager.isSearchOver(); } @@ -692,17 +701,20 @@ public class AlphaFineFrame extends JFrame { if (searchResultList != null) { searchResultList.requestFocus(); } - boolean hasSearchResult = true; - if (selectedTab.getCellType() == CellType.PRODUCT_NEWS) { - hasSearchResult = productNewsSearchWorkerManager.hasSearchResult(); - } else { - hasSearchResult = currentSearchWorkerManager.hasSearchResult(); - } - if (!hasSearchResult) { + if (!hasSearchResult()) { showResult(CellType.NO_RESULT.getFlagStr4None()); } + } + private boolean hasSearchResult() { + if (selectedTab.getCellType() == CellType.PRODUCT_NEWS) { + return productNewsSearchWorkerManager.hasSearchResult(); + } else if (selectedTab.getCellType() == CellType.TEMPLATE_SHOP) { + return templateResourceSearchWorkerManager.hasSearchResult(); + } else { + return currentSearchWorkerManager.hasSearchResult(); + } } private void initSearchTextField() { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/TemplateResourceDetail.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/TemplateResourceDetail.java index 74b470d53e..5065f6a2b4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/TemplateResourceDetail.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/TemplateResourceDetail.java @@ -23,11 +23,13 @@ public class TemplateResourceDetail { private final TemplateResource root; private String info; private String vendor; + private String htmlText; private List detailInfo; private String[] tagsId; private List tagsName; private double price; - private String parentPkgName; + private String parentPkgName = ""; + private String parentPkgUrl; private String resourceUrl; public static final String ID = "id"; @@ -38,6 +40,7 @@ public class TemplateResourceDetail { public static final String PRICE = "price"; public static final String NAME = "name"; public static final String PARENT_NAME = "parentName"; + public static final String PARENT_URL = "parentUrl"; public static final String TAGS_NAME = "tagsName"; public static final String URL = "url"; @@ -88,6 +91,16 @@ public class TemplateResourceDetail { return tagsName; } + public String getTagsString() { + StringBuilder sb = new StringBuilder(); + if (tagsName != null) { + for (String tag : tagsName) { + sb.append(tag + " "); + } + } + return sb.toString(); + } + public void setTagsName(List tagsName) { this.tagsName = tagsName; } @@ -120,6 +133,21 @@ public class TemplateResourceDetail { this.resourceUrl = resourceUrl; } + public String getHtmlText() { + return htmlText; + } + + public void setHtmlText(String htmlText) { + this.htmlText = htmlText; + } + + public String getParentPkgUrl() { + return parentPkgUrl; + } + + public void setParentPkgUrl(String parentPkgUrl) { + this.parentPkgUrl = parentPkgUrl; + } public static TemplateResourceDetail createByTemplateResource(TemplateResource root) { return Builder.buildByResource(root); @@ -141,11 +169,12 @@ public class TemplateResourceDetail { JSONObject resource = embedResources.getJSONObject(i); if (resourceId.equals(resource.getString(ID))) { detail.setInfo(resource.getString(INFO)); - detail.setDetailInfo(parseDetailInfo(resource.getString(DETAIL_INFO))); + detail.setHtmlText(resource.getString(DETAIL_INFO)); detail.setVendor(resource.getString(VENDOR)); detail.setPrice(resource.getDouble(PRICE)); detail.setResourceUrl(resource.getString(URL)); detail.setParentPkgName(resource.getString(PARENT_NAME)); + detail.setParentPkgUrl(resource.getString(PARENT_URL)); detail.setTagsName(Arrays.asList(resource.getString(TAGS_NAME).split(","))); break; } @@ -162,7 +191,7 @@ public class TemplateResourceDetail { // 1请求详细信息 JSONObject info = helper.getTemplateInfoById(resourceId); detail.setInfo(info.getString(INFO)); - detail.setDetailInfo(parseDetailInfo(info.getString(DETAIL_INFO))); + detail.setHtmlText(info.getString(DETAIL_INFO)); detail.setVendor(info.getString(VENDOR)); detail.setTagsId(info.getString(TAGS_ID).split(",")); detail.setPrice(info.getDouble(PRICE)); @@ -172,15 +201,17 @@ public class TemplateResourceDetail { JSONObject parentPkginfo = helper.getTemplateParentPackageByTemplateId(resourceId); if (parentPkginfo != null) { detail.setParentPkgName(parentPkginfo.getString(NAME)); + detail.setParentPkgUrl(FineMarketClientHelper.getInstance().getTemplateUrlById(parentPkginfo.getString(ID))); } // 3请求标签信息 detail.setTagsName(helper.getTemplateTagsByTemplateTagIds(detail.getTagsId())); + return detail; } catch (Exception e) { FineLoggerFactory.getLogger().error(e, e.getMessage()); } - return detail; + return null; } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java index fe2e1bbc52..8d0ef703bf 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java @@ -1,23 +1,30 @@ package com.fr.design.mainframe.alphafine.preview; -import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.action.StartUseAction; import com.fr.design.mainframe.alphafine.component.TemplateResourceImagePanel; import com.fr.design.mainframe.alphafine.model.TemplateResourceDetail; import com.fr.design.utils.BrowseUtils; +import com.fr.design.utils.LinkStrUtils; +import com.fr.stable.StringUtils; import javax.swing.BorderFactory; +import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; -import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.List; public class TemplateResourceDetailPane extends JPanel { @@ -32,14 +39,16 @@ public class TemplateResourceDetailPane extends JPanel { private static final int IMAGE_HEIGHT = 170; - private static final int IMAGE_WIDTH= 310; - private static final int SCROLL_PANE_WIDTH = 320; - private static final int SCROLL_PANE_HEIGHT = 150; + private static final int IMAGE_WIDTH = 310; + private static final int SCROLL_PANE_WIDTH = 315; + private static final int SCROLL_PANE_HEIGHT = 135; private static final int CONTENT_PANE_WIDTH = 320; private static final int CONTENT_PANE_HEIGHT = 180; - private static final int DETAIL_PANE_HEIGHT = 110; + private static final int DETAIL_PANE_HEIGHT = 95; private static final int TEXT_SCROLL_PANE_HEIGHT = 500; - private static final int PANE_WIDTH = 640; + private static final int PANE_WIDTH = 635; + private static final int BUTTON_WIDTH = 68; + private static final int BUTTON_HEIGHT = 20; private static final String GOTO_DETAIL = Toolkit.i18nText("Fine-Design_Report_AlphaFine_Template_Detail_GOTO_DETAIL"); private static final String START_USE = Toolkit.i18nText("Fine-Design_Report_AlphaFine_Template_Detail_START_USE"); @@ -55,27 +64,38 @@ public class TemplateResourceDetailPane extends JPanel { private static final Color INFO_PANE_BACKGROUND = new Color(0xf9f9f9); private static final Color INFO_PANE_FOREGROUND = new Color(0x5b5b5c); + private static final Color MORE_INFO_LINK = new Color(0x419bf9); + + private static final String HTML_FORMAT = "%s"; + private static final String DETAIL_INFO_HTML_FORMAT = "

" + DETAIL_INFO + "

%s"; + private static final String HTML_P_TAG_FORMAT = "

%s

"; + public TemplateResourceDetailPane(TemplateResourceDetail detail) { this.data = detail; initComponent(); this.setLayout(new FlowLayout(FlowLayout.LEFT)); - this.setBorder(BorderFactory.createEmptyBorder(10,20,0,20)); + this.setBorder(BorderFactory.createEmptyBorder(10, 20, 0, 20)); this.add(imagePane); this.add(contentPane); this.add(detailInfoPane); this.setBackground(Color.WHITE); + SwingUtilities.invokeLater(()->{scrollToTop();}); } - public void refresh() { - + /** + * scrollPane创建后会拉到最底下,初始化的时候手动拉到顶 + */ + public void scrollToTop() { + infoScrollPane.getVerticalScrollBar().setValue(0); + detailInfoPane.getVerticalScrollBar().setValue(0); } private void initComponent() { createImagePane(); createContentPane(); - createDetailInfoPane(); + createDetailInfoScrollPane(); } private void createContentPane() { @@ -89,11 +109,14 @@ public class TemplateResourceDetailPane extends JPanel { contentPane.setBackground(Color.WHITE); } + /** + * 操作区:查看详情,立即使用 + */ private void createOperatePane() { operatePane = new JPanel(new FlowLayout(FlowLayout.LEFT)); JLabel emptyLabel = new JLabel(); - emptyLabel.setPreferredSize(new Dimension(140, 25)); + emptyLabel.setPreferredSize(new Dimension(145, 25)); JLabel priceLabel = new JLabel(); priceLabel.setForeground(Color.RED); if (data.getPrice() == 0) { @@ -110,10 +133,13 @@ public class TemplateResourceDetailPane extends JPanel { } + /** + * 查看详情 + */ JLabel createLinkLabel() { JLabel linkLabel = new JLabel(GOTO_DETAIL); linkLabel.setBackground(Color.WHITE); - linkLabel.setForeground(Color.BLUE); + linkLabel.setForeground(MORE_INFO_LINK); linkLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -124,73 +150,79 @@ public class TemplateResourceDetailPane extends JPanel { return linkLabel; } - // 方便埋点 + /** + * 方便埋点 + */ void openResourceUrl(String url) { BrowseUtils.browser(url); } - UIButton createStartUseButton() { - UIButton starUseButton = new UIButton(START_USE); + + /** + * “立即使用” 按钮 + */ + JButton createStartUseButton() { + JButton starUseButton = new JButton(START_USE) { + @Override + public void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setColor(UIConstants.FLESH_BLUE); + g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 4, 4); + super.paintComponent(g2d); + } + }; + starUseButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + starUseButton.setForeground(Color.WHITE); + starUseButton.setFont(AlphaFineConstants.MEDIUM_FONT); starUseButton.addActionListener(new StartUseAction(data)); + starUseButton.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); + starUseButton.setContentAreaFilled(false); return starUseButton; } + private void createImagePane() { + imagePane = new TemplateResourceImagePanel(data.getRoot(), IMAGE_WIDTH, IMAGE_HEIGHT); + } + /** + * 基本信息页 + */ private void createInfoScrollPane() { - JLabel content = new JLabel(); - content.setHorizontalAlignment(SwingConstants.LEFT); - content.setVerticalAlignment(SwingConstants.TOP); - StringBuilder sb = new StringBuilder(); - sb.append("

"); - sb.append(VENDOR + data.getVendor() + LF); + StringBuilder sb = new StringBuilder(); - List tags = data.getTagsName(); - sb.append(TAGS); - for (String tag : tags) { - sb.append(tag + SPACE); + // 开发者 + sb.append(String.format(HTML_P_TAG_FORMAT, VENDOR + data.getVendor())); + // 标签 + sb.append(String.format(HTML_P_TAG_FORMAT, TAGS + data.getTagsString())); + // 所属模板包 + if (!StringUtils.isEmpty(data.getParentPkgName())) { + sb.append(String.format(HTML_P_TAG_FORMAT, PARENT_PACKAGE + LinkStrUtils.generateLinkTagWithoutUnderLine(data.getParentPkgUrl(), data.getParentPkgName()))); } - sb.append(LF); + // 信息 + sb.append(String.format(HTML_P_TAG_FORMAT, data.getInfo())); + - sb.append(PARENT_PACKAGE + data.getParentPkgName() + LF); - sb.append(data.getInfo()); - sb.append("

"); - content.setText(sb.toString()); + MessageWithLink content = new MessageWithLink(String.format(HTML_FORMAT, sb)); content.setBackground(INFO_PANE_BACKGROUND); content.setForeground(INFO_PANE_FOREGROUND); - content.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH - 10, TEXT_SCROLL_PANE_HEIGHT)); infoScrollPane = new UIScrollPane(content); - infoScrollPane.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH, SCROLL_PANE_HEIGHT - 25)); - infoScrollPane.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); - } - - - - private void createImagePane() { - imagePane = new TemplateResourceImagePanel(data.getRoot(), IMAGE_WIDTH, IMAGE_HEIGHT); + infoScrollPane.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH, SCROLL_PANE_HEIGHT)); + infoScrollPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); } - private void createDetailInfoPane() { - - JLabel content = new JLabel(); - content.setHorizontalAlignment(SwingConstants.LEFT); - content.setVerticalAlignment(SwingConstants.TOP); - - StringBuilder sb = new StringBuilder(); - sb.append("

"); - sb.append(DETAIL_INFO + LF); - - List detailInfos = data.getDetailInfo(); - for (String info : detailInfos) { - sb.append(info); - } - sb.append("

"); - content.setText(sb.toString()); - content.setPreferredSize(new Dimension(PANE_WIDTH - 20, TEXT_SCROLL_PANE_HEIGHT)); - content.setBackground(Color.WHITE); + /** + * 详细信息页 + */ + private void createDetailInfoScrollPane() { + MessageWithLink content = new MessageWithLink(String.format(DETAIL_INFO_HTML_FORMAT, data.getHtmlText())); detailInfoPane = new UIScrollPane(content); detailInfoPane.setPreferredSize(new Dimension(PANE_WIDTH, DETAIL_PANE_HEIGHT)); detailInfoPane.setBackground(Color.WHITE); - detailInfoPane.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); + detailInfoPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); } + + + } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateShopPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateShopPane.java index 7acb305372..fb0181ddd3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateShopPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateShopPane.java @@ -29,6 +29,7 @@ public class TemplateShopPane extends JPanel { public static final String PAGE_PANEL = "pagePane"; public static final String DETAIL_PANEL = "detailPane"; public static final String LOADING_PANEL = "loadingPane"; + public static final String FAILED_PANEL = "failedPane"; private String currentCard = Strings.EMPTY; private static final String SLASH = "/"; @@ -37,6 +38,7 @@ public class TemplateShopPane extends JPanel { private JPanel pagePane; private JPanel detailPane; private JPanel loadingPane; + private JPanel failedPane; private TemplateShopPane() { setLayout(cardLayout); @@ -96,12 +98,20 @@ public class TemplateShopPane extends JPanel { } catch (Exception e) { FineLoggerFactory.getLogger().error(e, e.getMessage()); } - // detailpane初始化 - detailPane = new TemplateResourceDetailPane(detail); - // 切换 - INSTANCE.add(detailPane, DETAIL_PANEL); - switchCard(DETAIL_PANEL); + + if (detail == null) { + setRetryAction(resource); + switchCard(FAILED_PANEL); + } else { + // detailpane初始化 + detailPane = new TemplateResourceDetailPane(detail); + // 切换 + INSTANCE.add(detailPane, DETAIL_PANEL); + switchCard(DETAIL_PANEL); + } } + + }.execute(); } @@ -119,6 +129,9 @@ public class TemplateShopPane extends JPanel { UILabel resourceLabel = new UILabel(resourceName); resourceLabel.setForeground(AlphaFineConstants.LABEL_SELECTED); + + labelNamePane.removeAll(); + labelNamePane.add(tabLabel); labelNamePane.add(slash); labelNamePane.add(resourceLabel); @@ -153,6 +166,18 @@ public class TemplateShopPane extends JPanel { return new SearchLoadingPane(); } + private void setRetryAction(TemplateResource resource) { + if (failedPane != null) { + INSTANCE.remove(failedPane); + } + failedPane = createFailedPane(resource); + INSTANCE.add(failedPane, FAILED_PANEL); + } + + private JPanel createFailedPane(TemplateResource resource) { + return new NetWorkFailedPane(()->{this.searchAndShowDetailPane(resource);}); + } + } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ProductNewsSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ProductNewsSearchManager.java index deee28c35d..9611217589 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ProductNewsSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ProductNewsSearchManager.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.concurrent.Executors; @@ -104,7 +103,7 @@ public class ProductNewsSearchManager { } } - filterByDesignerId(productNewsList); + productNewsList = filterByDesignerId(productNewsList); return productNewsList; } @@ -120,9 +119,9 @@ public class ProductNewsSearchManager { HashMap> userGroupInfoCache = new HashMap<>(); //遍历资源,获取target下的所有用户组信息,检查是否包含设计器id - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - List targets = iterator.next().getTarget(); + List newsList = new ArrayList<>(); + for (ProductNews productNews : list) { + List targets = productNews.getTarget(); boolean targetsContainDesignerId = false; @@ -140,12 +139,11 @@ public class ProductNewsSearchManager { } } - - if (!targetsContainDesignerId) { - iterator.remove(); + if (targetsContainDesignerId) { + newsList.add(productNews); } } - return list; + return newsList; } /** diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index ff7962f61a..4a4fbac2b0 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -33,6 +33,7 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.start.DesignerProcessType; import com.fr.start.ServerStarter; +import com.fr.start.common.DesignerStartupContext; import com.fr.start.event.LazyStartupEvent; import com.fr.start.preload.PreLoadService; import com.fr.start.server.FineEmbedServer; @@ -120,7 +121,7 @@ public class DesignerStartup extends Activator { || FineEmbedServer.isRunning()) { return; } - if (DaoSelectorFactory.getDaoSelector().useCacheDao()) { + if (DaoSelectorFactory.getDaoSelector().useCacheDao() || DesignerStartupContext.getInstance().isOnStartup()) { listenEvent(LazyStartupEvent.INSTANCE, new Listener(Integer.MIN_VALUE) { @Override public void on(Event event, Null param) { diff --git a/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java b/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java index 9e590a3e1d..568b512938 100644 --- a/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java @@ -1,6 +1,7 @@ package com.fr.start.module.optimized; import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.ui.util.UIUtil; import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; @@ -110,6 +111,9 @@ public class DesignerStartupPageActivator extends Activator { // 将选中的环境设置为当前环境 StartupWorkspaceBean selectWorkspaceInfo = model.getSelectWorkspaceInfo(); DesignerEnvManager.getEnvManager().setCurEnvName(selectWorkspaceInfo.getName()); + UIUtil.invokeLaterIfNeeded(() -> { + DesignerContext.getDesignerFrame().setTitle(); + }); } private void launchAfterWarmup(DesignerPreWarmTask warmTask) {