/* * FindBugs - Find Bugs in Java programs * Copyright (C) 2006, University of Maryland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA */ package edu.umd.cs.findbugs.gui2; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import edu.umd.cs.findbugs.gui2.BugAspects.SortableValue; /** * * Lets you choose your new filter, shouldn't let you choose filters that wouldn't filter anything out * including filters that you already have * */ @SuppressWarnings("serial") public class NewFilterFrame extends FBDialog { private JList list = new JList(); private static NewFilterFrame instance = null; public static void open() { if(instance == null) { instance = new NewFilterFrame(); instance.setVisible(true); instance.toFront(); } } public static void close() { if(instance != null) { instance.dispose(); instance = null; } } private NewFilterFrame() { super(PreferencesFrame.getInstance()); setContentPane(new JPanel() { @Override public Insets getInsets() { return new Insets(3, 3, 3, 3); } }); setLayout(new BorderLayout()); JPanel north = new JPanel(); north.setLayout(new BoxLayout(north, BoxLayout.X_AXIS)); north.add(Box.createHorizontalStrut(3)); north.add(new JLabel(edu.umd.cs.findbugs.L10N.getLocalString("dlg.filter_bugs_lbl", "Filter out all bugs whose") + " ")); //Argh divider Sortables[] sortables = MainFrame.getInstance().getAvailableSortables(); Sortables[] valuesWithoutDivider=new Sortables[sortables.length-1]; int index=0; for (int x=0; x<sortables.length;x++) { if (sortables[x]!=Sortables.DIVIDER) { valuesWithoutDivider[index]=sortables[x]; index++; } } final JComboBox comboBox = new JComboBox(valuesWithoutDivider); comboBox.setRenderer(new ListCellRenderer() { final Color SELECTED_BACKGROUND = new Color(183, 184, 204); public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel result = new JLabel(); result.setFont(result.getFont().deriveFont(Driver.getFontSize())); result.setOpaque(true); result.setText(value.toString().toLowerCase()); if (isSelected) result.setBackground(SELECTED_BACKGROUND); return result; } }); comboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Sortables filterBy = (Sortables) comboBox.getSelectedItem(); String[] listData = filterBy.getAllSorted(); for (int i = 0; i < listData.length; i++) listData[i] = filterBy.formatValue(listData[i]); list.setListData(listData); } }); comboBox.validate(); north.add(comboBox); north.add(new JLabel(" " + edu.umd.cs.findbugs.L10N.getLocalString("dlg.is", "is") + " ")); String[] filterModes = {edu.umd.cs.findbugs.L10N.getLocalString("mode.equal_to", "equal to"), edu.umd.cs.findbugs.L10N.getLocalString("mode.at_or_after", "at or after"), edu.umd.cs.findbugs.L10N.getLocalString("mode.at_or_before", "at or before")}; final JComboBox filterModeComboBox = new JComboBox(filterModes); north.add(filterModeComboBox); north.add(new JLabel(":")); north.add(Box.createHorizontalGlue()); JPanel south = new JPanel(); JButton okButton = new JButton(edu.umd.cs.findbugs.L10N.getLocalString("dlg.ok_btn", "OK")); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Sortables key = (Sortables) comboBox.getSelectedItem(); String[] values = key.getAllSorted(); ArrayList<SortableValue> filterMe=new ArrayList<SortableValue>(); for (int i : list.getSelectedIndices()) { filterMe.add(new BugAspects.SortableValue(key,values[i])); } try { MainFrame.getInstance().getProject().getSuppressionFilter().addChild(FilterFactory.makeOrMatcher(filterMe)); } catch (RuntimeException e) { MainFrame.getInstance().showMessageDialog("Unable to create filter: " + e.getMessage()); close(); return; } FilterActivity.notifyListeners(FilterListener.Action.FILTERING, null); PreferencesFrame.getInstance().updateFilterPanel(); MainFrame.getInstance().setProjectChanged(true); close(); } }); JButton cancelButton = new JButton(edu.umd.cs.findbugs.L10N.getLocalString("dlg.cancel_btn", "Cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { close(); } }); Util.addOkAndCancelButtons(south, okButton, cancelButton); list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent evt) { if (evt.getClickCount() == 2) { // Dupe from OK button's ActionListener Sortables key = (Sortables) comboBox.getSelectedItem(); String[] values = key.getAllSorted(); // for (int i : list.getSelectedIndices()) // { // FilterMatcher fm=new FilterMatcher(key,values[i]); // if (!ProjectSettings.getInstance().getAllMatchers().contains(fm)) // ProjectSettings.getInstance().addFilter(fm); // } FilterMatcher[] newFilters = new FilterMatcher[list.getSelectedIndices().length]; for (int i = 0; i < newFilters.length; i++) newFilters[i] = new FilterMatcher(key, values[list.getSelectedIndices()[i]]); ProjectSettings.getInstance().addFilters(newFilters); PreferencesFrame.getInstance().updateFilterPanel(); close(); } } }); add(north, BorderLayout.NORTH); add(Box.createHorizontalStrut(2), BorderLayout.WEST); add(new JScrollPane(list), BorderLayout.CENTER); add(Box.createHorizontalStrut(2), BorderLayout.EAST); add(south, BorderLayout.SOUTH); // Populate the box with initial values comboBox.getActionListeners()[0].actionPerformed(null); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent arg0) { close(); } }); setTitle(edu.umd.cs.findbugs.L10N.getLocalString("dlg.create_new_filter_ttl", "Create New Filter")); pack(); } public static void main(String[] args) { new NewFilterFrame().setDefaultCloseOperation(EXIT_ON_CLOSE); } }