package org.wiztools.restclient.ui.dnd; import java.awt.Cursor; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; 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.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * Usage: * * <pre> * {@code * FileDropTargetListener l = new FileDropTargetListener(); * l.addDndAction(new DndAction() { * void onDrop(List<File> files) { * // what to do with dropped files. * } * }); * new java.awt.dnd.DropTarget(component, l); * } * </pre> * * @author subwiz */ public class FileDropTargetListener implements DropTargetListener { private static final Logger LOG = Logger.getLogger(FileDropTargetListener.class.getName()); private final List<DndAction> actions = new ArrayList<>(); public void addDndAction(DndAction action) { actions.add(action); } @Override public void dragEnter(DropTargetDragEvent dtde) { dtde.getDropTargetContext().getComponent() .setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); } @Override public void dragOver(DropTargetDragEvent dtde) { dtde.getDropTargetContext().getComponent() .setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); } @Override public void dropActionChanged(DropTargetDragEvent dtde) { // do nothing! } @Override public void dragExit(DropTargetEvent dte) { dte.getDropTargetContext().getComponent() .setCursor(Cursor.getDefaultCursor()); } @Override public void drop(DropTargetDropEvent evt) { final int action = evt.getDropAction(); evt.acceptDrop(action); try { Transferable data = evt.getTransferable(); if (data.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { java.util.List<File> list = (java.util.List<File>) data.getTransferData( DataFlavor.javaFileListFlavor); for(DndAction a: actions) { a.onDrop(list); } } } catch (UnsupportedFlavorException | IOException e) { LOG.log(Level.WARNING, null, e); } finally { evt.dropComplete(true); evt.getDropTargetContext().getComponent() .setCursor(Cursor.getDefaultCursor()); } } }