package org.limewire.ui.swing.options;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
import org.limewire.collection.AutoCompleteDictionary;
import org.limewire.core.api.Application;
import org.limewire.core.api.search.SearchCategory;
import org.limewire.core.api.spam.SpamManager;
import org.limewire.core.settings.FilterSettings;
import org.limewire.core.settings.LibrarySettings;
import org.limewire.core.settings.SearchSettings;
import org.limewire.ui.swing.action.AbstractAction;
import org.limewire.ui.swing.components.MultiLineLabel;
import org.limewire.ui.swing.components.NonNullJComboBox;
import org.limewire.ui.swing.options.actions.CancelDialogAction;
import org.limewire.ui.swing.options.actions.DialogDisplayAction;
import org.limewire.ui.swing.options.actions.OKDialogAction;
import org.limewire.ui.swing.search.SearchCategoryUtils;
import org.limewire.ui.swing.settings.SwingUiSettings;
import org.limewire.ui.swing.util.BackgroundExecutorService;
import org.limewire.ui.swing.util.I18n;
import org.limewire.ui.swing.util.SearchSettingListener;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.name.Named;
/**
* Search Option View.
*/
public class SearchOptionPanel extends OptionPanel {
private final AutoCompleteDictionary searchHistory;
private final SpamManager spamManager;
private final UnsafeTypeOptionPanel unsafeOptionPanel;
private final Provider<FilterKeywordOptionPanel> filterKeywordOptionPanelProvider;
private final Provider<FilterFileExtensionsOptionPanel> filterFileExtensionsOptionPanelProvider;
private SearchBarPanel searchBarPanel;
private FilteringPanel filteringPanel;
private final JCheckBox groupSimilarResults;
private final JCheckBox torrentWebSearchActivated;
@Inject
public SearchOptionPanel(@Named("searchHistory") AutoCompleteDictionary searchHistory,
SpamManager spamManager,
UnsafeTypeOptionPanel unsafeOptionPanel,
Application application,
Provider<FilterKeywordOptionPanel> filterKeywordOptionPanelProvider,
Provider<FilterFileExtensionsOptionPanel> filterFileExtensionsOptionPanelProvider) {
this.spamManager = spamManager;
this.searchHistory = searchHistory;
this.unsafeOptionPanel = unsafeOptionPanel;
this.filterKeywordOptionPanelProvider = filterKeywordOptionPanelProvider;
this.filterFileExtensionsOptionPanelProvider = filterFileExtensionsOptionPanelProvider;
groupSimilarResults = new JCheckBox(I18n.tr("Group similar search results together"));
groupSimilarResults.setContentAreaFilled(false);
torrentWebSearchActivated = new JCheckBox(I18n.tr("Use web search to find additional torrent sources"));
torrentWebSearchActivated.setContentAreaFilled(false);
setLayout(new MigLayout("nogrid, insets 15 15 15 15, fillx, gap 4"));
add(getSearchBarPanel(), "growx, wrap");
add(getFilteringPanel(), "growx, wrap");
add(groupSimilarResults);
add(new LearnMoreButton("http://www.gnutellaforums.com/"), "wrap");
add(torrentWebSearchActivated);
}
private OptionPanel getSearchBarPanel() {
if (searchBarPanel == null) {
searchBarPanel = new SearchBarPanel();
}
return searchBarPanel;
}
@Override
ApplyOptionResult applyOptions() {
SwingUiSettings.GROUP_SIMILAR_RESULTS_ENABLED.setValue(groupSimilarResults.isSelected());
SearchSettings.USE_TORRENT_WEB_SEARCH.setValue(torrentWebSearchActivated.isSelected());
ApplyOptionResult result = null;
result = getSearchBarPanel().applyOptions();
if (result.isSuccessful())
result.applyResult(getFilteringPanel().applyOptions());
return result;
}
@Override
boolean hasChanged() {
return getSearchBarPanel().hasChanged()
|| getFilteringPanel().hasChanged()
|| groupSimilarResults.isSelected() != SwingUiSettings.GROUP_SIMILAR_RESULTS_ENABLED.getValue()
|| torrentWebSearchActivated.isSelected() != SearchSettings.USE_TORRENT_WEB_SEARCH.getValue();
}
@Override
public void initOptions() {
getSearchBarPanel().initOptions();
getFilteringPanel().initOptions();
groupSimilarResults.setSelected(SwingUiSettings.GROUP_SIMILAR_RESULTS_ENABLED.getValue());
torrentWebSearchActivated.setSelected(SearchSettings.USE_TORRENT_WEB_SEARCH.getValue());
}
private class SearchBarPanel extends OptionPanel {
private JComboBox defaultSearchSpinner;
private JCheckBox searchTabNumberCheckBox;
private JCheckBox suggestSmartQueries;
private JButton clearNowButton;
public SearchBarPanel() {
super(I18n.tr("Search Bar"));
createComponents();
add(new JLabel(I18n.tr("By default, search for")));
add(defaultSearchSpinner, "wrap");
add(suggestSmartQueries, "wrap");
add(searchTabNumberCheckBox, "gapright push");
add(clearNowButton, "alignx right, wrap");
}
private void createComponents() {
defaultSearchSpinner = new NonNullJComboBox(SearchCategory.values());
defaultSearchSpinner.setRenderer(new CategoryCellRenderer());
defaultSearchSpinner.removeItem(SearchCategory.OTHER);
LibrarySettings.ALLOW_PROGRAMS.addSettingListener(new SearchSettingListener(
LibrarySettings.ALLOW_PROGRAMS, SearchCategory.PROGRAM,
defaultSearchSpinner));
suggestSmartQueries = new JCheckBox(I18n.tr("Suggest smart searches"));
suggestSmartQueries.setOpaque(false);
searchTabNumberCheckBox = new JCheckBox(I18n.tr("Remember my recent searches"));
searchTabNumberCheckBox.setOpaque(false);
clearNowButton = new JButton(new AbstractAction(I18n.tr("Clear Now")) {
@Override
public void actionPerformed(ActionEvent e) {
searchHistory.clear();
}
});
}
@Override
ApplyOptionResult applyOptions() {
SearchCategory category = (SearchCategory) defaultSearchSpinner.getSelectedItem();
if (category != null) {
SwingUiSettings.DEFAULT_SEARCH_CATEGORY_ID
.setValue(category.getId());
}
SwingUiSettings.SHOW_SMART_SUGGESTIONS.setValue(suggestSmartQueries.isSelected());
SwingUiSettings.KEEP_SEARCH_HISTORY.setValue(searchTabNumberCheckBox.isSelected());
return new ApplyOptionResult(false, true);
}
@Override
boolean hasChanged() {
return SwingUiSettings.DEFAULT_SEARCH_CATEGORY_ID.getValue() != ((SearchCategory) defaultSearchSpinner.getSelectedItem()).getId()
|| SwingUiSettings.SHOW_SMART_SUGGESTIONS.getValue() != suggestSmartQueries.isSelected()
|| SwingUiSettings.KEEP_SEARCH_HISTORY.getValue() != searchTabNumberCheckBox.isSelected();
}
@Override
public void initOptions() {
defaultSearchSpinner.setSelectedItem(SearchCategory.forId(SwingUiSettings.DEFAULT_SEARCH_CATEGORY_ID.getValue()));
suggestSmartQueries.setSelected(SwingUiSettings.SHOW_SMART_SUGGESTIONS.getValue());
searchTabNumberCheckBox.setSelected(SwingUiSettings.KEEP_SEARCH_HISTORY.getValue());
}
}
private static class CategoryCellRenderer extends DefaultListCellRenderer {
public CategoryCellRenderer() {
setOpaque(true);
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
SearchCategory category = (SearchCategory)value;
setText(SearchCategoryUtils.getOptionsName(category));
return this;
}
}
private OptionPanel getFilteringPanel() {
if(filteringPanel == null) {
filteringPanel = new FilteringPanel();
}
return filteringPanel;
}
@Override
void setOptionTabItem(OptionTabItem tab) {
super.setOptionTabItem(tab);
getFilteringPanel().setOptionTabItem(tab);
getSearchBarPanel().setOptionTabItem(tab);
}
private class FilteringPanel extends OptionPanel {
private final class SpamOptionPanel extends JPanel {
{
setLayout(new MigLayout("gapy 10, nogrid"));
add(new JLabel(I18n.tr("Do you want to reset the Spam Filter?")) , "wrap");
add(new MultiLineLabel(I18n.tr("This will clear all the files marked as spam. Doing this may result in more spam in search results."), 400) , "wrap");
JButton okButton = new JButton(new OKDialogAction(I18n.tr("Reset")));
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
spamManager.clearFilterData();
}
});
add(okButton, "tag ok, alignx right,");
add(new JButton(new CancelDialogAction()), "tag cancel");
}
}
private FilterKeywordOptionPanel filterKeywordPanel;
private FilterFileExtensionsOptionPanel filterFileExtensionPanel;
private JCheckBox adultContentCheckBox;
private JButton filterKeywordsButton;
private JButton filterFileExtensionsButton;
private final JButton configureButton;
private JButton clearSpamButton;
public FilteringPanel() {
super(I18n.tr("Search Filtering"));
configureButton = new JButton(new DialogDisplayAction( SearchOptionPanel.this,
unsafeOptionPanel, I18n.tr("Unsafe File Sharing"),
I18n.tr("Configure..."), I18n.tr("Configure unsafe file sharing settings")));
filterKeywordPanel = filterKeywordOptionPanelProvider.get();
filterKeywordPanel.setPreferredSize(new Dimension(300,400));
filterFileExtensionPanel = filterFileExtensionsOptionPanelProvider.get();
filterFileExtensionPanel.setPreferredSize(new Dimension(300,400));
adultContentCheckBox = new JCheckBox("<html>"+I18n.tr("Don't show adult content in search results")+"</html>");
adultContentCheckBox.setContentAreaFilled(false);
filterKeywordsButton = new JButton(new DialogDisplayAction(SearchOptionPanel.this,
filterKeywordPanel, I18n.tr("Filter Keywords"),
I18n.tr("Filter Keywords..."),
I18n.tr("Restrict files with certain words from being displayed in search results")));
filterFileExtensionsButton = new JButton(new DialogDisplayAction( SearchOptionPanel.this,
filterFileExtensionPanel, I18n.tr("Filter File Extensions"),
I18n.tr("Filter File Extensions..."),
I18n.tr("Restrict files with certain extensions from being displayed in search results")));
clearSpamButton = new JButton(new DialogDisplayAction(SearchOptionPanel.this, new SpamOptionPanel(), I18n.tr("Reset Spam Filter"), I18n.tr("Reset Spam Filter..."), I18n.tr("Reset the Spam filter by clearing all files marked as spam")));
JLabel programSharingLabel = new JLabel(I18n.tr("Change the ability to search for Programs"));
add(programSharingLabel, "");
add(configureButton, "wrap");
add(adultContentCheckBox, "gapbottom 10, wrap");
add(filterKeywordsButton, "gapright 10, alignx left");
add(filterFileExtensionsButton, "gapright 10, alignx left");
add(clearSpamButton, "gapright 10, alignx left, wrap");
}
@Override
ApplyOptionResult applyOptions() {
if (FilterSettings.FILTER_ADULT.getValue() != adultContentCheckBox.isSelected()) {
FilterSettings.FILTER_ADULT.setValue(adultContentCheckBox.isSelected());
BackgroundExecutorService.execute(new Runnable() {
@Override
public void run() {
spamManager.adjustSpamFilters();
}
});
}
ApplyOptionResult result = filterKeywordPanel.applyOptions();
if (result.isSuccessful())
result.applyResult(filterFileExtensionPanel.applyOptions());
if (result.isSuccessful())
result.applyResult(unsafeOptionPanel.applyOptions());
return result;
}
@Override
boolean hasChanged() {
return FilterSettings.FILTER_ADULT.getValue() != adultContentCheckBox.isSelected()
|| filterKeywordPanel.hasChanged()
|| filterFileExtensionPanel.hasChanged()
|| unsafeOptionPanel.hasChanged();
}
@Override
public void initOptions() {
adultContentCheckBox.setSelected(FilterSettings.FILTER_ADULT.getValue());
filterKeywordPanel.initOptions();
filterFileExtensionPanel.initOptions();
unsafeOptionPanel.initOptions();
}
}
}