package com.limegroup.gnutella.gui.download; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.limegroup.gnutella.Assert; import com.limegroup.gnutella.Downloader; import com.limegroup.gnutella.Endpoint; import com.limegroup.gnutella.ErrorService; import com.limegroup.gnutella.FileDesc; import com.limegroup.gnutella.FileDetails; import com.limegroup.gnutella.FileManager; import com.limegroup.gnutella.MediaType; import com.limegroup.gnutella.RemoteFileDesc; import com.limegroup.gnutella.RouterService; import com.limegroup.gnutella.SaveLocationException; import com.limegroup.gnutella.URN; import com.limegroup.gnutella.gui.FileChooserHandler; import com.limegroup.gnutella.gui.FileDetailsProvider; import com.limegroup.gnutella.gui.GUIMediator; import com.limegroup.gnutella.gui.MessageService; import com.limegroup.gnutella.gui.PaddedPanel; import com.limegroup.gnutella.gui.actions.BitziLookupAction; import com.limegroup.gnutella.gui.actions.CopyMagnetLinkToClipboardAction; import com.limegroup.gnutella.gui.actions.LimeAction; import com.limegroup.gnutella.gui.actions.SearchAction; import com.limegroup.gnutella.gui.options.OptionsMediator; import com.limegroup.gnutella.gui.playlist.PlaylistMediator; import com.limegroup.gnutella.gui.search.SearchInformation; import com.limegroup.gnutella.gui.search.SearchMediator; import com.limegroup.gnutella.gui.tables.AbstractTableMediator; import com.limegroup.gnutella.gui.tables.ColumnPreferenceHandler; import com.limegroup.gnutella.gui.tables.DataLine; import com.limegroup.gnutella.gui.tables.DragManager; import com.limegroup.gnutella.gui.tables.LimeJTable; import com.limegroup.gnutella.gui.tables.LimeTableColumn; import com.limegroup.gnutella.gui.tables.SimpleColumnListener; import com.limegroup.gnutella.gui.tables.TableSettings; import com.limegroup.gnutella.gui.themes.ThemeMediator; import com.limegroup.gnutella.gui.themes.ThemeSettings; import com.limegroup.gnutella.gui.util.CoreExceptionHandler; import com.limegroup.gnutella.settings.QuestionsHandler; import com.limegroup.gnutella.settings.SearchSettings; import com.limegroup.gnutella.settings.SharingSettings; import com.limegroup.gnutella.util.CommonUtils; import com.limegroup.gnutella.util.Launcher; import com.limegroup.gnutella.util.ProcessingQueue; import com.limegroup.gnutella.util.StringUtils; /** * This class acts as a mediator between all of the components of the * download window. It also constructs all of the download window * components. */ public final class DownloadMediator extends AbstractTableMediator implements FileDetailsProvider { private static final Log LOG = LogFactory.getLog(DownloadMediator.class); /** * Variable for the total number of downloads that have been added in this * session. */ private static int _totalDownloads = 0; /** * Flag for whether or not an mp3 file has been launched from the download * window. */ private static boolean _audioLaunched = false; /** * instance, for singleton acces */ private static DownloadMediator _instance = new DownloadMediator(); /** * The queue that launched items are processed in. */ private static final ProcessingQueue QUEUE = new ProcessingQueue("DownloadLauncher"); public static DownloadMediator instance() { return _instance; } /** * Variables so only one ActionListener needs to be created for both * the buttons & popup menu. */ private Action removeAction; private Action chatAction; private Action clearAction; private Action browseAction; private Action launchAction; private Action resumeAction; private Action pauseAction; private Action priorityUpAction; private Action priorityDownAction; private Action editLocationAction; private Action magnetAction; private Action bitziAction; private Action exploreAction; /** The actual download buttons instance. */ private DownloadButtons _downloadButtons; /** * Overriden to have different default values for tooltips. */ protected void buildSettings() { SETTINGS = new TableSettings(ID) { public boolean getDefaultTooltips() { return false; } }; } /** * Sets up drag & drop for the table. */ protected void setupDragAndDrop() { DragManager.install(TABLE); } /** * Build some extra listeners */ protected void buildListeners() { super.buildListeners(); removeAction = new RemoveAction(); chatAction = new ChatAction(); clearAction = new ClearAction(); browseAction = new BrowseAction(); launchAction = new LaunchAction(); resumeAction = new ResumeAction(); pauseAction = new PauseAction(); priorityUpAction = new PriorityUpAction(); priorityDownAction = new PriorityDownAction(); editLocationAction = new EditLocationAction(); magnetAction = new CopyMagnetLinkToClipboardAction(this); exploreAction = new ExploreAction(); bitziAction = new BitziLookupAction(this); } /** * Returns the most prominent actions that operate on the download table. * @return */ public Action[] getActions() { Action[] actions; if(CommonUtils.isWindows()||CommonUtils.isMacOSX()) actions = new Action[] { priorityUpAction, priorityDownAction, removeAction, resumeAction, pauseAction, launchAction, exploreAction,clearAction}; else actions = new Action[] { priorityUpAction, priorityDownAction, removeAction, resumeAction, pauseAction, launchAction,clearAction }; return actions; } /** * Set up the necessary constants. */ protected void setupConstants() { MAIN_PANEL = new PaddedPanel(GUIMediator.getStringResource("DOWNLOAD_TITLE")); DATA_MODEL = new DownloadModel(); TABLE = new LimeJTable(DATA_MODEL); _downloadButtons = new DownloadButtons(this); BUTTON_ROW = _downloadButtons.getComponent(); } /** * Sets up the table headers. */ protected void setupTableHeaders() { super.setupTableHeaders(); // set the queue panel to be visible depending on whether or // not the priority column is visible. Object pId = DATA_MODEL.getColumnId(DownloadDataLine.PRIORITY_INDEX); _downloadButtons.setQueuePanelVisible(TABLE.isColumnVisible(pId)); // add a listener to keep the queue panel in synch with the priority column ColumnPreferenceHandler cph = TABLE.getColumnPreferenceHandler(); cph.setSimpleColumnListener(new SimpleColumnListener() { public void columnAdded(LimeTableColumn ltc, LimeJTable table) { Assert.that(table == TABLE); if(ltc.getModelIndex() == DownloadDataLine.PRIORITY_INDEX) _downloadButtons.setQueuePanelVisible(true); } public void columnRemoved(LimeTableColumn ltc, LimeJTable table) { Assert.that(table == TABLE); if(ltc.getModelIndex() == DownloadDataLine.PRIORITY_INDEX) _downloadButtons.setQueuePanelVisible(false); } }); } /** * Update the splash screen. */ protected void updateSplashScreen() { GUIMediator.setSplashScreenString( GUIMediator.getStringResource("SPLASH_STATUS_DOWNLOAD_WINDOW")); } /** * Constructs all of the elements of the download window, including * the table, the buttons, etc. */ private DownloadMediator() { super("DOWNLOAD_TABLE"); GUIMediator.addRefreshListener(this); ThemeMediator.addThemeObserver(this); if(SETTINGS.REAL_TIME_SORT.getValue()) DATA_MODEL.sort(DownloadDataLine.PRIORITY_INDEX); // ascending } /** * Override the default refreshing so that we can * set the clear button appropriately. */ public void doRefresh() { boolean inactivePresent = ((Boolean)DATA_MODEL.refresh()).booleanValue(); clearAction.setEnabled(inactivePresent); int[] selRows = TABLE.getSelectedRows(); if (selRows.length > 0) { DownloadDataLine dataLine = (DownloadDataLine)DATA_MODEL.get(selRows[0]); if (dataLine.getState() == Downloader.WAITING_FOR_USER) { resumeAction.putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_SOURCES")); resumeAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_SOURCES_BUTTON_LABEL")); resumeAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_SOURCES_BUTTON_TIP")); } else { resumeAction.putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_RESUME")); resumeAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_RESUME_BUTTON_LABEL")); resumeAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_RESUME_BUTTON_TIP")); } boolean inactive = dataLine.isDownloaderInactive(); boolean pausable = !dataLine.getDownloader().isPaused() && !dataLine.getDownloader().isCompleted(); resumeAction.setEnabled(inactive); pauseAction.setEnabled(pausable); priorityUpAction.setEnabled(inactive && pausable); priorityDownAction.setEnabled(inactive && pausable); exploreAction.setEnabled(dataLine.getDownloader().isCompleted()); } } /** * Returns the total number of Downloads that have occurred in this session. * * @return the total number of Downloads that have occurred in this session */ public int getTotalDownloads() { return _totalDownloads; } /** * Returns the total number of current Downloads. * * @return the total number of current Downloads */ public int getCurrentDownloads() { return ((DownloadModel)DATA_MODEL).getCurrentDownloads(); } /** * Returns the total number of active Downloads. * This includes anything that is still viewable in the Downloads view. * * @return the total number of active Downloads */ public int getActiveDownloads() { return ((DownloadModel)DATA_MODEL).getRowCount(); } /** * Overrides the default add. * * Adds a new Downloads to the list of Downloads, obtaining the necessary * information from the supplied <tt>Downloader</tt>. * * If the download is not already in the list, then it is added. * <p> */ public void add(Object downloader) { if ( !DATA_MODEL.contains(downloader) ) { _totalDownloads++; super.add(downloader); } } /** * Overrides the default remove. * * Takes action upon downloaded theme files, asking if the user wants to * apply the theme. * * Removes a download from the list if the user has configured their system * to automatically clear completed download and if the download is * complete. * * @param downloader the <tt>Downloader</tt> to remove from the list if it is * complete. */ public void remove(Object downloader) { Downloader dloader = (Downloader)downloader; int state = dloader.getState(); if (state == Downloader.COMPLETE && isThemeFile(dloader.getSaveFile().getName())) { File themeFile = dloader.getDownloadFragment(); themeFile = copyToThemeDir(themeFile); // don't allow changing of theme while options are visible, // but notify the user how to change the theme if (OptionsMediator.instance().isOptionsVisible()) { GUIMediator.showFormattedMessage("DOWNLOAD_EXPLAIN_HOW_TO_CHANGE_THEME", new String[] { ThemeSettings.formatName(dloader.getSaveFile().getName()), GUIMediator.getStringResource("MENU_VIEW_THEMES_REFRESH"), GUIMediator.getStringResource("MENU_VIEW_TITLE"), GUIMediator.getStringResource("MENU_VIEW_THEMES_TITLE"), }); } else { int response = GUIMediator.showYesNoMessage( "DOWNLOAD_APPLY_NEW_THEME_START", ThemeSettings.formatName(dloader.getSaveFile().getName()), "DOWNLOAD_APPLY_NEW_THEME_END", QuestionsHandler.THEME_DOWNLOADED); if( response == GUIMediator.YES_OPTION ) { ThemeMediator.changeTheme(themeFile); } } } if(SharingSettings.CLEAR_DOWNLOAD.getValue() && ( state == Downloader.COMPLETE || state == Downloader.ABORTED ) ) { super.remove(downloader); } else { DownloadDataLine ddl = (DownloadDataLine)DATA_MODEL.get(downloader); if (ddl != null) ddl.setEndTime(System.currentTimeMillis()); } } /** * Opens a file-chooser dialog and lets the user choose a torrent file * specifying a torrent to download. */ public void openTorrent() { File file = FileChooserHandler.getInputFile(GUIMediator.getAppFrame(), TorrentFileFilter.INSTANCE); if (file == null) return; try { add(RouterService.downloadTorrent(file)); } catch (java.io.FileNotFoundException fnfe) { ErrorService.error(fnfe); } catch (IOException ioe) {ioe.printStackTrace(); // could not read torrent file or bad torrent file. GUIMediator.showError("ERROR_COULD_NOT_OPEN_TORRENT", "\"" + file.getName() + "\".", QuestionsHandler.TORRENT_OPEN_FAILURE); } catch (Throwable t) { ErrorService.error(t); } } private File copyToThemeDir(File themeFile) { File themeDir = ThemeSettings.THEME_DIR_FILE; File realLoc = new File(themeDir, themeFile.getName()); // if they're the same, just use it. if( realLoc.equals(themeFile) ) return themeFile; // otherwise, if the file already exists in the theme dir, remove it. realLoc.delete(); // copy from shared to theme dir. CommonUtils.copy(themeFile, realLoc); return realLoc; } private boolean isThemeFile(String name) { return name.toLowerCase().endsWith(ThemeSettings.EXTENSION); } /** * Launches the selected files in the <tt>Launcher</tt> or in the built-in * media player. */ void launchSelectedDownloads() { final DataLine[] lines = TABLE.getSelectedDataLines(); _audioLaunched = false; for(int i = 0; i < lines.length; i++) { final Downloader dl = (Downloader)lines[i].getInitializeObject(); QUEUE.add(new Runnable() { public void run() { if(dl.getState() == Downloader.INVALID) { GUIMediator.openURL("http://filtered.limewire.com/removed"); } else { File toLaunch = dl.getDownloadFragment(); if (toLaunch == null) { GUIMediator.showMessage("NO_PREVIEW_BEGIN", dl.getSaveFile().getName(), "NO_PREVIEW_END", QuestionsHandler.NO_PREVIEW_REPORT); return; } if (!_audioLaunched && PlaylistMediator.isPlayableFile(toLaunch) && GUIMediator.isPlaylistVisible()) { GUIMediator.instance().launchAudio(toLaunch); _audioLaunched = true; } else { try { GUIMediator.launchFile(toLaunch); } catch (IOException ignored) {} } } } }); } } /** * Pauses all selected downloads. */ void pauseSelectedDownloads() { DataLine[] lines = TABLE.getSelectedDataLines(); for(int i = 0; i < lines.length; i++) ((Downloader)lines[i].getInitializeObject()).pause(); } /** * Launches explorer */ void launchExplorer() { final DataLine[] lines = TABLE.getSelectedDataLines(); final Downloader dl = (Downloader)lines[lines.length-1].getInitializeObject(); File toExplore = dl.getFile(); if (toExplore == null) return; try { Launcher.launchExplorer(toExplore); } catch (SecurityException ignore) { } catch (IOException ignore) {} } /** * Changes the priority of the selected downloads by amt. */ void bumpPriority(final boolean up, int amt) { DataLine[] lines = TABLE.getSelectedDataLines(); // sort the lines by priority. // this is necessary so that they move in the correct order Arrays.sort(lines, new Comparator() { public int compare(Object a, Object b) { int pa = ((Downloader)((DataLine)a).getInitializeObject()). getInactivePriority(); int pb = ((Downloader)((DataLine)b).getInitializeObject()). getInactivePriority(); return (pa < pb ? -1 : pa > pb ? 1 : 0) * ( up ? 1 : -1 ); } }); for(int i = 0; i < lines.length; i++) { Downloader dl = (Downloader)lines[i].getInitializeObject(); RouterService.getDownloadManager().bumpPriority(dl, up, amt); } } /** * Forces the selected downloads in the download window to resume. */ void resumeSelectedDownloads() { DataLine[] lines = TABLE.getSelectedDataLines(); for(int i = 0; i < lines.length; i++) { DownloadDataLine dd = (DownloadDataLine)lines[i]; Downloader downloader = dd.getDownloader(); if(!dd.isCleaned()) downloader.resume(); } } /** * Opens up a chat session with the selected hosts in the download * window. */ void chatWithSelectedDownloads() { DataLine[] lines = TABLE.getSelectedDataLines(); for(int i = 0; i < lines.length; i++) { DataLine dl = lines[i]; Downloader downloader=(Downloader)dl.getInitializeObject(); Endpoint end = downloader.getChatEnabledHost(); if (end!=null) RouterService.createChat(end.getAddress(), end.getPort()); } } /** * Shows file chooser dialog for first selected download. * */ void editSelectedDownload() { DataLine[] lines = TABLE.getSelectedDataLines(); Downloader dl = (Downloader)lines[0].getInitializeObject(); File saveLocation = dl.getSaveFile(); File saveFile = FileChooserHandler.getSaveAsFile(MessageService.getParentComponent(), "DOWNLOAD_LOCATION_DIALOG_TITLE", saveLocation); if (saveFile == null) return; try { // note: if the user did not change the file location // and you try setting the same location as is set, // you get an exception because the // filename is already taken by the same downloader if (!saveFile.equals(dl.getSaveFile())) { dl.setSaveFile(saveFile.getParentFile(), saveFile.getName(), false); } } catch (SaveLocationException sle) { CoreExceptionHandler.handleSaveLocationError(sle); } } /** * Opens up a browse session with the selected hosts in the download * window. */ void browseSelectedDownloads() { DataLine[] lines = TABLE.getSelectedDataLines(); for(int i = 0; i < lines.length; i++) { DataLine dl = lines[i]; Downloader downloader=(Downloader)dl.getInitializeObject(); RemoteFileDesc end = downloader.getBrowseEnabledHost(); if (end != null) SearchMediator.doBrowseHost(end); } } /** * Handles a double-click event in the table. */ public void handleActionKey() { launchSelectedDownloads(); } /** * Clears the downloads in the download window that have completed. */ void clearCompletedDownloads() { ((DownloadModel)DATA_MODEL).clearCompleted(); clearSelection(); clearAction.setEnabled(false); } /** * Returns the selected {@link FileDetails}. */ public FileDetails[] getFileDetails() { DataLine[] lines = TABLE.getSelectedDataLines(); FileManager fmanager = RouterService.getFileManager(); ArrayList list = new ArrayList(lines.length); for (int i = 0; i < lines.length; i++) { URN urn = ((DownloadDataLine)lines[i]).getDownloader().getSHA1Urn(); if (urn != null) { FileDesc fd = fmanager.getFileDescForUrn(urn); if (fd != null) { list.add(fd); } else if (LOG.isDebugEnabled()) { LOG.debug("not filedesc for urn " + urn); } } else if (LOG.isDebugEnabled()) { LOG.debug("no urn"); } } return (FileDetails[])list.toArray(new FileDetails[0]); } // inherit doc comment protected JPopupMenu createPopupMenu() { JPopupMenu menu = new JPopupMenu(); menu.add(new JMenuItem(removeAction)); menu.add(new JMenuItem(resumeAction)); menu.add(new JMenuItem(pauseAction)); menu.add(new JMenuItem(launchAction)); if(CommonUtils.isWindows()||CommonUtils.isMacOSX()) menu.add(new JMenuItem(exploreAction)); menu.addSeparator(); menu.add(new JMenuItem(clearAction)); menu.addSeparator(); menu.add(createSearchMenu()); menu.add(new JMenuItem(chatAction)); menu.add(new JMenuItem(browseAction)); menu.add(new JMenuItem(editLocationAction)); // menu.addSeparator(); // menu.add(createAdvancedSubMenu()); return menu; } private JMenu createSearchMenu() { JMenu menu = new JMenu(GUIMediator.getStringResource("DOWNLOAD_SEARCH_MENU")); DataLine[] lines = TABLE.getSelectedDataLines(); if ( lines.length == 0 ) { // is there any file selected ? menu.setEnabled(false); return menu; } //-- make perform orginal query -- // get orginal query Downloader downloader = ((DownloadDataLine) lines[0]).getDownloader(); Map searchInfoMap = (Map) downloader.getAttribute( SearchMediator.SEARCH_INFORMATION_KEY ); if ( searchInfoMap != null ) { SearchInformation searchInfo = SearchInformation.createFromMap( searchInfoMap ); menu.add(new JMenuItem( new SearchAction( searchInfo ) )); } //-- make search for filename action -- // get name of the file java.lang.String filename = ((DownloadDataLine) lines[0]).getFileName(); // remove extension - searches searches filename not in specified format int dotPos = filename.lastIndexOf('.'); if ( dotPos > 0 ) filename = filename.substring( 0, dotPos ); filename = StringUtils.removeIllegalChars( filename ); // cut the file name if necessary if ( filename.length() > SearchSettings.MAX_QUERY_LENGTH.getValue() ) filename = filename.substring(0, SearchSettings.MAX_QUERY_LENGTH.getValue()); SearchInformation info = SearchInformation.createKeywordSearch (filename, null, MediaType.getAnyTypeMediaType()); if (SearchMediator.validateInfo(info) == SearchMediator.QUERY_VALID) menu.add(new JMenuItem( new SearchAction(info,"SEARCH_FOR_KEYWORDS_ACTION_NAME") )); return menu; } private JMenu createAdvancedSubMenu() { JMenu menu = new JMenu(GUIMediator.getStringResource ("GENERAL_ADVANCED_SUB_MENU")); menu.add(new JMenuItem(bitziAction)); menu.add(new JMenuItem(magnetAction)); return menu; } /** * Handles the selection of the specified row in the download window, * enabling or disabling buttons and chat menu items depending on * the values in the row. * * @param row the selected row */ public void handleSelection(int row) { DownloadDataLine dataLine = (DownloadDataLine)DATA_MODEL.get(row); chatAction.setEnabled(dataLine.getChatEnabled()); browseAction.setEnabled(dataLine.getBrowseEnabled()); boolean inactive = dataLine.isDownloaderInactive(); boolean pausable = !dataLine.getDownloader().isPaused() && !dataLine.getDownloader().isCompleted(); if (dataLine.getState() == Downloader.WAITING_FOR_USER) { resumeAction.putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_SOURCES")); resumeAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_SOURCES_BUTTON_LABEL")); resumeAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_SOURCES_BUTTON_TIP")); } else { resumeAction.putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_RESUME")); resumeAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_RESUME_BUTTON_LABEL")); resumeAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_RESUME_BUTTON_TIP")); } if (dataLine.isCompleted()) { removeAction.putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_KILL_COMPLETED_LABEL")); removeAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_KILL_BUTTON_COMPLETED_LABEL")); removeAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_KILL_BUTTON_COMPLETED_TIP")); launchAction.putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_LAUNCH_COMPLETED_LABEL")); launchAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_LAUNCH_BUTTON_COMPLETED_LABEL")); launchAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_LAUNCH_BUTTON_COMPLETED_TIP")); exploreAction.setEnabled(TABLE.getSelectedRowCount() == 1); } else { removeAction.putValue(Action.NAME, GUIMediator.getStringResource ("DOWNLOAD_POPUP_MENU_KILL_DOWNLOAD")); removeAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_KILL_BUTTON_LABEL")); removeAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_KILL_BUTTON_TIP")); launchAction.putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_LAUNCH")); launchAction.putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_LAUNCH_BUTTON_LABEL")); launchAction.putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_LAUNCH_BUTTON_TIP")); exploreAction.setEnabled(false); } removeAction.setEnabled(true); resumeAction.setEnabled(inactive); pauseAction.setEnabled(pausable); priorityDownAction.setEnabled(inactive && pausable); priorityUpAction.setEnabled(inactive && pausable); Downloader dl = (Downloader)dataLine.getInitializeObject(); editLocationAction.setEnabled(TABLE.getSelectedRowCount() == 1 && dl.isRelocatable()); magnetAction.setEnabled(dl.getSHA1Urn() != null); bitziAction.setEnabled(dl.getSHA1Urn() != null); launchAction.setEnabled(dl.getAmountRead() > 0); } /** * Handles the deselection of all rows in the download table, * disabling all necessary buttons and menu items. */ public void handleNoSelection() { removeAction.setEnabled(false); resumeAction.setEnabled(false); launchAction.setEnabled(false); pauseAction.setEnabled(false); chatAction.setEnabled(false); browseAction.setEnabled(false); priorityDownAction.setEnabled(false); priorityUpAction.setEnabled(false); editLocationAction.setEnabled(false); magnetAction.setEnabled(false); bitziAction.setEnabled(false); exploreAction.setEnabled(false); } private class RemoveAction extends AbstractAction { public RemoveAction() { putValue(Action.NAME, GUIMediator.getStringResource ("DOWNLOAD_POPUP_MENU_KILL_DOWNLOAD")); putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_KILL_BUTTON_LABEL")); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_KILL_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "DOWNLOAD_KILL"); } public void actionPerformed(ActionEvent e) { removeSelection(); } } private class ChatAction extends AbstractAction { public ChatAction() { putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_CHAT")); } public void actionPerformed(ActionEvent e) { chatWithSelectedDownloads(); } } private class ClearAction extends AbstractAction { public ClearAction() { putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_CLEAR")); putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_CLEAR_BUTTON_LABEL")); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_CLEAR_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "DOWNLOAD_CLEAR"); } public void actionPerformed(ActionEvent e) { clearCompletedDownloads(); } } private class BrowseAction extends AbstractAction { public BrowseAction() { putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_BROWSE")); } public void actionPerformed(ActionEvent e) { browseSelectedDownloads(); } } private class LaunchAction extends AbstractAction { public LaunchAction() { putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_LAUNCH")); putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_LAUNCH_BUTTON_LABEL")); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_LAUNCH_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "DOWNLOAD_LAUNCH"); } public void actionPerformed(ActionEvent e) { launchSelectedDownloads(); } } private class ResumeAction extends AbstractAction { public ResumeAction() { putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_RESUME")); putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_RESUME_BUTTON_LABEL")); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_RESUME_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "DOWNLOAD_FILE_MORE_SOURCES"); } public void actionPerformed(ActionEvent e) { resumeSelectedDownloads(); } } private class PauseAction extends AbstractAction { public PauseAction() { putValue(Action.NAME, GUIMediator.getStringResource("DOWNLOAD_POPUP_MENU_PAUSE")); putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("DOWNLOAD_PAUSE_BUTTON_LABEL")); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_PAUSE_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "DOWNLOAD_PAUSE"); } public void actionPerformed(ActionEvent e) { pauseSelectedDownloads(); } } private class ExploreAction extends AbstractAction { public ExploreAction() { putValue(Action.NAME, GUIMediator.getStringResource("LIBRARY_EXPLORE_BUTTON_LABEL")); putValue(LimeAction.SHORT_NAME, GUIMediator.getStringResource("LIBRARY_EXPLORE_BUTTON_LABEL")); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_EXPLORE_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "LIBRARY_EXPLORE"); } public void actionPerformed(ActionEvent e) { launchExplorer(); } } private class PriorityUpAction extends AbstractAction { public PriorityUpAction() { putValue(LimeAction.SHORT_NAME, ""); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_PRIORITY_UP_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "DOWNLOAD_PRIORITY_UP"); } public void actionPerformed(ActionEvent e) { if ((e.getModifiers() & ActionEvent.CTRL_MASK) != 0) bumpPriority(true, 10); //bump by 10 places else if ((e.getModifiers() & ActionEvent.ALT_MASK) != 0) bumpPriority(true, 0); //bump to top priority else bumpPriority(true, 1); } } private class PriorityDownAction extends AbstractAction { public PriorityDownAction() { putValue(LimeAction.SHORT_NAME, ""); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource("DOWNLOAD_PRIORITY_DOWN_BUTTON_TIP")); putValue(LimeAction.ICON_NAME, "DOWNLOAD_PRIORITY_DOWN"); } public void actionPerformed(ActionEvent e) { if ((e.getModifiers() & ActionEvent.CTRL_MASK) != 0) bumpPriority(false, 10); //bump by 10 places else if ((e.getModifiers() & ActionEvent.ALT_MASK) != 0) bumpPriority(false, 0); //bump to top priority else bumpPriority(false, 1); } } private class EditLocationAction extends AbstractAction { public EditLocationAction() { putValue(Action.NAME, GUIMediator.getStringResource ("DOWNLOAD_POPUP_MENU_EDIT_LOCATION_LABEL")); putValue(Action.SHORT_DESCRIPTION, GUIMediator.getStringResource ("DOWNLOAD_POPUP_MENU_EDIT_LOCATION_TIP")); } public void actionPerformed(ActionEvent e) { editSelectedDownload(); } } }