| 1 19 20 package edu.umd.cs.findbugs.gui2; 21 22 import java.awt.event.ActionEvent ; 23 import java.awt.event.ActionListener ; 24 import java.awt.event.WindowAdapter ; 25 import java.awt.event.WindowEvent ; 26 27 import javax.swing.BoxLayout ; 28 import javax.swing.JButton ; 29 import javax.swing.JLabel ; 30 import javax.swing.JProgressBar ; 31 import javax.swing.SwingUtilities ; 32 33 import edu.umd.cs.findbugs.FindBugsProgress; 34 import edu.umd.cs.findbugs.Project; 35 import edu.umd.cs.findbugs.annotations.NonNull; 36 37 @SuppressWarnings ("serial") 38 42 public final class AnalyzingDialog extends FBDialog implements FindBugsProgress 43 { 44 private volatile boolean analysisFinished = false; 45 @NonNull private Project project; 46 private AnalysisCallback callback; 47 private AnalysisThread analysisThread = new AnalysisThread(); 48 49 private int count; 50 private int goal; 51 52 private JLabel statusLabel; 53 private JProgressBar progressBar; 54 private JButton cancelButton; 55 56 public AnalyzingDialog(@NonNull final Project project) 57 { 58 this(project, new AnalysisCallback() 59 { 60 public void analysisFinished(BugSet results) 61 { 62 ProjectSettings.newInstance(); 63 ((BugTreeModel)MainFrame.getInstance().getTree().getModel()).getOffListenerList(); 64 MainFrame.getInstance().getTree().setModel(new BugTreeModel(MainFrame.getInstance().getTree(), MainFrame.getInstance().getSorter(), results)); 65 MainFrame.getInstance().setProject(project); 66 } 67 68 public void analysisInterrupted() {} 69 }, false); 70 } 71 72 73 79 public AnalyzingDialog(@NonNull Project project, AnalysisCallback callback, boolean joinThread) 80 { 81 assert project != null; 82 this.project = project; 83 this.callback = callback; 84 initComponents(); 85 analysisThread.start(); 86 if (joinThread) 87 try {analysisThread.join();} catch (InterruptedException e) {} 88 } 89 90 public void initComponents() 91 { 92 statusLabel = new JLabel (" "); 93 progressBar = new JProgressBar (); 94 progressBar.setStringPainted(true); 95 cancelButton = new JButton (edu.umd.cs.findbugs.L10N.getLocalString("dlg.cancel_btn", "Cancel")); 96 cancelButton.addActionListener(new ActionListener () 97 { 98 public void actionPerformed(ActionEvent evt) 99 { 100 cancel(); 101 } 102 }); 103 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 104 addWindowListener(new WindowAdapter () 105 { 106 @Override  107 public void windowClosed(WindowEvent evt) 108 { 109 cancel(); 110 } 111 }); 112 113 SwingUtilities.invokeLater(new Runnable () 114 { 115 public void run() 116 { 117 setLayout(new BoxLayout (getContentPane(), BoxLayout.Y_AXIS)); 118 add(statusLabel); 119 add(progressBar); 120 add(cancelButton); 121 statusLabel.setAlignmentX(CENTER_ALIGNMENT); 122 progressBar.setAlignmentX(CENTER_ALIGNMENT); 123 cancelButton.setAlignmentX(CENTER_ALIGNMENT); 124 pack(); 125 setSize(300, getHeight()); 126 setLocationRelativeTo(MainFrame.getInstance()); 127 setResizable(false); 128 setModal(false); 129 setVisible(true); 130 } 131 }); 132 } 133 134 private void cancel() 135 { 136 if (!analysisFinished) 137 { 138 analysisThread.interrupt(); 139 setVisible(false); 140 } 142 } 143 144 private void updateStage(String stage) 145 { 146 statusLabel.setText(stage); 147 } 148 149 private void incrementCount() 150 { 151 count++; 152 SwingUtilities.invokeLater(new Runnable () 153 { 154 public void run() 155 { 156 progressBar.setString(count + "/" + goal); 157 progressBar.setValue(count); 158 } 159 }); 160 } 161 162 private void updateCount(final int count, final int goal) 163 { 164 this.count = count; 165 this.goal = goal; 166 SwingUtilities.invokeLater(new Runnable () 167 { 168 public void run() 169 { 170 progressBar.setString(count + "/" + goal); 171 progressBar.setValue(count); 172 progressBar.setMaximum(goal); 173 } 174 }); 175 } 176 177 public void finishArchive() 178 { 179 incrementCount(); 180 } 181 182 public void finishClass() 183 { 184 incrementCount(); 185 } 186 187 public void finishPerClassAnalysis() 188 { 189 updateStage(edu.umd.cs.findbugs.L10N.getLocalString("progress.finishing_analysis", "Finishing analysis...")); 190 } 191 192 public void reportNumberOfArchives(int numArchives) 193 { 194 updateStage(edu.umd.cs.findbugs.L10N.getLocalString("progress.scanning_archives", "Scanning archives...")); 195 updateCount(0, numArchives); 196 } 197 198 public void startAnalysis(int numClasses) 199 { 200 updateStage(edu.umd.cs.findbugs.L10N.getLocalString("progress.analyzing_classes", "Analyzing classes...")); 201 updateCount(0, numClasses); 202 } 203 204 private class AnalysisThread extends Thread  205 { 206 { 207 setPriority(NORM_PRIORITY - 1); 209 } 210 211 public void run() 212 { 213 assert project != null; 214 BugSet data = BugLoader.doAnalysis(project, AnalyzingDialog.this); 215 if (data == null) { 217 callback.analysisInterrupted(); 218 return; 219 } 220 analysisFinished = true; 221 AnalyzingDialog.this.dispose(); 222 callback.analysisFinished(data); 223 MainFrame.getInstance().newProject(); 224 } 225 } 226 227 230 public void predictPassCount(int[] classesPerPass) { 231 233 } 234 } | Popular Tags |