/* Copyright (C) 2003-2012 JabRef contributors. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref.gui; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.io.File; import java.io.IOException; import java.io.Reader; import java.net.URL; import java.util.List; import javax.swing.JComponent; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; import net.sf.jabref.BibtexEntry; import net.sf.jabref.EntryContainer; import net.sf.jabref.EntryEditor; import net.sf.jabref.Globals; import net.sf.jabref.JabRefFrame; import net.sf.jabref.external.DroppedFileHandler; import net.sf.jabref.external.ExternalFileType; import net.sf.jabref.groups.EntryTableTransferHandler; public class FileListEditorTransferHandler extends TransferHandler { protected DataFlavor urlFlavor; protected DataFlavor stringFlavor; protected JabRefFrame frame; protected EntryContainer entryContainer; private TransferHandler textTransferHandler; private DroppedFileHandler dfh = null; /** * * @param frame * @param entryContainer * @param transferHandler is an instance of javax.swing.plaf.basic.BasicTextUI.TextTransferHandler. That class is not visible. Therefore, we have to "cheat" */ public FileListEditorTransferHandler(JabRefFrame frame, EntryContainer entryContainer, TransferHandler textTransferHandler) { this.frame = frame; this.entryContainer = entryContainer; this.textTransferHandler = textTransferHandler; stringFlavor = DataFlavor.stringFlavor; try { urlFlavor = new DataFlavor("application/x-java-url; class=java.net.URL"); } catch (ClassNotFoundException e) { Globals.logger("Unable to configure drag and drop for file link table"); e.printStackTrace(); } } /** * Overridden to indicate which types of drags are supported (only LINK + COPY). * COPY is supported as no support disables CTRL+C (copy of text) */ @Override public int getSourceActions(JComponent c) { return DnDConstants.ACTION_LINK | DnDConstants.ACTION_COPY; } @Override public void exportToClipboard(JComponent comp, Clipboard clip, int action) { if (this.textTransferHandler != null) { this.textTransferHandler.exportToClipboard(comp, clip, action); } } @SuppressWarnings("unchecked") public boolean importData(JComponent comp, Transferable t) { // If the drop target is the main table, we want to record which // row the item was dropped on, to identify the entry if needed: try { List<File> files = null; // This flavor is used for dragged file links in Windows: if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { // JOptionPane.showMessageDialog(null, "Received // javaFileListFlavor"); files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor); } if (t.isDataFlavorSupported(urlFlavor)) { URL dropLink = (URL) t.getTransferData(urlFlavor); System.out.println("URL: "+dropLink); //return handleDropTransfer(dropLink, dropRow); } // This is used when one or more files are pasted from the file manager // under Gnome. The data consists of the file paths, one file per line: if (t.isDataFlavorSupported(stringFlavor)) { String dropStr = (String)t.getTransferData(stringFlavor); files = EntryTableTransferHandler.getFilesFromDraggedFilesString(dropStr); } if (files != null) { final List<File> theFiles = files; SwingUtilities.invokeLater(new Runnable() { public void run() { //addAll(files); for (File f : theFiles){ // Find the file's extension, if any: String name = f.getAbsolutePath(); String extension = ""; ExternalFileType fileType = null; int index = name.lastIndexOf('.'); if ((index >= 0) && (index < name.length())) { extension = name.substring(index + 1).toLowerCase(); fileType = Globals.prefs.getExternalFileTypeByExt(extension); } if (fileType != null) { if (dfh == null) { dfh = new DroppedFileHandler(frame, frame.basePanel()); } dfh.handleDroppedfile(name, fileType, true, entryContainer.getEntry()); } } } }); return true; } } catch (IOException ioe) { System.err.println("failed to read dropped data: " + ioe.toString()); } catch (UnsupportedFlavorException ufe) { System.err.println("drop type error: " + ufe.toString()); } // all supported flavors failed System.err.println("can't transfer input: "); DataFlavor inflavs[] = t.getTransferDataFlavors(); for (int i = 0; i < inflavs.length; i++) { System.out.println(" " + inflavs[i].toString()); } return false; } /** * This method is called to query whether the transfer can be imported. * * Will return true for urls, strings, javaFileLists * * @override */ public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { // accept this if any input flavor matches any of our supported flavors for (int i = 0; i < transferFlavors.length; i++) { DataFlavor inflav = transferFlavors[i]; if (inflav.match(urlFlavor) || inflav.match(stringFlavor) || inflav.match(DataFlavor.javaFileListFlavor)) return true; } // nope, never heard of this type return false; } }