package com.vaadin.tests.dd;
import com.vaadin.event.Transferable;
import com.vaadin.event.TransferableImpl;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.acceptcriteria.AcceptAll;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.shared.MouseEventDetails;
import com.vaadin.ui.AbsoluteLayout;
import com.vaadin.ui.AbsoluteLayout.ComponentPosition;
import com.vaadin.ui.Component;
import com.vaadin.ui.DragAndDropWrapper;
import com.vaadin.ui.DragAndDropWrapper.DragStartMode;
import com.vaadin.ui.DragAndDropWrapper.WrapperTargetDetails;
import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable;
import com.vaadin.ui.Label;
import com.vaadin.ui.Window;
import com.vaadin.v7.event.DataBoundTransferable;
public class AcceptAnythingWindow extends Window {
private AbsoluteLayout layout = new AbsoluteLayout();
public AcceptAnythingWindow() {
setCaption("Drop anything here");
final DragAndDropWrapper wrapper = new DragAndDropWrapper(layout);
wrapper.setDropHandler(new DropHandler() {
@Override
public AcceptCriterion getAcceptCriterion() {
return AcceptAll.get();
}
@Override
public void drop(DragAndDropEvent event) {
WrapperTargetDetails ed = (WrapperTargetDetails) event
.getTargetDetails();
Transferable transferable = event.getTransferable();
TransferableImpl ctr = (TransferableImpl) transferable;
Component component = ctr.getSourceComponent();
if (component == wrapper) {
// if the drag source was wrapper we are interested about
// the dragged component
WrapperTransferable tr = (WrapperTransferable) transferable;
component = tr.getDraggedComponent();
// html5 drag created by wrapper set component null
}
if (component != null) {
if (component.getParent() != layout) {
if (transferable instanceof DataBoundTransferable) {
// Item has been dragged, construct a Label from
// Item id
Label l = new Label();
l.setSizeUndefined();
l.setValue("ItemId : "
+ ((DataBoundTransferable) transferable)
.getItemId());
layout.addComponent(l);
component = l;
} else {
// we have a component that is been dragged, add
// it to this
layout.addComponent(component);
}
Integer left = ed.getAbsoluteLeft();
Integer top = ed.getAbsoluteTop();
MouseEventDetails eventDetails = ed.getMouseEvent();
int clientX = eventDetails.getClientX();
int clientY = eventDetails.getClientY();
try {
layout.getPosition(component)
.setTopValue(Float.valueOf(clientY - top));
layout.getPosition(component).setLeftValue(
Float.valueOf(clientX - left));
} catch (Exception e) {
// TODO: handle exception
}
} else {
WrapperTransferable tr = (WrapperTransferable) transferable;
// drag ended inside the this Pane
MouseEventDetails start = tr.getMouseDownEvent();
MouseEventDetails eventDetails = ed.getMouseEvent();
int deltaX = eventDetails.getClientX()
- start.getClientX();
int deltaY = eventDetails.getClientY()
- start.getClientY();
ComponentPosition p = layout.getPosition(component);
p.setTopValue(p.getTopValue() + deltaY);
p.setLeftValue(p.getLeftValue() + deltaX);
}
} else {
// drag coming outside of Vaadin
String object = (String) transferable.getData("Text");
String content = (String) transferable
.getData("fileContents");
Label l = new Label();
l.setCaption("Generated from HTML5 drag:");
if (object != null) {
l.setValue(object);
} else {
l.setValue("HTML5 dd");
}
l.setDescription(content);
l.setSizeUndefined();
layout.addComponent(l);
}
return;
}
});
wrapper.setDragStartMode(DragStartMode.COMPONENT);
wrapper.setSizeFull();
setContent(wrapper);
setWidth("250px");
setHeight("100px");
}
}