1 package net.sourceforge.pmd.cpd;
2
3 import javax.swing.BorderFactory;
4 import javax.swing.JButton;
5 import javax.swing.JCheckBox;
6 import javax.swing.JComboBox;
7 import javax.swing.JFileChooser;
8 import javax.swing.JFrame;
9 import javax.swing.JMenu;
10 import javax.swing.JMenuBar;
11 import javax.swing.JMenuItem;
12 import javax.swing.JOptionPane;
13 import javax.swing.JPanel;
14 import javax.swing.JProgressBar;
15 import javax.swing.JScrollPane;
16 import javax.swing.JTextArea;
17 import javax.swing.JTextField;
18 import javax.swing.Timer;
19 import java.awt.BorderLayout;
20 import java.awt.Dimension;
21 import java.awt.FileDialog;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.io.File;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.io.PrintWriter;
28
29 public class GUI implements CPDListener {
30
31 private static class CancelListener implements ActionListener {
32 public void actionPerformed(ActionEvent e) {
33 System.exit(0);
34 }
35 }
36
37 private class GoListener implements ActionListener {
38 public void actionPerformed(ActionEvent e) {
39 new Thread(new Runnable() {
40 public void run() {
41 tokenizingFilesBar.setValue(0);
42 tokenizingFilesBar.setString("");
43 resultsTextArea.setText("");
44 comparisonsField.setText("");
45 timeField.setText("");
46 go();
47 }
48 }).start();
49 }
50 }
51
52 private class SaveListener implements ActionListener {
53 public void actionPerformed(ActionEvent evt){
54 FileDialog fdlg = new FileDialog(GUI.this.frame, "Save", FileDialog.SAVE);
55 fdlg.setVisible(true);
56 String selected = fdlg.getDirectory() + System.getProperty("file.separator") + fdlg.getFile();
57 if(selected !=null){
58 if(!new File(selected).canWrite()){
59 try{
60 PrintWriter pw = new PrintWriter(new FileOutputStream(selected));
61 String report = resultsTextArea.getText();
62 pw.print(report);
63 pw.flush();
64 pw.close();
65 }catch(IOException e){
66 error("Couldn't save file"+new File(selected).getAbsolutePath(), e);
67 }
68 }else{
69 error("Could not write to file "+new File(selected).getAbsolutePath(), null);
70
71 }
72
73 }
74
75 }
76
77 private void error(String message, Exception e){
78 if(e != null){
79 e.printStackTrace();
80 }
81 JOptionPane.showMessageDialog(GUI.this.frame, message);
82 }
83
84 }
85
86 private class BrowseListener implements ActionListener {
87 public void actionPerformed(ActionEvent e) {
88 JFileChooser fc = new JFileChooser(rootDirectoryField.getText());
89 fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
90 fc.showDialog(frame, "Select");
91 if (fc.getSelectedFile() != null) {
92 rootDirectoryField.setText(fc.getSelectedFile().getAbsolutePath());
93 }
94 }
95 }
96
97 private JTextField rootDirectoryField = new JTextField(System.getProperty("user.home"));
98 private JTextField minimumLengthField = new JTextField("75");
99 private JTextField timeField = new JTextField(6);
100 private JTextField comparisonsField = new JTextField(8);
101 private JProgressBar tokenizingFilesBar = new JProgressBar();
102 private JTextArea resultsTextArea = new JTextArea();
103 private JCheckBox recurseCheckbox = new JCheckBox("", true);
104 private JComboBox languageBox = new JComboBox();
105
106 private JFrame frame;
107
108 public GUI() {
109 frame = new JFrame("PMD Cut and Paste Detector");
110
111 JMenu fileMenu = new JMenu("File");
112 fileMenu.setMnemonic('f');
113 JMenuItem saveItem = new JMenuItem("Save");
114 saveItem.setMnemonic('s');
115 saveItem.addActionListener(new SaveListener());
116 fileMenu.add(saveItem); JMenuItem exitItem = new JMenuItem("Exit");
117 exitItem.setMnemonic('x');
118 exitItem.addActionListener(new CancelListener());
119 fileMenu.add(exitItem);
120 JMenuBar menuBar = new JMenuBar();
121 menuBar.add(fileMenu);
122 frame.setJMenuBar(menuBar);
123
124 // first make all the buttons
125 JButton browseButton = new JButton("Browse");
126 browseButton.setMnemonic('b');
127 browseButton.addActionListener(new BrowseListener());
128 JButton goButton = new JButton("Go");
129 goButton.setMnemonic('g');
130 goButton.addActionListener(new GoListener());
131 JButton cxButton = new JButton("Cancel");
132 cxButton.addActionListener(new CancelListener());
133
134 JPanel settingsPanel = makeSettingsPanel(browseButton, goButton, cxButton);
135 JPanel progressPanel = makeProgressPanel();
136 JPanel resultsPanel = makeResultsPanel();
137
138 frame.getContentPane().setLayout(new BorderLayout());
139 JPanel topPanel = new JPanel();
140 topPanel.setLayout(new BorderLayout());
141 topPanel.add(settingsPanel, BorderLayout.NORTH);
142 topPanel.add(progressPanel, BorderLayout.CENTER);
143 frame.getContentPane().add(topPanel, BorderLayout.NORTH);
144 frame.getContentPane().add(resultsPanel, BorderLayout.CENTER);
145 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
146 frame.pack();
147 frame.show();
148 }
149
150 private JPanel makeSettingsPanel(JButton browseButton, JButton goButton, JButton cxButton) {
151 JPanel settingsPanel = new JPanel();
152 GridBagHelper helper = new GridBagHelper(settingsPanel, new double[]{0.2, 0.7, 0.1, 0.1});
153 helper.addLabel("Root source directory:");
154 helper.add(rootDirectoryField);
155 helper.add(browseButton, 2);
156 helper.nextRow();
157 helper.addLabel("Minimum tile size:");
158 minimumLengthField.setColumns(4);
159 helper.add(minimumLengthField);
160 helper.addLabel("Language:");
161 languageBox.addItem("Java");
162 languageBox.addItem("C++");
163 languageBox.addItem("PHP");
164 helper.add(languageBox);
165 helper.nextRow();
166 helper.addLabel("Also scan subdirectories?");
167 helper.add(recurseCheckbox);
168 helper.add(goButton);
169 helper.add(cxButton);
170 helper.nextRow();
171 settingsPanel.setBorder(BorderFactory.createTitledBorder("Settings"));
172 return settingsPanel;
173 }
174
175 private JPanel makeProgressPanel() {
176 JPanel progressPanel = new JPanel();
177 final double[] weights = {0.0, 0.8, 0.4, 0.2};
178 GridBagHelper helper = new GridBagHelper(progressPanel, weights);
179 helper.addLabel("Tokenizing files:");
180 helper.add(tokenizingFilesBar, 3);
181 helper.nextRow();
182 helper.addLabel("Comparisons so far:");
183 helper.add(comparisonsField);
184 helper.addLabel("Time elapsed:");
185 helper.add(timeField);
186 helper.nextRow();
187 progressPanel.setBorder(BorderFactory.createTitledBorder("Progress"));
188 return progressPanel;
189 }
190
191 private JPanel makeResultsPanel() {
192 JPanel resultsPanel = new JPanel();
193 resultsPanel.setLayout(new BorderLayout());
194 JScrollPane areaScrollPane = new JScrollPane(resultsTextArea);
195 areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
196 areaScrollPane.setPreferredSize(new Dimension(600, 300));
197 resultsPanel.add(areaScrollPane, BorderLayout.CENTER);
198 resultsPanel.setBorder(BorderFactory.createTitledBorder("Results"));
199 return resultsPanel;
200 }
201
202 private void go() {
203 try {
204 Language language = null;
205 LanguageFactory lf = new LanguageFactory();
206 if (languageBox.getSelectedItem().equals("Java")) {
207 language = lf.createLanguage(LanguageFactory.JAVA_KEY);
208 } else if (languageBox.getSelectedItem().equals("C++")) {
209 language = lf.createLanguage(LanguageFactory.CPP_KEY);
210 } else if (languageBox.getSelectedItem().equals("PHP")) {
211 language = lf.createLanguage(LanguageFactory.PHP_KEY);
212 }
213
214 CPD cpd = new CPD(Integer.parseInt(minimumLengthField.getText()), language);
215 cpd.setCpdListener(this);
216 tokenizingFilesBar.setMinimum(0);
217 comparisonsField.setText("");
218 if (rootDirectoryField.getText().endsWith(".class") || rootDirectoryField.getText().endsWith(".php") || rootDirectoryField.getText().endsWith(".java") || rootDirectoryField.getText().endsWith(".cpp") || rootDirectoryField.getText().endsWith(".c")) {
219 cpd.add(new File(rootDirectoryField.getText()));
220 } else {
221 if (recurseCheckbox.isSelected()) {
222 cpd.addRecursively(rootDirectoryField.getText());
223 } else {
224 cpd.addAllInDirectory(rootDirectoryField.getText());
225 }
226 }
227 final long start = System.currentTimeMillis();
228 Timer t = new Timer(1000, new ActionListener() {
229 public void actionPerformed(ActionEvent e) {
230 long now = System.currentTimeMillis();
231 long elapsedMillis = now - start;
232 long elapsedSeconds = elapsedMillis / 1000;
233 long hours = (long) Math.floor(elapsedSeconds / 3600);
234 long minutes = (long) Math.floor((elapsedSeconds - (hours * 3600)) / 60);
235 long seconds = elapsedSeconds - ((minutes * 60) + (hours * 3600));
236 timeField.setText("" + hours + ":" + minutes + ":" + seconds);
237 }
238 });
239 t.start();
240 cpd.go();
241 t.stop();
242 String report = new SimpleRenderer().render(cpd.getMatches());
243 if (report.length() == 0) {
244 JOptionPane.showMessageDialog(frame, "Done; couldn't find any duplicates longer than " + minimumLengthField.getText() + " tokens");
245 } else {
246 resultsTextArea.setText(report);
247 }
248 } catch (Throwable t) {
249 t.printStackTrace();
250 JOptionPane.showMessageDialog(frame, "Halted due to " + t.getClass().getName() + "; " + t.getMessage());
251 }
252 }
253
254 // CPDListener
255 public void comparisonCountUpdate(long comparisons) {
256 comparisonsField.setText(String.valueOf(comparisons));
257 }
258
259 public void addedFile(int fileCount, File file) {
260 tokenizingFilesBar.setMaximum(fileCount);
261 tokenizingFilesBar.setValue(tokenizingFilesBar.getValue() + 1);
262 }
263 // CPDListener
264
265 public static void main(String[] args) {
266 new GUI();
267 }
268
269 }
This page was automatically generated by Maven