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/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-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 09cfbaf8a8..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 @@ -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); } @@ -696,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 2f34534406..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 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,6 +201,7 @@ 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请求标签信息 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 083b21d8cc..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,6 +1,7 @@ package com.fr.design.mainframe.alphafine.preview; 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; @@ -8,12 +9,14 @@ 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; @@ -22,7 +25,6 @@ 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 { @@ -37,12 +39,12 @@ public class TemplateResourceDetailPane extends JPanel { private static final int IMAGE_HEIGHT = 170; - private static final int IMAGE_WIDTH= 310; + 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 = 635; private static final int BUTTON_WIDTH = 68; @@ -64,26 +66,36 @@ public class TemplateResourceDetailPane extends JPanel { 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() { @@ -97,6 +109,9 @@ public class TemplateResourceDetailPane extends JPanel { contentPane.setBackground(Color.WHITE); } + /** + * 操作区:查看详情,立即使用 + */ private void createOperatePane() { operatePane = new JPanel(new FlowLayout(FlowLayout.LEFT)); @@ -118,6 +133,9 @@ public class TemplateResourceDetailPane extends JPanel { } + /** + * 查看详情 + */ JLabel createLinkLabel() { JLabel linkLabel = new JLabel(GOTO_DETAIL); linkLabel.setBackground(Color.WHITE); @@ -132,11 +150,17 @@ public class TemplateResourceDetailPane extends JPanel { return linkLabel; } - // 方便埋点 + /** + * 方便埋点 + */ void openResourceUrl(String url) { BrowseUtils.browser(url); } + + /** + * “立即使用” 按钮 + */ JButton createStartUseButton() { JButton starUseButton = new JButton(START_USE) { @Override @@ -148,7 +172,7 @@ public class TemplateResourceDetailPane extends JPanel { super.paintComponent(g2d); } }; - starUseButton.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); + starUseButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); starUseButton.setForeground(Color.WHITE); starUseButton.setFont(AlphaFineConstants.MEDIUM_FONT); starUseButton.addActionListener(new StartUseAction(data)); @@ -157,62 +181,48 @@ public class TemplateResourceDetailPane extends JPanel { 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)); - infoScrollPane.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); - } - - - - private void createImagePane() { - imagePane = new TemplateResourceImagePanel(data.getRoot(), IMAGE_WIDTH, IMAGE_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