You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
5.6 KiB
170 lines
5.6 KiB
package com.fr.quickeditor.cellquick; |
|
|
|
import com.fr.base.Formula; |
|
import com.fr.base.Style; |
|
import com.fr.base.TextFormat; |
|
import com.fr.design.gui.itextarea.UITextArea; |
|
import com.fr.grid.GridKeyListener; |
|
import com.fr.grid.selection.CellSelection; |
|
import com.fr.quickeditor.CellQuickEditor; |
|
import com.fr.report.ReportHelper; |
|
import com.fr.report.cell.DefaultTemplateCellElement; |
|
import com.fr.stable.ColumnRow; |
|
import com.fr.stable.StringUtils; |
|
|
|
import javax.swing.*; |
|
import javax.swing.event.DocumentEvent; |
|
import javax.swing.event.DocumentListener; |
|
import java.awt.*; |
|
import java.awt.event.KeyAdapter; |
|
import java.awt.event.KeyEvent; |
|
|
|
/** |
|
* |
|
*/ |
|
public class CellStringQuickEditor extends CellQuickEditor { |
|
//文本域 直接可以自适应大小 |
|
private UITextArea stringTextArea; |
|
//编辑状态 |
|
private boolean isEditing = false; |
|
|
|
//august:如果是原来编辑的是公式,要保留公式里的这些属性,不然在公式和字符串转化时,就会丢失这些属性设置。 |
|
private boolean reserveInResult = false; |
|
private boolean reserveOnWriteOrAnaly = true; |
|
|
|
private DocumentListener documentListener = new DocumentListener() { |
|
@Override |
|
public void insertUpdate(DocumentEvent e) { |
|
changeReportPaneCell(stringTextArea.getText().trim()); |
|
} |
|
|
|
@Override |
|
public void removeUpdate(DocumentEvent e) { |
|
changeReportPaneCell(stringTextArea.getText().trim()); |
|
} |
|
|
|
@Override |
|
public void changedUpdate(DocumentEvent e) { |
|
changeReportPaneCell(stringTextArea.getText().trim()); |
|
} |
|
|
|
}; |
|
|
|
private CellStringQuickEditor() { |
|
super(); |
|
} |
|
|
|
/** |
|
* 详细信息面板 |
|
*/ |
|
@Override |
|
public JComponent createCenterBody() { |
|
JPanel content = new JPanel(new BorderLayout()); |
|
stringTextArea = new UITextArea(); |
|
stringTextArea.addKeyListener(new KeyAdapter() { |
|
|
|
@Override |
|
public void keyPressed(KeyEvent e) { |
|
if (tc == null) { |
|
return; |
|
} |
|
if (e.getKeyCode() == KeyEvent.VK_ENTER) { |
|
//todo 按enter键换至下一个单元格 yaoh.wu虽然模仿选中单元格按enter这种场景可以做到,但是原理没有弄清楚。 |
|
GridKeyListener dispatchListener = new GridKeyListener(tc.getGrid()); |
|
dispatchListener.keyPressed(e); |
|
dispatchListener.keyTyped(e); |
|
} |
|
} |
|
|
|
@Override |
|
public void keyReleased(KeyEvent e) { |
|
if (tc != null) { |
|
if (e.getKeyCode() == KeyEvent.VK_ENTER) { |
|
return; |
|
} |
|
tc.getGrid().dispatchEvent(e); |
|
} |
|
} |
|
}); |
|
content.add(stringTextArea, BorderLayout.CENTER); |
|
return content; |
|
} |
|
|
|
|
|
private void changeReportPaneCell(String tmpText) { |
|
isEditing = true; |
|
//refresh一下,如果单元格内有新添加的控件,此时并不知道 |
|
CellSelection cs1 = (CellSelection) tc.getSelection(); |
|
ColumnRow columnRow = ColumnRow.valueOf(cs1.getColumn(), cs1.getRow()); |
|
columnRowTextField.setText(columnRow.toString()); |
|
cellElement = tc.getEditingElementCase().getTemplateCellElement(cs1.getColumn(), cs1.getRow()); |
|
|
|
if (cellElement == null) { |
|
CellSelection cs = (CellSelection) tc.getSelection(); |
|
cellElement = new DefaultTemplateCellElement(cs.getColumn(), cs.getRow()); |
|
tc.getEditingElementCase().addCellElement(cellElement, false); |
|
} |
|
if (tmpText != null && (tmpText.length() > 0 && tmpText.charAt(0) == '=')) { |
|
Formula textFormula = new Formula(tmpText); |
|
textFormula.setReserveInResult(reserveInResult); |
|
textFormula.setReserveOnWriteOrAnaly(reserveOnWriteOrAnaly); |
|
cellElement.setValue(textFormula); |
|
} else { |
|
Style style = cellElement.getStyle(); |
|
if (style != null && style.getFormat() != null && style.getFormat() == TextFormat.getInstance()) { |
|
cellElement.setValue(tmpText); |
|
} else { |
|
cellElement.setValue(ReportHelper.convertGeneralStringAccordingToExcel(tmpText)); |
|
} |
|
} |
|
fireTargetModified(); |
|
stringTextArea.requestFocus(); |
|
isEditing = false; |
|
} |
|
|
|
/** |
|
* 刷新详细内容 |
|
*/ |
|
@Override |
|
protected void refreshDetails() { |
|
String str; |
|
if (cellElement == null) { |
|
str = StringUtils.EMPTY; |
|
} else { |
|
Object value = cellElement.getValue(); |
|
if (value == null) { |
|
str = StringUtils.EMPTY; |
|
} else if (value instanceof Formula) { |
|
Formula formula = (Formula) value; |
|
str = formula.getContent(); |
|
reserveInResult = formula.isReserveInResult(); |
|
reserveOnWriteOrAnaly = formula.isReserveOnWriteOrAnaly(); |
|
} else { |
|
str = value.toString(); |
|
} |
|
} |
|
showText(str); |
|
stringTextArea.setEditable(tc.isSelectedOneCell()); |
|
} |
|
|
|
/** |
|
* 显示文本 |
|
* |
|
* @param str 文本 |
|
*/ |
|
public void showText(String str) { |
|
// 正在编辑时不处理 |
|
if (isEditing) { |
|
return; |
|
} |
|
stringTextArea.getDocument().removeDocumentListener(documentListener); |
|
stringTextArea.setText(str); |
|
stringTextArea.getDocument().addDocumentListener(documentListener); |
|
} |
|
|
|
@Override |
|
public Object getComboBoxSelected() { |
|
return null; |
|
} |
|
|
|
} |