AdvancedSearchQueryPanel.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
org.xnap.gui |
![]() |
![]() |
XNap 3 |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
/*
* XNap - A P2P framework and client.
*
* See the file AUTHORS for copyright information.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.xnap.gui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Hashtable;
import javax.swing.*;
import javax.swing.Action;
import javax.swing.ComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import org.xnap.XNap;
import org.xnap.gui.component.EraseButton;
import org.xnap.gui.component.HistoryComboBox;
import org.xnap.gui.component.RangeBox;
import org.xnap.gui.component.XNapButton;
import org.xnap.gui.list.SearchProviderListCellRenderer;
import org.xnap.gui.shortcut.ShortcutManager;
import org.xnap.gui.util.FocusHandler;
import org.xnap.gui.util.GUIHelper;
import org.xnap.gui.util.GridBagHelper;
import org.xnap.gui.util.IconHelper;
import org.xnap.search.DefaultSearchFilter;
import org.xnap.search.LibrarySearch;
import org.xnap.search.MediaType;
import org.xnap.search.Search;
import org.xnap.search.SearchContainer;
import org.xnap.search.SearchFilter;
import org.xnap.search.SearchManager;
import org.xnap.search.SearchProvider;
import org.xnap.search.SearchProviderContainer;
import org.xnap.util.Preferences;
/**
* This class provides a panel with widgets to enter search queries
* and to set search options. The queries are passed to the
* {@link xnap.search.SearchManager SearchManager}.
*/
public class AdvancedSearchQueryPanel extends JPanel
{
//--- Constant(s) ---
public static final int DEFAULT_UNIT_INDEX = 2;
public static final String UNITS[] = {
XNap.tr("B"), XNap.tr("KB"), XNap.tr("MB"), XNap.tr("GB")
};
public static final long FACTORS[] = {
1, 1024, 1024 * 1024, 1024 * 1024 * 1024
};
//--- Data field(s) ---
protected static Preferences prefs = Preferences.getInstance();
private HistoryComboBox jcbSearch;
private JComboBox jcbMediaType;
private RangeBox rbFilesize;
private JComboBox jcbFilesizeUnit;
private JComboBox jcbNetwork;
private JCheckBox jcbLocal;
private JPanel jpOptions;
private SearchProviderContainer spcNone;
private SearchProviderContainer spcAll;
private QueryAction acQuery = new QueryAction();
/**
* Maps {@link SearchProvider} objets to extra {@link JPanel}
* objects for additonal options.
*/
private Hashtable panelByProvider = new Hashtable();
private SearchOptionsPanel currentOptionsPanel;
//--- Constructor(s) ---
/**
* Constructs the search query panel.
*
* @param model model used by the HistoryComboBox
*/
public AdvancedSearchQueryPanel(ComboBoxModel model)
{
setLayout(new GridBagLayout());
//setBorder(GUIHelper.createDefaultBorder(XNap.tr("Advanced Search")));
GridBagHelper.add(this, GUIHelper.createSeparator(XNap.tr("Text")));
// FormLayout layout = new FormLayout
// ("right:pref, 3dlu, pref",
// "p, 3dlu, p, 9dlu, p, 3dlu, p, 3dlu, p, 9dlu, 3dl, p, 9dlu, p");
// erase button
EraseButton jbErase = new EraseButton();
GridBagHelper.addComponent(this, jbErase, GridBagConstraints.WEST);
ShortcutManager.getInstance().add(jbErase.getAction(), this);
// search field
jcbSearch = new HistoryComboBox(model, 20);
jcbSearch.setPreferences("search");
jcbSearch.addItemListener(new HistorySelectionListener());
GUIHelper.bindEnterKeyLocally(jcbSearch.getTextField(), acQuery);
jbErase.setTextField(jcbSearch.getTextField());
GridBagHelper.add(this, jcbSearch);
// options
jpOptions = new JPanel(new GridBagLayout());
jpOptions.setBorder
(GUIHelper.createDefaultBorder(XNap.tr("Options")));
GridBagHelper.add(this, jpOptions);
// media type
JLabel l = GridBagHelper.addLabel(jpOptions, XNap.tr("Media Type"));
jcbMediaType = new JComboBox();
l.setLabelFor(jcbMediaType);
GridBagHelper.add(jpOptions, jcbMediaType);
// network
l = GridBagHelper.addLabel(jpOptions, XNap.tr("Network"));
jcbNetwork = new JComboBox();
l.setLabelFor(jcbNetwork);
jcbNetwork.setRenderer(new SearchProviderListCellRenderer());
spcNone = new SearchProviderContainer(XNap.tr("None"));
jcbNetwork.addItem(spcNone);
spcAll = new SearchProviderContainer(XNap.tr("All"));
jcbNetwork.addItem(spcAll);
jcbNetwork.setSelectedIndex(1);
jcbNetwork.addActionListener(new ProviderListener());
GridBagHelper.add(jpOptions, jcbNetwork);
// local
jcbLocal = new JCheckBox(XNap.tr("Local Library"));
jcbLocal.addActionListener(new QueryButtonListener());
GridBagHelper.add(jpOptions, jcbLocal);
// file size
JPanel jpFilesize = new JPanel(new GridBagLayout());
jpFilesize.setBorder
(GUIHelper.createDefaultBorder(XNap.tr("File size")));
GridBagHelper.add(this, jpFilesize);
rbFilesize = new RangeBox();
jcbFilesizeUnit = new JComboBox(UNITS);
jcbFilesizeUnit.setSelectedIndex(DEFAULT_UNIT_INDEX);
rbFilesize.setUnitComponent(jcbFilesizeUnit);
GridBagHelper.add(jpFilesize, rbFilesize, false);
// options
jpOptions = new JPanel(new BorderLayout());
GridBagHelper.add(this, jpOptions);
// query button
JPanel jpButtons = new JPanel(new FlowLayout(FlowLayout.CENTER));
jpButtons.add(new XNapButton(acQuery));
GridBagHelper.add(this, jpButtons);
GridBagHelper.addVerticalSpacer(this);
acQuery.update();
addComponentListener(new FocusHandler(jcbSearch.getTextField()));
GUIHelper.setMnemonics(this);
}
//--- Method(s) ---
public void addOptionsPanel(SearchProvider provider,
SearchOptionsPanel panel)
{
panelByProvider.put(provider, panel);
}
public void removeOptionsPanel(SearchProvider provider)
{
panelByProvider.remove(provider);
}
public Object[] getHistoryItems()
{
return jcbSearch.getHistoryItems();
}
void addToHistory(SearchFilter filter)
{
jcbSearch.addDistinctItemAtTop(filter);
}
DefaultSearchFilter getSearchFilter()
{
DefaultSearchFilter f = new DefaultSearchFilter();
f.put(SearchFilter.TEXT, jcbSearch.getText());
f.put(SearchFilter.MEDIA_TYPE, jcbMediaType.getSelectedItem());
long factor = FACTORS[jcbFilesizeUnit.getSelectedIndex()];
f.put(SearchFilter.MIN_FILESIZE,
(rbFilesize.getMinValue() != -1)
? new Long(rbFilesize.getMinValue() * factor)
: null);
f.put(SearchFilter.MAX_FILESIZE,
(rbFilesize.getMaxValue() != -1)
? new Long(rbFilesize.getMaxValue() * factor)
: null);
if (currentOptionsPanel != null) {
currentOptionsPanel.setOptions(f);
}
// save search provider's name
SearchProvider p = (SearchProvider)jcbNetwork.getSelectedItem();
f.put("searchProvider", p.getName());
return f;
}
void setSearchFilter(SearchFilter f)
{
setSearchFilter(f, true);
}
void setSearchFilter(SearchFilter f, boolean setText)
{
String name = (String)f.get("searchProvider");
if (name != null) {
boolean found = false;
for (int i = 0; i < jcbNetwork.getItemCount() && !found; i++) {
SearchProvider sp = (SearchProvider)jcbNetwork.getItemAt(i);
if (sp.getName().equals(name)) {
jcbNetwork.setSelectedItem(sp);
found = true;
}
}
if (!found) {
jcbNetwork.setSelectedItem(spcAll);
}
}
if (setText) {
jcbSearch.setText((String)f.get(SearchFilter.TEXT));
}
jcbMediaType.setSelectedItem(f.get(SearchFilter.MEDIA_TYPE));
}
/**
* Invoked by the {@link SearchPanel} when a {@link
* SearchProvider} has been added.
*/
void providerAdded(SearchProvider provider)
{
spcAll.add(provider);
jcbNetwork.addItem(provider);
providerChanged();
}
/**
* Invoked by the {@link SearchPanel} when a {@link
* SearchProvider} has been removed.
*/
void providerRemoved(SearchProvider provider)
{
spcAll.remove(provider);
jcbNetwork.removeItem(provider);
providerChanged();
}
private void providerChanged()
{
SearchProvider p = (SearchProvider)jcbNetwork.getSelectedItem();
jcbMediaType.removeAllItems();
MediaType[] types = p.getSupportedMediaTypes();
if (types != null) {
for (int i = 0; i < types.length; i++) {
jcbMediaType.addItem(types[i]);
}
}
if (currentOptionsPanel != null) {
jpOptions.remove(currentOptionsPanel.getComponent());
}
currentOptionsPanel = (SearchOptionsPanel)panelByProvider.get(p);
if (currentOptionsPanel != null) {
jpOptions.add(currentOptionsPanel.getComponent(),
BorderLayout.CENTER);
}
acQuery.update();
}
/**
* Performs a search.
*/
private class QueryAction extends AbstractAction {
public QueryAction()
{
putValue(Action.NAME, XNap.tr("Query"));
putValue(Action.SHORT_DESCRIPTION, XNap.tr("Performs a search."));
putValue(IconHelper.XNAP_ICON, "filefind.png");
}
public void actionPerformed(ActionEvent event)
{
DefaultSearchFilter filter = getSearchFilter();
try {
filter.validate();
}
catch (Exception e) {
StatusBar.setText(e.getMessage());
return;
}
SearchProvider p = (SearchProvider)jcbNetwork.getSelectedItem();
Search search = p.search(filter);
if (jcbLocal.isSelected()) {
SearchContainer c = new SearchContainer(filter);
c.add(search);
c.add(new LibrarySearch(filter));
SearchManager.getInstance().handle(c);
}
else {
SearchManager.getInstance().handle(search);
}
}
public void update()
{
setEnabled(jcbLocal.isSelected()
|| (spcAll.size() > 0
&& jcbNetwork.getSelectedItem() != spcNone));
}
}
/**
* Updates the media types when a network is selected.
*/
private class ProviderListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
providerChanged();
}
}
/**
* Switches between advanced and simple view.
*/
private class ShowSimpleAction extends AbstractAction {
public ShowSimpleAction()
{
putValue(Action.NAME, XNap.tr("Less Options"));
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Displays simple search options panel."));
putValue(IconHelper.XNAP_ICON, "2uparrow.png");
}
public void actionPerformed(ActionEvent event)
{
prefs.set("showAdvancedSearchOptions", "true");
}
}
/**
* Update the settings when the selected search filter object
* changes.
*/
private class HistorySelectionListener implements ItemListener
{
public void itemStateChanged(ItemEvent event)
{
if (event.getStateChange() == ItemEvent.SELECTED) {
if (event.getItem() instanceof SearchFilter) {
setSearchFilter((SearchFilter)event.getItem(), false);
}
}
}
}
/**
* Disables the query button when no network is availabe and local search
* is not selected.
*/
private class QueryButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
acQuery.update();
}
}
}
The table below shows all metrics for AdvancedSearchQueryPanel.java.




