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

484 lines
17 KiB

package com.fr.design.data;
import com.fr.base.BaseUtils;
import com.fr.base.TableData;
import com.fr.data.TableDataSource;
import com.fr.data.api.StoreProcedureAssist;
import com.fr.data.impl.storeproc.StoreProcedure;
import com.fr.design.DesignModelAdapter;
import com.fr.design.actions.UpdateAction;
import com.fr.design.data.datapane.TableDataCreatorProducer;
import com.fr.design.data.datapane.TableDataNameObjectCreator;
import com.fr.design.data.datapane.TableDataSourceOP;
import com.fr.design.data.datapane.TableDataTree;
import com.fr.design.data.tabledata.ResponseDataSourceChange;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.design.data.tabledata.wrapper.StoreProcedureDataWrapper;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
import com.fr.design.editlock.ConnectionLockChangeChecker;
import com.fr.design.editlock.EditLockUtils;
import com.fr.design.gui.ibutton.UIHeadGroup;
import com.fr.design.gui.ibutton.UILockButton;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode;
import com.fr.design.icon.IconPathConstants;
import com.fr.design.mainframe.DockingView;
import com.fr.design.menu.LineSeparator;
import com.fr.design.menu.MenuDef;
import com.fr.general.ComparatorUtils;
import com.fr.general.NameObject;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.DefaultCellEditor;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.tree.TreeCellEditor;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Coder: zack
* Date: 2016/4/22
* Time: 16:23
*/
public abstract class BasicTableDataTreePane extends DockingView implements ResponseDataSourceChange {
protected static final int PROCEDURE_NAME_INDEX = 4;
protected static final int TEMPLATE_TABLE_DATA = 0;
protected static final int SERVER_TABLE_DATA = 1;
protected MenuDef addMenuDef;
protected DesignModelAdapter<?, ?> tc;
protected UIHeadGroup buttonGroup;
protected String[] allDSNames;
protected ConnectionTableAction connectionTableAction;
private String type = "";
/**
* 最佳位置
*
* @return 返回位置
*/
@Override
public Location preferredLocation() {
return Location.WEST_ABOVE;
}
/**
* getViewTitle()
*
* @return
*/
@Override
public String getViewTitle() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_TableData");
}
/**
* getViewIcon
*
* @return
*/
@Override
public Icon getViewIcon() {
return BaseUtils.readIcon(IconPathConstants.DS_ICON_PATH);
}
/**
* 响应数据集改变
*/
@Override
public void fireDSChanged() {
fireDSChanged(new HashMap<String, String>());
}
/**
* 响应数据集改变
*
* @param map 数据集变化Map
*/
@Override
public void fireDSChanged(Map<String, String> map) {
DesignTableDataManager.fireDSChanged(map);
}
public void dgEdit(final AbstractTableDataPane<?> uPanel, String originalName) {
dgEdit(uPanel, originalName, false);
}
public abstract void dgEdit(final AbstractTableDataPane<?> uPanel, String originalName, boolean isUpdate);
protected void doPropertyChange(BasicDialog dg, BasicPane.NamePane nPanel, final String oldName) {
type = dg.getTitle();
nPanel.setShowText(StringUtils.BLANK);
dg.setButtonEnabled(true);
String tempName = nPanel.getObjectName();
if (StringUtils.isBlank(tempName)) {
nPanel.setShowText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips"));
dg.setButtonEnabled(false);
} else if (!ComparatorUtils.equals(oldName, tempName) && isDsNameRepeaded(tempName)) {
nPanel.setShowText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Table_Data_Duplicate_Name_Tips", tempName));
dg.setButtonEnabled(false);
} else if (isProcedureName(oldName)) {
if (isIncludeUnderline(tempName)) {
nPanel.setShowText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Stored_Procedure_Name_Tips"));
dg.setButtonEnabled(false);
}
} else if (!BasicTableDataUtils.checkName(tempName)) {
dg.setButtonEnabled(false);
} else {
nPanel.setShowText(StringUtils.BLANK);
dg.setButtonEnabled(true);
}
}
private boolean isProcedureName(String oldName) {
return oldName.length() >= PROCEDURE_NAME_INDEX && ComparatorUtils.equals(type, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Stored_Procedure"));
}
private boolean isIncludeUnderline(String name) {
return ComparatorUtils.equals(name.indexOf(StoreProcedureAssist.GROUP_MARKER), -1) ? false : true;
}
public abstract void addDataPane(final AbstractTableDataPane<?> uPanel, String paneName);
public abstract TableDataTree getDataTree();
@Override
public abstract void refreshDockingView();
protected void checkButtonEnabled(UpdateAction editAction, UpdateAction previewTableDataAction, UpdateAction removeAction, TableDataSourceOP op, TableDataTree dataTree) {
// august:BUG 9344
addMenuDef.setEnabled(true);
connectionTableAction.setEnabled(WorkContext.getCurrent() != null && WorkContext.getCurrent().isRoot());
if (op == null || op.interceptButtonEnabled()) {
addMenuDef.setEnabled(false);
editAction.setEnabled(false);
removeAction.setEnabled(false);
previewTableDataAction.setEnabled(false);
return;
}
if (op.getDataMode() == SERVER_TABLE_DATA) {
addMenuDef.setEnabled(false);
removeAction.setEnabled(false);
}
int selectioncount = dataTree.getSelectionCount();
switch (selectioncount) {
case 0:
editAction.setEnabled(false);
removeAction.setEnabled(false);
previewTableDataAction.setEnabled(false);
break;
case 1:
boolean istmp = false;
if (dataTree.getSelectedNameObject().getObject() == null || dataTree.getSelectedNameObject().getObject() instanceof TemplateTableDataWrapper) {
istmp = true;
}
editAction.setEnabled(istmp);
removeAction.setEnabled(istmp);
previewTableDataAction.setEnabled(true);
break;
default:
editAction.setEnabled(false);
previewTableDataAction.setEnabled(false);
}
if (dataTree.getSelectionPath() != null) {
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) dataTree.getSelectionPath().getLastPathComponent();
if (selectedTreeNode.getUserObject() instanceof String) {
previewTableDataAction.setEnabled(false);
editAction.setEnabled(false);
removeAction.setEnabled(false);
}
}
}
protected class TableDataTreeCellEditor extends DefaultCellEditor implements TreeCellEditor, CellEditorListener {
private NameObject editingNO;
private String oldName;
private String newName;
private UITextField jTextField;
private TableDataTree dataTree;
private BasicTableDataTreePane pane;
public TableDataTreeCellEditor(final UITextField textField, TableDataTree dataTree, BasicTableDataTreePane pane) {
super(textField);
this.jTextField = textField;
this.dataTree = dataTree;
this.pane = pane;
}
@Override
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
editingNO = dataTree.getSelectedNameObject();
oldName = editingNO.getName();
delegate.setValue(oldName);
if (jTextField != null) {
jTextField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
// stopCellEditing 执行过程中会调用到 getCellEditorValue
stopCellEditing();
}
});
}
editorComponent.setPreferredSize(new java.awt.Dimension(pane.getPreferredSize().width, editorComponent.getPreferredSize().height));
return editorComponent;
}
@Override
public boolean isCellEditable(EventObject anEvent) {
NameObject no = dataTree.getSelectedNameObject();
return no != null && anEvent == null;
}
@Override
public Object getCellEditorValue() {
newName = super.getCellEditorValue().toString();
editingNO.setName(newName);
// 如果没有重命名成功,则还原成原来的oldName
if (tc != null && !tc.renameTableData(oldName, newName)) {
editingNO.setName(oldName);
}
if (dataTree.isNameRepeated(newName)) {
editingNO.setName(oldName);
}
return editingNO;
}
/*
* 下面两个方法是CellEditorListener的
*/
@Override
public void editingCanceled(ChangeEvent e) {
// Do nothing
}
@Override
public void editingStopped(ChangeEvent e) {
// Do nothing
}
}
protected void createAddMenuDef() {
TableDataNameObjectCreator[] creators = TableDataCreatorProducer.getInstance().createReportTableDataCreator();
for (final TableDataNameObjectCreator creator : creators) {
if (creator.shouldInsertSeparator()) {
addMenuDef.addShortCut(new LineSeparator());
}
addMenuDef.addShortCut(new TDAction() {
@Override
protected String getTDName() {
return creator.menuName();
}
@Override
protected Icon getTDIcon() {
return creator.menuIcon();
}
@Override
protected String getNamePrefix() {
return creator.getPrefix();
}
@Override
protected TemplateTableDataWrapper getTableDataInstance() {
return new TemplateTableDataWrapper((TableData) creator.createObject());
}
});
}
}
private abstract class TDAction extends UpdateAction {
protected abstract String getTDName();
protected abstract Icon getTDIcon();
protected abstract String getNamePrefix();
protected abstract TemplateTableDataWrapper getTableDataInstance();
public TDAction() {
this.setName(this.getTDName());
this.setSmallIcon(this.getTDIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
dgEdit(getTableDataInstance().creatTableDataPane(), createDsName(getNamePrefix()), false);
}
}
private String createDsName(String prefix) {
int count = 1;
allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook());
while (isDsNameRepeaded(prefix + count)) {
count++;
}
return prefix + count;
}
protected boolean isDsNameRepeaded(String name) {
if (allDSNames == null) {
allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook());
}
for (int i = 0; i < allDSNames.length; i++) {
if (ComparatorUtils.equals(name, allDSNames[i])) {
return true;
}
}
return false;
}
protected KeyAdapter getTableTreeNodeListener(final UpdateAction editAction, final UpdateAction previewTableDataAction, final UpdateAction removeAction, final TableDataSourceOP op, final TableDataTree dataTree) {
return new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//F2重命名先屏蔽了, 有bug没时间弄
if (e.getKeyCode() == KeyEvent.VK_F2) {
return;
}
super.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
checkButtonEnabled(editAction, previewTableDataAction, removeAction, op, dataTree);
}
};
}
/**
* 创建不重复的名字即初始的默认名
*
* @param tree 树
* @param prefix 后缀
* @return 返回名字
*/
public static String createUnrepeatedName(TableDataTree tree, String prefix) {
int count = 1;
while (tree.isNameRepeated(prefix + count)) {
count++;
}
return prefix + count;
}
protected class PreviewTableDataAction extends UpdateAction {
private TableDataTree dataTree;
public PreviewTableDataAction(TableDataTree dataTree) {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"));
this.setMnemonic('p');
this.setSmallIcon("/com/fr/design/images/m_file/preview");
this.dataTree = dataTree;
}
@Override
public void actionPerformed(ActionEvent e) {
NameObject selectedNO = dataTree.getRealSelectedNameObject();
Object data = null;
if (selectedNO != null) {
data = selectedNO.getObject();
}
try {
if (((TableDataWrapper) Objects.requireNonNull(data)).getTableData() instanceof StoreProcedure) {
((StoreProcedure) (((TableDataWrapper) data).getTableData())).resetDataModelList();
if (data instanceof StoreProcedureDataWrapper) {
StoreProcedureDataWrapper oldSdw = ((StoreProcedureDataWrapper) data);
StoreProcedureDataWrapper newSdw = new StoreProcedureDataWrapper((StoreProcedure) oldSdw.getTableData(), oldSdw.getStoreprocedureName(), oldSdw.getTableDataName());
newSdw.previewData(StoreProcedureDataWrapper.PREVIEW_ONE);
} else {
StoreProcedure storeProcedure = (StoreProcedure) ((TableDataWrapper) data).getTableData();
StoreProcedureDataWrapper storeProcedureDataWrapper = new StoreProcedureDataWrapper(storeProcedure, StringUtils.EMPTY, StringUtils.EMPTY);
storeProcedureDataWrapper.previewData(StoreProcedureDataWrapper.PREVIEW_ALL);
}
} else {
((TableDataWrapper) data).previewData();
}
} catch (Exception ex) {
FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
}
}
}
protected class ConnectionTableAction extends com.fr.design.actions.server.ConnectionListAction {
public ConnectionTableAction() {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Server_Define_Data_Connection"));
this.setMnemonic('D');
this.setSmallIcon("/com/fr/design/images/m_web/connection");
}
@Override
public JComponent createToolBarComponent() {
Object object = this.getValue(UILockButton.class.getName());
if (!(object instanceof AbstractButton)) {
UILockButton button = new UILockButton(
EditLockUtils.CONNECTION_LOCKED_ICON,
(Icon) this.getValue(Action.SMALL_ICON),
EditLockUtils.CONNECTION_LOCKED_TOOLTIPS,
getToolTipText()
);
initButton(button, UILockButton.class.getName());
object = button;
ConnectionLockChangeChecker.getInstance().addEditLockChangeListener((UILockButton)object);
}
return (JComponent) object;
}
}
/**
* 合并数据集并返回自动更改数据集名字的新老名字键值对
* @param srcName 数据集来源(比如报表块,就是报表块的名称)
* @param tableDataSource 数据集
*/
public Map<String, String> addTableData(String srcName, TableDataSource tableDataSource, boolean isCover) {
return new HashMap<>(0);
}
public Map<String, String> addTableData(String srcName, TableDataSource tableDataSource) {
return addTableData(srcName, tableDataSource, false);
}
public void removeTableData(String sourceName) {
}
}