1 20 21 26 27 package edu.umd.cs.findbugs.gui; 28 29 import java.awt.BorderLayout ; 30 import java.awt.CardLayout ; 31 import java.awt.Color ; 32 import java.awt.Component ; 33 import java.awt.Cursor ; 34 import java.awt.Dimension ; 35 import java.awt.Event ; 36 import java.awt.Font ; 37 import java.awt.Graphics ; 38 import java.awt.HeadlessException ; 39 import java.awt.Point ; 40 import java.awt.Rectangle ; 41 import java.awt.Shape ; 42 import java.awt.Toolkit ; 43 import java.awt.datatransfer.Clipboard ; 44 import java.awt.datatransfer.DataFlavor ; 45 import java.awt.datatransfer.StringSelection ; 46 import java.awt.datatransfer.Transferable ; 47 import java.awt.event.ActionEvent ; 48 import java.awt.event.ActionListener ; 49 import java.awt.event.KeyEvent ; 50 import java.io.BufferedReader ; 51 import java.io.File ; 52 import java.io.IOException ; 53 import java.io.InputStream ; 54 import java.io.InputStreamReader ; 55 import java.io.Serializable ; 56 import java.io.StringReader ; 57 import java.lang.reflect.Method ; 58 import java.net.URL ; 59 import java.text.MessageFormat ; 60 import java.util.Arrays ; 61 import java.util.Collection ; 62 import java.util.Comparator ; 63 import java.util.HashSet ; 64 import java.util.Iterator ; 65 import java.util.List ; 66 import java.util.TreeSet ; 67 68 import javax.swing.AbstractButton ; 69 import javax.swing.ButtonGroup ; 70 import javax.swing.DefaultListModel ; 71 import javax.swing.ImageIcon ; 72 import javax.swing.JCheckBoxMenuItem ; 73 import javax.swing.JComponent ; 74 import javax.swing.JDialog ; 75 import javax.swing.JFileChooser ; 76 import javax.swing.JList ; 77 import javax.swing.JMenuItem ; 78 import javax.swing.JOptionPane ; 79 import javax.swing.JRadioButton ; 80 import javax.swing.JScrollPane ; 81 import javax.swing.JSplitPane ; 82 import javax.swing.JTextField ; 83 import javax.swing.JTree ; 84 import javax.swing.JViewport ; 85 import javax.swing.KeyStroke ; 86 import javax.swing.ListModel ; 87 import javax.swing.SwingUtilities ; 88 import javax.swing.UIManager ; 89 import javax.swing.event.TreeSelectionEvent ; 90 import javax.swing.event.TreeSelectionListener ; 91 import javax.swing.filechooser.FileFilter ; 92 import javax.swing.text.BadLocationException ; 93 import javax.swing.text.DefaultHighlighter ; 94 import javax.swing.text.Highlighter ; 95 import javax.swing.text.JTextComponent ; 96 import javax.swing.text.Position ; 97 import javax.swing.text.View ; 98 import javax.swing.tree.DefaultMutableTreeNode ; 99 import javax.swing.tree.DefaultTreeModel ; 100 import javax.swing.tree.TreePath ; 101 import javax.swing.tree.TreeSelectionModel ; 102 103 import org.dom4j.DocumentException; 104 105 import edu.umd.cs.findbugs.BugAnnotation; 106 import edu.umd.cs.findbugs.BugInstance; 107 import edu.umd.cs.findbugs.BugPattern; 108 import edu.umd.cs.findbugs.Detector; 109 import edu.umd.cs.findbugs.DetectorFactoryCollection; 110 import edu.umd.cs.findbugs.FindBugs; 111 import edu.umd.cs.findbugs.FindBugsCommandLine; 112 import edu.umd.cs.findbugs.I18N; 113 import edu.umd.cs.findbugs.L10N; 114 import edu.umd.cs.findbugs.MethodAnnotation; 115 import edu.umd.cs.findbugs.Project; 116 import edu.umd.cs.findbugs.ShowHelp; 117 import edu.umd.cs.findbugs.SourceLineAnnotation; 118 import edu.umd.cs.findbugs.SystemProperties; 119 import edu.umd.cs.findbugs.annotations.SuppressWarnings; 120 import edu.umd.cs.findbugs.ba.SourceFile; 121 import edu.umd.cs.findbugs.ba.SourceFinder; 122 import edu.umd.cs.findbugs.config.AnalysisFeatureSetting; 123 import edu.umd.cs.findbugs.config.ProjectFilterSettings; 124 import edu.umd.cs.findbugs.config.UserPreferences; 125 import edu.umd.cs.findbugs.config.CommandLine.HelpRequestedException; 126 127 132 public final class FindBugsFrame extends javax.swing.JFrame implements LogSync { 133 136 private static final int fontSize = 12; 137 140 private static final Font SOURCE_FONT = new java.awt.Font ("Monospaced", 0, fontSize); 141 private static final Font JTREE_FONT = new java.awt.Font ("SansSerif", 0, fontSize); 142 143 146 private static final Font LABEL_FONT = new java.awt.Font ("Dialog", 1, 2*fontSize); 147 148 151 private static final Font BUTTON_FONT = new java.awt.Font ("Dialog", 0, fontSize); 152 153 private static final long serialVersionUID = 1L; 154 155 158 static final Color HIGH_PRIORITY_COLOR = new Color (0xff0000); 159 static final Color NORMAL_PRIORITY_COLOR = new Color (0x9f0000); 160 static final Color LOW_PRIORITY_COLOR = Color.BLACK; 161 static final Color EXP_PRIORITY_COLOR = Color.BLACK; 162 163 168 private class BugTreeNode extends DefaultMutableTreeNode { 169 private static final long serialVersionUID = 1L; 170 private int count; 171 172 public BugTreeNode(BugInstance bugInstance) { 173 super(bugInstance); 174 count = -1; 175 } 176 177 public void setCount(int count) { 178 this.count = count; 179 } 180 181 @Override 182 public String toString() { 183 try { 184 BugInstance bugInstance = (BugInstance) getUserObject(); 185 StringBuffer result = new StringBuffer (); 186 187 if (count >= 0) { 188 result.append(count); 189 result.append(": "); 190 } 191 192 if (bugInstance.isExperimental()) 193 result.append(L10N.getLocalString("msg.exp_txt", "EXP: ")); 194 195 result.append(fullDescriptionsItem.isSelected() ? bugInstance.getMessage() : bugInstance.toString()); 196 197 return result.toString(); 198 } catch (Exception e) { 199 return MessageFormat.format(L10N.getLocalString("msg.errorformatting_txt", "Error formatting message for bug: "), new Object []{e.toString()}); 200 } 201 } 202 } 203 204 210 private static class BugInstanceClassComparator implements Comparator <BugInstance> { 211 public int compare(BugInstance lhs, BugInstance rhs) { 212 return lhs.getPrimaryClass().compareTo(rhs.getPrimaryClass()); 213 } 214 } 215 216 219 private static final Comparator <BugInstance> bugInstanceClassComparator = new BugInstanceClassComparator(); 220 221 227 private static class BugInstancePackageComparator implements Comparator <BugInstance>, Serializable { 228 private static final long serialVersionUID = 1L; 229 public int compare(BugInstance lhs, BugInstance rhs) { 230 return lhs.getPrimaryClass().getPackageName().compareTo(rhs.getPrimaryClass().getPackageName()); 231 } 232 } 233 234 237 private static final Comparator <BugInstance> bugInstancePackageComparator = new BugInstancePackageComparator(); 238 239 245 private static class BugInstanceTypeComparator implements Comparator <BugInstance>, Serializable { 246 private static final long serialVersionUID = 1L; 247 public int compare(BugInstance lhs, BugInstance rhs) { 248 String lhsString = lhs.toString(); 249 String rhsString = rhs.toString(); 250 return lhsString.substring(0, lhsString.indexOf(':')).compareTo(rhsString.substring(0, rhsString.indexOf(':'))); 251 } 252 } 253 254 257 private static final Comparator <BugInstance> bugInstanceTypeComparator = new BugInstanceTypeComparator(); 258 259 265 private static class BugInstanceCategoryComparator implements Comparator <BugInstance>, Serializable { 266 private static final long serialVersionUID = 1L; 267 268 public int compare(BugInstance lhs, BugInstance rhs) { 269 return getCategory(lhs).compareTo(getCategory(rhs)); 270 } 271 272 private String getCategory(BugInstance warning) { 273 BugPattern bugPattern = warning.getBugPattern(); 274 if (bugPattern == null) { 275 if (FindBugs.DEBUG) 276 System.out.println("Unknown bug pattern for bug type: " + warning.getType()); 277 return ""; 278 } else { 279 return bugPattern.getCategory(); 280 } 281 } 282 } 283 284 287 private static final Comparator <BugInstance> bugInstanceCategoryComparator = new BugInstanceCategoryComparator(); 288 289 293 private static class BugInstanceByClassComparator implements Comparator <BugInstance>, Serializable { 294 private static final long serialVersionUID = 1L; 295 public int compare(BugInstance a, BugInstance b) { 296 int cmp = bugInstanceClassComparator.compare(a, b); 297 if (cmp != 0) 298 return cmp; 299 return a.compareTo(b); 300 } 301 } 302 303 306 private static final Comparator <BugInstance> bugInstanceByClassComparator = new FindBugsFrame.BugInstanceByClassComparator(); 307 308 312 private static class BugInstanceByPackageComparator implements Comparator <BugInstance> { 313 public int compare(BugInstance a, BugInstance b) { 314 int cmp = bugInstancePackageComparator.compare(a, b); 315 if (cmp != 0) 316 return cmp; 317 return a.compareTo(b); 318 } 319 } 320 321 324 private static final Comparator <BugInstance> bugInstanceByPackageComparator = new FindBugsFrame.BugInstanceByPackageComparator(); 325 326 330 private static class BugInstanceByTypeComparator implements Comparator <BugInstance>, Serializable { 331 private static final long serialVersionUID = 1L; 332 public int compare(BugInstance a, BugInstance b) { 333 int cmp = bugInstanceTypeComparator.compare(a, b); 334 if (cmp != 0) 335 return cmp; 336 return a.compareTo(b); 337 } 338 } 339 340 343 private static final Comparator <BugInstance> bugInstanceByTypeComparator = new FindBugsFrame.BugInstanceByTypeComparator(); 344 345 349 private static class BugInstanceByCategoryComparator implements Comparator <BugInstance>, Serializable { 350 private static final long serialVersionUID = 1L; 351 public int compare(BugInstance a, BugInstance b) { 352 int cmp = bugInstanceCategoryComparator.compare(a, b); 353 if (cmp != 0) 354 return cmp; 355 return a.compareTo(b); 356 } 357 } 358 359 362 private static final Comparator <BugInstance> bugInstanceByCategoryComparator = new FindBugsFrame.BugInstanceByCategoryComparator(); 363 364 367 private static class ProjectFileFilter extends FileFilter { 368 @Override 369 public boolean accept(File file) { 370 return file.isDirectory() || file.getName().endsWith(".fb"); 371 } 372 373 @Override 374 public String getDescription() { 375 return L10N.getLocalString("dlg.findbugsprojects_lbl", "FindBugs projects (*.fb)"); 376 } 377 } 378 379 382 private static final FileFilter projectFileFilter = new ProjectFileFilter(); 383 384 388 private static class AuxClasspathEntryFileFilter extends FileFilter { 389 @Override 390 public boolean accept(File file) { 391 return file.isDirectory() || file.getName().endsWith(".jar"); 392 } 393 394 @Override 395 public String getDescription() { 396 return L10N.getLocalString("dlg.jarsanddirectories_lbl", "Jar files and directories"); 397 } 398 } 399 400 403 private static final FileFilter auxClasspathEntryFileFilter = new AuxClasspathEntryFileFilter(); 404 405 408 private static class XMLFileFilter extends FileFilter { 409 @Override 410 public boolean accept(File file) { 411 return file.isDirectory() || file.getName().endsWith(".xml"); 412 } 413 414 @Override 415 public String getDescription() { 416 return L10N.getLocalString("dlg.xmlsavedbugs_lbl", "XML saved bug files"); 417 } 418 } 419 420 423 private static final FileFilter xmlFileFilter = new XMLFileFilter(); 424 425 428 private static final HashSet <String > archiveExtensionSet = new HashSet <String >(); 429 430 static { 431 archiveExtensionSet.add(".jar"); 432 archiveExtensionSet.add(".zip"); 433 archiveExtensionSet.add(".ear"); 434 archiveExtensionSet.add(".war"); 435 } 436 437 440 private static class ArchiveAndDirectoryFilter extends FileFilter { 441 @Override 442 public boolean accept(File file) { 443 if (file.isDirectory()) 444 return true; 445 446 String fileName = file.getName(); 447 int dot = fileName.lastIndexOf('.'); 448 if (dot < 0) 449 return false; 450 String extension = fileName.substring(dot); 451 return archiveExtensionSet.contains(extension); 452 } 453 454 @Override 455 public String getDescription() { 456 return L10N.getLocalString("dlg.javaarchives_lbl", "Java archives (*.jar,*.zip,*.ear,*.war)"); 457 } 458 } 459 460 463 private static final FileFilter archiveAndDirectoryFilter = new ArchiveAndDirectoryFilter(); 464 465 468 469 static final String GROUP_BY_CLASS = "By class"; 470 static final String GROUP_BY_PACKAGE = "By package"; 471 static final String GROUP_BY_BUG_TYPE = "By bug type"; 472 static final String GROUP_BY_BUG_CATEGORY="By bug category"; 473 private static final String [] GROUP_BY_ORDER_LIST = { 474 GROUP_BY_CLASS, GROUP_BY_PACKAGE, GROUP_BY_BUG_TYPE, GROUP_BY_BUG_CATEGORY 475 }; 476 477 483 private static final int DIVIDER_FUDGE = 3; 484 485 private static final boolean BUG_COUNT = SystemProperties.getBoolean("findbugs.gui.bugCount"); 486 487 490 Component selectedComponent = null; 491 492 495 496 499 public FindBugsFrame() { 500 501 UserPreferences prefs = UserPreferences.getUserPreferences(); 502 prefs.read(); 503 504 String dirProp = SystemProperties.getProperty("user.dir"); 505 506 if (dirProp != null) { 507 currentDirectory = new File (dirProp); 508 } 509 510 initComponents(); 511 postInitComponents(); 512 } 513 514 517 518 524 private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; 526 527 priorityButtonGroup = new javax.swing.ButtonGroup (); 528 effortButtonGroup = new javax.swing.ButtonGroup (); 529 viewPanel = new javax.swing.JPanel (); 531 emptyPanel = new javax.swing.JPanel (); 532 reportPanel = new javax.swing.JPanel (); 533 editProjectPanel = new javax.swing.JPanel (); 534 jarFileLabel = new javax.swing.JLabel (); 535 jarNameTextField = new javax.swing.JTextField (); 536 addJarButton = new javax.swing.JButton (); 537 jarFileListLabel = new javax.swing.JLabel (); 538 sourceDirLabel = new javax.swing.JLabel (); 539 srcDirTextField = new javax.swing.JTextField (); 540 addSourceDirButton = new javax.swing.JButton (); 541 sourceDirListLabel = new javax.swing.JLabel (); 542 removeJarButton = new javax.swing.JButton (); 543 removeSrcDirButton = new javax.swing.JButton (); 544 jSeparator1 = new javax.swing.JSeparator (); 545 browseJarButton = new javax.swing.JButton (); 546 browseSrcDirButton = new javax.swing.JButton (); 547 editProjectLabel = new javax.swing.JLabel (); 548 jSeparator2 = new javax.swing.JSeparator (); 549 findBugsButton = new javax.swing.JButton (); 550 jSeparator4 = new javax.swing.JSeparator (); 551 jarFileListScrollPane = new javax.swing.JScrollPane (); 552 jarFileList = new javax.swing.JList (); 553 sourceDirListScrollPane = new javax.swing.JScrollPane (); 554 sourceDirList = new javax.swing.JList (); 555 classpathEntryLabel = new javax.swing.JLabel (); 556 classpathEntryListLabel = new javax.swing.JLabel (); 557 classpathEntryTextField = new javax.swing.JTextField (); 558 browseClasspathEntryButton = new javax.swing.JButton (); 559 addClasspathEntryButton = new javax.swing.JButton (); 560 removeClasspathEntryButton = new javax.swing.JButton (); 561 classpathEntryListScrollPane = new javax.swing.JScrollPane (); 562 classpathEntryList = new javax.swing.JList (); 563 jSeparator5 = new javax.swing.JSeparator (); 564 sourceUpButton = new javax.swing.JButton (); 565 sourceDownButton = new javax.swing.JButton (); 566 classpathUpButton = new javax.swing.JButton (); 567 classpathDownButton = new javax.swing.JButton (); 568 bugTreePanel = new javax.swing.JPanel (); 569 bugTreeBugDetailsSplitter = new javax.swing.JSplitPane (); 570 groupByTabbedPane = new javax.swing.JTabbedPane (); 571 byClassScrollPane = new javax.swing.JScrollPane (); 572 byClassBugTree = new javax.swing.JTree (); 573 byClassBugTree.setFont(JTREE_FONT); 574 byPackageScrollPane = new javax.swing.JScrollPane (); 575 byPackageBugTree = new javax.swing.JTree (); 576 byPackageBugTree.setFont(JTREE_FONT); 577 byBugTypeScrollPane = new javax.swing.JScrollPane (); 578 byBugTypeBugTree = new javax.swing.JTree (); 579 byBugTypeBugTree.setFont(JTREE_FONT); 580 byBugCategoryScrollPane = new javax.swing.JScrollPane (); 581 byBugCategoryBugTree = new javax.swing.JTree (); 582 byBugCategoryBugTree.setFont(JTREE_FONT); 583 bySummary = new javax.swing.JScrollPane (); 584 bugSummaryEditorPane = new javax.swing.JEditorPane (); 585 bugDetailsTabbedPane = new javax.swing.JTabbedPane (); 586 bugDescriptionScrollPane = new javax.swing.JScrollPane (); 587 bugDescriptionEditorPane = new javax.swing.JEditorPane (); 588 sourceTextAreaScrollPane = new javax.swing.JScrollPane (); 589 sourceTextArea = new javax.swing.JTextArea (); 590 annotationTextAreaScrollPane = new javax.swing.JScrollPane (); 591 annotationTextArea = new javax.swing.JTextArea (); 592 urlLabel = new javax.swing.JLabel (); 593 jPanel1 = new javax.swing.JPanel (); 594 logoLabel = new javax.swing.JLabel (); 595 growBoxSpacer = new javax.swing.JLabel (); 596 theMenuBar = new javax.swing.JMenuBar (); 597 fileMenu = new javax.swing.JMenu (); 598 newProjectItem = new javax.swing.JMenuItem (); 599 openProjectItem = new javax.swing.JMenuItem (); 600 recentProjectsMenu = new javax.swing.JMenu (); 601 jSeparator9 = new javax.swing.JSeparator (); 602 closeProjectItem = new javax.swing.JMenuItem (); 603 saveProjectItem = new javax.swing.JMenuItem (); 604 saveProjectAsItem = new javax.swing.JMenuItem (); 605 reloadProjectItem = new javax.swing.JMenuItem (); 606 jSeparator3 = new javax.swing.JSeparator (); 607 loadBugsItem = new javax.swing.JMenuItem (); 608 saveBugsItem = new javax.swing.JMenuItem (); 609 jSeparator6 = new javax.swing.JSeparator (); 610 exitItem = new javax.swing.JMenuItem (); 611 editMenu = new javax.swing.JMenu (); 612 cutItem = new javax.swing.JMenuItem (); 613 copyItem = new javax.swing.JMenuItem (); 614 pasteItem = new javax.swing.JMenuItem (); 615 jSeparator10 = new javax.swing.JSeparator (); 616 selectAllItem = new javax.swing.JMenuItem (); 617 viewMenu = new javax.swing.JMenu (); 618 viewBugDetailsItem = new javax.swing.JCheckBoxMenuItem (); 619 fullDescriptionsItem = new javax.swing.JCheckBoxMenuItem (); 620 jSeparator7 = new javax.swing.JSeparator (); 621 filterWarningsMenu = new javax.swing.JMenu (); 622 expPriorityButton = new javax.swing.JRadioButtonMenuItem (); 623 lowPriorityButton = new javax.swing.JRadioButtonMenuItem (); 624 mediumPriorityButton = new javax.swing.JRadioButtonMenuItem (); 625 highPriorityButton = new javax.swing.JRadioButtonMenuItem (); 626 jSeparator11 = new javax.swing.JSeparator (); 627 jSeparator8 = new javax.swing.JSeparator (); 628 viewProjectItem = new javax.swing.JRadioButtonMenuItem (); 629 viewBugsItem = new javax.swing.JRadioButtonMenuItem (); 630 settingsMenu = new javax.swing.JMenu (); 631 configureDetectorsItem = new javax.swing.JMenuItem (); 632 effortMenu = new javax.swing.JMenu (); 633 minEffortItem = new javax.swing.JCheckBoxMenuItem (); 634 normalEffortItem = new javax.swing.JCheckBoxMenuItem (); 635 maxEffortItem = new javax.swing.JCheckBoxMenuItem (); 636 helpMenu = new javax.swing.JMenu (); 637 aboutItem = new javax.swing.JMenuItem (); 638 639 getContentPane().setLayout(new java.awt.GridBagLayout ()); 640 641 addWindowListener(new java.awt.event.WindowAdapter () { 642 @Override 643 public void windowClosing(java.awt.event.WindowEvent evt) { 644 exitForm(evt); 645 } 646 @Override 647 public void windowOpened(java.awt.event.WindowEvent evt) { 648 formWindowOpened(evt); 649 } 650 }); 651 652 viewPanel.setLayout(new java.awt.CardLayout ()); 653 654 viewPanel.add(emptyPanel, "EmptyPanel"); 655 656 viewPanel.add(reportPanel, "ReportPanel"); 657 658 editProjectPanel.setLayout(new java.awt.GridBagLayout ()); 659 660 jarFileLabel.setFont(BUTTON_FONT); 661 jarFileLabel.setText("Archive or directory:"); 662 jarFileLabel.setText(L10N.getLocalString("dlg.jarfile_lbl", "Archive or Directory:")); 663 gridBagConstraints = new java.awt.GridBagConstraints (); 664 gridBagConstraints.gridx = 0; 665 gridBagConstraints.gridy = 2; 666 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; 667 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 668 editProjectPanel.add(jarFileLabel, gridBagConstraints); 669 670 jarNameTextField.addActionListener(new java.awt.event.ActionListener () { 671 public void actionPerformed(java.awt.event.ActionEvent evt) { 672 jarNameTextFieldActionPerformed(evt); 673 } 674 }); 675 jarNameTextField.addFocusListener(new java.awt.event.FocusAdapter () { 676 @Override 677 public void focusGained(java.awt.event.FocusEvent evt) { 678 focusGainedHandler(evt); 679 } 680 }); 681 682 gridBagConstraints = new java.awt.GridBagConstraints (); 683 gridBagConstraints.gridx = 1; 684 gridBagConstraints.gridy = 2; 685 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 686 gridBagConstraints.weightx = 1.0; 687 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 0); 688 editProjectPanel.add(jarNameTextField, gridBagConstraints); 689 690 addJarButton.setFont(BUTTON_FONT); 691 addJarButton.setText("Add"); 692 addJarButton.setMaximumSize(new java.awt.Dimension (90, 25)); 693 addJarButton.setMinimumSize(new java.awt.Dimension (90, 25)); 694 addJarButton.setPreferredSize(new java.awt.Dimension (90, 25)); 695 addJarButton.setText(L10N.getLocalString("dlg.add_btn", "Add")); 696 addJarButton.addActionListener(new java.awt.event.ActionListener () { 697 public void actionPerformed(java.awt.event.ActionEvent evt) { 698 addJarButtonActionPerformed(evt); 699 } 700 }); 701 702 gridBagConstraints = new java.awt.GridBagConstraints (); 703 gridBagConstraints.gridx = 3; 704 gridBagConstraints.gridy = 2; 705 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 706 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 707 editProjectPanel.add(addJarButton, gridBagConstraints); 708 709 jarFileListLabel.setFont(BUTTON_FONT); 710 jarFileListLabel.setText("Archives/directories:"); 711 jarFileListLabel.setText(L10N.getLocalString("dlg.jarlist_lbl", "Archives/Directories:")); 712 gridBagConstraints = new java.awt.GridBagConstraints (); 713 gridBagConstraints.gridx = 0; 714 gridBagConstraints.gridy = 3; 715 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; 716 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 717 editProjectPanel.add(jarFileListLabel, gridBagConstraints); 718 719 sourceDirLabel.setFont(BUTTON_FONT); 720 sourceDirLabel.setText("Source directory:"); 721 sourceDirLabel.setText(L10N.getLocalString("dlg.srcfile_lbl", "Source directory:")); 722 gridBagConstraints = new java.awt.GridBagConstraints (); 723 gridBagConstraints.gridx = 0; 724 gridBagConstraints.gridy = 8; 725 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; 726 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 727 editProjectPanel.add(sourceDirLabel, gridBagConstraints); 728 729 srcDirTextField.addActionListener(new java.awt.event.ActionListener () { 730 public void actionPerformed(java.awt.event.ActionEvent evt) { 731 srcDirTextFieldActionPerformed(evt); 732 } 733 }); 734 srcDirTextField.addFocusListener(new java.awt.event.FocusAdapter () { 735 @Override 736 public void focusGained(java.awt.event.FocusEvent evt) { 737 focusGainedHandler(evt); 738 } 739 }); 740 741 gridBagConstraints = new java.awt.GridBagConstraints (); 742 gridBagConstraints.gridx = 1; 743 gridBagConstraints.gridy = 8; 744 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 745 gridBagConstraints.weightx = 1.0; 746 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 0); 747 editProjectPanel.add(srcDirTextField, gridBagConstraints); 748 749 addSourceDirButton.setFont(BUTTON_FONT); 750 addSourceDirButton.setText("Add"); 751 addSourceDirButton.setMaximumSize(new java.awt.Dimension (90, 25)); 752 addSourceDirButton.setMinimumSize(new java.awt.Dimension (90, 25)); 753 addSourceDirButton.setPreferredSize(new java.awt.Dimension (90, 25)); 754 addSourceDirButton.setText(L10N.getLocalString("dlg.add_btn", "Add")); 755 addSourceDirButton.addActionListener(new java.awt.event.ActionListener () { 756 public void actionPerformed(java.awt.event.ActionEvent evt) { 757 addSourceDirButtonActionPerformed(evt); 758 } 759 }); 760 761 gridBagConstraints = new java.awt.GridBagConstraints (); 762 gridBagConstraints.gridx = 3; 763 gridBagConstraints.gridy = 8; 764 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 765 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 766 editProjectPanel.add(addSourceDirButton, gridBagConstraints); 767 768 sourceDirListLabel.setFont(BUTTON_FONT); 769 sourceDirListLabel.setText("Source directories:"); 770 sourceDirListLabel.setText(L10N.getLocalString("dlg.srclist_lbl", "Source directories:")); 771 gridBagConstraints = new java.awt.GridBagConstraints (); 772 gridBagConstraints.gridx = 0; 773 gridBagConstraints.gridy = 9; 774 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; 775 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 776 editProjectPanel.add(sourceDirListLabel, gridBagConstraints); 777 778 removeJarButton.setFont(BUTTON_FONT); 779 removeJarButton.setText("Remove"); 780 removeJarButton.setMaximumSize(new java.awt.Dimension (90, 25)); 781 removeJarButton.setMinimumSize(new java.awt.Dimension (90, 25)); 782 removeJarButton.setPreferredSize(new java.awt.Dimension (90, 25)); 783 removeJarButton.setText(L10N.getLocalString("dlg.remove_btn", "Remove")); 784 removeJarButton.addActionListener(new java.awt.event.ActionListener () { 785 public void actionPerformed(java.awt.event.ActionEvent evt) { 786 removeJarButtonActionPerformed(evt); 787 } 788 }); 789 790 gridBagConstraints = new java.awt.GridBagConstraints (); 791 gridBagConstraints.gridx = 3; 792 gridBagConstraints.gridy = 3; 793 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 794 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 795 editProjectPanel.add(removeJarButton, gridBagConstraints); 796 797 removeSrcDirButton.setFont(BUTTON_FONT); 798 removeSrcDirButton.setText("Remove"); 799 removeSrcDirButton.setMaximumSize(new java.awt.Dimension (90, 25)); 800 removeSrcDirButton.setMinimumSize(new java.awt.Dimension (90, 25)); 801 removeSrcDirButton.setPreferredSize(new java.awt.Dimension (90, 25)); 802 removeSrcDirButton.setText(L10N.getLocalString("dlg.remove_btn", "Remove")); 803 removeSrcDirButton.addActionListener(new java.awt.event.ActionListener () { 804 public void actionPerformed(java.awt.event.ActionEvent evt) { 805 removeSrcDirButtonActionPerformed(evt); 806 } 807 }); 808 809 gridBagConstraints = new java.awt.GridBagConstraints (); 810 gridBagConstraints.gridx = 3; 811 gridBagConstraints.gridy = 9; 812 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 813 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 814 editProjectPanel.add(removeSrcDirButton, gridBagConstraints); 815 816 gridBagConstraints = new java.awt.GridBagConstraints (); 817 gridBagConstraints.gridx = 0; 818 gridBagConstraints.gridy = 1; 819 gridBagConstraints.gridwidth = 4; 820 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 821 gridBagConstraints.insets = new java.awt.Insets (3, 3, 3, 3); 822 editProjectPanel.add(jSeparator1, gridBagConstraints); 823 824 browseJarButton.setFont(BUTTON_FONT); 825 browseJarButton.setText("Browse"); 826 browseJarButton.setMaximumSize(new java.awt.Dimension (90, 25)); 827 browseJarButton.setMinimumSize(new java.awt.Dimension (90, 25)); 828 browseJarButton.setPreferredSize(new java.awt.Dimension (90, 25)); 829 browseJarButton.setText(L10N.getLocalString("dlg.browse_btn", "Browse...")); 830 browseJarButton.addActionListener(new java.awt.event.ActionListener () { 831 public void actionPerformed(java.awt.event.ActionEvent evt) { 832 browseJarButtonActionPerformed(evt); 833 } 834 }); 835 836 gridBagConstraints = new java.awt.GridBagConstraints (); 837 gridBagConstraints.gridx = 2; 838 gridBagConstraints.gridy = 2; 839 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 840 editProjectPanel.add(browseJarButton, gridBagConstraints); 841 842 browseSrcDirButton.setFont(BUTTON_FONT); 843 browseSrcDirButton.setText("Browse"); 844 browseSrcDirButton.setMaximumSize(new java.awt.Dimension (90, 25)); 845 browseSrcDirButton.setMinimumSize(new java.awt.Dimension (90, 25)); 846 browseSrcDirButton.setPreferredSize(new java.awt.Dimension (90, 25)); 847 browseSrcDirButton.setText(L10N.getLocalString("dlg.browse_btn", "Browse...")); 848 browseSrcDirButton.addActionListener(new java.awt.event.ActionListener () { 849 public void actionPerformed(java.awt.event.ActionEvent evt) { 850 browseSrcDirButtonActionPerformed(evt); 851 } 852 }); 853 854 gridBagConstraints = new java.awt.GridBagConstraints (); 855 gridBagConstraints.gridx = 2; 856 gridBagConstraints.gridy = 8; 857 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 858 editProjectPanel.add(browseSrcDirButton, gridBagConstraints); 859 860 editProjectLabel.setBackground(new java.awt.Color (0, 0, 204)); 861 editProjectLabel.setFont(LABEL_FONT); 862 editProjectLabel.setForeground(new java.awt.Color (255, 255, 255)); 863 editProjectLabel.setText("Project"); 864 editProjectLabel.setOpaque(true); 865 editProjectLabel.setText(L10N.getLocalString("dlg.project_lbl", "Project")); 866 gridBagConstraints = new java.awt.GridBagConstraints (); 867 gridBagConstraints.gridx = 0; 868 gridBagConstraints.gridy = 0; 869 gridBagConstraints.gridwidth = 4; 870 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 871 editProjectPanel.add(editProjectLabel, gridBagConstraints); 872 873 gridBagConstraints = new java.awt.GridBagConstraints (); 874 gridBagConstraints.gridx = 0; 875 gridBagConstraints.gridy = 7; 876 gridBagConstraints.gridwidth = 4; 877 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 878 gridBagConstraints.insets = new java.awt.Insets (3, 3, 3, 3); 879 editProjectPanel.add(jSeparator2, gridBagConstraints); 880 881 findBugsButton.setMnemonic('B'); 882 findBugsButton.setText("Find Bugs!"); 883 findBugsButton.addActionListener(new java.awt.event.ActionListener () { 884 public void actionPerformed(java.awt.event.ActionEvent evt) { 885 findBugsButtonActionPerformed(evt); 886 } 887 }); 888 889 gridBagConstraints = new java.awt.GridBagConstraints (); 890 gridBagConstraints.gridx = 0; 891 gridBagConstraints.gridy = 21; 892 gridBagConstraints.gridwidth = 4; 893 gridBagConstraints.insets = new java.awt.Insets (3, 3, 3, 3); 894 editProjectPanel.add(findBugsButton, gridBagConstraints); 895 896 gridBagConstraints = new java.awt.GridBagConstraints (); 897 gridBagConstraints.gridx = 0; 898 gridBagConstraints.gridy = 14; 899 gridBagConstraints.gridwidth = 4; 900 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 901 gridBagConstraints.insets = new java.awt.Insets (3, 3, 3, 3); 902 editProjectPanel.add(jSeparator4, gridBagConstraints); 903 904 jarFileListScrollPane.setPreferredSize(new java.awt.Dimension (259, 1)); 905 jarFileList.setBorder(new javax.swing.border.BevelBorder (javax.swing.border.BevelBorder.LOWERED)); 906 jarFileList.setFont(BUTTON_FONT); 907 disableEditKeyBindings(jarFileList); 908 909 jarFileList.addFocusListener(new java.awt.event.FocusAdapter () { 910 @Override 911 public void focusGained(java.awt.event.FocusEvent evt) { 912 focusGainedHandler(evt); 913 } 914 }); 915 916 jarFileListScrollPane.setViewportView(jarFileList); 917 918 gridBagConstraints = new java.awt.GridBagConstraints (); 919 gridBagConstraints.gridx = 1; 920 gridBagConstraints.gridy = 3; 921 gridBagConstraints.gridwidth = 2; 922 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 923 gridBagConstraints.weighty = 0.4; 924 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 925 editProjectPanel.add(jarFileListScrollPane, gridBagConstraints); 926 927 sourceDirListScrollPane.setPreferredSize(new java.awt.Dimension (259, 1)); 928 sourceDirList.setBorder(new javax.swing.border.BevelBorder (javax.swing.border.BevelBorder.LOWERED)); 929 sourceDirList.setFont(BUTTON_FONT); 930 disableEditKeyBindings(sourceDirList); 931 sourceDirList.addFocusListener(new java.awt.event.FocusAdapter () { 932 @Override 933 public void focusGained(java.awt.event.FocusEvent evt) { 934 focusGainedHandler(evt); 935 } 936 }); 937 938 sourceDirListScrollPane.setViewportView(sourceDirList); 939 940 gridBagConstraints = new java.awt.GridBagConstraints (); 941 gridBagConstraints.gridx = 1; 942 gridBagConstraints.gridy = 9; 943 gridBagConstraints.gridwidth = 2; 944 gridBagConstraints.gridheight = 3; 945 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 946 gridBagConstraints.weighty = 0.1; 947 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 948 editProjectPanel.add(sourceDirListScrollPane, gridBagConstraints); 949 950 classpathEntryLabel.setFont(BUTTON_FONT); 951 classpathEntryLabel.setText("Classpath entry:"); 952 classpathEntryLabel.setText(L10N.getLocalString("dlg.classpathfile_lbl", "Classpath entry:")); 953 gridBagConstraints = new java.awt.GridBagConstraints (); 954 gridBagConstraints.gridx = 0; 955 gridBagConstraints.gridy = 15; 956 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; 957 gridBagConstraints.insets = new java.awt.Insets (0, 0, 0, 3); 958 editProjectPanel.add(classpathEntryLabel, gridBagConstraints); 959 960 classpathEntryListLabel.setFont(BUTTON_FONT); 961 classpathEntryListLabel.setText("Classpath entries:"); 962 classpathEntryListLabel.setText(L10N.getLocalString("dlg.classpathlist_lbl", "Classpath entries:")); 963 gridBagConstraints = new java.awt.GridBagConstraints (); 964 gridBagConstraints.gridx = 0; 965 gridBagConstraints.gridy = 16; 966 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; 967 gridBagConstraints.insets = new java.awt.Insets (0, 0, 0, 3); 968 editProjectPanel.add(classpathEntryListLabel, gridBagConstraints); 969 970 classpathEntryTextField.addFocusListener(new java.awt.event.FocusAdapter () { 971 @Override 972 public void focusGained(java.awt.event.FocusEvent evt) { 973 focusGainedHandler(evt); 974 } 975 }); 976 977 gridBagConstraints = new java.awt.GridBagConstraints (); 978 gridBagConstraints.gridx = 1; 979 gridBagConstraints.gridy = 15; 980 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 981 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 0); 982 editProjectPanel.add(classpathEntryTextField, gridBagConstraints); 983 984 browseClasspathEntryButton.setFont(BUTTON_FONT); 985 browseClasspathEntryButton.setText("Browse"); 986 browseClasspathEntryButton.setMaximumSize(new java.awt.Dimension (90, 25)); 987 browseClasspathEntryButton.setMinimumSize(new java.awt.Dimension (90, 25)); 988 browseClasspathEntryButton.setPreferredSize(new java.awt.Dimension (90, 25)); 989 browseClasspathEntryButton.setText(L10N.getLocalString("dlg.browse_btn", "Browse...")); 990 browseClasspathEntryButton.addActionListener(new java.awt.event.ActionListener () { 991 public void actionPerformed(java.awt.event.ActionEvent evt) { 992 browseClasspathEntryButtonActionPerformed(evt); 993 } 994 }); 995 996 gridBagConstraints = new java.awt.GridBagConstraints (); 997 gridBagConstraints.gridx = 2; 998 gridBagConstraints.gridy = 15; 999 editProjectPanel.add(browseClasspathEntryButton, gridBagConstraints); 1000 1001 addClasspathEntryButton.setFont(BUTTON_FONT); 1002 addClasspathEntryButton.setText("Add"); 1003 addClasspathEntryButton.setMaximumSize(new java.awt.Dimension (90, 25)); 1004 addClasspathEntryButton.setMinimumSize(new java.awt.Dimension (90, 25)); 1005 addClasspathEntryButton.setPreferredSize(new java.awt.Dimension (90, 25)); 1006 addClasspathEntryButton.setText(L10N.getLocalString("dlg.add_btn", "Add")); 1007 addClasspathEntryButton.addActionListener(new java.awt.event.ActionListener () { 1008 public void actionPerformed(java.awt.event.ActionEvent evt) { 1009 addClasspathEntryButtonActionPerformed(evt); 1010 } 1011 }); 1012 1013 gridBagConstraints = new java.awt.GridBagConstraints (); 1014 gridBagConstraints.gridx = 3; 1015 gridBagConstraints.gridy = 15; 1016 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 1017 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 0); 1018 editProjectPanel.add(addClasspathEntryButton, gridBagConstraints); 1019 1020 removeClasspathEntryButton.setFont(BUTTON_FONT); 1021 removeClasspathEntryButton.setText("Remove"); 1022 removeClasspathEntryButton.setMaximumSize(new java.awt.Dimension (90, 25)); 1023 removeClasspathEntryButton.setMinimumSize(new java.awt.Dimension (90, 25)); 1024 removeClasspathEntryButton.setPreferredSize(new java.awt.Dimension (90, 25)); 1025 removeClasspathEntryButton.setText(L10N.getLocalString("dlg.remove_btn", "Remove")); 1026 removeClasspathEntryButton.addActionListener(new java.awt.event.ActionListener () { 1027 public void actionPerformed(java.awt.event.ActionEvent evt) { 1028 removeClasspathEntryButtonActionPerformed(evt); 1029 } 1030 }); 1031 1032 gridBagConstraints = new java.awt.GridBagConstraints (); 1033 gridBagConstraints.gridx = 3; 1034 gridBagConstraints.gridy = 16; 1035 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 1036 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 0); 1037 editProjectPanel.add(removeClasspathEntryButton, gridBagConstraints); 1038 1039 classpathEntryListScrollPane.setPreferredSize(new java.awt.Dimension (259, 1)); 1040 classpathEntryList.setBorder(new javax.swing.border.BevelBorder (javax.swing.border.BevelBorder.LOWERED)); 1041 classpathEntryList.setFont(BUTTON_FONT); 1042 disableEditKeyBindings(classpathEntryList); 1043 classpathEntryList.addFocusListener(new java.awt.event.FocusAdapter () { 1044 @Override 1045 public void focusGained(java.awt.event.FocusEvent evt) { 1046 focusGainedHandler(evt); 1047 } 1048 }); 1049 1050 classpathEntryListScrollPane.setViewportView(classpathEntryList); 1051 1052 gridBagConstraints = new java.awt.GridBagConstraints (); 1053 gridBagConstraints.gridx = 1; 1054 gridBagConstraints.gridy = 16; 1055 gridBagConstraints.gridwidth = 2; 1056 gridBagConstraints.gridheight = 3; 1057 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 1058 gridBagConstraints.weighty = 0.1; 1059 gridBagConstraints.insets = new java.awt.Insets (0, 3, 0, 3); 1060 editProjectPanel.add(classpathEntryListScrollPane, gridBagConstraints); 1061 1062 gridBagConstraints = new java.awt.GridBagConstraints (); 1063 gridBagConstraints.gridx = 0; 1064 gridBagConstraints.gridy = 20; 1065 gridBagConstraints.gridwidth = 4; 1066 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 1067 gridBagConstraints.insets = new java.awt.Insets (3, 0, 3, 0); 1068 editProjectPanel.add(jSeparator5, gridBagConstraints); 1069 1070 sourceUpButton.setFont(BUTTON_FONT); 1071 sourceUpButton.setText("Up"); 1072 sourceUpButton.setMaximumSize(new java.awt.Dimension (90, 25)); 1073 sourceUpButton.setMinimumSize(new java.awt.Dimension (90, 25)); 1074 sourceUpButton.setPreferredSize(new java.awt.Dimension (90, 25)); 1075 sourceUpButton.setText(L10N.getLocalString("dlg.up_btn", "Up")); 1076 sourceUpButton.addActionListener(new java.awt.event.ActionListener () { 1077 public void actionPerformed(java.awt.event.ActionEvent evt) { 1078 sourceUpButtonActionPerformed(evt); 1079 } 1080 }); 1081 1082 gridBagConstraints = new java.awt.GridBagConstraints (); 1083 gridBagConstraints.gridx = 3; 1084 gridBagConstraints.gridy = 10; 1085 gridBagConstraints.weighty = 0.2; 1086 editProjectPanel.add(sourceUpButton, gridBagConstraints); 1087 1088 sourceDownButton.setFont(BUTTON_FONT); 1089 sourceDownButton.setText("Down"); 1090 sourceDownButton.setMaximumSize(new java.awt.Dimension (90, 25)); 1091 sourceDownButton.setMinimumSize(new java.awt.Dimension (90, 25)); 1092 sourceDownButton.setPreferredSize(new java.awt.Dimension (90, 25)); 1093 sourceDownButton.setText(L10N.getLocalString("dlg.down_btn", "Down")); 1094 sourceDownButton.addActionListener(new java.awt.event.ActionListener () { 1095 public void actionPerformed(java.awt.event.ActionEvent evt) { 1096 sourceDownButtonActionPerformed(evt); 1097 } 1098 }); 1099 1100 gridBagConstraints = new java.awt.GridBagConstraints (); 1101 gridBagConstraints.gridy = 11; 1102 editProjectPanel.add(sourceDownButton, gridBagConstraints); 1103 1104 classpathUpButton.setFont(BUTTON_FONT); 1105 classpathUpButton.setText("Up"); 1106 classpathUpButton.setMaximumSize(new java.awt.Dimension (90, 25)); 1107 classpathUpButton.setMinimumSize(new java.awt.Dimension (90, 25)); 1108 classpathUpButton.setPreferredSize(new java.awt.Dimension (90, 25)); 1109 classpathUpButton.setText(L10N.getLocalString("dlg.up_btn", "Up")); 1110 classpathUpButton.addActionListener(new java.awt.event.ActionListener () { 1111 public void actionPerformed(java.awt.event.ActionEvent evt) { 1112 classpathUpButtonActionPerformed(evt); 1113 } 1114 }); 1115 1116 gridBagConstraints = new java.awt.GridBagConstraints (); 1117 gridBagConstraints.gridx = 3; 1118 gridBagConstraints.gridy = 17; 1119 gridBagConstraints.weighty = 0.2; 1120 editProjectPanel.add(classpathUpButton, gridBagConstraints); 1121 1122 classpathDownButton.setFont(BUTTON_FONT); 1123 classpathDownButton.setText("Down"); 1124 classpathDownButton.setMaximumSize(new java.awt.Dimension (90, 25)); 1125 classpathDownButton.setMinimumSize(new java.awt.Dimension (90, 25)); 1126 classpathDownButton.setPreferredSize(new java.awt.Dimension (90, 25)); 1127 classpathDownButton.setText(L10N.getLocalString("dlg.down_btn", "Down")); 1128 classpathDownButton.addActionListener(new java.awt.event.ActionListener () { 1129 public void actionPerformed(java.awt.event.ActionEvent evt) { 1130 classpathDownButtonActionPerformed(evt); 1131 } 1132 }); 1133 1134 gridBagConstraints = new java.awt.GridBagConstraints (); 1135 gridBagConstraints.gridx = 3; 1136 gridBagConstraints.gridy = 18; 1137 editProjectPanel.add(classpathDownButton, gridBagConstraints); 1138 1139 viewPanel.add(editProjectPanel, "EditProjectPanel"); 1140 1141 bugTreePanel.setLayout(new java.awt.GridBagLayout ()); 1142 1143 bugTreeBugDetailsSplitter.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); 1144 bugTreeBugDetailsSplitter.setResizeWeight(1.0); 1145 bugTreeBugDetailsSplitter.setOneTouchExpandable(true); 1146 bugTreeBugDetailsSplitter.addPropertyChangeListener(new java.beans.PropertyChangeListener () { 1147 public void propertyChange(java.beans.PropertyChangeEvent evt) { 1148 bugTreeBugDetailsSplitterPropertyChange(evt); 1149 } 1150 }); 1151 1152 byClassBugTree.addFocusListener(new java.awt.event.FocusAdapter () { 1153 @Override 1154 public void focusGained(java.awt.event.FocusEvent evt) { 1155 focusGainedHandler(evt); 1156 } 1157 }); 1158 1159 byClassScrollPane.setViewportView(byClassBugTree); 1160 1161 groupByTabbedPane.addTab("By Class", byClassScrollPane); 1162 1163 byPackageBugTree.addFocusListener(new java.awt.event.FocusAdapter () { 1164 @Override 1165 public void focusGained(java.awt.event.FocusEvent evt) { 1166 focusGainedHandler(evt); 1167 } 1168 }); 1169 1170 byPackageScrollPane.setViewportView(byPackageBugTree); 1171 1172 groupByTabbedPane.addTab("By Package", byPackageScrollPane); 1173 1174 byBugTypeBugTree.addFocusListener(new java.awt.event.FocusAdapter () { 1175 @Override 1176 public void focusGained(java.awt.event.FocusEvent evt) { 1177 focusGainedHandler(evt); 1178 } 1179 }); 1180 1181 byBugTypeScrollPane.setViewportView(byBugTypeBugTree); 1182 1183 groupByTabbedPane.addTab("By Bug Type", byBugTypeScrollPane); 1184 1185 byBugCategoryBugTree.addFocusListener(new java.awt.event.FocusAdapter () { 1186 @Override 1187 public void focusGained(java.awt.event.FocusEvent evt) { 1188 focusGainedHandler(evt); 1189 } 1190 }); 1191 1192 byBugCategoryScrollPane.setViewportView(byBugCategoryBugTree); 1193 1194 groupByTabbedPane.addTab("By Category Type", byBugCategoryScrollPane); 1195 1196 bugSummaryEditorPane.addFocusListener(new java.awt.event.FocusAdapter () { 1197 @Override 1198 public void focusGained(java.awt.event.FocusEvent evt) { 1199 focusGainedHandler(evt); 1200 } 1201 }); 1202 1203 bySummary.setViewportView(bugSummaryEditorPane); 1204 1205 groupByTabbedPane.addTab("Summary", bySummary); 1206 1207 bugTreeBugDetailsSplitter.setTopComponent(groupByTabbedPane); 1208 1209 bugDescriptionEditorPane.setEditable(false); 1210 bugDescriptionEditorPane.addFocusListener(new java.awt.event.FocusAdapter () { 1211 @Override 1212 public void focusGained(java.awt.event.FocusEvent evt) { 1213 focusGainedHandler(evt); 1214 } 1215 }); 1216 1217 bugDescriptionScrollPane.setViewportView(bugDescriptionEditorPane); 1218 1219 bugDetailsTabbedPane.addTab("Details", bugDescriptionScrollPane); 1220 1221 sourceTextAreaScrollPane.setMinimumSize(new java.awt.Dimension (22, 180)); 1222 sourceTextAreaScrollPane.setPreferredSize(new java.awt.Dimension (0, 100)); 1223 sourceTextArea.setEditable(false); 1224 sourceTextArea.setFont(SOURCE_FONT); 1225 sourceTextArea.setEnabled(false); 1226 sourceTextArea.addFocusListener(new java.awt.event.FocusAdapter () { 1227 @Override 1228 public void focusGained(java.awt.event.FocusEvent evt) { 1229 focusGainedHandler(evt); 1230 } 1231 }); 1232 1233 1234 sourceTextAreaScrollPane.setViewportView(sourceTextArea); 1235 sourceLineNumberer = new LineNumberer(sourceTextArea); 1236 sourceLineNumberer.setBackground(Color.WHITE); 1237 sourceTextAreaScrollPane.setRowHeaderView(sourceLineNumberer); 1238 1239 bugDetailsTabbedPane.addTab("Source code", sourceTextAreaScrollPane); 1240 1241 annotationTextArea.addFocusListener(new java.awt.event.FocusAdapter () { 1242 @Override 1243 public void focusGained(java.awt.event.FocusEvent evt) { 1244 focusGainedHandler(evt); 1245 } 1246 }); 1247 1248 annotationTextAreaScrollPane.setViewportView(annotationTextArea); 1249 1250 bugDetailsTabbedPane.addTab("Annotations", annotationTextAreaScrollPane); 1251 1252 bugTreeBugDetailsSplitter.setBottomComponent(bugDetailsTabbedPane); 1253 1254 gridBagConstraints = new java.awt.GridBagConstraints (); 1255 gridBagConstraints.gridx = 0; 1256 gridBagConstraints.gridy = 1; 1257 gridBagConstraints.gridwidth = 2; 1258 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 1259 gridBagConstraints.weightx = 1.0; 1260 gridBagConstraints.weighty = 1.0; 1261 bugTreePanel.add(bugTreeBugDetailsSplitter, gridBagConstraints); 1262 1263 viewPanel.add(bugTreePanel, "BugTree"); 1264 1265 { 1266 equalizeControls( new JComponent [] 1267 { 1268 addJarButton, 1269 addSourceDirButton, 1270 addClasspathEntryButton, 1271 removeJarButton, 1272 removeSrcDirButton, 1273 removeClasspathEntryButton, 1274 browseJarButton, 1275 browseSrcDirButton, 1276 browseClasspathEntryButton, 1277 sourceUpButton, 1278 sourceDownButton, 1279 classpathUpButton, 1280 classpathDownButton 1281 }); 1282 1283 groupByTabbedPane.setTitleAt(0, L10N.getLocalString( "dlg.byclass_tab", "By Class")); 1284 groupByTabbedPane.setTitleAt(1, L10N.getLocalString( "dlg.bypackage_tab", "By Package")); 1285 groupByTabbedPane.setTitleAt(2, L10N.getLocalString( "dlg.bybugtype_tab", "By Bug Type")); 1286 groupByTabbedPane.setTitleAt(3, L10N.getLocalString( "dlg.bybugcategory_tab", "By Bug Category")); 1287 groupByTabbedPane.setTitleAt(4, L10N.getLocalString( "dlg.summary_tab", "Summary")); 1288 bugDetailsTabbedPane.setTitleAt(0, L10N.getLocalString( "dlg.details_tab", "Details")); 1289 bugDetailsTabbedPane.setTitleAt(1, L10N.getLocalString( "dlg.sourcecode_tab", "Source Code")); 1290 bugDetailsTabbedPane.setTitleAt(2, L10N.getLocalString( "dlg.annotations_tab", "Annotations")); 1291 } 1292 1293 gridBagConstraints = new java.awt.GridBagConstraints (); 1294 gridBagConstraints.gridx = 0; 1295 gridBagConstraints.gridy = 0; 1296 gridBagConstraints.gridwidth = 2; 1297 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 1298 gridBagConstraints.weightx = 1.0; 1299 gridBagConstraints.weighty = 1.0; 1300 getContentPane().add(viewPanel, gridBagConstraints); 1301 1302 urlLabel.setFont(BUTTON_FONT); 1303 urlLabel.setText("FindBugs - http://findbugs.sourceforge.net/"); 1304 gridBagConstraints = new java.awt.GridBagConstraints (); 1305 gridBagConstraints.gridx = 0; 1306 gridBagConstraints.gridy = 1; 1307 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 1308 gridBagConstraints.insets = new java.awt.Insets (2, 2, 2, 0); 1309 getContentPane().add(urlLabel, gridBagConstraints); 1310 1311 jPanel1.setLayout(new javax.swing.BoxLayout (jPanel1, javax.swing.BoxLayout.X_AXIS)); 1312 1313 jPanel1.add(logoLabel); 1314 1315 growBoxSpacer.setMaximumSize(new java.awt.Dimension (16, 16)); 1316 jPanel1.add(growBoxSpacer); 1317 1318 gridBagConstraints = new java.awt.GridBagConstraints (); 1319 gridBagConstraints.gridx = 1; 1320 gridBagConstraints.gridy = 1; 1321 gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST; 1322 gridBagConstraints.insets = new java.awt.Insets (2, 0, 2, 2); 1323 getContentPane().add(jPanel1, gridBagConstraints); 1324 1325 theMenuBar.setFont(BUTTON_FONT); 1326 fileMenu.setText("File"); 1327 fileMenu.setFont(BUTTON_FONT); 1328 localiseButton(fileMenu, "menu.file_menu", "&File", true); 1329 fileMenu.addMenuListener(new javax.swing.event.MenuListener () { 1330 public void menuCanceled(javax.swing.event.MenuEvent evt) { 1331 } 1332 public void menuDeselected(javax.swing.event.MenuEvent evt) { 1333 } 1334 public void menuSelected(javax.swing.event.MenuEvent evt) { 1335 fileMenuMenuSelected(evt); 1336 } 1337 }); 1338 1339 newProjectItem.setFont(BUTTON_FONT); 1340 newProjectItem.setText("New Project"); 1341 localiseButton(newProjectItem, "menu.new_item", "&New Project", true); 1342 newProjectItem.addActionListener(new java.awt.event.ActionListener () { 1343 public void actionPerformed(java.awt.event.ActionEvent evt) { 1344 newProjectItemActionPerformed(evt); 1345 } 1346 }); 1347 1348 fileMenu.add(newProjectItem); 1349 1350 openProjectItem.setFont(BUTTON_FONT); 1351 openProjectItem.setText("Open Project..."); 1352 localiseButton(openProjectItem, "menu.open_item", "&Open Project...", true); 1353 openProjectItem.addActionListener(new java.awt.event.ActionListener () { 1354 public void actionPerformed(java.awt.event.ActionEvent evt) { 1355 openProjectItemActionPerformed(evt); 1356 } 1357 }); 1358 1359 fileMenu.add(openProjectItem); 1360 1361 recentProjectsMenu.setText("Recent Projects"); 1362 recentProjectsMenu.setFont(BUTTON_FONT); 1363 localiseButton(recentProjectsMenu, "menu.recent_menu", "R&ecent Projects", true); 1364 rebuildRecentProjectsMenu(); 1365 fileMenu.add(recentProjectsMenu); 1366 1367 fileMenu.add(jSeparator9); 1368 1369 closeProjectItem.setFont(BUTTON_FONT); 1370 closeProjectItem.setText("Close Project"); 1371 localiseButton(closeProjectItem, "menu.close_item", "&Close Project", true); 1372 closeProjectItem.addActionListener(new java.awt.event.ActionListener () { 1373 public void actionPerformed(java.awt.event.ActionEvent evt) { 1374 closeProjectItemActionPerformed(evt); 1375 } 1376 }); 1377 1378 fileMenu.add(closeProjectItem); 1379 1380 saveProjectItem.setFont(BUTTON_FONT); 1381 saveProjectItem.setText("Save Project"); 1382 localiseButton(saveProjectItem, "menu.save_item", "&Save Project", true); 1383 saveProjectItem.addActionListener(new java.awt.event.ActionListener () { 1384 public void actionPerformed(java.awt.event.ActionEvent evt) { 1385 saveProjectItemActionPerformed(evt); 1386 } 1387 }); 1388 1389 fileMenu.add(saveProjectItem); 1390 1391 saveProjectAsItem.setFont(BUTTON_FONT); 1392 saveProjectAsItem.setText("Save Project As..."); 1393 localiseButton(saveProjectAsItem, "menu.saveas_item", "Save Project &As...", true); 1394 saveProjectAsItem.addActionListener(new java.awt.event.ActionListener () { 1395 public void actionPerformed(java.awt.event.ActionEvent evt) { 1396 saveProjectAsItemActionPerformed(evt); 1397 } 1398 }); 1399 1400 fileMenu.add(saveProjectAsItem); 1401 1402 reloadProjectItem.setFont(BUTTON_FONT); 1403 reloadProjectItem.setText("Reload Project"); 1404 localiseButton(reloadProjectItem, "menu.reload_item", "&Reload Project", true); 1405 reloadProjectItem.addActionListener(new java.awt.event.ActionListener () { 1406 public void actionPerformed(java.awt.event.ActionEvent evt) { 1407 reloadProjectItemActionPerformed(evt); 1408 } 1409 }); 1410 1411 fileMenu.add(reloadProjectItem); 1412 1413 fileMenu.add(jSeparator3); 1414 1415 loadBugsItem.setFont(BUTTON_FONT); 1416 loadBugsItem.setText("Load Bugs..."); 1417 localiseButton(loadBugsItem, "menu.loadbugs_item", "&Load Bugs...", true); 1418 loadBugsItem.addActionListener(new java.awt.event.ActionListener () { 1419 public void actionPerformed(java.awt.event.ActionEvent evt) { 1420 loadBugsItemActionPerformed(evt); 1421 } 1422 }); 1423 1424 fileMenu.add(loadBugsItem); 1425 1426 saveBugsItem.setFont(BUTTON_FONT); 1427 saveBugsItem.setText("Save Bugs"); 1428 localiseButton(saveBugsItem, "menu.savebugs_item", "Save &Bugs...", true); 1429 saveBugsItem.addActionListener(new java.awt.event.ActionListener () { 1430 public void actionPerformed(java.awt.event.ActionEvent evt) { 1431 saveBugsItemActionPerformed(evt); 1432 } 1433 }); 1434 1435 fileMenu.add(saveBugsItem); 1436 1437 fileMenu.add(jSeparator6); 1438 1439 exitItem.setFont(BUTTON_FONT); 1440 exitItem.setText("Exit"); 1441 localiseButton(exitItem, "menu.exit_item", "E&xit", true); 1442 exitItem.addActionListener(new java.awt.event.ActionListener () { 1443 public void actionPerformed(java.awt.event.ActionEvent evt) { 1444 exitItemActionPerformed(evt); 1445 } 1446 }); 1447 1448 fileMenu.add(exitItem); 1449 1450 theMenuBar.add(fileMenu); 1451 1452 editMenu.setText("Edit"); 1453 editMenu.setFont(BUTTON_FONT); 1454 editMenu.setEnabled(false); 1455 localiseButton(editMenu, "menu.edit_menu", "&Edit", true); 1456 cutItem.setFont(BUTTON_FONT); 1457 cutItem.setText("Cut"); 1458 localiseButton(cutItem, "menu.cut_item", "Cut", true); 1459 cutItem.addActionListener(new java.awt.event.ActionListener () { 1460 public void actionPerformed(java.awt.event.ActionEvent evt) { 1461 cutActionPerformed(evt); 1462 } 1463 }); 1464 1465 editMenu.add(cutItem); 1466 1467 copyItem.setFont(BUTTON_FONT); 1468 copyItem.setText("Copy"); 1469 localiseButton(copyItem, "menu.copy_item", "Copy", true); 1470 copyItem.addActionListener(new java.awt.event.ActionListener () { 1471 public void actionPerformed(java.awt.event.ActionEvent evt) { 1472 copyActionPerformed(evt); 1473 } 1474 }); 1475 1476 editMenu.add(copyItem); 1477 1478 pasteItem.setFont(BUTTON_FONT); 1479 pasteItem.setText("Paste"); 1480 localiseButton(pasteItem, "menu.paste_item", "Paste", true); 1481 pasteItem.addActionListener(new java.awt.event.ActionListener () { 1482 public void actionPerformed(java.awt.event.ActionEvent evt) { 1483 pasteActionPerformed(evt); 1484 } 1485 }); 1486 1487 editMenu.add(pasteItem); 1488 1489 editMenu.add(jSeparator10); 1490 1491 selectAllItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK)); 1492 selectAllItem.setFont(BUTTON_FONT); 1493 selectAllItem.setText("Select All"); 1494 localiseButton(selectAllItem, "menu.selectall_item", "Select &All", true); 1495 selectAllItem.addActionListener(new java.awt.event.ActionListener () { 1496 public void actionPerformed(java.awt.event.ActionEvent evt) { 1497 selectAllActionPerformed(evt); 1498 } 1499 }); 1500 1501 editMenu.add(selectAllItem); 1502 1503 theMenuBar.add(editMenu); 1504 1505 viewMenu.setText("View"); 1506 viewMenu.setFont(BUTTON_FONT); 1507 localiseButton(viewMenu, "menu.view_menu", "&View", true); 1508 1509 viewMenu.addMenuListener(new javax.swing.event.MenuListener () { 1510 public void menuCanceled(javax.swing.event.MenuEvent evt) { 1511 } 1512 public void menuDeselected(javax.swing.event.MenuEvent evt) { 1513 } 1514 public void menuSelected(javax.swing.event.MenuEvent evt) { 1515 viewMenuMenuSelected(evt); 1516 } 1517 }); 1518 1519 viewBugDetailsItem.setFont(BUTTON_FONT); 1520 viewBugDetailsItem.setSelected(true); 1521 viewBugDetailsItem.setText("Bug Details"); 1522 localiseButton(viewBugDetailsItem, "menu.bugdetails_item", "Bug &Details", true); 1523 viewBugDetailsItem.addActionListener(new java.awt.event.ActionListener () { 1524 public void actionPerformed(java.awt.event.ActionEvent evt) { 1525 viewBugDetailsItemActionPerformed(evt); 1526 } 1527 }); 1528 1529 viewMenu.add(viewBugDetailsItem); 1530 1531 fullDescriptionsItem.setFont(BUTTON_FONT); 1532 fullDescriptionsItem.setSelected(true); 1533 fullDescriptionsItem.setText("Full Descriptions"); 1534 localiseButton(fullDescriptionsItem, "menu.fulldescriptions_item", "&Full Descriptions", true); 1535 fullDescriptionsItem.addActionListener(new java.awt.event.ActionListener () { 1536 public void actionPerformed(java.awt.event.ActionEvent evt) { 1537 fullDescriptionsItemActionPerformed(evt); 1538 } 1539 }); 1540 1541 viewMenu.add(fullDescriptionsItem); 1542 1543 viewMenu.add(jSeparator7); 1544 1545 filterWarningsMenu.setText("Filter Warnings"); 1546 filterWarningsMenu.setFont(BUTTON_FONT); 1547 localiseButton(filterWarningsMenu, "menu.filterwarnings_menu", "Filter &Warnings", true); 1548 expPriorityButton.setFont(BUTTON_FONT); 1549 expPriorityButton.setText("Experimental Priority"); 1550 priorityButtonGroup.add(expPriorityButton); 1551 localiseButton(expPriorityButton, "menu.exppriority_item", "&Experimental Priority", true); 1552 expPriorityButton.setSelected(getPriorityThreshold() == Detector.EXP_PRIORITY); 1553 expPriorityButton.addActionListener(new java.awt.event.ActionListener () { 1554 public void actionPerformed(java.awt.event.ActionEvent evt) { 1555 expPriorityButtonActionPerformed(evt); 1556 } 1557 }); 1558 1559 filterWarningsMenu.add(expPriorityButton); 1560 1561 lowPriorityButton.setFont(BUTTON_FONT); 1562 lowPriorityButton.setText("Low Priority"); 1563 priorityButtonGroup.add(lowPriorityButton); 1564 localiseButton(lowPriorityButton, "menu.lowpriority_item", "&Low Priority", true); 1565 lowPriorityButton.setSelected(getPriorityThreshold() == Detector.LOW_PRIORITY); 1566 lowPriorityButton.addActionListener(new java.awt.event.ActionListener () { 1567 public void actionPerformed(java.awt.event.ActionEvent evt) { 1568 lowPriorityButtonActionPerformed(evt); 1569 } 1570 }); 1571 1572 filterWarningsMenu.add(lowPriorityButton); 1573 1574 mediumPriorityButton.setFont(BUTTON_FONT); 1575 mediumPriorityButton.setText("Medium Priority"); 1576 priorityButtonGroup.add(mediumPriorityButton); 1577 localiseButton(mediumPriorityButton, "menu.mediumpriority_item", "&Medium Priority", true); 1578 mediumPriorityButton.setSelected(getPriorityThreshold() == Detector.NORMAL_PRIORITY); 1579 mediumPriorityButton.addActionListener(new java.awt.event.ActionListener () { 1580 public void actionPerformed(java.awt.event.ActionEvent evt) { 1581 mediumPriorityButtonActionPerformed(evt); 1582 } 1583 }); 1584 1585 filterWarningsMenu.add(mediumPriorityButton); 1586 1587 highPriorityButton.setFont(BUTTON_FONT); 1588 highPriorityButton.setText("High Priority"); 1589 priorityButtonGroup.add(highPriorityButton); 1590 localiseButton(highPriorityButton, "menu.highpriority_item", "&High Priority", true); 1591 highPriorityButton.setSelected(getPriorityThreshold() == Detector.HIGH_PRIORITY); 1592 highPriorityButton.addActionListener(new java.awt.event.ActionListener () { 1593 public void actionPerformed(java.awt.event.ActionEvent evt) { 1594 highPriorityButtonActionPerformed(evt); 1595 } 1596 }); 1597 1598 filterWarningsMenu.add(highPriorityButton); 1599 1600 filterWarningsMenu.add(jSeparator11); 1601 1602 viewMenu.add(filterWarningsMenu); 1603 1604 ButtonGroup bg = new ButtonGroup (); 1605 bg.add(expPriorityButton); 1606 bg.add(lowPriorityButton); 1607 bg.add(mediumPriorityButton); 1608 bg.add(highPriorityButton); 1609 1610 viewMenu.add(jSeparator8); 1611 1612 viewProjectItem.setFont(BUTTON_FONT); 1613 viewProjectItem.setText("View Project Details"); 1614 viewProjectItem.setEnabled(false); 1615 localiseButton(viewProjectItem, "menu.viewprojectdetails_item", "View Project Details", true); 1616 viewProjectItem.addActionListener(new java.awt.event.ActionListener () { 1617 public void actionPerformed(java.awt.event.ActionEvent evt) { 1618 viewProjectItemActionPerformed(evt); 1619 } 1620 }); 1621 1622 viewMenu.add(viewProjectItem); 1623 1624 viewBugsItem.setFont(BUTTON_FONT); 1625 viewBugsItem.setText("View Bugs"); 1626 viewBugsItem.setEnabled(false); 1627 localiseButton(viewBugsItem, "menu.viewbugs_item", "View Bugs", true); 1628 viewBugsItem.addActionListener(new java.awt.event.ActionListener () { 1629 public void actionPerformed(java.awt.event.ActionEvent evt) { 1630 viewBugsItemActionPerformed(evt); 1631 } 1632 }); 1633 1634 viewMenu.add(viewBugsItem); 1635 1636 theMenuBar.add(viewMenu); 1637 1638 settingsMenu.setText("Settings"); 1639 settingsMenu.setFont(BUTTON_FONT); 1640 localiseButton(settingsMenu, "menu.settings_menu", "&Settings", true); 1641 settingsMenu.addActionListener(new java.awt.event.ActionListener () { 1642 public void actionPerformed(java.awt.event.ActionEvent evt) { 1643 settingsMenuActionPerformed(evt); 1644 } 1645 }); 1646 1647 configureDetectorsItem.setFont(BUTTON_FONT); 1648 configureDetectorsItem.setText("Configure Detectors..."); 1649 localiseButton(configureDetectorsItem, "menu.configure_item", "&Configure Detectors...", true); 1650 configureDetectorsItem.addActionListener(new java.awt.event.ActionListener () { 1651 public void actionPerformed(java.awt.event.ActionEvent evt) { 1652 configureDetectorsItemActionPerformed(evt); 1653 } 1654 }); 1655 1656 settingsMenu.add(configureDetectorsItem); 1657 1658 effortMenu.setText("Effort"); 1659 effortMenu.setFont(BUTTON_FONT); 1660 localiseButton(effortMenu, "menu.effort_menu", "Effort", true); 1661 minEffortItem.setFont(BUTTON_FONT); 1662 minEffortItem.setText("Minimum"); 1663 effortButtonGroup.add(minEffortItem); 1664 localiseButton(minEffortItem, "menu.mineffort_item", "&Minimum", true); 1665 minEffortItem.addActionListener(new java.awt.event.ActionListener () { 1666 public void actionPerformed(java.awt.event.ActionEvent evt) { 1667 minEffortItemActionPerformed(evt); 1668 } 1669 }); 1670 1671 effortMenu.add(minEffortItem); 1672 1673 normalEffortItem.setFont(BUTTON_FONT); 1674 normalEffortItem.setSelected(true); 1675 normalEffortItem.setText("Normal"); 1676 effortButtonGroup.add(normalEffortItem); 1677 localiseButton(normalEffortItem, "menu.normaleffort_item", "&Normal", true); 1678 normalEffortItem.addActionListener(new java.awt.event.ActionListener () { 1679 public void actionPerformed(java.awt.event.ActionEvent evt) { 1680 normalEffortItemActionPerformed(evt); 1681 } 1682 }); 1683 1684 effortMenu.add(normalEffortItem); 1685 1686 maxEffortItem.setFont(BUTTON_FONT); 1687 maxEffortItem.setText("Maximum"); 1688 effortButtonGroup.add(maxEffortItem); 1689 localiseButton(maxEffortItem, "menu.maxeffort_item", "&Maximum", true); 1690 maxEffortItem.addActionListener(new java.awt.event.ActionListener () { 1691 public void actionPerformed(java.awt.event.ActionEvent evt) { 1692 maxEffortItemActionPerformed(evt); 1693 } 1694 }); 1695 1696 effortMenu.add(maxEffortItem); 1697 1698 settingsMenu.add(effortMenu); 1699 1700 theMenuBar.add(settingsMenu); 1701 1702 helpMenu.setText("Help"); 1703 helpMenu.setFont(BUTTON_FONT); 1704 localiseButton(helpMenu, "menu.help_menu", "&Help", true); 1705 aboutItem.setFont(BUTTON_FONT); 1706 aboutItem.setText("About..."); 1707 localiseButton(aboutItem, "menu.about_item", "&About", true); 1708 aboutItem.addActionListener(new java.awt.event.ActionListener () { 1709 public void actionPerformed(java.awt.event.ActionEvent evt) { 1710 aboutItemActionPerformed(evt); 1711 } 1712 }); 1713 1714 helpMenu.add(aboutItem); 1715 1716 theMenuBar.add(helpMenu); 1717 1718 setJMenuBar(theMenuBar); 1719 1720 pack(); 1721 } 1723 private void maxEffortItemActionPerformed(java.awt.event.ActionEvent evt) { settingList = FindBugs.MAX_EFFORT; 1725 } 1727 private void normalEffortItemActionPerformed(java.awt.event.ActionEvent evt) { settingList = FindBugs.DEFAULT_EFFORT; 1729 } 1731 private void minEffortItemActionPerformed(java.awt.event.ActionEvent evt) { settingList = FindBugs.MIN_EFFORT; 1733 } 1735 private void settingsMenuActionPerformed(java.awt.event.ActionEvent evt) { } 1739 private void formWindowOpened(java.awt.event.WindowEvent evt) { if (SystemProperties.getBoolean("findbugs.noSummary")) { 1741 groupByTabbedPane.remove(bySummary); 1742 } 1743 } 1745 private void selectAllActionPerformed(java.awt.event.ActionEvent evt) { if (selectedComponent == null) 1747 return; 1748 1749 if (selectedComponent instanceof JTextComponent ) 1750 ((JTextComponent )selectedComponent).selectAll(); 1751 else if (selectedComponent instanceof JList ) { 1752 JList list = (JList )selectedComponent; 1753 list.setSelectionInterval(0, list.getModel().getSize()-1); 1754 } 1755 } 1757 private void disableEditKeyBindings(JList list) { 1758 list.getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK), "none"); 1759 list.getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.CTRL_MASK), "none"); 1760 list.getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.event.InputEvent.CTRL_MASK), "none"); 1761 } 1762 1763 private String buildSelectPath(JList list) { 1764 StringBuffer path = new StringBuffer (); 1765 int[] indices = list.getSelectedIndices(); 1766 String separatorStr = SystemProperties.getProperty("path.separator"); 1767 String sep = ""; 1768 ListModel m = list.getModel(); 1769 for (int indice : indices) { 1770 path.append(sep); 1771 sep = separatorStr; 1772 path.append(m.getElementAt(indice)); 1773 } 1774 return path.toString(); 1775 } 1776 1777 private void pasteActionPerformed(java.awt.event.ActionEvent evt) { if (selectedComponent == null) 1779 return; 1780 1781 if (selectedComponent instanceof JTextComponent ) 1782 ((JTextComponent )selectedComponent).paste(); 1783 else if (selectedComponent instanceof JList ) { 1784 Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 1785 Transferable transfer = cb.getContents(this); 1786 if (transfer.isDataFlavorSupported(DataFlavor.stringFlavor)) { 1787 try { 1788 String path = (String )transfer.getTransferData(DataFlavor.stringFlavor); 1789 1790 if (selectedComponent == jarFileList) { 1791 jarNameTextField.setText(path); 1792 addJarButtonActionPerformed(evt); 1793 } 1794 else if (selectedComponent == sourceDirList) { 1795 srcDirTextField.setText(path); 1796 this.addSourceDirButtonActionPerformed(evt); 1797 } 1798 else if (selectedComponent == classpathEntryList) { 1799 classpathEntryTextField.setText(path); 1800 addClasspathEntryButtonActionPerformed(evt); 1801 } 1802 } catch (Exception e) { 1803 } 1804 } 1805 } 1806 } 1808 private void copyActionPerformed(java.awt.event.ActionEvent evt) { if (selectedComponent == null) 1810 return; 1811 1812 if (selectedComponent instanceof JTextComponent ) 1813 ((JTextComponent )selectedComponent).copy(); 1814 else if (selectedComponent instanceof JTree ) { 1815 TreePath path = ((JTree )selectedComponent).getSelectionPath(); 1816 StringSelection data = new StringSelection (path.getLastPathComponent().toString()); 1817 Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 1818 cb.setContents(data, data); 1819 } 1820 else if (selectedComponent instanceof JList ) { 1821 StringSelection path = new StringSelection (buildSelectPath((JList )selectedComponent)); 1822 Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 1823 cb.setContents(path, path); 1824 } 1825 } 1827 private void cutActionPerformed(java.awt.event.ActionEvent evt) { if (selectedComponent == null) 1829 return; 1830 1831 if (selectedComponent instanceof JTextComponent ) 1832 ((JTextComponent )selectedComponent).cut(); 1833 else if (selectedComponent instanceof JList ) { 1834 StringSelection path = new StringSelection (buildSelectPath((JList )selectedComponent)); 1835 Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 1836 cb.setContents(path, path); 1837 if (selectedComponent == jarFileList) 1838 removeJarButtonActionPerformed(evt); 1839 else if (selectedComponent == sourceDirList) 1840 removeSrcDirButtonActionPerformed(evt); 1841 else if (selectedComponent == classpathEntryList) 1842 removeClasspathEntryButtonActionPerformed(evt); 1843 } 1844 } 1846 private void focusGainedHandler(java.awt.event.FocusEvent evt) { Component old = evt.getOppositeComponent(); 1848 if (old instanceof JList ) 1849 ((JList ) old).clearSelection(); 1850 selectedComponent = evt.getComponent(); 1851 ableEditMenu(); 1852 } 1854 private void classpathUpButtonActionPerformed(java.awt.event.ActionEvent evt) { if (moveEntriesUp(classpathEntryList)) 1856 resyncAuxClasspathEntries(); 1857 } 1859 private void sourceDownButtonActionPerformed(java.awt.event.ActionEvent evt) { if (moveEntriesDown(sourceDirList)) 1861 resyncSourceEntries(); 1862 } 1864 private void sourceUpButtonActionPerformed(java.awt.event.ActionEvent evt) { if (moveEntriesUp(sourceDirList)) 1866 resyncSourceEntries(); 1867 } 1869 private void classpathDownButtonActionPerformed(java.awt.event.ActionEvent evt) { if (moveEntriesDown(classpathEntryList)) 1871 resyncAuxClasspathEntries(); 1872 } 1874 private void viewBugsItemActionPerformed(java.awt.event.ActionEvent evt) { setView("BugTree"); 1876 } 1878 private void viewProjectItemActionPerformed(java.awt.event.ActionEvent evt) { setView("EditProjectPanel"); 1880 } 1882 private void highPriorityButtonActionPerformed(java.awt.event.ActionEvent evt) { setPriorityThreshold(Detector.HIGH_PRIORITY); 1884 } 1886 private void mediumPriorityButtonActionPerformed(java.awt.event.ActionEvent evt) { setPriorityThreshold(Detector.NORMAL_PRIORITY); 1888 } 1890 private void lowPriorityButtonActionPerformed(java.awt.event.ActionEvent evt) { setPriorityThreshold(Detector.LOW_PRIORITY); 1892 } 1894 private void expPriorityButtonActionPerformed(java.awt.event.ActionEvent evt) { setPriorityThreshold(Detector.EXP_PRIORITY); 1896 } 1898 private void saveBugsItemActionPerformed(java.awt.event.ActionEvent evt) { 1900 try { 1901 if (currentAnalysisRun == null) { 1902 logger.logMessage(Logger.ERROR, "No bugs are loaded!"); 1903 return; 1904 } 1905 1906 JFileChooser chooser = createFileChooser(); 1907 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 1908 chooser.setFileFilter(xmlFileFilter); 1909 1910 int result = chooseFile(chooser, L10N.getLocalString("dlg.savebugs_ttl", "Save Bugs")); 1911 1912 if (result != JFileChooser.CANCEL_OPTION) { 1913 if (currentBugInstance != null) 1916 synchBugAnnotation(currentBugInstance); 1917 1918 File selectedFile = chooser.getSelectedFile(); 1920 currentAnalysisRun.saveBugsToFile(selectedFile); 1921 } 1922 } catch (Exception e) { 1923 if (FindBugs.DEBUG) { 1924 e.printStackTrace(); 1925 } 1926 logger.logMessage(Logger.ERROR, "Could not save bugs: " + e.toString()); 1927 } 1928 } 1930 private void loadBugsFromFile(File file) throws IOException , DocumentException { 1931 File selectedFile = file; 1932 1933 Project project = new Project(); 1934 AnalysisRun analysisRun = new AnalysisRun(project, this); 1935 1936 analysisRun.loadBugsFromFile(selectedFile); 1937 1938 project.setProjectFileName(file.getName()); setProject(project); 1940 synchAnalysisRun(analysisRun); 1941 } 1942 1943 private void loadBugsFromURL(String urlspec) throws IOException , DocumentException { 1944 URL url = new URL (urlspec); 1945 InputStream in = url.openStream(); 1946 1947 Project project = new Project(); 1948 AnalysisRun analysisRun = new AnalysisRun(project, this); 1949 1950 analysisRun.loadBugsFromInputStream(in); 1951 1952 setProject(project); 1953 synchAnalysisRun(analysisRun); 1954 } 1955 1956 private void loadBugsItemActionPerformed(java.awt.event.ActionEvent evt) { 1959 try { 1960 1961 JFileChooser chooser = createFileChooser(); 1962 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 1963 chooser.setFileFilter(xmlFileFilter); 1964 1965 int result = chooseFile(chooser, L10N.getLocalString("dlg.loadbugs_ttl", "Load Bugs...")); 1966 1967 if (result != JFileChooser.CANCEL_OPTION) { 1968 loadBugsFromFile(chooser.getSelectedFile()); 1969 } 1970 } catch (Exception e) { 1971 if (FindBugs.DEBUG) { 1972 e.printStackTrace(); 1973 } 1974 logger.logMessage(Logger.ERROR, "Could not load bugs: " + e.toString()); 1975 } 1976 1977 } 1979 private void configureDetectorsItemActionPerformed(java.awt.event.ActionEvent evt) { ConfigureDetectorsDialog dialog = new ConfigureDetectorsDialog(this, true); 1981 dialog.setSize(700, 520); 1982 dialog.setLocationRelativeTo(null); dialog.setVisible(true); 1984 } 1986 private void reloadProjectItemActionPerformed(java.awt.event.ActionEvent evt) { Project current = getCurrentProject(); 1988 1989 if (current == null) 1990 return; 1991 1992 try { 1993 String filename = current.getProjectFileName(); 1994 Project project = new Project(); 1995 project.read(filename); 1996 setProject(null); 1997 setProject(project); 1998 findBugsButtonActionPerformed(evt); 1999 } catch (IOException e) { 2000 logger.logMessage(Logger.ERROR, "Could not reload project: " + e.getMessage()); 2001 } 2002 2003 } 2005 private void saveProjectAsItemActionPerformed(java.awt.event.ActionEvent evt) { saveProject(getCurrentProject(), L10N.getLocalString("dlg.saveprojectas_ttl", "Save Project As..."), true); 2007 } 2009 private void viewMenuMenuSelected(javax.swing.event.MenuEvent evt) { boolean hasProject = getCurrentProject() != null; 2013 viewBugDetailsItem.setEnabled(hasProject); 2014 fullDescriptionsItem.setEnabled(hasProject); 2015 } 2017 private void fileMenuMenuSelected(javax.swing.event.MenuEvent evt) { boolean hasProject = getCurrentProject() != null; 2020 saveProjectItem.setEnabled(hasProject); 2021 saveProjectAsItem.setEnabled(hasProject); 2022 reloadProjectItem.setEnabled(hasProject && !getCurrentProject().getProjectFileName().equals(Project.UNNAMED_PROJECT)); 2023 closeProjectItem.setEnabled(hasProject); 2024 2025 boolean hasAnalysisRun = currentAnalysisRun != null; 2027 saveBugsItem.setEnabled(hasAnalysisRun); 2028 2029 } 2031 private void closeProjectItemActionPerformed(java.awt.event.ActionEvent evt) { if (closeProjectHook(getCurrentProject(), L10N.getLocalString("dlg.closeproject_lbl", "Close Project"))) { 2033 setProject(null); 2034 } 2035 } 2037 private void removeClasspathEntryButtonActionPerformed(java.awt.event.ActionEvent evt) { Project project = getCurrentProject(); 2039 DefaultListModel listModel = (DefaultListModel ) classpathEntryList.getModel(); 2040 2041 int[] selIndices = classpathEntryList.getSelectedIndices(); 2042 for (int i = selIndices.length - 1; i >= 0; i--) { 2043 int sel = selIndices[i]; 2044 project.removeAuxClasspathEntry(sel); 2045 listModel.remove(sel); 2046 } 2047 } 2049 private void addClasspathEntryButtonActionPerformed(java.awt.event.ActionEvent evt) { addClasspathEntryToList(); 2051 } 2053 private void browseClasspathEntryButtonActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser chooser = createFileChooser(); 2055 chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 2056 chooser.setFileFilter(auxClasspathEntryFileFilter); 2057 chooser.setMultiSelectionEnabled(true); 2058 2059 int result = chooseFile(chooser, "Add Entry"); 2060 2061 if (result != JFileChooser.CANCEL_OPTION) { 2062 File [] selectedFileList = chooser.getSelectedFiles(); 2063 for (int i = 0; i < selectedFileList.length; ++i) { 2064 selectedFileList[i] = verifyFileSelection(selectedFileList[i]); 2065 String entry = selectedFileList[i].getPath(); 2066 addClasspathEntryToProject(entry); 2067 } 2068 } 2069 } 2071 private void fullDescriptionsItemActionPerformed(java.awt.event.ActionEvent evt) { for (JTree bugTree : bugTreeList) { 2073 DefaultTreeModel bugTreeModel = (DefaultTreeModel ) bugTree.getModel(); 2075 int numRows = bugTree.getRowCount(); 2076 2077 for (int i = 0; i < numRows; ++i) { 2078 TreePath path = bugTree.getPathForRow(i); 2080 if (path == null) 2081 continue; 2082 DefaultMutableTreeNode node = (DefaultMutableTreeNode ) path.getLastPathComponent(); 2083 if (node instanceof BugTreeNode) 2084 bugTreeModel.valueForPathChanged(path, node.getUserObject()); 2085 } 2086 } 2087 } 2089 private void viewBugDetailsItemActionPerformed(java.awt.event.ActionEvent evt) { String view = getView(); 2091 if (view.equals("BugTree")) { 2092 checkBugDetailsVisibility(); 2093 } 2094 2095 } 2097 private void bugTreeBugDetailsSplitterPropertyChange(java.beans.PropertyChangeEvent evt) { String propertyName = evt.getPropertyName(); 2102 if (propertyName.equals(JSplitPane.DIVIDER_LOCATION_PROPERTY)) { 2103 boolean isMaximized = isSplitterMaximized(bugTreeBugDetailsSplitter, evt); 2104 viewBugDetailsItem.setSelected(!isMaximized); 2105 if (!isMaximized) { 2106 synchBugInstance(); 2109 } 2110 } 2111 } 2113 private void openProjectItemActionPerformed(java.awt.event.ActionEvent evt) { 2115 if (!closeProjectHook(getCurrentProject(), L10N.getLocalString("msg.openproject_txt", "Open Project"))) 2116 return; 2117 2118 JFileChooser chooser = createFileChooser(); 2119 chooser.setFileFilter(projectFileFilter); 2120 int result = chooseFileToOpen(chooser); 2121 2122 if (result == JFileChooser.CANCEL_OPTION) 2123 return; 2124 try { 2125 File file = chooser.getSelectedFile(); 2126 Project project = new Project(); 2127 project.read(file.getPath()); 2128 setProject(project); 2129 UserPreferences.getUserPreferences().useProject(file.getPath()); 2130 rebuildRecentProjectsMenu(); 2131 2132 } catch (IOException e) { 2133 logger.logMessage(Logger.ERROR, MessageFormat.format( L10N.getLocalString("msg.couldnotopenproject_txt", "Could not open project: {0}"), new Object []{e.getMessage()})); 2134 } 2135 } 2137 private void saveProjectItemActionPerformed(java.awt.event.ActionEvent evt) { saveProject(getCurrentProject(), L10N.getLocalString("msg.saveproject_txt", "Save Project")); 2139 } 2141 private void aboutItemActionPerformed(java.awt.event.ActionEvent evt) { about(); 2143 } 2145 private void findBugsButtonActionPerformed(java.awt.event.ActionEvent evt) { Project project = getCurrentProject(); 2147 2148 if (project.getFileCount() == 0) { 2149 logger.logMessage(Logger.ERROR, MessageFormat.format(L10N.getLocalString("msg.projectnojars_txt", "Project {0} has no Jar files selected"), new Object []{project})); 2150 return; 2151 } 2152 2153 bugDescriptionEditorPane.setText(""); 2154 currentBugDetailsKey = null; 2155 sourceTextArea.setText(""); 2156 AnalysisRun analysisRun = new AnalysisRun(project, this); 2157 2158 logger.logMessage(Logger.INFO, MessageFormat.format(L10N.getLocalString("msg.beginninganalysis_txt", "Beginning analysis of {0}"), new Object []{project})); 2159 2160 RunAnalysisDialog dialog = new RunAnalysisDialog(this, analysisRun); 2162 dialog.setSize(400, 300); 2163 dialog.setLocationRelativeTo(null); dialog.setVisible(true); 2165 2166 if (dialog.isCompleted()) { 2167 logger.logMessage(Logger.INFO, MessageFormat.format(L10N.getLocalString("msg.analysiscompleted_txt", "Analysis {0} completed"), new Object []{project})); 2168 2169 analysisRun.reportAnalysisErrors(); 2171 2172 synchAnalysisRun(analysisRun); 2174 } else { 2175 if (dialog.exceptionOccurred()) { 2176 Exception e = dialog.getException(); 2178 AnalysisErrorDialog err = new AnalysisErrorDialog(this, true, null); 2179 err.addLine(MessageFormat.format(L10N.getLocalString("msg.fatalanalysisexception_txt", "Fatal analysis exception: {0}"), new Object []{e.toString()})); 2180 StackTraceElement [] callList = e.getStackTrace(); 2181 for (StackTraceElement aCallList : callList) 2182 err.addLine("\t" + aCallList); 2183 err.finish(); 2184 err.setSize(650, 500); 2185 err.setLocationRelativeTo(null); err.setVisible(true); 2187 } else { 2188 logger.logMessage(Logger.INFO, MessageFormat.format(L10N.getLocalString("msg.analysiscancelled_txt", "Analysis of {0} cancelled by user"), new Object []{project})); 2190 } 2191 } 2192 } 2194 private void browseSrcDirButtonActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser chooser = createFileChooser(); 2196 chooser.setFileFilter(archiveAndDirectoryFilter); 2197 chooser.setMultiSelectionEnabled(true); 2198 chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 2199 2200 int rc = chooseFile(chooser, L10N.getLocalString("msg_addsource_lbl", "Add source directory or archive")); 2201 if (rc == JFileChooser.APPROVE_OPTION) { 2202 File [] selectedFileList = chooser.getSelectedFiles(); 2203 for (int i = 0; i < selectedFileList.length; ++i) { 2204 selectedFileList[i] = verifyFileSelection(selectedFileList[i]); 2205 String entry = selectedFileList[i].getPath(); 2206 addSrcToProject(entry); 2207 } 2208 } 2209 } 2211 private void srcDirTextFieldActionPerformed(java.awt.event.ActionEvent evt) { addSourceDirToList(); 2213 } 2215 private void jarNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) { addJarToList(); 2217 } 2219 private void browseJarButtonActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser chooser = createFileChooser(); 2221 chooser.setFileFilter(archiveAndDirectoryFilter); 2222 chooser.setMultiSelectionEnabled(true); 2223 chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 2224 2225 int rc = chooseFile(chooser, L10N.getLocalString("msg.addarchiveordirectory_txt", "Add archive or directory")); 2226 if (rc == JFileChooser.APPROVE_OPTION) { 2227 File [] selectedFileList = chooser.getSelectedFiles(); 2228 for (int i = 0; i < selectedFileList.length; ++i) { 2229 selectedFileList[i] = verifyFileSelection(selectedFileList[i]); 2230 String entry = selectedFileList[i].getPath(); 2231 addJarToProject(entry); 2232 } 2233 } 2234 } 2236 private void newProjectItemActionPerformed(java.awt.event.ActionEvent evt) { 2238 if (!closeProjectHook(getCurrentProject(), L10N.getLocalString("msg.newproject_txt", "New Project"))) 2239 return; 2240 2241 Project project = new Project(); 2242 setProject(project); 2243 } 2245 private void exitItemActionPerformed(java.awt.event.ActionEvent evt) { exitFindBugs(); 2247 } 2249 private void removeSrcDirButtonActionPerformed(java.awt.event.ActionEvent evt) { Project project = getCurrentProject(); 2251 DefaultListModel listModel = (DefaultListModel ) sourceDirList.getModel(); 2252 2253 int[] selIndices = sourceDirList.getSelectedIndices(); 2254 for (int i = selIndices.length - 1; i >= 0; i--) { 2255 int sel = selIndices[i]; 2256 project.removeSourceDir(sel); 2257 listModel.remove(sel); 2258 } 2259 } 2261 private void removeJarButtonActionPerformed(java.awt.event.ActionEvent evt) { Project project = getCurrentProject(); 2263 DefaultListModel listModel = (DefaultListModel ) jarFileList.getModel(); 2264 2265 int[] selIndices = jarFileList.getSelectedIndices(); 2266 for (int i = selIndices.length - 1; i >= 0; i--) { 2267 int sel = selIndices[i]; 2268 project.removeFile(sel); 2269 listModel.remove(sel); 2270 } 2271 } 2273 private void addSourceDirButtonActionPerformed(java.awt.event.ActionEvent evt) { addSourceDirToList(); 2275 } 2277 private void addJarButtonActionPerformed(java.awt.event.ActionEvent evt) { addJarToList(); 2279 } 2281 2284 private void exitForm(java.awt.event.WindowEvent evt) { exitFindBugs(); 2286 } 2288 2292 private void equalizeControls(JComponent [] components) { 2293 Dimension d; 2294 2295 int minX = 0, minY = 0; 2296 for (JComponent comp : components) { 2297 comp.setMaximumSize(null); 2298 comp.setMinimumSize(null); 2299 comp.setPreferredSize(null); 2300 d = comp.getPreferredSize(); 2301 if (d.width > minX) 2302 minX = d.width; 2303 if (d.height > minY) 2304 minY = d.height; 2305 } 2306 2307 d = new Dimension (minX, minY); 2308 for (JComponent comp : components) { 2309 comp.setMinimumSize(d); 2310 comp.setMaximumSize(d); 2311 comp.setPreferredSize(d); 2312 } 2313 } 2314 2315 2320 private void bugTreeSelectionChanged(TreeSelectionEvent e) { 2321 2322 BugInstance selected = getCurrentBugInstance(); 2323 if (selected != null) { 2324 synchBugInstance(); 2325 } 2326 } 2327 2328 private void openRecentProjectItemActionPerformed(java.awt.event.ActionEvent evt) { 2329 if (!closeProjectHook(getCurrentProject(), L10N.getLocalString("msg.openproject_txt", "Open Project"))) 2330 return; 2331 2332 JMenuItem recentProjectItem = (JMenuItem ) evt.getSource(); 2333 File file = new File (recentProjectItem.getText()); 2334 try { 2335 System.setProperty("user.dir", file.getParent()); 2336 Project project = new Project(); 2337 project.read(file.getPath()); 2338 setProject(project); 2339 UserPreferences.getUserPreferences().useProject(file.getPath()); 2340 } catch (IOException e) { 2341 UserPreferences.getUserPreferences().removeProject(file.getPath()); 2342 logger.logMessage(Logger.ERROR, MessageFormat.format(L10N.getLocalString("msg.couldnotopenproject_txt", "Could not open project: {0}"), new Object []{e.getMessage()})); 2343 } finally { 2344 rebuildRecentProjectsMenu(); 2345 } 2346 } 2347 2348 private boolean moveEntriesUp(JList entryList) { 2349 int[] selIndices = entryList.getSelectedIndices(); 2350 if (selIndices.length == 0) 2351 return false; 2352 2353 boolean changed = false; 2354 int lastInsertPos = -1; 2355 DefaultListModel model = (DefaultListModel ) entryList.getModel(); 2356 for (int i = 0; i < selIndices.length; i++) { 2357 int sel = selIndices[i]; 2358 if ((sel - 1) > lastInsertPos) { 2359 model.add(sel - 1, model.remove(sel)); 2360 selIndices[i] = sel - 1; 2361 changed = true; 2362 } 2363 lastInsertPos = selIndices[i]; 2364 } 2365 2366 entryList.setSelectedIndices(selIndices); 2367 return changed; 2368 } 2369 2370 private boolean moveEntriesDown(JList entryList) { 2371 int[] selIndices = entryList.getSelectedIndices(); 2372 if (selIndices.length == 0) 2373 return false; 2374 2375 boolean changed = false; 2376 DefaultListModel model = (DefaultListModel ) entryList.getModel(); 2377 int lastInsertPos = model.getSize(); 2378 for (int i = selIndices.length - 1; i >= 0; i--) { 2379 int sel = selIndices[i]; 2380 if ((sel + 1) < lastInsertPos) { 2381 model.add(sel + 1, model.remove(sel)); 2382 selIndices[i] = sel + 1; 2383 changed = true; 2384 } 2385 lastInsertPos = selIndices[i]; 2386 } 2387 2388 entryList.setSelectedIndices(selIndices); 2389 return changed; 2390 } 2391 2392 private void resyncAuxClasspathEntries() { 2393 Project project = getCurrentProject(); 2394 int numEntries = project.getNumAuxClasspathEntries(); 2395 while (numEntries-- > 0) 2396 project.removeAuxClasspathEntry(0); 2397 2398 DefaultListModel model = (DefaultListModel ) classpathEntryList.getModel(); 2399 for (int i = 0; i < model.size(); i++) 2400 project.addAuxClasspathEntry((String ) model.get(i)); 2401 } 2402 2403 private void resyncSourceEntries() { 2404 Project project = getCurrentProject(); 2405 int numEntries = project.getNumSourceDirs(); 2406 while (numEntries-- > 0) 2407 project.removeSourceDir(0); 2408 2409 DefaultListModel model = (DefaultListModel ) sourceDirList.getModel(); 2410 for (int i = 0; i < model.size(); i++) 2411 project.addSourceDir((String ) model.get(i)); 2412 } 2413 2414 2424 private void localiseButton(AbstractButton button, String key, String defaultString, 2425 boolean setMnemonic) { 2426 L10N.localiseButton(button, key, defaultString, setMnemonic); 2427 } 2428 2429 2432 2433 2437 private void postInitComponents() { 2438 logger = new ConsoleLogger(this); 2439 2440 Collection <String > bugCategoryCollection = edu.umd.cs.findbugs.I18N.instance().getBugCategories(); 2445 this.bugCategoryCheckBoxList = new JCheckBoxMenuItem [bugCategoryCollection.size()]; 2446 this.bugCategoryList = new String [bugCategoryCollection.size()]; 2447 int count = 0; 2448 for (String bugCategory : bugCategoryCollection) { 2449 String bugCategoryDescription = I18N.instance().getBugCategoryDescription(bugCategory); 2450 2451 final JCheckBoxMenuItem item = new JCheckBoxMenuItem (bugCategoryDescription, true); 2452 item.setFont(BUTTON_FONT); 2453 item.setSelected(getFilterSettings().containsCategory(bugCategory)); 2454 item.addActionListener(new ActionListener () { 2455 public void actionPerformed(ActionEvent evt) { 2456 toggleBugCategory(item); 2457 } 2458 }); 2459 2460 filterWarningsMenu.add(item); 2461 2462 this.bugCategoryCheckBoxList[count] = item; 2463 this.bugCategoryList[count] = bugCategory; 2464 2465 ++count; 2466 } 2467 2468 viewPanelLayout = (CardLayout ) viewPanel.getLayout(); 2469 2470 bugTreeList = new JTree []{byClassBugTree, byPackageBugTree, byBugTypeBugTree, byBugCategoryBugTree}; 2473 2474 for (JTree bugTree : bugTreeList) { 2476 bugTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 2477 bugTree.setCellRenderer(BugCellRenderer.instance()); 2478 bugTree.setRootVisible(false); 2479 bugTree.setShowsRootHandles(true); 2480 bugTree.addTreeSelectionListener(new TreeSelectionListener () { 2481 public void valueChanged(TreeSelectionEvent e) { 2482 bugTreeSelectionChanged(e); 2483 } 2484 }); 2485 } 2486 2487 jarFileList.setModel(new DefaultListModel ()); 2488 sourceDirList.setModel(new DefaultListModel ()); 2489 classpathEntryList.setModel(new DefaultListModel ()); 2490 2491 final Highlighter.HighlightPainter painter = 2495 new DefaultHighlighter.DefaultHighlightPainter (sourceTextArea.getSelectionColor()) { 2496 @Override 2497 public Shape paintLayer(Graphics g, int offs0, int offs1, 2498 Shape bounds, JTextComponent c, View view) { 2499 try { 2500 Shape extent = view.modelToView(offs0, Position.Bias.Forward, offs1, Position.Bias.Backward, bounds); 2501 Rectangle rect = extent.getBounds(); 2502 rect.x = 0; 2503 rect.width = bounds.getBounds().width; 2504 g.setColor(getColor()); 2505 g.fillRect(rect.x, rect.y, rect.width, rect.height); 2506 return rect; 2507 } catch (BadLocationException e) { 2508 return null; 2509 } 2510 } 2511 }; 2512 Highlighter sourceHighlighter = new DefaultHighlighter () { 2513 @Override 2514 public Object addHighlight(int p0, int p1, Highlighter.HighlightPainter p) 2515 throws BadLocationException { 2516 return super.addHighlight(p0, p1, painter); 2517 } 2518 }; 2519 sourceTextArea.setHighlighter(sourceHighlighter); 2520 2521 updateTitle(getCurrentProject()); 2522 2523 ClassLoader classLoader = this.getClass().getClassLoader(); 2525 ImageIcon logoIcon = new ImageIcon (classLoader.getResource("edu/umd/cs/findbugs/gui/logo_umd.png")); 2526 logoLabel.setIcon(logoIcon); 2527 2528 final int MENU_MASK = getMenuMask(); 2530 newProjectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, MENU_MASK)); 2531 openProjectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, MENU_MASK)); 2532 saveProjectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_MASK)); 2533 closeProjectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, MENU_MASK)); 2534 reloadProjectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_MASK)); 2535 2536 cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, MENU_MASK)); 2537 copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, MENU_MASK)); 2538 pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, MENU_MASK)); 2539 selectAllItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, MENU_MASK)); 2540 2541 if (MAC_OS_X) { 2542 saveProjectAsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_MASK | Event.SHIFT_MASK)); 2545 loadBugsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, MENU_MASK | Event.ALT_MASK)); 2546 saveBugsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_MASK | Event.ALT_MASK)); 2547 2548 growBoxSpacer.setMinimumSize(new java.awt.Dimension (16,16)); 2550 2551 fileMenu.remove(exitItem); 2553 fileMenu.remove(jSeparator6); 2554 theMenuBar.remove(helpMenu); 2555 2556 try { 2561 Class osxAdapter = Class.forName("edu.umd.cs.findbugs.gui.OSXAdapter"); 2562 Class [] defArgs = {FindBugsFrame.class}; 2563 Method registerMethod = osxAdapter.getDeclaredMethod("registerMacOSXApplication", defArgs); 2564 if (registerMethod != null) { 2565 Object [] args = {this}; 2566 registerMethod.invoke(osxAdapter, args); 2567 } 2568 } catch (NoClassDefFoundError e) { 2569 System.err.println("This version of Mac OS X does not support the Apple EAWT. Application Menu handling has been disabled (" + e + ")"); 2572 } catch (ClassNotFoundException e) { 2573 System.err.println("This version of Mac OS X does not support the Apple EAWT. Application Menu handling has been disabled (" + e + ")"); 2576 } catch (Exception e) { 2577 System.err.println("Exception while loading the OSXAdapter: " + e); 2578 if (FindBugs.DEBUG) { 2579 e.printStackTrace(); 2580 } 2581 } 2582 } 2583 2584 } 2585 2586 private void rebuildRecentProjectsMenu() { 2587 UserPreferences prefs = UserPreferences.getUserPreferences(); 2588 final List <String > recentProjects = prefs.getRecentProjects(); 2589 SwingUtilities.invokeLater(new Runnable () { 2590 public void run() { 2591 recentProjectsMenu.removeAll(); 2592 java.awt.Font ft = BUTTON_FONT; 2593 if (recentProjects.size() == 0) { 2594 JMenuItem emptyItem = new JMenuItem (L10N.getLocalString("menu.empty_item", "Empty")); 2595 emptyItem.setFont(ft); 2596 emptyItem.setEnabled(false); 2597 recentProjectsMenu.add(emptyItem); 2598 } else { 2599 for (String recentProject : recentProjects) { 2600 JMenuItem projectItem = new JMenuItem (recentProject); 2601 projectItem.setFont(ft); 2602 projectItem.addActionListener(new ActionListener () { 2603 public void actionPerformed(ActionEvent evt) { 2604 openRecentProjectItemActionPerformed(evt); 2605 } 2606 }); 2607 recentProjectsMenu.add(projectItem); 2608 } 2609 } 2610 } 2611 }); 2612 } 2613 2614 2617 2618 2627 private static Object getTreeSelectionOf(JTree tree, Class c) { 2628 TreePath selPath = tree.getSelectionPath(); 2629 2630 if (selPath == null) 2632 return null; 2633 2634 Object [] nodeList = selPath.getPath(); 2637 for (int i = nodeList.length - 1; i >= 0; --i) { 2638 DefaultMutableTreeNode node = (DefaultMutableTreeNode ) nodeList[i]; 2639 Object nodeInfo = node.getUserObject(); 2640 if (nodeInfo != null && nodeInfo.getClass() == c) 2641 return nodeInfo; 2642 } 2643 return null; 2644 } 2645 2646 2649 private Project getCurrentProject() { 2650 return currentProject; 2651 } 2652 2653 2656 private AnalysisRun getCurrentAnalysisRun() { 2657 return currentAnalysisRun; 2658 } 2659 2660 2663 private BugInstance getCurrentBugInstance() { 2664 JTree bugTree = getCurrentBugTree(); 2665 if (bugTree != null) { 2666 return (BugInstance) getTreeSelectionOf(bugTree, BugInstance.class); 2667 } 2668 return null; 2669 } 2670 2671 2680 private boolean isSplitterMaximized(JSplitPane splitter, java.beans.PropertyChangeEvent evt) { 2681 Integer location = (Integer ) evt.getNewValue(); 2682 2683 int height = splitter.getHeight(); 2684 int hopefullyMaxDivider = height - (splitter.getDividerSize() + DIVIDER_FUDGE); 2685 boolean isMaximized = location.intValue() >= hopefullyMaxDivider; 2689 return isMaximized; 2690 } 2691 2692 private void checkBugDetailsVisibility() { 2693 if (viewBugDetailsItem.isSelected()) { 2694 bugTreeBugDetailsSplitter.resetToPreferredSizes(); 2695 } else { 2696 bugTreeBugDetailsSplitter.setDividerLocation(1.0); 2697 } 2698 } 2700 2701 private JTree getCurrentBugTree() { 2702 JScrollPane selected = (JScrollPane ) groupByTabbedPane.getSelectedComponent(); 2703 Object view = selected.getViewport().getView(); 2704 if (view instanceof JTree ) { 2705 return (JTree ) view; 2706 } 2707 return null; 2708 } 2709 2710 2713 2714 2719 private void setPriorityThreshold(int threshold) { 2720 if (threshold != getFilterSettings().getMinPriorityAsInt()) { 2721 getFilterSettings().setMinPriority(ProjectFilterSettings.getIntPriorityAsString(threshold)); 2722 if (currentAnalysisRun != null) 2723 synchAnalysisRun(currentAnalysisRun); 2724 } 2725 } 2726 2727 private void ableEditMenu() { 2728 String view = getView(); 2729 if ((view != null) && view.equals("EditProjectPanel")) { 2730 if (selectedComponent != null) { 2731 boolean hasSelection = false; 2732 if (selectedComponent instanceof JList ) { 2733 JList list = (JList )selectedComponent; 2734 hasSelection = list.getSelectedIndices().length > 0; 2735 } else if (selectedComponent instanceof JTextField ) { 2736 JTextField tf = (JTextField )selectedComponent; 2737 hasSelection = ((tf.getSelectedText() != null) && 2738 (tf.getSelectedText().length() > 0)); 2739 } 2740 2741 cutItem.setEnabled(hasSelection); 2742 copyItem.setEnabled(hasSelection); 2743 selectAllItem.setEnabled(true); 2744 } 2745 2748 } else { 2749 cutItem.setEnabled(false); 2750 copyItem.setEnabled(true); 2751 pasteItem.setEnabled(false); 2752 selectAllItem.setEnabled(false); 2753 } 2754 } 2755 2756 private void setProject(Project project) { 2757 currentProject = project; 2758 if (project != null) { 2759 synchProject(project); 2760 setView("EditProjectPanel"); 2761 editMenu.setEnabled(true); 2762 viewProjectItem.setEnabled(true); 2763 viewProjectItem.setSelected(true); 2764 viewBugsItem.setEnabled(false); 2765 viewBugsItem.setSelected(false); 2766 } else { 2767 editMenu.setEnabled(false); 2768 viewProjectItem.setEnabled(false); 2769 viewProjectItem.setSelected(false); 2770 viewBugsItem.setEnabled(false); 2771 viewBugsItem.setSelected(false); 2772 setView("EmptyPanel"); 2773 } 2774 updateTitle(project); 2775 ableEditMenu(); 2776 } 2777 2778 private void updateTitle(Project project) { 2779 if (project == null) 2780 this.setTitle(L10N.getLocalString("dlg.noproject_lbl", "FindBugs - no project")); 2781 else 2782 this.setTitle("FindBugs - " + project.toString()); 2783 } 2784 2785 2793 private boolean saveProject(Project project, String dialogTitle) { 2794 return saveProject(project, dialogTitle, false); 2795 } 2796 2797 2807 private boolean saveProject(Project project, String dialogTitle, boolean chooseFilename) { 2808 boolean useRelativePaths; 2809 try { 2810 if (project == null) 2811 return true; 2812 2813 File file; 2814 String fileName = project.getProjectFileName(); 2815 2816 if (!fileName.startsWith("<") && !chooseFilename) { 2817 file = new File (fileName); 2818 useRelativePaths = project.getOption( Project.RELATIVE_PATHS ); 2819 } else { 2820 JRadioButton relativePaths = new JRadioButton (L10N.getLocalString("msg.userelativepaths_txt", "Use Relative Paths")); 2821 relativePaths.setSelected(project.getOption(Project.RELATIVE_PATHS)); 2822 JFileChooser chooser = createFileChooser(relativePaths); 2823 chooser.setFileFilter(projectFileFilter); 2824 int result = chooseFile(chooser, dialogTitle); 2825 if (result == JFileChooser.CANCEL_OPTION) 2826 return false; 2827 file = chooser.getSelectedFile(); 2828 fileName = Project.transformFilename(file.getPath()); 2829 file = new File (fileName); 2830 useRelativePaths = relativePaths.isSelected(); 2831 } 2832 2833 project.write(file.getPath(), useRelativePaths, file.getParent()); 2834 logger.logMessage(Logger.INFO, "Project saved"); 2835 project.setProjectFileName(file.getPath()); 2836 2837 UserPreferences prefs = UserPreferences.getUserPreferences(); 2838 prefs.useProject(file.getPath()); 2839 prefs.read(); 2840 rebuildRecentProjectsMenu(); 2841 2842 updateTitle(project); 2843 2844 return true; 2845 } catch (IOException e) { 2846 logger.logMessage(Logger.ERROR, "Could not save project: " + e.toString()); 2847 JOptionPane.showMessageDialog(this, "Error saving project: " + e.toString(), 2848 "Error", JOptionPane.ERROR_MESSAGE); 2849 return false; 2850 } 2851 } 2852 2853 2861 private boolean closeProjectHook(Project project, String savePromptTitle) { 2862 if (project == null || !project.isModified()) 2863 return true; 2864 2865 int option = JOptionPane.showConfirmDialog(this, L10N.getLocalString("msg.saveprojectquery_txt", "Save Project?"), savePromptTitle, 2867 JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); 2868 2869 if (option == JOptionPane.CANCEL_OPTION) 2870 return false; 2871 else if (option == JOptionPane.YES_OPTION) { 2872 boolean result = saveProject(project, "Save Project"); 2873 if (result) 2874 JOptionPane.showMessageDialog(this, "Project was successfully saved."); 2875 return result; 2876 } else 2877 return true; 2878 } 2879 2880 2885 private void synchProject(Project project) { 2886 jarNameTextField.setText(""); 2888 srcDirTextField.setText(""); 2889 classpathEntryTextField.setText(""); 2890 2891 2893 DefaultListModel jarListModel = (DefaultListModel ) jarFileList.getModel(); 2894 jarListModel.clear(); 2895 for (int i = 0; i < project.getFileCount(); ++i) { 2896 jarListModel.addElement(project.getFile(i)); 2897 } 2898 2899 DefaultListModel srcDirListModel = (DefaultListModel ) sourceDirList.getModel(); 2900 srcDirListModel.clear(); 2901 for (int i = 0; i < project.getNumSourceDirs(); ++i) { 2902 srcDirListModel.addElement(project.getSourceDir(i)); 2903 } 2904 2905 DefaultListModel classpathEntryListModel = (DefaultListModel ) classpathEntryList.getModel(); 2906 classpathEntryListModel.clear(); 2907 for (int i = 0; i < project.getNumAuxClasspathEntries(); ++i) { 2908 classpathEntryListModel.addElement(project.getAuxClasspathEntry(i)); 2909 } 2910 } 2911 2912 2917 private void synchAnalysisRun(AnalysisRun analysisRun) { 2918 for (int i = 0; i < GROUP_BY_ORDER_LIST.length; ++i) { 2920 DefaultMutableTreeNode bugRootNode = new DefaultMutableTreeNode (); 2921 DefaultTreeModel bugTreeModel = new DefaultTreeModel (bugRootNode); 2922 2923 String groupByOrder = GROUP_BY_ORDER_LIST[i]; 2924 analysisRun.setTreeModel(groupByOrder, bugTreeModel); 2925 populateAnalysisRunTreeModel(analysisRun, groupByOrder); 2926 if (i < bugTreeList.length) 2927 bugTreeList[i].setModel(bugTreeModel); 2928 } 2929 2930 currentAnalysisRun = analysisRun; 2931 2932 setSummary(analysisRun.getSummary()); 2934 setView("BugTree"); 2935 } 2936 2937 private void setSummary(String summaryXML) { 2938 bugSummaryEditorPane.setContentType("text/html"); 2939 2953 StringReader reader = null; 2954 try { 2955 if (summaryXML != null) { 2956 reader = new StringReader (summaryXML); bugSummaryEditorPane.read(reader, "html summary"); 2958 } else { 2959 bugSummaryEditorPane.setText(""); 2960 } 2961 } catch (IOException e) { 2962 bugSummaryEditorPane.setText("Could not set summary: " + e.getMessage()); 2963 logger.logMessage(Logger.WARNING, e.getMessage()); 2964 } finally { 2965 if (reader != null) 2966 reader.close(); } 2968 2969 } 2970 2971 2974 private void populateAnalysisRunTreeModel(AnalysisRun analysisRun, final String groupBy) { 2975 2977 Cursor orig = this.getCursor(); 2979 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 2980 2981 final DefaultTreeModel bugTreeModel = analysisRun.getTreeModel(groupBy); 2982 final DefaultMutableTreeNode bugRootNode = (DefaultMutableTreeNode ) bugTreeModel.getRoot(); 2983 2984 bugRootNode.removeAllChildren(); 2986 2987 TreeSet <BugInstance> sortedCollection = new TreeSet <BugInstance>(getBugInstanceComparator(groupBy)); 2990 for (BugInstance bugInstance : analysisRun.getBugInstances()) { 2991 if (getFilterSettings().displayWarning(bugInstance)) 2992 sortedCollection.add(bugInstance); 2993 } 2994 2995 Grouper.Callback<BugInstance> callback = new Grouper.Callback<BugInstance>() { 2998 private BugInstanceGroup currentGroup; 2999 private DefaultMutableTreeNode currentGroupNode; 3000 3001 public void startGroup(BugInstance member) { 3002 String groupName; 3003 if (groupBy == GROUP_BY_CLASS) 3004 groupName = member.getPrimaryClass().getClassName(); 3005 else if (groupBy == GROUP_BY_PACKAGE) { 3006 groupName = member.getPrimaryClass().getPackageName(); 3007 if (groupName.equals("")) 3008 groupName = "Unnamed package"; 3009 } else if (groupBy == GROUP_BY_BUG_TYPE) { 3010 String desc = member.toString(); 3011 String shortBugType = desc.substring(0, desc.indexOf(':')); 3012 String bugTypeDescription = I18N.instance().getBugTypeDescription(shortBugType); 3013 groupName = shortBugType + ": " + bugTypeDescription; 3014 } else if (groupBy == GROUP_BY_BUG_CATEGORY) { 3015 BugPattern pattern = member.getBugPattern(); 3016 if (pattern == null) { 3017 if (FindBugs.DEBUG) 3018 System.out.println("Unknown bug pattern " + member.getType()); 3019 groupName = "Unknown category"; 3020 } else { 3021 groupName = I18N.instance().getBugCategoryDescription(pattern.getCategory()); 3022 } 3023 } else 3024 throw new IllegalStateException ("Unknown sort order: " + groupBy); 3025 currentGroup = new BugInstanceGroup(groupBy, groupName); 3026 currentGroupNode = new DefaultMutableTreeNode (currentGroup); 3027 bugTreeModel.insertNodeInto(currentGroupNode, bugRootNode, bugRootNode.getChildCount()); 3028 3029 insertIntoGroup(member); 3030 } 3031 3032 public void addToGroup(BugInstance member) { 3033 insertIntoGroup(member); 3034 } 3035 3036 private void insertIntoGroup(BugInstance member) { 3037 int count = currentGroup.getMemberCount(); 3038 currentGroup.incrementMemberCount(); 3039 BugTreeNode bugNode = new BugTreeNode(member); 3040 if (BUG_COUNT) 3041 bugNode.setCount(count); 3042 bugTreeModel.insertNodeInto(bugNode, currentGroupNode, currentGroupNode.getChildCount()); 3043 3044 Iterator <BugAnnotation> j = member.annotationIterator(); 3046 while (j.hasNext()) { 3047 BugAnnotation annotation = j.next(); 3048 DefaultMutableTreeNode annotationNode = new DefaultMutableTreeNode (annotation); 3049 bugTreeModel.insertNodeInto(annotationNode, bugNode, bugNode.getChildCount()); 3050 } 3051 3052 } 3053 }; 3054 3055 Grouper<BugInstance> grouper = new Grouper<BugInstance>(callback); 3057 Comparator <BugInstance> groupComparator = getGroupComparator(groupBy); 3058 grouper.group(sortedCollection, groupComparator); 3059 3060 bugTreeModel.nodeStructureChanged(bugRootNode); 3062 3063 this.setCursor(orig); 3065 } 3066 3067 3070 private Comparator <BugInstance> getBugInstanceComparator(String sortOrder) { 3071 if (sortOrder.equals(GROUP_BY_CLASS)) 3072 return bugInstanceByClassComparator; 3073 else if (sortOrder.equals(GROUP_BY_PACKAGE)) 3074 return bugInstanceByPackageComparator; 3075 else if (sortOrder.equals(GROUP_BY_BUG_TYPE)) 3076 return bugInstanceByTypeComparator; 3077 else if (sortOrder.equals(GROUP_BY_BUG_CATEGORY)) 3078 return bugInstanceByCategoryComparator; 3079 else 3080 throw new IllegalArgumentException ("Bad sort order: " + sortOrder); 3081 } 3082 3083 3086 private Comparator <BugInstance> getGroupComparator(String groupBy) { 3087 if (groupBy.equals(GROUP_BY_CLASS)) { 3088 return bugInstanceClassComparator; 3089 } else if (groupBy.equals(GROUP_BY_PACKAGE)) { 3090 return bugInstancePackageComparator; 3091 } else if (groupBy.equals(GROUP_BY_BUG_TYPE)) { 3092 return bugInstanceTypeComparator; 3093 } else if (groupBy.equals(GROUP_BY_BUG_CATEGORY)) { 3094 return bugInstanceCategoryComparator; 3095 } else 3096 throw new IllegalArgumentException ("Bad sort order: " + groupBy); 3097 } 3098 3099 3102 private void setView(String viewName) { 3103 viewPanelLayout.show(viewPanel, viewName); 3105 boolean viewingBugs = viewName.equals("BugTree"); 3106 if (viewingBugs) 3107 checkBugDetailsVisibility(); 3108 3109 viewProjectItem.setSelected(!viewingBugs); 3110 if (viewingBugs) 3111 viewBugsItem.setEnabled(true); 3112 viewBugsItem.setSelected(viewingBugs); 3113 3114 currentView = viewName; 3115 ableEditMenu(); 3116 } 3117 3118 3121 private String getView() { 3122 return currentView; 3123 } 3124 3125 3129 private void addJarToList() { 3130 String dirs = jarNameTextField.getText(); 3131 String [] jarDirs = parsePaths(dirs); 3132 for (String jarFile : jarDirs) { 3133 if (!jarFile.equals("")) { 3134 addJarToProject(jarFile); 3135 } 3136 } 3137 jarNameTextField.setText(""); 3138 } 3139 3140 3145 private void addSrcToProject(String srcFile) { 3146 Project project = getCurrentProject(); 3147 if (project.addSourceDir(srcFile)) { 3148 DefaultListModel listModel = (DefaultListModel ) sourceDirList.getModel(); 3149 listModel.addElement(srcFile); 3150 } 3151 } 3152 3153 3158 private void addJarToProject(String jarFile) { 3159 Project project = getCurrentProject(); 3160 if (project.addFile(jarFile)) { 3161 DefaultListModel listModel = (DefaultListModel ) jarFileList.getModel(); 3162 listModel.addElement(jarFile); 3163 } 3164 } 3165 3166 3172 private String [] parsePaths(String paths) { 3173 return paths.split(SystemProperties.getProperty("path.separator")); 3174 } 3175 3176 3180 private void addSourceDirToList() { 3181 String dirs = srcDirTextField.getText(); 3182 String [] sourceDirs = parsePaths(dirs); 3183 for (String sourceDir : sourceDirs) { 3184 if (!sourceDir.equals("")) { 3185 Project project = getCurrentProject(); 3186 if (project.addSourceDir(sourceDir)) { 3187 DefaultListModel listModel = (DefaultListModel ) sourceDirList.getModel(); 3188 listModel.addElement(sourceDir); 3189 } 3190 } 3191 } 3192 srcDirTextField.setText(""); 3193 } 3194 3195 3199 private void addClasspathEntryToList() { 3200 String dirs = classpathEntryTextField.getText(); 3201 String [] classDirs = parsePaths(dirs); 3202 for (String classpathEntry : classDirs) { 3203 if (!classpathEntry.equals("")) { 3204 addClasspathEntryToProject(classpathEntry); 3205 } 3206 } 3207 classpathEntryTextField.setText(""); 3208 } 3209 3210 3215 private void addClasspathEntryToProject(String classpathEntry) { 3216 Project project = getCurrentProject(); 3217 if (project.addAuxClasspathEntry(classpathEntry)) { 3218 DefaultListModel listModel = (DefaultListModel ) classpathEntryList.getModel(); 3219 listModel.addElement(classpathEntry); 3220 } 3221 } 3222 3223 3227 private void synchBugInstance() { 3228 BugInstance selected = getCurrentBugInstance(); 3230 if (selected == null) 3231 return; 3232 3233 if (!viewBugDetailsItem.isSelected()) 3236 return; 3237 3238 JTree bugTree = getCurrentBugTree(); 3244 3245 if (bugTree == null) { 3247 return; 3248 } 3249 SourceLineAnnotation srcLine = null; 3250 TreePath selPath = bugTree.getSelectionPath(); 3251 if (selPath != null) { 3252 Object leaf = ((DefaultMutableTreeNode ) selPath.getLastPathComponent()).getUserObject(); 3253 if (leaf instanceof SourceLineAnnotation) 3254 srcLine = (SourceLineAnnotation) leaf; 3255 3256 if (srcLine == null && leaf instanceof MethodAnnotation) 3257 srcLine = ((MethodAnnotation) leaf).getSourceLines(); 3258 3259 if (srcLine == null) 3260 srcLine = selected.getPrimarySourceLineAnnotation(); 3261 } 3262 3263 if (srcLine == null || srcLine != currentSourceLineAnnotation) { 3265 Project project = getCurrentProject(); 3266 AnalysisRun analysisRun = getCurrentAnalysisRun(); 3267 if (project == null) throw new IllegalStateException ("null project!"); 3268 if (analysisRun == null) throw new IllegalStateException ("null analysis run!"); 3269 try { 3270 boolean success = viewSource(project, analysisRun, srcLine); 3271 sourceTextArea.setEnabled(success); 3272 if (!success) 3273 sourceTextArea.setText("No source line information for this bug"); 3274 } catch (IOException e) { 3275 sourceTextArea.setText("Could not find source: " + e.getMessage()); 3276 logger.logMessage(Logger.WARNING, e.getMessage()); 3277 } 3278 3279 currentSourceLineAnnotation = srcLine; 3280 } 3281 3282 showBugInfo(selected); 3284 3285 synchBugAnnotation(selected); 3287 3288 currentBugInstance = selected; 3290 } 3291 3292 private static final int SELECTION_VOFFSET = 2; 3293 3294 3303 private boolean viewSource(Project project, AnalysisRun analysisRun, final SourceLineAnnotation srcLine) 3304 throws IOException { 3305 sourceTextArea.setText(""); 3307 3308 if (srcLine == null) 3313 return false; 3314 3315 sourceFinder.setSourceBaseList(project.getSourceDirList()); 3317 String sourceFile; 3318 InputStream in; 3319 try { 3320 SourceFile source = sourceFinder.findSourceFile(srcLine); 3321 sourceFile = source.getFullFileName(); 3322 in = source.getInputStream(); 3323 } catch (IOException e) { 3324 logger.logMessage(Logger.WARNING, "No source file for class " + srcLine.getClassName()); 3325 return false; 3326 } 3327 3328 BufferedReader reader = null; 3329 3330 try { 3331 reader = new BufferedReader (new InputStreamReader (in)); 3332 sourceTextArea.read(reader, sourceFile); } finally { 3334 if (reader != null) 3335 reader.close(); 3336 } 3337 3338 if (srcLine.isUnknown()) { 3339 3341 return true; 3344 } 3345 3346 SwingUtilities.invokeLater(new Runnable () { 3357 public void run() { 3358 try { 3362 int startLine = srcLine.getStartLine() - 1; 3363 int endLine = srcLine.getEndLine(); 3364 3365 JViewport viewport = sourceTextAreaScrollPane.getViewport(); 3370 Rectangle viewportRect = viewport.getViewRect(); 3371 int topRow = sourceTextArea.getLineOfOffset(sourceTextArea.viewToModel(viewportRect.getLocation())); 3372 int bottomRow = sourceTextArea.getLineOfOffset(sourceTextArea.viewToModel(new Point (viewportRect.x, (viewportRect.y + viewportRect.height) - 1))); 3373 int numRowsVisible = bottomRow - topRow; 3374 3375 int viewLine = Math.max(startLine - (numRowsVisible > 0 ? numRowsVisible / 2 : 0), 0); 3378 int viewBegin = sourceTextArea.getLineStartOffset(viewLine); 3379 Rectangle viewRect = sourceTextArea.modelToView(viewBegin); 3380 viewport.setViewPosition(new Point (viewRect.x, viewRect.y)); 3381 3382 int selBegin = sourceTextArea.getLineStartOffset(startLine); 3384 int selEnd = sourceTextArea.getLineStartOffset(endLine); 3385 sourceTextArea.select(selBegin, selEnd); 3386 sourceTextArea.getCaret().setSelectionVisible(true); 3387 } catch (javax.swing.text.BadLocationException e) { 3388 logger.logMessage(Logger.ERROR, e.toString()); 3389 } 3390 } 3391 }); 3392 3393 return true; 3394 } 3395 3396 3401 private void showBugInfo(BugInstance bugInstance) { 3402 String bugDetailsKey = bugInstance.getType(); 3404 if (bugDetailsKey.equals(currentBugDetailsKey)) 3405 return; 3406 3407 String html = I18N.instance().getDetailHTML(bugDetailsKey); 3409 bugDescriptionEditorPane.setContentType("text/html"); 3410 currentBugDetailsKey = bugDetailsKey; 3411 3426 StringReader reader = new StringReader (html); try { 3428 bugDescriptionEditorPane.read(reader, "html bug description"); 3429 } catch (IOException e) { 3430 bugDescriptionEditorPane.setText("Could not find bug description: " + e.getMessage()); 3431 logger.logMessage(Logger.WARNING, e.getMessage()); 3432 } finally { 3433 reader.close(); } 3435 } 3436 3437 3443 private void synchBugAnnotation(BugInstance selected) { 3444 if (currentBugInstance != null) { 3445 String text = annotationTextArea.getText(); 3446 currentBugInstance.setAnnotationText(text); 3447 } 3448 3449 String userAnnotation = selected.getAnnotationText(); 3451 if (userAnnotation==null || userAnnotation.length()==0) { 3452 annotationTextArea.setText(""); 3454 return; 3455 } 3456 StringReader reader = new StringReader (userAnnotation); try { 3458 annotationTextArea.read(reader, "user annotation"); 3459 } catch (IOException e) { 3460 annotationTextArea.setText("Could not find user annotation: " + e.getMessage()); 3461 logger.logMessage(Logger.WARNING, e.getMessage()); 3462 } finally { 3463 reader.close(); } 3465 } 3466 3467 3474 private void toggleBugCategory(JCheckBoxMenuItem checkBox) { 3475 int index = 0; 3476 3477 while (index < bugCategoryCheckBoxList.length) { 3478 if (bugCategoryCheckBoxList[index] == checkBox) 3479 break; 3480 ++index; 3481 } 3482 3483 if (index == bugCategoryCheckBoxList.length) { 3484 error("Could not find bug category checkbox"); 3485 return; 3486 } 3487 3488 boolean selected = checkBox.isSelected(); 3489 String bugCategory = bugCategoryList[index]; 3490 3491 if (selected) { 3492 getFilterSettings().addCategory(bugCategory); 3493 } else { 3494 getFilterSettings().removeCategory(bugCategory); 3495 } 3496 3497 if (currentAnalysisRun != null) { 3498 synchAnalysisRun(currentAnalysisRun); 3499 } 3500 } 3501 3502 3505 3506 3509 void about() { 3510 AboutDialog dialog = new AboutDialog(this, logger, true); 3511 dialog.setSize(600, 554); 3512 dialog.setLocationRelativeTo(null); dialog.setVisible(true); 3514 } 3515 3516 3519 @SuppressWarnings ("DM_EXIT") 3520 void exitFindBugs() { 3521 UserPreferences.getUserPreferences().write(); 3524 System.exit(0); 3525 } 3526 3527 3533 private JFileChooser createFileChooser() { 3534 return new JFileChooser (currentDirectory); 3535 } 3536 3537 3544 private JFileChooser createFileChooser(final JComponent extraComp) { 3545 return new JFileChooser (currentDirectory) { 3546 private static final long serialVersionUID = 1L; 3547 3548 @Override 3549 protected JDialog createDialog(Component parent) throws HeadlessException { 3550 JDialog dialog = super.createDialog(parent); 3551 dialog.getContentPane().add(extraComp, BorderLayout.SOUTH); 3552 dialog.setLocation(300, 200); 3553 dialog.setResizable(false); 3554 return dialog; 3555 } 3556 }; 3557 } 3558 3559 3567 private int chooseFile(JFileChooser dialog, String dialogTitle) { 3568 int outcome = dialog.showDialog(this, dialogTitle); 3569 return updateCurrentDirectoryFromDialog(dialog, outcome); 3570 } 3571 3572 3579 private int chooseFileToOpen(JFileChooser dialog) { 3580 int outcome = dialog.showOpenDialog(this); 3581 return updateCurrentDirectoryFromDialog(dialog, outcome); 3582 } 3583 3584 private int updateCurrentDirectoryFromDialog(JFileChooser dialog, int outcome) { 3585 if (outcome != JFileChooser.CANCEL_OPTION) { 3586 File selectedFile = dialog.getSelectedFile(); 3587 currentDirectory = selectedFile.getParentFile(); 3588 } 3589 return outcome; 3590 } 3591 3592 3595 public Logger getLogger() { 3596 return logger; 3597 } 3598 3599 3602 public void error(String message) { 3603 JOptionPane.showMessageDialog(this, message, "Error", JOptionPane.ERROR_MESSAGE); 3604 } 3605 3606 3611 public void writeToLog(String message) { 3612 } 3615 3616 3621 public File verifyFileSelection(File pickedFile) { 3622 if (pickedFile.exists()) 3623 return pickedFile; 3624 3625 File parent = pickedFile.getParentFile(); 3626 if ((parent != null) && parent.getName().equals(pickedFile.getName())) 3627 return parent; 3628 3629 return pickedFile; 3631 } 3632 3633 3636 public ProjectFilterSettings getFilterSettings() { 3637 return UserPreferences.getUserPreferences().getFilterSettings(); 3638 } 3639 3640 3643 public int getPriorityThreshold() { 3644 return getFilterSettings().getMinPriorityAsInt(); 3645 } 3646 3647 3652 public AnalysisFeatureSetting[] getSettingList() { 3653 return settingList; 3654 } 3655 3656 3659 3660 private static class SwingCommandLine extends FindBugsCommandLine { 3661 public SwingCommandLine() { 3662 addSwitch("-debug", "enable debug output"); 3663 addSwitchWithOptionalExtraPart("-look", "plastic|gtk|native", "set look and feel"); 3664 addOption("-project", "project file", "load given project"); 3665 addOption("-loadbugs", "bugs xml filename", "load given bugs xml file"); 3666 } 3667 3668 String bugsFilename = ""; 3669 3670 public String getBugsFilename() { 3671 return bugsFilename; 3672 } 3673 3674 @Override 3676 protected void handleOption(String option, String optionExtraPart) { 3677 if (option.equals("-debug")) { 3678 System.out.println("Setting findbugs.debug=true"); 3679 System.setProperty("findbugs.debug", "true"); 3680 } else if (option.equals("-look")) { 3681 String arg = optionExtraPart; 3682 3683 String theme = null; 3684 if (arg.equals("plastic")) { 3685 theme = "com.jgoodies.plaf.plastic.PlasticXPLookAndFeel"; 3690 } else if (arg.equals("gtk")) { 3691 theme = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; 3692 } else if (arg.equals("native")) { 3693 theme = UIManager.getSystemLookAndFeelClassName(); 3694 } else { 3695 System.err.println("Style '" + arg + "' not supported"); 3696 } 3697 3698 if (theme != null) { 3699 try { 3700 UIManager.setLookAndFeel(theme); 3701 } catch (Exception e) { 3702 System.err.println("Couldn't load " + arg + 3703 " look and feel: " + e.toString()); 3704 } 3705 } 3706 } else { 3707 super.handleOption(option, optionExtraPart); 3708 } 3709 } 3710 3711 @Override 3713 protected void handleOptionWithArgument(String option, String argument) throws IOException { 3714 if (option.equals("-loadbugs")) { 3715 bugsFilename = argument; 3716 } else { 3717 super.handleOptionWithArgument(option, argument); 3718 } 3719 } 3720 } 3721 3722 3728 public static void main(String args[]) throws IOException { 3729 Project project = null; 3730 3731 SwingCommandLine commandLine = new SwingCommandLine(); 3732 try { 3733 commandLine.parse(args); 3734 } catch (IllegalArgumentException e) { 3735 System.err.println("Error: " + e.getMessage()); 3736 showSynopsis(); 3737 ShowHelp.showGeneralOptions(); 3738 showCommandLineOptions(); 3739 System.exit(1); 3740 } catch (HelpRequestedException e) { 3741 showSynopsis(); 3742 ShowHelp.showGeneralOptions(); 3743 showCommandLineOptions(); 3744 System.exit(1); 3745 } 3746 3747 if (commandLine.getProject().getFileCount() > 0) { 3748 project = commandLine.getProject(); 3749 } 3750 3751 3760 DetectorFactoryCollection.instance(); 3762 3763 FindBugsFrame frame = new FindBugsFrame(); 3764 3765 if (project != null) { 3766 frame.setProject(project); 3767 } else if (commandLine.getBugsFilename().length() > 0) { 3768 try { 3769 File bugsFile = new File (commandLine.getBugsFilename()); 3770 frame.loadBugsFromFile(bugsFile); 3771 } catch (Exception e) { 3772 System.err.println("Error: " + e.getMessage()); 3773 } 3774 } else if (SystemProperties.getProperty("findbugs.loadBugsFromURL") != null) { 3775 try { 3777 String urlspec = SystemProperties.getProperty("findbugs.loadBugsFromURL"); 3778 frame.loadBugsFromURL(urlspec); 3779 } catch (Exception e) { 3780 System.err.println("Error: " + e.getMessage()); 3781 } 3782 } 3783 3784 if (commandLine.getSettingList() != null) { 3785 frame.settingList = commandLine.getSettingList(); 3786 if (Arrays.equals(frame.settingList,FindBugs.MIN_EFFORT)) 3787 frame.minEffortItem.setSelected(true); 3788 else if (Arrays.equals(frame.settingList, FindBugs.MAX_EFFORT)) 3789 frame.maxEffortItem.setSelected(true); 3790 } 3791 3792 frame.setSize(800, 600); 3793 frame.setLocationRelativeTo(null); frame.setVisible(true); 3795 } 3796 3797 public static void showCommandLineOptions() { 3798 System.out.println("GUI options:"); 3799 new SwingCommandLine().printUsage(System.out); 3800 } 3801 3802 public static void showSynopsis() { 3803 System.out.println("Usage: findbugs [general options] [gui options]"); 3804 } 3805 3806 3809 3810 private javax.swing.JMenuItem aboutItem; 3812 private javax.swing.JButton addClasspathEntryButton; 3813 private javax.swing.JButton addJarButton; 3814 private javax.swing.JButton addSourceDirButton; 3815 private javax.swing.JTextArea annotationTextArea; 3816 private javax.swing.JScrollPane annotationTextAreaScrollPane; 3817 private javax.swing.JButton browseClasspathEntryButton; 3818 private javax.swing.JButton browseJarButton; 3819 private javax.swing.JButton browseSrcDirButton; 3820 private javax.swing.JEditorPane bugDescriptionEditorPane; 3821 private javax.swing.JScrollPane bugDescriptionScrollPane; 3822 private javax.swing.JTabbedPane bugDetailsTabbedPane; 3823 private javax.swing.JEditorPane bugSummaryEditorPane; 3824 private javax.swing.JSplitPane bugTreeBugDetailsSplitter; 3825 private javax.swing.JPanel bugTreePanel; 3826 private javax.swing.JTree byBugCategoryBugTree; 3827 private javax.swing.JScrollPane byBugCategoryScrollPane; 3828 private javax.swing.JTree byBugTypeBugTree; 3829 private javax.swing.JScrollPane byBugTypeScrollPane; 3830 private javax.swing.JTree byClassBugTree; 3831 private javax.swing.JScrollPane byClassScrollPane; 3832 private javax.swing.JTree byPackageBugTree; 3833 private javax.swing.JScrollPane byPackageScrollPane; 3834 private javax.swing.JScrollPane bySummary; 3835 private javax.swing.JButton classpathDownButton; 3836 private javax.swing.JLabel classpathEntryLabel; 3837 private javax.swing.JList classpathEntryList; 3838 private javax.swing.JLabel classpathEntryListLabel; 3839 private javax.swing.JScrollPane classpathEntryListScrollPane; 3840 private javax.swing.JTextField classpathEntryTextField; 3841 private javax.swing.JButton classpathUpButton; 3842 private javax.swing.JMenuItem closeProjectItem; 3843 private javax.swing.JMenuItem configureDetectorsItem; 3844 private javax.swing.JMenuItem copyItem; 3845 private javax.swing.JMenuItem cutItem; 3846 private javax.swing.JMenu editMenu; 3847 private javax.swing.JLabel editProjectLabel; 3848 private javax.swing.JPanel editProjectPanel; 3849 private javax.swing.ButtonGroup effortButtonGroup; 3850 private javax.swing.JMenu effortMenu; 3851 private javax.swing.JPanel emptyPanel; 3852 private javax.swing.JMenuItem exitItem; 3853 private javax.swing.JRadioButtonMenuItem expPriorityButton; 3854 private javax.swing.JMenu fileMenu; 3855 private javax.swing.JMenu filterWarningsMenu; 3856 private javax.swing.JButton findBugsButton; 3857 private javax.swing.JCheckBoxMenuItem fullDescriptionsItem; 3858 private javax.swing.JTabbedPane groupByTabbedPane; 3859 private javax.swing.JLabel growBoxSpacer; 3860 private javax.swing.JMenu helpMenu; 3861 private javax.swing.JRadioButtonMenuItem highPriorityButton; 3862 private javax.swing.JPanel jPanel1; 3863 private javax.swing.JSeparator jSeparator1; 3864 private javax.swing.JSeparator jSeparator10; 3865 private javax.swing.JSeparator jSeparator11; 3866 private javax.swing.JSeparator jSeparator2; 3867 private javax.swing.JSeparator jSeparator3; 3868 private javax.swing.JSeparator jSeparator4; 3869 private javax.swing.JSeparator jSeparator5; 3870 private javax.swing.JSeparator jSeparator6; 3871 private javax.swing.JSeparator jSeparator7; 3872 private javax.swing.JSeparator jSeparator8; 3873 private javax.swing.JSeparator jSeparator9; 3874 private javax.swing.JLabel jarFileLabel; 3875 private javax.swing.JList jarFileList; 3876 private javax.swing.JLabel jarFileListLabel; 3877 private javax.swing.JScrollPane jarFileListScrollPane; 3878 private javax.swing.JTextField jarNameTextField; 3879 private javax.swing.JMenuItem loadBugsItem; 3880 private javax.swing.JLabel logoLabel; 3881 private javax.swing.JRadioButtonMenuItem lowPriorityButton; 3882 private javax.swing.JCheckBoxMenuItem maxEffortItem; 3883 private javax.swing.JRadioButtonMenuItem mediumPriorityButton; 3884 private javax.swing.JCheckBoxMenuItem minEffortItem; 3885 private javax.swing.JMenuItem newProjectItem; 3886 private javax.swing.JCheckBoxMenuItem normalEffortItem; 3887 private javax.swing.JMenuItem openProjectItem; 3888 private javax.swing.JMenuItem pasteItem; 3889 private javax.swing.ButtonGroup priorityButtonGroup; 3890 private javax.swing.JMenu recentProjectsMenu; 3891 private javax.swing.JMenuItem reloadProjectItem; 3892 private javax.swing.JButton removeClasspathEntryButton; 3893 private javax.swing.JButton removeJarButton; 3894 private javax.swing.JButton removeSrcDirButton; 3895 private javax.swing.JPanel reportPanel; 3896 private javax.swing.JMenuItem saveBugsItem; 3897 private javax.swing.JMenuItem saveProjectAsItem; 3898 private javax.swing.JMenuItem saveProjectItem; 3899 private javax.swing.JMenuItem selectAllItem; 3900 private javax.swing.JMenu settingsMenu; 3901 private javax.swing.JLabel sourceDirLabel; 3902 private javax.swing.JList sourceDirList; 3903 private javax.swing.JLabel sourceDirListLabel; 3904 private javax.swing.JScrollPane sourceDirListScrollPane; 3905 private javax.swing.JButton sourceDownButton; 3906 private javax.swing.JTextArea sourceTextArea; 3907 private LineNumberer sourceLineNumberer; 3908 private javax.swing.JScrollPane sourceTextAreaScrollPane; 3909 private javax.swing.JButton sourceUpButton; 3910 private javax.swing.JTextField srcDirTextField; 3911 private javax.swing.JMenuBar theMenuBar; 3912 private javax.swing.JLabel urlLabel; 3913 private javax.swing.JCheckBoxMenuItem viewBugDetailsItem; 3914 private javax.swing.JRadioButtonMenuItem viewBugsItem; 3915 private javax.swing.JMenu viewMenu; 3916 private javax.swing.JPanel viewPanel; 3917 private javax.swing.JRadioButtonMenuItem viewProjectItem; 3918 3920 private Logger logger; 3922 private CardLayout viewPanelLayout; 3923 private String currentView; 3924 private File currentDirectory; 3925 private Project currentProject; 3926 private JTree [] bugTreeList; 3927 private AnalysisRun currentAnalysisRun; 3928 private SourceFinder sourceFinder = new SourceFinder(); 3929 private BugInstance currentBugInstance; private SourceLineAnnotation currentSourceLineAnnotation; private String currentBugDetailsKey; 3932 private JCheckBoxMenuItem [] bugCategoryCheckBoxList; 3933 private String [] bugCategoryList; 3934 private AnalysisFeatureSetting[] settingList = FindBugs.DEFAULT_EFFORT; 3935 3936 private final static boolean MAC_OS_X = SystemProperties.getProperty("os.name").toLowerCase().startsWith("mac os x"); 3938 3939 private static int getMenuMask() { 3940 return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); 3941 } 3942 3943} 3944 | Popular Tags |