From 5b730fa256181661e2318c5cbc32326f0eb39cf5 Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 14 May 2020 15:46:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?REPORT-30739=E3=80=9010.0.6=E5=BC=80?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E3=80=91=E5=AD=97=E4=BD=93=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=94=B9=E6=88=90=E5=83=8F=E7=B4=A0=E7=9A=84=E5=8F=AF=E8=A1=8C?= =?UTF-8?q?=E6=80=A7=E7=A0=94=E7=A9=B6=EF=BC=8C=E5=8F=8A=E5=BC=80=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fun/FormAdaptiveConfigUIProcessor.java | 7 + .../fr/design/designer/creator/XButton.java | 30 +-- .../fr/design/designer/creator/XLabel.java | 5 +- .../design/form/util/FontTransformUtil.java | 46 +++++ .../form/util/FontTransformUtilTest.java | 68 +++++++ .../design/cell/editor/RichTextToolBar.java | 180 +++++++++--------- 6 files changed, 225 insertions(+), 111 deletions(-) create mode 100644 designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java create mode 100644 designer-form/src/test/java/com/fr/design/form/util/FontTransformUtilTest.java diff --git a/designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java b/designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java index 1f2853b91d..ebe0e8c3d4 100644 --- a/designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java +++ b/designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java @@ -32,5 +32,12 @@ public interface FormAdaptiveConfigUIProcessor extends Immutable { */ BufferedImage paintFormElementCaseImage(Dimension size, JComponent elementCasePane); + + /** + * 获取新自适应下字体显示的dpi + * @return dpi + */ + int fontResolution(); + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java index e94022ebe8..44996df8cd 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java @@ -3,8 +3,8 @@ */ package com.fr.design.designer.creator; -import com.fr.base.ScreenResolution; import com.fr.base.background.GradientBackground; +import com.fr.design.form.util.FontTransformUtil; import com.fr.design.form.util.XCreatorConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.widget.editors.ButtonTypeEditor; @@ -40,13 +40,13 @@ import java.beans.IntrospectionException; * @since 6.5.3 */ public class XButton extends XWidgetCreator { - + public final static Background DEFAULTBG = new GradientBackground(new Color(247,247,247),new Color(210,210,210), GradientBackground.TOP2BOTTOM); public final static Font DEFAULTFT = new Font("Song_TypeFace",0,12); public final static Color DEFAULTFOREGROUNDCOLOR = Color.BLACK; private Background bg; private UILabel contentLabel; - + public XButton(Button widget, Dimension initSize) { this(new FreeButton(widget),initSize); } @@ -54,11 +54,11 @@ public class XButton extends XWidgetCreator { public XButton(FreeButton widget, Dimension initSize) { super(widget, initSize); } - + public XButton(FormSubmitButton widget, Dimension initSize) { super(widget, initSize); } - + public Background getContentBackground() { return bg; } @@ -74,7 +74,7 @@ public class XButton extends XWidgetCreator { public void setContentLabel(UILabel contentLabel) { this.contentLabel = contentLabel; } - + /** *根据下拉框选择返回按钮样式的默认设置或自定义设置列表 * @return 列表 @@ -148,7 +148,7 @@ public class XButton extends XWidgetCreator { FreeButton button = (FreeButton) data; if (button.getFont() != null) { contentLabel.setFont(button.getFont().applyResolutionNP( - ScreenResolution.getScreenResolution())); + FontTransformUtil.getDesignerFontResolution())); contentLabel.setForeground(button.getFont().getForeground()); } } @@ -205,7 +205,7 @@ public class XButton extends XWidgetCreator { protected UILabel initContentLabel() { return new UILabel(); } - + @Override public void paintComponent(Graphics g) { super.paintComponent(g); @@ -218,15 +218,15 @@ public class XButton extends XWidgetCreator { bg.paint(g, new Rectangle2D.Double(0, 0, panelSize.getWidth(), panelSize.getHeight())); } } - + public void setButtonText(String text) { contentLabel.setText(text); } - + private void checkButonType() { UILabel l = contentLabel; FreeButton button = (FreeButton) data; - + if (!button.isCustomStyle()) { l.setBorder(BorderFactory.createLineBorder(new Color(148, 148, 148))); bg = DEFAULTBG; @@ -240,7 +240,7 @@ public class XButton extends XWidgetCreator { editor.add(l,BorderLayout.CENTER); if (button.getFont() != null) { contentLabel.setFont(button.getFont().applyResolutionNP( - ScreenResolution.getScreenResolution())); + FontTransformUtil.getDesignerFontResolution())); contentLabel.setForeground(button.getFont().getForeground()); } l.setBounds(0, 0, button.getButtonWidth() == 0 ? this.getWidth() : button.getButtonWidth(), button @@ -248,7 +248,7 @@ public class XButton extends XWidgetCreator { bg = button.getInitialBackground(); } } - + @Override protected void initXCreatorProperties() { super.initXCreatorProperties(); @@ -257,7 +257,7 @@ public class XButton extends XWidgetCreator { FreeButton button = (FreeButton) data; l.setText(button.getText()); if (button.isCustomStyle() && button.getFont() != null) { - l.setFont(button.getFont().applyResolutionNP(ScreenResolution.getScreenResolution())); + l.setFont(button.getFont().applyResolutionNP(FontTransformUtil.getDesignerFontResolution())); l.setForeground(button.getFont().getForeground()); } @@ -303,7 +303,7 @@ public class XButton extends XWidgetCreator { checkButonType(); if (button.getFont() != null) { contentLabel.setFont(button.getFont().applyResolutionNP( - ScreenResolution.getScreenResolution())); + FontTransformUtil.getDesignerFontResolution())); contentLabel.setForeground(button.getFont().getForeground()); } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java b/designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java index 233c369c41..df2252c7af 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java @@ -4,9 +4,9 @@ package com.fr.design.designer.creator; import com.fr.base.BaseUtils; -import com.fr.base.ScreenResolution; import com.fr.base.Style; import com.fr.design.border.UIRoundedBorder; +import com.fr.design.form.util.FontTransformUtil; import com.fr.design.form.util.XCreatorConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.widget.editors.FontEditor; @@ -98,7 +98,8 @@ public class XLabel extends XWidgetCreator { .toString(), Style.getInstance(label.getFont()).deriveHorizontalAlignment(label.getTextalign()) .deriveVerticalAlignment(label.isVerticalCenter() ? SwingConstants.CENTER : SwingConstants.TOP) .deriveTextStyle(label.isWrap() ? Style.TEXTSTYLE_WRAPTEXT : Style.TEXTSTYLE_SINGLELINE), - ScreenResolution.getScreenResolution()); + FontTransformUtil.getDesignerFontResolution()); + } } 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 new file mode 100644 index 0000000000..769707ebe5 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java @@ -0,0 +1,46 @@ +package com.fr.design.form.util; + + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.fun.FormAdaptiveConfigUIProcessor; +import com.fr.stable.Constants; +import com.fr.stable.unit.PT; + + +/** + * Created by kerry on 2020-04-16 + */ +public class FontTransformUtil { + + /** + * 获取设计器字体显示dpi + * @return dpi + */ + public static int getDesignerFontResolution() { + int dpi = Constants.FR_PAINT_RESOLUTION; + FormAdaptiveConfigUIProcessor adaptiveConfigUI = ExtraDesignClassManager.getInstance().getSingle(FormAdaptiveConfigUIProcessor.MARK_STRING); + if (adaptiveConfigUI != null) { + dpi = adaptiveConfigUI.fontResolution(); + } + return dpi; + } + + /** + * pt值转px + * @param value pt值 + * @return px值 + */ + public static double pt2px(double value) { + return PT.pt2pix(value, getDesignerFontResolution()); + } + + /** + * px值转pt + * @param value px值 + * @return pt值 + */ + public static double px2pt(double value) { + return value * (double) Constants.DEFAULT_FONT_PAINT_RESOLUTION / (double) getDesignerFontResolution(); + } + +} diff --git a/designer-form/src/test/java/com/fr/design/form/util/FontTransformUtilTest.java b/designer-form/src/test/java/com/fr/design/form/util/FontTransformUtilTest.java new file mode 100644 index 0000000000..224ca551c4 --- /dev/null +++ b/designer-form/src/test/java/com/fr/design/form/util/FontTransformUtilTest.java @@ -0,0 +1,68 @@ +package com.fr.design.form.util; + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.fun.FormAdaptiveConfigUIProcessor; +import com.fr.stable.Constants; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +/** + * Created by kerry on 2020-05-14 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest(ExtraDesignClassManager.class) +public class FontTransformUtilTest { + + @Test + public void testGetDesignerFontResolution() { + mockEnvironment(Constants.DEFAULT_FONT_PAINT_RESOLUTION); + Assert.assertEquals(Constants.DEFAULT_FONT_PAINT_RESOLUTION, FontTransformUtil.getDesignerFontResolution()); + + mockEnvironment(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION); + Assert.assertEquals(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION, FontTransformUtil.getDesignerFontResolution()); + + } + + @Test + public void testPt2px() { + mockEnvironment(Constants.DEFAULT_FONT_PAINT_RESOLUTION); + Assert.assertEquals(12, (int) FontTransformUtil.pt2px(12)); + + mockEnvironment(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION); + Assert.assertEquals(16, (int) FontTransformUtil.pt2px(12)); + } + + @Test + public void testPx2pt() { + mockEnvironment(Constants.DEFAULT_FONT_PAINT_RESOLUTION); + Assert.assertEquals(12, (int) FontTransformUtil.px2pt(12)); + + mockEnvironment(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION); + Assert.assertEquals(9, (int) FontTransformUtil.px2pt(12)); + } + + + private void mockEnvironment(int dpi) { + ExtraDesignClassManager mockDesignManager = EasyMock.mock(ExtraDesignClassManager.class); + EasyMock.expect(mockDesignManager.getSingle(FormAdaptiveConfigUIProcessor.MARK_STRING)) + .andReturn(mockProcessor(dpi)).anyTimes(); + EasyMock.replay(mockDesignManager); + + PowerMock.mockStatic(ExtraDesignClassManager.class); + EasyMock.expect(ExtraDesignClassManager.getInstance()).andReturn(mockDesignManager).once(); + PowerMock.replayAll(ExtraDesignClassManager.class); + } + + private FormAdaptiveConfigUIProcessor mockProcessor(int dpi) { + FormAdaptiveConfigUIProcessor processor = EasyMock.mock(FormAdaptiveConfigUIProcessor.class); + EasyMock.expect(processor.fontResolution()).andReturn(dpi).once(); + EasyMock.replay(processor); + return processor; + } + +} 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 5fc09d53f1..37e6cd9dbe 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 @@ -1,5 +1,5 @@ /** - * + * */ package com.fr.design.cell.editor; @@ -8,6 +8,7 @@ import com.fr.base.BaseUtils; import com.fr.base.Utils; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.form.util.FontTransformUtil; import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.UIFormula; import com.fr.design.gui.ibutton.UIButton; @@ -21,7 +22,6 @@ import com.fr.design.style.color.UIToolbarColorButton; import com.fr.general.FRFont; import com.fr.log.FineLoggerFactory; import com.fr.report.cell.cellattr.core.RichTextConverter; -import com.fr.stable.Constants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -71,17 +71,17 @@ public class RichTextToolBar extends BasicPane{ private UIToggleButton superPane; private UIToggleButton subPane; private UIToggleButton formulaPane; - + //外部传进来的 private RichTextEditingPane textPane; public RichTextToolBar() { this.initComponents(); } - + public RichTextToolBar(RichTextEditingPane textPane) { this.textPane = textPane; - + this.initComponents(); } @@ -96,14 +96,14 @@ public class RichTextToolBar extends BasicPane{ //添加到工具栏 addToToolBar(); } - + private void initAllButton(){ fontNameComboBox = new UIComboBox(Utils.getAvailableFontFamilyNames4Report()); fontNameComboBox.setPreferredSize(new Dimension(144, 20)); fontSizeComboBox = new UIComboBox(FRFontPane.getFontSizes()); colorSelectPane = new UIToolbarColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); colorSelectPane.set4Toolbar(); - + bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); underline = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png")); @@ -120,7 +120,7 @@ public class RichTextToolBar extends BasicPane{ //绑定监听器 bindListener(); } - + private void setAllButtonStyle(){ setButtonStyle(bold); setButtonStyle(italic); @@ -129,7 +129,7 @@ public class RichTextToolBar extends BasicPane{ setButtonStyle(superPane); setButtonStyle(formulaPane); } - + private void setButtonStyle(UIButton button){ button.setNormalPainted(false); button.setBackground(null); @@ -137,10 +137,10 @@ public class RichTextToolBar extends BasicPane{ button.setPreferredSize(BUTTON_SIZE); button.setBorderPaintedOnlyWhenPressed(true); } - + private void addToToolBar(){ this.setLayout(new FlowLayout(FlowLayout.LEFT)); - + this.add(fontNameComboBox); this.add(fontSizeComboBox); this.add(bold); @@ -151,14 +151,14 @@ public class RichTextToolBar extends BasicPane{ this.add(subPane); this.add(formulaPane); } - + private void bindListener(){ FRFont defaultFont = (this.textPane != null) ? FRFont.getInstance(this.textPane.getFont()) : RichTextPane.DEFAUL_FONT; fontNameComboBox.addItemListener(fontNameItemListener); fontNameComboBox.setSelectedItem(defaultFont.getFontName()); fontSizeComboBox.addItemListener(fontSizeItemListener); fontSizeComboBox.setSelectedItem(scaleDown(defaultFont.getSize())); - + bold.addActionListener(blodChangeAction); italic.addActionListener(itaChangeAction); underline.addActionListener(underlineChangeAction); @@ -166,7 +166,7 @@ public class RichTextToolBar extends BasicPane{ superPane.addActionListener(superChangeAction); colorSelectPane.addColorChangeListener(colorChangeAction); formulaPane.addActionListener(formulaActionListener); - + //选中文字的监听器 textPane.addCaretListener(textCareListener); textPane.addMouseListener(setMouseCurrentStyle); @@ -192,32 +192,32 @@ public class RichTextToolBar extends BasicPane{ subPane.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sub_Script")); formulaPane.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula")); } - + /** * 移除输入监听 * 用于populate时, 插入字符串, 那时不需要插入监听 - * + * * * @date 2015-1-5-下午5:13:04 - * + * */ public void removeInputListener(){ this.textPane.getDocument().removeDocumentListener(inputListener); } - + /** * 增加输入监听事件 - * + * * * @date 2015-1-5-下午5:13:26 - * + * */ public void addInputListener(){ this.textPane.getDocument().addDocumentListener(inputListener); } - + private ActionListener blodChangeAction = new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { boolean isBold = RichTextToolBar.this.bold.isSelected(); @@ -227,9 +227,9 @@ public class RichTextToolBar extends BasicPane{ setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } }; - + private ActionListener itaChangeAction = new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { boolean isIta = RichTextToolBar.this.italic.isSelected(); @@ -239,9 +239,9 @@ public class RichTextToolBar extends BasicPane{ setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } }; - + private ActionListener underlineChangeAction = new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { boolean isUnder = RichTextToolBar.this.underline.isSelected(); @@ -252,7 +252,7 @@ public class RichTextToolBar extends BasicPane{ } }; private ActionListener subChangeAction = new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { boolean isSub = RichTextToolBar.this.subPane.isSelected(); @@ -263,7 +263,7 @@ public class RichTextToolBar extends BasicPane{ } }; private ActionListener superChangeAction = new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { boolean isSuper = RichTextToolBar.this.superPane.isSelected(); @@ -273,7 +273,7 @@ public class RichTextToolBar extends BasicPane{ setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } }; - + private ChangeListener colorChangeAction = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { @@ -285,13 +285,13 @@ public class RichTextToolBar extends BasicPane{ setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } }; - + // 设置文本区选择文本的样式 private void setCharacterAttributes(JEditorPane editor, AttributeSet attr, boolean replace) { //注意不要失焦 textPane.requestFocus(); - + // 取得选择文本的起始位置和结束位置 int start = editor.getSelectionStart(); int end = editor.getSelectionEnd(); @@ -303,19 +303,19 @@ public class RichTextToolBar extends BasicPane{ doc.setCharacterAttributes(start, end - start, attr, replace); } } - + private ItemListener fontSizeItemListener = new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { int fontSize = (Integer) RichTextToolBar.this.fontSizeComboBox.getSelectedItem(); - fontSize = scaleUp(fontSize); + fontSize= scaleUp(fontSize); // 调用setCharacterAttributes函数设置文本区选择文本的字体 MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setFontSize(attr, fontSize); setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } }; - + private ItemListener fontNameItemListener = new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { @@ -326,7 +326,7 @@ public class RichTextToolBar extends BasicPane{ setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } }; - + private ActionListener formulaActionListener = new ActionListener() { public void actionPerformed(ActionEvent evt) { final UIFormula formulaPane = FormulaFactory.createFormulaPane(); @@ -348,7 +348,7 @@ public class RichTextToolBar extends BasicPane{ }).setVisible(true); } }; - + private int roundUp(double num){ String numStr = Double.toString(num); numStr = new BigDecimal(numStr).setScale(0, BigDecimal.ROUND_HALF_UP).toString(); @@ -356,7 +356,7 @@ public class RichTextToolBar extends BasicPane{ } private CaretListener textCareListener = new CaretListener() { - + //根据选中部分的文字样式, 来动态显示工具栏上按钮的状态 private void setSelectedCharStyle(int start, int end, StyledDocument doc){ boolean isBold = true; @@ -367,11 +367,11 @@ public class RichTextToolBar extends BasicPane{ String fontName_1st = null; int fontSize_1st = 0; Color fontColor_1st = null; - + for (int i = start; i < end; i++) { Element ele = doc.getCharacterElement(i); AttributeSet attrs = ele.getAttributes(); - + //粗体 isBold = isBold && StyleConstants.isBold(attrs); //斜体 @@ -382,22 +382,22 @@ public class RichTextToolBar extends BasicPane{ isSubscript = isSubscript && StyleConstants.isSubscript(attrs); //上标 isSuperscript = isSuperscript && StyleConstants.isSuperscript(attrs); - + if(i == start){ - fontName_1st = (String) attrs.getAttribute(StyleConstants.FontFamily); - fontSize_1st = (Integer) attrs.getAttribute(StyleConstants.FontSize); + fontName_1st = (String) attrs.getAttribute(StyleConstants.FontFamily); + fontSize_1st = (Integer) attrs.getAttribute(StyleConstants.FontSize); fontColor_1st = (Color) attrs.getAttribute(StyleConstants.Foreground); fontColor_1st = fontColor_1st == null ? Color.BLACK : fontColor_1st; } } - setButtonSelected(isBold, isItalic, isUnderline, isSubscript, isSuperscript, + setButtonSelected(isBold, isItalic, isUnderline, isSubscript, isSuperscript, fontName_1st, fontSize_1st, fontColor_1st); } - + //动态显示工具栏上按钮的状态 - private void setButtonSelected(boolean isBold, boolean isItalic, boolean isUnderline, - boolean isSubscript, boolean isSuperscript, String fontName_1st, + private void setButtonSelected(boolean isBold, boolean isItalic, boolean isUnderline, + boolean isSubscript, boolean isSuperscript, String fontName_1st, int fontSize_1st, Color fontColor_1st){ bold.setSelected(isBold); italic.setSelected(isItalic); @@ -412,75 +412,75 @@ public class RichTextToolBar extends BasicPane{ fontSizeComboBox.addItemListener(fontSizeItemListener); selectColorPane(fontColor_1st); } - + private void selectColorPane(Color color){ colorSelectPane.removeColorChangeListener(colorChangeAction); colorSelectPane.setColor(color); colorSelectPane.addColorChangeListener(colorChangeAction); } - + @Override public void caretUpdate(CaretEvent e) { StyledDocument doc = (StyledDocument) textPane.getDocument(); - + // 取得选择文本的起始位置和结束位置 int start = textPane.getSelectionStart(); int end = textPane.getSelectionEnd(); - + //如果没有选定字符 if(end == start){ return; } - + setSelectedCharStyle(start, end, doc); } }; - + //设置当前光标位样式 private MouseListener setMouseCurrentStyle = new MouseAdapter() { - + @Override public void mouseClicked(MouseEvent e) { StyledDocument doc = (StyledDocument) textPane.getDocument(); - + // 取得选择文本的起始位置和结束位置 int start = textPane.getSelectionStart(); int end = textPane.getSelectionEnd(); - + if(start != end){ return; } - + setToLastCharStyle(end, doc); } - + //如果默认不选字符, 那么设置为最后一个字符的样式 private void setToLastCharStyle(int end, StyledDocument doc){ if(textPane.isUpdating()){ return; } - + //取前一个字符的样式 Element ele = doc.getCharacterElement(end - 1); AttributeSet attrs = ele.getAttributes(); populateToolBar(attrs); } }; - + /** * 从样式中更新工具栏上的按钮状态 - * + * * @param attrs 样式 - * + * * * @date 2015-1-5-下午5:12:33 - * + * */ public void populateToolBar(AttributeSet attrs){ int size = scaleDown(StyleConstants.getFontSize(attrs)); fontNameComboBox.setSelectedItem(StyleConstants.getFontFamily(attrs)); fontSizeComboBox.setSelectedItem(size); - + bold.setSelected(StyleConstants.isBold(attrs)); italic.setSelected(StyleConstants.isItalic(attrs)); underline.setSelected(StyleConstants.isUnderline(attrs)); @@ -491,31 +491,23 @@ public class RichTextToolBar extends BasicPane{ colorSelectPane.setColor(foreGround); colorSelectPane.repaint(); } - + //pt转为px =*4/3 - private int scaleUp(int fontSize){ - return scale(fontSize, true); + private int scaleUp(int fontSize) { + return (int) FontTransformUtil.pt2px(fontSize); } - + //px转pt = *3/4 - private int scaleDown(int fontSize){ - return scale(fontSize, false); - } - - private int scale(int fontSize, boolean isUp){ - double dpi96 = Constants.FR_PAINT_RESOLUTION; - double dpi72 = Constants.DEFAULT_FONT_PAINT_RESOLUTION; - double scale = isUp ? (dpi96 / dpi72) : (dpi72 / dpi96); - - return roundUp(fontSize * scale); + private int scaleDown(int fontSize) { + return (int) FontTransformUtil.px2pt(fontSize); } - + private DocumentListener inputListener = new DocumentListener() { - + @Override public void removeUpdate(DocumentEvent e) { } - + @Override public void insertUpdate(DocumentEvent e) { //标志正在更新内容 @@ -523,7 +515,7 @@ public class RichTextToolBar extends BasicPane{ final MutableAttributeSet attr = updateStyleFromToolBar(); final int start = textPane.getSelectionStart(); int end = textPane.getSelectionEnd(); - + if (start != end) { textPane.finishUpdating(); return; @@ -538,19 +530,19 @@ public class RichTextToolBar extends BasicPane{ } }); } - + //根据Style来显示populate按钮 private void changeContentStyle(int start, MutableAttributeSet attr){ changeContentStyle(start, attr, 1); } - + private void changeContentStyle(int start, MutableAttributeSet attr, int contentLength){ // 将所选文本设置为新的样式,replace为false表示不覆盖原有的样式 StyledDocument doc = (StyledDocument) textPane.getDocument(); doc.setCharacterAttributes(start, contentLength, attr, false); textPane.finishUpdating(); } - + //将界面上的设置赋值给输入的字符 private MutableAttributeSet updateStyleFromToolBar(){ final boolean isBold = bold.isSelected(); @@ -561,7 +553,7 @@ public class RichTextToolBar extends BasicPane{ final String fontName = (String) fontNameComboBox.getSelectedItem(); final int fontSize = scaleUp((Integer) fontSizeComboBox.getSelectedItem()); final Color foreGround = colorSelectPane.getColor() == null ? Color.BLACK : colorSelectPane.getColor(); - + MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setBold(attr, isBold); StyleConstants.setItalic(attr, isItalic); @@ -571,7 +563,7 @@ public class RichTextToolBar extends BasicPane{ StyleConstants.setForeground(attr, foreGround); StyleConstants.setFontFamily(attr, fontName); StyleConstants.setFontSize(attr, fontSize); - + return attr; } @@ -581,7 +573,7 @@ public class RichTextToolBar extends BasicPane{ private int inputStart = NOT_INITED; private static final int JDK_6 = 6; private static final int JDK_7 = 7; - + @Override public void changedUpdate(DocumentEvent e) { //这边需要注意, jdk1.6和1.7对于输入法的处理逻辑不一样, jdk6时直接在输入法中输入一大段中文 @@ -595,7 +587,7 @@ public class RichTextToolBar extends BasicPane{ StyledDocument doc = (StyledDocument) textPane.getDocument(); final String content; initFlag(doc); - + final int start = textPane.getSelectionStart(); final int inputLen = start - inputStart; //检测输入内容 @@ -604,7 +596,7 @@ public class RichTextToolBar extends BasicPane{ } catch (BadLocationException e1) { return; } - + //中文输入法, 默认输入字符会被输入法的框截取住, jtextpane得到是一个空格, 此时不做处理 if(StringUtils.isBlank(content) || inputLen <= 0){ return; @@ -613,7 +605,7 @@ public class RichTextToolBar extends BasicPane{ setContentStyle(inputLen); } } - + private void setContentStyle(final int inputLen){ //缓存下Start, 下面要用来设置样式 final int _start = inputStart; @@ -632,15 +624,15 @@ public class RichTextToolBar extends BasicPane{ } }); } - + private boolean isUpdating(){ return inputStart == UPDATING; } - + private void startUpdating(){ inputStart = UPDATING; } - + //初始标记状态, 用于记录中文输入法多个字符同时输入的问题 private void initFlag(StyledDocument doc){ if(inputStart != NOT_INITED){ @@ -648,7 +640,7 @@ public class RichTextToolBar extends BasicPane{ } inputStart = textPane.getSelectionStart() - 1; } - + //重置标记状态 private void resetFlag(){ inputStart = NOT_INITED; From 8c6d591ffb458fcdae72cc201340fa7c4204c55a Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 14 May 2020 16:16:29 +0800 Subject: [PATCH 2/2] =?UTF-8?q?REPORT-31475=20=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/info/ComponentOperate.java | 18 +++++++++++---- .../template/info/JFormProcessInfo.java | 3 +++ .../info/ComponentCreateOperateTest.java | 22 ++++++++++++++++++- .../template/info/JFormProcessInfoTest.java | 4 ++++ 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/template/info/ComponentOperate.java b/designer-form/src/main/java/com/fr/design/mainframe/template/info/ComponentOperate.java index b6fd79d270..0791e42d4a 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/template/info/ComponentOperate.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/template/info/ComponentOperate.java @@ -7,7 +7,10 @@ import com.fr.form.ui.Widget; import com.fr.form.ui.container.WAbsoluteBodyLayout; import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WCardLayout; +import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.container.WTitleLayout; +import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; +import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.general.ComparatorUtils; import com.fr.json.JSONObject; @@ -24,13 +27,20 @@ public abstract class ComponentOperate implements TemplateOperate { private Widget widget; public ComponentOperate(Widget widget) { - if (widget.acceptType(WTitleLayout.class)) { - this.widget = ((WTitleLayout) widget).getBodyBoundsWidget().getWidget(); - }else { - this.widget = widget; + Widget innerWidget = widget; + if (innerWidget.acceptType(WScaleLayout.class)) { + Widget crBoundsWidget = ((WScaleLayout) innerWidget).getBoundsWidget(); + innerWidget = ((CRBoundsWidget) crBoundsWidget).getWidget(); + } else if (innerWidget.acceptType(WTitleLayout.class)) { + CRBoundsWidget crBoundsWidget = ((WTitleLayout) innerWidget).getBodyBoundsWidget(); + innerWidget = crBoundsWidget.getWidget(); + } else if (innerWidget.acceptType(WCardMainBorderLayout.class)){ + innerWidget = ((WCardMainBorderLayout) widget).getCardPart(); } + this.widget = innerWidget; } + @Override public JSONObject toJSONObject() { JSONObject jo = new JSONObject(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java b/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java index c9f7d761ea..180215a247 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java @@ -226,6 +226,9 @@ public class JFormProcessInfo extends TemplateProcessInfo
{ private void addComponentRemoveInfo(JSONObject jsonObject) { String componentID = jsonObject.getString("componentID"); + if (componentID == null){ + return; + } JSONObject info = componentProcessInfoMap.get(componentID); if (info == null) { info = jsonObject; diff --git a/designer-form/src/test/java/com/fr/design/mainframe/template/info/ComponentCreateOperateTest.java b/designer-form/src/test/java/com/fr/design/mainframe/template/info/ComponentCreateOperateTest.java index e11c33c555..474f580e3d 100644 --- a/designer-form/src/test/java/com/fr/design/mainframe/template/info/ComponentCreateOperateTest.java +++ b/designer-form/src/test/java/com/fr/design/mainframe/template/info/ComponentCreateOperateTest.java @@ -5,11 +5,15 @@ import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.ChartEditor; import com.fr.form.ui.ElementCaseEditor; import com.fr.form.ui.FreeButton; +import com.fr.form.ui.TextEditor; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WAbsoluteBodyLayout; import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WCardLayout; +import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.container.WTitleLayout; +import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; +import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.general.ComparatorUtils; import com.fr.json.JSONObject; import org.junit.Assert; @@ -23,7 +27,7 @@ import java.awt.Rectangle; public class ComponentCreateOperateTest { @Test - public void testConstructor(){ + public void testConstructor() { ElementCaseEditor caseEditor = new ElementCaseEditor(); caseEditor.setWidgetName("report0"); caseEditor.setWidgetID("xxxx0"); @@ -32,6 +36,22 @@ public class ComponentCreateOperateTest { ComponentOperate componentOperate0 = new ComponentCreateOperate(caseEditor); ComponentOperate componentOperate1 = new ComponentCreateOperate(wTitleLayout); ComparatorUtils.equals(componentOperate0.toJSONObject(), componentOperate1.toJSONObject()); + + WScaleLayout scaleLayout = new WScaleLayout(); + TextEditor textEditor = new TextEditor(); + scaleLayout.addWidget(new CRBoundsWidget(textEditor, new Rectangle())); + ComponentOperate componentOperate3 = new ComponentCreateOperate(scaleLayout); + ComponentOperate componentOperate4 = new ComponentCreateOperate(textEditor); + ComparatorUtils.equals(componentOperate3.toJSONObject(), componentOperate4.toJSONObject()); + + + WCardMainBorderLayout wCardMainBorderLayout = new WCardMainBorderLayout(); + WCardLayout wCardLayout = new WCardLayout(); + wCardMainBorderLayout.addCenter(wCardLayout); + ComponentOperate componentOperate5 = new ComponentCreateOperate(wCardMainBorderLayout); + ComponentOperate componentOperate6 = new ComponentCreateOperate(wCardLayout); + ComparatorUtils.equals(componentOperate5.toJSONObject(), componentOperate6.toJSONObject()); + } @Test diff --git a/designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java b/designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java index 2d25c64c9f..663be87581 100644 --- a/designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java +++ b/designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java @@ -143,6 +143,10 @@ public class JFormProcessInfoTest { JSONArray ja = jFormProcessInfo.getComponentsInfo(); Assert.assertEquals(2, ja.size()); + Reflect.on(jFormProcessInfo).call("addComponentCreateInfo", new ComponentCreateOperate(button1).toJSONObject()); + FreeButton button3 = new FreeButton(); + Reflect.on(jFormProcessInfo).call("addComponentRemoveInfo", new ComponentDeleteOperate(button3).toJSONObject()); + Assert.assertEquals(1, jFormProcessInfo.getComponentsInfo().size()); ja = jFormProcessInfo.getComponentsInfo(); Assert.assertEquals(0, ja.size());