protected void onDrop(Event event) {
NativeEvent nativeEvent = (NativeEvent) event;
if (isDropAllowed(nativeEvent)) {
- nativeEvent.preventDefault();
- nativeEvent.stopPropagation();
JsArrayString typesJsArray = getTypes(
nativeEvent.getDataTransfer());
- List<String> types = new ArrayList<>();
- Map<String, String> data = new HashMap<>();
- for (int i = 0; i < typesJsArray.length(); i++) {
- String type = typesJsArray.get(i);
- types.add(type);
- data.put(type, nativeEvent.getDataTransfer().getData(type));
+
+ /* Handle event if transfer doesn't contain files.
+ *
+ * Spec: "Dragging files can currently only happen from outside a
+ * browsing context, for example from a file system manager
+ * application."
+ * Thus there cannot be at the same time both files and other data
+ * dragged
+ */
+ if (!containsFiles(typesJsArray)) {
+ nativeEvent.preventDefault();
+ nativeEvent.stopPropagation();
+
+ List<String> types = new ArrayList<>();
+ Map<String, String> data = new HashMap<>();
+ for (int i = 0; i < typesJsArray.length(); i++) {
+ String type = typesJsArray.get(i);
+ types.add(type);
+ data.put(type, nativeEvent.getDataTransfer().getData(type));
+ }
+
+ sendDropEventToServer(types, data, DragSourceExtensionConnector
+ .getDropEffect(nativeEvent.getDataTransfer()), nativeEvent);
}
- sendDropEventToServer(types, data, DragSourceExtensionConnector
- .getDropEffect(nativeEvent.getDataTransfer()), nativeEvent);
}
removeDragOverStyle(nativeEvent);
return true;
}
+ /**
+ * Tells if the given array of types contains files.
+ * <p>
+ * According to HTML specification, if any files are being dragged, {@code
+ * dataTransfer.types} will contain the string "Files". See
+ * https://html.spec.whatwg.org/multipage/interaction.html#the-datatransfer-interface:dom-datatransfer-types-2
+ *
+ * @param types
+ * Array of data types.
+ * @return {@code} true if given array contains {@code "Files"}, {@code
+ * false} otherwise.
+ */
+ private boolean containsFiles(JsArrayString types) {
+ for (int i = 0; i < types.length(); i++) {
+ if ("Files".equals(types.get(i))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Initiates a server RPC for the drop event.
*
import com.vaadin.server.StreamVariable;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.dnd.FileParameters;
+import com.vaadin.shared.ui.grid.DropMode;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.Grid;
-import com.vaadin.ui.Html5File;
-import com.vaadin.ui.Label;
import com.vaadin.ui.Layout;
import com.vaadin.ui.Notification;
import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.components.grid.GridDropTarget;
import com.vaadin.ui.dnd.FileDropTarget;
public class Html5FileDragAndDropUpload extends AbstractTestUIWithLog {
@Override
protected void setup(VaadinRequest request) {
- Grid<FileParameters> grid = new Grid<>("Drop files on the Grid");
+ Grid<FileParameters> grid = new Grid<>("Drop files or text on the Grid");
grid.addColumn(FileParameters::getName).setCaption("File name");
grid.addColumn(FileParameters::getSize).setCaption("File size");
grid.addColumn(FileParameters::getMime).setCaption("Mime type");
});
});
+ GridDropTarget<FileParameters> dropTarget = new GridDropTarget<>(grid,
+ DropMode.ON_TOP);
+ dropTarget.addGridDropListener(event -> {
+ log("dataTransferText=" + event.getDataTransferText());
+ Notification.show(event.getDataTransferText());
+ });
+
Layout layout = new VerticalLayout(grid);
addComponent(layout);
@Override
protected String getTestDescription() {
- return "Drop files onto the Grid to upload them";
+ return "Drop files onto the Grid to upload them or text";
}
}