帆软报表设计器源代码。
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.
 
 
 
 

590 lines
23 KiB

package com.fr.design.report;
import com.fr.base.GraphHelper;
import com.fr.design.border.UIRoundedBorder;
import com.fr.design.border.UITitledBorder;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.ibutton.UIRadioButton;
import com.fr.design.gui.ibutton.UIToggleButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UIBasicSpinner;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.utils.DesignUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.FRFont;
import com.fr.general.IOUtils;
import com.fr.report.stable.WorkSheetAttr;
import com.fr.report.worksheet.WorkSheet;
import com.fr.stable.ColumnRow;
import com.fr.stable.Constants;
import com.fr.stable.StringUtils;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ReportColumnsPane extends BasicPane{
public static final int ROW = 0;
public static final int COLUMN = 1;
private int rowOrColumn;
private boolean isRepeate;
private static final String[] COLUMN_ROW_TEXTS = {
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Rows"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Columns")
};
private static final String[] SHOW_BLANK = {
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Blank_Row"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Blank_Column")
};
private static final String[] REPORT_COLUMN_RAPEAT = {
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Columns_Repeat_Row"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Columns_Repeat_Column")
};
private static final int FONT_SIZE = 14;
private UIButtonGroup onOffButtonGroup;
private UIRadioButton rowButton;
private UIRadioButton colButton;
// 行分行
private UIRadioButton maxRadioButton;
private UIBasicSpinner maxNumberSpinner;
private UILabel maxUILabel;
private UIRadioButton toXRadioButton;
private UIBasicSpinner toXSpinner;
private UILabel toUILabel;
private UITextField repeatColDataTextField;
private UILabel copyLabel;
private UITextField copyTitleTextField;
private UICheckBox showBlankCheckBox ;
public ReportColumnsPane() {
this.rowOrColumn = ROW;
this.setLayout(FRGUIPaneFactory.createBorderLayout());
JPanel north = new JPanel(new BorderLayout()) {
public void paint(Graphics g) {
super.paint(g);
super.paintBorder(g);
}
};
north.setPreferredSize(new Dimension(549, 59));
north.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(11, 23, 6, 23), new UIRoundedBorder(new Color(204, 204, 204), 1, 10)));
String[] textArray = new String[] {
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_TurnOn"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_TurnOff")
};
onOffButtonGroup = new UIButtonGroup(textArray) {
@Override
protected void initButton(UIToggleButton labelButton) {
labelButton.setSize(new Dimension(60,20));
labelButton.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.ReportColumnsPane.labelButton"));
super.initButton(labelButton);
}
};
onOffButtonGroup.addActionListener(onOffListener);
UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportColumns_Columns"));
FRFont uiLableFont = DesignUtils.getDefaultGUIFont().applySize(FONT_SIZE);
uiLabel.setFont(uiLableFont);
uiLabel.setHorizontalAlignment(SwingConstants.CENTER);
int uiLabelWidth = GraphHelper.getWidth(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportColumns_Columns"), uiLableFont);
uiLabel.setPreferredSize(new Dimension(uiLabelWidth, 20));
north.add(uiLabel,BorderLayout.WEST);
JPanel buttonGroupPane = new JPanel(new FlowLayout(FlowLayout.CENTER, 23,11));
buttonGroupPane.add(onOffButtonGroup);
north.add(buttonGroupPane, BorderLayout.EAST);
this.add(north, BorderLayout.NORTH);
this.add(createRowColumnPane(), BorderLayout.CENTER);
}
private ActionListener onOffListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ReportColumnsPane.this.isRepeate = onOffButtonGroup.getSelectedIndex() == 0;
checkEnable();
}
};
@Override
protected String title4PopupWindow() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportColumns_Report_Columns");
}
private void checkEnable() {
if (isRepeate) {
rowButton.setSelected(!colButton.isSelected());
this.maxRadioButton.setSelected(!this.toXRadioButton.isSelected());
}
rowButton.setEnabled(isRepeate);
colButton.setEnabled(isRepeate);
maxNumberSpinner.setEnabled(isRepeate && maxRadioButton.isSelected());
toXSpinner.setEnabled(isRepeate && toXRadioButton.isSelected());
maxRadioButton.setEnabled(isRepeate);
toXRadioButton.setEnabled(isRepeate);
repeatColDataTextField.setEnabled(isRepeate);
copyTitleTextField.setEnabled(isRepeate);
showBlankCheckBox.setEnabled(isRepeate);
setAllLableEnabled(this, isRepeate);
}
private void setAllLableEnabled (Container container, boolean flag) {
for (int i = 0, len = container.getComponentCount(); i < len; i++){
Component child = container.getComponent(i);
if (child instanceof UILabel) {
child.setEnabled(flag);
} else if (child instanceof Container) {
setAllLableEnabled((Container)child, flag);
}
}
}
private void colOrRowConvert() {
maxUILabel.setText(COLUMN_ROW_TEXTS[rowOrColumn]);
toUILabel.setText(COLUMN_ROW_TEXTS[1 - rowOrColumn]);
showBlankCheckBox.setText(SHOW_BLANK[rowOrColumn]);
copyLabel.setText(REPORT_COLUMN_RAPEAT[rowOrColumn] + ":");
}
/**
* 创建分栏页面
*/
private JPanel createRowColumnPane() {
JPanel divideRowPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
divideRowPane.setBorder(BorderFactory.createEmptyBorder(0,21,0,21));
JPanel center = FRGUIPaneFactory.createBorderLayout_S_Pane();
// 行分栏样式
JPanel north = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Column_Style"));
north.setPreferredSize(new Dimension(549, 216));
north.add(createSamplePane());
north.add(createRowMaxOrSetPane());
center.add(createRowPane(), BorderLayout.NORTH);
JPanel xx = new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
showBlankCheckBox = new UICheckBox(SHOW_BLANK[rowOrColumn]);
xx.add(showBlankCheckBox);
center.add(xx, BorderLayout.CENTER);
divideRowPane.add(north, BorderLayout.NORTH);
divideRowPane.add(center, BorderLayout.CENTER);
return divideRowPane;
}
/**
* 创建示例页面
*/
private JPanel createSamplePane() {
JPanel sampleLablePane = new JPanel(new GridLayout(1,2));
sampleLablePane.setPreferredSize(new Dimension(524, 130));
JPanel rPane = new JPanel();
UILabel rLabel = new UILabel(IOUtils.readIcon("/com/fr/design/images/reportcolumns/" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Row_Icon_File_Name")));
rLabel.setBorder(BorderFactory.createEmptyBorder(5,45,0,49));
rPane.add(rLabel);
rowButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportColumns_Columns_Horizontally"));
rowButton.addActionListener(rowChangeListener);
rPane.add(rowButton);
sampleLablePane.add(rPane);
JPanel cPane = new JPanel();
UILabel cLabel = new UILabel(IOUtils.readIcon("/com/fr/design/images/reportcolumns/" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Col_Icon_File_Name")));
cLabel.setBorder(BorderFactory.createEmptyBorder(5,49,0,49));
cPane.add(cLabel);
colButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportColumns_Columns_Vertically"));
colButton.addActionListener(colChangeListener);
cPane.add(colButton);
sampleLablePane.add(cPane);
return sampleLablePane;
}
private ActionListener rowChangeListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!rowButton.isSelected()) {
rowButton.setSelected(true);
}else{
colButton.setSelected(false);
ReportColumnsPane.this.rowOrColumn = ROW;
emptyValueConvert();
}
}
};
private ActionListener colChangeListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!colButton.isSelected()) {
colButton.setSelected(true);
}else{
rowButton.setSelected(false);
ReportColumnsPane.this.rowOrColumn = COLUMN;
emptyValueConvert();
}
}
};
private void emptyValueConvert(){
maxNumberSpinner.setValue(0);
toXSpinner.setValue(0);
colOrRowConvert();
}
private JPanel createRowMaxOrSetPane() {
JPanel RowMaxOrSetPane = new JPanel();
RowMaxOrSetPane.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0));
RowMaxOrSetPane.setLayout(new FlowLayout(FlowLayout.LEFT,25,2));
//marks:在多少行后开始分栏
maxRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportColumns_Columns_After"));
maxNumberSpinner = new UIBasicSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1));
GUICoreUtils.setColumnForSpinner(maxNumberSpinner, 6);
maxRadioButton.addActionListener(maxBtnListener);
maxUILabel = new UILabel(COLUMN_ROW_TEXTS[rowOrColumn] );
JPanel maxRowRadioPane = GUICoreUtils.createFlowPane(new JComponent[]{maxRadioButton, maxNumberSpinner, maxUILabel, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Report_Columns_Columns_Optional"))}, FlowLayout.CENTER);
RowMaxOrSetPane.add(maxRowRadioPane);
//marks:分成多少行
toXRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ReportColumns_Columns_To"));
toXRadioButton.addActionListener(toXBtnListener);
toXSpinner = new UIBasicSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1));
GUICoreUtils.setColumnForSpinner(toXSpinner, 6);
toUILabel = new UILabel(COLUMN_ROW_TEXTS[1 - rowOrColumn]);
JPanel setRowRadioPane = GUICoreUtils.createFlowPane(new JComponent[]{toXRadioButton, toXSpinner, toUILabel}, FlowLayout.CENTER);
RowMaxOrSetPane.add(setRowRadioPane);
return RowMaxOrSetPane;
}
private ActionListener toXBtnListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (toXRadioButton.isSelected()) {
toXSpinner.setEnabled(true);
maxNumberSpinner.setEnabled(false);
maxRadioButton.setSelected(false);
} else {
toXRadioButton.setSelected(true);
}
}
};
private ActionListener maxBtnListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (maxRadioButton.isSelected()) {
maxNumberSpinner.setEnabled(true);
toXRadioButton.setSelected(false);
toXSpinner.setEnabled(false);
} else {
maxRadioButton.setSelected(true);
}
}
};
/**
* 创建行分栏界面
*/
private JPanel createRowPane() {
JPanel rowPane = new JPanel();
UITitledBorder explainBorder = UITitledBorder.createBorderWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Column_Area"));
rowPane.setBorder(explainBorder);
rowPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5,13));
rowPane.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.ReportColumnsPane.createRowPane.rowPane"));
rowPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Column_Data") + ":"));
repeatColDataTextField = new UITextField();
repeatColDataTextField.setPreferredSize(DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.ReportColumnsPane.createRowPane.repeatColDataTextField"));
rowPane.add(repeatColDataTextField);
rowPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Format") + ": A2:D5 "));
copyLabel = new UILabel(REPORT_COLUMN_RAPEAT[rowOrColumn] + ":");
rowPane.add(copyLabel);
copyTitleTextField = new UITextField();
copyTitleTextField.setPreferredSize(new Dimension(107,24));
rowPane.add(copyTitleTextField);
rowPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Format") + ": 1,2-3,5,18"));
return rowPane;
}
/**
* 从worksheetAttr中populate数据给界面
*
* @param attr 当前ElementCase的worksheet属性
* @param rowCount 总行数
* @param colCount 总列数
*/
public void populate(WorkSheetAttr attr, int rowCount, int colCount){
this.isRepeate = true;
switch (attr.getDirection()) {
case Constants.TOP_TO_BOTTOM:
populateTopBottom(attr);
setValueText(attr, rowCount, colCount, repeatColDataTextField, copyTitleTextField, showBlankCheckBox);
break;
case Constants.LEFT_TO_RIGHT:
populateLeftRight(attr);
setValueText(attr, rowCount, colCount ,repeatColDataTextField, copyTitleTextField, showBlankCheckBox);
break;
default:
this.onOffButtonGroup.setSelectedIndex(1);
this.isRepeate = false;
break;
}
colOrRowConvert();
checkEnable();
}
/**
* populate列分栏数据
*/
private void populateLeftRight(WorkSheetAttr attr){
this.rowOrColumn = COLUMN;
this.onOffButtonGroup.setSelectedIndex(0);
this.colButton.setSelected(true);
this.rowButton.setSelected(false);
this.maxNumberSpinner.setEnabled(false);
this.toXSpinner.setEnabled(false);
if (attr.getCount() > -1 && attr.getCount() < Integer.MAX_VALUE) {
this.toXRadioButton.setSelected(true);
this.toXSpinner.setValue(new Integer(attr.getCount()));
this.toXSpinner.setEnabled(true);
} else if (attr.getMaxCount() > -1 && attr.getMaxCount() < Integer.MAX_VALUE) {
this.maxRadioButton.setSelected(true);
this.maxNumberSpinner.setValue(new Integer(attr.getMaxCount()));
this.maxNumberSpinner.setEnabled(true);
}
}
/**
* populate行分栏
*/
private void populateTopBottom(WorkSheetAttr attr){
this.onOffButtonGroup.setSelectedIndex(0);
this.rowButton.setSelected(true);
this.colButton.setSelected(false);
this.rowOrColumn = ROW;
this.maxNumberSpinner.setEnabled(false);
this.toXSpinner.setEnabled(false);
if (attr.getCount() > -1 && attr.getCount() < Integer.MAX_VALUE) {
this.toXRadioButton.setSelected(true);
this.toXSpinner.setValue(new Integer(attr.getCount()));
this.toXSpinner.setEnabled(true);
} else if (attr.getMaxCount() > -1 && attr.getMaxCount() < Integer.MAX_VALUE) {
this.maxRadioButton.setSelected(true);
this.maxNumberSpinner.setValue(new Integer(attr.getMaxCount()));
this.maxNumberSpinner.setEnabled(true);
}
}
/**
* 从worksheet中populate数据
*
* @param worksheet 当前worksheet
*/
public void populate(WorkSheet worksheet) {
if (worksheet == null) {
return;
}
WorkSheetAttr attr = worksheet.getWorkSheetAttr();
if (attr == null) {
attr = new WorkSheetAttr();
}
int rowCount = worksheet.getRowCount();
int colCount = worksheet.getColumnCount();
populate(attr, rowCount, colCount);
}
/**
* 将attr中的数据set到面板上
*/
private void setValueText(WorkSheetAttr attr, int rowCount, int colCount, UITextField repeatColDataTextField,
UITextField copyTitleTextField, UICheckBox showBlankCheckBox) {
int startRow,endRow = -1,startColumn,endColumn = -1;
if(attr.getStartIndex() == -1 && attr.getEndIndex() == -1){
return;
}
if (attr.getDirection() == ROW) {
startRow = attr.getStartIndex();
endRow = attr.getEndIndex() == -1 ? rowCount - 1 : attr.getEndIndex();
startColumn = attr.getOppoStartIndex() == -1 ? 0 : attr.getOppoStartIndex();
endColumn = attr.getOppoEndIndex() == -1 ? colCount - 1: attr.getOppoEndIndex();
} else {
startRow = attr.getOppoStartIndex() == -1 ? 0: attr.getOppoStartIndex();
endRow = attr.getOppoEndIndex() == -1 ? rowCount - 1 : attr.getOppoEndIndex();
startColumn = attr.getStartIndex();
endColumn = attr.getEndIndex() == -1 ? colCount - 1 : attr.getEndIndex();
}
repeatColDataTextField.setText(ColumnRow.valueOf(startColumn, startRow).toString() +":"
+ ColumnRow.valueOf(endColumn, endRow).toString());
copyTitleTextField.setText(attr.getIndexsToCopy());
showBlankCheckBox.setSelected(attr.isShowBlank());
}
/**
* update行数据
*/
private void updateRow(WorkSheetAttr attr){
attr.setDirection(Constants.TOP_TO_BOTTOM);
if (this.maxRadioButton.isSelected()) {
int value = ((Integer) (this.maxNumberSpinner.getValue())).intValue();
if (value > 0 && value < Integer.MAX_VALUE) {
attr.setMaxCount(value);
}
} else {
int value = ((Integer) this.toXSpinner.getValue()).intValue();
if (value > 0 && value < Integer.MAX_VALUE) {
attr.setCount(value);
}
}
}
/**
* update列数据
*/
private void updateCol(WorkSheetAttr attr){
attr.setDirection(Constants.LEFT_TO_RIGHT);
if (this.maxRadioButton.isSelected()) {
double value = ((Integer) (this.maxNumberSpinner.getValue())).intValue();
if (value > 0 && value < Integer.MAX_VALUE) {
attr.setMaxCount((int) value);
}
} else {
double value = ((Integer) this.toXSpinner.getValue()).intValue();
if (value > 0 && value < Integer.MAX_VALUE) {
attr.setCount((int) value);
}
}
}
/**
* update数据给WorksheetAttr
*
*/
public void update(WorkSheetAttr attr){
if (!isRepeate) {
attr.setDirection(Constants.NONE);
return;
}
switch (rowOrColumn) {
case ROW:
updateRow(attr);
divide(attr, repeatColDataTextField, copyTitleTextField, showBlankCheckBox);
break;
case COLUMN:
updateCol(attr);
divide(attr, repeatColDataTextField, copyTitleTextField, showBlankCheckBox);
break;
default:
attr.setDirection(Constants.NONE);
break;
}
}
/**
* update数据给worksheet
*
* @param worksheet 当前worksheet
*/
public void update(WorkSheet worksheet) {
if (worksheet == null) {
return;
}
WorkSheetAttr attr = new WorkSheetAttr();
worksheet.setWorkSheetAttr(attr);
update(attr);
}
/**
* 从界面中赋值给WorkSheetAttr
*
* @param attr 报表分栏属性
* @param repeatColDataTextField 从哪行开始复制
* @param copyTitleTextField 复制列序列
* @param showBlankCheckBox 是否填充空白
*/
public void divide(WorkSheetAttr attr, UITextField repeatColDataTextField,
UITextField copyTitleTextField, UICheckBox showBlankCheckBox) {
String[] repeateData = repeatColDataTextField.getText().split(":");
if (repeateData.length != 2 ) {
return;
}
ColumnRow startCR = ColumnRow.valueOf(repeateData[0]);
ColumnRow endCR = ColumnRow.valueOf(repeateData[1]);
int start,oppoStart,end,oppoEnd;
if (attr.getDirection() == ROW) {
start = startCR.getRow();
end = endCR.getRow();
oppoStart = startCR.getColumn();
oppoEnd = endCR.getColumn();
}else {
start = startCR.getColumn();
end = endCR.getColumn();
oppoStart = startCR.getRow();
oppoEnd = endCR.getRow();
}
attr.setStartIndex(start);
attr.setOppoStartIndex(oppoStart);
attr.setEndIndex(end);
attr.setOppoEndIndex(oppoEnd);
attr.setIndexsToCopy(copyTitleTextField.getText());
attr.setShowBlank(showBlankCheckBox.isSelected());
}
/**
* 判断输入是否合法
*/
@Override
public void checkValid() throws Exception {
String repeatText = repeatColDataTextField.getText().trim();
if(StringUtils.isEmpty(repeatText)){
return;
}
boolean valid = true;
if(!repeatText.matches("[a-zA-Z]+[0-9]+[:][a-zA-Z]+[0-9]+")){
valid = false;
}else{
String[] repeateTexts = repeatText.split(":");
ColumnRow start = ColumnRow.valueOf(repeateTexts[0]);
ColumnRow end = ColumnRow.valueOf(repeateTexts[1]);
valid = start.getRow() <= end.getRow() && start.getColumn() <= end.getColumn();
}
if (!valid) {
repeatColDataTextField.setText(StringUtils.EMPTY);
throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Column_Warn_Text"));
}
}
}