@ -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 , tru e) ;
private int scaleUp ( int fontSize ) {
return ( int ) FontTransformUtil . pt2px ( fontSiz e) ;
}
//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 ;