* ロガー
*/
private final Logger logger = Logger.getLogger(getClass().getName());
-
+
protected FileDropListener fileDropListener;
public FileDropTarget() {
this(null);
}
-
+
public FileDropTarget(FileDropListener fileDropListener) {
this.fileDropListener = fileDropListener;
}
-
+
public FileDropListener getFileDropListener() {
return fileDropListener;
}
-
+
public void setFileDropListener(FileDropListener fileDropListener) {
this.fileDropListener = fileDropListener;
}
-
+
protected void onDropFiles(List<File> dropFiles) {
if (fileDropListener != null) {
if ( !dropFiles.isEmpty()) {
}
}
}
-
+
public void drop(DropTargetDropEvent dtde) {
try {
// urlListFlavor (RFC 2483 for the text/uri-list format)
// ドロップされたものが1つのファイルであれば受け入れる。
for (DataFlavor flavor : dtde.getCurrentDataFlavors()) {
logger.log(Level.FINE, "flavor: " + flavor);
-
+
if (DataFlavor.javaFileListFlavor.equals(flavor)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY);
@SuppressWarnings({ "unchecked", "rawtypes" })
continue;
}
try {
- URI uri = new URI(fileStr);
- File dropFile = new File(uri);
+ File dropFile;
+ if (fileStr.startsWith("/")) {
+ // protocolがなく、ルートから始まる場合はファイルと仮定する
+ dropFile = new File(fileStr);
+ } else {
+ URI uri = new URI(fileStr);
+ dropFile = new File(uri);
+ }
dropFiles.add(dropFile);
break;
-
+ } catch (RuntimeException ex) {
+ logger.log(Level.WARNING, "invalid drop file: " + fileStr, ex);
} catch (URISyntaxException ex) {
logger.log(Level.WARNING, "invalid drop file: " + fileStr, ex);
}
}
}
}
-
+
// 存在しないファイルを除去する.
for (Iterator<File> ite = dropFiles.iterator(); ite.hasNext();) {
File dropFile = ite.next();
// ドロップされたファイルを通知する.
onDropFiles(dropFiles);
-
+
} catch (UnsupportedFlavorException ex) {
logger.log(Level.WARNING, "unsipported flovaor." , ex);
onException(ex);
onException(ex);
}
}
-
+
protected void onException(Exception ex) {
// do nothing.
}