Browse Source

Merge pull request #1 in ~YAOH.WU/design_0407 from ~YAOH.WU/design9.0:9.0 to 9.0

* commit '17ae107b7681415f11b24308d3f5676154adf88f':
  REPORT-3348 修改后触发保存
  REPORT-3348 重构,不然不能保存
  REPORT-3348 复用添加数据列对话框代码,保留原始对话框布局
  REPORT-3348 数据列高级设置内部组件调整
  REPORT-3348 单元格元素数据列高级设置
master
yaoh.wu 7 years ago
parent
commit
0e9bc4c768
  1. 9
      designer/src/com/fr/design/actions/columnrow/DSColumnConditionAction.java
  2. 38
      designer/src/com/fr/design/dscolumn/DSColumnAdvancedEditorPane.java
  3. 84
      designer/src/com/fr/design/dscolumn/DSColumnBasicEditorPane.java
  4. 23
      designer/src/com/fr/design/dscolumn/DSColumnBasicPane.java
  5. 50
      designer/src/com/fr/design/dscolumn/ResultSetGroupDockingPane.java
  6. 14
      designer/src/com/fr/design/dscolumn/SelectedConfirmedDataColumnPane.java
  7. 93
      designer/src/com/fr/design/dscolumn/SelectedDataColumnPane.java
  8. 4
      designer/src/com/fr/design/mainframe/cell/CellEditorPane.java
  9. 23
      designer/src/com/fr/quickeditor/CellQuickEditor.java
  10. 792
      designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java
  11. 64
      designer_base/src/com/fr/design/layout/FRGUIPaneFactory.java
  12. 3
      designer_base/src/com/fr/design/utils/DesignUtils.java

9
designer/src/com/fr/design/actions/columnrow/DSColumnConditionAction.java

@ -1,19 +1,16 @@
package com.fr.design.actions.columnrow; package com.fr.design.actions.columnrow;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.actions.cell.AbstractCellElementAction; import com.fr.design.actions.cell.AbstractCellElementAction;
import com.fr.design.dscolumn.DSColumnConditionsPane; import com.fr.design.data.DesignTableDataManager;
import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.BasicPane;
import com.fr.general.Inter; import com.fr.design.dscolumn.DSColumnConditionsPane;
import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.ElementCasePane;
import com.fr.general.Inter;
import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.TemplateCellElement;
public class DSColumnConditionAction extends AbstractCellElementAction { public class DSColumnConditionAction extends AbstractCellElementAction {
private boolean returnValue = false;
private TemplateCellElement editCellElement;
public DSColumnConditionAction(ElementCasePane t) { public DSColumnConditionAction(ElementCasePane t) {
super(t); super(t);

38
designer/src/com/fr/design/dscolumn/DSColumnAdvancedEditorPane.java

@ -1,38 +0,0 @@
package com.fr.design.dscolumn;
import com.fr.design.mainframe.cell.CellEditorPane;
import com.fr.report.cell.TemplateCellElement;
/**
* 单元格元素 数据列 基本设置内容面板
*
* @author yaoh.wu
* @version 2017年7月25日
* @since 9.0
*/
public class DSColumnAdvancedEditorPane extends CellEditorPane {
@Override
public String getIconPath() {
return "Advanced";
}
@Override
public String title4PopupWindow() {
return "Advanced";
}
@Override
public void update() {
}
@Override
public void populate(TemplateCellElement cellElement) {
}
}

84
designer/src/com/fr/design/dscolumn/DSColumnBasicEditorPane.java

@ -1,84 +0,0 @@
package com.fr.design.dscolumn;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.cell.CellEditorPane;
import com.fr.report.cell.TemplateCellElement;
import javax.swing.*;
import java.awt.*;
/**
* 单元格元素 数据列 高级设置内容面板
*
* @author yaoh.wu
* @version 2017年7月25日
* @since 9.0
*/
public class DSColumnBasicEditorPane extends CellEditorPane {
//数据集和数据列
private SelectedDataColumnPane dataPane;
//数据分组设置
private ResultSetGroupDockingPane groupPane;
//当前编辑的单元格
private TemplateCellElement cellElement;
//条件过滤按钮面板
private JPanel conditionPane;
public DSColumnBasicEditorPane(TemplateCellElement cellElement, SelectedDataColumnPane dataPane, ResultSetGroupDockingPane groupPane, JPanel conditionPane) {
this.setLayout(new BorderLayout());
this.cellElement = cellElement;
this.dataPane = dataPane;
this.groupPane = groupPane;
this.conditionPane = conditionPane;
this.add(this.createContentPane(), BorderLayout.CENTER);
}
@Override
public String getIconPath() {
return "Basic";
}
@Override
public String title4PopupWindow() {
return "Basic";
}
@Override
public void update() {
dataPane.update(this.cellElement);
groupPane.update();
}
@Override
public void populate(TemplateCellElement cellElement) {
this.cellElement = cellElement;
dataPane.populate(null, cellElement);
groupPane.populate(cellElement);
}
/**
* 创建有内容的面板显示信息
*
* @return content JPanel
*/
private JPanel createContentPane() {
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double[] columnSize = {f};
double[] rowSize = {p, p, p};
Component[][] components = new Component[][]{
//数据集列选择
new Component[]{this.dataPane},
//数据分组设置
new Component[]{this.groupPane},
//条件过滤
new Component[]{this.conditionPane}
};
return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
}
}

23
designer/src/com/fr/design/dscolumn/DSColumnBasicPane.java

@ -1,25 +1,23 @@
package com.fr.design.dscolumn; package com.fr.design.dscolumn;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import com.fr.data.TableDataSource; import com.fr.data.TableDataSource;
import com.fr.design.dialog.BasicPane;
import com.fr.design.expand.ConditionParentPane; import com.fr.design.expand.ConditionParentPane;
import com.fr.design.expand.ExpandDirectionPane; import com.fr.design.expand.ExpandDirectionPane;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.dialog.BasicPane;
import com.fr.general.Inter;
import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.Inter;
import com.fr.report.cell.CellElement; import com.fr.report.cell.CellElement;
import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.TemplateCellElement;
import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.report.cell.cellattr.CellExpandAttr;
import com.fr.design.utils.gui.GUICoreUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DSColumnBasicPane extends BasicPane { public class DSColumnBasicPane extends BasicPane {
@ -135,6 +133,7 @@ public class DSColumnBasicPane extends BasicPane {
} }
resultSetGroupPane.update(); resultSetGroupPane.update();
} }
ActionListener summary_direction_ActionListener = new ActionListener() { ActionListener summary_direction_ActionListener = new ActionListener() {
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
@ -157,11 +156,13 @@ public class DSColumnBasicPane extends BasicPane {
selectDataColumnPane.update(cellElement); selectDataColumnPane.update(cellElement);
} }
}; };
public void putElementcase(ElementCasePane t){
public void putElementcase(ElementCasePane t) {
if (conditionParentPane != null) { if (conditionParentPane != null) {
conditionParentPane.putElementcase(t); conditionParentPane.putElementcase(t);
} }
} }
public void putCellElement(TemplateCellElement tplEC2) { public void putCellElement(TemplateCellElement tplEC2) {
if (conditionParentPane != null) { if (conditionParentPane != null) {
conditionParentPane.putCellElement(tplEC2); conditionParentPane.putCellElement(tplEC2);

50
designer/src/com/fr/design/dscolumn/ResultSetGroupDockingPane.java

@ -1,35 +1,31 @@
package com.fr.design.dscolumn; package com.fr.design.dscolumn;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import com.fr.design.gui.ilable.UILabel;
import javax.swing.JPanel;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.icombobox.FunctionComboBox; import com.fr.design.gui.icombobox.FunctionComboBox;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.TableLayoutHelper;
import com.fr.general.Inter;
import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.Inter;
import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.TemplateCellElement;
import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.report.cell.cellattr.CellExpandAttr;
import com.fr.report.cell.cellattr.core.group.CustomGrouper; import com.fr.report.cell.cellattr.core.group.*;
import com.fr.report.cell.cellattr.core.group.DSColumn;
import com.fr.report.cell.cellattr.core.group.FunctionGrouper;
import com.fr.report.cell.cellattr.core.group.RecordGrouper;
import com.fr.report.cell.cellattr.core.group.SummaryGrouper;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/** /**
* 这个pane是选中数据列后在上方QuickRegion处显示的pane * 这个pane是选中数据列后在上方QuickRegion处显示的pane
* *
* @author zhou * @author zhou, yaoh.wu
* @version 2017年8月2日14点55分
* @since 8.0
*/ */
public class ResultSetGroupDockingPane extends ResultSetGroupPane { public class ResultSetGroupDockingPane extends ResultSetGroupPane {
private static final int BIND_GROUP = 0; private static final int BIND_GROUP = 0;
@ -42,7 +38,7 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane {
private CardLayout cardLayout; private CardLayout cardLayout;
private UIComboBox goBox; private UIComboBox goBox;
ItemListener l; private ItemListener listener;
public ResultSetGroupDockingPane(ElementCasePane ePane) { public ResultSetGroupDockingPane(ElementCasePane ePane) {
super(); super();
@ -58,15 +54,13 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane {
} }
private JPanel layoutPane() { private JPanel layoutPane() {
double vs = 4;
double vg = 6;
double p = TableLayout.PREFERRED; double p = TableLayout.PREFERRED;
double f = TableLayout.FILL; double f = TableLayout.FILL;
Component[][] components = new Component[][] Component[][] components = new Component[][]
{ {
new Component[]{new UILabel(Inter.getLocText("Data_Setting")), goBox}, new Component[]{new UILabel(Inter.getLocText("Data_Setting")), goBox},
new Component[]{cardPane, null} new Component[]{null, cardPane}
}; };
goBox.addItemListener(new ItemListener() { goBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent ee) { public void itemStateChanged(ItemEvent ee) {
@ -86,7 +80,7 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane {
double[] columnSize = {p, f}; double[] columnSize = {p, f};
double[] rowSize = {p, p}; double[] rowSize = {p, p};
return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
} }
private void initCardPane() { private void initCardPane() {
@ -190,15 +184,15 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane {
} }
} }
public void addListener(ItemListener l) { public void addListener(ItemListener listener) {
goBox.addItemListener(l); goBox.addItemListener(listener);
groupComboBox.addItemListener(l); groupComboBox.addItemListener(listener);
functionComboBox.addItemListener(l); functionComboBox.addItemListener(listener);
this.l = l; this.listener = listener;
} }
void fireTargetChanged() { void fireTargetChanged() {
l.itemStateChanged(null); listener.itemStateChanged(null);
} }
@Override @Override

14
designer/src/com/fr/design/dscolumn/SelectedConfirmedDataColumnPane.java

@ -1,19 +1,19 @@
package com.fr.design.dscolumn; package com.fr.design.dscolumn;
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Iterator;
import com.fr.data.TableDataSource; import com.fr.data.TableDataSource;
import com.fr.design.data.datapane.TableDataComboBox; import com.fr.design.data.datapane.TableDataComboBox;
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
import com.fr.main.impl.WorkBook; import com.fr.main.impl.WorkBook;
import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.TemplateCellElement;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Iterator;
public class SelectedConfirmedDataColumnPane extends SelectedDataColumnPane { public class SelectedConfirmedDataColumnPane extends SelectedDataColumnPane {
public SelectedConfirmedDataColumnPane () { public SelectedConfirmedDataColumnPane() {
super(false); super(false);
} }
@ -35,7 +35,7 @@ public class SelectedConfirmedDataColumnPane extends SelectedDataColumnPane {
super.populate(source, cell); super.populate(source, cell);
try { try {
Iterator it = source.getTableDataNameIterator(); Iterator it = source.getTableDataNameIterator();
String name = (String)it.next(); String name = (String) it.next();
TemplateTableDataWrapper wrapper = new TemplateTableDataWrapper(source.getTableData(name), name); TemplateTableDataWrapper wrapper = new TemplateTableDataWrapper(source.getTableData(name), name);
tableNameComboBox.setSelectedItem(wrapper); tableNameComboBox.setSelectedItem(wrapper);
tableNameComboBox.getModel().setSelectedItem(wrapper); tableNameComboBox.getModel().setSelectedItem(wrapper);

93
designer/src/com/fr/design/dscolumn/SelectedDataColumnPane.java

@ -17,6 +17,7 @@ import com.fr.design.gui.itableeditorpane.UITableEditorPane;
import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.general.data.TableDataColumn; import com.fr.general.data.TableDataColumn;
import com.fr.report.cell.CellElement; import com.fr.report.cell.CellElement;
@ -39,8 +40,8 @@ import java.util.regex.Pattern;
* 数据集列动态参数设置组件 * 数据集列动态参数设置组件
* *
* @author yaoh.wu * @author yaoh.wu
* @version 2017年7月26 * @version 2017年8月3
* 9.0设计器更新修改动态参数注入按钮部分,使其显示动态参数按钮时能在右侧边栏正常显示 * 复用对话框代码保留对话框原始布局
* @since 8.0 * @since 8.0
*/ */
public class SelectedDataColumnPane extends BasicPane { public class SelectedDataColumnPane extends BasicPane {
@ -54,12 +55,21 @@ public class SelectedDataColumnPane extends BasicPane {
private UIButton paramButton; private UIButton paramButton;
public SelectedDataColumnPane() { public SelectedDataColumnPane() {
this(true); this(true, false, null);
} }
SelectedDataColumnPane(boolean showParameterButton) {
public SelectedDataColumnPane(boolean showParameterButton) {
this(showParameterButton, false, null);
}
public SelectedDataColumnPane(boolean showParameterButton, boolean verticalLayout, ElementCasePane casePane) {
if (verticalLayout) {
initComponentVerticalLayout(casePane);
} else {
initComponent(showParameterButton); initComponent(showParameterButton);
} }
}
/** /**
* 初始化组件 * 初始化组件
@ -71,6 +81,47 @@ public class SelectedDataColumnPane extends BasicPane {
if (showParameterButton) { if (showParameterButton) {
initWithParameterButton(); initWithParameterButton();
} }
columnNameComboBox = new LazyComboBox() {
@Override
public Object[] load() {
List<String> l = calculateColumnNameList();
return l.toArray(new String[l.size()]);
}
};
columnNameComboBox.setEditable(true);
double p = TableLayout.PREFERRED;
UILabel label1 = new UILabel(Inter.getLocText("TableData") + ":");
UILabel label2 = new UILabel(Inter.getLocText("DataColumn") + ":");
if (showParameterButton) {
label1.setPreferredSize(new Dimension(200, 25));
label2.setPreferredSize(new Dimension(200, 25));
}
if (showParameterButton) {
Component[][] comps = {{label1, null, label2}, {tableNameComboBox, paramButton, columnNameComboBox}};
this.add(TableLayoutHelper.createTableLayoutPane(comps, new double[]{p, p}, new double[]{p, p, p}));
} else {
double f = TableLayout.FILL;
double[] columnSize = {p, f};
double[] rowSize = {p, p};
Component[][] components = new Component[][]{
new Component[]{label1, tableNameComboBox},
new Component[]{label2, columnNameComboBox}
};
JPanel jPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
this.setLayout(new BorderLayout());
this.add(jPanel, BorderLayout.CENTER);
}
}
/**
* 初始化竖直布局的组件
*/
public void initComponentVerticalLayout(ElementCasePane casePane) {
initTableNameComboBox();
initWithParameterButton(casePane);
columnNameComboBox = new LazyComboBox() { columnNameComboBox = new LazyComboBox() {
@Override @Override
public Object[] load() { public Object[] load() {
@ -83,7 +134,7 @@ public class SelectedDataColumnPane extends BasicPane {
double p = TableLayout.PREFERRED; double p = TableLayout.PREFERRED;
UILabel label1 = new UILabel(Inter.getLocText("TableData")); UILabel label1 = new UILabel(Inter.getLocText("TableData"));
UILabel label3 = new UILabel(Inter.getLocText("DataColumn")); UILabel label3 = new UILabel(Inter.getLocText("DataColumn"));
if (showParameterButton) {
//todo 国际化 //todo 国际化
UILabel label2 = new UILabel("param"); UILabel label2 = new UILabel("param");
Component[][] components = { Component[][] components = {
@ -93,17 +144,7 @@ public class SelectedDataColumnPane extends BasicPane {
}; };
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
this.add(TableLayoutHelper.createTableLayoutPane(components, new double[]{p, p, p}, new double[]{p, f})); this.add(TableLayoutHelper.createTableLayoutPane(components, new double[]{p, p, p}, new double[]{p, f}));
} else {
double[] columnSize = {p, f};
double[] rowSize = {p, p};
Component[][] components = new Component[][]{
new Component[]{label1, tableNameComboBox},
new Component[]{label3, columnNameComboBox}
};
JPanel jPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
this.setLayout(new BorderLayout());
this.add(jPanel, BorderLayout.CENTER);
}
} }
@ -237,6 +278,26 @@ public class SelectedDataColumnPane extends BasicPane {
}); });
} }
private void initWithParameterButton(ElementCasePane casePane) {
editorPane = new UITableEditorPane<ParameterProvider>(new ParameterTableModel());
paramButton = new UIButton(Inter.getLocText("TableData_Dynamic_Parameter_Setting"));
paramButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
BasicDialog paramDialog = editorPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
@Override
public void doOk() {
List<ParameterProvider> parameterList = editorPane.update();
ps = parameterList.toArray(new Parameter[parameterList.size()]);
editorPane.update();
casePane.fireTargetModified();
}
});
editorPane.populate(ps == null ? new Parameter[0] : ps);
paramDialog.setVisible(true);
}
});
}
private boolean isColumnName(String columnExp) { private boolean isColumnName(String columnExp) {
return StringUtils.isNotBlank(columnExp) && (columnExp.length() > 0 && columnExp.charAt(0) == '#') && !columnExp.endsWith("#"); return StringUtils.isNotBlank(columnExp) && (columnExp.length() > 0 && columnExp.charAt(0) == '#') && !columnExp.endsWith("#");

4
designer/src/com/fr/design/mainframe/cell/CellEditorPane.java

@ -1,7 +1,6 @@
package com.fr.design.mainframe.cell; package com.fr.design.mainframe.cell;
import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.BasicPane;
import com.fr.report.cell.TemplateCellElement;
/** /**
* 右侧单元格元素面板抽象类 * 右侧单元格元素面板抽象类
@ -24,7 +23,6 @@ public abstract class CellEditorPane extends BasicPane {
/** /**
* 更新面板数据 * 更新面板数据
* *
* @param cellElement 单元格
*/ */
public abstract void populate(TemplateCellElement cellElement); public abstract void populate();
} }

23
designer/src/com/fr/quickeditor/CellQuickEditor.java

@ -37,18 +37,33 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
double p = TableLayout.PREFERRED; double p = TableLayout.PREFERRED;
double f = TableLayout.FILL; double f = TableLayout.FILL;
double[] columnSize = {p, f}; double[] columnSize = {p, f};
double[] rowSize = {p, p, p}; double[] rowSize = {p, p};
Component[][] components = new Component[][]{ Component[][] components = new Component[][]{
new Component[]{new UILabel(" " + Inter.getLocText("Cell")), columnRowTextField = initColumnRowTextField()}, new Component[]{initTopContent(), null},
new Component[]{new UILabel(Inter.getLocText("HF-Insert_Content") + " "), cellElementEditButton = initCellElementEditButton()},
new Component[]{createCenterBody(), null} new Component[]{createCenterBody(), null}
}; };
JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); this.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
this.add(panel, BorderLayout.CENTER); this.add(panel, BorderLayout.CENTER);
} }
private JPanel initTopContent() {
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double[] columnSize = {p, f};
double[] rowSize = {p, p};
Component[][] components = new Component[][]{
new Component[]{new UILabel(" " + Inter.getLocText("Cell")), columnRowTextField = initColumnRowTextField()},
new Component[]{new UILabel(Inter.getLocText("HF-Insert_Content") + " "), cellElementEditButton = initCellElementEditButton()},
};
JPanel topContent = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
topContent.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 15));
return topContent;
}
/** /**
* 初始化添加按钮 * 初始化添加按钮
* TODO 9.0 换成下拉菜单后原来的快捷键不好处理先跳过 * TODO 9.0 换成下拉菜单后原来的快捷键不好处理先跳过

792
designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java

@ -1,21 +1,45 @@
package com.fr.quickeditor.cellquick; package com.fr.quickeditor.cellquick;
import com.fr.base.Formula;
import com.fr.design.actions.columnrow.DSColumnConditionAction; import com.fr.design.actions.columnrow.DSColumnConditionAction;
import com.fr.design.dscolumn.DSColumnAdvancedEditorPane; import com.fr.design.constants.LayoutConstants;
import com.fr.design.dscolumn.DSColumnBasicEditorPane; import com.fr.design.data.DesignTableDataManager;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.dscolumn.DSColumnAdvancedPane;
import com.fr.design.dscolumn.ResultSetGroupDockingPane; import com.fr.design.dscolumn.ResultSetGroupDockingPane;
import com.fr.design.dscolumn.SelectedDataColumnPane; import com.fr.design.dscolumn.SelectedDataColumnPane;
import com.fr.design.formula.CustomVariableResolver;
import com.fr.design.formula.FormulaFactory;
import com.fr.design.formula.TinyFormulaPane;
import com.fr.design.formula.UIFormula;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.ibutton.UIHeadGroup;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel; 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.layout.TableLayout; import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.cell.CellEditorPane; import com.fr.design.mainframe.cell.CellEditorPane;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.IOUtils;
import com.fr.general.Inter;
import com.fr.quickeditor.CellQuickEditor; import com.fr.quickeditor.CellQuickEditor;
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.*; import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.util.ArrayList; import java.util.ArrayList;
@ -29,75 +53,30 @@ import java.util.ArrayList;
*/ */
public class CellDSColumnEditor extends CellQuickEditor { public class CellDSColumnEditor extends CellQuickEditor {
private static final double P = TableLayout.PREFERRED, F = TableLayout.FILL;
private enum FilterType {
//前N个 后N个 奇数 偶数 自定义 未定义
TOP, BOTTOM, ODD, EVEN, SPECIFY, UNDEFINE
}
private JPanel dsColumnRegion; private JPanel dsColumnRegion;
private JPanel centerPane; private JPanel centerPane;
//数据集列选择组件
private SelectedDataColumnPane dataPane;
//数据分组设置组件
private ResultSetGroupDockingPane groupPane;
//过滤条件面板
private JPanel conditionPane;
// 基本和高级设置 // 基本和高级设置
private ArrayList<CellEditorPane> paneList; private ArrayList<CellEditorPane> paneList;
// 基本和高级设置 卡片布局 // 基本和高级设置 卡片布局
private CardLayout card; private CardLayout card;
// 基本和高级设置 容器面板 // 基本和高级设置 容器面板
private JPanel center; private JPanel cardContainer;
// 卡片布局TAB切换按钮 // 卡片布局TAB切换按钮
private UIHeadGroup tabsHeaderIconPane; private UIHeadGroup tabsHeaderIconPane;
// 分组设置监听器
private ItemListener groupListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e == null) {
//分组-高级-自定义点确定的时候传进来null的e,但是这时候应该触发保存
groupPane.update();
fireTargetModified();
return;
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
if (!isEditing) {
return;
}
groupPane.update();
fireTargetModified();
}
}
};
//数据集列设置监听器
private ItemListener dataListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (!isEditing) {
return;
}
dataPane.update(cellElement);
fireTargetModified();
}
}
};
private CellDSColumnEditor() { private CellDSColumnEditor() {
super(); super();
} }
/**
* Test Main
*
* @param args 参数
*/
public static void main(String[] args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel content = (JPanel) jf.getContentPane();
content.setLayout(new BorderLayout());
content.add(new CellDSColumnEditor(), BorderLayout.CENTER);
GUICoreUtils.centerWindow(jf);
jf.setSize(220, 400);
jf.setVisible(true);
}
/** /**
* 创建面板占位 * 创建面板占位
* *
@ -109,7 +88,7 @@ public class CellDSColumnEditor extends CellQuickEditor {
this.createSwitchTab(); this.createSwitchTab();
dsColumnRegion = new JPanel(new BorderLayout()); dsColumnRegion = new JPanel(new BorderLayout());
dsColumnRegion.add(tabsHeaderIconPane, BorderLayout.NORTH); dsColumnRegion.add(tabsHeaderIconPane, BorderLayout.NORTH);
dsColumnRegion.add(center, BorderLayout.CENTER); dsColumnRegion.add(cardContainer, BorderLayout.CENTER);
centerPane = new JPanel(new BorderLayout()); centerPane = new JPanel(new BorderLayout());
centerPane.add(dsColumnRegion, BorderLayout.CENTER); centerPane.add(dsColumnRegion, BorderLayout.CENTER);
return centerPane; return centerPane;
@ -121,17 +100,16 @@ public class CellDSColumnEditor extends CellQuickEditor {
*/ */
@Override @Override
protected void refreshDetails() { protected void refreshDetails() {
this.createPanes(); this.createPanes();
this.createSwitchTab(); this.createSwitchTab();
dsColumnRegion = new JPanel(new BorderLayout()); dsColumnRegion = new JPanel(new BorderLayout());
dsColumnRegion.add(tabsHeaderIconPane, BorderLayout.NORTH); dsColumnRegion.add(tabsHeaderIconPane, BorderLayout.NORTH);
dsColumnRegion.add(center, BorderLayout.CENTER); dsColumnRegion.add(cardContainer, BorderLayout.CENTER);
//必须removeAll之后再添加;重新再实例化一个centerJPanel,因为对象变了会显示不出来 //必须removeAll之后再添加;重新再实例化一个centerJPanel,因为对象变了会显示不出来
centerPane.removeAll(); centerPane.removeAll();
centerPane.add(dsColumnRegion, BorderLayout.CENTER); centerPane.add(dsColumnRegion, BorderLayout.CENTER);
for (CellEditorPane cellEditorPane : paneList) { for (CellEditorPane cellEditorPane : paneList) {
cellEditorPane.populate(cellElement); cellEditorPane.populate();
} }
this.validate(); this.validate();
} }
@ -153,18 +131,18 @@ public class CellDSColumnEditor extends CellQuickEditor {
private void createSwitchTab() { private void createSwitchTab() {
String[] iconArray = new String[paneList.size()]; String[] iconArray = new String[paneList.size()];
card = new CardLayout(); card = new CardLayout();
center = new JPanel(card); cardContainer = new JPanel(card);
center.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); cardContainer.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
for (int i = 0; i < paneList.size(); i++) { for (int i = 0; i < paneList.size(); i++) {
CellEditorPane pane = paneList.get(i); CellEditorPane pane = paneList.get(i);
iconArray[i] = pane.getIconPath(); iconArray[i] = pane.getIconPath();
center.add(pane, pane.title4PopupWindow()); cardContainer.add(pane, pane.title4PopupWindow());
} }
tabsHeaderIconPane = new UIHeadGroup(iconArray) { tabsHeaderIconPane = new UIHeadGroup(iconArray) {
@Override @Override
public void tabChanged(int index) { public void tabChanged(int index) {
card.show(center, paneList.get(index).title4PopupWindow()); card.show(cardContainer, paneList.get(index).title4PopupWindow());
paneList.get(index).populate(cellElement); paneList.get(index).populate();
} }
}; };
tabsHeaderIconPane.setNeedLeftRightOutLine(false); tabsHeaderIconPane.setNeedLeftRightOutLine(false);
@ -175,12 +153,63 @@ public class CellDSColumnEditor extends CellQuickEditor {
*/ */
private void createPanes() { private void createPanes() {
paneList = new ArrayList<>(); paneList = new ArrayList<>();
/*基本设置面板*/ /*基本设置面板*/
this.dataPane = new SelectedDataColumnPane(); paneList.add(new DSColumnBasicEditorPane());
this.groupPane = new ResultSetGroupDockingPane(tc); /*高级设置面板*/
double p = TableLayout.PREFERRED, f = TableLayout.FILL; paneList.add(new DSColumnAdvancedEditorPane());
double[] rowSize = {p}, columnSize = {p, f}; }
/**
* 单元格元素 数据列 高级设置内容面板
*
* @author yaoh.wu
* @version 2017年7月25日
* @since 9.0
*/
class DSColumnBasicEditorPane extends CellEditorPane {
//数据集和数据列
private SelectedDataColumnPane dataPane;
//数据分组设置
private ResultSetGroupDockingPane groupPane;
//条件过滤按钮面板
private JPanel conditionPane;
// 分组设置监听器
private ItemListener groupListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e == null) {
//分组-高级-自定义点确定的时候传进来null的e,但是这时候应该触发保存
groupPane.update();
fireTargetModified();
return;
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
groupPane.update();
fireTargetModified();
}
}
};
//数据集列设置监听器
private ItemListener dataListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
dataPane.update(cellElement);
fireTargetModified();
}
}
};
DSColumnBasicEditorPane() {
this.setLayout(new BorderLayout());
dataPane = new SelectedDataColumnPane(true, true, tc);
groupPane = new ResultSetGroupDockingPane(tc);
dataPane.addListener(dataListener);
groupPane.addListener(groupListener);
double[] rowSize = {P}, columnSize = {P, F};
UILabel uiLabel = new UILabel("filter"); UILabel uiLabel = new UILabel("filter");
UIButton uiButton = new UIButton(); UIButton uiButton = new UIButton();
if (tc != null) { if (tc != null) {
@ -190,12 +219,621 @@ public class CellDSColumnEditor extends CellQuickEditor {
Component[][] components = new Component[][]{ Component[][] components = new Component[][]{
new Component[]{uiLabel, uiButton} new Component[]{uiLabel, uiButton}
}; };
this.conditionPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); conditionPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
dataPane.addListener(dataListener);
groupPane.addListener(groupListener);
paneList.add(new DSColumnBasicEditorPane(cellElement, dataPane, groupPane, conditionPane));
/*高级设置面板*/ this.add(this.createContentPane(), BorderLayout.CENTER);
paneList.add(new DSColumnAdvancedEditorPane()); this.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 15));
}
@Override
public String getIconPath() {
return "Basic";
}
@Override
public String title4PopupWindow() {
return "Basic";
}
@Override
public void update() {
dataPane.update(cellElement);
groupPane.update();
}
@Override
public void populate() {
dataPane.populate(null, cellElement);
groupPane.populate(cellElement);
}
/**
* 创建有内容的面板显示信息
*
* @return content JPanel
*/
private JPanel createContentPane() {
double[] columnSize = {F};
double[] rowSize = {P, P, P};
Component[][] components = new Component[][]{
//数据集列选择
new Component[]{this.dataPane},
//数据分组设置
new Component[]{this.groupPane},
//条件过滤
new Component[]{this.conditionPane}
};
return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
}
}
class DSColumnAdvancedEditorPane extends CellEditorPane {
private static final String INSET_TEXT = " ";
//排列顺序
private ResultSetSortConfigPane sortPane;
//结果集筛选
private ResultSetFilterConfigPane filterPane;
//自定义值显示
private CustomValuePane valuePane;
//横向可扩展性
private UICheckBox horizontalExtendableCheckBox;
//纵向可扩展性
private UICheckBox verticalExtendableCheckBox;
//补充空白数据
private UICheckBox useMultiplyNumCheckBox;
//补充空白数据书目输入框
private UISpinner multiNumSpinner;
public DSColumnAdvancedEditorPane() {
this.setLayout(new BorderLayout());
this.add(this.createContentPane(), BorderLayout.CENTER);
this.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 15));
}
@Override
public String getIconPath() {
return "Advanced";
}
@Override
public String title4PopupWindow() {
return "Advanced";
}
@Override
public void update() {
if (cellElement != null) {
sortPane.update(cellElement);
valuePane.update(cellElement);
filterPane.update(cellElement);
CellExpandAttr cellExpandAttr = cellElement.getCellExpandAttr();
if (cellExpandAttr == null) {
cellExpandAttr = new CellExpandAttr();
cellElement.setCellExpandAttr(cellExpandAttr);
}
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) multiNumSpinner.getValue());
} else {
cellExpandAttr.setMultipleNumber(-1);
}
}
}
@Override
public void populate() {
if (cellElement != null) {
sortPane.populate(cellElement);
valuePane.populate(cellElement);
filterPane.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) {
useMultiplyNumCheckBox.setSelected(false);
} else {
useMultiplyNumCheckBox.setSelected(true);
multiNumSpinner.setValue(cellExpandAttr.getMultipleNumber());
}
this.checkButtonEnabled();
}
}
/**
* 创建内容
*/
private JPanel createContentPane() {
this.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
this.setLayout(FRGUIPaneFactory.createBorderLayout());
//结果集排序
sortPane = new ResultSetSortConfigPane();
//结果筛选
filterPane = new ResultSetFilterConfigPane();
//自定义值显示
valuePane = new CustomValuePane();
//可扩展性
JPanel extendableDirectionPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
extendableDirectionPane.add(horizontalExtendableCheckBox = new UICheckBox(Inter.getLocText("ExpandD-Horizontal_Extendable")));
extendableDirectionPane.add(verticalExtendableCheckBox = new UICheckBox(Inter.getLocText("ExpandD-Vertical_Extendable")));
//补充空白数据
JPanel multiNumPane = new JPanel();
useMultiplyNumCheckBox = new UICheckBox(Inter.getLocText("Column_Multiple"));
multiNumPane.add(useMultiplyNumCheckBox);
multiNumPane.add(new UILabel(INSET_TEXT));
multiNumSpinner = new UISpinner(1, 10000, 1, 1);
multiNumPane.add(multiNumSpinner);
useMultiplyNumCheckBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
checkButtonEnabled();
}
});
double[] rowSize = {P, P, P, P, P, P};
double[] columnSize = {F};
Component[][] components = new Component[][]{
{sortPane},
{filterPane},
{valuePane},
{extendableDirectionPane},
{multiNumPane}
};
return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
}
private void checkButtonEnabled() {
if (useMultiplyNumCheckBox.isSelected()) {
multiNumSpinner.setEnabled(true);
} else {
multiNumSpinner.setEnabled(false);
}
}
/**
* 单元格元素>数据集>高级设置>结果排序设置面板
*
* @see com.fr.design.expand.SortExpandAttrPane
* @see DSColumnAdvancedPane.SortPane
*/
protected class ResultSetSortConfigPane extends JPanel {
//单元格
private CellElement cellElement;
//面板
private UIButtonGroup sort_type_pane;
private TinyFormulaPane tinyFormulaPane;
private CardLayout cardLayout;
private JPanel centerPane;
public ResultSetSortConfigPane() {
this.setLayout(new BorderLayout(0, 0));
Icon[] iconArray = {
IOUtils.readIcon("/com/fr/design/images/expand/none16x16.png"),
IOUtils.readIcon("/com/fr/design/images/expand/asc.png"),
IOUtils.readIcon("/com/fr/design/images/expand/des.png")
};
String[] nameArray = {Inter.getLocText("Sort-Original"), Inter.getLocText("Sort-Ascending"), Inter.getLocText("Sort-Descending")};
sort_type_pane = new UIButtonGroup(iconArray);
sort_type_pane.setAllToolTips(nameArray);
sort_type_pane.setGlobalName(Inter.getLocText("ExpandD-Sort_After_Expand"));
cardLayout = new CardLayout();
centerPane = new JPanel(cardLayout);
tinyFormulaPane = new TinyFormulaPane();
centerPane.add(new JPanel(), "none");
centerPane.add(tinyFormulaPane, "content");
//todo 国际化
UILabel sortLabel = new UILabel("排列顺序");
sort_type_pane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
boolean noContent = sort_type_pane.getSelectedIndex() == 0;
cardLayout.show(centerPane, noContent ? "none" : "content");
if (noContent) {
centerPane.setPreferredSize(new Dimension(0, 0));
} else {
centerPane.setPreferredSize(new Dimension(165, 20));
}
}
});
Component[][] components = new Component[][]{
new Component[]{sortLabel, sort_type_pane},
new Component[]{null, centerPane}
};
double[] rowSize = {P, P}, columnSize = {P, F};
this.add(TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize), BorderLayout.CENTER);
}
/**
* 刷新面板信息
*
* @param cellElement 单元格
*/
public void populate(TemplateCellElement cellElement) {
if (cellElement != null) {
this.cellElement = cellElement;
Object value = cellElement.getValue();
if (value != null && value instanceof DSColumn) {
DSColumn dSColumn = (DSColumn) value;
int sort = dSColumn.getOrder();
this.sort_type_pane.setSelectedIndex(sort);
boolean noContent = sort_type_pane.getSelectedIndex() == 0;
cardLayout.show(centerPane, noContent ? "none" : "content");
if (noContent) {
centerPane.setPreferredSize(new Dimension(0, 0));
} else {
centerPane.setPreferredSize(new Dimension(165, 20));
}
String sortFormula = dSColumn.getSortFormula();
if (sortFormula != null && sortFormula.length() >= 1) {
this.tinyFormulaPane.populateBean(sortFormula);
}
}
}
}
/**
* 保存面板配置信息
*
* @param cellElement 单元格
*/
public void update(CellElement cellElement) {
if (cellElement != null) {
Object value = cellElement.getValue();
if (value != null && value instanceof DSColumn) {
DSColumn dSColumn = (DSColumn) (cellElement.getValue());
dSColumn.setOrder(this.sort_type_pane.getSelectedIndex());
dSColumn.setSortFormula(this.tinyFormulaPane.updateBean());
}
}
}
}
/**
* 单元格元素>数据集>高级设置>结果集筛选设置面板
*
* @see DSColumnAdvancedPane.SelectCountPane
*/
protected class ResultSetFilterConfigPane extends JPanel {
private CellElement cellElement;
private UIComboBox rsComboBox;
private JPanel setCardPane;
private JPanel tipCardPane;
private UITextField serialTextField;
private JFormulaField topFormulaPane;
private JFormulaField bottomFormulaPane;
public ResultSetFilterConfigPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
UILabel filterLabel = new UILabel("结果集筛选");
//结果集筛选下拉框
rsComboBox = new UIComboBox(new String[]{
Inter.getLocText("Undefined"),
Inter.getLocText("BindColumn-Top_N"),
Inter.getLocText("BindColumn-Bottom_N"),
Inter.getLocText("Odd"),
Inter.getLocText("Even"),
Inter.getLocText("Specify")
});
rsComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
int selectIndex = rsComboBox.getSelectedIndex();
CardLayout setCardPaneLayout = (CardLayout) setCardPane.getLayout();
CardLayout tipCardPaneLayout = (CardLayout) tipCardPane.getLayout();
if (selectIndex == 1) {
setCardPaneLayout.show(setCardPane, FilterType.TOP.name());
tipCardPaneLayout.show(tipCardPane, FilterType.TOP.name());
//隐藏tip
} else if (selectIndex == 2) {
setCardPaneLayout.show(setCardPane, FilterType.BOTTOM.name());
tipCardPaneLayout.show(tipCardPane, FilterType.BOTTOM.name());
//隐藏tip
} else if (selectIndex == 3) {
setCardPaneLayout.show(setCardPane, FilterType.ODD.name());
tipCardPaneLayout.show(tipCardPane, FilterType.ODD.name());
//隐藏set
} else if (selectIndex == 4) {
setCardPaneLayout.show(setCardPane, FilterType.EVEN.name());
tipCardPaneLayout.show(tipCardPane, FilterType.EVEN.name());
//隐藏set
} else if (selectIndex == 5) {
setCardPaneLayout.show(setCardPane, FilterType.SPECIFY.name());
tipCardPaneLayout.show(tipCardPane, FilterType.SPECIFY.name());
} else {
setCardPaneLayout.show(setCardPane, FilterType.UNDEFINE.name());
tipCardPaneLayout.show(tipCardPane, FilterType.UNDEFINE.name());
//隐藏set和tip
}
}
});
//配置展示CardLayout
setCardPane = FRGUIPaneFactory.createCardLayout_S_Pane();
//提示信息展示CardLayout
tipCardPane = FRGUIPaneFactory.createCardLayout_S_Pane();
//前N个
topFormulaPane = new DSColumnAdvancedEditorPane.JFormulaField("=");
setCardPane.add(topFormulaPane, FilterType.TOP.name());
tipCardPane.add(new JPanel(), FilterType.TOP.name());
//后N个
bottomFormulaPane = new DSColumnAdvancedEditorPane.JFormulaField("=");
setCardPane.add(bottomFormulaPane, FilterType.BOTTOM.name());
tipCardPane.add(new JPanel(), FilterType.BOTTOM.name());
//自定义值下方没有提示信息,也没有输入框
setCardPane.add(new JPanel(), FilterType.UNDEFINE.name());
tipCardPane.add(new JPanel(), FilterType.UNDEFINE.name());
//奇数 UILabel 占一行作为提示信息
setCardPane.add(new JPanel(), FilterType.ODD.name());
tipCardPane.add(new UILabel(Inter.getLocText("BindColumn-Result_Serial_Number_Start_From_1")
+ "," + Inter.getLocText("BindColumn-Odd_Selected_(1,3,5...)")), "ODD");
//偶数 UILabel 占一行作为提示信息
setCardPane.add(new JPanel(), FilterType.EVEN.name());
tipCardPane.add(new UILabel(Inter.getLocText("BindColumn-Result_Serial_Number_Start_From_1")
+ "," + Inter.getLocText("BindColumn-Even_Selected_(2,4,6...)")), "ODD");
//输入框占用右半边,提示信息占一行
serialTextField = new UITextField(16);
setCardPane.add(serialTextField, FilterType.SPECIFY.name());
tipCardPane.add(new UILabel(
Inter.getLocText(new String[]{
"Format", "BindColumn-Result_Serial_Number_Start_From_1", "Inner_Parameter", "Group_Count"},
new String[]{": 1,2-3,5,8 ", ",", "$__count__"})), "SPECIFY");
this.add(TableLayoutHelper.createTableLayoutPane(new Component[][]{
{filterLabel, rsComboBox},
{null, setCardPane},
{tipCardPane, null}
}, new double[]{P, P, P}, new double[]{P, F}), BorderLayout.CENTER);
}
public void populate(CellElement cellElement) {
if (cellElement != null) {
this.cellElement = cellElement;
Object value = cellElement.getValue();
if (value != null && value instanceof DSColumn) {
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.rsComboBox.setSelectedIndex(selectCountType);
switch (selectCountType) {
case SelectCount.TOP:
this.topFormulaPane.populate(selectCount.getFormulaCount());
break;
case SelectCount.BOTTOM:
this.bottomFormulaPane.populate(selectCount.getFormulaCount());
break;
case SelectCount.SPECIFY:
this.serialTextField.setText(selectCount.getSerial());
break;
case SelectCount.EVEN:
break;
case SelectCount.ODD:
break;
default:
}
}
}
}
}
public void update(CellElement cellElement) {
if (cellElement != null) {
Object value = cellElement.getValue();
if (value != null && value instanceof DSColumn) {
DSColumn dSColumn = (DSColumn) (cellElement.getValue());
int selectedFilterIndex = this.rsComboBox.getSelectedIndex();
if (selectedFilterIndex == 0) {
dSColumn.setSelectCount(null);
} else {
SelectCount selectCount = new SelectCount();
selectCount.setType(selectedFilterIndex);
dSColumn.setSelectCount(selectCount);
if (selectedFilterIndex == SelectCount.TOP) {
selectCount.setFormulaCount(this.topFormulaPane.getFormulaText());
} else if (selectedFilterIndex == SelectCount.BOTTOM) {
selectCount.setFormulaCount(this.bottomFormulaPane.getFormulaText());
} else if (selectedFilterIndex == SelectCount.SPECIFY) {
selectCount.setSerial(this.serialTextField.getText());
}
}
}
}
}
}
/**
* 单元格元素>数据集>高级设置>公式输入框
*
* @see DSColumnAdvancedPane.JFormulaField
*/
private class JFormulaField extends JPanel {
private CellElement cellElement;
private UITextField formulaTextField;
private String defaultValue;
public JFormulaField(String defaultValue) {
double[] columnSize = {F};
double[] rowSize = {P};
this.defaultValue = defaultValue;
formulaTextField = new UITextField();
formulaTextField.setText(defaultValue);
UIButton formulaButton = new UIButton(IOUtils.readIcon("/com/fr/design/images/m_insert/formula.png"));
formulaButton.setToolTipText(Inter.getLocText("Formula") + "...");
formulaButton.setPreferredSize(new Dimension(24, formulaTextField.getPreferredSize().height));
formulaButton.addActionListener(formulaButtonActionListener);
Component[] buttonComponent = new Component[]{
formulaButton
};
JPanel pane = new JPanel(new BorderLayout(0, 0));
pane.add(formulaTextField, BorderLayout.CENTER);
pane.add(GUICoreUtils.createFlowPane(buttonComponent, FlowLayout.LEFT, LayoutConstants.HGAP_LARGE), BorderLayout.EAST);
Component[][] components = new Component[][]{
new Component[]{pane}
};
JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
this.setLayout(new BorderLayout());
this.add(panel, BorderLayout.CENTER);
}
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) {
Formula valueFormula = new Formula();
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) {
Object value = cellElement.getValue();
if (value != null && value instanceof DSColumn) {
DSColumn dsColumn = (DSColumn) value;
String[] displayNames = DesignTableDataManager.getSelectedColumnNames(DesignTableDataManager.getEditingTableDataSource(), dsColumn.getDSName());
formulaPane.populate(valueFormula, new CustomVariableResolver(displayNames, true));
formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(DSColumnAdvancedEditorPane.JFormulaField.this), new DialogActionAdapter() {
@Override
public void doOk() {
Formula valueFormula = formulaPane.update();
if (valueFormula.getContent().length() <= 1) {
formulaTextField.setText(defaultValue);
} else {
formulaTextField.setText(valueFormula.getContent().substring(1));
}
}
}).setVisible(true);
}
}
}
};
}
/**
* 单元格元素>数据集>高级设置>自定义值显示设置面板
*
* @see DSColumnAdvancedPane.ValuePane
*/
private class CustomValuePane extends JPanel {
private JFormulaField formulaField;
public CustomValuePane() {
this.setLayout(FRGUIPaneFactory.createBoxFlowLayout());
UILabel customValueLabel = new UILabel("显示值");
formulaField = new JFormulaField("$$$");
formulaField.setPreferredSize(new Dimension(159, 20));
this.add(TableLayoutHelper.createTableLayoutPane(new Component[][]{
{customValueLabel, formulaField},
}, new double[]{P}, new double[]{P, F}), BorderLayout.CENTER);
}
public void populate(CellElement cellElement) {
if (cellElement != null) {
Object value = cellElement.getValue();
if (value != null && value instanceof DSColumn) {
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) {
Object value = cellElement.getValue();
if (value != null && value instanceof DSColumn) {
DSColumn dSColumn = (DSColumn) (cellElement.getValue());
dSColumn.setResult(this.formulaField.getFormulaText());
}
}
}
}
} }
} }

64
designer_base/src/com/fr/design/layout/FRGUIPaneFactory.java

@ -1,24 +1,12 @@
package com.fr.design.layout; package com.fr.design.layout;
import java.awt.BorderLayout; import com.fr.design.border.UITitledBorder;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import com.fr.design.border.UITitledBorder; import javax.swing.*;
import java.awt.*;
public class FRGUIPaneFactory { public class FRGUIPaneFactory {
private FRGUIPaneFactory() {
}
public static final float WIDTH_PARA_F = 80.0f; public static final float WIDTH_PARA_F = 80.0f;
public static final int WIDTH_OFFSET_N = 60; public static final int WIDTH_OFFSET_N = 60;
public static final int WIDTH_OFFSET_M = 20; public static final int WIDTH_OFFSET_M = 20;
@ -27,8 +15,12 @@ public class FRGUIPaneFactory {
public static final int HEIGHT_PARA = 25; public static final int HEIGHT_PARA = 25;
public static final int HEIGHT_OFFSET = 50; public static final int HEIGHT_OFFSET = 50;
private FRGUIPaneFactory() {
}
/** /**
* 创建一个靠右靠左的水平间隙为2的流式布局 * 创建一个靠右靠左的水平间隙为2的流式布局
*
* @return FlowLayout对象 * @return FlowLayout对象
*/ */
public static LayoutManager createBoxFlowLayout() { // createBoxFlowLayout 图表用到的比较多 public static LayoutManager createBoxFlowLayout() { // createBoxFlowLayout 图表用到的比较多
@ -37,6 +29,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左的布局 * 创建一个靠左的布局
*
* @return FlowLayout对象 * @return FlowLayout对象
*/ */
public static LayoutManager createLeftZeroLayout() { public static LayoutManager createLeftZeroLayout() {
@ -45,6 +38,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左的水平和垂直间隙均为5的流式布局 * 创建一个靠左的水平和垂直间隙均为5的流式布局
*
* @return FlowLayout对象 * @return FlowLayout对象
*/ */
public static LayoutManager createLabelFlowLayout() { // createLabelFlowLayout public static LayoutManager createLabelFlowLayout() { // createLabelFlowLayout
@ -53,6 +47,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左流式布局间距10,10 * 创建一个靠左流式布局间距10,10
*
* @return FlowLayout对象 * @return FlowLayout对象
*/ */
public static LayoutManager createL_FlowLayout() { public static LayoutManager createL_FlowLayout() {
@ -61,6 +56,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个居中流式布局 * 创建一个居中流式布局
*
* @return FlowLayout对象 * @return FlowLayout对象
*/ */
public static LayoutManager createCenterFlowLayout() { public static LayoutManager createCenterFlowLayout() {
@ -69,6 +65,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠右流式布局 * 创建一个靠右流式布局
*
* @return FlowLayout对象 * @return FlowLayout对象
*/ */
public static LayoutManager createRightFlowLayout() { public static LayoutManager createRightFlowLayout() {
@ -77,6 +74,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个边框布局 * 创建一个边框布局
*
* @return BorderLayout对象 * @return BorderLayout对象
*/ */
public static LayoutManager createBorderLayout() { public static LayoutManager createBorderLayout() {
@ -85,16 +83,17 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个边框布局间距4,4 * 创建一个边框布局间距4,4
*
* @return BorderLayout对象 * @return BorderLayout对象
*/ */
public static LayoutManager createM_BorderLayout() { public static LayoutManager createM_BorderLayout() {
return new BorderLayout(4,4); return new BorderLayout(4, 4);
} }
// TODO 删掉
/** /**
* 创建一个1列的网格布局 * 创建一个1列的网格布局
*
* @return FRGridLayout对象 * @return FRGridLayout对象
*/ */
public static LayoutManager create1ColumnGridLayout() { public static LayoutManager create1ColumnGridLayout() {
@ -103,6 +102,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个2列的网格布局 * 创建一个2列的网格布局
*
* @return FRGridLayout对象 * @return FRGridLayout对象
*/ */
public static LayoutManager create2ColumnGridLayout() { public static LayoutManager create2ColumnGridLayout() {
@ -111,6 +111,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个n列的网格布局 * 创建一个n列的网格布局
*
* @param nColumn 列数 * @param nColumn 列数
* @return FRGridLayout对象 * @return FRGridLayout对象
*/ */
@ -120,6 +121,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个带标题边框面板 * 创建一个带标题边框面板
*
* @param string 边框标题 * @param string 边框标题
* @return JPanel对象 * @return JPanel对象
*/ */
@ -133,6 +135,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个带标题边框面板并且居中显示 * 创建一个带标题边框面板并且居中显示
*
* @param borderTitle 边框标题 * @param borderTitle 边框标题
* @return JPanel对象 * @return JPanel对象
*/ */
@ -146,6 +149,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左空边框布局间隔大 * 创建一个靠左空边框布局间隔大
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createBigHGapFlowInnerContainer_M_Pane() { public static JPanel createBigHGapFlowInnerContainer_M_Pane() {
@ -157,6 +161,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左空边框面板间隔中等 * 创建一个靠左空边框面板间隔中等
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createMediumHGapFlowInnerContainer_M_Pane() { public static JPanel createMediumHGapFlowInnerContainer_M_Pane() {
@ -168,6 +173,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左空边框面板间隔中等 * 创建一个靠左空边框面板间隔中等
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createMediumHGapHighTopFlowInnerContainer_M_Pane() { public static JPanel createMediumHGapHighTopFlowInnerContainer_M_Pane() {
@ -179,6 +185,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个正常靠左空边框面板 * 创建一个正常靠左空边框面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createNormalFlowInnerContainer_M_Pane() { public static JPanel createNormalFlowInnerContainer_M_Pane() {
@ -190,6 +197,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左0间距边框面板 * 创建一个靠左0间距边框面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createLeftFlowZeroGapBorderPane() { public static JPanel createLeftFlowZeroGapBorderPane() {
@ -201,6 +209,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左流式布局正常流式内嵌 * 创建一个靠左流式布局正常流式内嵌
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createNormalFlowInnerContainer_S_Pane() { public static JPanel createNormalFlowInnerContainer_S_Pane() {
@ -211,6 +220,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠左流式布局流式内嵌 * 创建一个靠左流式布局流式内嵌
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createBoxFlowInnerContainer_S_Pane() { public static JPanel createBoxFlowInnerContainer_S_Pane() {
@ -221,6 +231,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个靠右面板 * 创建一个靠右面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createRightFlowInnerContainer_S_Pane() { public static JPanel createRightFlowInnerContainer_S_Pane() {
@ -231,6 +242,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个居中面板 * 创建一个居中面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createCenterFlowInnerContainer_S_Pane() { public static JPanel createCenterFlowInnerContainer_S_Pane() {
@ -241,6 +253,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建一个居中0间距面板 * 创建一个居中0间距面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createCenterFlowZeroGapBorderPane() { public static JPanel createCenterFlowZeroGapBorderPane() {
@ -252,6 +265,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建纵向排列面板 * 创建纵向排列面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createY_AXISBoxInnerContainer_L_Pane() { public static JPanel createY_AXISBoxInnerContainer_L_Pane() {
@ -263,6 +277,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建纵向边框面板 * 创建纵向边框面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createYBoxEmptyBorderPane() { public static JPanel createYBoxEmptyBorderPane() {
@ -274,6 +289,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建横向面板 * 创建横向面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createX_AXISBoxInnerContainer_L_Pane() { public static JPanel createX_AXISBoxInnerContainer_L_Pane() {
@ -285,6 +301,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建纵向面板M * 创建纵向面板M
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createY_AXISBoxInnerContainer_M_Pane() { public static JPanel createY_AXISBoxInnerContainer_M_Pane() {
@ -296,6 +313,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建横向内置boxlayout的面板 * 创建横向内置boxlayout的面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createX_AXISBoxInnerContainer_M_Pane() { public static JPanel createX_AXISBoxInnerContainer_M_Pane() {
@ -307,6 +325,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建纵向内置boxlayout的面板 * 创建纵向内置boxlayout的面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createY_AXISBoxInnerContainer_S_Pane() { public static JPanel createY_AXISBoxInnerContainer_S_Pane() {
@ -317,6 +336,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建横向内置boxlayout的面板 * 创建横向内置boxlayout的面板
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createX_AXISBoxInnerContainer_S_Pane() { public static JPanel createX_AXISBoxInnerContainer_S_Pane() {
@ -327,6 +347,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建n列网格面板 * 创建n列网格面板
*
* @param nColumn 列数 * @param nColumn 列数
* @return JPanel对象 * @return JPanel对象
*/ */
@ -338,6 +359,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建n列网格面板 * 创建n列网格面板
*
* @param nColumn 列数 * @param nColumn 列数
* @param h 水平间距 * @param h 水平间距
* @param v 垂直间距 * @param v 垂直间距
@ -351,6 +373,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建顶格n列网格面板 * 创建顶格n列网格面板
*
* @param nColumn 列数 * @param nColumn 列数
* @return JPanel对象 * @return JPanel对象
*/ */
@ -362,6 +385,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建边框面板L * 创建边框面板L
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createBorderLayout_L_Pane() { public static JPanel createBorderLayout_L_Pane() {
@ -373,6 +397,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建边框面板M * 创建边框面板M
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createBorderLayout_M_Pane() { public static JPanel createBorderLayout_M_Pane() {
@ -384,6 +409,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建边框面板S * 创建边框面板S
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createBorderLayout_S_Pane() { public static JPanel createBorderLayout_S_Pane() {
@ -394,6 +420,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建卡片式布局 * 创建卡片式布局
*
* @return JPanel对象 * @return JPanel对象
*/ */
public static JPanel createCardLayout_S_Pane() { public static JPanel createCardLayout_S_Pane() {
@ -404,6 +431,7 @@ public class FRGUIPaneFactory {
/** /**
* 创建图标IconRadio面板 * 创建图标IconRadio面板
*
* @param icon 图标 * @param icon 图标
* @param jradiobtn 按钮 * @param jradiobtn 按钮
* @return JPanel对象 * @return JPanel对象
@ -423,6 +451,7 @@ public class FRGUIPaneFactory {
/** /**
* 计算宽度 * 计算宽度
*
* @param width 宽度输入值 * @param width 宽度输入值
* @return w 宽度输出值 * @return w 宽度输出值
*/ */
@ -443,6 +472,7 @@ public class FRGUIPaneFactory {
/** /**
* 计算高度 * 计算高度
*
* @param height 高度输入值 * @param height 高度输入值
* @return 高度输出值 * @return 高度输出值
*/ */

3
designer_base/src/com/fr/design/utils/DesignUtils.java

@ -52,7 +52,8 @@ public class DesignUtils {
public static boolean isStarted() { public static boolean isStarted() {
try { try {
new Socket("localhost", port); new Socket("localhost", port);
return true; // return true;
return false;
} catch (Exception exp) { } catch (Exception exp) {
} }

Loading…
Cancel
Save