1 19 20 package edu.umd.cs.findbugs.gui2; 21 22 import java.awt.BorderLayout ; 23 import java.awt.Component ; 24 import java.awt.Container ; 25 import java.awt.GridBagConstraints ; 26 import java.awt.GridBagLayout ; 27 import java.awt.Insets ; 28 import java.awt.event.ActionEvent ; 29 import java.awt.event.ActionListener ; 30 import java.awt.event.ItemEvent ; 31 import java.awt.event.ItemListener ; 32 import java.awt.event.KeyEvent ; 33 import java.awt.event.KeyListener ; 34 import java.io.IOException ; 35 import java.util.ArrayList ; 36 import java.util.Arrays ; 37 import java.util.Collections ; 38 import java.util.Iterator ; 39 import java.util.List ; 40 import java.util.concurrent.ExecutionException ; 41 42 import javax.imageio.ImageIO ; 43 import javax.swing.AbstractAction ; 44 import javax.swing.Box ; 45 import javax.swing.BoxLayout ; 46 import javax.swing.JButton ; 47 import javax.swing.JCheckBox ; 48 import javax.swing.JComboBox ; 49 import javax.swing.JFrame ; 50 import javax.swing.JLabel ; 51 import javax.swing.JOptionPane ; 52 import javax.swing.JPanel ; 53 import javax.swing.JScrollPane ; 54 import javax.swing.JTabbedPane ; 55 import javax.swing.JTable ; 56 import javax.swing.SwingConstants ; 57 import javax.swing.event.ChangeEvent ; 58 import javax.swing.event.ChangeListener ; 59 import javax.swing.table.DefaultTableColumnModel ; 60 import javax.swing.table.DefaultTableModel ; 61 import javax.swing.table.JTableHeader ; 62 import javax.swing.tree.TreeModel ; 63 import javax.swing.tree.TreePath ; 64 65 import org.dom4j.DocumentException; 66 67 import edu.umd.cs.findbugs.BugInstance; 68 import edu.umd.cs.findbugs.BugPattern; 69 import edu.umd.cs.findbugs.DetectorFactoryCollection; 70 import edu.umd.cs.findbugs.Project; 71 import edu.umd.cs.findbugs.SortedBugCollection; 72 import edu.umd.cs.findbugs.gui2.BugAspects.StringPair; 73 74 75 78 79 85 @SuppressWarnings ("serial") 86 public class PreferencesFrame extends FBDialog { 87 88 91 92 private static PreferencesFrame instance; 93 private CheckBoxList filterCheckBoxList = new CheckBoxList(); 94 private UneditableTableModel suppressionTableModel; 95 private JButton addButton; 96 private JButton unsuppressButton; 97 98 JButton removeButton; 99 JButton removeAllButton; 100 boolean frozen=false; 101 public static PreferencesFrame getInstance() 102 { 103 if(instance == null) 105 instance = new PreferencesFrame(); 106 107 return instance; 108 } 109 110 private PreferencesFrame(){ 111 setTitle(edu.umd.cs.findbugs.L10N.getLocalString("dlg.fil_sup_ttl", "Filters/Suppressions")); 112 setModal(true); 113 114 JTabbedPane mainTabPane = new JTabbedPane (); 115 116 mainTabPane.add(edu.umd.cs.findbugs.L10N.getLocalString("pref.filters", "Filters"), createFilterPane()); 117 118 mainTabPane.add(edu.umd.cs.findbugs.L10N.getLocalString("pref.suppressions_tab", "Suppressions"), createSuppressionPane()); 119 MainFrame.getInstance().updateStatusBar(); 120 getContentPane().setLayout(new BoxLayout (getContentPane(), BoxLayout.Y_AXIS)); 121 122 JPanel top = new JPanel (); 123 top.setLayout(new BoxLayout (top, BoxLayout.X_AXIS)); 124 top.add(Box.createHorizontalStrut(5)); 125 top.add(mainTabPane); 126 top.add(Box.createHorizontalStrut(5)); 127 128 JPanel bottom = new JPanel (); 129 bottom.setLayout(new BoxLayout (bottom, BoxLayout.X_AXIS)); 130 bottom.add(Box.createHorizontalGlue()); 131 bottom.add(new JButton (new AbstractAction (edu.umd.cs.findbugs.L10N.getLocalString("pref.close", "Close")) 132 { 133 public void actionPerformed(ActionEvent evt) 134 { 135 PreferencesFrame.this.setVisible(false); 137 TreeModel bt= (MainFrame.getInstance().getTree().getModel()); 138 if (bt instanceof BugTreeModel) 139 ((BugTreeModel)bt).checkSorter(); 140 } 141 })); 142 bottom.add(Box.createHorizontalStrut(5)); 143 144 add(Box.createVerticalStrut(5)); 145 add(top); 146 add(Box.createVerticalStrut(5)); 147 add(bottom); 148 add(Box.createVerticalStrut(5)); 149 150 setDefaultCloseOperation(HIDE_ON_CLOSE); 151 152 pack(); 153 } 154 155 180 private JPanel createSuppressionPane() 181 { 182 JPanel suppressP = new JPanel (); 183 suppressP.setLayout(new BorderLayout ()); 184 final JTable table=new JTable (); 185 JScrollPane scrollable= new JScrollPane (table); 186 187 suppressionTableModel=new UneditableTableModel(new Object [0][4],new String []{edu.umd.cs.findbugs.L10N.getLocalString("pref.name", "Name"),edu.umd.cs.findbugs.L10N.getLocalString("pref.type", "Type"),edu.umd.cs.findbugs.L10N.getLocalString("pref.description", "Description"),edu.umd.cs.findbugs.L10N.getLocalString("pref.comments", "Comments")}); 188 table.setModel(suppressionTableModel); 189 table.doLayout(); 190 table.setCellEditor(null); 191 table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); 192 table.setRowHeight((int)(Driver.getFontSize() * 1.25) + table.getRowMargin()); 193 194 suppressP.add(new JLabel (edu.umd.cs.findbugs.L10N.getLocalString("pref.suppressions", "Bug Suppressions")),BorderLayout.NORTH); 195 suppressP.add(scrollable,BorderLayout.CENTER); 196 suppressP.add(new JLabel (edu.umd.cs.findbugs.L10N.getLocalString("pref.suppressions", "Bug Suppressions"))); 197 suppressP.add(scrollable); 198 199 ActionListener buttonListener=new ActionListener (){ 200 public void actionPerformed(ActionEvent e) { 201 int[] selectedBugs=table.getSelectedRows(); 202 for(int x=selectedBugs.length-1;x>=0;x--) 204 { 205 int rowNumber=selectedBugs[x]; 206 BugInstance b=ProjectSettings.getInstance().getSuppressionMatcher().get(rowNumber); 207 ProjectSettings.getInstance().getSuppressionMatcher().remove(b); suppressionTableModel.removeRow(rowNumber); 209 210 if (ProjectSettings.getInstance().getAllMatchers().match(b)) 211 { 212 TreePath fullPathToBug=((BugTreeModel)(MainFrame.getInstance().getTree().getModel())).getPathToNewlyUnsuppressedBug(b); 213 FilterMatcher.notifyListeners(FilterListener.UNSUPPRESSING,fullPathToBug); 214 } 215 } 216 217 MainFrame.getInstance().updateStatusBar(); 218 } 219 }; 220 221 unsuppressButton=new JButton (edu.umd.cs.findbugs.L10N.getLocalString("dlg.unsuppress_btn", "Unsuppress")); 222 223 table.addKeyListener(new KeyListener (){ 224 225 public void keyTyped(KeyEvent key) 226 { 227 if ((int)key.getKeyChar()==KeyEvent.VK_BACK_SPACE || (int) key.getKeyChar()==KeyEvent.VK_DELETE) 228 unsuppressButton.doClick(); 229 } 230 public void keyPressed(KeyEvent arg0) 231 { 232 } 233 public void keyReleased(KeyEvent arg0) 234 { 235 } 236 237 }); 238 239 242 unsuppressButton.addActionListener(buttonListener); 243 suppressP.add(unsuppressButton,BorderLayout.SOUTH); 244 245 return suppressP; 246 } 247 248 251 private JPanel createFilterPane() 252 { 253 addButton = new JButton (edu.umd.cs.findbugs.L10N.getLocalString("dlg.add_dot_btn", "Add...")); 254 removeButton = new JButton (edu.umd.cs.findbugs.L10N.getLocalString("dlg.remove_btn", "Remove")); 255 removeAllButton = new JButton (edu.umd.cs.findbugs.L10N.getLocalString("dlg.remove_all_btn", "Remove All")); 256 JPanel filterPanel = new JPanel (); 257 filterPanel.setLayout(new GridBagLayout ()); 258 GridBagConstraints gbc = new GridBagConstraints (); 259 260 gbc.gridheight = 4; 261 gbc.gridwidth = 1; 262 gbc.gridx = 0; 263 gbc.gridy = 0; 264 gbc.fill = GridBagConstraints.BOTH; 265 gbc.weightx = 1; 266 gbc.weighty = 1; 267 filterPanel.add(new JScrollPane (filterCheckBoxList), gbc); 269 updateFilterPanel(); 270 271 gbc.gridheight = 1; 272 gbc.gridx = 1; 273 gbc.gridy = 0; 274 gbc.fill = GridBagConstraints.HORIZONTAL; 275 gbc.weightx = 0; 276 gbc.weighty = 0; 277 filterPanel.add(addButton, gbc); 278 addButton.addActionListener(new ActionListener () 279 { 280 public void actionPerformed(ActionEvent evt) 281 { 282 NewFilterFrame.open(); 283 } 284 }); 285 286 gbc.gridy = 1; 287 gbc.insets = new Insets (5, 0, 0, 0); 288 filterPanel.add(removeButton, gbc); 289 removeButton.addActionListener(new ActionListener () 290 { 291 public void actionPerformed(ActionEvent evt) 292 { 293 int[] selected = filterCheckBoxList.getSelectedIndices(); 294 if (selected.length == 0) 295 return; 296 if (selected.length == 1){ 297 ProjectSettings.getInstance().removeFilter(ProjectSettings.getInstance().getAllFilters().get(selected[0])); 298 MainFrame.getInstance().setProjectChanged(true); 299 } 300 else{ 301 for (int i : selected) 302 ProjectSettings.getInstance().removeFilter(ProjectSettings.getInstance().getAllFilters().get(i)); 303 MainFrame.getInstance().setProjectChanged(true); 304 } 305 updateFilterPanel(); 306 307 } 308 }); 309 gbc.gridy = 2; 310 gbc.weighty = 0; 311 gbc.insets = new Insets (5, 0, 0, 0); 312 filterPanel.add(removeAllButton, gbc); 313 removeAllButton.addActionListener(new ActionListener () 314 { 315 public void actionPerformed(ActionEvent evt) 316 { 317 ArrayList <FilterMatcher> theList = ProjectSettings.getInstance().getAllFilters(); 318 int len = theList.size(); 319 if(len > 0) 320 { 321 for (int j=len-1; j>=0; j--) ProjectSettings.getInstance().removeFilter(ProjectSettings.getInstance().getAllFilters().get(j)); 323 MainFrame.getInstance().setProjectChanged(true); 324 } 325 updateFilterPanel(); 326 327 } 328 }); 329 gbc.gridy = 3; 330 gbc.weighty = 1; 331 gbc.insets = new Insets (0, 0, 0, 0); 332 filterPanel.add(Box.createGlue(), gbc); 333 334 return filterPanel; 335 } 336 337 void updateFilterPanel() 338 { 339 ArrayList <JCheckBox > boxes = new ArrayList <JCheckBox >(); 340 for (FilterMatcher i : ProjectSettings.getInstance().getAllFilters()) 341 { 342 JCheckBox box = new JCheckBox (i.toString()); 343 box.addItemListener(new FilterCheckBoxListener(i)); 344 box.setSelected(i.isActive()); 345 boxes.add(box); 346 } 347 348 filterCheckBoxList.setListData(boxes.toArray(new JCheckBox [boxes.size()])); 349 } 350 351 private static class UneditableTableModel extends DefaultTableModel 352 { 353 public UneditableTableModel(Object [][] tableData, String [] strings) { 354 super(tableData,strings); 355 } 356 public boolean isCellEditable(int x, int y) 357 { 358 return false; 359 } 360 } 361 362 private static class FilterCheckBoxListener implements ItemListener 363 { 364 FilterMatcher filter; 365 366 FilterCheckBoxListener(FilterMatcher filter) 367 { 368 this.filter = filter; 369 } 370 371 public void itemStateChanged(ItemEvent evt) 372 { 373 filter.setActive(((JCheckBox ) evt.getSource()).isSelected()); 375 MainFrame.getInstance().updateStatusBar(); 376 MainFrame.getInstance().setProjectChanged(true); 377 } 378 } 379 380 public void suppressionsChanged(BugLeafNode bugLeaf) 381 { 382 BugInstance b=bugLeaf.getBug(); 383 BugPattern bp=b.getBugPattern(); 384 Object [] bugData=new Object [suppressionTableModel.getColumnCount()]; 385 bugData[0]=b.getPrimarySourceLineAnnotation(); 386 bugData[1]=bp.getType(); 387 bugData[2]=b.getMessage(); 388 bugData[3]=b.getAnnotationText(); 389 390 suppressionTableModel.addRow(bugData); 391 } 392 393 public void clearSuppressions() 394 { 395 int size=suppressionTableModel.getRowCount(); 396 for (int x=0; x<size;x++) 397 { 398 suppressionTableModel.removeRow(0); 399 } 400 } 401 void freeze() 402 { 403 frozen=true; 404 filterCheckBoxList.setEnabled(false); 405 unsuppressButton.setEnabled(false); 406 addButton.setEnabled(false); 407 removeButton.setEnabled(false); 408 } 409 410 void thaw() 411 { 412 filterCheckBoxList.setEnabled(true); 413 unsuppressButton.setEnabled(true); 414 addButton.setEnabled(true); 415 removeButton.setEnabled(true); 416 frozen=false; 417 } 418 } | Popular Tags |