+++ /dev/null
-package com.vaadin.event;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import com.vaadin.ui.Component;
-
-public class ComponentTransferable implements Transferable {
- private Map<String, Object> rawVariables = new HashMap<String, Object>();
- private Component sourceComponent;
-
- public ComponentTransferable(Component sourceComponent,
- Map<String, Object> rawVariables) {
- this.sourceComponent = sourceComponent;
- this.rawVariables = rawVariables;
- }
-
- public Component getSourceComponent() {
- return sourceComponent;
- }
-
- public Object getData(String dataFlawor) {
- return rawVariables.get(dataFlawor);
- }
-
- public void setData(String dataFlawor, Object value) {
- rawVariables.put(dataFlawor, value);
- }
-
- public Collection<String> getDataFlawors() {
- return rawVariables.keySet();
- }
-
-}
import com.vaadin.ui.Component;
-public abstract class DataBoundTransferable extends ComponentTransferable {
+public abstract class DataBoundTransferable extends TransferableImpl {
public DataBoundTransferable(Component sourceComponent,
Map<String, Object> rawVariables) {
import java.util.Collection;
+import com.vaadin.ui.Component;
+
public interface Transferable {
public Object getData(String dataFlawor);
public Collection<String> getDataFlawors();
+ /**
+ * @return the component that created the Transferable
+ */
+ public Component getSourceComponent();
+
}
--- /dev/null
+package com.vaadin.event;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.vaadin.ui.Component;
+
+public class TransferableImpl implements Transferable {
+ private Map<String, Object> rawVariables = new HashMap<String, Object>();
+ private Component sourceComponent;
+
+ public TransferableImpl(Component sourceComponent,
+ Map<String, Object> rawVariables) {
+ this.sourceComponent = sourceComponent;
+ this.rawVariables = rawVariables;
+ }
+
+ public Component getSourceComponent() {
+ return sourceComponent;
+ }
+
+ public Object getData(String dataFlawor) {
+ return rawVariables.get(dataFlawor);
+ }
+
+ public void setData(String dataFlawor, Object value) {
+ rawVariables.put(dataFlawor, value);
+ }
+
+ public Collection<String> getDataFlawors() {
+ return rawVariables.keySet();
+ }
+
+}
*/
package com.vaadin.event.dd.acceptCriteria;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.terminal.PaintException;
import com.vaadin.terminal.PaintTarget;
}
public boolean accepts(DragAndDropEvent dragEvent) {
- if (dragEvent.getTransferable() instanceof ComponentTransferable) {
- Component sourceComponent = ((ComponentTransferable) dragEvent
+ if (dragEvent.getTransferable() instanceof TransferableImpl) {
+ Component sourceComponent = ((TransferableImpl) dragEvent
.getTransferable()).getSourceComponent();
for (Component c : component) {
if (c == sourceComponent) {
*/
package com.vaadin.event.dd.acceptCriteria;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropTarget;
import com.vaadin.terminal.gwt.client.ui.dd.VSourceIsSameAsTarget;
public class SourceIsSameAsTarget extends ClientSideCriterion {
public boolean accepts(DragAndDropEvent dragEvent) {
- if (dragEvent.getTransferable() instanceof ComponentTransferable) {
- Component sourceComponent = ((ComponentTransferable) dragEvent
+ if (dragEvent.getTransferable() instanceof TransferableImpl) {
+ Component sourceComponent = ((TransferableImpl) dragEvent
.getTransferable()).getSourceComponent();
DropTarget target = dragEvent.getDropTargetData().getTarget();
return sourceComponent == target;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
+import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.Paintable;
import com.vaadin.terminal.gwt.client.RenderInformation;
import com.vaadin.terminal.gwt.client.UIDL;
paintable = VDragAndDropWrapper.this;
}
+ transferable.setData("mouseDown", new MouseEventDetails(
+ event.getNativeEvent()).serialize());
+
startDrag.createDragImage(
((Widget) paintable).getElement(), true);
event.preventDefault(); // prevent text selection
}
ApplicationConnection.getConsole().log("HTML 5 Drag Enter");
VTransferable transferable = new VTransferable();
+ transferable.setDragSource(this);
vaadinDragEvent = VDragAndDropManager.get().startDrag(transferable,
event, false);
mouseEventDetails.serialize());
} catch (Exception e) {
// NOP, (at least oophm on Safari) can't serialize html dd event
- // to
- // mouseevent
+ // to mouseevent
}
} else {
currentDrag.getDropDetails().put("mouseEvent", null);
package com.vaadin.terminal.gwt.server;
import java.io.PrintWriter;
-import java.util.Collection;
-import java.util.HashMap;
import java.util.Map;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DragSource;
if (sourceComponent != null && sourceComponent instanceof DragSource) {
transferable = ((DragSource) sourceComponent)
.getTransferable(variables);
- } else {
- if (transferable == null) {
- if (sourceComponent != null) {
- transferable = new ComponentTransferable(sourceComponent,
- variables);
- } else {
- transferable = new Transferable() {
- private Map<String, Object> td = new HashMap<String, Object>();
-
- public Object getData(String dataFlawor) {
- return td.get(dataFlawor);
- }
-
- public void setData(String dataFlawor, Object value) {
- td.put(dataFlawor, value);
- }
-
- public Collection<String> getDataFlawors() {
- return td.keySet();
- }
-
- };
- }
- }
+ }
+ if (transferable == null) {
+ transferable = new TransferableImpl(sourceComponent, variables);
}
return transferable;
import java.util.Map;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragSource;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.DropTarget;
import com.vaadin.event.dd.DropTargetDetails;
+import com.vaadin.event.dd.DropTargetDetailsImpl;
import com.vaadin.terminal.PaintException;
import com.vaadin.terminal.PaintTarget;
+import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.ui.VDragAndDropWrapper;
+import com.vaadin.terminal.gwt.client.ui.dd.HorizontalDropLocation;
+import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation;
@ClientWidget(VDragAndDropWrapper.class)
public class DragAndDropWrapper extends CustomComponent implements DropTarget,
DragSource {
- public class DDWrapperTransferable extends ComponentTransferable {
+ public class WrapperTransferable extends TransferableImpl {
- public DDWrapperTransferable(Component sourceComponent,
+ public WrapperTransferable(Component sourceComponent,
Map<String, Object> rawVariables) {
super(sourceComponent, rawVariables);
}
Component object = (Component) getData("component");
return object;
}
+
+ /**
+ * @return the mouse down event that started the drag and drop operation
+ */
+ public MouseEventDetails getMouseDownEvent() {
+ return MouseEventDetails.deSerialize((String) getData("mouseDown"));
+ }
+
+ }
+
+ public class WrapperDropDetails extends DropTargetDetailsImpl {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public WrapperDropDetails(Map<String, Object> rawDropData) {
+ super(rawDropData);
+ }
+
+ /**
+ * @return the absolute position of wrapper on the page
+ */
+ public Integer getAbsoluteLeft() {
+ return (Integer) getData("absoluteLeft");
+ }
+
+ /**
+ *
+ * @return the absolute position of wrapper on the page
+ */
+ public Integer getAbsoluteTop() {
+ return (Integer) getData("absoluteTop");
+ }
+
+ /**
+ * @return details about the actual event that caused the event details.
+ * Practically mouse move or mouse up.
+ */
+ public MouseEventDetails getMouseEvent() {
+ return MouseEventDetails
+ .deSerialize((String) getData("mouseEvent"));
+ }
+
+ public VerticalDropLocation verticalDropLocation() {
+ return VerticalDropLocation
+ .valueOf((String) getData("verticalLocation"));
+ }
+
+ public HorizontalDropLocation horizontalDropLocation() {
+ return HorizontalDropLocation
+ .valueOf((String) getData("horizontalLocation"));
+ }
+
}
public enum DragStartMode {
public DropTargetDetails translateDragDropDetails(
Map<String, Object> clientVariables) {
- // TODO Auto-generated method stub
- return null;
+ return new WrapperDropDetails(clientVariables);
}
public Transferable getTransferable(final Map<String, Object> rawVariables) {
- return new DDWrapperTransferable(this, rawVariables);
+ return new WrapperTransferable(this, rawVariables);
}
public void setDragStartMode(DragStartMode dragStartMode) {
import java.util.Map;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.DataBoundTransferable;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragAndDropEvent;
* layouts wouldn't need changes (and have regression risk/ performance
* penalty).
*
+ * @deprecated use {@link DragAndDropWrapper} instead
+ *
*/
+@Deprecated
@SuppressWarnings("serial")
@ClientWidget(com.vaadin.terminal.gwt.client.ui.VDragDropPane.class)
public class DragDropPane extends AbsoluteLayout implements DropTarget {
DragEventDetails ed = (DragEventDetails) event.getDropTargetData();
Transferable transferable = event.getTransferable();
- if (transferable instanceof ComponentTransferable) {
- ComponentTransferable ctr = (ComponentTransferable) transferable;
+ if (transferable instanceof TransferableImpl) {
+ TransferableImpl ctr = (TransferableImpl) transferable;
// use "component" (from DragDropPane) if available, else take
// the source component
Component component = (Component) ctr.getData("component");
.getDropTargetData();
tree = (Tree) dragEvent.getDropTargetData().getTarget();
allowedItemIds = getAllowedItemIds(dragEvent, tree);
+
return allowedItemIds.contains(dropTargetData.getItemIdOver());
}
package com.vaadin.tests.dd;
-import com.vaadin.ui.DragDropPane;
+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.AcceptAll;
+import com.vaadin.event.dd.acceptCriteria.AcceptCriterion;
+import com.vaadin.terminal.gwt.client.MouseEventDetails;
+import com.vaadin.ui.AbsoluteLayout;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.DragAndDropWrapper;
+import com.vaadin.ui.Label;
import com.vaadin.ui.Window;
+import com.vaadin.ui.AbsoluteLayout.ComponentPosition;
+import com.vaadin.ui.DragAndDropWrapper.DragStartMode;
+import com.vaadin.ui.DragAndDropWrapper.WrapperDropDetails;
+import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable;
public class AcceptAnythingWindow extends Window {
+ private AbsoluteLayout layout = new AbsoluteLayout();
+
public AcceptAnythingWindow() {
setCaption("Drop anything here");
- DragDropPane pane = new DragDropPane();
- setContent(pane);
- pane.setSizeFull();
+
+ final DragAndDropWrapper wrapper = new DragAndDropWrapper(layout);
+ wrapper.setDropHandler(new DropHandler() {
+
+ public AcceptCriterion getAcceptCriterion() {
+ return AcceptAll.get();
+ }
+
+ public void drop(DragAndDropEvent event) {
+ WrapperDropDetails ed = (WrapperDropDetails) event
+ .getDropTargetData();
+ Transferable transferable = event.getTransferable();
+ TransferableImpl ctr = (TransferableImpl) transferable;
+ // use "component" (from DragDropPane) if available, else
+ // take
+ // the source component
+ Component component = ctr.getSourceComponent();
+ if (component == wrapper) {
+ WrapperTransferable tr = (WrapperTransferable) transferable;
+ component = tr.getDraggedComponent();
+ }
+
+ 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(
+ clientY - top);
+ layout.getPosition(component).setLeftValue(
+ 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/plain");
+
+ 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");
}
-
}
package com.vaadin.tests.dd;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.acceptCriteria.AcceptCriterion;
public boolean accepts(DragAndDropEvent dragEvent) {
Transferable transferable = dragEvent.getTransferable();
- if (transferable instanceof ComponentTransferable) {
- ComponentTransferable componentTransferrable = (ComponentTransferable) transferable;
+ if (transferable instanceof TransferableImpl) {
+ TransferableImpl componentTransferrable = (TransferableImpl) transferable;
if (componentTransferrable.getSourceComponent() == tree1) {
return true;
}
import com.vaadin.data.Item;
import com.vaadin.data.util.HierarchicalContainer;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.DataBoundTransferable;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragAndDropEvent;
// e.printStackTrace();
// }
// System.out.println("Done get to work.");
- if (transferable instanceof ComponentTransferable) {
- ComponentTransferable ct = (ComponentTransferable) transferable;
+ if (transferable instanceof TransferableImpl) {
+ TransferableImpl ct = (TransferableImpl) transferable;
Component component = (Component) ct
.getData("component");
package com.vaadin.tests.dd;
import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.event.dd.acceptCriteria.IsDatabound;
import com.vaadin.event.dd.acceptCriteria.Or;
import com.vaadin.event.dd.acceptCriteria.OverTreeNode;
+import com.vaadin.event.dd.acceptCriteria.ServerSideCriterion;
import com.vaadin.terminal.Resource;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Tree;
import com.vaadin.ui.Window;
import com.vaadin.ui.AbstractSelect.AbstractSelectDropDetails;
+import com.vaadin.ui.Tree.TreeDropDetails;
public class DDTest2 extends TestBase {
* explicitly defining them here), but demonstrates lazy initialization
* option if rules are heavy.
*/
- final AcceptCriterion crit = new Tree.TreeDropCriterion() {
+ final AcceptCriterion crit = new ServerSideCriterion() {
+ public boolean accepts(DragAndDropEvent dragEvent) {
- @Override
- protected Set<Object> getAllowedItemIds(DragAndDropEvent dragEvent,
- Tree tree) {
- HashSet<Object> hashSet = new HashSet<Object>(tree.getItemIds());
- return hashSet;
+ TreeDropDetails dropTargetData = (TreeDropDetails) dragEvent
+ .getDropTargetData();
+
+ Object itemIdOver = dropTargetData.getItemIdOver();
+
+ int i = r.nextInt();
+ if (i % 2 == 0) {
+ return true;
+ }
+ return false;
}
};
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Window;
-import com.vaadin.ui.DragAndDropWrapper.DDWrapperTransferable;
+import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable;
import com.vaadin.ui.DragAndDropWrapper.DragStartMode;
public class DDTest5 extends TestBase {
* here)
*/
- if (dropEvent.getTransferable() instanceof DDWrapperTransferable) {
- DDWrapperTransferable transferable = (DDWrapperTransferable) dropEvent
+ if (dropEvent.getTransferable() instanceof WrapperTransferable) {
+ WrapperTransferable transferable = (WrapperTransferable) dropEvent
.getTransferable();
Component sourceComponent = transferable
.getSourceComponent();
import java.util.Iterator;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropHandler;
public void drop(DragAndDropEvent dropEvent) {
Transferable transferable = dropEvent.getTransferable();
- if (transferable instanceof ComponentTransferable) {
- ComponentTransferable ct = (ComponentTransferable) transferable;
+ if (transferable instanceof TransferableImpl) {
+ TransferableImpl ct = (TransferableImpl) transferable;
Component sourceComponent = ct.getSourceComponent();
if (sourceComponent instanceof WrappedLabel) {
int index = 1;
import java.util.Iterator;
-import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.TransferableImpl;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropHandler;
public void drop(DragAndDropEvent dropEvent) {
Transferable transferable = dropEvent.getTransferable();
- if (transferable instanceof ComponentTransferable) {
- ComponentTransferable ct = (ComponentTransferable) transferable;
+ if (transferable instanceof TransferableImpl) {
+ TransferableImpl ct = (TransferableImpl) transferable;
Component sourceComponent = ct.getSourceComponent();
if (sourceComponent instanceof WrappedLabel) {
int index = 1;