package org.limewire.ui.swing.callback;
import java.awt.event.ActionEvent;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.JOptionPane;
import org.jdesktop.application.Application;
import org.limewire.bittorrent.Torrent;
import org.limewire.core.api.callback.GuiCallback;
import org.limewire.core.api.callback.GuiCallbackService;
import org.limewire.core.api.download.DownloadAction;
import org.limewire.core.api.download.DownloadException;
import org.limewire.core.api.magnet.MagnetLink;
import org.limewire.inject.EagerSingleton;
import org.limewire.ui.swing.components.FocusJOptionPane;
import org.limewire.ui.swing.components.MultiLineLabel;
import org.limewire.ui.swing.properties.FileInfoPanelFactory;
import org.limewire.ui.swing.properties.TorrentDownloadSelector;
import org.limewire.ui.swing.util.DownloadExceptionHandler;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
import org.limewire.ui.swing.util.MagnetHandler;
import org.limewire.ui.swing.util.SwingUtils;
import org.limewire.util.StringUtils;
import com.google.inject.Inject;
import com.google.inject.Provider;
@EagerSingleton
public class GuiCallbackImpl implements GuiCallback {
private final Provider<DownloadExceptionHandler> downloadExceptionHandler;
private final Provider<MagnetHandler> magnetHandler;
private final Provider<FileInfoPanelFactory> fileInfoPanelFactory;
@Inject
public GuiCallbackImpl(Provider<DownloadExceptionHandler> downloadExceptionHandler,
Provider<MagnetHandler> magnetHandler,
Provider<FileInfoPanelFactory> fileInfoPanelFactory) {
this.downloadExceptionHandler = downloadExceptionHandler;
this.magnetHandler = magnetHandler;
this.fileInfoPanelFactory = fileInfoPanelFactory;
}
@Inject
void register(GuiCallbackService guiCallbackService) {
guiCallbackService.setGuiCallback(this);
}
@Override
public void handleDownloadException(DownloadAction downLoadAction, DownloadException e,
boolean supportsNewSaveDir) {
downloadExceptionHandler.get().handleDownloadException(downLoadAction, e,
supportsNewSaveDir);
}
@Override
public void restoreApplication() {
SwingUtils.invokeNowOrLater(new Runnable() {
@Override
public void run() {
ActionMap actionMap = Application.getInstance().getContext().getActionMap();
Action restoreView = actionMap.get("restoreView");
restoreView.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
"restoreView"));
}
});
}
@Override
public String translate(String s) {
return I18n.tr(s);
}
@Override
public void handleMagnet(MagnetLink magnetLink) {
magnetHandler.get().handleMagnet(magnetLink);
}
@Override
public boolean promptUserQuestion(final String marktr) {
final MultiLineLabel label = new MultiLineLabel(I18n.tr(marktr), 400);
final String title = I18n.tr("Warning");
final AtomicInteger result = new AtomicInteger(JOptionPane.YES_OPTION);
SwingUtils.invokeNowOrWait(new Runnable() {
@Override
public void run() {
result.set(FocusJOptionPane.showConfirmDialog(
GuiUtils.getMainFrame(), label, title,
JOptionPane.YES_NO_OPTION));
}
});
return result.get() == JOptionPane.YES_OPTION;
}
@Override
public boolean promptTorrentFilePriorities(final Torrent torrent) {
final AtomicInteger result = new AtomicInteger(JOptionPane.OK_OPTION);
SwingUtils.invokeNowOrWait(new Runnable() {
@Override
public void run() {
result.set(TorrentDownloadSelector.showBittorrentSelector(torrent,
fileInfoPanelFactory.get()));
}
});
return result.get() == JOptionPane.OK_OPTION;
}
/**
* Asks the user whether to continue with a torrent download that contains
* files with banned extensions.
* @return true if the download should continue.
*/
@Override
public boolean promptAboutTorrentWithBannedExtensions(Torrent torrent,
Set<String> bannedExtensions) {
String extensions = StringUtils.explode(bannedExtensions, ", ");
String warning = I18n.tr("This torrent contains files with the following extensions, which LimeWire is configured not to download: {0}.", extensions);
String prompt = I18n.tr("Downloading this torrent could damage your computer. Are you sure you want to continue?");
final MultiLineLabel label = new MultiLineLabel(warning + "\n\n" + prompt, 400);
final String title = I18n.tr("Warning: {0}", torrent.getName());
final AtomicInteger result = new AtomicInteger(JOptionPane.YES_OPTION);
SwingUtils.invokeNowOrWait(new Runnable() {
@Override
public void run() {
result.set(FocusJOptionPane.showConfirmDialog(
GuiUtils.getMainFrame(), label, title,
JOptionPane.YES_NO_OPTION));
}
});
return result.get() == JOptionPane.YES_OPTION;
}
/**
* Asks the user whether to continue with a torrent download if the torrent file could not be scanned.
* @return true if the download should continue.
*/
@Override
public boolean promptAboutTorrentDownloadWithFailedScan() {
String warning = I18n.tr("The torrent file download could not be virus scanned.");
String prompt = I18n.tr("Do you want to continue and download the torrent?");
final MultiLineLabel label = new MultiLineLabel(warning + "\n\n" + prompt, 400);
final String title = I18n.tr("Warning");
final AtomicInteger result = new AtomicInteger(JOptionPane.YES_OPTION);
SwingUtils.invokeNowOrWait(new Runnable() {
@Override
public void run() {
result.set(FocusJOptionPane.showConfirmDialog(
GuiUtils.getMainFrame(), label, title,
JOptionPane.YES_NO_OPTION));
}
});
return result.get() == JOptionPane.YES_OPTION;
}
}