Browse Source

Pull request #1666: REPORT-30739 && REPORT-31475 【10.0.6开接口】字体统一改成像素的可行性研究,及开接口

Merge in DESIGN/design from ~KERRY/design_10.0:release/10.0 to release/10.0

* commit '8c6d591ffb458fcdae72cc201340fa7c4204c55a':
  REPORT-31475 问题修复
  REPORT-30739【10.0.6开接口】字体统一改成像素的可行性研究,及开接口
feature/big-screen
kerry 4 years ago
parent
commit
008de4f0a0
  1. 7
      designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java
  2. 30
      designer-form/src/main/java/com/fr/design/designer/creator/XButton.java
  3. 5
      designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java
  4. 46
      designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java
  5. 18
      designer-form/src/main/java/com/fr/design/mainframe/template/info/ComponentOperate.java
  6. 3
      designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java
  7. 68
      designer-form/src/test/java/com/fr/design/form/util/FontTransformUtilTest.java
  8. 22
      designer-form/src/test/java/com/fr/design/mainframe/template/info/ComponentCreateOperateTest.java
  9. 4
      designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java
  10. 180
      designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java

7
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();
}

30
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());
}

5
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());
}
}

46
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();
}
}

18
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();

3
designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java

@ -226,6 +226,9 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
private void addComponentRemoveInfo(JSONObject jsonObject) {
String componentID = jsonObject.getString("componentID");
if (componentID == null){
return;
}
JSONObject info = componentProcessInfoMap.get(componentID);
if (info == null) {
info = jsonObject;

68
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;
}
}

22
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

4
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());

180
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;

Loading…
Cancel
Save