package org.limewire.ui.swing.downloads.table; import java.io.File; import javax.swing.JDialog; import org.limewire.core.api.FilePropertyKey; import org.limewire.core.api.download.DownloadAction; import org.limewire.core.api.download.DownloadException; import org.limewire.core.api.download.DownloadItem; import org.limewire.core.api.download.DownloadListManager; import org.limewire.core.api.download.DownloadState; import org.limewire.core.api.library.LibraryManager; import org.limewire.core.api.library.LocalFileItem; import org.limewire.core.api.search.SearchCategory; import org.limewire.core.settings.SearchSettings; import org.limewire.ui.swing.downloads.DownloadItemUtils; import org.limewire.ui.swing.library.LibraryMediator; import org.limewire.ui.swing.player.PlayerMediator; import org.limewire.ui.swing.properties.FileInfoDialogFactory; import org.limewire.ui.swing.properties.FileInfoDialog.FileInfoType; import org.limewire.ui.swing.search.DefaultSearchInfo; import org.limewire.ui.swing.search.KeywordAssistedSearchBuilder; import org.limewire.ui.swing.search.SearchHandler; import org.limewire.ui.swing.search.SearchInfo; import org.limewire.ui.swing.util.DownloadExceptionHandler; import org.limewire.ui.swing.util.FileChooser; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.NativeLaunchUtils; import org.limewire.util.FileUtils; import com.google.inject.Inject; import com.google.inject.Provider; public class DownloadActionHandler { public final static String PAUSE_COMMAND = "pause"; /**Cancels download, deletes file, and removes download from list*/ public final static String CANCEL_COMMAND = "cancel"; public final static String RESUME_COMMAND = "resume"; public final static String TRY_AGAIN_COMMAND = "try again"; public final static String LAUNCH_COMMAND = "launch"; public final static String PREVIEW_COMMAND = "preview"; public final static String PLAY_COMMAND = "play"; /**Removes download from list. Has no other effects.*/ public final static String REMOVE_COMMAND = "remove"; public final static String LOCATE_COMMAND = "locate"; public final static String LIBRARY_COMMAND = "library"; public final static String PROPERTIES_COMMAND = "properties"; public final static String INFO_COMMAND = "info"; public final static String LINK_COMMAND = "link"; public final static String SHARE_COMMAND = "share"; public final static String CHANGE_LOCATION_COMMAND = "change location"; public final static String SEARCH_AGAIN_COMMAND = "search again"; // private static final String ERROR_URL = "http://wiki.limewire.org/index.php?title=User_Guide_Download"; private final LibraryMediator libraryMediator; private DownloadListManager downloadListManager; private LibraryManager libraryManager; private final FileInfoDialogFactory fileInfoFactory; private final Provider<AVInfoPanel> avInfoPanelFactory; private final Provider<DownloadExceptionHandler> downloadExceptionHandler; private final SearchHandler searchHandler; private final Provider<KeywordAssistedSearchBuilder> searchBuilder; private final Provider<PlayerMediator> playerMediator; @Inject public DownloadActionHandler(DownloadListManager downloadListManager, LibraryMediator libraryMediator, LibraryManager libraryManager, FileInfoDialogFactory fileInfoFactory, Provider<AVInfoPanel> avInfoPanelFactory, Provider<DownloadExceptionHandler> downloadExceptionHandler, SearchHandler searchHandler, Provider<KeywordAssistedSearchBuilder> searchBuilder, Provider<PlayerMediator> playerMediator){ this.downloadListManager = downloadListManager; this.libraryMediator = libraryMediator; this.libraryManager = libraryManager; this.fileInfoFactory = fileInfoFactory; this.avInfoPanelFactory = avInfoPanelFactory; this.downloadExceptionHandler = downloadExceptionHandler; this.searchHandler = searchHandler; this.searchBuilder = searchBuilder; this.playerMediator = playerMediator; } public void performAction(final String actionCommmand, final DownloadItem item){ if (actionCommmand == CANCEL_COMMAND) { item.cancel(); } else if (actionCommmand == PAUSE_COMMAND) { item.pause(); } else if (actionCommmand == RESUME_COMMAND) { item.resume(); } else if (actionCommmand == TRY_AGAIN_COMMAND) { item.resume(); } else if (actionCommmand == LINK_COMMAND){ //Do nothing for now // NativeLaunchUtils.openURL(ERROR_URL); } else if (actionCommmand == PREVIEW_COMMAND || actionCommmand == LAUNCH_COMMAND || actionCommmand == PLAY_COMMAND){ if (item.isLaunchable()) { DownloadItemUtils.launch(item, playerMediator); } } else if (actionCommmand == LOCATE_COMMAND){ if(item.getDownloadingFile() != null) { NativeLaunchUtils.launchExplorer(item.getDownloadingFile()); } } else if (actionCommmand == PROPERTIES_COMMAND){ createFileInfoDialog(item); } else if (actionCommmand == REMOVE_COMMAND){ downloadListManager.remove(item); } else if( actionCommmand == LIBRARY_COMMAND) { libraryMediator.locateInLibrary(item); } else if (actionCommmand == CHANGE_LOCATION_COMMAND){ changeSaveLocation(item); } else if (actionCommmand == SEARCH_AGAIN_COMMAND) { searchHandler.doSearch(createSearchInfo(item)); } else if (actionCommmand == INFO_COMMAND) { showInfoDialog(item); } } /** * Opens a FileInfoDialog for the DownloadItem. If the item is * already complete, it will attempt to show the LocalFileItem * instead. */ private void createFileInfoDialog(DownloadItem item) { if(item.getState() != DownloadState.DONE && item.getState() != DownloadState.SCAN_FAILED) { JDialog dialog = fileInfoFactory.createFileInfoDialog(item, FileInfoType.DOWNLOADING_FILE); dialog.setVisible(true); } else if(item.getLaunchableFile() != null) { // if finished downloading, try showing all the information from the localFileItem LocalFileItem localItem = libraryManager.getLibraryManagedList().getFileItem(item.getLaunchableFile()); if(localItem != null) { JDialog dialog = fileInfoFactory.createFileInfoDialog(localItem, FileInfoType.LOCAL_FILE); dialog.setVisible(true); } else { // if can't find the localFileItem, revert to the downloadItem JDialog dialog = fileInfoFactory.createFileInfoDialog(item, FileInfoType.DOWNLOADING_FILE); dialog.setVisible(true); } } else { // if can't find the localFileItem, revert to the downloadItem JDialog dialog = fileInfoFactory.createFileInfoDialog(item, FileInfoType.DOWNLOADING_FILE); dialog.setVisible(true); } } private SearchInfo createSearchInfo(DownloadItem item) { String title = item.getPropertyString(FilePropertyKey.TITLE); if(title == null) { title = FileUtils.getFilenameNoExtension(item.getFileName()); } int maxLength = SearchSettings.MAX_QUERY_LENGTH.getValue(); if(title.length() > maxLength) { title = title.substring(0, maxLength); } // make search based on on title and category SearchInfo search = searchBuilder.get().attemptToCreateAdvancedSearch(title, SearchCategory .forCategory(item.getCategory())); if (search != null) { return search; } // Fall back on the normal search return search = DefaultSearchInfo.createKeywordSearch(title, SearchCategory.forCategory(item.getCategory())); } private void changeSaveLocation(DownloadItem item){ // Prompt user for a new directory. File saveDir = FileChooser.getInputDirectory(GuiUtils.getMainFrame(), item.getSaveFile().getParentFile()); if (saveDir == null || saveDir.equals(item.getSaveFile().getParentFile())){ //nothing to see here. move along. return; } setSaveFile(item, saveDir, false); } private void setSaveFile(DownloadItem item, File saveDir, boolean overwrite){ try { // Update save file in DownloadItem. item.setSaveFile(saveDir, overwrite); } catch (DownloadException ex) { downloadExceptionHandler.get().handleDownloadException(new ChangeLocationDownloadAction(item), ex, false); } } /** * Displays an Info dialog for the specified download item. */ private void showInfoDialog(DownloadItem item) { switch (item.getDownloadItemType()) { case ANTIVIRUS: avInfoPanelFactory.get().showVendorMessage(); return; case BITTORRENT: switch (item.getState()) { case DANGEROUS: avInfoPanelFactory.get().showDangerMessage(item, false); return; case SCANNING: case SCANNING_FRAGMENT: avInfoPanelFactory.get().showVendorMessage(); return; case THREAT_FOUND: avInfoPanelFactory.get().showThreatMessage(item, false); return; case SCAN_FAILED: avInfoPanelFactory.get().showFailureMessage(item, false); return; default: createFileInfoDialog(item); return; } case GNUTELLA: switch (item.getState()) { case DANGEROUS: avInfoPanelFactory.get().showDangerMessage(item, false); return; case SCANNING: case SCANNING_FRAGMENT: avInfoPanelFactory.get().showVendorMessage(); return; case THREAT_FOUND: avInfoPanelFactory.get().showThreatMessage(item, false); return; case SCAN_FAILED: avInfoPanelFactory.get().showFailureMessage(item, false); return; } break; } } /** * Calls changeSaveLocation() on downloadCanceled() */ private class ChangeLocationDownloadAction implements DownloadAction{ private DownloadItem item; ChangeLocationDownloadAction(DownloadItem item){ this.item = item; } @Override public void download(File saveFile, boolean overwrite) throws DownloadException { setSaveFile(item, saveFile, overwrite); } @Override public void downloadCanceled(DownloadException ignored) { // do nothing } } }