package jp.crwdev.app.util; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetAdapter; import java.awt.dnd.DropTargetDropEvent; import java.io.File; import java.io.IOException; import java.util.List; import jp.crwdev.app.constant.Constant; public class FileDropTargetAdapter extends DropTargetAdapter { public interface OnDropListener { void onDrop(String filepath); } private OnDropListener mListener = null; public FileDropTargetAdapter(OnDropListener listener){ mListener = listener; } @SuppressWarnings("unchecked") @Override public void drop(DropTargetDropEvent e) { // ドロップ操作を受け入れる. e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); // ドロップに関係したTransferableを取得する. Transferable trans = e.getTransferable(); String dropFile = null; try { // ドロップされたファイル一覧のリストを取得する. List<File> list = (List<File>) trans.getTransferData(DataFlavor.javaFileListFlavor); // リストからファイルを一つ一つ取得する. for (File file : list) { // ファイルパスを取得する. String fileName = file.getAbsolutePath(); // テキストエリアにファイル名を追加表示する. if(file.isDirectory()){ dropFile = fileName; } else{ int dotIndex = fileName.lastIndexOf("."); String suffix = ""; if(dotIndex >= 0){ suffix = fileName.substring(dotIndex + 1); } if(Constant.SUPPORT_INPUT_PREFIX.contains(suffix.toLowerCase())){ dropFile = fileName; }else{ String parent = file.getParent(); dropFile = parent; } } break; } // ドロップ処理が正常に完了したことを伝える. e.dropComplete(true); } catch (UnsupportedFlavorException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } if(dropFile != null && mListener != null){ mListener.onDrop(dropFile); } } }