import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.xhr.client.ReadyStateChangeHandler;
import com.google.gwt.xhr.client.XMLHttpRequest;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
+import com.vaadin.terminal.gwt.client.BrowserInfo;
import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.Paintable;
import com.vaadin.terminal.gwt.client.RenderInformation;
private final static int WRAPPER = 2;
private int dragStarMode;
private int filecounter = 0;
+ private boolean dragLeavPostponed;
@Override
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
if (dropHandler == null) {
return true;
}
+ if (dragLeavPostponed) {
+ // returned quickly back to wrapper
+ dragLeavPostponed = false;
+ return false;
+ }
ApplicationConnection.getConsole().log("HTML 5 Drag Enter");
VTransferable transferable = new VTransferable();
transferable.setDragSource(this);
vaadinDragEvent = VDragAndDropManager.get().startDrag(transferable,
event, false);
+ VDragAndDropManager.get().setCurrentDropHandler(getDropHandler());
event.preventDefault();
event.stopPropagation();
return false;
}
ApplicationConnection.getConsole().log("HTML 5 Drag Leave posponed...");
+ dragLeavPostponed = true;
DeferredCommand.addCommand(new Command() {
public void execute() {
// Yes, dragleave happens before drop. Makes no sense to me.
// IMO shouldn't fire leave at all if drop happens (I guess this
// is what IE does).
// In Vaadin we fire it only if drop did not happen.
- if (vaadinDragEvent != null) {
+ if (dragLeavPostponed
+ && vaadinDragEvent != null
+ && VDragAndDropManager.get().getCurrentDropHandler() == getDropHandler()) {
ApplicationConnection.getConsole().log(
"...HTML 5 Drag Leave");
- getDropHandler().dragLeave(vaadinDragEvent);
+ VDragAndDropManager.get().interruptDrag();
}
+ dragLeavPostponed = false;
}
});
event.preventDefault();
}
ApplicationConnection.getConsole().log("HTML 5 Drag Over");
+ vaadinDragEvent.setCurrentGwtEvent(event);
getDropHandler().dragOver(vaadinDragEvent);
// needed to be set for Safari, otherwise drop will not happen
- String s = event.getEffectAllowed();
- if ("all".equals(s) || s.contains("opy")) {
- event.setDragEffect("copy");
- } else {
- event.setDragEffect(s);
- ApplicationConnection.getConsole().log("Drag effect set to " + s);
+ if (BrowserInfo.get().isWebkit()) {
+ String s = event.getEffectAllowed();
+ if ("all".equals(s) || s.contains("opy")) {
+ event.setDragEffect("copy");
+ } else {
+ event.setDragEffect(s);
+ ApplicationConnection.getConsole().log(
+ "Drag effect set to " + s);
+ }
}
event.preventDefault();
event.stopPropagation();
}
public boolean html5DragDrop(VHtml5DragEvent event) {
- if (dropHandler == null) {
+ if (dropHandler == null || !currentlyValid) {
return true;
}
VTransferable transferable = vaadinDragEvent.getTransferable();
JsArrayString types = event.getTypes();
+ ApplicationConnection.getConsole().log("Types fetched");
for (int i = 0; i < types.length(); i++) {
String type = types.get(i);
ApplicationConnection.getConsole().log("Type: " + type);
- if ("text/plain".equals(type)) {
+ if ("Text".equals(type) || "Url".equals(type)
+ || "text/html".equals(type)) {
String data = event.getDataAsText(type);
- ApplicationConnection.getConsole().log(type + " : " + data);
- transferable.setData("text/plain", data);
+ if (data != null) {
+ ApplicationConnection.getConsole().log(type + " : " + data);
+ transferable.setData(type, data);
+ }
}
}
+ ApplicationConnection.getConsole().log("checking files");
int fileCount = event.getFileCount();
if (fileCount > 0) {
transferable.setData("filecount", fileCount);
}
+ ApplicationConnection.getConsole().log("Ending drag");
+
VDragAndDropManager.get().endDrag();
vaadinDragEvent = null;
event.preventDefault();
}
/**
- * Currently supports only FF36 as no other browser supprots natively File
+ * Currently supports only FF36 as no other browser supports natively File
* api.
*
* @param fileId
ExtendedXHR extendedXHR = (ExtendedXHR) ExtendedXHR
.create();
- extendedXHR.open("POST", client.getAppUri());
String name = "XHRFILE" + getPid() + "." + fileId;
+ extendedXHR
+ .setOnReadyStateChange(new ReadyStateChangeHandler() {
+ public void onReadyStateChange(
+ XMLHttpRequest xhr) {
+ if (xhr.getReadyState() == XMLHttpRequest.DONE) {
+ client.sendPendingVariableChanges();
+ xhr.clearOnReadyStateChange();
+ }
+ }
+ });
+ extendedXHR.open("POST", client.getAppUri());
multipartSend(extendedXHR, object, name);
}
private VerticalDropLocation emphasizedVDrop;
private HorizontalDropLocation emphasizedHDrop;
+ /**
+ * Flag used by html5 dd
+ */
+ private boolean currentlyValid;
+
private static final String OVER_STYLE = "v-ddwrapper-over";
public class CustomDropHandler extends VAbstractDropHandler {
public void dragEnter(VDragEvent drag) {
updateDropDetails(drag);
ApplicationConnection.getConsole().log("DDWrapper DragEnter");
+ currentlyValid = false;
super.dragEnter(drag);
}
public void dragLeave(VDragEvent drag) {
ApplicationConnection.getConsole().log("DDWrapper DragLeave");
deEmphasis(true);
+ dragLeavPostponed = false;
}
@Override
public void dragOver(final VDragEvent drag) {
- updateDropDetails(drag);
- validate(new VAcceptCallback() {
- public void accepted(VDragEvent event) {
- dragAccepted(drag);
- }
- }, drag);
+ boolean detailsChanged = updateDropDetails(drag);
+ if (detailsChanged) {
+ currentlyValid = false;
+ validate(new VAcceptCallback() {
+ public void accepted(VDragEvent event) {
+ dragAccepted(drag);
+ }
+ }, drag);
+ }
}
@Override
@Override
protected void dragAccepted(VDragEvent drag) {
+ currentlyValid = true;
emphasis(drag);
}
} else {
el.attachEvent("ondragenter", function(ev) {
- return me.@com.vaadin.terminal.gwt.client.ui.VDragAndDropWrapper::html5DragEnter(Lcom/vaadin/terminal/gwt/client/ui/dd/VHtml5DragEvent;)(ev);
+ return me.@com.vaadin.terminal.gwt.client.ui.VDragAndDropWrapper::html5DragEnter(Lcom/vaadin/terminal/gwt/client/ui/dd/VHtml5DragEvent;)(ev);
});
el.attachEvent("ondragleave", function(ev) {
- return me.@com.vaadin.terminal.gwt.client.ui.VDragAndDropWrapper::html5DragLeave(Lcom/vaadin/terminal/gwt/client/ui/dd/VHtml5DragEvent;)(ev);
+ return me.@com.vaadin.terminal.gwt.client.ui.VDragAndDropWrapper::html5DragLeave(Lcom/vaadin/terminal/gwt/client/ui/dd/VHtml5DragEvent;)(ev);
});
el.attachEvent("ondragover", function(ev) {
}-*/;
- public void updateDropDetails(VDragEvent drag) {
+ public boolean updateDropDetails(VDragEvent drag) {
+ VerticalDropLocation oldVL = verticalDropLocation;
verticalDropLocation = DDUtil.getVerticalDropLocation(getElement(),
drag.getCurrentGwtEvent().getClientY(), 0.2);
drag.getDropDetails().put("verticalLocation",
verticalDropLocation.toString());
+ HorizontalDropLocation oldHL = horizontalDropLocation;
horizontalDropLocation = DDUtil.getHorizontalDropLocation(getElement(),
drag.getCurrentGwtEvent().getClientX(), 0.2);
drag.getDropDetails().put("horizontalLocation",
horizontalDropLocation.toString());
+ if (oldHL != horizontalDropLocation || oldVL != verticalDropLocation) {
+ return true;
+ } else {
+ return false;
+ }
}
protected void deEmphasis(boolean doLayout) {
public void onPreviewNativeEvent(NativePreviewEvent event) {
NativeEvent nativeEvent = event.getNativeEvent();
- updateCurrentEvent(nativeEvent);
+ currentDrag.setCurrentGwtEvent(nativeEvent);
updateDragImagePosition();
int typeInt = event.getTypeInt();
isStarted = false;
currentDrag = new VDragEvent(transferable, startEvent);
- updateCurrentEvent(startEvent);
+ currentDrag.setCurrentGwtEvent(startEvent);
final Command startDrag = new Command() {
isStarted = true;
VDropHandler dh = null;
if (startEvent != null) {
- dh = findDragTarget((Element) currentDrag.currentGwtEvent
- .getEventTarget().cast());
+ dh = findDragTarget((Element) currentDrag
+ .getCurrentGwtEvent().getEventTarget().cast());
}
if (dh != null) {
// drag has started on a DropHandler, kind of drag over
case Event.ONMOUSEMOVE:
deferredStartRegistration.removeHandler();
deferredStartRegistration = null;
- updateCurrentEvent(event.getNativeEvent());
+ currentDrag.setCurrentGwtEvent(event
+ .getNativeEvent());
startDrag.execute();
break;
default:
return currentDrag;
}
- private void interruptDrag() {
+ public void interruptDrag() {
if (currentDrag != null) {
ApplicationConnection.getConsole()
.log("Drag operation interrupted");
if (currentDropHandler != null) {
- currentDrag.currentGwtEvent = null;
+ currentDrag.setCurrentGwtEvent(null);
currentDropHandler.dragLeave(currentDrag);
currentDropHandler = null;
+ serverCallback = null;
+ visitId = -1; // ignore possibly on going server check
}
currentDrag = null;
}
}
private void updateDragImagePosition() {
- if (currentDrag.currentGwtEvent != null && dragElement != null) {
+ if (currentDrag.getCurrentGwtEvent() != null && dragElement != null) {
Style style = dragElement.getStyle();
- int clientY = currentDrag.currentGwtEvent.getClientY();
- int clientX = currentDrag.currentGwtEvent.getClientX();
+ int clientY = currentDrag.getCurrentGwtEvent().getClientY();
+ int clientX = currentDrag.getCurrentGwtEvent().getClientX();
style.setTop(clientY, Unit.PX);
style.setLeft(clientX, Unit.PX);
}
}
- private void updateCurrentEvent(NativeEvent event) {
- currentDrag.currentGwtEvent = event;
- }
-
public void endDrag() {
if (handlerRegistration != null) {
handlerRegistration.removeHandler();
client.updateVariable(DD_SERVICE, "type", drop.ordinal(), false);
- if (currentDrag.currentGwtEvent != null) {
+ if (currentDrag.getCurrentGwtEvent() != null) {
try {
MouseEventDetails mouseEventDetails = new MouseEventDetails(
- currentDrag.currentGwtEvent);
+ currentDrag.getCurrentGwtEvent());
currentDrag.getDropDetails().put("mouseEvent",
mouseEventDetails.serialize());
} catch (Exception e) {
package com.vaadin.tests.dd;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
import com.vaadin.event.DataBoundTransferable;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.ui.DragAndDropWrapper;
import com.vaadin.ui.Label;
import com.vaadin.ui.AbsoluteLayout.ComponentPosition;
+import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable.Html5File;
+import com.vaadin.ui.Upload.Receiver;
/**
* replacement for a proto class to keep tests working
else {
// drag coming outside of Vaadin
- String object = (String) ctr.getData("text/plain");
- String content = (String) ctr.getData("fileContents");
+ WrapperTransferable wtr = (WrapperTransferable) ctr;
- Label l = new Label();
+ String object = (String) ctr.getData("Text");
+ String html = (String) ctr.getData("Html");
+ String url = (String) ctr.getData("Url");
+
+ final Label l = new Label();
l.setCaption("Generated from HTML5 drag:");
if (object != null) {
l.setValue(object);
l.setValue("HTML5 dd");
}
- l.setDescription(content);
+ Html5File[] files = wtr.getFiles();
+ if (files != null) {
+ for (Html5File html5File : files) {
+ l.setCaption(html5File.getFileName());
+ html5File.setReceiver(new Receiver() {
+ public OutputStream receiveUpload(String filename,
+ String MIMEType) {
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream() {
+ @Override
+ public void close() throws IOException {
+ super.close();
+ l.setValue((new String(toByteArray())
+ .substring(0, 80) + "..."));
+ }
+ };
+ return byteArrayOutputStream;
+ }
+ });
+ }
+ }
+
l.setSizeUndefined();
root.addComponent(l);