diff options
Diffstat (limited to 'src/cppcheckplus/control/Main.java')
-rw-r--r-- | src/cppcheckplus/control/Main.java | 912 |
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 @@ | |||
1 | package cppcheckplus.control; | 1 | package cppcheckplus.control; |
2 | 2 | ||
3 | import cppcheckplus.menu.MyMenuBar; | ||
4 | import cppcheckplus.outlookpanel.MyOutlookPanel; | ||
5 | import cppcheckplus.outlookpanel.MyOutlookPanelListItem; | ||
6 | import cppcheckplus.shortcut.MyShortcutPanel; | ||
7 | import cppcheckplus.shortcut.MyTree; | ||
8 | import cppcheckplus.tab.MyTabPage; | ||
9 | import cppcheckplus.tab.MyTabPage1; | ||
10 | import cppcheckplus.tab.MyTabPanel; | ||
11 | import cppcheckplus.tab.MyTabPanel1; | ||
12 | import cppcheckplus.text.FileTools; | ||
13 | import cppcheckplus.text.MyPanel; | ||
14 | import cppcheckplus.text.MyTextPanel; | ||
15 | import cppcheckplus.text.MyTextPanel1; | ||
16 | import cppcheckplus.text.ViewPanel; | ||
17 | import cppcheckplus.text.creatTable; | ||
18 | import java.awt.BorderLayout; | ||
19 | import java.awt.TextArea; | ||
20 | import java.awt.event.ActionEvent; | ||
21 | import java.awt.event.ActionListener; | ||
22 | import java.awt.event.MouseAdapter; | ||
23 | import java.awt.event.MouseEvent; | ||
24 | import java.io.BufferedReader; | ||
25 | import java.io.File; | ||
26 | import java.io.IOException; | ||
27 | import java.io.InputStream; | ||
28 | import java.io.InputStreamReader; | ||
29 | import java.io.UnsupportedEncodingException; | ||
30 | import java.nio.charset.StandardCharsets; | ||
31 | import java.nio.file.Files; | ||
32 | import java.nio.file.Path; | ||
33 | import java.nio.file.Paths; | ||
34 | import javax.swing.BorderFactory; | ||
35 | import javax.swing.JComponent; | ||
36 | import javax.swing.JFileChooser; | ||
37 | import javax.swing.JFrame; | ||
38 | import javax.swing.JList; | ||
39 | import javax.swing.JOptionPane; | ||
40 | import javax.swing.JTextArea; | ||
41 | import javax.swing.SwingUtilities; | 3 | import javax.swing.SwingUtilities; |
42 | import javax.swing.event.ListSelectionEvent; | ||
43 | import javax.swing.event.ListSelectionListener; | ||
44 | import javax.swing.plaf.TabbedPaneUI; | ||
45 | import javax.xml.parsers.ParserConfigurationException; | 4 | import javax.xml.parsers.ParserConfigurationException; |
46 | 5 | ||
47 | 6 | public class Main { | |
48 | // 构造界面和各个工具的调用逻辑 | ||
49 | public 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 | } |