diff --git a/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java b/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java
index ebccd24f45..85d73515e5 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ilable/ActionLabel.java
@@ -13,11 +13,16 @@ import java.awt.event.MouseEvent;
*/
public class ActionLabel extends UILabel {
private ActionListener actionListener;
+ private Color color;
public ActionLabel(String text) {
- super(text);
+ this(text, Color.blue);
+ }
- this.setForeground(Color.blue);
+ public ActionLabel(String text, Color color) {
+ super(text);
+ this.color = color;
+ this.setForeground(color);
this.addMouseListener(mouseInputAdapter);
this.addMouseMotionListener(mouseInputAdapter);
}
@@ -33,7 +38,7 @@ public class ActionLabel extends UILabel {
public void paintComponent(Graphics _gfx) {
super.paintComponent(_gfx);
- _gfx.setColor(Color.blue);
+ _gfx.setColor(this.color);
_gfx.drawLine(0, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1);
}
diff --git a/designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java b/designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java
index 769707ebe5..eab2a64bb3 100644
--- a/designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java
+++ b/designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java
@@ -5,6 +5,7 @@ import com.fr.design.ExtraDesignClassManager;
import com.fr.design.fun.FormAdaptiveConfigUIProcessor;
import com.fr.stable.Constants;
import com.fr.stable.unit.PT;
+import java.math.BigDecimal;
/**
@@ -43,4 +44,11 @@ public class FontTransformUtil {
return value * (double) Constants.DEFAULT_FONT_PAINT_RESOLUTION / (double) getDesignerFontResolution();
}
+
+ public static int roundUp(double num) {
+ String numStr = Double.toString(num);
+ numStr = new BigDecimal(numStr).setScale(0, BigDecimal.ROUND_HALF_UP).toString();
+ return Integer.valueOf(numStr);
+ }
+
}
diff --git a/designer-form/src/main/java/com/fr/design/form/util/HtmlPaintUtils.java b/designer-form/src/main/java/com/fr/design/form/util/HtmlPaintUtils.java
new file mode 100644
index 0000000000..f8620f52d2
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/form/util/HtmlPaintUtils.java
@@ -0,0 +1,42 @@
+package com.fr.design.form.util;
+
+import com.fr.base.Style;
+import com.fr.general.FRFont;
+import com.fr.log.FineLoggerFactory;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 富文本导出工具栏
+ *
+ * @author hades
+ * @version 11.0
+ * Created by hades on 2022/5/19
+ */
+public class HtmlPaintUtils {
+
+
+ private static final Pattern FONT_SIZE_PATTERN = Pattern.compile(Pattern.quote("font-size:") + "(.*?)" + Pattern.quote("px"));
+
+ /**
+ * 设置单元格字体为富文本中的最大字体
+ *
+ * @param style
+ */
+ public static Style deriveMaxFontFromRichChar(Style style, String html) {
+ int maxSize = style.getFRFont().getSize();
+ Matcher matcher = FONT_SIZE_PATTERN.matcher(html);
+ while (matcher.find()) {
+ String value = matcher.group(1);
+ try {
+ double pxSize = Double.parseDouble(value);
+ int ptSize = FontTransformUtil.roundUp(FontTransformUtil.px2pt(pxSize));
+ maxSize = Math.max(maxSize, ptSize);
+ } catch (Throwable e) {
+ FineLoggerFactory.getLogger().debug(e.getMessage(), e);
+ }
+ }
+ FRFont cellFont = style.getFRFont();
+ return style.deriveFRFont(cellFont.applySize(maxSize));
+ }
+}
diff --git a/designer-form/src/test/java/com/fr/design/form/util/HtmlPaintUtilsTest.java b/designer-form/src/test/java/com/fr/design/form/util/HtmlPaintUtilsTest.java
new file mode 100644
index 0000000000..445e865ab4
--- /dev/null
+++ b/designer-form/src/test/java/com/fr/design/form/util/HtmlPaintUtilsTest.java
@@ -0,0 +1,49 @@
+package com.fr.design.form.util;
+
+import com.fr.base.Style;
+import junit.framework.TestCase;
+import org.junit.Assert;
+
+
+/**
+ * @author hades
+ * @version 11.0
+ * Created by hades on 2022/5/25
+ */
+public class HtmlPaintUtilsTest extends TestCase {
+
+ public void testDeriveMaxFontFromRichChar() {
+ // 富文本字体size更大
+ String testHtml0 = "这是一条测试数据";
+ Style style0 = Style.DEFAULT_STYLE;
+ Assert.assertEquals(16, HtmlPaintUtils.deriveMaxFontFromRichChar(style0, testHtml0).getFRFont().getSize());
+
+ // 单元格字体size更大
+ String testHtml1 = "这是一条测试数据";
+ Style style1 = Style.DEFAULT_STYLE;
+ int oldFontSize = style1.getFRFont().getSize();
+ Assert.assertEquals(oldFontSize, HtmlPaintUtils.deriveMaxFontFromRichChar(style1, testHtml1).getFRFont().getSize());
+
+ // 富文本字体size更大 不同文本 有不同size
+ String testHtml2 = "这是一条测试数据";
+ Style style2 = Style.DEFAULT_STYLE;
+ Assert.assertEquals(23, HtmlPaintUtils.deriveMaxFontFromRichChar(style2, testHtml2).getFRFont().getSize());
+
+
+ // 异常场景1
+ String testHtml3 = "xxxx奇怪的格式xxxx";
+ Style style3 = Style.DEFAULT_STYLE;
+ oldFontSize = style1.getFRFont().getSize();
+ Assert.assertEquals(oldFontSize, HtmlPaintUtils.deriveMaxFontFromRichChar(style3, testHtml3).getFRFont().getSize());
+
+ // 异常场景2
+ String testHtml4 = "这是一条测试数据";
+ Style style4 = Style.DEFAULT_STYLE;
+ oldFontSize = style1.getFRFont().getSize();
+ Assert.assertEquals(oldFontSize, HtmlPaintUtils.deriveMaxFontFromRichChar(style4, testHtml4).getFRFont().getSize());
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextCellEditor.java b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextCellEditor.java
index 1019281355..1d2a5eda26 100644
--- a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextCellEditor.java
+++ b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextCellEditor.java
@@ -1,5 +1,8 @@
package com.fr.design.cell.editor;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.general.GeneralUtils;
+import com.fr.design.form.util.HtmlPaintUtils;
import java.awt.Component;
import javax.swing.SwingUtilities;
@@ -42,6 +45,11 @@ public class RichTextCellEditor extends AbstractCellEditor implements
@Override
public void doOk() {
RichTextCellEditor.this.fireEditingStopped();
+ CellElement newCellElement = parentTplEC.getTemplateCellElement(cellElement.getColumn(), cellElement.getRow());
+ if (cellElement.getCellGUIAttr().isShowAsHTML()) {
+ newCellElement.setStyle(HtmlPaintUtils.deriveMaxFontFromRichChar(newCellElement.getStyle(), GeneralUtils.objectToString(newCellElement.getValue())));
+ DesignerContext.getDesignerFrame().refreshToolbar();
+ }
}
@Override
@@ -49,7 +57,6 @@ public class RichTextCellEditor extends AbstractCellEditor implements
RichTextCellEditor.this.fireEditingCanceled();
}
});
- richTextDialog.addDialogActionListener(this);
this.richTextPane.populate(parentTplEC, cellElement);
setShowAsHtml(cellElement);
diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java
index f95681be32..74654cd2ef 100644
--- a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java
+++ b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java
@@ -366,9 +366,7 @@ public class RichTextToolBar extends BasicPane {
};
private int roundUp(double num) {
- String numStr = Double.toString(num);
- numStr = new BigDecimal(numStr).setScale(0, BigDecimal.ROUND_HALF_UP).toString();
- return Integer.valueOf(numStr);
+ return FontTransformUtil.roundUp(num);
}
private CaretListener textCareListener = new CaretListener() {
diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java
new file mode 100644
index 0000000000..3714d66a27
--- /dev/null
+++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java
@@ -0,0 +1,81 @@
+package com.fr.design.report;
+
+import com.fr.base.CustomConfig;
+import com.fr.config.Configuration;
+import com.fr.design.constants.UIConstants;
+import com.fr.design.dialog.BasicPane;
+import com.fr.design.gui.icheckbox.UICheckBox;
+import com.fr.design.gui.ilable.ActionLabel;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.utils.BrowseUtils;
+import com.fr.general.CloudCenter;
+import com.fr.transaction.Configurations;
+import com.fr.transaction.WorkerFacade;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+
+/**
+ * @author hades
+ * @version 11.0
+ * Created by hades on 2022/5/26
+ */
+public class ExportUniversalPane extends BasicPane {
+
+ private static final String HELP_URL = CloudCenter.getInstance().acquireUrlByKind("help.alt_font.zh_CN", "https://help.fanruan.com/finereport/doc-view-4707.html");
+
+ private UICheckBox specialCharacterExport;
+
+ public ExportUniversalPane() {
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+ JPanel outerNorthPane =FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Config"));
+ JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane();
+ JPanel specialCharacterExportPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane();
+ specialCharacterExport = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Special_Character"));
+ specialCharacterExport.setSelected(true);
+ specialCharacterExportPane.add(specialCharacterExport);
+ northPane.add(specialCharacterExportPane);
+ JPanel labelPane = new JPanel(new BorderLayout());
+ labelPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
+ UILabel centerLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Special_Character_Tip"));
+ centerLabel.setForeground(Color.GRAY);
+ ActionLabel rightLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Report_Universal_Export_More_Alternative_Fonts"), UIConstants.FLESH_BLUE);
+ rightLabel.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ BrowseUtils.browser(HELP_URL);
+ }
+ });
+ labelPane.add(centerLabel, BorderLayout.CENTER);
+ labelPane.add(rightLabel, BorderLayout.EAST);
+ northPane.add(labelPane);
+ outerNorthPane.add(northPane);
+ this.add(outerNorthPane);
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return "ExportUniversalPane";
+ }
+
+ public void populate() {
+ this.specialCharacterExport.setSelected(CustomConfig.getInstance().isOptimizedSpecialCharacterExport());
+ }
+
+ public void update() {
+ Configurations.modify(new WorkerFacade(CustomConfig.class) {
+ @Override
+ public void run() {
+ CustomConfig.getInstance().setOptimizedSpecialCharacterExport(specialCharacterExport.isSelected());
+ }
+ });
+ }
+
+
+}
diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java
index 1ac27cc882..d0770a13b6 100644
--- a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java
+++ b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java
@@ -5,6 +5,7 @@ import com.fr.design.beans.BasicStorePane;
import com.fr.design.dialog.BasicPane;
import com.fr.design.fun.ExportAttrTabProvider;
import com.fr.design.gui.frpane.UITabbedPane;
+import com.fr.design.i18n.Toolkit;
import com.fr.io.attr.ReportExportAttr;
import javax.swing.*;
@@ -17,12 +18,15 @@ public class ReportExportAttrPane extends BasicPane {
private ExcelExportPane excelExportPane;
private PDFExportPane pdfExportPane;
private WordExportPane wordExportPane;
+ private ExportUniversalPane exportUniversalPane;
private List> paneList;
public ReportExportAttrPane() {
UITabbedPane uiTabbedPane = new UITabbedPane();
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+ exportUniversalPane = new ExportUniversalPane();
+ uiTabbedPane.addTab(Toolkit.i18nText("Fine-Design_Report_Universal_Export"), exportUniversalPane);
excelExportPane = new ExcelExportPane();
uiTabbedPane.addTab("Excel", excelExportPane);
pdfExportPane = new PDFExportPane();
@@ -49,6 +53,10 @@ public class ReportExportAttrPane extends BasicPane {
reportExportAttr = new ReportExportAttr();
}
+ if (this.exportUniversalPane != null) {
+ this.exportUniversalPane.populate();
+ }
+
if (this.excelExportPane != null) {
this.excelExportPane.populate(reportExportAttr.getExcelExportAttr());
}
@@ -69,6 +77,11 @@ public class ReportExportAttrPane extends BasicPane {
public ReportExportAttr update() {
ReportExportAttr reportExportAttr = new ReportExportAttr();
+
+ if (this.exportUniversalPane != null) {
+ this.exportUniversalPane.update();
+ }
+
if (this.excelExportPane != null) {
reportExportAttr.setExcelExportAttr(this.excelExportPane.update());
}