OSDN Git Service

dmg作成バージョンの取得方法の修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / ui / util / FileDropTarget.java
1 package charactermanaj.ui.util;\r
2 \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
8 import java.io.File;\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
17 \r
18 /**\r
19  * ファイルドロップターゲット.<br>\r
20  * Windows/Macと、Linuxの両方のデスクトップのドロップをサポートする.\r
21  * @author seraphy\r
22  */\r
23 public class FileDropTarget extends DropTargetAdapter {\r
24 \r
25         /**\r
26          * ロガー\r
27          */\r
28         private final Logger logger = Logger.getLogger(getClass().getName());\r
29         \r
30         protected FileDropListener fileDropListener;\r
31 \r
32         public FileDropTarget() {\r
33                 this(null);\r
34         }\r
35         \r
36         public FileDropTarget(FileDropListener fileDropListener) {\r
37                 this.fileDropListener = fileDropListener;\r
38         }\r
39         \r
40         public FileDropListener getFileDropListener() {\r
41                 return fileDropListener;\r
42         }\r
43         \r
44         public void setFileDropListener(FileDropListener fileDropListener) {\r
45                 this.fileDropListener = fileDropListener;\r
46         }\r
47         \r
48         protected void onDropFiles(List<File> dropFiles) {\r
49                 if (fileDropListener != null) {\r
50                         if ( !dropFiles.isEmpty()) {\r
51                                 fileDropListener.onDropFiles(dropFiles);\r
52                         }\r
53                 }\r
54         }\r
55         \r
56         public void drop(DropTargetDropEvent dtde) {\r
57                 try {\r
58                         // urlListFlavor (RFC 2483 for the text/uri-list format)\r
59                         DataFlavor uriListFlavor;\r
60                         try {\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
65                         }\r
66 \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
71                                 \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
78                                         break;\r
79                                 }\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
88                                                         continue;\r
89                                                 }\r
90                                                 try {\r
91                                                         URI uri = new URI(fileStr);\r
92                                                         File dropFile = new File(uri);\r
93                                                         dropFiles.add(dropFile);\r
94                                                         break;\r
95                                                         \r
96                                                 } catch (URISyntaxException ex) {\r
97                                                         logger.log(Level.WARNING, "invalid drop file: " + fileStr, ex);\r
98                                                 }\r
99                                         }\r
100                                 }\r
101                         }\r
102                         \r
103                         // 存在しないファイルを除去する.\r
104                         for (Iterator<File> ite = dropFiles.iterator(); ite.hasNext();) {\r
105                                 File dropFile = ite.next();\r
106                                 if (dropFile == null || !dropFile.exists()) {\r
107                                         ite.remove();\r
108                                 }\r
109                         }\r
110 \r
111                         // ドロップされたファイルを通知する.\r
112                         onDropFiles(dropFiles);\r
113                         \r
114                 } catch (UnsupportedFlavorException ex) {\r
115                         logger.log(Level.WARNING, "unsipported flovaor." , ex);\r
116                         onException(ex);\r
117 \r
118                 } catch (IOException ex) {\r
119                         logger.log(Level.WARNING, "drop target failed." , ex);\r
120                         onException(ex);\r
121                 }\r
122         }\r
123         \r
124         protected void onException(Exception ex) {\r
125                 // do nothing.\r
126         }\r
127 }\r