package com.limegroup.gnutella.gui.search;
import java.awt.CardLayout;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import com.limegroup.gnutella.gui.BoxPanel;
import com.limegroup.gnutella.gui.GUIMediator;
import com.limegroup.gnutella.gui.GUIUtils;
import com.limegroup.gnutella.gui.IconButton;
import com.limegroup.gnutella.gui.themes.ThemeFileHandler;
import com.limegroup.gnutella.gui.themes.ThemeSettings;
class FilterInputPanel extends BoxPanel {
/**
* The ditherer drawing the back to search button.
*/
private final Ditherer DITHERER =
new Ditherer(20,
ThemeFileHandler.SEARCH_PANEL_BG_1.getValue(),
ThemeFileHandler.SEARCH_PANEL_BG_2.getValue()
);
/**
* The CardLayout that switches among the various FilterPanels
* or the search input panel.
*/
private final CardLayout FILTER_CARDS = new CardLayout();
/**
* The panel used by FILTER_CARDS that displays either filter boxes
* or detailed search information.
*/
private final JPanel FILTER_PANEL = new JPanel(FILTER_CARDS);
/**
* A Mapping from ResultPanel to FilterPanel, to keep track of which
* filters are active for results.
*/
private final Map ACTIVE_FILTERS = new HashMap();
/**
* The 'back to search button', for focus requesting.
*/
private JButton backToSearch;
FilterInputPanel(ActionListener forButton, KeyListener autoSearch) {
super(BoxPanel.Y_AXIS);
add(Box.createVerticalStrut(4));
add(GUIUtils.left(new JLabel(
GUIMediator.getStringResource("SEARCH_FILTER_RESULTS"))));
add(FILTER_PANEL);
add(Box.createVerticalStrut(4));
add(createBackToSearchButton(forButton, autoSearch));
}
/**
* Requests focus on the search button.
*/
void requestFilterFocus() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
backToSearch.requestFocus();
}
});
}
/**
* Removes all filters from the list of filters.
*/
void clearFilters() {
for(Iterator i = ACTIVE_FILTERS.values().iterator(); i.hasNext();) {
FILTER_PANEL.remove((FilterPanel)i.next());
i.remove();
}
FilterBox.clearRenderer();
}
/**
* Resets the FilterPanel for the specified ResultPanel.
*/
void panelReset(ResultPanel rp) {
FilterPanel panel = (FilterPanel)ACTIVE_FILTERS.get(rp);
if(panel != null) {
FILTER_PANEL.remove(panel);
ACTIVE_FILTERS.remove(rp);
setFiltersFor(rp);
}
}
/**
* Removes the filter associated with the specified result panel.
*/
boolean panelRemoved(ResultPanel rp) {
FilterPanel panel = (FilterPanel)ACTIVE_FILTERS.get(rp);
if(panel != null) {
FILTER_PANEL.remove(panel);
ACTIVE_FILTERS.remove(rp);
}
FilterBox.clearRenderer();
return ACTIVE_FILTERS.isEmpty();
}
/**
* Creates and/or displays filters for the specified result panel.
*/
boolean setFiltersFor(ResultPanel rp) {
boolean added = false;
FilterPanel panel = (FilterPanel)ACTIVE_FILTERS.get(rp);
if(panel == null) {
added = true;
panel = new FilterPanel(rp);
FilterPopupMenuHandler.install(panel);
FILTER_PANEL.add(panel, panel.getUniqueDescription());
ACTIVE_FILTERS.put(rp, panel);
}
FILTER_CARDS.show(FILTER_PANEL, panel.getUniqueDescription());
return added;
}
private JPanel createBackToSearchButton(ActionListener forButton,
KeyListener autoSearch) {
JButton search = new IconButton(
GUIMediator.getStringResource("SEARCH_BACK_TO_SEARCH"),
"SEARCH_BACK_TO_SEARCH");
search.addActionListener(forButton);
search.addKeyListener(autoSearch);
search.setRequestFocusEnabled(true);
JPanel panel = new DitherPanel(DITHERER);
panel.setLayout(new BoxLayout(panel, BoxPanel.Y_AXIS));
panel.add(Box.createVerticalStrut(5));
panel.add(GUIUtils.center(search));
panel.add(Box.createVerticalStrut(5));
panel.setBackground(ThemeFileHandler.SEARCH_PANEL_BG_2.getValue());
GUIUtils.setOpaque(false, panel);
if(!ThemeSettings.isNativeTheme())
panel.setOpaque(true);
panel.setBorder(BorderFactory.createLineBorder(
ThemeFileHandler.SEARCH_GRID_COLOR.getValue()));
backToSearch = search;
return panel;
}
}