diff options
-rw-r--r-- | client/src/main/java/com/vaadin/client/ui/VDragAndDropWrapper.java | 25 | ||||
-rw-r--r-- | client/src/main/java/com/vaadin/client/ui/dd/VHtml5DragEvent.java | 26 |
2 files changed, 41 insertions, 10 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/VDragAndDropWrapper.java b/client/src/main/java/com/vaadin/client/ui/VDragAndDropWrapper.java index 15ab9a6ce0..4ecdec8b6f 100644 --- a/client/src/main/java/com/vaadin/client/ui/VDragAndDropWrapper.java +++ b/client/src/main/java/com/vaadin/client/ui/VDragAndDropWrapper.java @@ -409,21 +409,26 @@ public class VDragAndDropWrapper extends VCustomComponent implements } } - int fileCount = event.getFileCount(); - if (fileCount > 0) { - transferable.setData("filecount", fileCount); - for (int i = 0; i < fileCount; i++) { + final int eventFileCount = event.getFileCount(); + int fileIndex = 0; + for (int i = 0; i < eventFileCount; i++) { + // Transfer only files and not folders + if (event.isFile(i)) { final int fileId = filecounter++; final VHtml5File file = event.getFile(i); VConsole.log("Preparing to upload file " + file.getName() - + " with id " + fileId); - transferable.setData("fi" + i, "" + fileId); - transferable.setData("fn" + i, file.getName()); - transferable.setData("ft" + i, file.getType()); - transferable.setData("fs" + i, file.getSize()); + + " with id " + fileId + ", size=" + + file.getSize()); + transferable.setData("fi" + fileIndex, "" + fileId); + transferable.setData("fn" + fileIndex, file.getName()); + transferable.setData("ft" + fileIndex, file.getType()); + transferable.setData("fs" + fileIndex, file.getSize()); queueFilePost(fileId, file); + fileIndex++; } - + } + if (fileIndex > 0) { + transferable.setData("filecount", fileIndex); } VDragAndDropManager.get().endDrag(); diff --git a/client/src/main/java/com/vaadin/client/ui/dd/VHtml5DragEvent.java b/client/src/main/java/com/vaadin/client/ui/dd/VHtml5DragEvent.java index 68987e565f..672eac9e06 100644 --- a/client/src/main/java/com/vaadin/client/ui/dd/VHtml5DragEvent.java +++ b/client/src/main/java/com/vaadin/client/ui/dd/VHtml5DragEvent.java @@ -80,6 +80,32 @@ public class VHtml5DragEvent extends NativeEvent { return this.dataTransfer.files[fileIndex]; }-*/; + /** + * Detects if dropped element is a file. <br> + * Always returns <code>true</code> on Safari even if the dropped element is + * a folder. + */ + public final native boolean isFile(int fileIndex) + /*-{ + // Chrome >= v21 and Opera >= v? + if (this.dataTransfer.items) { + var item = this.dataTransfer.items[fileIndex]; + if (item.webkitGetAsEntry) { + return item.webkitGetAsEntry().isFile; + } + } + + // Zero sized files without a type are also likely to be folders + var file = this.dataTransfer.files[fileIndex]; + if (file.size == 0 && !file.type) { + return false; + } + + // TODO Make it detect folders on all browsers + + return true; + }-*/; + public final native void setHtml5DataFlavor(String flavor, String data) /*-{ this.dataTransfer.setData(flavor, data); |