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.
321 lines
13 KiB
321 lines
13 KiB
package com.fr.design.data.datapane; |
|
|
|
import com.fr.base.BaseUtils; |
|
import com.fr.base.TableData; |
|
import com.fr.data.TableDataSource; |
|
import com.fr.design.DesignModelAdapter; |
|
import com.fr.design.ExtraDesignClassManager; |
|
import com.fr.design.actions.UpdateAction; |
|
import com.fr.design.data.BasicTableDataTreePane; |
|
import com.fr.design.data.DesignTableDataManager; |
|
import com.fr.design.data.tabledata.StoreProcedureWorkerListener; |
|
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; |
|
import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper; |
|
import com.fr.design.dialog.BasicDialog; |
|
import com.fr.design.dialog.BasicPane; |
|
import com.fr.design.dialog.DialogActionAdapter; |
|
import com.fr.design.fun.TableDataDefineProvider; |
|
import com.fr.design.fun.TableDataPaneProcessor; |
|
import com.fr.design.gui.ibutton.UIHeadGroup; |
|
import com.fr.design.gui.icontainer.UIScrollPane; |
|
import com.fr.design.gui.itextfield.UITextField; |
|
import com.fr.design.gui.itoolbar.UIToolbar; |
|
import com.fr.design.icon.IconPathConstants; |
|
import com.fr.design.layout.FRGUIPaneFactory; |
|
import com.fr.design.mainframe.DesignerContext; |
|
import com.fr.design.menu.MenuDef; |
|
import com.fr.design.menu.SeparatorDef; |
|
import com.fr.design.menu.ToolBarDef; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.general.Inter; |
|
import com.fr.general.NameObject; |
|
import com.fr.plugin.context.PluginContext; |
|
import com.fr.plugin.injectable.PluginModule; |
|
import com.fr.plugin.manage.PluginFilter; |
|
import com.fr.plugin.observer.PluginEvent; |
|
import com.fr.plugin.observer.PluginEventListener; |
|
import com.fr.plugin.observer.PluginListenerRegistration; |
|
import com.fr.stable.core.PropertyChangeAdapter; |
|
|
|
import javax.swing.*; |
|
import java.awt.*; |
|
import java.awt.dnd.DnDConstants; |
|
import java.awt.event.ActionEvent; |
|
import java.awt.event.MouseAdapter; |
|
import java.awt.event.MouseEvent; |
|
import java.util.Collections; |
|
import java.util.HashMap; |
|
import java.util.Iterator; |
|
import java.util.Map; |
|
|
|
public class TableDataTreePane extends BasicTableDataTreePane { |
|
private static TableDataTreePane singleton = new TableDataTreePane(); |
|
|
|
public static final int PLUGIN_LISTENER_PRIORITY = 1; |
|
|
|
public synchronized static BasicTableDataTreePane getInstance(DesignModelAdapter<?, ?> tc) { |
|
|
|
TableDataPaneProcessor treePaneProcessor = ExtraDesignClassManager.getInstance().getSingle(TableDataPaneProcessor.XML_TAG); |
|
if (treePaneProcessor != null) { |
|
return treePaneProcessor.createTableDataTreePane(tc); |
|
} |
|
if (singleton.tc == null) { |
|
singleton.addMenuDef.clearShortCuts(); |
|
singleton.createAddMenuDef(); |
|
} |
|
singleton.tc = tc; |
|
singleton.op = new TableDataSourceOP(tc); |
|
singleton.op.setDataMode(singleton.buttonGroup.getSelectedIndex() == 0 ? TEMPLATE_TABLE_DATA : SERVER_TABLE_DATA); |
|
singleton.refreshDockingView(); |
|
return singleton; |
|
} |
|
|
|
private TableDataSourceOP op; |
|
private TableDataTree dataTree; |
|
private EditAction editAction; |
|
private RemoveAction removeAction; |
|
private PreviewTableDataAction previewTableDataAction; |
|
|
|
private TableDataTreePane() { |
|
this.setLayout(new BorderLayout(4, 0)); |
|
this.setBorder(null); |
|
dataTree = new TableDataTree(); |
|
ToolTipManager.sharedInstance().registerComponent(dataTree); |
|
ToolTipManager.sharedInstance().setDismissDelay(3000); |
|
ToolTipManager.sharedInstance().setInitialDelay(0); |
|
addMenuDef = new MenuDef(Inter.getLocText("FR-Action_Add")); |
|
addMenuDef.setIconPath(IconPathConstants.ADD_POPMENU_ICON_PATH); |
|
|
|
createAddMenuDef(); |
|
|
|
PluginListenerRegistration.getInstance().listenRunningChanged(new PluginEventListener(PLUGIN_LISTENER_PRIORITY) { |
|
|
|
@Override |
|
public void on(PluginEvent event) { |
|
|
|
addMenuDef.clearShortCuts(); |
|
createAddMenuDef(); |
|
} |
|
}, new PluginFilter() { |
|
|
|
@Override |
|
public boolean accept(PluginContext context) { |
|
|
|
return context.contain(PluginModule.ExtraDesign, TableDataDefineProvider.XML_TAG); |
|
} |
|
}); |
|
|
|
editAction = new EditAction(); |
|
removeAction = new RemoveAction(); |
|
previewTableDataAction = new PreviewTableDataAction(dataTree); |
|
connectionTableAction = new ConnectionTableAction(); |
|
ToolBarDef toolbarDef = new ToolBarDef(); |
|
toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction, SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction); |
|
UIToolbar toolBar = ToolBarDef.createJToolBar(); |
|
toolbarDef.updateToolBar(toolBar); |
|
|
|
JPanel toolbarPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
|
toolbarPane.add(toolBar, BorderLayout.CENTER); |
|
this.add(toolbarPane, BorderLayout.NORTH); |
|
|
|
UIScrollPane scrollPane = new UIScrollPane(dataTree); |
|
scrollPane.setBorder(null); |
|
initbuttonGroup(); |
|
JPanel jPanel = new JPanel(new BorderLayout(4, 4)); |
|
JPanel buttonPane = new JPanel(new GridLayout()); |
|
buttonPane.add(buttonGroup, BorderLayout.CENTER); |
|
jPanel.add(buttonPane, BorderLayout.NORTH); |
|
jPanel.add(scrollPane, BorderLayout.CENTER); |
|
this.add(jPanel, BorderLayout.CENTER); |
|
dataTree.addMouseListener(new MouseAdapter() { |
|
@Override |
|
public void mousePressed(MouseEvent e) { |
|
checkButtonEnabled(); |
|
} |
|
}); |
|
dataTree.addKeyListener(getTableTreeNodeListener(editAction, previewTableDataAction, removeAction, op, dataTree)); |
|
// TreeCellEditor |
|
dataTree.setEditable(true); |
|
TableDataTreeCellEditor treeCellEditor = new TableDataTreeCellEditor(new UITextField(), dataTree, this); |
|
treeCellEditor.addCellEditorListener(treeCellEditor); |
|
dataTree.setCellEditor(treeCellEditor); |
|
new TableDataTreeDragSource(dataTree, DnDConstants.ACTION_COPY); |
|
checkButtonEnabled(); |
|
} |
|
|
|
|
|
protected void checkButtonEnabled() { |
|
super.checkButtonEnabled(editAction, previewTableDataAction, removeAction, op, dataTree); |
|
} |
|
|
|
/** |
|
* 刷新 |
|
*/ |
|
public void refreshDockingView() { |
|
populate(new TableDataSourceOP(tc)); |
|
this.checkButtonEnabled(); |
|
} |
|
|
|
protected void initbuttonGroup() { |
|
Icon[] iconArray = {BaseUtils.readIcon("/com/fr/design/images/data/datasource.png"), BaseUtils.readIcon("/com/fr/design/images/data/dock/serverdatabase.png")}; |
|
final Integer[] modeArray = {TEMPLATE_TABLE_DATA, SERVER_TABLE_DATA}; |
|
String[] textArray = {Inter.getLocText(new String[]{"Template", "DS-TableData"}), Inter.getLocText("DS-Server_TableData")}; |
|
buttonGroup = new UIHeadGroup(iconArray, textArray) { |
|
public void tabChanged(int index) { |
|
if (op != null) { |
|
op.setDataMode(modeArray[buttonGroup.getSelectedIndex()]); |
|
addMenuDef.setEnabled(modeArray[buttonGroup.getSelectedIndex()] == TEMPLATE_TABLE_DATA ? true : false); |
|
refreshDockingView(); |
|
} |
|
} |
|
}; |
|
buttonGroup.setNeedLeftRightOutLine(false); |
|
} |
|
|
|
/** |
|
* 编辑面板 |
|
* |
|
* @param uPanel 面板 |
|
* @param originalName 原始名字 |
|
*/ |
|
public void dgEdit(final AbstractTableDataPane<?> uPanel, String originalName, boolean isUpdate) { |
|
uPanel.addStoreProcedureWorkerListener(new StoreProcedureWorkerListener() { |
|
public void fireDoneAction() { |
|
if (dataTree.getSelectionPath() == null) { |
|
dataTree.refresh(); |
|
} else { |
|
Object object = dataTree.getSelectionPath().getLastPathComponent(); |
|
int[] rows = dataTree.getSelectionRows(); |
|
dataTree.refreshChildByName(object.toString()); |
|
dataTree.setSelectionRows(rows); |
|
} |
|
} |
|
}); |
|
final BasicPane.NamePane nPanel = uPanel.asNamePane(); |
|
nPanel.setObjectName(originalName); |
|
final String oldName = originalName; |
|
final BasicDialog dg; |
|
allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); |
|
dg = nPanel.showLargeWindow(SwingUtilities.getWindowAncestor(TableDataTreePane.this), new DialogActionAdapter() { |
|
public void doOk() { |
|
DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER); |
|
tc.renameTableData(oldName, nPanel.getObjectName(), false); |
|
TableDataSource tds = tc.getBook(); |
|
TableData td = uPanel.updateBean(); |
|
String tdName = nPanel.getObjectName(); |
|
tds.putTableData(tdName, td); |
|
Map<String, String> map = new HashMap<String, String>(); |
|
if (!ComparatorUtils.equals(oldName, tdName)) { |
|
map.put(oldName, tdName); |
|
} |
|
fireDSChanged(map); |
|
tc.fireTargetModified(); |
|
tc.parameterChanged(); |
|
int[] rows = dataTree.getSelectionRows(); |
|
dataTree.refreshChildByName(tdName); |
|
dataTree.setSelectionRows(rows); |
|
} |
|
}); |
|
nPanel.addPropertyChangeListener(new PropertyChangeAdapter() { |
|
@Override |
|
public void propertyChange() { |
|
doPropertyChange(dg, nPanel, oldName); |
|
} |
|
}); |
|
dg.setVisible(true); |
|
} |
|
|
|
private class EditAction extends UpdateAction { |
|
public EditAction() { |
|
this.setName(Inter.getLocText("FR-Designer_Edit")); |
|
this.setMnemonic('E'); |
|
this.setSmallIcon(BaseUtils.readIcon(IconPathConstants.TD_EDIT_ICON_PATH)); |
|
} |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
final NameObject selectedNO = dataTree.getSelectedNameObject(); |
|
if (selectedNO == null) { |
|
return; |
|
} |
|
dgEdit(((AbstractTableDataWrapper) selectedNO.getObject()).creatTableDataPane(), selectedNO.getName(), false); |
|
} |
|
} |
|
|
|
private class RemoveAction extends UpdateAction { |
|
|
|
public RemoveAction() { |
|
this.setName(Inter.getLocText("FR-Designer_Remove")); |
|
this.setMnemonic('R'); |
|
this.setSmallIcon(BaseUtils.readIcon(IconPathConstants.TD_REMOVE_ICON_PATH)); |
|
} |
|
|
|
@Override |
|
public void actionPerformed(ActionEvent e) { |
|
NameObject selectedNO = dataTree.getSelectedNameObject(); |
|
|
|
if (selectedNO == null) { |
|
return; |
|
} |
|
|
|
int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + ":" + selectedNO.getName() + "?", |
|
Inter.getLocText("FR-Designer_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); |
|
if (returnVal == JOptionPane.OK_OPTION) { |
|
// richer:这个地方为什么要在DataSourceTree里面去remove呢?多此一举吧 |
|
op.removeAction(selectedNO.getName()); |
|
dataTree.refresh(); |
|
// Richie:默认最后一行获得焦点. |
|
dataTree.requestFocus(); |
|
dataTree.setSelectionRow(dataTree.getRowCount() - 1); |
|
fireDSChanged(); |
|
checkButtonEnabled(); |
|
} |
|
} |
|
} |
|
|
|
private void populate(TableDataSourceOP op) { |
|
this.op = op; |
|
dataTree.populate(op); |
|
checkButtonEnabled(); |
|
} |
|
|
|
|
|
/** |
|
* @return |
|
*/ |
|
public TableDataTree getDataTree() { |
|
return dataTree; |
|
} |
|
|
|
/** |
|
* 合并数据集 |
|
* @param srcName 数据集来源(比如报表块,就是报表块的名称) |
|
* @param tableDataSource 数据集 |
|
*/ |
|
public Map<String, String> addTableData(String srcName, TableDataSource tableDataSource) { |
|
Map<String, String> tdNameMap = new HashMap<>(); |
|
allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); |
|
DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER); |
|
TableDataSource tds = tc.getBook(); |
|
Iterator tdIterator = tableDataSource.getTableDataNameIterator(); |
|
while (tdIterator.hasNext()) { |
|
String tdName = (String) tdIterator.next(); |
|
String oldName = tdName; |
|
TableData td = tableDataSource.getTableData(tdName); |
|
if (tds.getTableData(tdName) != null || isDsNameRepeaded(tdName)) {//如果有同名的就拼上来源名称 |
|
tdName = srcName + tdName; |
|
} |
|
int i = 0; |
|
while (tds.getTableData(tdName) != null) { |
|
i++;//如果拼上名字后依然已经存在就加编号 |
|
tdName += i; |
|
} |
|
tds.putTableData(tdName, td); |
|
if (!ComparatorUtils.equals(oldName, tdName)) { |
|
tdNameMap.put(oldName, tdName); |
|
} |
|
} |
|
tc.parameterChanged(); |
|
dataTree.refresh(); |
|
return Collections.unmodifiableMap(tdNameMap); |
|
} |
|
} |