/* * FilterButtonGroupPanel.java * Copyright 2010 Connor Petty <cpmeister@users.sourceforge.net> * * 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 * * Created on May 15, 2010, 5:01:27 PM */ package pcgen.gui2.filter; import java.awt.Component; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; import javax.swing.BoxLayout; import javax.swing.JPanel; /** * This component is used to represent a set of button filters that are mutually exclusive. * Only one of the button filters added to this component will be active at a single time. * The behavior is identical to that of a ButtonGroup which contains the buttons with the exception * that it is possible to deselect all of the buttons. * @param <C> The context that this filter is defined under * @param <E> The element type that will be filtered * @author Connor Petty <cpmeister@users.sourceforge.net> */ public class FilterButtonGroupPanel<C, E> extends JPanel implements DisplayableFilter<C, E>, ItemListener { private List<FilterButton<C, E>> buttons = new ArrayList<>(); private FilterHandler filterHandler; public FilterButtonGroupPanel() { setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); } public void addFilterButton(FilterButton<C, E> button) { add(button); buttons.add(button); button.addItemListener(this); button.setFilterHandler(filterHandler); } public void removeFilterButton(FilterButton<C, E> button) { remove(button); buttons.remove(button); button.removeItemListener(this); button.setFilterHandler(null); } @Override public Component getFilterComponent() { return this; } @Override public void setFilterHandler(FilterHandler handler) { this.filterHandler = handler; for (FilterButton<C, E> filterButton : buttons) { filterButton.setFilterHandler(handler); } } @Override public boolean accept(C context, E element) { for (FilterButton<C, E> filterButton : buttons) { if (!filterButton.accept(context, element)) { return false; } } return true; } @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { for (FilterButton<C, E> filterButton : buttons) { if (filterButton == e.getItemSelectable()) { continue; } filterButton.setSelected(false); } } } }