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

378 lines
15 KiB

package com.fr.design.present.dict;
import com.fr.base.BaseFormula;
import com.fr.base.TableData;
import com.fr.data.TableDataSource;
import com.fr.data.impl.DBTableData;
import com.fr.data.impl.DynamicSQLDict;
import com.fr.data.impl.NameTableData;
import com.fr.data.impl.TableDataDictionary;
import com.fr.design.DesignModelAdapter;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.constants.UIConstants;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.TableDataComboBox;
import com.fr.design.data.datapane.TableDataTreePane;
import com.fr.design.data.datapane.preview.PreviewLabel;
import com.fr.design.data.datapane.preview.PreviewLabel.Previewable;
import com.fr.design.data.tabledata.Prepare4DataSourceChange;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
import com.fr.design.editor.DoubleDeckValueEditorPane;
import com.fr.design.editor.editor.ColumnIndexEditor;
import com.fr.design.editor.editor.ColumnNameEditor;
import com.fr.design.editor.editor.Editor;
import com.fr.design.editor.editor.FormulaEditor;
import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
/**
* 数据字典的数据查询面板
*
* @editor zhou
* @since 2012-3-29下午1:49:24
*/
public class TableDataDictPane extends FurtherBasicBeanPane<TableDataDictionary> implements Previewable, UIObserver, Prepare4DataSourceChange {
private static final int BEGIN = 1;
private static final int END = 10;
private static final int VGAP = 24;
private static final long serialVersionUID = -5469742115988153206L;
private static final int SELECTED_NO_TABLEDATA = -2;
public TableDataComboBox tableDataNameComboBox;
private DoubleDeckValueEditorPane keyColumnPane;
private DoubleDeckValueEditorPane valueDictPane;
private ItemListener itemListener;
private UIObserverListener uiObserverListener;
private FormulaEditor localFormulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula"));
public TableDataDictPane() {
initBasicComponets();
initComponents();
iniListener();
}
public static void main(String[] args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content = (JPanel) jf.getContentPane();
content.setLayout(new BorderLayout());
content.add(new TableDataDictPane(), BorderLayout.NORTH);
GUICoreUtils.centerWindow(jf);
jf.setSize(290, 400);
jf.setVisible(true);
}
private void initBasicComponets() {
tableDataNameComboBox = new TableDataComboBox(DesignTableDataManager.getEditingTableDataSource());
tableDataNameComboBox.addItemListener(e -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
tdChange(e);
}
});
// keyColumnPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()});
keyColumnPane = new DoubleDeckValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()});
FormulaEditor formulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula"));
formulaEditor.setEnabled(true);
// valueDictPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor(), formulaEditor});
valueDictPane = new DoubleDeckValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor(), formulaEditor});
}
private void initComponents() {
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double[] columnSize = {p, f};
double[] rowSize = {p, p, p, p, p};
int[][] rowCount = {{1, 1}, {1, 3}, {1, 3}};
JPanel firstLine = new JPanel(new BorderLayout(4, 0));
firstLine.add(tableDataNameComboBox, BorderLayout.CENTER);
firstLine.add(new PreviewLabel(this), BorderLayout.EAST);
Component[][] components = new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Table_Data") + " ", UILabel.LEFT), firstLine},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Actual_Value") + " ", UILabel.LEFT), keyColumnPane},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Display_Value") + " ", UILabel.LEFT), valueDictPane},
};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, VGAP, LayoutConstants.VGAP_MEDIUM);
this.setLayout(new BorderLayout());
this.add(panel, BorderLayout.CENTER);
}
private void iniListener() {
if (shouldResponseChangeListener()) {
this.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (uiObserverListener == null) {
return;
}
if (e.getStateChange() == ItemEvent.SELECTED) {
uiObserverListener.doChange();
}
}
});
}
}
/**
* 增加Listener
*
* @param aListener 将本对象的Listener指向该listener
*/
public void addItemListener(ItemListener aListener) {
this.itemListener = aListener;
}
/**
* 该面板标题
*
* @return 返回是窗口显示的标题
*/
public String title4PopupWindow() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dic_Data_Query");
}
private void tdChange(final ItemEvent e) {
TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem();
if (tableDataWrappe == null) {
return;
}
List<String> namelist = tableDataWrappe.calculateColumnNameList();
String[] columnNames = null;
if (!namelist.isEmpty()) {
columnNames = namelist.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
} else {
columnNames = new String[]{StringUtils.EMPTY};
}
// 实际值列名
ColumnNameEditor actualColumnNameEditor = new ColumnNameEditor(columnNames);
actualColumnNameEditor.addItemListener(itemListener);
// 实际值列序号
ColumnIndexEditor actualColumnIndexEditor = new ColumnIndexEditor(columnNames.length);
actualColumnIndexEditor.addItemListener(itemListener);
keyColumnPane.setEditors(new Editor[]{actualColumnNameEditor, actualColumnIndexEditor}, columnNames[0]);
FormulaEditor formulaEditor = new FormulaEditor(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Formula"));
formulaEditor.setEnabled(true);
formulaEditor.addChangeListener(ee -> {
if (itemListener != null) {
itemListener.itemStateChanged(e);
}
});
// 显示值列名
ColumnNameEditor displayColumnNameEditor = new ColumnNameEditor(columnNames);
displayColumnNameEditor.addItemListener(itemListener);
// 显示值列序号
ColumnIndexEditor displayColumnIndexEditor = new ColumnIndexEditor(columnNames.length);
displayColumnIndexEditor.addItemListener(itemListener);
valueDictPane.setEditors(new Editor[]{displayColumnNameEditor, displayColumnIndexEditor, formulaEditor}, columnNames[0]);
if (itemListener != null) {
itemListener.itemStateChanged(e);
}
}
@Override
/**
*
*/
public void populateBean(TableDataDictionary tableDataDict) {
populate(tableDataDict, "");
}
private void populate(TableDataDictionary tableDataDict, String name) {
if (tableDataDict == null || tableDataDict.getTableData() == TableData.EMPTY_TABLEDATA) {
this.tableDataNameComboBox.setSelectedIndex(-1);
this.keyColumnPane.populate(StringUtils.EMPTY);
this.valueDictPane.populate(StringUtils.EMPTY);
return;
}
if (tableDataDict.getTableData() instanceof DBTableData && !"".equals(name)) {
this.tableDataNameComboBox.putTableDataIntoMap(name, new TemplateTableDataWrapper(
(DBTableData) tableDataDict.getTableData(), name));
this.tableDataNameComboBox.setSelectedTableDataByName(name);
} else if (tableDataDict.getTableData() instanceof NameTableData) {
this.tableDataNameComboBox.setSelectedTableDataByName(((NameTableData) tableDataDict.getTableData())
.getName());
}
// alex:因为显示到界面上的index是以1为始的,所以要加1
TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem();
if (tableDataWrappe == null) {
keyColumnPane.resetComponets();
valueDictPane.resetComponets();
} else {
if (StringUtils.isNotEmpty(tableDataDict.getKeyColumnName())) {
this.keyColumnPane.populate(tableDataDict.getKeyColumnName());
} else {
this.keyColumnPane.populate(tableDataDict.getKeyColumnIndex() + 1);
}
Object value = null;
if (tableDataDict.getFormula() != null) {
value = tableDataDict.getFormula();
} else {
if (StringUtils.isNotEmpty(tableDataDict.getValueColumnName())) {
value = tableDataDict.getValueColumnName();
} else {
value = tableDataDict.getValueColumnIndex() + 1;
}
}
this.valueDictPane.populate(value);
}
}
/**
* @param dsql
*/
public void populateBean(DynamicSQLDict dsql) {
DBTableData db = new DBTableData(dsql.getDatabaseConnection(), dsql.getSqlFormula());
String name = "";
TableDataSource dataSource = DesignTableDataManager.getEditingTableDataSource();
if (dataSource != null) {
for (int i = BEGIN; i < END; i++) {
TableData td = dataSource.getTableData(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dictionary_Dynamic_SQL") + i);
if (td == null) {
name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dictionary_Dynamic_SQL") + i;
dataSource.putTableData(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dictionary_Dynamic_SQL") + i, db);
break;
} else {
if (ComparatorUtils.equals(td, db)) {
name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dictionary_Dynamic_SQL") + i;
break;
} else {
continue;
}
}
}
}
TableDataDictionary tdd = new TableDataDictionary(db, dsql.getKeyColumnIndex(), dsql.getValueColumnIndex());
if (dsql.getFormula() != null) {
tdd.setFormula(dsql.getFormula());
}
this.populate(tdd, name);
TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter());
}
/**
* @return
*/
public TableDataDictionary updateBean() {
TableDataDictionary tableDataDict = new TableDataDictionary();
Object object = this.valueDictPane.update();
// alex:因为显示到界面上的index是以1为始的,所以要减1
// carl:假如这里的序号要变,请考虑6.2的兼容
if (object instanceof Integer) {
int valuleColumnIndex = (Integer) object - 1;
String valueColumnName = StringUtils.EMPTY;
if (this.valueDictPane.getCurrentEditor() instanceof ColumnNameEditor) {
valueColumnName = ((ColumnNameEditor) this.valueDictPane.getCurrentEditor()).getColumnName();
valuleColumnIndex = -1;
}
tableDataDict.setValueColumnIndex(valuleColumnIndex);
tableDataDict.setValueColumnName(valueColumnName);
} else {
tableDataDict.setFormula(((BaseFormula) object));
}
TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem();
if (tableDataWrappe != null) {
tableDataDict.setTableData(new NameTableData(tableDataWrappe.getTableDataName()));
int keyColumnIndex = (Integer) this.keyColumnPane.update() - 1;
String keyColumnName = StringUtils.EMPTY;
if (keyColumnPane.getCurrentEditor() instanceof ColumnNameEditor) {
keyColumnName = ((ColumnNameEditor) this.keyColumnPane.getCurrentEditor()).getColumnName();
keyColumnIndex = -1;
}
tableDataDict.setKeyColumnIndex(keyColumnIndex);
tableDataDict.setKeyColumnName(keyColumnName);
}
return tableDataDict;
}
/**
* 预览
*/
public void preview() {
TableDataWrapper tableDataWrappe = tableDataNameComboBox.getSelectedItem();
if (tableDataWrappe == null) {
return;
}
Object object = this.valueDictPane.update();
if (object instanceof Integer) {
tableDataWrappe.previewData((Integer) this.keyColumnPane.update() - 1, (Integer) object - 1);
}
}
/**
* 判断ob是否是TableDataDictionary类型
*
* @param ob 用于判断的Object
* @return 如果是TableDataDictionary类型,则返回true
*/
public boolean accept(Object ob) {
return ob instanceof TableDataDictionary;
}
@Override
/**
*重置
*/
public void reset() {
GUICoreUtils.setSelectedItemQuietly(tableDataNameComboBox, UIConstants.PENDING);
keyColumnPane.clearComponentsData();
valueDictPane.clearComponentsData();
}
/**
* 给组件登记一个观察者监听事件
*
* @param listener 观察者监听事件
*/
public void registerChangeListener(UIObserverListener listener) {
uiObserverListener = listener;
}
/**
* 是否应该相应listener事件
*
* @return 要是响应listener事件,则返回true
*/
public boolean shouldResponseChangeListener() {
return true;
}
@Override
public void registerDSChangeListener() {
tableDataNameComboBox.registerGlobalDSChangeListener();
}
}