summaryrefslogtreecommitdiffstats
path: root/src/cppcheckplus/control/Main.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cppcheckplus/control/Main.java')
-rw-r--r--src/cppcheckplus/control/Main.java912
1 files changed, 2 insertions, 910 deletions
diff --git a/src/cppcheckplus/control/Main.java b/src/cppcheckplus/control/Main.java
index 19d33cc..5fe3e25 100644
--- a/src/cppcheckplus/control/Main.java
+++ b/src/cppcheckplus/control/Main.java
@@ -1,924 +1,16 @@
1package cppcheckplus.control; 1package cppcheckplus.control;
2 2
3import cppcheckplus.menu.MyMenuBar;
4import cppcheckplus.outlookpanel.MyOutlookPanel;
5import cppcheckplus.outlookpanel.MyOutlookPanelListItem;
6import cppcheckplus.shortcut.MyShortcutPanel;
7import cppcheckplus.shortcut.MyTree;
8import cppcheckplus.tab.MyTabPage;
9import cppcheckplus.tab.MyTabPage1;
10import cppcheckplus.tab.MyTabPanel;
11import cppcheckplus.tab.MyTabPanel1;
12import cppcheckplus.text.FileTools;
13import cppcheckplus.text.MyPanel;
14import cppcheckplus.text.MyTextPanel;
15import cppcheckplus.text.MyTextPanel1;
16import cppcheckplus.text.ViewPanel;
17import cppcheckplus.text.creatTable;
18import java.awt.BorderLayout;
19import java.awt.TextArea;
20import java.awt.event.ActionEvent;
21import java.awt.event.ActionListener;
22import java.awt.event.MouseAdapter;
23import java.awt.event.MouseEvent;
24import java.io.BufferedReader;
25import java.io.File;
26import java.io.IOException;
27import java.io.InputStream;
28import java.io.InputStreamReader;
29import java.io.UnsupportedEncodingException;
30import java.nio.charset.StandardCharsets;
31import java.nio.file.Files;
32import java.nio.file.Path;
33import java.nio.file.Paths;
34import javax.swing.BorderFactory;
35import javax.swing.JComponent;
36import javax.swing.JFileChooser;
37import javax.swing.JFrame;
38import javax.swing.JList;
39import javax.swing.JOptionPane;
40import javax.swing.JTextArea;
41import javax.swing.SwingUtilities; 3import javax.swing.SwingUtilities;
42import javax.swing.event.ListSelectionEvent;
43import javax.swing.event.ListSelectionListener;
44import javax.swing.plaf.TabbedPaneUI;
45import javax.xml.parsers.ParserConfigurationException; 4import javax.xml.parsers.ParserConfigurationException;
46 5
47 6public class Main {
48// 构造界面和各个工具的调用逻辑
49public class Main extends JFrame {
50 //private String target = "";// dump文件路径
51 public static final int SUCCESS = 0; // 表示程序执行成功
52 public static final String COMMAND = "java.exe -version"; // 要执行的语句
53 public static final String SUCCESS_MESSAGE = "程序执行成功!";
54 public static final String ERROR_MESSAGE = "程序执行出错:";
55 public static final String ENTERWindows = "\r\n";
56 public static final String ENTERLinux = "\n";
57 // XML配置文件路径
58 private final String menuBarXML;
59 private final String outlookPanelXML;
60 private final String settingsXML;
61 private final String stdclangXML;
62 // 界面组件
63 private final MyContentPanel contentPanel;
64 private final MyMenuBar menubar;
65 private final JFileChooser jfc = new JFileChooser();// 文件选择器
66 private final JFileChooser jfsettings = new JFileChooser();// 配置设定
67 private final String projectPath;
68 public MyTabPanel centerTabPanel;
69 // 编辑代码的面板
70 public MyTextPanel testCode;
71 public String src = ""; // 目标源文件或目录的路径
72 public String cppcheckPath = null;
73 public String flawfinderPath = null;
74 public String paracppcheck = null;
75 public String paraflawfinder = null;
76 public String clangtidyPath = null;
77 public String paraclangtidy = null;
78 public creatTable ct = new creatTable(); // 生成表格
79 private MyOutlookPanel outlookPanel;
80 private MyTabPanel1 footTabPanel;
81 private MyShortcutPanel shortcutPanel;
82 private MyTree tree;
83 // 标记是否修改了工具路径
84 private boolean changedpathcpp = false;
85 private boolean changedpathflaw = false;
86 private MyTextPanel1 testPanel;
87 private ViewPanel viewPanel;
88 // 显示代码和检查进程的文本区域
89 private JTextArea textCode;// 显示代码内容
90 private TextArea textCheck;// 显示检查进度输出
91 // 各工具的面板
92 private MyTextPanel1 flawfinderPanel;
93 private MyTextPanel1 cppcheckPanel;
94 private MyTextPanel1 clangPanel;
95 // 各工具的检测结果
96 private TextArea flawfinderResult;//flawfinder检测结果
97 private TextArea cppcheckResult;//cppcheck检测结果
98 private TextArea clangResult;//clang检测结果
99 // 文件操作相关
100 private File result; // 存储打开的文件
101 private File report; // 导出报告时选择的文件
102 private File direct; // 存储打开的目录
103 private String tmpFileName = "";//tmp文件名
104 //private static String inputResult = "inputResult.txt";
105 //private static String errorResult = "errorResult.txt";
106 private Main ui;
107
108 // 构造函数:初始化各个组件,加载配置文件,建立界面布局
109 public Main() {
110 projectPath = System.getProperty("user.dir");
111 // 文件选择器初始目录
112 jfc.setCurrentDirectory(new File("d://"));
113 jfsettings.setCurrentDirectory(new File("d://"));
114
115 // 配置文件路径
116 menuBarXML = "cppcheckplus/control/menubar.xml";
117 outlookPanelXML = "cppcheckplus/control/outlook.xml";
118 settingsXML = "cppcheckplus/control/settings.xml";
119 stdclangXML = "cppcheckplus/control/stdclang.xml";
120
121 MyContorlUtil.loadToolsRoad(settingsXML, this);// 加载工具路径设置到当前对象中
122 ct.initSTDClang(stdclangXML);// 设置clang配置
123
124 // 加载菜单栏,注册事件监听
125 menubar = MyContorlUtil.loadMenuBar(menuBarXML, new ActionListener() {
126 public void actionPerformed(ActionEvent e) {
127 String command = e.getActionCommand();
128 switch (command) {
129 case "onMenuOpen":
130 // 打开文件
131 jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
132 if (jfc.showOpenDialog(null) ==
133 JFileChooser.CANCEL_OPTION) {
134 return;
135 }
136 result = jfc.getSelectedFile();// result为选择到的文件
137 src = result.getAbsolutePath();
138 // 读取文件内容并显示到代码区
139 textCode.setText(FileTools.readFile(result));
140 // 如果代码标签页不存在,则创建一个
141 if (!centerTabPanel.isSelectTabComponents("代码")) {
142 centerTabPanel.addTab("代码", testCode);
143 centerTabPanel.isSelectTabComponents("代码");
144 }
145 break;
146 case "onMenuLoad":
147 // 加载目录:选择目录并更新目录树
148 jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
149 if (jfc.showOpenDialog(null) ==
150 JFileChooser.CANCEL_OPTION) {
151 return;
152 }
153 direct = jfc.getSelectedFile();// 选择到的目录
154 src = direct.getAbsolutePath();
155 tree.setRootDir(direct);// 更新目录树
156 break;
157 case "onMenuSave":
158 // 保存文件
159 if (result != null) {
160 FileTools.writeFile(result, textCode.getText());
161 }
162 break;
163 case "onMenuClose":
164 // 关闭程序
165 System.exit(0);
166 break;
167 case "onMenuClean":
168 // 清空:清空代码、检查结果、进度信息,重置参数
169 textCode.setText("");
170 flawfinderResult.setText("");
171 cppcheckResult.setText("");
172 clangResult.setText("");
173 viewPanel.clearTable();
174 ct.clearall();
175 textCheck.setText("");
176 paracppcheck = "--enable=all";
177 break;
178 case "onMenuExport":
179 // 导出:将检查结果导出到xml文件
180 JFileChooser dialog = new JFileChooser();
181 dialog.setDialogTitle("另存为");
182 dialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
183 dialog.setDialogType(JFileChooser.SAVE_DIALOG);
184 int r = dialog.showSaveDialog(ui);
185 if (r == JFileChooser.APPROVE_OPTION) {
186 report = dialog.getSelectedFile();
187 FileTools.writeFile(report, ct.results);
188 } else {
189 JOptionPane.showMessageDialog(null, "路径错误",
190 "提示", 2);
191 }
192 break;
193 case "onCppcheck":
194 // cppcheck检查
195 if (src != null && src.length() != 0) {
196 if (paracppcheck != null &&
197 paracppcheck.length() != 0) {
198 new Thread() {
199 public void run() {
200 execute(src, paracppcheck);
201 }
202 }.start();
203 } else {
204 JOptionPane.showMessageDialog(null, "参数错误",
205 "提示", 2);
206 }
207 } else {
208 JOptionPane.showMessageDialog(null, "目标路径错误",
209 "提示", 2);
210 }
211 break;
212 case "onClang":
213 // clang/clang-tidy检查
214 if (src != null && src.length() != 0) {
215 new Thread() {
216 public void run() {
217 execute2(src);
218 }
219 }.start();
220 } else {
221 JOptionPane.showMessageDialog(null, "目标路径错误",
222 "提示", 2);
223 }
224 break;
225 case "onFlawfinder":
226 // flawfinder检查
227 if (src != null && src.length() != 0) {
228 new Thread() {
229 public void run() {
230 tmpFileName = "tmp" + "src" + ".csv";
231 execute3(src, paraflawfinder, tmpFileName);
232 }
233 }.start();
234 } else {
235 JOptionPane.showMessageDialog(null, "目标路径错误",
236 "提示", 2);
237 }
238 break;
239 case "onMenuAbout":
240 // 关于:显示软件信息
241 JOptionPane.showMessageDialog(null, "cppcheckplus",
242 "提示", 2);
243 break;
244 case "onOrderType":
245 // 按类型排序:生成表格并按类型排序
246 ct.makeTable();
247 ct.ord(2);
248 if (!centerTabPanel.isSelectTabComponents("结果")) {
249 viewPanel = new ViewPanel(ct.results);
250 centerTabPanel.addTab("结果", createPage(viewPanel));
251 centerTabPanel.isSelectTabComponents("结果");
252 } else {
253 viewPanel.update(ct.results);
254 }
255 break;
256 case "onOrderLevel":
257 // 按级别排序
258 ct.makeTable();
259 ct.ord(3);
260 if (!centerTabPanel.isSelectTabComponents("结果")) {
261 viewPanel = new ViewPanel(ct.results);
262 centerTabPanel.addTab("结果", createPage(viewPanel));
263 centerTabPanel.isSelectTabComponents("结果");
264 } else {
265 viewPanel.update(ct.results);
266 }
267 break;
268 case "onOrderFile":
269 // 按文件排序
270 ct.makeTable();
271 ct.ord(1);
272 if (!centerTabPanel.isSelectTabComponents("结果")) {
273 viewPanel = new ViewPanel(ct.results);
274 centerTabPanel.addTab("结果", createPage(viewPanel));
275 centerTabPanel.isSelectTabComponents("结果");
276 } else {
277 viewPanel.update(ct.results);
278 }
279 break;
280 case "onSetCppcheckRoad":
281 // cppcheck路径
282 jfsettings.setFileSelectionMode(JFileChooser.FILES_ONLY);
283 if (jfsettings.showOpenDialog(null) == JFileChooser.CANCEL_OPTION) {
284 return;
285 } else {
286 File cppcheckFile = jfsettings.getSelectedFile();
287 String cppcheckPathTemp =
288 cppcheckFile.getAbsolutePath();
289 MyContorlUtil.fixSettingPath(settingsXML,
290 "cppcheck", cppcheckPathTemp);
291 changedpathcpp = true;
292 }
293 break;
294 case "onSetFlawfinderRoad":
295 // flawfinder路径
296 jfsettings.setFileSelectionMode(
297 JFileChooser.FILES_ONLY);
298 if (jfsettings.showOpenDialog(null) ==
299 JFileChooser.CANCEL_OPTION) {
300 return;// 撤销则返回
301 }
302 File flawfinderFile = jfsettings.getSelectedFile();
303 String flawfinderPathTemp =
304 flawfinderFile.getAbsolutePath();
305 MyContorlUtil.fixSettingPath(settingsXML, "flawfinder",
306 flawfinderPathTemp);
307 changedpathflaw = true;
308 break;
309 }
310 }
311 });
312
313 // 初始化主内容面板
314 contentPanel = new MyContentPanel();
315 try {
316 initSwing();
317 } catch (UnsupportedEncodingException e1) {
318 e1.printStackTrace();
319 }
320 }
321
322 public static void main(String[] args) throws ParserConfigurationException { 7 public static void main(String[] args) throws ParserConfigurationException {
323 SwingUtilities.invokeLater(new Runnable() { 8 SwingUtilities.invokeLater(new Runnable() {
324 public void run() { 9 public void run() {
325 MyContorlUtil.setupLookAndFeel(); 10 MyContorlUtil.setupLookAndFeel();
326 Main ui = new Main(); 11 UIFrame ui = new UIFrame();
327 ui.setVisible(true); 12 ui.setVisible(true);
328 } 13 }
329 }); 14 });
330 } 15 }
331
332 private void execute(String src, String para) {
333 // FIXME:这段代码原因不详,十分令人疑惑
334 if (changedpathcpp) {
335 MyContorlUtil.loadToolsRoad(settingsXML, this);
336 changedpathcpp = false;
337 }
338
339 // 路径未配置,直接返回
340 if (cppcheckPath == null) {
341 return;
342 }
343
344 Runtime[] runtime = {Runtime.getRuntime(), Runtime.getRuntime()};
345 Process[] p = new Process[2];
346 try {
347 System.out.printf(cppcheckPath + " %s %s%n", para, src);
348 // 指定模板执行cppcheck,用于生成“结果”表格
349 p[0] = runtime[0].exec(String.format(cppcheckPath +
350 " --template=\"cppcheck${file}${line}${severity}${id}${message}${cwe}\" %s %s",
351 para, src));
352 // 不使用模板,在底部标签页显示纯文本结果
353 p[1] = runtime[1].exec(
354 String.format(cppcheckPath + " %s %s", para, src));
355
356 final InputStream[] stdout =
357 {p[0].getInputStream(), p[1].getInputStream()};
358 final InputStream[] stderr =
359 {p[0].getErrorStream(), p[1].getErrorStream()};
360
361 // 模板标准输出
362 new Thread() {
363 @SuppressWarnings("resource")
364 public void run() {
365 BufferedReader br1 =
366 new BufferedReader(new InputStreamReader(stdout[0]));
367 StringBuilder l1 = new StringBuilder();
368 try {
369 String line1 = null;
370 int i = 0;
371 textCheck.setText("");
372 while ((line1 = br1.readLine()) != null) {
373 textCheck.append(i + " " + line1 + ENTERWindows);
374 i++;
375 }
376 } catch (Exception e) {
377 e.printStackTrace();
378 System.out.println("inputError");
379 } finally {
380 try {
381 stdout[0].close();
382 } catch (IOException e) {
383 e.printStackTrace();
384 }
385 }
386 }
387 }.start();
388
389 // 模板错误流,用于生成结果表格
390 new Thread() {
391 public void run() {
392 BufferedReader br2 =
393 new BufferedReader(new InputStreamReader(stderr[0]));
394 StringBuilder l2 = new StringBuilder();
395 try {
396 String line2 = null;
397 int i = 0;
398 while ((line2 = br2.readLine()) != null) {
399 ct.toRowsOfCppcheckResult(line2);
400 l2.append(i + " " + line2 + ENTERWindows);
401 i++;
402 }
403 } catch (Exception e) {
404 e.printStackTrace();
405 } finally {
406 try {
407 cppcheckResult.setText(
408 new String(l2.toString().getBytes(),
409 StandardCharsets.UTF_8));
410 stderr[0].close();
411 } catch (IOException e) {
412 e.printStackTrace();
413 }
414 }
415 }
416 }.start();
417
418 // 纯文本的错误流,用于在底部标签页显示
419 new Thread() {
420 public void run() {
421 BufferedReader br2 =
422 new BufferedReader(new InputStreamReader(stderr[1]));
423 StringBuilder l2 = new StringBuilder();
424 cppcheckResult.setText("");
425 try {
426 String line2 = null;
427 int i = 0;
428 while ((line2 = br2.readLine()) != null) {
429 l2.append(i + " " + line2 + ENTERWindows);
430 i++;
431 }
432 } catch (Exception e) {
433 e.printStackTrace();
434 } finally {
435 try {
436 cppcheckResult.setText(
437 new String(l2.toString().getBytes(),
438 StandardCharsets.UTF_8));
439 stderr[1].close();
440 } catch (IOException e) {
441 e.printStackTrace();
442 }
443 }
444 }
445 }.start();
446
447 // 等待两个进程结束
448 int exitCode = p[0].waitFor();
449 int exitCode1 = p[1].waitFor();
450 if (exitCode == SUCCESS) {
451 System.out.println(SUCCESS_MESSAGE);
452 } else {
453 System.err.println(ERROR_MESSAGE + exitCode);
454 }
455 p[0].destroy();
456 p[1].destroy();
457 } catch (Exception e) {
458 try {
459 // 出现异常则关闭相关流
460 p[0].getErrorStream().close();
461 p[0].getInputStream().close();
462 p[0].getOutputStream().close();
463 p[1].getErrorStream().close();
464 p[1].getInputStream().close();
465 p[1].getOutputStream().close();
466 } catch (Exception ee) {
467 }
468 }
469
470 if (!centerTabPanel.isSelectTabComponents("结果")) {
471 try {
472 ct.makeTable();
473 viewPanel = new ViewPanel(ct.results);
474 } catch (Exception e1) {
475 e1.printStackTrace();
476 System.out.println("图表生成错误");
477 }
478 centerTabPanel.addTab("结果", createPage(viewPanel));
479 centerTabPanel.isSelectTabComponents("结果");
480 } else {
481 try {
482 ct.makeTable();
483 viewPanel.update(ct.results);
484 } catch (Exception e1) {
485 e1.printStackTrace();
486 System.out.println("图表生成错误");
487 }
488 }
489
490 // 底部标签页切换到cppcheck
491 if (!footTabPanel.isSelectTabComponents("cppcheck")) {
492 footTabPanel.selectTabByOId("cppcheck");
493 }
494 }
495
496 private void execute2(String src) {
497 // clang-tidy 检查
498 Runtime runtime = Runtime.getRuntime();
499 Process p = null;
500 try {
501 // 修改为执行 clang-tidy
502 Path srcPath = Paths.get(src);
503 String execable;
504 // FIXME:
505 // 1.这里没能实现递归检查
506 // 2.如何指定特定的检查规则?
507 // 3.如何指定特定的头文件路径?
508 // 4.是否需要指定代码标准
509 if (Files.isDirectory(srcPath)) {
510 // 是目录,则检查这个目录下所有cpp文件
511 execable = String.format(
512 "%s %s\\*.cpp --checks=* --header-filter=%s -- %s",
513 clangtidyPath, src, src, paraclangtidy);
514 } else {
515 // 是文件,直接执行
516 execable =
517 String.format("%s %s --checks=* --header-filter=%s -- %s",
518 clangtidyPath, src, src, paraclangtidy);
519 }
520 //String execable = String.format("clang-tidy %s\\*.cpp --checks='*,misc-no-delete-this,-llvmlibc-restrict-system-libc-headers,-modernize-use-trailing-return-type' -- -std=c++17 -I %s", src, path);
521 System.out.println(execable);
522
523 // 执行
524 p = runtime.exec(execable);
525 final InputStream stdout = p.getInputStream();
526 final InputStream stderr = p.getErrorStream();
527
528 clangResult.setText("");
529
530 // 处理标准输出
531 new Thread() {
532 public void run() {
533 BufferedReader br1 =
534 new BufferedReader(new InputStreamReader(stdout));
535 StringBuilder l1 = new StringBuilder();
536 try {
537 String line1 = null;
538 while ((line1 = br1.readLine()) != null) {
539 l1.append(line1 + ENTERWindows);
540 ct.toRowsOfClang(line1);
541 }
542 } catch (Exception e) {
543 e.printStackTrace();
544 } finally {
545 try {
546 clangResult.append(l1.toString());
547 stdout.close();
548 } catch (IOException e) {
549 e.printStackTrace();
550 }
551 }
552 }
553 }.start();
554
555 new Thread() {
556 public void run() {
557 BufferedReader br2 =
558 new BufferedReader(new InputStreamReader(stderr));
559 StringBuilder l2 = new StringBuilder();
560 try {
561 String line2 = null;
562 int i = 0;
563 l2.append(ENTERWindows + ENTERWindows);
564 while ((line2 = br2.readLine()) != null) {
565 l2.append(line2 + ENTERWindows);
566 ct.toRowsOfClang(line2);
567 i++;
568 }
569 } catch (Exception e) {
570 e.printStackTrace();
571 System.out.println("inputError");
572 } finally {
573 try {
574 clangResult.append(l2.toString());
575 stderr.close();
576 } catch (IOException e) {
577 e.printStackTrace();
578 }
579 }
580 }
581 }.start();
582
583 int exitCode = p.waitFor();
584 if (exitCode == SUCCESS) {
585 System.out.println(SUCCESS_MESSAGE);
586 } else {
587 System.err.println(ERROR_MESSAGE + exitCode);
588 }
589 p.destroy();
590 } catch (Exception e) {
591 try {
592 p.getInputStream().close();
593 p.getOutputStream().close();
594 p.getErrorStream().close();
595 } catch (Exception ee) {
596 }
597 }
598
599 // 更新或者创建结果标签页,显示结果
600 if (!centerTabPanel.isSelectTabComponents("结果")) {
601 try {
602 ct.makeTable();
603 viewPanel = new ViewPanel(ct.results);
604 } catch (Exception e1) {
605 e1.printStackTrace();
606 System.out.println("图表生成错误");
607 }
608 centerTabPanel.addTab("结果", createPage(viewPanel));
609 centerTabPanel.isSelectTabComponents("结果");
610 } else {
611 try {
612 ct.makeTable();
613 viewPanel.update(ct.results);
614 } catch (Exception e1) {
615 e1.printStackTrace();
616 System.out.println("图表生成错误");
617 }
618 }
619
620 if (!footTabPanel.isSelectTabComponents("Clang")) {
621 footTabPanel.selectTabByOId("Clang");
622 }
623 }
624
625 private void execute3(String src, String para, String tmpFileName) {
626 // flawfinder
627 if (changedpathflaw) {
628 MyContorlUtil.loadToolsRoad(settingsXML, this);
629 changedpathflaw = false;
630 }
631
632 if (flawfinderPath == null) {
633 return;
634 }
635 Runtime runtime = Runtime.getRuntime();
636 Process p = null;
637 Runtime runtime2 = Runtime.getRuntime();
638 Process p2 = null;
639 try {
640
641 // 两个参数数组,一个是csv格式,一个是传入的参数
642 String[] arguments =
643 new String[] {"python", flawfinderPath, "--csv", src};
644 String[] arguments2 =
645 new String[] {"python", flawfinderPath, para, src};
646
647 p = runtime.exec(arguments);
648 p2 = runtime.exec(arguments2);
649 final InputStream is1 = p.getInputStream();
650 final InputStream is2 = p2.getInputStream();
651 System.out.println(arguments2[1]);
652
653 // csv结果添加到表格
654 new Thread() {
655 public void run() {
656 BufferedReader br1 =
657 new BufferedReader(new InputStreamReader(is1));
658 try {
659 String line1 = null;
660 while ((line1 = br1.readLine()) != null) {
661 ct.toRowsOfflawfinder(line1);
662 }
663 } catch (Exception e) {
664 e.printStackTrace();
665 } finally {
666 try {
667 is1.close();
668 } catch (IOException e) {
669 e.printStackTrace();
670 }
671 }
672 }
673 }.start();
674
675 // 普通结果显示在文本框
676 new Thread() {
677 public void run() {
678 //flawfinder result
679 BufferedReader br1 =
680 new BufferedReader(new InputStreamReader(is2));
681 StringBuilder l1 = new StringBuilder();
682 flawfinderResult.setText("");
683 try {
684 String line1 = null;
685 while ((line1 = br1.readLine()) != null) {
686 l1.append(line1 + ENTERWindows);
687 }
688 } catch (Exception e) {
689 e.printStackTrace();
690 } finally {
691 try {
692 flawfinderResult.setText(
693 l1.substring(0, l1.length()));
694 is2.close();
695 } catch (IOException e) {
696 e.printStackTrace();
697 }
698 }
699 }
700 }.start();
701
702 int exitCode = p.waitFor();
703 int exitCode2 = p2.waitFor();
704 if (exitCode == SUCCESS) {
705 System.out.println(SUCCESS_MESSAGE);
706 } else {
707 System.err.println(ERROR_MESSAGE + exitCode);
708 }
709 p.destroy();
710 p2.destroy();
711 } catch (Exception e) {
712 try {
713 p.getErrorStream().close();
714 p.getInputStream().close();
715 p.getOutputStream().close();
716 p2.getErrorStream().close();
717 p2.getInputStream().close();
718 p2.getOutputStream().close();
719 } catch (Exception ee) {
720 }
721 }
722 if (!centerTabPanel.isSelectTabComponents("结果")) {
723 try {
724 ct.makeTable();
725 viewPanel = new ViewPanel(ct.results);
726 } catch (Exception e1) {
727 e1.printStackTrace();
728 System.out.println("图表生成错误");
729 }
730 centerTabPanel.addTab("结果", createPage(viewPanel));
731 centerTabPanel.isSelectTabComponents("结果");
732 } else {
733 try {
734 ct.makeTable();
735 viewPanel.update(ct.results);
736 } catch (Exception e1) {
737 e1.printStackTrace();
738 System.out.println("图表生成错误");
739 }
740 }
741
742 if (!footTabPanel.isSelectTabComponents("flawfinder")) {
743 footTabPanel.selectTabByOId("flawfinder");
744 }
745 }
746
747 private void initSwing() throws UnsupportedEncodingException {
748 setTitle("Cppcheckplus");
749 setDefaultCloseOperation(3); // 关闭窗口时退出程序
750 setSize(1024, 768);
751
752 // 设置窗口图标
753 setIconImage(MyContorlUtil.getImage("control/images/logo2.png"));
754 setContentPane(contentPanel);
755 // 菜单栏在最上方
756 contentPanel.add(menubar, "North");
757
758 // 除却菜单栏之外的面板
759 //JPanel centerPane = new JPanel(new BorderLayout());
760
761 // 中间区域,除了菜单栏之外的所有内容
762 MyPanel centerPane = new MyPanel(new BorderLayout());
763 centerPane.setOpaque(true);
764 //centerPane.setBackground(MyContorlUtil.CONTENT_PANE_BACKGROUND3);
765 //centerPane.setBackground(MyContorlUtil.getImage("control/images/logo2.png"));
766 centerPane.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
767 contentPanel.add(centerPane, "Center");
768
769 // 初始化各个标签页、侧边栏、目录树
770 initTab();
771 initTab2();
772 initOutlookPanel();
773 try {
774 initShortcutPanel();
775 } catch (UnsupportedEncodingException e) {
776 // TODO Auto-generated catch block
777 e.printStackTrace();
778 }
779 initTree();
780
781 // 面板加入布局
782 centerPane.add(outlookPanel, "West");
783 centerPane.add(centerTabPanel, "Center");
784 centerPane.add(shortcutPanel, "East");
785
786 // 底部添加第二个标签页面板,用于显示检查结果
787 contentPanel.add(footTabPanel, BorderLayout.SOUTH);
788 }
789
790 private void initTree() {
791 tree = shortcutPanel.mytree;
792 // 点击目录树节点,显示对应文件内容
793 tree.setCode(textCode, this);
794 }
795
796 private void initOutlookPanel() {
797 outlookPanel = new MyOutlookPanel(new ActionListener() {
798 @Override
799 public void actionPerformed(ActionEvent e) {
800 String command = e.getActionCommand();
801 System.out.println("Head:" + command);
802 }
803 }, new ListSelectionListener() {
804 @Override
805 public void valueChanged(ListSelectionEvent e) {
806 boolean adjust = e.getValueIsAdjusting();
807 if (!adjust) {
808 JList list = (JList) e.getSource();
809 Object[] selectionValues = list.getSelectedValues();
810 MyOutlookPanelListItem item =
811 (MyOutlookPanelListItem) selectionValues[0];
812 String command = item.getActionCommand();
813 if (command.equals("Chart2")) {
814 // 如果TabPanel不存在就create,否则就切换
815 if (!centerTabPanel.isSelectTabComponents("结果")) {
816 try {
817 ct.makeTable();
818 viewPanel = new ViewPanel(ct.results);
819 } catch (Exception e1) {
820 e1.printStackTrace();
821 System.out.println("图表生成错误");
822 }
823 centerTabPanel.addTab("结果", createPage(viewPanel));
824 centerTabPanel.isSelectTabComponents("结果");
825 }
826 } else if (command.equals("Map")) {
827 // 代码标签页
828 if (!centerTabPanel.isSelectTabComponents("代码")) {
829 centerTabPanel.addTab("代码", testCode);
830 centerTabPanel.isSelectTabComponents("代码");
831 }
832 } else if (command.equals("Process")) {
833 // 进度
834 if (!centerTabPanel.isSelectTabComponents("进度")) {
835 centerTabPanel.addTab("进度", textCheck);
836 centerTabPanel.isSelectTabComponents("进度");
837 }
838 }
839 }
840 }
841
842 });
843 // 根据XML配置文件加载Outlook面板内容
844 MyContorlUtil.loadOutlookPanel(outlookPanelXML, outlookPanel);
845 }
846
847 private void initTab() {
848 centerTabPanel = new MyTabPanel();
849 centerTabPanel.addMouseListener(new MouseAdapter() {
850 private boolean isMaximized() {
851 return outlookPanel.isShrinked();
852 }
853
854 public void mouseClicked(MouseEvent e) {
855 if (e.getClickCount() > 1) {
856 TabbedPaneUI ui = centerTabPanel.getUI();
857 int tabIndex =
858 ui.tabForCoordinate(centerTabPanel, e.getX(), e.getY());
859 if (tabIndex != -1) {
860 boolean maxed = isMaximized();
861 outlookPanel.setShrink(!maxed);
862 shortcutPanel.setShrink(!maxed);
863 }
864 }
865 }
866 });
867
868 testCode = new MyTextPanel();
869 testPanel = new MyTextPanel1();
870 viewPanel = new ViewPanel();
871 textCode = testCode.getTextArea();
872 textCheck = testPanel.getTextArea();
873 }
874
875 private void initTab2() {
876 footTabPanel = new MyTabPanel1();
877 footTabPanel.addMouseListener(new MouseAdapter() {
878 private boolean isMaximized() {
879 return outlookPanel.isShrinked();
880 }
881
882 public void mouseClicked(MouseEvent e) {
883 if (e.getClickCount() > 1) {
884 TabbedPaneUI ui = footTabPanel.getUI();
885 int tabIndex =
886 ui.tabForCoordinate(footTabPanel, e.getX(), e.getY());
887 if (tabIndex != -1) {
888 boolean maxed = isMaximized();
889 outlookPanel.setShrink(!maxed);
890 shortcutPanel.setShrink(!maxed);
891 }
892 }
893 }
894 });
895
896 flawfinderPanel = new MyTextPanel1();
897 cppcheckPanel = new MyTextPanel1();
898 clangPanel = new MyTextPanel1();
899 flawfinderResult = flawfinderPanel.getTextArea();
900 cppcheckResult = cppcheckPanel.getTextArea();
901 clangResult = clangPanel.getTextArea();
902
903 footTabPanel.addTab("cppcheck", createPage1(cppcheckPanel));
904 footTabPanel.addTab("Clang", createPage1(clangPanel));
905 footTabPanel.addTab("flawfinder", createPage1(flawfinderPanel));
906 }
907
908 private MyTabPage1 createPage1(JComponent pageContent) {
909 MyTabPage1 page = new MyTabPage1(pageContent);
910 return page;
911 }
912
913 private MyTabPage createPage(JComponent pageContent) {
914 MyTabPage page = new MyTabPage(pageContent);
915 return page;
916 }
917
918 //改造成目录树
919 private void initShortcutPanel() throws UnsupportedEncodingException {
920 shortcutPanel = new MyShortcutPanel();
921 shortcutPanel.setTitle(
922 new String("项目".getBytes(), StandardCharsets.UTF_8));
923 }
924} 16}