wangting
2024-09-27 a3e87f78ee262ca9bb7d9b0c997639d5f3295890
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
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<String> comboBoxItems = new Vector<String>();
    
    /**
     * 构造器
     * @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);
//            }
//        }
    }
}