package com.vci.client.uif.engine.client.compare.dialog; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.util.Vector; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import com.vci.client.ui.swing.VCIOptionPane; import com.vci.client.uif.engine.client.compare.Comparer; import com.vci.client.uif.engine.client.compare.dialog.renderer.CompareTreeNodeIcons; 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 * */ public class CompareDialogToolBar { /** * 父窗口 */ private NodeCompareDialog owner; /** * 显示所有按钮 */ private CompareDialogNoBorderButton showAll; /** * 显示差异 */ private CompareDialogNoBorderButton showDefference; /** * 显示相同 */ private CompareDialogNoBorderButton showSame; /** * 忽略按钮 */ private CompareDialogNoBorderButton ignoredButton; /** * 更新link关系 */ private CompareDialogNoBorderButton updateLinkButton; /** * 单条更新ds */ private CompareDialogNoBorderButton updateRightSingleButton; /** * 批量更新ds */ private CompareDialogNoBorderButton updateRightBatchButton; /** * 删除按钮 */ private CompareDialogNoBorderButton deleteButton; /** * 全部展开 */ private CompareDialogNoBorderButton expandAllButton; /** * 折叠所有 */ private CompareDialogNoBorderButton collapseAllButton; /** * 升序按钮 */ private CompareDialogNoBorderButton ascButton; /** * 降序按钮 */ private CompareDialogNoBorderButton descButton; /** * 保存按钮 */ private CompareDialogNoBorderButton saveButton; /** * 快速查找输入框 */ private JComboBox quickLookBox; /** * 查找按钮 */ private CompareDialogNoBorderButton findButton; /** * 导出按钮 */ private CompareDialogNoBorderButton exportButton; /** * 查询历史 */ private Vector comboBoxItems = new Vector(); /** * 构造器 * @param owner 父窗口 */ public CompareDialogToolBar(NodeCompareDialog owner) { this.owner = owner; this.comboBoxItems.add(""); } /** * 创建工具条 * @return */ public JPanel createToolBar(JTree lTree, JTree rTree, Comparer comparer) { //默认是FlowLayout布局 JPanel toolBarPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); //过滤条件区 JToolBar queryToolBar = createQueryBar(); //编辑区 JToolBar editToolBar = createEditBar(); //便捷操作 JToolBar operationToolBar = createOtherBar(); //导入导出 JToolBar impexpToolBar = createImpExpBar(); //快速查询 JToolBar findToolBar = createFindBar(); toolBarPanel.add(queryToolBar); if(comparer.isEditable()) { toolBarPanel.add(editToolBar); toolBarPanel.add(impexpToolBar); } toolBarPanel.add(operationToolBar); toolBarPanel.add(findToolBar); return toolBarPanel; } /** * 创建查询工具条 * @return */ private JToolBar createQueryBar() { //过滤条件区 JToolBar queryToolBar = new JToolBar("显示过滤器"); queryToolBar.setMargin(new Insets(1, 2, 1, 2)); //显示所有按钮 showAll = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("All20x15.png"), false); showAll.setToolTipText("显示所有"); showAll.setClick(true); //显示差异 showDefference = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("Difference20x15.png"), false); showDefference.setToolTipText("显示差异项"); //显示相同 showSame = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("Same20x15.png"), false); showSame.setToolTipText("显示相同项"); showAll.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!showAll.isClick()){ if(filterTree(CompareDialogConstants.SHOW_ALL)){ showAll.setClick(true); showDefference.setClick(false); showSame.setClick(false); owner.firePropertyChange( CompareDialogProperties.BTN_IMPORT_RISES_VERSION, 0, 1); } } } }); showDefference.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!showDefference.isClick()){ if(filterTree(CompareDialogConstants.SHOW_DIFFERENT)){ showDefference.setClick(true); showAll.setClick(false); showSame.setClick(false); owner.firePropertyChange( CompareDialogProperties.BTN_IMPORT_RISES_VERSION, 1, 0); } } } }); showSame.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!showSame.isClick()){ if(filterTree(CompareDialogConstants.SHOW_SAME)){ showSame.setClick(true); showAll.setClick(false); showDefference.setClick(false); owner.firePropertyChange( CompareDialogProperties.BTN_IMPORT_RISES_VERSION, 1, 0); } } } }); queryToolBar.add(showAll); queryToolBar.add(showDefference); queryToolBar.add(showSame); return queryToolBar; } /** * 创建编辑工具条 * @return */ private JToolBar createEditBar() { //编辑区 JToolBar editToolBar = new JToolBar("编辑"); editToolBar.setMargin(new Insets(1, 2, 1, 2)); //忽略按钮 ignoredButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("Ignored20x15.png")); ignoredButton.setToolTipText("忽略/还原"); ignoredButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { owner.ignored(); } }); ignoredButton.setVisible(false); //更新链接 updateLinkButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("UpdateLink20x15.png")); updateLinkButton.setToolTipText("将Excel中EBOM关系信息更新到数据库"); updateLinkButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { owner.updateLink(); } }); //单条更新ds updateRightSingleButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("UpdateRightSingle20x15.png")); updateRightSingleButton.setToolTipText("将Excel中的EBOM信息更新到数据库"); updateRightSingleButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { owner.updateRightSingle(); } }); //批量更新ds updateRightBatchButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("UpdateRightBatch20x15.png")); updateRightBatchButton.setToolTipText("将Excel当前选择节点及其子节点EBOM信息更新到数据库"); updateRightBatchButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { owner.updateRigthBatch(); } }); //删除按钮 deleteButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("Delete20x15.png")); deleteButton.setToolTipText("解除零部件与上级的关系"); deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { owner.deleteAction(); } }); //保存 saveButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("Save20x15.png")); saveButton.setToolTipText("保存修改"); saveButton.setEnabled(false); saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { owner.save(); } }); editToolBar.add(ignoredButton); editToolBar.add(updateLinkButton); editToolBar.add(updateRightSingleButton); editToolBar.add(updateRightBatchButton); editToolBar.add(deleteButton); editToolBar.addSeparator(); editToolBar.add(saveButton); return editToolBar; } /** * 其它按钮工具条 */ private JToolBar createOtherBar() { //便捷操作 JToolBar operationToolBar = new JToolBar("便捷操作"); operationToolBar.setMargin(new Insets(1, 2, 1, 2)); //升序排列 ascButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("ASC20x15.png")); ascButton.setToolTipText("按升序排列"); ascButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { owner.sort(1); } }); //降序排列 descButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("DESC20x15.png")); descButton.setToolTipText("按降序排列"); descButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { owner.sort(-1); } }); //全部展开 expandAllButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("ExpandAll20x15.png")); expandAllButton.setToolTipText("展开所有"); expandAllButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { owner.expandAll(); } }); //折叠所有 collapseAllButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("CollapseAll20x15.png")); collapseAllButton.setToolTipText("折叠所有"); collapseAllButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { owner.collapseAll(); } }); //TODO 判断按钮事件暂时没有实现 //operationToolBar.add(ascButton); //operationToolBar.add(descButton); operationToolBar.add(expandAllButton); operationToolBar.add(collapseAllButton); return operationToolBar; } /** * 查询区域 * @return */ public JToolBar createFindBar() { JToolBar findBar = new JToolBar("快速查找"); findBar.setMargin(new Insets(1, 2, 1, 2)); JLabel finkLabel = new JLabel("查找:"); //输入框 quickLookBox = new JComboBox(comboBoxItems); quickLookBox.setToolTipText("输入查找字符"); quickLookBox.setMaximumRowCount(5); quickLookBox.setEditable(true); quickLookBox.setPreferredSize(new Dimension( quickLookBox.getPreferredSize().width + 100, quickLookBox.getPreferredSize().height)); quickLookBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("comboBoxEdited")) { findButton.doClick(); } } }); //查找按钮 findButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("Find20x15.png")); findButton.setToolTipText("查找"); findButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { find(); } }); findBar.add(finkLabel); findBar.add(quickLookBox); findBar.addSeparator(); findBar.add(findButton); return findBar; } /** * 导入导出工具条 * @return */ private JToolBar createImpExpBar() { JToolBar impexpToolBar = new JToolBar("导入导出"); impexpToolBar.setMargin(new Insets(1, 2, 1, 2)); //导出按钮 exportButton = new CompareDialogNoBorderButton( CompareTreeNodeIcons.getInstance().getIcon("Export20x15.png")); exportButton.setToolTipText("导出存在差异的零部件信息"); exportButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { owner.exportDifferences(); } }); impexpToolBar.add(exportButton); return impexpToolBar; } /** * 过滤树节点 * @param type CompareDialogConstants.SHOW */ public boolean filterTree(int type) { try { filterTree(owner.lTree, owner.rTree, type); } catch (Exception e) { e.printStackTrace(); VCIOptionPane.showMessage(owner, e.getMessage()); return false; } return true; } /** * 过滤树节点 * @param lTree 左侧树 * @param rTree 右侧树 * @param type 类型 CompareDialogConstants.SHOW */ public void filterTree(JTree lTree, JTree rTree, int type) throws Exception{ DefaultTreeModel lDtml = (DefaultTreeModel) lTree.getModel(); CompareTreeNode lRootNode = (CompareTreeNode) lDtml.getRoot(); DefaultTreeModel rDtml = (DefaultTreeModel) rTree.getModel(); CompareTreeNode rRootNode = (CompareTreeNode) rDtml.getRoot(); //得到真正的根节点 int rootCount = lRootNode.getChildCount(); for(int i = 0; i < rootCount; i++) { CompareTreeNode lRoot = (CompareTreeNode) lRootNode.getChildAt(i); CompareTreeNode rRoot = (CompareTreeNode) rRootNode.getChildAt(i); filterTree(lDtml, lRoot, rDtml, rRoot, type); } //展开所有节点 owner.expandAll(); } /** * 树节点过滤 * @param lDtml 左侧树模型 * @param lNode 左侧树节点 * @param rDtml 右侧树模型 * @param rNode 右侧树节点 */ private boolean filterTree(DefaultTreeModel lDtml, CompareTreeNode lNode, DefaultTreeModel rDtml, CompareTreeNode rNode, int type) throws Exception{ //是有拥有子节点 boolean hasChild = false; TreeNodeObject lTno = (TreeNodeObject) lNode.getUserObject(); TreeNodeObject rTno = (TreeNodeObject) rNode.getUserObject(); //基本校验 if(lTno.getChildNodeList().size() != rTno.getChildNodeList().size()) { throw new Exception("节点结构异常,同一节点下子节点对象数量不同![" + lTno.toString() + "]、[" + rTno.toString() + "]"); } //移除所有子节点 lNode.removeAllChildren(); rNode.removeAllChildren(); //遍历所有子节点 if(!lTno.getChildNodeList().isEmpty()) { for(int i = 0; i < lTno.getChildNodeList().size(); i++) { TreeNodeObject lChildObject = lTno.getChildNodeList().get(i); TreeNodeObject rChildObject = rTno.getChildNodeList().get(i); CompareTreeNode lChildNode = new CompareTreeNode(lChildObject); CompareTreeNode rChildNode = new CompareTreeNode(rChildObject); //是否需要添加子节点 boolean compare = compare(lChildObject, rChildObject, type); if(!compare) { compare = filterTree(lDtml, lChildNode, rDtml, rChildNode, type); } else { filterTree(lDtml, lChildNode, rDtml, rChildNode, type); } if(compare) { //添加子节点 lNode.insert(lChildNode, lNode.getChildCount()); rNode.insert(rChildNode, rNode.getChildCount()); hasChild = true; } } } lDtml.reload(lNode); rDtml.reload(rNode); return hasChild; } /** * 节点比较 * @param lTno 左侧树节点对象 * @param rTno 又侧树节点对象 * @param typ 比较类型 * @return */ private boolean compare(TreeNodeObject lTno, TreeNodeObject rTno, int type) { if(type == CompareDialogConstants.SHOW_ALL) { return true; } else if(type == CompareDialogConstants.SHOW_SAME) { if((lTno.getCompareState() == CompareState.SAME && rTno.getCompareState() == CompareState.SAME) || (lTno.getCompareState() == CompareState.ISNULL && rTno.getCompareState() == CompareState.ISNULL)) { return true; } else { return false; } } else if(type == CompareDialogConstants.SHOW_DIFFERENT) { if((lTno.getCompareState() == CompareState.SAME && rTno.getCompareState() == CompareState.SAME) || (lTno.getCompareState() == CompareState.ISNULL && rTno.getCompareState() == CompareState.ISNULL)) { return false; } else { return true; } } return true; } /** * 查找 */ private void find() { //将查询关键字加入到集合中 String key = (String)quickLookBox.getSelectedItem(); if(!comboBoxItems.contains(key)) { comboBoxItems.add(key); quickLookBox.updateUI(); } quickLook(owner.lTree, owner.rTree, key); } /** * 快速查找 * @param lTree 左侧树 * @param rTree 右侧树 * @param key 查找字符 */ public void quickLook(JTree lTree, JTree rTree, String key){ int startRow = 0; int row = 1; int endRow = lTree.getRowCount() - 1; int selectionCount = lTree.getSelectionCount(); if(selectionCount != 0) { int[] rows = lTree.getSelectionRows(); startRow = rows[0]; row = rows[0]; } while(true) { if(row == endRow) { //如果当前选择的是最后一行则设置从头开始查找 row = 0; } else { row++; } //如果回到起点则停止 if(row == startRow) { VCIOptionPane.showMessage(owner, "当前结构树中没有找到搜索文本!"); break; } TreePath etp = lTree.getPathForRow(row); TreePath dtp = rTree.getPathForRow(row); CompareTreeNode lDmtn = (CompareTreeNode) etp.getLastPathComponent(); CompareTreeNode rDmtn = (CompareTreeNode) dtp.getLastPathComponent(); TreeNodeObject lTno = (TreeNodeObject) lDmtn.getUserObject(); TreeNodeObject rTno = (TreeNodeObject) rDmtn.getUserObject(); if(lTno.toString().toLowerCase().contains(key.toLowerCase())) { owner.selectTreeNode(row); break; } else if(rTno.toString().toLowerCase().contains(key.toLowerCase())) { owner.selectTreeNode(row); break; } } } /** * TODO 按钮状态变更方法 * @param e */ public void btnPropertyChangeEvent(PropertyChangeEvent e) { // String propertyName = e.getPropertyName(); // if(propertyName.equals(EditDialogProperties.BTN_SAVE)) { // long newState = (Long) e.getNewValue(); // if(newState == 1) { // saveButton.setEnabled(true); // } else { // saveButton.setEnabled(false); // } // } else if(propertyName.equals(EditDialogProperties.BTN_IMPORT_RISES_VERSION)) { // long newState = (Long) e.getNewValue(); // if(newState == 1) { // importButton.setEnabled(true); // } else { // importButton.setEnabled(false); // } // } } }