From 58f07b2980357f8eb1c5b3415aa02630fefa0395 Mon Sep 17 00:00:00 2001 From: Zhanying <2446962908@qq.com> Date: Thu, 27 Feb 2025 14:26:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20JSContentPane=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=8F=90=E7=A4=BA=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20#REPORT-144004?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fun/DefaultValueAdjustProvider.java | 17 +++ .../fr/design/javascript/JSContentPane.java | 112 +++++++++++++++++- .../JSContentWithDescriptionPane.java | 32 ++++- .../design/javascript/JavaScriptImplPane.java | 23 +++- .../javascript/NewJavaScriptImplPane.java | 23 +++- 5 files changed, 199 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java b/designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java index 0654c69e11..60b7c314a8 100644 --- a/designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java @@ -6,6 +6,7 @@ import com.fr.chartx.attr.ChartProvider; import com.fr.design.style.color.FRColorSelectorStyle; import com.fr.general.FRFont; import com.fr.report.cell.CellElement; +import com.fr.stable.StringUtils; import com.fr.stable.collections.combination.Pair; import com.fr.stable.fun.mark.Selectable; @@ -92,4 +93,20 @@ public interface DefaultValueAdjustProvider extends Selectable { default boolean isNeedPostCombo4MobilePopupPane() { return false; } + + /** + * JsContentPane是否支持内容提示 + * @return 是否支持 + */ + default boolean isNeedContentWarning4JsContentPane() { + return false; + } + + /** + * 自定义匹配js内容,并返回对应的提示文本 + * @return <是否匹配,提示文本> + */ + default Pair checkJsContent(String content) { + return new Pair<>(false, StringUtils.EMPTY); + } } diff --git a/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java b/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java index 31c45da762..d752e12254 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JSContentPane.java @@ -25,12 +25,19 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.general.IOUtils; import com.fr.js.JavaScriptImpl; +import com.fr.stable.StringUtils; +import com.fr.stable.collections.combination.Pair; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.SwingWorker; +import javax.swing.border.EmptyBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FontMetrics; @@ -54,6 +61,13 @@ public class JSContentPane extends BasicPane { private JSImplPopulateAction jsImplPopulateAction; private boolean modal; BasicDialog advancedEditorDialog ; + private JLabel warningLabel; + //用来标记当前显示状态 + private boolean showWarning = false; + private static final Color WARING_LABEL_BACKGROUND = Color.decode("#FFFBE6"); + private static final Color WARING_LABEL_FOREGROUND = new Color(0, 0, 0, 216); + private JPanel endBracketsPanel; + public JSContentPane(){} public JSContentPane(String[] args) { @@ -73,14 +87,91 @@ public class JSContentPane extends BasicPane { UILabel funNameLabel2 = new UILabel(); funNameLabel2.setText("}"); - this.add(funNameLabel2, BorderLayout.SOUTH); + + if (isNeedContentWarning()) { + endBracketsPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + endBracketsPanel.add(funNameLabel2, BorderLayout.NORTH); + warningLabel = initWarningLabel(); + this.add(endBracketsPanel, BorderLayout.SOUTH); + } else { + this.add(funNameLabel2, BorderLayout.SOUTH); + } + } + + protected JLabel initWarningLabel() { + JLabel warningLabel = new JLabel(StringUtils.EMPTY); + warningLabel.setOpaque(true); + warningLabel.setAlignmentX(LEFT_ALIGNMENT); + // 设置左右 5px 的间距 + warningLabel.setBorder(new EmptyBorder(0, 5, 0, 5)); + warningLabel.setPreferredSize(new Dimension(200, 20)); + warningLabel.setBackground(WARING_LABEL_BACKGROUND); + warningLabel.setForeground(WARING_LABEL_FOREGROUND); + + addContentListener4Warning(); + return warningLabel; } + + private void addContentListener4Warning() { + contentTextArea.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + checkContent(contentTextArea); + } + + @Override + public void removeUpdate(DocumentEvent e) { + checkContent(contentTextArea); + } + + @Override + public void changedUpdate(DocumentEvent e) { + checkContent(contentTextArea); + } + }); + } + + private void checkContent(RSyntaxTextArea contentTextArea) { + String content = contentTextArea.getText().trim(); + Pair pair = checkContent(content); + boolean matches = Boolean.TRUE.equals(pair.getFirst()); + String tip = pair.getSecond() != null ? pair.getSecond() : StringUtils.EMPTY; + // 更新提示 + updateWarningTip(tip); + + if (matches == showWarning) { + return; + } + if (matches) { + addWarningLabel(); + showWarning = true; + } else { + removeWarningLabel(); + showWarning = false; + } + } + + protected void updateWarningTip(String tip) { + if (!StringUtils.equals(warningLabel.getText(), tip)) { + warningLabel.setText(tip); + } + } + + protected void removeWarningLabel() { + endBracketsPanel.remove(warningLabel); + endBracketsPanel.revalidate(); + } + + protected void addWarningLabel() { + endBracketsPanel.add(warningLabel, BorderLayout.SOUTH); + endBracketsPanel.revalidate(); + } + public JSContentPane(String[] args,boolean modal) { this(args); this.modal = modal; } - public void setJsImplUpdateAction(JSImplUpdateAction jsImplUpdateAction){ this.jsImplUpdateAction = jsImplUpdateAction; } @@ -93,7 +184,6 @@ public class JSContentPane extends BasicPane { this.javaScript = javaScript; } - private void addNewPaneLabel(){ UILabel advancedEditorLabel = new UILabel(Toolkit.i18nText("Fine-Design_Advanced_Editor"), IconUtils.readIcon("com/fr/design/images/edit/advancedEditor.svg"), SwingConstants.LEFT); advancedEditorLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); @@ -328,4 +418,20 @@ public class JSContentPane extends BasicPane { protected boolean needAdvancedEditor() { return true; } + + /** + * 是否支持内容提示 + * @return 是否支持 + */ + protected boolean isNeedContentWarning() { + return false; + } + + /** + * 自定义匹配js内容,并返回对应的提示文本 + * @return <是否匹配,提示文本> + */ + protected Pair checkContent(String content) { + return new Pair<>(false, StringUtils.EMPTY); + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java index 4116f4f1d0..490ff1899b 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java @@ -32,6 +32,7 @@ import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JPopupMenu; @@ -71,7 +72,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.Locale; import java.util.concurrent.ExecutionException; public class JSContentWithDescriptionPane extends JSContentPane implements KeyListener { @@ -95,6 +95,9 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private JPopupMenu popupMenu; + private JPanel endBracketsPanel; + private JLabel warningLabel; + private InterfaceAndDescriptionPanel interfaceAndDescriptionPanel; private JList helpDOCList; @@ -159,8 +162,13 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi endBracketsLabel.setText("}"); //结尾括号和复用函数按钮面板 - JPanel endBracketsPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - endBracketsPanel.add(endBracketsLabel, BorderLayout.WEST); + endBracketsPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + if (isNeedContentWarning()) { + warningLabel = initWarningLabel(); + endBracketsPanel.add(endBracketsLabel, BorderLayout.NORTH); + } else { + endBracketsPanel.add(endBracketsLabel, BorderLayout.WEST); + } JPanel northPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); northPanel.add(jsParaAndSearchPane, BorderLayout.NORTH); @@ -178,6 +186,24 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi this.add(functionNameAndDescriptionPanel, BorderLayout.SOUTH); } + protected void updateWarningTip(String tip) { + if (!StringUtils.equals(warningLabel.getText(), tip)) { + warningLabel.setText(tip); + } + } + + @Override + protected void removeWarningLabel() { + endBracketsPanel.remove(warningLabel); + endBracketsPanel.revalidate(); + } + + @Override + protected void addWarningLabel() { + endBracketsPanel.add(warningLabel, BorderLayout.SOUTH); + endBracketsPanel.revalidate(); + } + public void populate(String js) { contentTextArea.setText(js); ifHasBeenWriten = 1; diff --git a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java index 37bca2f6eb..3b57db544e 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptImplPane.java @@ -3,6 +3,7 @@ package com.fr.design.javascript; import com.fr.base.Parameter; import com.fr.design.data.tabledata.tabledatapane.OneListTableModel; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.gui.frpane.ReportletParameterViewPane; import com.fr.design.gui.itableeditorpane.ParameterTableModel; import com.fr.design.gui.itableeditorpane.UITableEditAction; @@ -13,10 +14,12 @@ import com.fr.design.javascript.jsapi.JSImplPopulateAction; import com.fr.design.javascript.jsapi.JSImplUpdateAction; import com.fr.design.mainframe.DesignerContext; import com.fr.design.scrollruler.ModLineBorder; +import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.js.JavaScriptImpl; import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; +import com.fr.stable.collections.combination.Pair; import javax.swing.BorderFactory; import javax.swing.JPanel; @@ -84,7 +87,25 @@ public class JavaScriptImplPane extends AbstractHyperLinkPane { } protected JSContentPane createJSContentPane(String[] defaultArgs){ - JSContentPane jsContentPane= new JSContentPane(defaultArgs,modal); + JSContentPane jsContentPane= new JSContentPane(defaultArgs,modal) { + @Override + protected boolean isNeedContentWarning() { + DefaultValueAdjustProvider valueAdjust = DesignUtils.getValueAdjust(); + if (valueAdjust != null) { + return valueAdjust.isNeedContentWarning4JsContentPane(); + } + return super.isNeedContentWarning(); + } + + @Override + protected Pair checkContent(String content) { + DefaultValueAdjustProvider valueAdjust = DesignUtils.getValueAdjust(); + if (valueAdjust != null) { + return valueAdjust.checkJsContent(content); + } + return super.checkContent(content); + } + }; jsContentPane.setJsImplUpdateAction(new JSImplUpdateAction() { @Override public void update(JavaScriptImpl javaScript) { diff --git a/designer-base/src/main/java/com/fr/design/javascript/NewJavaScriptImplPane.java b/designer-base/src/main/java/com/fr/design/javascript/NewJavaScriptImplPane.java index 23226c6dde..5a59bf8c78 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/NewJavaScriptImplPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/NewJavaScriptImplPane.java @@ -1,7 +1,10 @@ package com.fr.design.javascript; +import com.fr.design.fun.DefaultValueAdjustProvider; +import com.fr.design.utils.DesignUtils; import com.fr.js.JavaScriptImpl; +import com.fr.stable.collections.combination.Pair; public class NewJavaScriptImplPane extends JavaScriptImplPane { @@ -10,7 +13,25 @@ public class NewJavaScriptImplPane extends JavaScriptImplPane { } protected JSContentPane createJSContentPane(String[] defaultArgs){ - return new JSContentWithDescriptionPane(defaultArgs); + return new JSContentWithDescriptionPane(defaultArgs) { + @Override + protected boolean isNeedContentWarning() { + DefaultValueAdjustProvider valueAdjust = DesignUtils.getValueAdjust(); + if (valueAdjust != null) { + return valueAdjust.isNeedContentWarning4JsContentPane(); + } + return super.isNeedContentWarning(); + } + + @Override + protected Pair checkContent(String content) { + DefaultValueAdjustProvider valueAdjust = DesignUtils.getValueAdjust(); + if (valueAdjust != null) { + return valueAdjust.checkJsContent(content); + } + return super.checkContent(content); + } + }; } public void populate(JavaScriptImpl javaScript) {