package org.limewire.ui.swing.warnings; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import org.limewire.core.api.Category; import org.limewire.core.api.file.CategoryManager; import org.limewire.core.api.library.LocalFileList; import org.limewire.ui.swing.components.FocusJOptionPane; import org.limewire.ui.swing.library.LibraryMediator; import org.limewire.ui.swing.library.navigator.LibraryNavItem; import org.limewire.ui.swing.library.navigator.LibraryNavigatorTable; import org.limewire.ui.swing.util.I18n; import com.google.inject.Inject; import com.google.inject.Provider; /** * Clears any filters that may be on the library, then handles logic around * looping through a list of files and calling addFile or addFoler as necessary * on the provided LocalFileList. */ class LibraryFileAdder { private final Provider<LibraryMediator> libraryMediator; private final Provider<LibraryNavigatorTable> libraryNavigatorTable; private final CategoryManager categoryManager; @Inject public LibraryFileAdder(Provider<LibraryMediator> libraryMediator, Provider<LibraryNavigatorTable> libraryNavigatorTable, CategoryManager categoryManager) { this.libraryMediator = libraryMediator; this.libraryNavigatorTable = libraryNavigatorTable; this.categoryManager = categoryManager; } /** * Adds all files to the given list. If a file in files is a directory, then * the FileFilter is applied to any files within that directory to see if * they should be added also. */ void addFilesInner(final LocalFileList fileList, final List<File> files, final FileFilter fileFilter) { //only clear the filters if the library has been initialized if(libraryMediator.get().isInitialized()) { //only clear the filters if we are adding files to the same list that is being shown LibraryNavItem libraryNavItem = libraryNavigatorTable.get().getSelectedItem(); if(libraryNavItem != null && libraryNavItem.getLocalFileList() == fileList && shouldClearFilter(files)) { libraryMediator.get().clearFilters(); } } List<File> rejectedFiles = new ArrayList<File>(); for(File file : files) { if(fileList.isDirectoryAllowed(file)) { // add as directory if it's a directory fileList.addFolder(file, fileFilter); } else if(fileList.isFileAllowed(file)) { // add as file if it's a file. fileList.addFile(file); } else { // otherwise it was rejected! rejectedFiles.add(file); } } // if anything was rejected notify user if(rejectedFiles.size() > 0) { FocusJOptionPane.showMessageDialog(null, getRejectedMessage(rejectedFiles), I18n.trn("File/Folder not added", "File(s)/Folder(s) not added", rejectedFiles.size()), JOptionPane.INFORMATION_MESSAGE); } } /** * Returns true if this list of files contains directories, one or more files * that are not part of the selected category. */ private boolean shouldClearFilter(List<File> files) { Category category = libraryMediator.get().getComponent().getSelectedCategory(); boolean shouldClear = false; for(File file : files) { if(file.isDirectory()) { shouldClear = true; break; } Category fileCategory = categoryManager.getCategoryForFile(file); if(fileCategory != category) { shouldClear = true; break; } } return shouldClear; } /** * Returns message to show when one or more files/folders were * rejected. */ private String getRejectedMessage(List<File> rejectedFiles) { // display name if it was only 1 folder/file if(rejectedFiles.size() == 1) { return I18n.tr("{0} could not be added to the Library.", rejectedFiles.get(0).getName()); } else { // display the number of files/folders that were rejected. int folderCount = 0; int fileCount = 0; for(File file : rejectedFiles) { if(file.isDirectory()) folderCount += 1; else fileCount += 1; } if(folderCount > 0 && fileCount > 0) return I18n.tr("{0} folders and {1} files could not be added to the Library.", folderCount, fileCount); else if(folderCount > 0) return I18n.tr("{0} folders could not be added to the Library.", folderCount); else return I18n.tr("{0} files could not be added to the Library.", fileCount); } } }