1 package charactermanaj.ui.util;
\r
3 import java.awt.datatransfer.DataFlavor;
\r
4 import java.awt.datatransfer.UnsupportedFlavorException;
\r
5 import java.awt.dnd.DnDConstants;
\r
6 import java.awt.dnd.DropTargetAdapter;
\r
7 import java.awt.dnd.DropTargetDropEvent;
\r
9 import java.io.IOException;
\r
10 import java.net.URI;
\r
11 import java.net.URISyntaxException;
\r
12 import java.util.ArrayList;
\r
13 import java.util.Iterator;
\r
14 import java.util.List;
\r
15 import java.util.logging.Level;
\r
16 import java.util.logging.Logger;
\r
19 * ファイルドロップターゲット.<br>
\r
20 * Windows/Macと、Linuxの両方のデスクトップのドロップをサポートする.
\r
23 public class FileDropTarget extends DropTargetAdapter {
\r
28 private final Logger logger = Logger.getLogger(getClass().getName());
\r
30 protected FileDropListener fileDropListener;
\r
32 public FileDropTarget() {
\r
36 public FileDropTarget(FileDropListener fileDropListener) {
\r
37 this.fileDropListener = fileDropListener;
\r
40 public FileDropListener getFileDropListener() {
\r
41 return fileDropListener;
\r
44 public void setFileDropListener(FileDropListener fileDropListener) {
\r
45 this.fileDropListener = fileDropListener;
\r
48 protected void onDropFiles(List<File> dropFiles) {
\r
49 if (fileDropListener != null) {
\r
50 if ( !dropFiles.isEmpty()) {
\r
51 fileDropListener.onDropFiles(dropFiles);
\r
56 public void drop(DropTargetDropEvent dtde) {
\r
58 // urlListFlavor (RFC 2483 for the text/uri-list format)
\r
59 DataFlavor uriListFlavor;
\r
61 uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
62 } catch (ClassNotFoundException ex) {
\r
63 logger.log(Level.WARNING, "urlListFlavor is not supported.", ex);
\r
64 uriListFlavor = null;
\r
67 final List<File> dropFiles = new ArrayList<File>();
\r
68 // ドロップされたものが1つのファイルであれば受け入れる。
\r
69 for (DataFlavor flavor : dtde.getCurrentDataFlavors()) {
\r
70 logger.log(Level.FINE, "flavor: " + flavor);
\r
72 if (DataFlavor.javaFileListFlavor.equals(flavor)) {
\r
73 dtde.acceptDrop(DnDConstants.ACTION_COPY);
\r
74 @SuppressWarnings({ "unchecked", "rawtypes" })
\r
75 List<File> files = (List) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
\r
76 logger.log(Level.FINER, "DragAndDrop files(javaFileListFlavor)=" + files);
\r
77 dropFiles.addAll(files);
\r
80 if (uriListFlavor != null && uriListFlavor.equals(flavor)) {
\r
81 // LinuxではjavaFileListFlavorではなく、text/uri-listタイプで送信される.
\r
82 dtde.acceptDrop(DnDConstants.ACTION_COPY);
\r
83 String uriList = (String) dtde.getTransferable().getTransferData(uriListFlavor);
\r
84 logger.log(Level.FINER, "DragAndDrop files(text/uri-list)=" + uriList);
\r
85 for (String fileStr : uriList.split("\r\n")) { // RFC2483によると改行コードはCRLF
\r
86 fileStr = fileStr.trim();
\r
87 if (fileStr.startsWith("#")) {
\r
91 URI uri = new URI(fileStr);
\r
92 File dropFile = new File(uri);
\r
93 dropFiles.add(dropFile);
\r
96 } catch (URISyntaxException ex) {
\r
97 logger.log(Level.WARNING, "invalid drop file: " + fileStr, ex);
\r
104 for (Iterator<File> ite = dropFiles.iterator(); ite.hasNext();) {
\r
105 File dropFile = ite.next();
\r
106 if (dropFile == null || !dropFile.exists()) {
\r
111 // ドロップされたファイルを通知する.
\r
112 onDropFiles(dropFiles);
\r
114 } catch (UnsupportedFlavorException ex) {
\r
115 logger.log(Level.WARNING, "unsipported flovaor." , ex);
\r
118 } catch (IOException ex) {
\r
119 logger.log(Level.WARNING, "drop target failed." , ex);
\r
124 protected void onException(Exception ex) {
\r