package org.limewire.ui.swing.menu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.URI;
import javax.swing.JOptionPane;
import org.limewire.core.api.download.DownloadAction;
import org.limewire.core.api.download.DownloadListManager;
import org.limewire.core.api.download.DownloadException;
import org.limewire.core.api.magnet.MagnetFactory;
import org.limewire.core.api.magnet.MagnetLink;
import org.limewire.ui.swing.action.AbstractAction;
import org.limewire.ui.swing.components.FocusJOptionPane;
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.DownloadExceptionHandler;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* An action to prompt the user to open and download a link. Two link types are
* supported: magnet links and torrent links.
*/
class OpenLinkAction extends AbstractAction {
private final DownloadListManager downloadListManager;
private final Provider<DownloadExceptionHandler> downloadExceptionHandler;
private final MagnetFactory magnetFactory;
private final Provider<MagnetHandler> magnetHandler;
@Inject
public OpenLinkAction(DownloadListManager downloadListManager,
Provider<DownloadExceptionHandler> downloadExceptionHandler,
MagnetFactory magnetFactory,
Provider<MagnetHandler> magnetHandler) {
super(I18n.tr("Open &Link..."));
this.downloadListManager = downloadListManager;
this.downloadExceptionHandler = downloadExceptionHandler;
this.magnetFactory = magnetFactory;
this.magnetHandler = magnetHandler;
}
@Override
public void actionPerformed(ActionEvent e) {
// Get owner frame.
// Create dialog.
final LocationDialog locationDialogue = new LocationDialog();
locationDialogue.setTitle(I18n.tr("Open Link"));
locationDialogue.setLocationRelativeTo(GuiUtils.getMainFrame());
locationDialogue.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final URI uri = locationDialogue.getURI();
if (uri != null) {
if (magnetFactory.isMagnetLink(uri)) {
MagnetLink[] magnetLinks = magnetFactory.parseMagnetLink(uri);
if (magnetLinks.length == 0) {
FocusJOptionPane.showMessageDialog(GuiUtils.getMainFrame(), I18n
.tr("Magnet link is empty."), I18n.tr("Open Link"),
JOptionPane.INFORMATION_MESSAGE);
}
for (final MagnetLink magnet : magnetLinks) {
magnetHandler.get().handleMagnet(magnet);
}
} else {
downloadTorrent(downloadListManager, downloadExceptionHandler, uri);
}
}
}
private void downloadTorrent(final DownloadListManager downloadListManager,
final Provider<DownloadExceptionHandler> downloadExceptionHandler, final URI uri) {
try {
downloadListManager.addTorrentDownload(uri, false);
} catch (DownloadException e) {
downloadExceptionHandler.get().handleDownloadException(new DownloadAction() {
@Override
public void download(File saveFile, boolean overwrite)
throws DownloadException {
downloadListManager.addTorrentDownload(uri, overwrite);
}
@Override
public void downloadCanceled(DownloadException ignored) {
//nothing to do
}
}, e, false);
}
}
});
locationDialogue.setVisible(true);
}
}