KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > edu > umd > cs > findbugs > gui2 > PreferencesFrame


1 /*
2  * FindBugs - Find Bugs in Java programs
3  * Copyright (C) 2006, University of Maryland
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
18  */

19
20 package edu.umd.cs.findbugs.gui2;
21
22 import java.awt.BorderLayout JavaDoc;
23 import java.awt.Component JavaDoc;
24 import java.awt.Container JavaDoc;
25 import java.awt.GridBagConstraints JavaDoc;
26 import java.awt.GridBagLayout JavaDoc;
27 import java.awt.Insets JavaDoc;
28 import java.awt.event.ActionEvent JavaDoc;
29 import java.awt.event.ActionListener JavaDoc;
30 import java.awt.event.ItemEvent JavaDoc;
31 import java.awt.event.ItemListener JavaDoc;
32 import java.awt.event.KeyEvent JavaDoc;
33 import java.awt.event.KeyListener JavaDoc;
34 import java.io.IOException JavaDoc;
35 import java.util.ArrayList JavaDoc;
36 import java.util.Arrays JavaDoc;
37 import java.util.Collections JavaDoc;
38 import java.util.Iterator JavaDoc;
39 import java.util.List JavaDoc;
40 import java.util.concurrent.ExecutionException JavaDoc;
41
42 import javax.imageio.ImageIO JavaDoc;
43 import javax.swing.AbstractAction JavaDoc;
44 import javax.swing.Box JavaDoc;
45 import javax.swing.BoxLayout JavaDoc;
46 import javax.swing.JButton JavaDoc;
47 import javax.swing.JCheckBox JavaDoc;
48 import javax.swing.JComboBox JavaDoc;
49 import javax.swing.JFrame JavaDoc;
50 import javax.swing.JLabel JavaDoc;
51 import javax.swing.JOptionPane JavaDoc;
52 import javax.swing.JPanel JavaDoc;
53 import javax.swing.JScrollPane JavaDoc;
54 import javax.swing.JTabbedPane JavaDoc;
55 import javax.swing.JTable JavaDoc;
56 import javax.swing.SwingConstants JavaDoc;
57 import javax.swing.event.ChangeEvent JavaDoc;
58 import javax.swing.event.ChangeListener JavaDoc;
59 import javax.swing.table.DefaultTableColumnModel JavaDoc;
60 import javax.swing.table.DefaultTableModel JavaDoc;
61 import javax.swing.table.JTableHeader JavaDoc;
62 import javax.swing.tree.TreeModel JavaDoc;
63 import javax.swing.tree.TreePath JavaDoc;
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 /**
76  * User Preferences
77  */

78
79 /*
80  *
81  * Preferences, which should really be renamed Filters And Suppressions (fas, like fas file!)
82  * since thats all that's actually here now
83  *
84  */

85 @SuppressWarnings JavaDoc("serial")
86 public class PreferencesFrame extends FBDialog {
87     
88     /**
89      * List of checkboxes in sorter panel
90      */

91     
92     private static PreferencesFrame instance;
93     private CheckBoxList filterCheckBoxList = new CheckBoxList();
94     private UneditableTableModel suppressionTableModel;
95     private JButton JavaDoc addButton;
96     private JButton JavaDoc unsuppressButton;
97
98     JButton JavaDoc removeButton;
99     JButton JavaDoc removeAllButton;
100     boolean frozen=false;
101     public static PreferencesFrame getInstance()
102     {
103 // MainFrame.getInstance().getSorter().freezeOrder();
104
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 JavaDoc mainTabPane = new JTabbedPane JavaDoc();
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 JavaDoc(getContentPane(), BoxLayout.Y_AXIS));
121         
122         JPanel JavaDoc top = new JPanel JavaDoc();
123         top.setLayout(new BoxLayout JavaDoc(top, BoxLayout.X_AXIS));
124         top.add(Box.createHorizontalStrut(5));
125         top.add(mainTabPane);
126         top.add(Box.createHorizontalStrut(5));
127         
128         JPanel JavaDoc bottom = new JPanel JavaDoc();
129         bottom.setLayout(new BoxLayout JavaDoc(bottom, BoxLayout.X_AXIS));
130         bottom.add(Box.createHorizontalGlue());
131         bottom.add(new JButton JavaDoc(new AbstractAction JavaDoc(edu.umd.cs.findbugs.L10N.getLocalString("pref.close", "Close"))
132         {
133             public void actionPerformed(ActionEvent JavaDoc evt)
134             {
135 // MainFrame.getInstance().getSorter().thawOrder();
136
PreferencesFrame.this.setVisible(false);
137                 TreeModel JavaDoc 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 // /**
156
// * Creates the general tab. This lets the user change the font
157
// * size and the total number of possible previous comments.
158
// * @return
159
// */
160
// private JPanel createGeneralPane() {
161
// JPanel generalPanel = new JPanel();
162
//
163
// generalPanel.add(new JLabel("Clear Recent Projects List"));
164
// JButton clearButton=new JButton("Clear");
165
// clearButton.addActionListener(new ActionListener()
166
// {
167
// public void actionPerformed(ActionEvent e)
168
// {
169
// GUISaveState.getInstance().clear();
170
// }
171
// });
172
// return generalPanel;
173
// }
174
//
175
/**
176      * Create list of particular bugs that are suppressed by
177      * the user.
178      * @return
179      */

180     private JPanel JavaDoc createSuppressionPane()
181     {
182         JPanel JavaDoc suppressP = new JPanel JavaDoc();
183         suppressP.setLayout(new BorderLayout JavaDoc());
184         final JTable JavaDoc table=new JTable JavaDoc();
185         JScrollPane JavaDoc scrollable= new JScrollPane JavaDoc(table);
186         
187         suppressionTableModel=new UneditableTableModel(new Object JavaDoc[0][4],new String JavaDoc[]{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 JavaDoc(edu.umd.cs.findbugs.L10N.getLocalString("pref.suppressions", "Bug Suppressions")),BorderLayout.NORTH);
195         suppressP.add(scrollable,BorderLayout.CENTER);
196         suppressP.add(new JLabel JavaDoc(edu.umd.cs.findbugs.L10N.getLocalString("pref.suppressions", "Bug Suppressions")));
197         suppressP.add(scrollable);
198         
199         ActionListener JavaDoc buttonListener=new ActionListener JavaDoc(){
200             public void actionPerformed(ActionEvent JavaDoc e) {
201                 int[] selectedBugs=table.getSelectedRows();
202                 //ArrayList<BugInstance> bugsToUnsuppress=new ArrayList<BugInstance>();
203
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);//Suppressions IS the bugSuppression filter
208
suppressionTableModel.removeRow(rowNumber);
209                     
210                     if (ProjectSettings.getInstance().getAllMatchers().match(b))
211                     {
212                         TreePath JavaDoc 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 JavaDoc(edu.umd.cs.findbugs.L10N.getLocalString("dlg.unsuppress_btn", "Unsuppress"));
222
223         table.addKeyListener(new KeyListener JavaDoc(){
224
225             public void keyTyped(KeyEvent JavaDoc 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 JavaDoc arg0)
231             {
232             }
233             public void keyReleased(KeyEvent JavaDoc arg0)
234             {
235             }
236             
237         });
238         
239 // unsuppressButton.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0),JPanel.WHEN_IN_FOCUSED_WINDOW);
240
// unsuppressButton.getActionMap().put(JPanel.WHEN_IN_FOCUSED_WINDOW,buttonListener);
241

242         unsuppressButton.addActionListener(buttonListener);
243         suppressP.add(unsuppressButton,BorderLayout.SOUTH);
244
245         return suppressP;
246     }
247
248     /**
249      * Create a JPanel to display the filtering controls.
250      */

251     private JPanel JavaDoc createFilterPane()
252     {
253         addButton = new JButton JavaDoc(edu.umd.cs.findbugs.L10N.getLocalString("dlg.add_dot_btn", "Add..."));
254         removeButton = new JButton JavaDoc(edu.umd.cs.findbugs.L10N.getLocalString("dlg.remove_btn", "Remove"));
255         removeAllButton = new JButton JavaDoc(edu.umd.cs.findbugs.L10N.getLocalString("dlg.remove_all_btn", "Remove All"));
256         JPanel JavaDoc filterPanel = new JPanel JavaDoc();
257         filterPanel.setLayout(new GridBagLayout JavaDoc());
258         GridBagConstraints JavaDoc gbc = new GridBagConstraints JavaDoc();
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(new CheckBoxList(new JCheckBox[]{ new JCheckBox("Dummy Filter #1 with an extremely long name that should necessitate the use of a scroll bar"), new JCheckBox("Dummy Filter #2") })), gbc);
268
filterPanel.add(new JScrollPane JavaDoc(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 JavaDoc()
279         {
280             public void actionPerformed(ActionEvent JavaDoc evt)
281             {
282                 NewFilterFrame.open();
283             }
284         });
285         
286         gbc.gridy = 1;
287         gbc.insets = new Insets JavaDoc(5, 0, 0, 0);
288         filterPanel.add(removeButton, gbc);
289         removeButton.addActionListener(new ActionListener JavaDoc()
290         {
291             public void actionPerformed(ActionEvent JavaDoc 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 JavaDoc(5, 0, 0, 0);
312         filterPanel.add(removeAllButton, gbc);
313         removeAllButton.addActionListener(new ActionListener JavaDoc()
314                 {
315                     public void actionPerformed(ActionEvent JavaDoc evt)
316                     {
317                         ArrayList JavaDoc<FilterMatcher> theList = ProjectSettings.getInstance().getAllFilters();
318                         int len = theList.size();
319                         if(len > 0)
320                         {
321                             for (int j=len-1; j>=0; j--) // we have to go backwards because removing the first item changes the indices of all the rest
322
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 JavaDoc(0, 0, 0, 0);
332         filterPanel.add(Box.createGlue(), gbc);
333         
334         return filterPanel;
335     }
336     
337     void updateFilterPanel()
338     {
339         ArrayList JavaDoc<JCheckBox JavaDoc> boxes = new ArrayList JavaDoc<JCheckBox JavaDoc>();
340         for (FilterMatcher i : ProjectSettings.getInstance().getAllFilters())
341         {
342             JCheckBox JavaDoc box = new JCheckBox JavaDoc(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 JavaDoc[boxes.size()]));
349     }
350
351     private static class UneditableTableModel extends DefaultTableModel JavaDoc
352     {
353         public UneditableTableModel(Object JavaDoc[][] tableData, String JavaDoc[] 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 JavaDoc
363     {
364         FilterMatcher filter;
365         
366         FilterCheckBoxListener(FilterMatcher filter)
367         {
368             this.filter = filter;
369         }
370         
371         public void itemStateChanged(ItemEvent JavaDoc evt)
372         {
373 // RebuildThreadMonitor.waitForRebuild();
374
filter.setActive(((JCheckBox JavaDoc) 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 JavaDoc[] bugData=new Object JavaDoc[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