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(); } } }