package com.vaadin.tests.dd;
import com.vaadin.event.DataBoundTransferable;
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.AcceptCriterion;
import com.vaadin.event.dd.acceptcriteria.ServerSideCriterion;
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.WrapperTargetDetails;
import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable;
import com.vaadin.ui.Label;
import com.vaadin.ui.Tree;
import com.vaadin.ui.Window;
public class AcceptFromComponent extends Window {
private AbsoluteLayout layout;
public AcceptFromComponent(final Tree tree1) {
setCaption("Checks the source is tree1 on server");
layout = new AbsoluteLayout();
DragAndDropWrapper wrapper = new DragAndDropWrapper(layout);
setContent(wrapper);
wrapper.setSizeFull();
layout.setSizeFull();
setWidth("450px");
setHeight("150px");
final ServerSideCriterion serverSideCriterion = new ServerSideCriterion() {
@Override
public boolean accept(DragAndDropEvent dragEvent) {
Transferable transferable = dragEvent.getTransferable();
if (transferable instanceof TransferableImpl) {
TransferableImpl componentTransferrable = (TransferableImpl) transferable;
if (componentTransferrable.getSourceComponent() == tree1) {
return true;
}
}
return false;
}
};
wrapper.setDropHandler(new DropHandler() {
@Override
public AcceptCriterion getAcceptCriterion() {
return serverSideCriterion;
}
@Override
public void drop(DragAndDropEvent event) {
WrapperTargetDetails ed = (WrapperTargetDetails) event
.getTargetDetails();
Transferable ctr = event.getTransferable();
if (ctr.getSourceComponent() != null) {
// use "component" (from DragDropPane) if available, else
// take
// the source component
Component component = (Component) ctr.getData("component");
if (component == null) {
component = ctr.getSourceComponent();
}
if (component.getParent() != layout) {
if (ctr instanceof DataBoundTransferable) {
// Item has been dragged, construct a Label from
// Item id
Label l = new Label();
l.setSizeUndefined();
l.setValue("ItemId : "
+ ((DataBoundTransferable) ctr).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 {
// drag started and ended inside the this Pane
DragAndDropWrapper.WrapperTransferable tr = (WrapperTransferable) event
.getTransferable();
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) ctr.getData("text/plain");
String content = (String) ctr.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;
}
});
}
}