aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/src/main/java/com/vaadin/client/ui/VDragAndDropWrapper.java25
-rw-r--r--client/src/main/java/com/vaadin/client/ui/dd/VHtml5DragEvent.java26
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);