package org.limewire.ui.swing.library.table; import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import org.limewire.core.api.library.LibraryManager; import org.limewire.core.api.library.LocalFileItem; import org.limewire.core.api.library.SharedFileList; import org.limewire.core.api.library.SharedFileListManager; import org.limewire.ui.swing.action.AbstractAction; import org.limewire.ui.swing.components.FocusJOptionPane; import org.limewire.ui.swing.library.LibrarySelected; import org.limewire.ui.swing.player.PlayerMediator; import org.limewire.ui.swing.util.BackgroundExecutorService; import org.limewire.ui.swing.util.I18n; import com.google.inject.Inject; import com.google.inject.Provider; /** * Removes the selected file(s) from the library. */ class RemoveFromLibraryAction extends AbstractAction { private final Provider<List<LocalFileItem>> selectedLocalFileItems; private final LibraryManager libraryManager; private final SharedFileListManager sharedFileListManager; private final Provider<PlayerMediator> playerMediator; @Inject public RemoveFromLibraryAction(@LibrarySelected Provider<List<LocalFileItem>> selectedLocalFileItems, LibraryManager libraryManager, SharedFileListManager sharedFileListManager, Provider<PlayerMediator> playerMediator) { super(I18n.tr("All Lists and Library")); this.selectedLocalFileItems = selectedLocalFileItems; this.libraryManager = libraryManager; this.sharedFileListManager = sharedFileListManager; this.playerMediator = playerMediator; } @Override public void actionPerformed(ActionEvent e) { List<LocalFileItem> selected = selectedLocalFileItems.get(); String removeText = I18n.tr("Remove"); String cancelText = I18n.tr("Cancel"); Object[] options = new Object[] {removeText, cancelText}; int confirmation = FocusJOptionPane.showOptionDialog(null, getMessage(selected), I18n.trn("Remove File","Remove Files", selected.size()), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, cancelText); if (confirmation > -1 && options[confirmation] == removeText) { removeFromLibrary(libraryManager, playerMediator.get(), selected); } } private String getMessage(List<LocalFileItem> list) { if(list.size() == 1) { if(containsSharedFile(list)) return I18n.tr("Remove \"{0}\" from Library? This will unshare this file with everyone.", list.get(0).getFileName()); else return I18n.tr("Remove \"{0}\" from Library?", list.get(0).getFileName()); } else { if(containsSharedFile(list)) return I18n.tr("Remove {0} files from Library? This will unshare these files with everyone.", list.size()); else return I18n.tr("Remove {0} files from Library?", list.size()); } } /** * Returns true if at least one file list this list is contained in a * FileList that is shared with at least one person. */ private boolean containsSharedFile(List<LocalFileItem> list) { boolean hasSharedFile = false; sharedFileListManager.getModel().getReadWriteLock().readLock().lock(); try { for(SharedFileList sharedFileList : sharedFileListManager.getModel()) { if(sharedFileList.getFriendIds().size() > 0) { for(LocalFileItem item : list) { if(sharedFileList.contains(item.getFile())) { hasSharedFile = true; break; } } } } } finally { sharedFileListManager.getModel().getReadWriteLock().readLock().unlock(); } return hasSharedFile; } public static void removeFromLibrary(final LibraryManager libraryManager, final PlayerMediator playerMediator, final List<LocalFileItem> selected) { File currentSong = playerMediator.getCurrentMediaFile(); final List<File> toRemove = new ArrayList<File>(selected.size()); for(LocalFileItem item : selected) { if(item.getFile().equals(currentSong)){ playerMediator.stop(); } if(!item.isIncomplete()) { toRemove.add(item.getFile()); } } if(!toRemove.isEmpty()) { BackgroundExecutorService.execute(new Runnable() { @Override public void run() { for(File file : toRemove) { libraryManager.getLibraryManagedList().removeFile(file); } } }); } } }