/*
Copyright (C) 2004 E. Putrycz
All programs in this directory and
subdirectories are published under the GNU General Public License as
described below.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
Further information about the GNU GPL is available at:
http://www.gnu.org/copyleft/gpl.ja.html
*/
package net.sf.jabref;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import net.sf.jabref.net.URLDownload;
/**
* @author Erik Putrycz erik.putrycz-at-nrc-cnrc.gc.ca
*/
public class UrlDragDrop implements DropTargetListener {
private static Logger logger = Logger
.getLogger(UrlDragDrop.class.getName());
private FieldEditor feditor;
private EntryEditor editor;
private JabRefFrame frame;
public UrlDragDrop(EntryEditor _editor, JabRefFrame _frame,
FieldEditor _feditor) {
editor = _editor;
feditor = _feditor;
frame = _frame;
}
/*
* (non-Javadoc)
*
* @see java.awt.dnd.DropTargetListener#dragEnter(java.awt.dnd.DropTargetDragEvent)
*/
public void dragEnter(DropTargetDragEvent dtde) {
}
/*
* (non-Javadoc)
*
* @see java.awt.dnd.DropTargetListener#dragOver(java.awt.dnd.DropTargetDragEvent)
*/
public void dragOver(DropTargetDragEvent dtde) {
}
/*
* (non-Javadoc)
*
* @see java.awt.dnd.DropTargetListener#dropActionChanged(java.awt.dnd.DropTargetDragEvent)
*/
public void dropActionChanged(DropTargetDragEvent dtde) {
}
/*
* (non-Javadoc)
*
* @see java.awt.dnd.DropTargetListener#dragExit(java.awt.dnd.DropTargetEvent)
*/
public void dragExit(DropTargetEvent dte) {
}
private static class JOptionChoice {
private String label;
private int id;
public JOptionChoice(String _label, int _id) {
label = _label;
id = _id;
}
public String toString() {
return label;
}
public int getId() {
return id;
}
}
/*
* (non-Javadoc)
*
* @see java.awt.dnd.DropTargetListener#drop(java.awt.dnd.DropTargetDropEvent)
*/
public void drop(DropTargetDropEvent dtde) {
Transferable tsf = dtde.getTransferable();
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
//try with an URL
DataFlavor dtURL = null;
try{
dtURL = new DataFlavor("application/x-java-url; class=java.net.URL");
}catch (ClassNotFoundException e){
logger.log(Level.WARNING,
"Class not found for DnD... should not happen", e);
}
try{
URL url = (URL) tsf.getTransferData(dtURL);
JOptionChoice res = (JOptionChoice) JOptionPane
.showInputDialog(editor, "", Globals
.lang("Select action"),
JOptionPane.QUESTION_MESSAGE, null,
new JOptionChoice[] {
new JOptionChoice(Globals
.lang("Insert URL"), 0),
new JOptionChoice(Globals
.lang("Download file"), 1) },
new JOptionChoice(Globals.lang("Insert URL"), 0));
switch (res.getId()) {
//insert URL
case 0:
feditor.setText(url.toString());
editor.updateField(feditor);
break;
//download file
case 1:
try{
//auto file name:
File file = new File(new File(Globals.prefs
.get("pdfDirectory")), editor.getEntry()
.getField(BibtexFields.KEY_FIELD)
+ ".pdf");
URLDownload udl = new URLDownload(editor, url,
file);
frame.output(Globals.lang("Downloading..."));
udl.download();
frame.output(Globals.lang("Download completed"));
feditor.setText(file.toURI().toURL().toString());
editor.updateField(feditor);
}catch (IOException ioex){
logger.log(Level.SEVERE, "Error while downloading file",
ioex);
JOptionPane.showMessageDialog(editor, Globals
.lang("File download"), Globals
.lang("Error while downloading file:"
+ ioex.getMessage()),
JOptionPane.ERROR_MESSAGE);
}
break;
}
return;
}catch (UnsupportedFlavorException nfe){
// not an URL then...
}catch (IOException ioex){
logger.log(Level.WARNING, "!should not happen!", ioex);
}
try{
//try with a File List
@SuppressWarnings("unchecked")
List<File> filelist = (List<File>) tsf
.getTransferData(DataFlavor.javaFileListFlavor);
if (filelist.size() > 1){
JOptionPane
.showMessageDialog(editor, Globals
.lang("Only one item is supported"), Globals
.lang("Drag and Drop Error"),
JOptionPane.ERROR_MESSAGE);
return;
}
File fl = filelist.get(0);
feditor.setText(fl.toURI().toURL().toString());
editor.updateField(feditor);
}catch (UnsupportedFlavorException nfe){
JOptionPane.showMessageDialog(editor, Globals
.lang("Operation not supported"), Globals
.lang("Drag and Drop Error"), JOptionPane.ERROR_MESSAGE);
logger.log(Level.WARNING, "Transfer exception", nfe);
}catch (IOException ioex){
logger.log(Level.WARNING, "Transfer exception", ioex);
}
}
}