From: Artur Signell Date: Tue, 2 Feb 2010 14:52:42 +0000 (+0000) Subject: Transferrable -> Transferable X-Git-Tag: 6.7.0.beta1~1988^2~32 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e5b48f84dfd032c7abb0c00163bafd7ac1005c2d;p=vaadin-framework.git Transferrable -> Transferable Renamed HasDropHandler to DropTarget Split DropHandler into DropHandler and DragDropHandler to provide separate drop and drag events Split Transferable and DragDropDetails from DragRequest svn changeset:11110/svn branch:6.3_dd --- diff --git a/src/com/vaadin/event/AbstractDropHandler.java b/src/com/vaadin/event/AbstractDropHandler.java index ff77a8be30..633e7a0c10 100644 --- a/src/com/vaadin/event/AbstractDropHandler.java +++ b/src/com/vaadin/event/AbstractDropHandler.java @@ -2,7 +2,6 @@ package com.vaadin.event; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; -import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager.DragEventType; import com.vaadin.ui.Component; import com.vaadin.ui.Tree.Location; import com.vaadin.ui.Tree.TreeDropDetails; @@ -16,14 +15,15 @@ import com.vaadin.ui.Tree.TreeDropDetails; * {@link #receive(Transferable)} method. * */ -public abstract class AbstractDropHandler implements DropHandler { +public abstract class AbstractDropHandler implements DragDropHandler { /** * Criterion that can be used create policy to accept/discard dragged * content (presented by {@link Transferable}). * */ public interface AcceptCriterion { - public boolean accepts(DragRequest request); + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails); } public interface ClientSideVerifiable extends AcceptCriterion { @@ -40,7 +40,9 @@ public abstract class AbstractDropHandler implements DropHandler { } private static final class AcceptAll implements ClientSideVerifiable { - public boolean accepts(DragRequest event) { + + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { return true; } @@ -64,8 +66,10 @@ public abstract class AbstractDropHandler implements DropHandler { this.f2 = f2; } - public boolean accepts(DragRequest event) { - return f1.accepts(event) && f2.accepts(event); + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { + return f1.accepts(transferable, dragDropDetails) + && f2.accepts(transferable, dragDropDetails); } public boolean isClientSideVerifiable() { @@ -94,9 +98,10 @@ public abstract class AbstractDropHandler implements DropHandler { this.component = component; } - public boolean accepts(DragRequest event) { - if (event.getTransferable() instanceof ComponentTransferable) { - return ((ComponentTransferable) event.getTransferable()) + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { + if (transferable instanceof ComponentTransferable) { + return ((ComponentTransferable) transferable) .getSourceComponent() == component; } else { return false; @@ -116,10 +121,10 @@ public abstract class AbstractDropHandler implements DropHandler { } private static final class IsDataBinded implements ClientSideVerifiable { - public boolean accepts(DragRequest event) { - Transferable transferable = event.getTransferable(); - if (transferable instanceof DataBindedTransferrable) { - return ((DataBindedTransferrable) transferable).getItemId() != null; + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { + if (transferable instanceof DataBindedTransferable) { + return ((DataBindedTransferable) transferable).getItemId() != null; } return false; } @@ -142,8 +147,9 @@ public abstract class AbstractDropHandler implements DropHandler { this.acceptCriterion = acceptCriterion; } - public boolean accepts(DragRequest event) { - return !acceptCriterion.accepts(event); + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { + return !acceptCriterion.accepts(transferable, dragDropDetails); } } @@ -157,17 +163,19 @@ public abstract class AbstractDropHandler implements DropHandler { this.f2 = f2; } - public boolean accepts(DragRequest event) { - return f1.accepts(event) || f2.accepts(event); + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { + return f1.accepts(transferable, dragDropDetails) + || f2.accepts(transferable, dragDropDetails); } } public static class OverTreeNode implements ClientSideVerifiable { - public boolean accepts(DragRequest event) { + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { try { - TreeDropDetails eventDetails = (TreeDropDetails) event - .getEventDetails(); + TreeDropDetails eventDetails = (TreeDropDetails) dragDropDetails; return eventDetails.getDropLocation() == Location.MIDDLE; } catch (Exception e) { return false; @@ -195,11 +203,12 @@ public abstract class AbstractDropHandler implements DropHandler { /* * (non-Javadoc) * - * @seecom.vaadin.event.DropHandler#acceptTransferrable(com.vaadin.event. + * @seecom.vaadin.event.DropHandler#acceptTransferable(com.vaadin.event. * Transferable) */ - public boolean acceptTransferrable(DragRequest request) { - return acceptCriterion.accepts(request); + public boolean acceptTransferable(Transferable transferable, + DragDropDetails dragDropDetails) { + return acceptCriterion.accepts(transferable, dragDropDetails); } private boolean clientSideVerifiable() { @@ -210,16 +219,24 @@ public abstract class AbstractDropHandler implements DropHandler { return false; } - public void handleDragRequest(DragRequest event) { - boolean acceptTransferrable = acceptTransferrable(event); - if (acceptTransferrable) { - if (event.getType() == DragEventType.DROP) { - receive(event.getTransferable(), event.getEventDetails()); - } else { - event.setResponseParameter("accepted", true); - } + public void handleDragRequest(DragRequest event, Transferable transferable, + DragDropDetails dragDropDetails) { + boolean acceptTransferable = acceptTransferable(transferable, + dragDropDetails); + if (acceptTransferable) { + event.setResponseParameter("accepted", true); + } + } + public boolean drop(Transferable transferable, + DragDropDetails dragDropDetails) { + boolean acceptTransferable = acceptTransferable(transferable, + dragDropDetails); + if (acceptTransferable) { + receive(transferable, dragDropDetails); + return true; } + return false; } public void paint(PaintTarget target) throws PaintException { @@ -237,7 +254,8 @@ public abstract class AbstractDropHandler implements DropHandler { * * @see com.vaadin.event.DropHandler#receive(com.vaadin.event.Transferable) */ - public abstract void receive(Transferable transferable, Object dropDetails); + public abstract void receive(Transferable transferable, + DragDropDetails dropDetails); public void setAcceptCriterion(AcceptCriterion acceptCriterion) { this.acceptCriterion = acceptCriterion; diff --git a/src/com/vaadin/event/DataBindedTransferable.java b/src/com/vaadin/event/DataBindedTransferable.java new file mode 100644 index 0000000000..6e7675691d --- /dev/null +++ b/src/com/vaadin/event/DataBindedTransferable.java @@ -0,0 +1,9 @@ +package com.vaadin.event; + +public interface DataBindedTransferable extends ComponentTransferable { + + public Object getItemId(); + + public Object getPropertyId(); + +} diff --git a/src/com/vaadin/event/DataBindedTransferrable.java b/src/com/vaadin/event/DataBindedTransferrable.java deleted file mode 100644 index 9a2908bcc2..0000000000 --- a/src/com/vaadin/event/DataBindedTransferrable.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.vaadin.event; - -public interface DataBindedTransferrable extends ComponentTransferable { - - public Object getItemId(); - - public Object getPropertyId(); - -} diff --git a/src/com/vaadin/event/DragDropDataTranslator.java b/src/com/vaadin/event/DragDropDataTranslator.java new file mode 100644 index 0000000000..dbb5141b81 --- /dev/null +++ b/src/com/vaadin/event/DragDropDataTranslator.java @@ -0,0 +1,26 @@ +package com.vaadin.event; + +import java.util.Map; + +/** + * DragDropDataTranslator provides a method for translating drop data from a + * client side widget to server side values. This interface is optional for drop + * operations and only need to be implemented if translation is necessary. If + * this is not implemented the data will be passed through as-is without + * conversion. + */ +public interface DragDropDataTranslator { + /** + * Called before a drop operation to translate the drop data provided by the + * client widget. Should return a DropData implementation with the new + * values. If null is returned the {@link DragDropHandler} will + * automatically create a DropData with all the client variables. + * + * @param rawVariables + * Parameters passed from the client side widget. + * @return A DropData object with the translated data or null. + */ + public DragDropDetails translateDragDropDetails( + Map clientVariables); + +} \ No newline at end of file diff --git a/src/com/vaadin/event/DragDropDetails.java b/src/com/vaadin/event/DragDropDetails.java new file mode 100644 index 0000000000..f617411e23 --- /dev/null +++ b/src/com/vaadin/event/DragDropDetails.java @@ -0,0 +1,12 @@ +package com.vaadin.event; + +import com.vaadin.ui.Component; + +public interface DragDropDetails { + + public Object get(String key); + + public Object put(String key, Object value); + + public Component getTarget(); +} diff --git a/src/com/vaadin/event/DragDropDetailsImpl.java b/src/com/vaadin/event/DragDropDetailsImpl.java new file mode 100644 index 0000000000..1a2ffb2010 --- /dev/null +++ b/src/com/vaadin/event/DragDropDetailsImpl.java @@ -0,0 +1,28 @@ +package com.vaadin.event; + +import java.util.HashMap; +import java.util.Map; + +import com.vaadin.terminal.gwt.server.DragAndDropService; +import com.vaadin.ui.Component; + +public class DragDropDetailsImpl implements DragDropDetails { + + private HashMap data = new HashMap(); + + public DragDropDetailsImpl(Map rawDropData) { + data.putAll(rawDropData); + } + + public Object get(String key) { + return data.get(key); + } + + public Object put(String key, Object value) { + return data.put(key, value); + } + + public Component getTarget() { + return (Component) data.get(DragAndDropService.DROPTARGET_KEY); + } +} diff --git a/src/com/vaadin/event/DragDropHandler.java b/src/com/vaadin/event/DragDropHandler.java new file mode 100644 index 0000000000..259dec8787 --- /dev/null +++ b/src/com/vaadin/event/DragDropHandler.java @@ -0,0 +1,8 @@ +package com.vaadin.event; + +public interface DragDropHandler extends DropHandler { + + public void handleDragRequest(DragRequest event, Transferable transferable, + DragDropDetails dragDropDetails); + +} diff --git a/src/com/vaadin/event/DragRequest.java b/src/com/vaadin/event/DragRequest.java index c1d2763b7f..21c75926fc 100644 --- a/src/com/vaadin/event/DragRequest.java +++ b/src/com/vaadin/event/DragRequest.java @@ -8,17 +8,10 @@ import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager.DragEventType; public class DragRequest { private DragEventType dragEventType; - private Transferable transferable; private Map responseData; - private Object eventDetails; - public DragRequest(DragEventType dragEventType, Transferable transferable) { + public DragRequest(DragEventType dragEventType) { this.dragEventType = dragEventType; - this.transferable = transferable; - } - - public Transferable getTransferable() { - return transferable; } public DragEventType getType() { @@ -44,12 +37,4 @@ public class DragRequest { responseData.put(key, value); } - public void setEventDetails(Object eventDetails) { - this.eventDetails = eventDetails; - } - - public Object getEventDetails() { - return eventDetails; - } - } diff --git a/src/com/vaadin/event/DropHandler.java b/src/com/vaadin/event/DropHandler.java index f44ca15569..f5ee8bc2d7 100644 --- a/src/com/vaadin/event/DropHandler.java +++ b/src/com/vaadin/event/DropHandler.java @@ -2,6 +2,6 @@ package com.vaadin.event; public interface DropHandler { - public void handleDragRequest(DragRequest event); + public boolean drop(Transferable transferable, DragDropDetails dropDetails); } \ No newline at end of file diff --git a/src/com/vaadin/event/DropTarget.java b/src/com/vaadin/event/DropTarget.java new file mode 100644 index 0000000000..8519774cb6 --- /dev/null +++ b/src/com/vaadin/event/DropTarget.java @@ -0,0 +1,15 @@ +package com.vaadin.event; + +import com.vaadin.ui.Component; + +/** + * DropTarget is a marker interface for components supporting drop operations. A + * component that wants to receive drop events should implement this interface + * and provide a DropHandler which will handle the actual drop event. + * + */ +public interface DropTarget extends Component { + + public DropHandler getDropHandler(); + +} \ No newline at end of file diff --git a/src/com/vaadin/event/HasDropHandler.java b/src/com/vaadin/event/HasDropHandler.java deleted file mode 100644 index 8326e5ff37..0000000000 --- a/src/com/vaadin/event/HasDropHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.vaadin.event; - -import java.util.Map; - -import com.vaadin.ui.Component; - -/** - * Implementing component most commonly has also setDropHandler method, but not - * polluting interface here as component might also have internal - * AbstractDropHandler implementation. - * - */ -public interface HasDropHandler extends Component { - public DropHandler getDropHandler(); - - /** - * TODO Consider using map-like type as return type that would be auto - * created by terminal in case this implementation would return null. Would - * enable using simple event details without server side class. Should at - * least include the component that {@link HasDropHandler} -> would make it - * possible for one drophandler to be used on multiple components. - * - * @param rawVariables - * @return - */ - public Object getDragEventDetails(Map rawVariables); -} \ No newline at end of file diff --git a/src/com/vaadin/terminal/DragSource.java b/src/com/vaadin/terminal/DragSource.java index ee4006e742..ece7a79e0c 100644 --- a/src/com/vaadin/terminal/DragSource.java +++ b/src/com/vaadin/terminal/DragSource.java @@ -24,7 +24,7 @@ public interface DragSource { * @param rawVariables * @return */ - public Transferable getTransferrable(Transferable transferable, + public Transferable getTransferable(Transferable transferable, Map rawVariables); } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VDragDropPane.java b/src/com/vaadin/terminal/gwt/client/ui/VDragDropPane.java index 5d3f4ae40a..c5c10c4155 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VDragDropPane.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VDragDropPane.java @@ -46,7 +46,7 @@ public class VDragDropPane extends VAbsoluteLayout implements Container, VDragEvent drag = VDragAndDropManager.get().startDrag( transferable, event.getNativeEvent(), true); drag.createDragImage(((Widget) paintable).getElement(), true); - drag.getEventDetails().put( + drag.getDropDetails().put( "mouseDown", new MouseEventDetails(event.getNativeEvent()) .serialize()); @@ -141,7 +141,7 @@ public class VDragDropPane extends VAbsoluteLayout implements Container, public boolean html5DragDrop(VHtml5DragEvent event) { ApplicationConnection.getConsole().log("HTML 5 Drag Drop"); - VTransferable transferable = vaadinDragEvent.getTransferrable(); + VTransferable transferable = vaadinDragEvent.getTransferable(); JsArrayString types = event.getTypes(); for (int i = 0; i < types.length(); i++) { @@ -214,7 +214,7 @@ public class VDragDropPane extends VAbsoluteLayout implements Container, return false; } - Map transferable = drag.getEventDetails(); + Map transferable = drag.getDropDetails(); // this is absolute layout based, and we may want to set // component diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTree.java b/src/com/vaadin/terminal/gwt/client/ui/VTree.java index 745ec31878..dd91fcdcea 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTree.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTree.java @@ -164,7 +164,7 @@ public class VTree extends FlowPanel implements Paintable, VHasDropHandler { currentMouseOverKey = findCurrentMouseOverKey(drag.getElementOver()); - drag.getEventDetails().put("itemIdOver", currentMouseOverKey); + drag.getDropDetails().put("itemIdOver", currentMouseOverKey); if (currentMouseOverKey != null) { String detail = getDropDetail(drag.getCurrentGwtEvent()); @@ -173,8 +173,8 @@ public class VTree extends FlowPanel implements Paintable, VHasDropHandler { && "Center".equals(detail)) { overTreeNode = true; } - drag.getEventDetails().put("itemIdOverIsNode", overTreeNode); - drag.getEventDetails().put("detail", detail); + drag.getDropDetails().put("itemIdOverIsNode", overTreeNode); + drag.getDropDetails().put("detail", detail); } } @@ -218,10 +218,10 @@ public class VTree extends FlowPanel implements Paintable, VHasDropHandler { @Override public void dragOver(final VDragEvent currentDrag) { - final Object oldIdOver = currentDrag.getEventDetails().get( + final Object oldIdOver = currentDrag.getDropDetails().get( "itemIdOver"); final String oldDetail = (String) currentDrag - .getEventDetails().get("detail"); + .getDropDetails().get("detail"); updateTreeRelatedDragData(currentDrag); final String detail = getDropDetail(currentDrag diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java index 81331f334e..42602dd3be 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VAbstractDropHandler.java @@ -44,7 +44,7 @@ public abstract class VAbstractDropHandler implements VDropHandler { } /** - * If transferrable is accepted (either via server visit or client side + * If transferable is accepted (either via server visit or client side * rules) the default implementation calls {@link #dragAccepted(VDragEvent)} * method. */ diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterionImpl.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterionImpl.java index f8905443cf..e2cd4b6a5b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterionImpl.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VAcceptCriterionImpl.java @@ -10,7 +10,7 @@ public class VAcceptCriterionImpl { private final class OverTreeNode implements VAcceptCriteria { public boolean accept(VDragEvent drag, UIDL configuration) { - Boolean containsKey = (Boolean) drag.getEventDetails().get( + Boolean containsKey = (Boolean) drag.getDropDetails().get( "itemIdOverIsNode"); if (containsKey != null && containsKey.booleanValue()) { return true; @@ -22,7 +22,7 @@ public class VAcceptCriterionImpl { private final class ComponentCriteria implements VAcceptCriteria { public boolean accept(VDragEvent drag, UIDL configuration) { try { - Paintable component = drag.getTransferrable().getComponent(); + Paintable component = drag.getTransferable().getComponent(); String requiredPid = configuration .getStringAttribute("component"); Paintable paintable = VDragAndDropManager.get() @@ -62,7 +62,7 @@ public class VAcceptCriterionImpl { private final class HasItemId implements VAcceptCriteria { public boolean accept(VDragEvent drag, UIDL configuration) { - return drag.getTransferrable().getItemId() != null; + return drag.getTransferable().getItemId() != null; } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java index fd17d7c4d0..8dab257e29 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java @@ -395,9 +395,9 @@ public class VDragAndDropManager { } if (currentDropHandler != null) { // we have dropped on a drop target - boolean sendTransferrableToServer = currentDropHandler + boolean sendTransferableToServer = currentDropHandler .drop(currentDrag); - if (sendTransferrableToServer) { + if (sendTransferableToServer) { doRequest(DragEventType.DROP); } currentDropHandler = null; @@ -451,7 +451,7 @@ public class VDragAndDropManager { false); client.updateVariable(DD_SERVICE, "dhowner", paintable, false); - VTransferable transferable = currentDrag.getTransferrable(); + VTransferable transferable = currentDrag.getTransferable(); if (transferable.getItemId() != null) { client.updateVariable(DD_SERVICE, "itemId", transferable @@ -471,7 +471,7 @@ public class VDragAndDropManager { try { MouseEventDetails mouseEventDetails = new MouseEventDetails( currentDrag.currentGwtEvent); - currentDrag.getEventDetails().put("mouseEvent", + currentDrag.getDropDetails().put("mouseEvent", mouseEventDetails.serialize()); } catch (Exception e) { // NOP, (at least oophm on Safari) can't serialize html dd event @@ -479,9 +479,9 @@ public class VDragAndDropManager { // mouseevent } } else { - currentDrag.getEventDetails().put("mouseEvent", null); + currentDrag.getDropDetails().put("mouseEvent", null); } - client.updateVariable(DD_SERVICE, "evt", currentDrag.getEventDetails(), + client.updateVariable(DD_SERVICE, "evt", currentDrag.getDropDetails(), false); client.updateVariable(DD_SERVICE, "tra", transferable.getVariableMap(), diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java index 0da6fbabda..a35a4a7e0c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java @@ -45,7 +45,7 @@ public class VDragEvent { start = new Date(); } - public VTransferable getTransferrable() { + public VTransferable getTransferable() { return transferable; } @@ -109,7 +109,7 @@ public class VDragEvent { * * @return */ - public Map getEventDetails() { + public Map getDropDetails() { return dropDetails; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDropHandler.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDropHandler.java index 5a4701fd9f..a132271283 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDropHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDropHandler.java @@ -10,26 +10,37 @@ import com.vaadin.terminal.gwt.client.Paintable; public interface VDropHandler { /** - * Called by D'D' manager when drag gets over this drop handler. + * Called by DragAndDropManager when a drag operation is in progress and the + * cursor enters the area occupied by this Paintable. * - * @param drag + * @param dragEvent + * DragEvent which contains the transferable and other + * information for the operation */ - public void dragEnter(VDragEvent drag); + public void dragEnter(VDragEvent dragEvent); /** - * Called by D'D' manager when drag gets out this drop handler. + * Called by DragAndDropManager when a drag operation is in progress and the + * cursor leaves the area occupied by this Paintable. * - * @param drag + * @param dragEvent + * DragEvent which contains the transferable and other + * information for the operation */ - public void dragLeave(VDragEvent drag); + public void dragLeave(VDragEvent dragEvent); /** - * The actual drop happened on this drop handler. + * Called by DragAndDropManager when a drag operation was in progress and a + * drop was performed on this Paintable. * - * @param drag - * @return true if Tranferrable of this drag event needs to be sent to - * server, false if drop was finally canceled or no server visit is - * needed + * + * @param dragEvent + * DragEvent which contains the transferable and other + * information for the operation + * + * @return true if the Tranferrable of this drag event needs to be sent to + * the server, false if drop is rejected or no server side event + * should be sent */ public boolean drop(VDragEvent drag); @@ -45,7 +56,7 @@ public interface VDropHandler { public void dragOver(VDragEvent currentDrag); /** - * Returns the Paintable into which this DragHandler is assosiated + * Returns the Paintable into which this DragHandler is associated */ public Paintable getPaintable(); diff --git a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java index 91efd6824d..eafda3c38a 100644 --- a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java +++ b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java @@ -6,9 +6,13 @@ import java.util.HashMap; import java.util.Map; import com.vaadin.event.ComponentTransferable; +import com.vaadin.event.DragDropDataTranslator; +import com.vaadin.event.DragDropDetails; +import com.vaadin.event.DragDropDetailsImpl; +import com.vaadin.event.DragDropHandler; import com.vaadin.event.DragRequest; import com.vaadin.event.DropHandler; -import com.vaadin.event.HasDropHandler; +import com.vaadin.event.DropTarget; import com.vaadin.event.Transferable; import com.vaadin.terminal.DragSource; import com.vaadin.terminal.VariableOwner; @@ -18,7 +22,9 @@ import com.vaadin.ui.Component; public class DragAndDropService implements VariableOwner { private static final long serialVersionUID = -4745268869323400203L; - + + public static final String DROPTARGET_KEY = "target"; + private int lastVisitId; private DragRequest currentRequest; @@ -28,46 +34,143 @@ public class DragAndDropService implements VariableOwner { private Transferable transferable; public void changeVariables(Object source, Map variables) { - HasDropHandler dropHandlerOwner = (HasDropHandler) variables - .get("dhowner"); - if (dropHandlerOwner == null) { + Object owner = variables.get("dhowner"); + + // Validate drop handler owner + if (!(owner instanceof DropTarget)) { + System.err.println("DropHandler owner " + owner + + " must implement DropTarget"); return; } + if (owner == null) { + System.err.println("DropHandler owner is null"); + return; + } + + DropTarget dropTarget = (DropTarget) owner; lastVisitId = (Integer) variables.get("visitId"); - currentRequest = constructDragRequest(variables, dropHandlerOwner); + // Is this a drop request or a drag/move request? + boolean dropRequest = isDropRequest(variables); + if (dropRequest) { + handleDropRequest(dropTarget, variables); + } else { + handleDragRequest(dropTarget, variables); + } - DropHandler dropHandler = (dropHandlerOwner).getDropHandler(); + } - Object eventDetails = dropHandlerOwner - .getDragEventDetails((Map) variables.get("evt")); + /** + * Handles a drop request from the VDragAndDropManager. + * + * @param dropTarget + * @param variables + */ + private void handleDropRequest(DropTarget dropTarget, + Map variables) { + DropHandler dropHandler = (dropTarget).getDropHandler(); + if (dropHandler == null) { + // No dropHandler returned so no drop can be performed. + System.err + .println("DropTarget.getDropHandler() returned null for owner: " + + dropTarget); + return; + } - currentRequest.setEventDetails(eventDetails); + /* + * Construct the Transferable and the DragDropDetails for the drop + * operation based on the info passed from the client widgets (drag + * source for Transferable, drop target for DragDropDetails). + */ + Transferable transferable = constructTransferable(dropTarget, variables); + DragDropDetails dropData = constructDragDropDetails(dropTarget, + variables); - dropHandler.handleDragRequest(currentRequest); - if (currentRequest.getType() == DragEventType.DROP) { - // TODO transferable should also be cleaned on each non-dnd - // variable change (if visited server, but drop did not happen -> - // should do cleanup to release memory) - transferable = null; + dropHandler.drop(transferable, dropData); + } + + /** + * Handles a drag/move request from the VDragAndDropManager. + * + * @param dropTarget + * @param variables + */ + private void handleDragRequest(DropTarget dropTarget, + Map variables) { + lastVisitId = (Integer) variables.get("visitId"); + + DropHandler dropHandler = (dropTarget).getDropHandler(); + if (!(dropHandler instanceof DragDropHandler)) { + System.err + .println("DragRequest could not be send to handler as DropHandle does not implement DragDropHandler"); + return; } + DragDropHandler dragDropHandler = (DragDropHandler) dropHandler; + /* + * Construct the Transferable and the DragDropDetails for the drag + * operation based on the info passed from the client widgets (drag + * source for Transferable, current target for DragDropDetails). + */ + Transferable transferable = constructTransferable(dropTarget, variables); + DragDropDetails dragDropDetails = constructDragDropDetails(dropTarget, + variables); + + dragDropHandler.handleDragRequest(constructDragRequest(variables, + transferable), transferable, dragDropDetails); } - private DragRequest constructDragRequest(Map variables, - HasDropHandler dropHandlerOwner) { - Transferable transferable = constructTransferrable(variables, - dropHandlerOwner); + private static DragRequest constructDragRequest( + Map variables, Transferable transferable) { int type = (Integer) variables.get("type"); - DragRequest dragRequest = new DragRequest(DragEventType.values()[type], - transferable); + DragRequest dragRequest = new DragRequest(DragEventType.values()[type]); return dragRequest; } + /** + * Construct DragDropDetails based on variables from client drop target. + * Uses DragDropDetailsTranslator if available, otherwise a default + * DragDropDetails implementation is used. + * + * @param dropTarget + * @param variables + * @return + */ + @SuppressWarnings("unchecked") + private DragDropDetails constructDragDropDetails(DropTarget dropTarget, + Map variables) { + Map rawDragDropDetails = (Map) variables + .get("evt"); + + DragDropDetails dropData = null; + if (dropTarget instanceof DragDropDataTranslator) { + dropData = ((DragDropDataTranslator) dropTarget) + .translateDragDropDetails(rawDragDropDetails); + } + + if (dropData == null) { + // Create a default DragDropDetails with all the raw variables + dropData = new DragDropDetailsImpl(rawDragDropDetails); + } + + dropData.put(DROPTARGET_KEY, dropTarget); + + return dropData; + } + + private boolean isDropRequest(Map variables) { + return getRequestType(variables) == DragEventType.DROP; + } + + private DragEventType getRequestType(Map variables) { + int type = (Integer) variables.get("type"); + return DragEventType.values()[type]; + } + @SuppressWarnings("unchecked") - private Transferable constructTransferrable(Map variables, - HasDropHandler dropHandlerOwner) { + private Transferable constructTransferable(DropTarget dropHandlerOwner, + Map variables) { int eventId = (Integer) variables.get("eventId"); if (currentEventId != eventId) { transferable = null; @@ -79,10 +182,9 @@ public class DragAndDropService implements VariableOwner { variables = (Map) variables.get("tra"); - if (sourceComponent != null - && sourceComponent instanceof DragSource) { - transferable = ((DragSource) sourceComponent) - .getTransferrable(transferable, variables); + if (sourceComponent != null && sourceComponent instanceof DragSource) { + transferable = ((DragSource) sourceComponent).getTransferable( + transferable, variables); } else { if (transferable == null) { if (sourceComponent != null) { diff --git a/src/com/vaadin/ui/DragDropPane.java b/src/com/vaadin/ui/DragDropPane.java index 8613547542..070f7a5c8f 100644 --- a/src/com/vaadin/ui/DragDropPane.java +++ b/src/com/vaadin/ui/DragDropPane.java @@ -4,8 +4,11 @@ import java.util.Map; import com.vaadin.event.AbstractDropHandler; import com.vaadin.event.ComponentTransferable; -import com.vaadin.event.DataBindedTransferrable; -import com.vaadin.event.HasDropHandler; +import com.vaadin.event.DataBindedTransferable; +import com.vaadin.event.DragDropDataTranslator; +import com.vaadin.event.DragDropDetails; +import com.vaadin.event.DragDropDetailsImpl; +import com.vaadin.event.DropTarget; import com.vaadin.event.Transferable; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; @@ -34,7 +37,8 @@ import com.vaadin.terminal.gwt.client.MouseEventDetails; */ @SuppressWarnings("serial") @ClientWidget(com.vaadin.terminal.gwt.client.ui.VDragDropPane.class) -public class DragDropPane extends AbsoluteLayout implements HasDropHandler { +public class DragDropPane extends AbsoluteLayout implements DropTarget, + DragDropDataTranslator { private AbstractDropHandler abstractDropHandler; @@ -46,7 +50,7 @@ public class DragDropPane extends AbsoluteLayout implements HasDropHandler { dropHandler = new AbstractDropHandler() { @Override public void receive(Transferable transferable, - Object dropDetails) { + DragDropDetails dropDetails) { DragEventDetails ed = (DragEventDetails) dropDetails; if (transferable instanceof ComponentTransferable) { @@ -54,14 +58,14 @@ public class DragDropPane extends AbsoluteLayout implements HasDropHandler { Component component = ctr.getSourceComponent(); if (component.getParent() != DragDropPane.this) { - if (transferable instanceof DataBindedTransferrable) { + if (transferable instanceof DataBindedTransferable) { // Item has been dragged, construct a Label from // Item id Label l = new Label(); l.setSizeUndefined(); l .setValue("ItemId : " - + ((DataBindedTransferrable) transferable) + + ((DataBindedTransferable) transferable) .getItemId()); DragDropPane.this.addComponent(l); component = l; @@ -159,36 +163,33 @@ public class DragDropPane extends AbsoluteLayout implements HasDropHandler { return abstractDropHandler; } - class DragEventDetails { - - private Map vars; + class DragEventDetails extends DragDropDetailsImpl { public DragEventDetails(Map rawVariables) { - vars = rawVariables; + super(rawVariables); } public Integer getAbsoluteTop() { - return (Integer) vars.get("absoluteTop"); + return (Integer) get("absoluteTop"); } public Integer getAbsoluteLeft() { - return (Integer) vars.get("absoluteLeft"); + return (Integer) get("absoluteLeft"); } public MouseEventDetails getMouseDownEvent() { - return MouseEventDetails - .deSerialize((String) vars.get("mouseDown")); + return MouseEventDetails.deSerialize((String) get("mouseDown")); } public MouseEventDetails getMouseEvent() { - return MouseEventDetails.deSerialize((String) vars - .get("mouseEvent")); + return MouseEventDetails.deSerialize((String) get("mouseEvent")); } } - public Object getDragEventDetails(Map rawVariables) { - return new DragEventDetails(rawVariables); + public DragDropDetails translateDragDropDetails( + Map clientVariables) { + return new DragEventDetails(clientVariables); } } diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 8babc68e1a..41cf86750f 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -23,17 +23,17 @@ import com.vaadin.data.Property; import com.vaadin.data.util.ContainerOrderedWrapper; import com.vaadin.data.util.IndexedContainer; import com.vaadin.event.Action; -import com.vaadin.event.DataBindedTransferrable; +import com.vaadin.event.DataBindedTransferable; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.Transferable; import com.vaadin.event.Action.Handler; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.event.ItemClickEvent.ItemClickSource; +import com.vaadin.terminal.DragSource; import com.vaadin.terminal.KeyMapper; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Resource; -import com.vaadin.terminal.DragSource; import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.VScrollTable; @@ -57,8 +57,7 @@ import com.vaadin.terminal.gwt.client.ui.VScrollTable; @SuppressWarnings("serial") @ClientWidget(VScrollTable.class) public class Table extends AbstractSelect implements Action.Container, - Container.Ordered, Container.Sortable, ItemClickSource, - DragSource { + Container.Ordered, Container.Sortable, ItemClickSource, DragSource { /** * Modes that Table support as drag sourse. @@ -3322,7 +3321,7 @@ public class Table extends AbstractSelect implements Action.Container, requestRepaint(); } - class TableTransferrable implements DataBindedTransferrable { + class TableTransferable implements DataBindedTransferable { private final HashMap data = new HashMap(); @@ -3352,8 +3351,7 @@ public class Table extends AbstractSelect implements Action.Container, } - private void updateTransferrable(Map payload, - Transferable tr) { + private void updateTransferable(Map payload, Transferable tr) { Object object = payload.get("itemId"); if (object != null) { tr.setData("itemId", itemIdMapper.get((String) object)); @@ -3361,12 +3359,12 @@ public class Table extends AbstractSelect implements Action.Container, } } - public Transferable getTransferrable(Transferable transferable, + public TableTransferable getTransferable(Transferable transferable, Map rawVariables) { if (transferable == null) { - transferable = new TableTransferrable(); + transferable = new TableTransferable(); } - updateTransferrable(rawVariables, transferable); - return transferable; + updateTransferable(rawVariables, transferable); + return (TableTransferable) transferable; } } diff --git a/src/com/vaadin/ui/Tree.java b/src/com/vaadin/ui/Tree.java index 61c667cde0..566d8ed4ea 100644 --- a/src/com/vaadin/ui/Tree.java +++ b/src/com/vaadin/ui/Tree.java @@ -24,9 +24,11 @@ import com.vaadin.data.util.ContainerHierarchicalWrapper; import com.vaadin.data.util.IndexedContainer; import com.vaadin.event.AbstractDropHandler; import com.vaadin.event.Action; -import com.vaadin.event.DataBindedTransferrable; +import com.vaadin.event.DataBindedTransferable; +import com.vaadin.event.DragDropDataTranslator; +import com.vaadin.event.DragDropDetailsImpl; import com.vaadin.event.DropHandler; -import com.vaadin.event.HasDropHandler; +import com.vaadin.event.DropTarget; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.Transferable; import com.vaadin.event.ItemClickEvent.ItemClickListener; @@ -51,7 +53,8 @@ import com.vaadin.terminal.gwt.client.ui.VTree; @SuppressWarnings("serial") @ClientWidget(VTree.class) public class Tree extends AbstractSelect implements Container.Hierarchical, - Action.Container, ItemClickSource, DragSource, HasDropHandler { + Action.Container, ItemClickSource, DragSource, DropTarget, + DragDropDataTranslator { private static final Method EXPAND_METHOD; @@ -115,7 +118,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, private int itemDragModes = DRAG_OUT; - class TreeTransferrable implements DataBindedTransferrable { + class TreeTransferable implements DataBindedTransferable { private final HashMap data = new HashMap(); @@ -144,10 +147,10 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, } } - public Transferable getTransferrable(Transferable transferable, + public Transferable getTransferable(Transferable transferable, Map payload) { if (transferable == null) { - transferable = new TreeTransferrable(); + transferable = new TreeTransferable(); } // updating drag source variables Object object = payload.get("itemId"); @@ -641,8 +644,8 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, // New items target.addVariable(this, "newitem", new String[] {}); - if (abstractDropHandler != null) { - abstractDropHandler.paint(target); + if (dropHandler instanceof AbstractDropHandler) { + ((AbstractDropHandler) dropHandler).paint(target); } } @@ -1085,7 +1088,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, private ItemStyleGenerator itemStyleGenerator; - private AbstractDropHandler abstractDropHandler; + private DropHandler dropHandler; public void addListener(ItemClickListener listener) { addListener(VTree.ITEM_CLICK_EVENT_ID, ItemClickEvent.class, listener, @@ -1144,30 +1147,25 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, } public DropHandler getDropHandler() { - return abstractDropHandler; + return dropHandler; } - public void setDropHandler(AbstractDropHandler abstractDropHandler) { - this.abstractDropHandler = abstractDropHandler; - } - - public Object getDragEventDetails(Map rawVariables) { - return new TreeDropDetails(rawVariables); + public void setDropHandler(DropHandler dropHandler) { + this.dropHandler = dropHandler; } public enum Location { TOP, BOTTOM, MIDDLE } - public class TreeDropDetails { + public class TreeDropDetails extends DragDropDetailsImpl { - private Map vars; private Object idOver; TreeDropDetails(Map rawVariables) { - vars = rawVariables; + super(rawVariables); // eagar fetch itemid, mapper may be emptied - String keyover = (String) vars.get("itemIdOver"); + String keyover = (String) get("itemIdOver"); if (keyover != null) { idOver = itemIdMapper.get(keyover); } @@ -1178,7 +1176,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, } public Location getDropLocation() { - String s = (String) vars.get("detail"); + String s = (String) get("detail"); if ("Top".equals(s)) { return Location.TOP; } else if ("Bottom".equals(s)) { @@ -1190,4 +1188,9 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, } + public TreeDropDetails translateDragDropDetails( + Map clientVariables) { + return new TreeDropDetails(clientVariables); + } + } diff --git a/tests/src/com/vaadin/tests/dd/AcceptFromComponent.java b/tests/src/com/vaadin/tests/dd/AcceptFromComponent.java index 75d516faf6..a2a8d83d47 100644 --- a/tests/src/com/vaadin/tests/dd/AcceptFromComponent.java +++ b/tests/src/com/vaadin/tests/dd/AcceptFromComponent.java @@ -1,7 +1,7 @@ package com.vaadin.tests.dd; import com.vaadin.event.ComponentTransferable; -import com.vaadin.event.DragRequest; +import com.vaadin.event.DragDropDetails; import com.vaadin.event.Transferable; import com.vaadin.event.AbstractDropHandler.AcceptCriterion; import com.vaadin.ui.DragDropPane; @@ -16,8 +16,8 @@ public class AcceptFromComponent extends Window { DragDropPane pane = new DragDropPane(); setContent(pane); pane.getDropHandler().setAcceptCriterion(new AcceptCriterion() { - public boolean accepts(DragRequest request) { - Transferable transferable = request.getTransferable(); + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { if (transferable instanceof ComponentTransferable) { ComponentTransferable componentTransferrable = (ComponentTransferable) transferable; if (componentTransferrable.getSourceComponent() == tree1) { diff --git a/tests/src/com/vaadin/tests/dd/CustomDDImplementation.java b/tests/src/com/vaadin/tests/dd/CustomDDImplementation.java index fb1d70855d..d0c1aa7d46 100644 --- a/tests/src/com/vaadin/tests/dd/CustomDDImplementation.java +++ b/tests/src/com/vaadin/tests/dd/CustomDDImplementation.java @@ -1,11 +1,11 @@ package com.vaadin.tests.dd; -import java.util.Map; - import com.vaadin.event.AbstractDropHandler; +import com.vaadin.event.DragDropDetails; +import com.vaadin.event.DragDropHandler; import com.vaadin.event.DragRequest; import com.vaadin.event.DropHandler; -import com.vaadin.event.HasDropHandler; +import com.vaadin.event.DropTarget; import com.vaadin.event.Transferable; import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager.DragEventType; import com.vaadin.ui.AbstractComponent; @@ -39,18 +39,14 @@ public class CustomDDImplementation extends CustomComponent { * */ @ClientWidget(VMyDropTarget.class) - class MyDropTarget extends AbstractComponent implements HasDropHandler { - + class MyDropTarget extends AbstractComponent implements DropTarget { public DropHandler getDropHandler() { - return new DropHandler() { - public void handleDragRequest(DragRequest dragRequest) { - Transferable transferable = dragRequest.getTransferable(); + return new DragDropHandler() { + public void handleDragRequest(DragRequest dragRequest, + Transferable transferable, + DragDropDetails dragDropDetails) { DragEventType type = dragRequest.getType(); switch (type) { - case DROP: - // Do something with data - - break; case ENTER: // eg. validate transferrable @@ -71,16 +67,13 @@ public class CustomDDImplementation extends CustomComponent { } } - }; - } - public Object getDragEventDetails(Map rawVariables) { - /* - * If client side sets some event details, translate them to desired - * server side presentation here. The returned object will be passed - * for drop handler. - */ - return null; + public boolean drop(Transferable transferable, + DragDropDetails dropDetails) { + // Do something with data + return true; + } + }; } } diff --git a/tests/src/com/vaadin/tests/dd/DDTest1.java b/tests/src/com/vaadin/tests/dd/DDTest1.java index 2eac9b67a0..eb68daf762 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest1.java +++ b/tests/src/com/vaadin/tests/dd/DDTest1.java @@ -6,8 +6,8 @@ import com.vaadin.data.Item; import com.vaadin.data.util.HierarchicalContainer; import com.vaadin.event.AbstractDropHandler; import com.vaadin.event.ComponentTransferable; -import com.vaadin.event.DataBindedTransferrable; -import com.vaadin.event.DragRequest; +import com.vaadin.event.DataBindedTransferable; +import com.vaadin.event.DragDropDetails; import com.vaadin.event.Transferable; import com.vaadin.event.AbstractDropHandler.AcceptCriterion; import com.vaadin.terminal.ExternalResource; @@ -60,8 +60,8 @@ public class DDTest1 extends TestBase { .setCaption("Pane2 (accept needs server side visit, only \"Bar\")"); AcceptCriterion f = new AcceptCriterion() { - public boolean accepts(DragRequest request) { - Transferable transferable = request.getTransferable(); + public boolean accepts(Transferable transferable, + DragDropDetails dragDropDetails) { // System.out.println("Simulating 500ms processing..."); // try { // Thread.sleep(200); @@ -116,11 +116,12 @@ public class DDTest1 extends TestBase { AbstractDropHandler itemSorter = new AbstractDropHandler() { @Override - public void receive(Transferable transferable, Object dropdetails) { + public void receive(Transferable transferable, + DragDropDetails dropdetails) { TreeDropDetails details = (TreeDropDetails) dropdetails; // TODO set properties, so same sorter could be used in Table - if (transferable instanceof DataBindedTransferrable) { - DataBindedTransferrable transferrable2 = (DataBindedTransferrable) transferable; + if (transferable instanceof DataBindedTransferable) { + DataBindedTransferable transferrable2 = (DataBindedTransferable) transferable; Object itemId = transferrable2.getItemId(); diff --git a/tests/src/com/vaadin/tests/dd/DDTest2.java b/tests/src/com/vaadin/tests/dd/DDTest2.java index 04162045f7..02458240bf 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest2.java +++ b/tests/src/com/vaadin/tests/dd/DDTest2.java @@ -7,7 +7,8 @@ import com.vaadin.data.util.HierarchicalContainer; import com.vaadin.demo.tutorial.addressbook.data.Person; import com.vaadin.demo.tutorial.addressbook.data.PersonContainer; import com.vaadin.event.AbstractDropHandler; -import com.vaadin.event.DataBindedTransferrable; +import com.vaadin.event.DataBindedTransferable; +import com.vaadin.event.DragDropDetails; import com.vaadin.event.Transferable; import com.vaadin.event.AbstractDropHandler.AcceptCriterion; import com.vaadin.event.AbstractDropHandler.And; @@ -54,12 +55,13 @@ public class DDTest2 extends TestBase { AbstractDropHandler dropHandler = new AbstractDropHandler() { @Override - public void receive(Transferable transferable, Object dropdetails) { + public void receive(Transferable transferable, + DragDropDetails dropdetails) { /* * We know transferrable is from table, so it is of type * DataBindedTransferrable */ - DataBindedTransferrable tr = (DataBindedTransferrable) transferable; + DataBindedTransferable tr = (DataBindedTransferable) transferable; Object itemId = tr.getItemId(); Table fromTable = (Table) tr.getSourceComponent(); String name = fromTable.getItem(itemId).getItemProperty("Name") @@ -102,11 +104,12 @@ public class DDTest2 extends TestBase { dropHandler = new AbstractDropHandler() { @Override - public void receive(Transferable transferable, Object dropdetails) { + public void receive(Transferable transferable, + DragDropDetails dropdetails) { TreeDropDetails details = (TreeDropDetails) dropdetails; - if (transferable instanceof DataBindedTransferrable) { - DataBindedTransferrable tr = (DataBindedTransferrable) transferable; + if (transferable instanceof DataBindedTransferable) { + DataBindedTransferable tr = (DataBindedTransferable) transferable; Object itemId = tree2.addItem(); tree2.setParent(itemId, details.getItemIdOver());