package com.fr.design.dscolumn; import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.base.BaseFormula; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.formula.CustomVariableResolver; import com.fr.design.formula.FormulaFactory; import com.fr.design.formula.UIFormula; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.sort.celldscolumn.CellDSColumnSortPane; import com.fr.report.cell.CellElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.cell.cellattr.core.group.SelectCount; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.swing.ui.layout.Layouts.row; import static com.fine.theme.utils.FineUIUtils.wrapComponentWithTitle; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.SPECIFY; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.TOP; public class DSColumnAdvancedPane extends BasicPane { private SortPane sortPane; private SelectCountPane selectCountPane; private ValuePane valuePane; private UICheckBox horizontalExtendableCheckBox; private UICheckBox verticalExtendableCheckBox; private UICheckBox useMultiplyNumCheckBox; private UISpinner multiNumSpinner; private JPanel contentPane; public DSColumnAdvancedPane() { this(DSColumnPane.SETTING_ALL); } public DSColumnAdvancedPane(int setting) { initContentPane(setting); initScrollPane(); } private void initScrollPane() { this.setLayout(new BorderLayout()); UIScrollPane scrollPane = new UIScrollPane(contentPane); this.add(scrollPane); } private void initContentPane(int setting) { contentPane = new JPanel(); contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); sortPane = new SortPane(); if (setting > DSColumnPane.SETTING_DSRELATED) { selectCountPane = new SelectCountPane(); } valuePane = new ValuePane(); Component extendablePane = null; if (setting > DSColumnPane.SETTING_DSRELATED) { horizontalExtendableCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Horizontal_Extendable")); verticalExtendableCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Vertical_Extendable")); extendablePane = row(10, cell(horizontalExtendableCheckBox), cell(verticalExtendableCheckBox) ).getComponent(); } Component multiNumPane = null; if (setting > DSColumnPane.SETTING_DSRELATED) { useMultiplyNumCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Column_Multiple")); multiNumSpinner = new UISpinner(1, 10000, 1, 1); multiNumPane = row(10, cell(useMultiplyNumCheckBox), cell(multiNumSpinner) ).getComponent(); useMultiplyNumCheckBox.addActionListener(e -> checkButtonEnabled()); } // 基于row-column布局的特性,null面板不渲染 if (setting > DSColumnPane.SETTING_DSRELATED) { contentPane.add(column(20, cell(wrapComponentWithTitle(sortPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sort_Sort_Order"))), cell(wrapComponentWithTitle(selectCountPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Results_Filter"))), cell(wrapComponentWithTitle(valuePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Custom_Data_Appearance"))), cell(wrapComponentWithTitle(extendablePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ExpandD_Expandable"))), cell(wrapComponentWithTitle(multiNumPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fill_Blank_Data"))) ).getComponent()); } else { contentPane.add(column(20, cell(wrapComponentWithTitle(sortPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sort_Sort_Order"))), cell(wrapComponentWithTitle(valuePane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Custom_Data_Appearance"))) ).getComponent()); } contentPane.setBorder(new ScaledEmptyBorder(10, 10, 10, 10)); } @Override protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"); } public void populate(TemplateCellElement cellElement) { if (cellElement == null) { return; } sortPane.populateBean(cellElement); valuePane.populate(cellElement); if (selectCountPane != null) { selectCountPane.populate(cellElement); CellExpandAttr cellExpandAttr = cellElement.getCellExpandAttr(); if (cellExpandAttr == null) { cellExpandAttr = new CellExpandAttr(); cellElement.setCellExpandAttr(cellExpandAttr); } // extendable switch (cellExpandAttr.getExtendable()) { case CellExpandAttr.Both_EXTENDABLE: horizontalExtendableCheckBox.setSelected(true); verticalExtendableCheckBox.setSelected(true); break; case CellExpandAttr.Vertical_EXTENDABLE: horizontalExtendableCheckBox.setSelected(false); verticalExtendableCheckBox.setSelected(true); break; case CellExpandAttr.Horizontal_EXTENDABLE: horizontalExtendableCheckBox.setSelected(true); verticalExtendableCheckBox.setSelected(false); break; default: { horizontalExtendableCheckBox.setSelected(false); verticalExtendableCheckBox.setSelected(false); } } if (cellExpandAttr.getMultipleNumber() == -1) { this.useMultiplyNumCheckBox.setSelected(false); } else { this.useMultiplyNumCheckBox.setSelected(true); this.multiNumSpinner.setValue(cellExpandAttr.getMultipleNumber()); } this.checkButtonEnabled(); } } public void update(TemplateCellElement cellElement) { if (cellElement == null) { return; } sortPane.updateBean(cellElement); valuePane.update(cellElement); if (selectCountPane != null) { selectCountPane.update(cellElement); CellExpandAttr cellExpandAttr = cellElement.getCellExpandAttr(); if (cellExpandAttr == null) { cellExpandAttr = new CellExpandAttr(); cellElement.setCellExpandAttr(cellExpandAttr); } // extendable if (horizontalExtendableCheckBox.isSelected()) { if (verticalExtendableCheckBox.isSelected()) { cellExpandAttr.setExtendable(CellExpandAttr.Both_EXTENDABLE); } else { cellExpandAttr.setExtendable(CellExpandAttr.Horizontal_EXTENDABLE); } } else { if (verticalExtendableCheckBox.isSelected()) { cellExpandAttr.setExtendable(CellExpandAttr.Vertical_EXTENDABLE); } else { cellExpandAttr.setExtendable(CellExpandAttr.None_EXTENDABLE); } } if (this.useMultiplyNumCheckBox.isSelected()) { cellExpandAttr.setMultipleNumber((int) this.multiNumSpinner.getValue()); } else { cellExpandAttr.setMultipleNumber(-1); } } } private static class SortPane extends CellDSColumnSortPane { SortPane() { } protected boolean needSortHeaderPane() { return false; } } private static class SelectCountPane extends JPanel { CellElement cellElement; private UIComboBox selectCountComboBox; private JPanel selectCountCardPane; private UITextField serialTextField; JFormulaField topFormulaPane; JFormulaField bottomFormulaPane; public SelectCountPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); selectCountComboBox = new UIComboBox(new String[]{ com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Undefined"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Top_N"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Bottom_N"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Odd"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Even"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Specify"),}); selectCountComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { int selectIndex = selectCountComboBox.getSelectedIndex(); CardLayout c1 = (CardLayout) selectCountCardPane.getLayout(); if (selectIndex == 1) { c1.show(selectCountCardPane, "TOP"); } else if (selectIndex == 2) { c1.show(selectCountCardPane, "BOTTOM"); } else if (selectIndex == 3) { c1.show(selectCountCardPane, "ODD"); } else if (selectIndex == 4) { c1.show(selectCountCardPane, "EVEN"); } else if (selectIndex == 5) { c1.show(selectCountCardPane, "SPECIFY"); } else { c1.show(selectCountCardPane, "UNDEFINE"); } } }); selectCountCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); this.add(row(10, cell(selectCountComboBox),cell(selectCountCardPane) ).getComponent()); //not define pane JPanel undefinedPane = row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Undefined")))).getComponent(); topFormulaPane = new JFormulaField("-1"); bottomFormulaPane = new JFormulaField("-1"); serialTextField = new UITextField(18); JPanel oddPane = row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Result_Serial_Number_Start_From_1") + " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Odd_Selected_(1,3,5...)")))).getComponent(); JPanel evenPane = row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Result_Serial_Number_Start_From_1") + " " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bind_Column_Even_Selected_(2,4,6...)")))).getComponent(); JPanel specifyPane = row(10, cell(serialTextField), cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_DSColumn_Result_Group_Format", "1,2-3,5,8", "$__count__"))) ).getComponent(); serialTextField.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Format") + ":=JOINARRAY(GREPARRAY(RANGE($__count__), item!=4), \",\")"); selectCountCardPane.add(undefinedPane, "UNDEFINE"); selectCountCardPane.add(topFormulaPane, "TOP"); selectCountCardPane.add(bottomFormulaPane, "BOTTOM"); //odd selectCountCardPane.add(oddPane, "ODD"); //even selectCountCardPane.add(evenPane, "EVEN"); //specify selectCountCardPane.add(specifyPane, "SPECIFY"); } public void populate(CellElement cellElement) { if (cellElement == null) { return; } this.cellElement = cellElement; Object value = cellElement.getValue(); if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) (cellElement.getValue()); SelectCount selectCount = dSColumn.getSelectCount(); this.topFormulaPane.populateElement(cellElement); this.bottomFormulaPane.populateElement(cellElement); if (selectCount != null) { int selectCountType = selectCount.getType(); this.selectCountComboBox.setSelectedIndex(selectCountType); if (selectCountType == TOP.getValue()) { this.topFormulaPane.populate(selectCount.getFormulaCount()); } else if (selectCountType == BOTTOM.getValue()) { this.bottomFormulaPane.populate(selectCount.getFormulaCount()); } else if (selectCountType == SPECIFY.getValue()) { this.serialTextField.setText(selectCount.getSerial()); } } } public void update(CellElement cellElement) { if (cellElement == null) { return; } Object value = cellElement.getValue(); if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) (cellElement.getValue()); //alex:SelectCount int selectCountSelectIndex = this.selectCountComboBox.getSelectedIndex(); if (selectCountSelectIndex == 0) { dSColumn.setSelectCount(null); } else { SelectCount selectCount = new SelectCount(); dSColumn.setSelectCount(selectCount); selectCount.setType(selectCountSelectIndex); if (selectCountSelectIndex == TOP.getValue()) { selectCount.setFormulaCount(this.topFormulaPane.getFormulaText()); } else if (selectCountSelectIndex == BOTTOM.getValue()) { selectCount.setFormulaCount(this.bottomFormulaPane.getFormulaText()); } else if (selectCountSelectIndex == SPECIFY.getValue()) { selectCount.setSerial(this.serialTextField.getText()); } } } } private static class JFormulaField extends JPanel { private CellElement cellElement; private UITextField formulaTextField; private String defaultValue; public JFormulaField(String defaultValue) { this.defaultValue = defaultValue; this.setLayout(new BorderLayout()); UILabel bottomLabel = new UILabel("="); formulaTextField = new UITextField(24); formulaTextField.setText(defaultValue); UIButton bottomFormulaButton = new UIButton("..."); bottomFormulaButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula") + "..."); bottomFormulaButton.addActionListener(formulaButtonActionListener); this.add(row(10, cell(bottomLabel), cell(formulaTextField), cell(bottomFormulaButton) ).getComponent()); } public void populate(String formulaContent) { this.formulaTextField.setText(formulaContent); } public void populateElement(CellElement cellElement) { this.cellElement = cellElement; } public String getFormulaText() { return this.formulaTextField.getText(); } private ActionListener formulaButtonActionListener = new ActionListener() { public void actionPerformed(ActionEvent evt) { BaseFormula valueFormula = BaseFormula.createFormulaBuilder().build(); String text = formulaTextField.getText(); if (text == null || text.length() <= 0) { valueFormula.setContent(defaultValue); } else { valueFormula.setContent(text); } final UIFormula formulaPane = FormulaFactory.createFormulaPaneWhenReserveFormula(); if (cellElement == null) { return; } Object value = cellElement.getValue(); if (!(value instanceof DSColumn)) { return; } DSColumn dsColumn = (DSColumn) value; String[] displayNames = DesignTableDataManager.getSelectedColumnNames(DesignTableDataManager.getEditingTableDataSource(), dsColumn.getDSName()); formulaPane.populate(valueFormula, new CustomVariableResolver(displayNames, true)); formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(JFormulaField.this), new DialogActionAdapter() { @Override public void doOk() { BaseFormula valueFormula = formulaPane.update(); if (valueFormula.getContent().length() <= 1) { formulaTextField.setText(defaultValue); } else { formulaTextField.setText(valueFormula.getContent().substring(1)); } } }).setVisible(true); } }; } private static class ValuePane extends JPanel { private JFormulaField formulaField; public ValuePane() { this.setLayout(new BorderLayout()); formulaField = new JFormulaField("$$$"); this.add(row(10, cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Value") + ":")), cell(formulaField) ).getComponent()); } public void populate(CellElement cellElement) { if (cellElement == null) { return; } Object value = cellElement.getValue(); if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) value; //formula String valueFormula = dSColumn.getResult(); if (valueFormula == null) { valueFormula = "$$$"; } formulaField.populateElement(cellElement); formulaField.populate(valueFormula); } public void update(CellElement cellElement) { if (cellElement == null) { return; } Object value = cellElement.getValue(); if (!(value instanceof DSColumn)) { return; } DSColumn dSColumn = (DSColumn) (cellElement.getValue()); //formula dSColumn.setResult(this.formulaField.getFormulaText()); } } private void checkButtonEnabled() { multiNumSpinner.setEnabled(useMultiplyNumCheckBox.isSelected()); } }