View Javadoc
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