package com.limegroup.gnutella.gui.search;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import com.limegroup.gnutella.MediaType;
import com.limegroup.gnutella.gui.GUIMediator;
import com.limegroup.gnutella.gui.actions.ActionUtils;
import com.limegroup.gnutella.gui.actions.BitziLookupAction;
import com.limegroup.gnutella.gui.actions.CopyMagnetLinkToClipboardAction;
import com.limegroup.gnutella.gui.actions.SearchAction;
import com.limegroup.gnutella.util.StringUtils;
import com.limegroup.gnutella.xml.LimeXMLDocument;
/**
* The search result menu.
*/
final class SearchResultMenu {
final ResultPanel PANEL;
/**
* Private constructor to ensure that this class can never be
* created.
*/
SearchResultMenu(ResultPanel rp) {
PANEL = rp;
}
private static void add(String s, ActionListener l,
JPopupMenu m, boolean enable) {
JMenuItem item = new JMenuItem(s);
item.addActionListener(l);
item.setEnabled(enable);
m.add(item);
}
private static void add(String s, ActionListener l,
JMenu m, boolean enable) {
JMenuItem item = new JMenuItem(s);
item.addActionListener(l);
item.setEnabled(enable);
m.add(item);
}
/**
* Creates the JPopupMenu.
*/
JPopupMenu createMenu(TableLine[] lines, boolean markAsSpam, boolean markAsNot) {
JPopupMenu menu = new JPopupMenu();
add(SearchMediator.DOWNLOAD_STRING, PANEL.DOWNLOAD_LISTENER,
menu, lines.length > 0);
add(GUIMediator.getStringResource("SEARCH_DOWNLOAD_AS_LABEL"),
PANEL.DOWNLOAD_AS_LISTENER, menu, lines.length == 1);
add(GUIMediator.getStringResource("LICENSE_VIEW_LICENSE"), new LicenseListener(),
menu, lines.length > 0 && lines[0].isLicenseAvailable());
add(SearchMediator.CHAT_STRING, PANEL.CHAT_LISTENER,
menu, lines.length > 0 && lines[0].isChatEnabled());
add(SearchMediator.BROWSE_HOST_STRING, PANEL.BROWSE_HOST_LISTENER,
menu, lines.length > 0 && lines[0].isBrowseHostEnabled());
add(SearchMediator.BLOCK_STRING, new BlockListener(),
menu, lines.length > 0);
JMenu spamMenu = new JMenu(SearchMediator.MARK_AS_STRING);
spamMenu.setEnabled(markAsSpam || markAsNot);
add(SearchMediator.SPAM_STRING, PANEL.MARK_AS_SPAM_LISTENER, spamMenu,
markAsSpam);
add(SearchMediator.NOT_SPAM_STRING, PANEL.MARK_AS_NOT_SPAM_LISTENER,
spamMenu, markAsNot);
menu.add(SearchMediator.MARK_AS_STRING, spamMenu);
// ///////////////////////////
menu.addSeparator();
TableLine line = lines.length > 0 ? lines[0] : null;
menu.add(createSearchAgainMenu(line));
menu.add(createAdvancedMenu(line));
menu.addSeparator();
add(SearchMediator.STOP_STRING, PANEL.STOP_LISTENER,
menu, !PANEL.isStopped());
add(SearchMediator.KILL_STRING, new CancelListener(),
menu, PANEL.isKillable());
return menu;
}
private JMenu createSearchAgainMenu(TableLine line) {
JMenu menu = new JMenu(GUIMediator.getStringResource
("SEARCH_RESULT_MENU_SEARCH_MORE_LABEL"));
menu.add(new JMenuItem(new RepeatSearchAction()));
if (line == null) {
menu.setEnabled(PANEL.isRepeatSearchEnabled());
return menu;
}
menu.addSeparator();
String keywords = StringUtils.createQueryString(line.getFilename());
SearchInformation info = SearchInformation.createKeywordSearch
(keywords, null, MediaType.getAnyTypeMediaType());
if (SearchMediator.validateInfo(info) == SearchMediator.QUERY_VALID) {
menu.add(new JMenuItem(new SearchAction(info, "SEARCH_FOR_KEYWORDS_ACTION_NAME")));
}
LimeXMLDocument doc = line.getXMLDocument();
if (doc != null) {
Action[] actions = ActionUtils.createSearchActions(doc);
for (int i = 0; i < actions.length; i++) {
menu.add(new JMenuItem(actions[i]));
}
}
return menu;
}
private JMenu createAdvancedMenu(TableLine line) {
JMenu menu = new JMenu(GUIMediator.getStringResource
("GENERAL_ADVANCED_SUB_MENU"));
if (line == null) {
menu.setEnabled(false);
return menu;
}
BitziLookupAction bitziAction = new BitziLookupAction(PANEL);
bitziAction.setEnabled(line.getRemoteFileDesc().getSHA1Urn() != null);
menu.add(new JMenuItem(bitziAction));
CopyMagnetLinkToClipboardAction magnet =
new CopyMagnetLinkToClipboardAction(PANEL);
magnet.setEnabled(line.hasNonFirewalledRFD());
menu.add(new JMenuItem(magnet));
// launch action
if(line.isLaunchable()) {
menu.addSeparator();
add(SearchMediator.LAUNCH_STRING, PANEL.DOWNLOAD_LISTENER,
menu.getPopupMenu(), true);
}
return menu;
}
private class LicenseListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
PANEL.showLicense();
}
}
private class BlockListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
PANEL.blockHost();
}
}
private class CancelListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
SearchMediator.killSearch();
}
}
private class RepeatSearchAction extends AbstractAction {
public RepeatSearchAction() {
putValue(Action.NAME, SearchMediator.REPEAT_SEARCH_STRING);
setEnabled(PANEL.isRepeatSearchEnabled());
}
public void actionPerformed(ActionEvent e) {
PANEL.repeatSearch();
}
}
}