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.Action;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.limewire.core.api.URN;
import org.limewire.core.api.download.DownloadItem;
import org.limewire.core.api.download.DownloadListManager;
import org.limewire.core.api.library.LibraryManager;
import org.limewire.core.api.library.LocalFileItem;
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 org.limewire.util.FileUtils;
import org.limewire.util.OSUtils;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Removes given list of files from the library then tries to move them to the
* trash or delete them.
*/
class DeleteAction extends AbstractAction {
private final Provider<List<LocalFileItem>> selectedLocalFileItems;
private final DownloadListManager downloadListManager;
private final LibraryManager libraryManager;
private final Provider<PlayerMediator> playerMediator;
@Inject
public DeleteAction(@LibrarySelected Provider<List<LocalFileItem>> selectedLocalFileItems,
DownloadListManager downloadListManager, Provider<PlayerMediator> playerMediator,
LibraryManager libraryManager) {
this.selectedLocalFileItems = selectedLocalFileItems;
this.downloadListManager = downloadListManager;
this.libraryManager = libraryManager;
this.playerMediator = playerMediator;
putValue(Action.NAME, I18n.tr("Delete from Disk"));
}
@Override
public void actionPerformed(ActionEvent e) {
List<LocalFileItem> selectedItems = new ArrayList<LocalFileItem>(selectedLocalFileItems.get());
String title = null;
String message = null;
String yesText = null;
String noText = I18n.tr("Cancel");
if (OSUtils.isWindows() && OSUtils.supportsTrash()) {
title = I18n.trn("Move File to the Recycle Bin", "Move Files to the Recycle Bin", selectedItems.size());
message = I18n.trn("Move this file to the Recycle Bin?",
"Move this file to the Recycle Bin?", selectedItems.size());
yesText = I18n.tr("Move to Recycle Bin");
}
else if (OSUtils.isMacOSX() && OSUtils.supportsTrash()) {
title = I18n.trn("Move File to the Trash", "Move Files to the Trash", selectedItems.size());
message = I18n.trn("Move this file to the Trash?",
"Move these files to the Trash?", selectedItems.size());
yesText = I18n.tr("Move to Trash");
}
else {
title = I18n.trn("Delete File", "Delete Files", selectedItems.size());
message = I18n.trn("Delete this file from disk?", "Delete these files from disk?", selectedItems.size());
yesText = I18n.tr("Delete from Disk");
}
Object[] options = new Object[] {yesText, noText};
int confirmation = FocusJOptionPane.showOptionDialog(null,
message, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null,
options, noText);
if (confirmation > -1 && options[confirmation] == yesText) {
deleteSelectedItems(libraryManager, playerMediator.get(), downloadListManager, selectedItems);
}
}
public static void deleteSelectedItems(final LibraryManager libraryManager, final PlayerMediator playerMediator,
final DownloadListManager downloadListManager, final List<LocalFileItem> selectedItems) {
BackgroundExecutorService.execute(new Runnable(){
public void run() {
File currentSong = playerMediator.getCurrentMediaFile();
for(LocalFileItem item : selectedItems) {
if(item.getFile().equals(currentSong)){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
playerMediator.stop();
}
});
}
if(!item.isIncomplete()) {
FileUtils.unlockFile(item.getFile());
removeDownloadItem(item.getUrn(), downloadListManager);
libraryManager.getLibraryManagedList().removeFile(item.getFile());
FileUtils.delete(item.getFile(), OSUtils.supportsTrash());
}
}
}
});
}
private static void removeDownloadItem(URN urn, DownloadListManager downloadListManager) {
if(downloadListManager.contains(urn)) {
DownloadItem item = downloadListManager.getDownloadItem(urn);
downloadListManager.remove(item);
}
}
}