package com.vci.client.uif.engine.client.compare.dialog;
|
|
import java.awt.BorderLayout;
|
import java.awt.Dialog;
|
import java.awt.Dimension;
|
import java.awt.Frame;
|
import java.awt.Point;
|
import java.awt.Rectangle;
|
import java.awt.Window;
|
import java.awt.event.AdjustmentEvent;
|
import java.awt.event.AdjustmentListener;
|
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseEvent;
|
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowEvent;
|
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeListener;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.TreeSet;
|
import javax.swing.BorderFactory;
|
import javax.swing.DefaultListModel;
|
import javax.swing.JDialog;
|
import javax.swing.JList;
|
import javax.swing.JPanel;
|
import javax.swing.JScrollBar;
|
import javax.swing.JScrollPane;
|
import javax.swing.JTree;
|
import javax.swing.JViewport;
|
import javax.swing.WindowConstants;
|
import javax.swing.border.Border;
|
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionListener;
|
import javax.swing.event.TreeExpansionEvent;
|
import javax.swing.event.TreeExpansionListener;
|
import javax.swing.event.TreeSelectionEvent;
|
import javax.swing.event.TreeSelectionListener;
|
import javax.swing.tree.DefaultMutableTreeNode;
|
import javax.swing.tree.DefaultTreeModel;
|
import javax.swing.tree.TreePath;
|
|
import com.vci.client.uif.engine.client.compare.Comparer;
|
import com.vci.client.uif.engine.client.compare.attribute.Attdef;
|
import com.vci.client.uif.engine.client.compare.dialog.treenode.CompareTreeNode;
|
import com.vci.client.uif.engine.client.compare.dialog.treenode.TreeNodeObject;
|
import com.vci.client.uif.engine.client.compare.enumeration.CompareState;
|
|
/**
|
* 比较窗口
|
* @author VCI-STGK006
|
*
|
*/
|
public class NodeCompareDialog extends JDialog {
|
|
/**
|
* serialVersionUID
|
*/
|
private static final long serialVersionUID = 3936042853653899944L;
|
|
/**
|
* 所属窗口
|
*/
|
private Window ownerDialog;
|
|
/**
|
* 行面板宽度
|
*/
|
private int buttonPanelWidth = 30;
|
|
/**
|
* 左右比较面板宽度
|
*/
|
private int paneWeight = 365;
|
|
/**
|
* 右键菜单
|
*/
|
private CompareDialogPopupMenu epm = null;
|
|
/**
|
* 工具条
|
*/
|
private CompareDialogToolBar etb = null;
|
|
/**
|
* Comparer对象
|
*/
|
private Comparer comparer = null;
|
|
/**
|
* 边框
|
*/
|
private Border lBorder;
|
|
/**
|
* 边框
|
*/
|
private Border rBorder;
|
|
/**
|
* 主滚动面板
|
*/
|
private JScrollPane mainScroll;
|
|
/**
|
* Excel树
|
*/
|
public JTree lTree;
|
|
/**
|
* 数据库树
|
*/
|
public JTree rTree;
|
|
/**
|
* 中间行号
|
*/
|
private JList numList;
|
|
/**
|
* 构造器
|
* @param ownerDialog 所属窗口
|
* @param title 窗口标题
|
* @param data 依赖数据
|
*/
|
public NodeCompareDialog(Dialog ownerDialog, String title, Comparer comparer){
|
super(ownerDialog, title, true);
|
this.ownerDialog = ownerDialog;
|
this.epm = new CompareDialogPopupMenu(this);
|
this.etb = new CompareDialogToolBar(this);
|
this.comparer = comparer;
|
lBorder = BorderFactory.createTitledBorder("系统数据");
|
rBorder = BorderFactory.createTitledBorder("系统数据");
|
init();
|
addListener();
|
this.setLocationRelativeTo(this.ownerDialog);
|
this.setResizable(false);
|
}
|
|
/**
|
* 构造器
|
* @param ownerDialog 所属窗口
|
* @param title 窗口标题
|
* @param data 依赖数据
|
*/
|
public NodeCompareDialog(Frame ownerDialog, String title, Comparer comparer){
|
super(ownerDialog, title, true);
|
this.ownerDialog = ownerDialog;
|
this.epm = new CompareDialogPopupMenu(this);
|
this.etb = new CompareDialogToolBar(this);
|
this.comparer = comparer;
|
lBorder = BorderFactory.createTitledBorder("系统数据");
|
rBorder = BorderFactory.createTitledBorder("系统数据");
|
init();
|
addListener();
|
this.setLocationRelativeTo(this.ownerDialog);
|
this.setResizable(false);
|
}
|
|
/**
|
* 绘制
|
*/
|
public void init() {
|
//创建工具条
|
JPanel toolBarPanel = etb.createToolBar(lTree, rTree, comparer);
|
|
//创建树结构比较面板
|
mainScroll = new JScrollPane();
|
JPanel mainPanel = new JPanel();
|
|
//创建左右区域树
|
createTrees();
|
|
//展开所有节点
|
expandAll();
|
|
//添加树节点事件
|
addlistener();
|
|
//设置面板的大小
|
int paneHeight = lTree.getRowHeight() * lTree.getRowCount() + 40;
|
|
//ExcelTree区域
|
JPanel excelPanel = new JPanel();
|
JViewport excelViewPort = new JViewport();
|
excelViewPort.setSize(paneWeight, paneHeight);
|
excelViewPort.setView(lTree);
|
excelPanel.setLayout(new BorderLayout());
|
excelPanel.add(excelViewPort, BorderLayout.CENTER);
|
excelPanel.setBorder(lBorder);
|
excelPanel.setBounds(new Rectangle(5, 0, paneWeight, paneHeight));
|
|
//中间分隔区,显示行号
|
JPanel buttonPanel = createRowNumPanel();
|
buttonPanel.setBounds(new Rectangle(
|
paneWeight + 5, 13 ,buttonPanelWidth, paneHeight - 10));
|
|
//dsTree区域
|
JPanel dsPanel = new JPanel();
|
JViewport dsViewPort = new JViewport();
|
dsViewPort.setSize(paneWeight, paneHeight);
|
dsViewPort.setView(rTree);
|
dsPanel.setLayout(new BorderLayout());
|
dsPanel.add(dsViewPort, BorderLayout.CENTER);
|
dsPanel.setBorder(rBorder);
|
dsPanel.setBounds(new Rectangle(
|
paneWeight + buttonPanelWidth + 5, 0, paneWeight, paneHeight));
|
|
mainPanel.setPreferredSize(new Dimension(
|
paneWeight * 2 + buttonPanelWidth + 5, paneHeight));
|
mainPanel.setLayout(null);
|
mainPanel.add(excelPanel);
|
mainPanel.add(buttonPanel);
|
mainPanel.add(dsPanel);
|
mainScroll.setViewportView(mainPanel);
|
|
//设置滚动条滚动的速度
|
mainScroll.getVerticalScrollBar().setUnitIncrement(50);
|
|
//创建一个控制显示的滚动条
|
JPanel scrollPanel = createScrollBar(lTree, rTree, excelViewPort, dsViewPort);
|
|
//绑定快捷键,窗口只需要绑定一次
|
epm.bindHotkeys(mainScroll);
|
|
this.setSize(800, 600);
|
this.getContentPane().setLayout(new BorderLayout());
|
this.getContentPane().add(toolBarPanel, BorderLayout.NORTH);
|
this.getContentPane().add(mainScroll, BorderLayout.CENTER);
|
this.getContentPane().add(scrollPanel, BorderLayout.SOUTH);
|
}
|
|
/**
|
* 创建树结构
|
*/
|
private void createTrees() {
|
|
//设置虚根节点
|
CompareTreeNode lRoot = new CompareTreeNode("LRoot");
|
CompareTreeNode rRoot = new CompareTreeNode("RRoot");
|
DefaultTreeModel lDtml = new DefaultTreeModel(lRoot);
|
DefaultTreeModel rDtml = new DefaultTreeModel(rRoot);
|
lTree = new JTree(lDtml);
|
rTree = new JTree(rDtml);
|
|
//属性设置
|
lTree.setRootVisible(false);
|
rTree.setRootVisible(false);
|
lTree.setShowsRootHandles(false);
|
rTree.setShowsRootHandles(false);
|
lTree.setCellRenderer(this.comparer.getTreeRenderer());
|
rTree.setCellRenderer(this.comparer.getTreeRenderer());
|
lTree.setScrollsOnExpand(true);
|
rTree.setScrollsOnExpand(true);
|
lTree.setToggleClickCount(3);
|
rTree.setToggleClickCount(3);
|
|
//加载树节点
|
refreshTrees(lRoot, lDtml, rRoot, rDtml);
|
//设置根节点为选中状态
|
rTree.setSelectionRow(0);
|
lTree.setSelectionRow(0);
|
}
|
|
/**
|
* 创建中间行面板
|
* 创建行号列表并设置选择时间
|
* @param lTree
|
* @return
|
*/
|
private JPanel createRowNumPanel() {
|
JPanel buttonPanel = new JPanel();
|
DefaultListModel dlm = new DefaultListModel();
|
dlm.setSize(lTree.getRowCount());
|
for(int i = 0; i < dlm.getSize(); i++) {
|
dlm.set(i, i + 1);
|
}
|
numList = new JList(dlm);
|
numList.setBackground(buttonPanel.getBackground());
|
numList.setFixedCellHeight(lTree.getRowHeight());
|
numList.setFixedCellWidth(buttonPanelWidth);
|
numList.addListSelectionListener(lsl);
|
//buttonPanel.setBorder(buttonBorder);
|
buttonPanel.add(numList, BorderLayout.CENTER);
|
return buttonPanel;
|
}
|
|
/**
|
* 创建窗口最下放的滚动条
|
* @param paneWeight 面板的宽度
|
* @param buttonPanelWidth 中间分隔面板的宽度
|
* @param excelTree Excel Tree
|
* @param dsTree Ds Tree
|
* @param excelViewport Excel Tree Viewport
|
* @param dsViewport Ds Tree Viewport
|
* @return
|
*/
|
private JPanel createScrollBar(JTree excelTree, JTree dsTree,
|
final JViewport excelViewport, final JViewport dsViewport) {
|
JPanel scrollBarPanel = new JPanel();
|
scrollBarPanel.setLayout(null);
|
//创建Excel窗口滚动条
|
JScrollBar excelBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 1);
|
//获得树的preferred size;
|
Dimension excelPreferredSize = excelTree.getPreferredScrollableViewportSize();
|
int excelBarMax = excelPreferredSize.width- paneWeight;
|
boolean showLeftBar = false;
|
if(excelBarMax > 0){
|
showLeftBar = true;
|
}
|
if(showLeftBar) {
|
excelBar = new JScrollBar(JScrollBar.HORIZONTAL, 0,
|
(int)(excelBarMax * (excelBarMax / ((double)paneWeight))), 0,
|
excelBarMax + ((int)(excelBarMax * (excelBarMax / ((double)paneWeight)))));
|
}
|
excelBar.addAdjustmentListener(new AdjustmentListener() {
|
@Override
|
public void adjustmentValueChanged(AdjustmentEvent e) {
|
int value = e.getValue();
|
excelViewport.setViewPosition(new Point(value, 0));
|
}
|
});
|
|
//创建Ds窗口滚动条
|
JScrollBar dsBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 1);
|
//获得树的preferred size;
|
Dimension dsPreferredSize = dsTree.getPreferredScrollableViewportSize();
|
int dsBarMax = dsPreferredSize.width - paneWeight;
|
boolean showRightBar = false;
|
if(dsBarMax > 0){
|
showRightBar = true;
|
}
|
if(showRightBar) {
|
dsBar = new JScrollBar(JScrollBar.HORIZONTAL, 0,
|
(int)(dsBarMax * (dsBarMax / ((double)paneWeight))), 0,
|
dsBarMax + ((int)(dsBarMax * (dsBarMax / ((double)paneWeight)))));
|
}
|
dsBar.addAdjustmentListener(new AdjustmentListener() {
|
@Override
|
public void adjustmentValueChanged(AdjustmentEvent e) {
|
int value = e.getValue();
|
dsViewport.setViewPosition(new Point(value, 0));
|
}
|
});
|
|
scrollBarPanel.setPreferredSize(new Dimension(2 * paneWeight +
|
buttonPanelWidth + 5, excelBar.getPreferredSize().height));
|
excelBar.setBounds(new Rectangle(5, 0, paneWeight, excelBar.getPreferredSize().height));
|
dsBar.setBounds(new Rectangle(paneWeight +
|
buttonPanelWidth + 5, 0, paneWeight, dsBar.getPreferredSize().height));
|
scrollBarPanel.add(excelBar);
|
scrollBarPanel.add(dsBar);
|
return scrollBarPanel;
|
}
|
|
/**
|
* 为树添加事件
|
*/
|
private void addlistener() {
|
//excelTree选择事件
|
this.lTree.addTreeSelectionListener(etl);
|
//excelTree展开事件
|
this.lTree.addTreeExpansionListener(new TreeExpansionListener() {
|
|
@Override
|
public void treeExpanded(TreeExpansionEvent event) {
|
TreePath tp = event.getPath();
|
lTree.setSelectionPath(tp);
|
if(tp.getParentPath() == null) {
|
TreePath rTp = new TreePath((
|
(DefaultMutableTreeNode)rTree.getModel().getRoot()).getPath());
|
rTree.expandPath(rTp);
|
} else {
|
int[] rows = lTree.getSelectionRows();
|
rTree.expandRow(rows[0]);
|
}
|
}
|
|
@Override
|
public void treeCollapsed(TreeExpansionEvent event) {
|
TreePath tp = event.getPath();
|
lTree.setSelectionPath(tp);
|
if(tp.getParentPath() == null) {
|
TreePath rTp = new TreePath((
|
(DefaultMutableTreeNode)rTree.getModel().getRoot()).getPath());
|
rTree.collapsePath(rTp);
|
} else {
|
int[] rows = lTree.getSelectionRows();
|
rTree.collapseRow(rows[0]);
|
}
|
}
|
});
|
//点击事件
|
this.lTree.addMouseListener(new MouseAdapter() {
|
@Override
|
public void mouseClicked(MouseEvent e) {
|
//设置单击节点为选中状态
|
int clickCount = e.getClickCount();
|
int x = e.getX();
|
int y = e.getY();
|
//
|
TreePath tp = lTree.getPathForLocation(x, y);
|
//如果是右键
|
if(e.getButton() == MouseEvent.BUTTON3) {
|
if(tp != null) {
|
lTree.setSelectionPath(tp);
|
epm.show(lTree, x, y);
|
}
|
} else if(clickCount == 2
|
&& e.getButton() == MouseEvent.BUTTON1) {
|
if(tp != null) {
|
doubleClickAction();
|
}
|
}
|
}
|
});
|
|
//dsTree选择事件
|
this.rTree.addTreeSelectionListener(dtl);
|
//dsTree展开事件
|
this.rTree.addTreeExpansionListener(new TreeExpansionListener() {
|
|
@Override
|
public void treeExpanded(TreeExpansionEvent event) {
|
TreePath tp = event.getPath();
|
rTree.setSelectionPath(tp);
|
if(tp.getParentPath() == null) {
|
TreePath lTp = new TreePath((
|
(DefaultMutableTreeNode) lTree.getModel().getRoot()).getPath());
|
lTree.expandPath(lTp);
|
} else {
|
int[] rows = rTree.getSelectionRows();
|
lTree.expandRow(rows[0]);
|
}
|
}
|
|
@Override
|
public void treeCollapsed(TreeExpansionEvent event) {
|
TreePath tp = event.getPath();
|
rTree.setSelectionPath(tp);
|
if(tp.getParentPath() == null) {
|
TreePath lTp = new TreePath((
|
(DefaultMutableTreeNode) lTree.getModel().getRoot()).getPath());
|
lTree.collapsePath(lTp);
|
} else {
|
int[] rows = rTree.getSelectionRows();
|
lTree.collapseRow(rows[0]);
|
}
|
}
|
});
|
//点击事件
|
this.rTree.addMouseListener(new MouseAdapter() {
|
@Override
|
public void mouseClicked(MouseEvent e) {
|
//设置单击节点为选中状态
|
int clickCount = e.getClickCount();
|
int x = e.getX();
|
int y = e.getY();
|
//
|
TreePath tp = rTree.getPathForLocation(x, y);
|
//如果是右键
|
if(e.getButton() == MouseEvent.BUTTON3) {
|
if(tp != null) {
|
rTree.setSelectionPath(tp);
|
epm.show(rTree, x, y);
|
}
|
} else if(clickCount == 2
|
&& e.getButton() == MouseEvent.BUTTON1) {
|
if(tp != null) {
|
doubleClickAction();
|
}
|
}
|
}
|
});
|
}
|
|
/**
|
* 列表选择事件
|
*/
|
private ListSelectionListener lsl = new ListSelectionListener() {
|
@Override
|
public void valueChanged(ListSelectionEvent e) {
|
int[] rows = numList.getSelectedIndices();
|
if(rows != null && rows.length > 0) {
|
//判断选择事件是不是需要被触发
|
lTree.setSelectionRows(rows);
|
rTree.setSelectionRows(rows);
|
}
|
}
|
};
|
|
/**
|
* excelTree选择事件
|
*/
|
private TreeSelectionListener etl = new TreeSelectionListener() {
|
@Override
|
public void valueChanged(TreeSelectionEvent e) {
|
int[] rows = lTree.getSelectionRows();
|
if(rows != null && rows.length > 0) {
|
rTree.setSelectionRows(rows);
|
numList.removeListSelectionListener(lsl);
|
numList.setSelectedIndices(rows);
|
numList.addListSelectionListener(lsl);
|
}
|
}
|
};
|
|
/**
|
* dsTree 的选择事件
|
*/
|
private TreeSelectionListener dtl = new TreeSelectionListener() {
|
|
@Override
|
public void valueChanged(TreeSelectionEvent e) {
|
int[] rows = rTree.getSelectionRows();
|
if(rows != null && rows.length > 0) {
|
lTree.setSelectionRows(rows);
|
numList.removeListSelectionListener(lsl);
|
numList.setSelectedIndices(rows);
|
numList.addListSelectionListener(lsl);
|
}
|
}
|
};
|
|
/**
|
* 添加窗口事件
|
*/
|
private void addListener() {
|
/**
|
* 属性变更事件
|
* 用于控制菜单的状态的变更
|
*/
|
this.addPropertyChangeListener(new PropertyChangeListener() {
|
|
@Override
|
public void propertyChange(PropertyChangeEvent evt) {
|
windowPropertyChange(evt);
|
}
|
});
|
|
/**
|
* 窗口关闭事件
|
*/
|
this.addWindowListener(new WindowAdapter() {
|
private int oldValue;
|
@SuppressWarnings("unused")
|
@Override
|
public void windowClosing(WindowEvent paramWindowEvent) {
|
if(!true) {
|
if(getDefaultCloseOperation() != WindowConstants.DO_NOTHING_ON_CLOSE) {
|
oldValue = getDefaultCloseOperation();
|
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
}
|
} else {
|
if(getDefaultCloseOperation() == WindowConstants.DO_NOTHING_ON_CLOSE
|
&& oldValue != WindowConstants.DO_NOTHING_ON_CLOSE) {
|
setDefaultCloseOperation(oldValue);
|
}
|
}
|
}
|
});
|
}
|
|
/**
|
* 属性变更事件
|
* 用于控制菜单的状态的变更
|
* @param evt
|
*/
|
public void windowPropertyChange(PropertyChangeEvent evt) {
|
this.etb.btnPropertyChangeEvent(evt);
|
}
|
|
/**
|
* TODO 树节点排序
|
* @param order 排序方式 >0升序 <0降序
|
* @return
|
*/
|
public void sort(int order) {
|
//try {
|
// ea.sort(lTree, rTree, order);
|
//} catch (Exception e) {
|
// e.printStackTrace();
|
// VCIOptionPane.showMessage(this, e.getMessage());
|
//}
|
}
|
|
/**
|
* TODO 忽略节点差异
|
*/
|
public void ignored() {
|
//ea.ignored(lTree, rTree);
|
}
|
|
/**
|
* TODO 更新link关系
|
*/
|
public void updateLink() {
|
//ea.updateLink(lTree, rTree);
|
}
|
|
/**
|
* TODO 单条更新事件
|
*/
|
public void updateRightSingle() {
|
//ea.updateRightSingle(lTree, rTree);
|
}
|
|
/**
|
* TODO 批量更新
|
*/
|
public void updateRigthBatch() {
|
//ea.updateRightBatch(lTree, rTree);
|
}
|
|
/**
|
* TODO 解除关系按钮
|
*/
|
public void deleteAction() {
|
//ea.deleteAction(lTree, rTree);
|
}
|
|
/**
|
* TODO 保存
|
*/
|
public void save() {
|
//ea.save();
|
}
|
|
/**
|
* 展开所有
|
*/
|
public void expandAll() {
|
for(int i = 0; i < lTree.getRowCount(); i++) {
|
lTree.expandRow(i);
|
rTree.expandRow(i);
|
}
|
}
|
|
/**
|
* 折叠所有
|
*/
|
public void collapseAll() {
|
DefaultMutableTreeNode lRoot = (DefaultMutableTreeNode) lTree.getModel().getRoot();
|
collapseAllChildren(lTree, lRoot);
|
lTree.collapseRow(0);
|
}
|
|
/**
|
* TODO 导出差异信息
|
*/
|
public void exportDifferences() {
|
//ea.exportDifferences(lTree, rTree);
|
}
|
|
/**
|
* TODO 复制当前选中节点的数据到剪切板
|
*/
|
public void debugCopyNodeData() {
|
//ea.debugCopyNodeData(lTree, rTree);
|
}
|
|
/**
|
* 节点双击事件
|
*/
|
public void doubleClickAction() {
|
TreeNodeObject lTno = null;
|
TreeNodeObject rTno = null;
|
//获得左侧节点
|
TreePath etp = this.lTree.getSelectionPath();
|
DefaultMutableTreeNode lNode =
|
(DefaultMutableTreeNode) etp.getLastPathComponent();
|
lTno = (TreeNodeObject) lNode.getUserObject();
|
//获得右侧节点
|
TreePath dtp = this.rTree.getSelectionPath();
|
DefaultMutableTreeNode rNode =
|
(DefaultMutableTreeNode) dtp.getLastPathComponent();
|
rTno = (TreeNodeObject) rNode.getUserObject();
|
|
//实现了属性查看、编辑功能
|
//对于忽略的节点不能再编辑器中进行编辑
|
NodeAttributeCompareDialog nacd = new NodeAttributeCompareDialog(this, lTno, rTno);
|
lTree.updateUI();
|
rTree.updateUI();
|
}
|
|
/**
|
* 选择树节点并设置显示在视图窗口中
|
* @param lTree excel树
|
* @param rTree ds树
|
* @param row 选择的行
|
*/
|
public void selectTreeNode(int row) {
|
lTree.setSelectionRow(row);
|
int height = lTree.getRowHeight() * row;
|
Rectangle r = mainScroll.getViewport().getViewRect();
|
int topHeight = r.y;
|
int bottomHeight = r.y + r.height;
|
if(height < topHeight) {
|
mainScroll.getViewport().setViewPosition(new Point(0, height));
|
} else if(height + 40 > bottomHeight) {
|
//mainScroll.getViewport().setViewPosition(new Point(0, height - r.height));
|
mainScroll.getViewport().setViewPosition(new Point(0, r.y + height + 40 - bottomHeight));
|
}
|
}
|
|
|
/**
|
* 折叠所有子节点
|
* @param node
|
*/
|
private void collapseAllChildren(JTree tree, DefaultMutableTreeNode node) {
|
int childCount = node.getChildCount();
|
if(childCount > 0) {
|
for(int i = 0; i < childCount; i++) {
|
DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i);
|
collapseAllChildren(tree, child);
|
tree.collapsePath(new TreePath(child.getPath()));
|
}
|
}
|
}
|
|
/**
|
* 更新树节点
|
* @param g
|
* @param vertexMap
|
* @param lNode 左侧树节点
|
* @param lDtml 左侧的树模型
|
* @param rNode 右侧树节点
|
* @param rDtml 右侧的树模型
|
* @param edppp 窗口参数
|
* @param lNodeMap 所有左侧节集合
|
* @param lBaseNodeMap 所有左侧节点集合
|
* @param rNodeMap 所有右侧节集合
|
* @param rBaseNodeMap 所有右侧节点集合
|
*/
|
@SuppressWarnings("unchecked")
|
public void refreshTrees(CompareTreeNode lNode,
|
DefaultTreeModel lDtml,
|
CompareTreeNode rNode,
|
DefaultTreeModel rDtml) {
|
//清除节点
|
lNode.removeAllChildren();
|
rNode.removeAllChildren();
|
|
//判断parentNode是否是虚根
|
String className = lNode.getUserObject().getClass().getName();
|
if(className.equals("java.lang.String")) {
|
//判断是否有根节点
|
Map<String, Object> lRoots = this.comparer.getlDataLoader().getRoots();
|
Map<String, Object> rRoots = this.comparer.getrDataLoader().getRoots();
|
refreshImaginaryRoot(lNode, lDtml, rNode, rDtml, lRoots, rRoots);
|
} else {
|
//添加子节点
|
TreeNodeObject lParent = (TreeNodeObject) lNode.getUserObject();
|
TreeNodeObject rParent = (TreeNodeObject) rNode.getUserObject();
|
//
|
Map<String, Object> lObjectMap = this.comparer.getlDataLoader().getChildren(lParent.getMainObjectKey(), lParent);
|
Map<String, Object> rObjectMap = this.comparer.getrDataLoader().getChildren(rParent.getMainObjectKey(), rParent);
|
|
TreeSet<String> keySet = new TreeSet<String>();
|
keySet.addAll(lObjectMap.keySet());
|
keySet.addAll(rObjectMap.keySet());
|
for(String key : keySet) {
|
Object lObject = lObjectMap.get(key);
|
Object rObject = rObjectMap.get(key);
|
Object lRelation = this.comparer.getlDataLoader().getChildLink(lParent.getMainObjectKey(), lParent, lObject);
|
Object rRelation = this.comparer.getrDataLoader().getChildLink(rParent.getMainObjectKey(), rParent, rObject);
|
TreeNodeObject lTno = this.comparer.getLTreeNodeObjectFactory().getTreeNodeObject(lParent, lRelation, lObject, false);
|
TreeNodeObject rTno = this.comparer.getRTreeNodeObjectFactory().getTreeNodeObject(rParent, rRelation, rObject, false);
|
//设置对照关系
|
lTno.setRelativeTreeNodeObject(rTno);
|
rTno.setRelativeTreeNodeObject(lTno);
|
//设置父节点对象的子对象
|
lParent.setChildNodeList(lTno);
|
rParent.setChildNodeList(rTno);
|
//设置节点对象状态
|
if(this.comparer.getComparer() != null) {
|
this.comparer.getComparer().compare(this.comparer.getAttributes(), lTno, rTno);
|
}
|
//添加树节点
|
CompareTreeNode lCtn = new CompareTreeNode(getShowName(lTno, 0, rTno), lTno);
|
CompareTreeNode rCtn = new CompareTreeNode(getShowName(rTno, 1, lTno), rTno);
|
lNode.insert(lCtn, lNode.getChildCount());
|
rNode.insert(rCtn, rNode.getChildCount());
|
refreshTrees(lCtn, lDtml, rCtn, rDtml);
|
}
|
}
|
//判断是否有根节点
|
lDtml.reload(lNode);
|
rDtml.reload(rNode);
|
}
|
|
/**
|
* 创建根节点
|
* @param lNode 左侧节点
|
* @param lDtml 左侧树模型
|
* @param rNode 右侧节点
|
* @param rDtml 右侧树模型
|
* @param lRoots 虚根
|
* @param rRoots 虚根
|
*/
|
private void refreshImaginaryRoot(
|
DefaultMutableTreeNode lNode,
|
DefaultTreeModel lDtml,
|
DefaultMutableTreeNode rNode,
|
DefaultTreeModel rDtml,
|
Map<String, Object> lRoots,
|
Map<String, Object> rRoots) {
|
TreeSet<String> keySet = new TreeSet<String>();
|
keySet.addAll(lRoots.keySet());
|
keySet.addAll(rRoots.keySet());
|
for(String key : keySet) {
|
Object lObject = lRoots.get(key);
|
Object rObject = rRoots.get(key);
|
TreeNodeObject lTno = this.comparer.getLTreeNodeObjectFactory().getTreeNodeObject(null, null, lObject, true);
|
TreeNodeObject rTno = this.comparer.getRTreeNodeObjectFactory().getTreeNodeObject(null, null, rObject, true);
|
lTno.setRelativeTreeNodeObject(rTno);
|
rTno.setRelativeTreeNodeObject(lTno);
|
CompareTreeNode lCtn = new CompareTreeNode(getShowName(lTno, 0, rTno), lTno);
|
CompareTreeNode rCtn = new CompareTreeNode(getShowName(rTno, 1, lTno), rTno);
|
lNode.insert(lCtn, lNode.getChildCount());
|
rNode.insert(rCtn, rNode.getChildCount());
|
refreshTrees(lCtn, lDtml, rCtn, rDtml);
|
}
|
}
|
|
/**
|
* 得到节点显示名称
|
*
|
* @param tno 节点对象
|
* @param place 位置 0左侧 1右侧
|
* @return
|
*/
|
private String getShowName(TreeNodeObject tno, int place, TreeNodeObject relationObject) {
|
if(tno.getCompareState() == CompareState.ISNULL) {
|
if(relationObject == null) {
|
return null;
|
} else {
|
return getShowName(relationObject, place == 0 ? 1 : 0, null);
|
}
|
}
|
List<Attdef> attdefList = this.comparer.getAttributes().getNodeDisplayAttrs();
|
if(attdefList == null || attdefList.isEmpty()) {
|
return null;
|
}
|
StringBuffer sb = new StringBuffer();
|
for(Attdef ad : attdefList) {
|
String key = "";
|
boolean isRelation = false;
|
if(place == 0) {
|
key = ad.getlNodeObjectAttr();
|
isRelation = ad.islIsRelationAttr();
|
} else {
|
key = ad.getrNodeObjectAttr();
|
isRelation = ad.isrIsRelationAttr();
|
}
|
String value = tno.getAttribute(key,
|
isRelation ? TreeNodeObject.RELATIONOBJECT
|
: TreeNodeObject.MAINOBJECT);
|
Object object = this.getComparer().getAttributes().convert(ad, value);
|
value = object == null ? "" : object.toString();
|
if(sb.length() < 1) {
|
sb.append(value);
|
} else {
|
sb.append(" ").append(value);
|
}
|
}
|
return sb.toString();
|
}
|
|
/**
|
* 得到Comparer
|
* @return
|
*/
|
public Comparer getComparer() {
|
return this.comparer;
|
}
|
}
|