]> source.dussan.org Git - vaadin-framework.git/commitdiff
svn changeset:11066/svn branch:6.3_dd
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Sun, 31 Jan 2010 13:55:43 +0000 (13:55 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Sun, 31 Jan 2010 13:55:43 +0000 (13:55 +0000)
22 files changed:
src/com/vaadin/event/AbstractDropHandler.java
src/com/vaadin/event/DragRequest.java
src/com/vaadin/event/HasDropHandler.java
src/com/vaadin/terminal/DragSource.java [new file with mode: 0644]
src/com/vaadin/terminal/TransferTranslator.java [deleted file]
src/com/vaadin/terminal/gwt/client/ui/VDragDropPane.java
src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
src/com/vaadin/terminal/gwt/client/ui/VTree.java
src/com/vaadin/terminal/gwt/client/ui/dd/AbstractDropHandler.java
src/com/vaadin/terminal/gwt/client/ui/dd/AcceptCriteria.java
src/com/vaadin/terminal/gwt/client/ui/dd/AcceptCriterionImpl.java
src/com/vaadin/terminal/gwt/client/ui/dd/DragAndDropManager.java
src/com/vaadin/terminal/gwt/client/ui/dd/DragEvent.java
src/com/vaadin/terminal/gwt/client/ui/dd/Transferable.java
src/com/vaadin/terminal/gwt/server/DragAndDropService.java
src/com/vaadin/ui/DragDropPane.java
src/com/vaadin/ui/Table.java
src/com/vaadin/ui/Tree.java
tests/src/com/vaadin/tests/dd/AcceptFromComponent.java
tests/src/com/vaadin/tests/dd/CustomDDImplementation.java
tests/src/com/vaadin/tests/dd/DDTest1.java
tests/src/com/vaadin/tests/dd/DDTest2.java

index da15dc61b60fc78d398e402831020ef9061db85e..9023183f509fbca792ae97fd0afc54a0da469ae2 100644 (file)
@@ -4,6 +4,8 @@ import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.gwt.client.ui.dd.DragAndDropManager.DragEventType;
 import com.vaadin.ui.Component;
+import com.vaadin.ui.Tree.Location;
+import com.vaadin.ui.Tree.TreeDropDetails;
 
 /**
  * An implementation of DropHandler interface.
@@ -19,12 +21,9 @@ public abstract class AbstractDropHandler implements DropHandler {
      * Criterion that can be used create policy to accept/discard dragged
      * content (presented by {@link Transferable}).
      * 
-     * TODO figure out how this can be done partly on client at least in some
-     * cases. isClientSideFilterable() tms.
-     * 
      */
     public interface AcceptCriterion {
-        public boolean accepts(Transferable transferable);
+        public boolean accepts(DragRequest request);
     }
 
     public interface ClientSideVerifiable extends AcceptCriterion {
@@ -41,7 +40,7 @@ public abstract class AbstractDropHandler implements DropHandler {
     }
 
     private static final class AcceptAll implements ClientSideVerifiable {
-        public boolean accepts(Transferable transferable) {
+        public boolean accepts(DragRequest event) {
             return true;
         }
 
@@ -65,8 +64,8 @@ public abstract class AbstractDropHandler implements DropHandler {
             this.f2 = f2;
         }
 
-        public boolean accepts(Transferable transferable) {
-            return f1.accepts(transferable) && f2.accepts(transferable);
+        public boolean accepts(DragRequest event) {
+            return f1.accepts(event) && f2.accepts(event);
         }
 
         public boolean isClientSideVerifiable() {
@@ -95,9 +94,9 @@ public abstract class AbstractDropHandler implements DropHandler {
             this.component = component;
         }
 
-        public boolean accepts(Transferable transferable) {
-            if (transferable instanceof ComponentTransferrable) {
-                return ((ComponentTransferrable) transferable)
+        public boolean accepts(DragRequest event) {
+            if (event.getTransferable() instanceof ComponentTransferrable) {
+                return ((ComponentTransferrable) event.getTransferable())
                         .getSourceComponent() == component;
             } else {
                 return false;
@@ -117,7 +116,8 @@ public abstract class AbstractDropHandler implements DropHandler {
     }
 
     private static final class IsDataBinded implements ClientSideVerifiable {
-        public boolean accepts(Transferable transferable) {
+        public boolean accepts(DragRequest event) {
+            Transferable transferable = event.getTransferable();
             if (transferable instanceof DataBindedTransferrable) {
                 return ((DataBindedTransferrable) transferable).getItemId() != null;
             }
@@ -142,8 +142,8 @@ public abstract class AbstractDropHandler implements DropHandler {
             this.acceptCriterion = acceptCriterion;
         }
 
-        public boolean accepts(Transferable transferable) {
-            return !acceptCriterion.accepts(transferable);
+        public boolean accepts(DragRequest event) {
+            return !acceptCriterion.accepts(event);
         }
 
     }
@@ -157,17 +157,18 @@ public abstract class AbstractDropHandler implements DropHandler {
             this.f2 = f2;
         }
 
-        public boolean accepts(Transferable transferable) {
-            return f1.accepts(transferable) || f2.accepts(transferable);
+        public boolean accepts(DragRequest event) {
+            return f1.accepts(event) || f2.accepts(event);
         }
     }
 
     public static class OverTreeNode implements ClientSideVerifiable {
 
-        public boolean accepts(Transferable transferable) {
+        public boolean accepts(DragRequest event) {
             try {
-                return transferable.getData("detail").toString().toLowerCase()
-                        .equals("center");
+                TreeDropDetails eventDetails = (TreeDropDetails) event
+                        .getEventDetails();
+                return eventDetails.getDropLocation() == Location.MIDDLE;
             } catch (Exception e) {
                 return false;
             }
@@ -197,8 +198,8 @@ public abstract class AbstractDropHandler implements DropHandler {
      * @seecom.vaadin.event.DropHandler#acceptTransferrable(com.vaadin.event.
      * Transferable)
      */
-    public boolean acceptTransferrable(Transferable transferable) {
-        return acceptCriterion.accepts(transferable);
+    public boolean acceptTransferrable(DragRequest request) {
+        return acceptCriterion.accepts(request);
     }
 
     private boolean clientSideVerifiable() {
@@ -210,11 +211,10 @@ public abstract class AbstractDropHandler implements DropHandler {
     }
 
     public void handleDragRequest(DragRequest event) {
-        boolean acceptTransferrable = acceptTransferrable(event
-                .getTransferrable());
+        boolean acceptTransferrable = acceptTransferrable(event);
         if (acceptTransferrable) {
             if (event.getType() == DragEventType.DROP) {
-                receive(event.getTransferrable());
+                receive(event.getTransferable(), event.getEventDetails());
             } else {
                 event.setResponseParameter("accepted", true);
             }
@@ -237,7 +237,7 @@ public abstract class AbstractDropHandler implements DropHandler {
      * 
      * @see com.vaadin.event.DropHandler#receive(com.vaadin.event.Transferable)
      */
-    public abstract void receive(Transferable transferable);
+    public abstract void receive(Transferable transferable, Object dropDetails);
 
     public void setAcceptCriterion(AcceptCriterion acceptCriterion) {
         this.acceptCriterion = acceptCriterion;
index b1bd2a631697cb17eb70768be9da1273940c7fae..c9a918aa23e0771f47af8676ae8a66c541fccb8b 100644 (file)
@@ -10,13 +10,14 @@ public class DragRequest {
     private DragEventType dragEventType;
     private Transferable transferable;
     private Map<String, Object> responseData;
+    private Object eventDetails;
 
     public DragRequest(DragEventType dragEventType, Transferable transferable) {
         this.dragEventType = dragEventType;
         this.transferable = transferable;
     }
 
-    public Transferable getTransferrable() {
+    public Transferable getTransferable() {
         return transferable;
     }
 
@@ -43,4 +44,12 @@ public class DragRequest {
         responseData.put(key, value);
     }
 
+    public void setEventDetails(Object eventDetails) {
+        this.eventDetails = eventDetails;
+    }
+
+    public Object getEventDetails() {
+        return eventDetails;
+    }
+
 }
index 73ce74c392cfea1fdcda35d459c60b35ada7bf34..8326e5ff3773d480788a66f4b04de2b4ca6c9b4b 100644 (file)
@@ -1,13 +1,27 @@
 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
+ * 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<String, Object> rawVariables);
 }
\ No newline at end of file
diff --git a/src/com/vaadin/terminal/DragSource.java b/src/com/vaadin/terminal/DragSource.java
new file mode 100644 (file)
index 0000000..ee4006e
--- /dev/null
@@ -0,0 +1,30 @@
+package com.vaadin.terminal;
+
+import java.util.Map;
+
+import com.vaadin.event.Transferable;
+
+public interface DragSource {
+
+    /**
+     * DragSource may convert client side variables to meaningful values on
+     * server side. For example in Selects we convert item identifiers to
+     * generated string keys for the client side. Translators in Selects should
+     * convert them back to item identifiers.
+     * <p>
+     * Translator should remove variables it handled from rawVariables. All non
+     * handled variables are added to Transferable automatically by terminal.
+     * 
+     * <p>
+     * 
+     * @param transferable
+     *            the Transferable object if one has been created for this drag
+     *            and drop operation, null if Transferable is not yet
+     *            instantiated
+     * @param rawVariables
+     * @return
+     */
+    public Transferable getTransferrable(Transferable transferable,
+            Map<String, Object> rawVariables);
+
+}
diff --git a/src/com/vaadin/terminal/TransferTranslator.java b/src/com/vaadin/terminal/TransferTranslator.java
deleted file mode 100644 (file)
index 01d56a7..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.vaadin.terminal;
-
-import java.util.Map;
-
-import com.vaadin.event.Transferable;
-
-public interface TransferTranslator {
-
-    /**
-     * Translate translators may convert client side variables to meaningful
-     * values on server side. For example in Selects we convert item identifiers
-     * to generated string keys for the client side. Translators in Selects
-     * should convert them back to item identifiers.
-     * <p>
-     * Translator should remove variables it handled from rawVariables. All non
-     * handled variables are added to Transferable automatically by terminal.
-     * 
-     * @param transferable
-     *            the Transferable object if one has been created for this drag
-     *            and drop operation, null if Transferable is not yet
-     *            instantiated
-     * @param rawVariables
-     * @return
-     */
-    public Transferable getTransferrable(Transferable transferable,
-            Map<String, Object> rawVariables, boolean isDropTarget);
-
-}
index 6bdfa7a9bba595d26acc58f91ea721f711ec4c19..3504b8d258194525274c36bef073c665ae287574 100644 (file)
@@ -1,5 +1,7 @@
 package com.vaadin.terminal.gwt.client.ui;
 
+import java.util.Map;
+
 import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.dom.client.EventTarget;
 import com.google.gwt.event.dom.client.MouseDownEvent;
@@ -47,7 +49,7 @@ public class VDragDropPane extends VAbsoluteLayout implements Container,
                 cloneNode.getStyle().setBackgroundColor("#999");
                 cloneNode.getStyle().setOpacity(0.4);
                 drag.setDragImage(cloneNode);
-                drag.getTransferrable().setData(
+                drag.getEventDetails().put(
                         "mouseDown",
                         new MouseEventDetails(event.getNativeEvent())
                                 .serialize());
@@ -206,7 +208,7 @@ public class VDragDropPane extends VAbsoluteLayout implements Container,
                         return false;
                     }
 
-                    Transferable transferable = drag.getTransferrable();
+                    Map<String, Object> transferable = drag.getEventDetails();
 
                     // this is absolute layout based, and we may want to set
                     // component
@@ -216,8 +218,8 @@ public class VDragDropPane extends VAbsoluteLayout implements Container,
                     int absoluteLeft = getAbsoluteLeft();
                     int absoluteTop = getAbsoluteTop();
 
-                    transferable.setData("absoluteLeft", absoluteLeft);
-                    transferable.setData("absoluteTop", absoluteTop);
+                    transferable.put("absoluteLeft", absoluteLeft);
+                    transferable.put("absoluteTop", absoluteTop);
 
                     getStyleElement().getStyle().setBackgroundColor("yellow");
                     return super.drop(drag);
index a680835126eff16aff9b308b2207106c5adbc9a8..08419ec45b07adbdfffd3b1603e6a043eedc0f17 100644 (file)
@@ -41,6 +41,7 @@ import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.ui.VScrollTable.VScrollTableBody.VScrollTableRow;
 import com.vaadin.terminal.gwt.client.ui.dd.DragAndDropManager;
+import com.vaadin.terminal.gwt.client.ui.dd.DragEvent;
 import com.vaadin.terminal.gwt.client.ui.dd.Transferable;
 
 /**
@@ -2503,9 +2504,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler {
                                 transferable.setItemId("" + rowKey);
 
                                 // TODO propertyId
-                                com.vaadin.terminal.gwt.client.ui.dd.DragEvent ev = DragAndDropManager
-                                        .get().startDrag(transferable, event,
-                                                true);
+                                DragEvent ev = DragAndDropManager.get()
+                                        .startDrag(transferable, event, true);
                                 Element cloneNode = (Element) getElement()
                                         .cloneNode(true);
                                 cloneNode.getStyle().setOpacity(0.4);
index f3fa28c6565be99717224b0518ae634b62cc154c..948e6705c12ebd3c3a5605e51e17bbaff0497123 100644 (file)
@@ -162,7 +162,7 @@ public class VTree extends FlowPanel implements Paintable, HasDropHandler {
     }
 
     private void updateTreeRelatedTransferData(DragEvent drag) {
-        drag.getTransferrable().setData("itemIdOver", currentMouseOverKey);
+        drag.getEventDetails().put("itemIdOver", currentMouseOverKey);
 
         if (currentMouseOverKey != null) {
             String detail = getDropDetail(drag.getCurrentGwtEvent());
@@ -171,9 +171,8 @@ public class VTree extends FlowPanel implements Paintable, HasDropHandler {
                     && "Center".equals(detail)) {
                 overTreeNode = true;
             }
-            drag.getTransferrable().setData("itemIdOverIsNode", overTreeNode);
-
-            drag.getTransferrable().setData("detail", detail);
+            drag.getEventDetails().put("itemIdOverIsNode", overTreeNode);
+            drag.getEventDetails().put("detail", detail);
 
         }
     }
@@ -194,10 +193,10 @@ public class VTree extends FlowPanel implements Paintable, HasDropHandler {
 
                 @Override
                 public void dragOver(final DragEvent currentDrag) {
-                    final Object oldIdOver = currentDrag.getTransferrable()
-                            .getData("itemIdOver");
+                    final Object oldIdOver = currentDrag.getEventDetails().get(
+                            "itemIdOver");
                     final String oldDetail = (String) currentDrag
-                            .getTransferrable().getData("detail");
+                            .getEventDetails().get("detail");
                     /*
                      * Using deferred command, so event bubbles to TreeNode
                      * event listener. Currently here via preview
@@ -209,7 +208,7 @@ public class VTree extends FlowPanel implements Paintable, HasDropHandler {
                             boolean nodeHasChanged = (currentMouseOverKey != null && currentMouseOverKey != oldIdOver)
                                     || (oldIdOver != null);
                             boolean detailHasChanded = !detail
-                                    .equals(oldIdOver);
+                                    .equals(oldDetail);
 
                             if (nodeHasChanged || detailHasChanded) {
                                 ApplicationConnection.getConsole().log(
@@ -236,8 +235,7 @@ public class VTree extends FlowPanel implements Paintable, HasDropHandler {
                                             DragEventType.OVER, accpectedCb);
 
                                 } else {
-                                    if (validates(currentDrag
-                                            .getTransferrable())) {
+                                    if (validates(currentDrag)) {
                                         accpectedCb.handleResponse(null);
                                     } else {
                                         keyToNode.get(currentMouseOverKey)
index db656829faca7d6c4a8bd74bd9c5ee749c98bfbc..0319655b75392c0bcf1c40905355312dc3cebc2e 100644 (file)
@@ -58,7 +58,7 @@ public abstract class AbstractDropHandler implements DropHandler {
                             }
                         }
                     });
-        } else if (validates(drag.getTransferrable())) {
+        } else if (validates(drag)) {
             dragAccepted(drag);
         }
     }
@@ -68,17 +68,17 @@ public abstract class AbstractDropHandler implements DropHandler {
     /**
      * Returns true if client side rules are met.
      * 
-     * @param transferable
+     * @param drag
      * @return
      */
-    protected boolean validates(Transferable transferable) {
+    protected boolean validates(DragEvent drag) {
         if (criterioUIDL != null) {
             String criteriaName = criterioUIDL.getStringAttribute("name");
             AcceptCriteria acceptCriteria = AcceptCriterion.get(criteriaName);
             if (acceptCriteria != null) {
                 // ApplicationConnection.getConsole().log(
                 // "Criteria : " + acceptCriteria.getClass().getName());
-                return acceptCriteria.accept(transferable, criterioUIDL);
+                return acceptCriteria.accept(drag, criterioUIDL);
             }
         }
         return false;
@@ -88,7 +88,7 @@ public abstract class AbstractDropHandler implements DropHandler {
         if (serverValidate) {
             return true;
         } else {
-            return validates(drag.getTransferrable());
+            return validates(drag);
         }
     }
 
index 34f9f6dc6680283becc06ffb9b51a16bd14f9582..8a1081fff3434351839b09222f62fa141f77948d 100644 (file)
@@ -4,6 +4,6 @@ import com.vaadin.terminal.gwt.client.UIDL;
 
 public interface AcceptCriteria {
 
-    public boolean accept(Transferable transferable, UIDL configuration);
+    public boolean accept(DragEvent drag, UIDL configuration);
 
 }
index 5444cfb7e6eec6562ac5f8aa79759e46252936b9..e0e170bc1972097e9a039d9b184f10d2bb9bc754 100644 (file)
@@ -10,9 +10,9 @@ import com.vaadin.terminal.gwt.client.UIDL;
 public class AcceptCriterionImpl {
 
     private final class OverTreeNode implements AcceptCriteria {
-        public boolean accept(Transferable transferable, UIDL configuration) {
-            Boolean containsKey = (Boolean) transferable
-                    .getData("itemIdOverIsNode");
+        public boolean accept(DragEvent drag, UIDL configuration) {
+            Boolean containsKey = (Boolean) drag.getEventDetails().get(
+                    "itemIdOverIsNode");
             if (containsKey != null && containsKey.booleanValue()) {
                 return true;
             }
@@ -21,11 +21,9 @@ public class AcceptCriterionImpl {
     }
 
     private final class ComponentCriteria implements AcceptCriteria {
-        public boolean accept(Transferable transferable, UIDL configuration) {
+        public boolean accept(DragEvent drag, UIDL configuration) {
             try {
-                // FIXME should have access to client too, change transferrable
-                // to DragEvent??
-                Paintable component = transferable.getComponent();
+                Paintable component = drag.getTransferrable().getComponent();
                 String requiredPid = configuration
                         .getStringAttribute("component");
                 String pid = ((Widget) component).getElement()
@@ -38,7 +36,7 @@ public class AcceptCriterionImpl {
     }
 
     private final class And implements AcceptCriteria {
-        public boolean accept(Transferable transferable, UIDL configuration) {
+        public boolean accept(DragEvent drag, UIDL configuration) {
             UIDL childUIDL = configuration.getChildUIDL(0);
             UIDL childUIDL2 = configuration.getChildUIDL(1);
             AcceptCriteria acceptCriteria = AcceptCriterion.get(childUIDL
@@ -50,21 +48,21 @@ public class AcceptCriterionImpl {
                         "And criteria didn't found a chidl criteria");
                 return false;
             }
-            boolean accept = acceptCriteria.accept(transferable, childUIDL);
-            boolean accept2 = acceptCriteria2.accept(transferable, childUIDL2);
+            boolean accept = acceptCriteria.accept(drag, childUIDL);
+            boolean accept2 = acceptCriteria2.accept(drag, childUIDL2);
             return accept && accept2;
         }
     }
 
     private final class AcceptAll implements AcceptCriteria {
-        public boolean accept(Transferable transferable, UIDL configuration) {
+        public boolean accept(DragEvent drag, UIDL configuration) {
             return true;
         }
     }
 
     private final class HasItemId implements AcceptCriteria {
-        public boolean accept(Transferable transferable, UIDL configuration) {
-            return transferable.getItemId() != null;
+        public boolean accept(DragEvent drag, UIDL configuration) {
+            return drag.getTransferrable().getItemId() != null;
         }
     }
 
index 8dc17e0f7853ff56dc64592cb1bc2190a15080e9..b97cad5da5522c4713c0b26e227add5ec0efb226 100644 (file)
@@ -345,19 +345,21 @@ public class DragAndDropManager {
             try {
                 MouseEventDetails mouseEventDetails = new MouseEventDetails(
                         currentDrag.currentGwtEvent);
-                transferable.setData("mouseEvent", mouseEventDetails
-                        .serialize());
+                currentDrag.getEventDetails().put("mouseEvent",
+                        mouseEventDetails.serialize());
             } catch (Exception e) {
                 // NOP, (at least oophm on Safari) can't serialize html dd event
                 // to
                 // mouseevent
             }
         } else {
-            transferable.setData("mouseEvent", null);
+            currentDrag.getEventDetails().put("mouseEvent", null);
         }
+        client.updateVariable(DD_SERVICE, "evt", currentDrag.getEventDetails(),
+                false);
 
-        client.updateVariable(DD_SERVICE, "payload", transferable
-                .getVariableMap(), true);
+        client.updateVariable(DD_SERVICE, "tra", transferable.getVariableMap(),
+                true);
 
     }
 
index abed4679ee2a050c46a0a9943be1116e522c4b01..a64a29925c055059a690a559963102b09ab9d302 100644 (file)
@@ -1,6 +1,8 @@
 package com.vaadin.terminal.gwt.client.ui.dd;
 
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.user.client.Element;
@@ -25,6 +27,8 @@ public class DragEvent {
 
     private Date start;
 
+    private HashMap<String, Object> dropDetails = new HashMap<String, Object>();
+
     DragEvent(Transferable t, NativeEvent startEvent) {
         transferable = t;
         this.startEvent = startEvent;
@@ -63,4 +67,15 @@ public class DragEvent {
         DragAndDropManager.get().setDragElement(node);
     }
 
+    /**
+     * TODO consider using similar smaller (than map) api as in Transferable
+     * 
+     * TODO clean up when drop handler changes
+     * 
+     * @return
+     */
+    public Map<String, Object> getEventDetails() {
+        return dropDetails;
+    }
+
 }
index 52ea08fe7e1ac20b1e9af662fbb5051dda300542..dc0244ae24dc7ea11b5d8040df762ec5ee4a2b47 100644 (file)
@@ -4,7 +4,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
-import com.vaadin.terminal.TransferTranslator;
+import com.vaadin.terminal.DragSource;
 import com.vaadin.terminal.gwt.client.Paintable;
 
 /**
@@ -32,7 +32,7 @@ public class Transferable {
      * This is commonly actually a key to property id on client side than the
      * actual propertyId.
      * 
-     * Translated by terminal and {@link TransferTranslator}
+     * Translated by terminal and {@link DragSource}
      * 
      * @return the propertyId
      */
@@ -44,7 +44,7 @@ public class Transferable {
      * This is commonly actually a key to property id on client side than the
      * actual propertyId.
      * 
-     * Translated by terminal and {@link TransferTranslator}
+     * Translated by terminal and {@link DragSource}
      * 
      * @param propertyId
      *            the propertyId to set
@@ -64,7 +64,7 @@ public class Transferable {
      * This is commonly actually a key to item id on client side than the actual
      * itemId.
      * 
-     * Translated by terminal and {@link TransferTranslator}
+     * Translated by terminal and {@link DragSource}
      * 
      * @param itemId
      *            the itemId to set
index 3371c741aed199805b1c818eb6eaa15017d900bd..64df92ed48ceebe5560bd5dbf9cff3fa73c1fe3e 100644 (file)
@@ -10,7 +10,7 @@ import com.vaadin.event.DragRequest;
 import com.vaadin.event.DropHandler;
 import com.vaadin.event.HasDropHandler;
 import com.vaadin.event.Transferable;
-import com.vaadin.terminal.TransferTranslator;
+import com.vaadin.terminal.DragSource;
 import com.vaadin.terminal.VariableOwner;
 import com.vaadin.terminal.gwt.client.ui.dd.DragAndDropManager.DragEventType;
 import com.vaadin.ui.Component;
@@ -38,6 +38,12 @@ public class DragAndDropService implements VariableOwner {
         currentRequest = constructDragRequest(variables, dropHandlerOwner);
 
         DropHandler dropHandler = (dropHandlerOwner).getDropHandler();
+
+        Object eventDetails = dropHandlerOwner
+                .getDragEventDetails((Map<String, Object>) variables.get("evt"));
+
+        currentRequest.setEventDetails(eventDetails);
+
         dropHandler.handleDragRequest(currentRequest);
         if (currentRequest.getType() == DragEventType.DROP) {
             // TODO transferable should also be cleaned on each non-dnd
@@ -70,10 +76,13 @@ public class DragAndDropService implements VariableOwner {
 
         final Component sourceComponent = (Component) variables
                 .get("component");
+
+        variables = (Map<String, Object>) variables.get("tra");
+
         if (sourceComponent != null
-                && sourceComponent instanceof TransferTranslator) {
-            transferable = ((TransferTranslator) sourceComponent)
-                    .getTransferrable(transferable, variables, false);
+                && sourceComponent instanceof DragSource) {
+            transferable = ((DragSource) sourceComponent)
+                    .getTransferrable(transferable, variables);
         } else {
             if (transferable == null) {
                 if (sourceComponent != null) {
@@ -118,19 +127,10 @@ public class DragAndDropService implements VariableOwner {
                 }
             }
         }
-        /*
-         * Also let dropHandler translate variables if it implements
-         * TransferTranslator
-         */
-        if (dropHandlerOwner instanceof TransferTranslator) {
-            transferable = ((TransferTranslator) dropHandlerOwner)
-                    .getTransferrable(transferable, variables, true);
-        }
 
         /*
          * Add remaining (non-handled) variables to transferable as is
          */
-        variables = (Map<String, Object>) variables.get("payload");
         for (String key : variables.keySet()) {
             transferable.setData(key, variables.get(key));
         }
index 293ea8a6aef987b0b88d4fe940bdc68201425cb2..41119553354303e509cdb88e7d2fe39d45ea68bd 100644 (file)
@@ -1,5 +1,7 @@
 package com.vaadin.ui;
 
+import java.util.Map;
+
 import com.vaadin.event.AbstractDropHandler;
 import com.vaadin.event.ComponentTransferrable;
 import com.vaadin.event.DataBindedTransferrable;
@@ -43,7 +45,10 @@ public class DragDropPane extends AbsoluteLayout implements HasDropHandler {
         if (dropHandler == null) {
             dropHandler = new AbstractDropHandler() {
                 @Override
-                public void receive(Transferable transferable) {
+                public void receive(Transferable transferable,
+                        Object dropDetails) {
+
+                    DragEventDetails ed = (DragEventDetails) dropDetails;
                     if (transferable instanceof ComponentTransferrable) {
                         ComponentTransferrable ctr = (ComponentTransferrable) transferable;
                         Component component = ctr.getSourceComponent();
@@ -68,14 +73,11 @@ public class DragDropPane extends AbsoluteLayout implements HasDropHandler {
                                 // this
                                 DragDropPane.this.addComponent(component);
                             }
-                            Integer left = (Integer) transferable
-                                    .getData("absoluteLeft");
-                            Integer top = (Integer) transferable
-                                    .getData("absoluteTop");
 
-                            MouseEventDetails eventDetails = MouseEventDetails
-                                    .deSerialize((String) transferable
-                                            .getData("mouseEvent"));
+                            Integer left = ed.getAbsoluteLeft();
+                            Integer top = ed.getAbsoluteTop();
+
+                            MouseEventDetails eventDetails = ed.getMouseEvent();
 
                             int clientX = eventDetails.getClientX();
                             int clientY = eventDetails.getClientY();
@@ -91,12 +93,8 @@ public class DragDropPane extends AbsoluteLayout implements HasDropHandler {
                         } else {
                             // drag ended inside the this Pane
 
-                            MouseEventDetails start = MouseEventDetails
-                                    .deSerialize((String) transferable
-                                            .getData("mouseDown"));
-                            MouseEventDetails eventDetails = MouseEventDetails
-                                    .deSerialize((String) transferable
-                                            .getData("mouseEvent"));
+                            MouseEventDetails start = ed.getMouseDownEvent();
+                            MouseEventDetails eventDetails = ed.getMouseEvent();
 
                             int deltaX = eventDetails.getClientX()
                                     - start.getClientX();
@@ -161,4 +159,36 @@ public class DragDropPane extends AbsoluteLayout implements HasDropHandler {
         return abstractDropHandler;
     }
 
+    class DragEventDetails {
+
+        private Map<String, Object> vars;
+
+        public DragEventDetails(Map<String, Object> rawVariables) {
+            vars = rawVariables;
+        }
+
+        public Integer getAbsoluteTop() {
+            return (Integer) vars.get("absoluteTop");
+        }
+
+        public Integer getAbsoluteLeft() {
+            return (Integer) vars.get("absoluteLeft");
+        }
+
+        public MouseEventDetails getMouseDownEvent() {
+            return MouseEventDetails
+                    .deSerialize((String) vars.get("mouseDown"));
+        }
+
+        public MouseEventDetails getMouseEvent() {
+            return MouseEventDetails.deSerialize((String) vars
+                    .get("mouseEvent"));
+        }
+
+    }
+
+    public Object getDragEventDetails(Map<String, Object> rawVariables) {
+        return new DragEventDetails(rawVariables);
+    }
+
 }
index 5b99f614f1f4d39b1d54e921e35eaee991c0d193..8babc68e1a0b2b95a4a85e58e2968ee03428d5e3 100644 (file)
@@ -33,7 +33,7 @@ import com.vaadin.terminal.KeyMapper;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
-import com.vaadin.terminal.TransferTranslator;
+import com.vaadin.terminal.DragSource;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.VScrollTable;
 
@@ -58,7 +58,7 @@ import com.vaadin.terminal.gwt.client.ui.VScrollTable;
 @ClientWidget(VScrollTable.class)
 public class Table extends AbstractSelect implements Action.Container,
         Container.Ordered, Container.Sortable, ItemClickSource,
-        TransferTranslator {
+        DragSource {
 
     /**
      * Modes that Table support as drag sourse.
@@ -3352,25 +3352,21 @@ public class Table extends AbstractSelect implements Action.Container,
 
     }
 
-    private void updateTransferrable(Map<String, Object> rawVariables,
-            Transferable tr, boolean isDropTarget) {
-        Map<String, Object> payload = (Map<String, Object>) rawVariables
-                .get("payload");
-        if (!isDropTarget) {
-            Object object = payload.get("itemId");
-            if (object != null) {
-                tr.setData("itemId", itemIdMapper.get((String) object));
-                payload.remove("itemId");
-            }
+    private void updateTransferrable(Map<String, Object> payload,
+            Transferable tr) {
+        Object object = payload.get("itemId");
+        if (object != null) {
+            tr.setData("itemId", itemIdMapper.get((String) object));
+            payload.remove("itemId");
         }
     }
 
     public Transferable getTransferrable(Transferable transferable,
-            Map<String, Object> rawVariables, boolean isDropTarget) {
+            Map<String, Object> rawVariables) {
         if (transferable == null) {
             transferable = new TableTransferrable();
         }
-        updateTransferrable(rawVariables, transferable, isDropTarget);
+        updateTransferrable(rawVariables, transferable);
         return transferable;
     }
 }
index 8e5cd8aca7203d9343023db0aa37a17335a8f6ba..61c667cde0d711acd493bee42e4c8e11651b3f25 100644 (file)
@@ -31,11 +31,11 @@ import com.vaadin.event.ItemClickEvent;
 import com.vaadin.event.Transferable;
 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.TransferTranslator;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.VTree;
 
@@ -51,7 +51,7 @@ import com.vaadin.terminal.gwt.client.ui.VTree;
 @SuppressWarnings("serial")
 @ClientWidget(VTree.class)
 public class Tree extends AbstractSelect implements Container.Hierarchical,
-        Action.Container, ItemClickSource, TransferTranslator, HasDropHandler {
+        Action.Container, ItemClickSource, DragSource, HasDropHandler {
 
     private static final Method EXPAND_METHOD;
 
@@ -145,27 +145,16 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
     }
 
     public Transferable getTransferrable(Transferable transferable,
-            Map<String, Object> rawVariables, boolean isDropTarget) {
+            Map<String, Object> payload) {
         if (transferable == null) {
             transferable = new TreeTransferrable();
         }
-        Map<String, Object> payload = (Map<String, Object>) rawVariables
-                .get("payload");
-        if (isDropTarget) {
-            // updating drag target variables
-            Object object = payload.get("itemIdOver");
-            Object object2 = itemIdMapper.get((String) object);
-            transferable.setData("itemIdOver", object2);
-            payload.remove("itemIdOver");
-        } else {
-            // updating drag source variables
-            Object object = payload.get("itemId");
-            if (object != null) {
-                transferable.setData("itemId", itemIdMapper
-                        .get((String) object));
-            }
-            payload.remove("itemId");
+        // updating drag source variables
+        Object object = payload.get("itemId");
+        if (object != null) {
+            transferable.setData("itemId", itemIdMapper.get((String) object));
         }
+        payload.remove("itemId");
 
         return transferable;
     }
@@ -1162,4 +1151,43 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
         this.abstractDropHandler = abstractDropHandler;
     }
 
+    public Object getDragEventDetails(Map<String, Object> rawVariables) {
+        return new TreeDropDetails(rawVariables);
+    }
+
+    public enum Location {
+        TOP, BOTTOM, MIDDLE
+    }
+
+    public class TreeDropDetails {
+
+        private Map<String, Object> vars;
+        private Object idOver;
+
+        TreeDropDetails(Map<String, Object> rawVariables) {
+            vars = rawVariables;
+            // eagar fetch itemid, mapper may be emptied
+            String keyover = (String) vars.get("itemIdOver");
+            if (keyover != null) {
+                idOver = itemIdMapper.get(keyover);
+            }
+        }
+
+        public Object getItemIdOver() {
+            return idOver;
+        }
+
+        public Location getDropLocation() {
+            String s = (String) vars.get("detail");
+            if ("Top".equals(s)) {
+                return Location.TOP;
+            } else if ("Bottom".equals(s)) {
+                return Location.BOTTOM;
+            } else {
+                return Location.MIDDLE;
+            }
+        }
+
+    }
+
 }
index 3b3a9c13a07afeca3c00fb8f5b7cfe36b8f856f7..28bc8b53c86c7d5671e2f9a54bf5b58d26e431ff 100644 (file)
@@ -1,6 +1,7 @@
 package com.vaadin.tests.dd;
 
 import com.vaadin.event.ComponentTransferrable;
+import com.vaadin.event.DragRequest;
 import com.vaadin.event.Transferable;
 import com.vaadin.event.AbstractDropHandler.AcceptCriterion;
 import com.vaadin.ui.DragDropPane;
@@ -15,7 +16,8 @@ public class AcceptFromComponent extends Window {
         DragDropPane pane = new DragDropPane();
         setContent(pane);
         pane.getDropHandler().setAcceptCriterion(new AcceptCriterion() {
-            public boolean accepts(Transferable transferable) {
+            public boolean accepts(DragRequest request) {
+                Transferable transferable = request.getTransferable();
                 if (transferable instanceof ComponentTransferrable) {
                     ComponentTransferrable componentTransferrable = (ComponentTransferrable) transferable;
                     if (componentTransferrable.getSourceComponent() == tree1) {
index 01490cd2482dce6e6b8d445166c00451ad1adc53..53c18fdfc863991b2a9acbca72240f4369f8bb9b 100644 (file)
@@ -1,5 +1,7 @@
 package com.vaadin.tests.dd;
 
+import java.util.Map;
+
 import com.vaadin.event.AbstractDropHandler;
 import com.vaadin.event.DragRequest;
 import com.vaadin.event.DropHandler;
@@ -41,9 +43,9 @@ public class CustomDDImplementation extends CustomComponent {
 
         public DropHandler getDropHandler() {
             return new DropHandler() {
-                public void handleDragRequest(DragRequest event) {
-                    Transferable transferable = event.getTransferrable();
-                    DragEventType type = event.getType();
+                public void handleDragRequest(DragRequest dragRequest) {
+                    Transferable transferable = dragRequest.getTransferable();
+                    DragEventType type = dragRequest.getType();
                     switch (type) {
                     case DROP:
                         // Do something with data
@@ -53,7 +55,7 @@ public class CustomDDImplementation extends CustomComponent {
                     case ENTER:
                         // eg. validate transferrable
                         if (transferable.getDataFlawors().contains("Foo")) {
-                            event.getResponseData().put("valueFor",
+                            dragRequest.getResponseData().put("valueFor",
                                     "clientSideCallBack");
                         }
 
@@ -72,6 +74,15 @@ public class CustomDDImplementation extends CustomComponent {
             };
         }
 
+        public Object getDragEventDetails(Map<String, Object> 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;
+        }
+
     }
 
     /**
index 9fee73da0c9802e8db527c806f9a48fdc525c688..0dcf7aaf7f970be59146d6dfca29e7bf7a65c37b 100644 (file)
@@ -7,6 +7,7 @@ import com.vaadin.data.util.HierarchicalContainer;
 import com.vaadin.event.AbstractDropHandler;
 import com.vaadin.event.ComponentTransferrable;
 import com.vaadin.event.DataBindedTransferrable;
+import com.vaadin.event.DragRequest;
 import com.vaadin.event.Transferable;
 import com.vaadin.event.AbstractDropHandler.AcceptCriterion;
 import com.vaadin.terminal.ExternalResource;
@@ -20,6 +21,8 @@ import com.vaadin.ui.Link;
 import com.vaadin.ui.Table;
 import com.vaadin.ui.Tree;
 import com.vaadin.ui.Table.DragModes;
+import com.vaadin.ui.Tree.Location;
+import com.vaadin.ui.Tree.TreeDropDetails;
 
 /**
  * DD playground. Better quality example/prototype codes in {@link DDTest2}.
@@ -57,7 +60,8 @@ public class DDTest1 extends TestBase {
                 .setCaption("Pane2 (accept needs server side visit, only \"Bar\")");
 
         AcceptCriterion f = new AcceptCriterion() {
-            public boolean accepts(Transferable transferable) {
+            public boolean accepts(DragRequest request) {
+                Transferable transferable = request.getTransferable();
                 // System.out.println("Simulating 500ms processing...");
                 // try {
                 // Thread.sleep(200);
@@ -112,22 +116,22 @@ public class DDTest1 extends TestBase {
         AbstractDropHandler itemSorter = new AbstractDropHandler() {
 
             @Override
-            public void receive(Transferable transferable) {
+            public void receive(Transferable transferable, Object dropdetails) {
+                TreeDropDetails details = (TreeDropDetails) dropdetails;
                 // TODO set properties, so same sorter could be used in Table
                 if (transferable instanceof DataBindedTransferrable) {
                     DataBindedTransferrable transferrable2 = (DataBindedTransferrable) transferable;
 
                     Object itemId = transferrable2.getItemId();
 
-                    Object itemIdOver = transferable.getData("itemIdOver");
+                    Object itemIdOver = details.getItemIdOver();
 
-                    String detail = ((String) transferable.getData("detail"))
-                            .toLowerCase();
+                    Location dropLocation = details.getDropLocation();
 
-                    if ("center".equals(detail)) {
+                    if (dropLocation == Location.MIDDLE) {
                         t.setParent(itemId, itemIdOver);
                         return;
-                    } else if ("top".equals(detail)) {
+                    } else if (Location.TOP == dropLocation) {
                         // if on top of the caption area, add before
                         itemIdOver = idx.prevItemId(itemIdOver);
                     }
@@ -142,7 +146,7 @@ public class DDTest1 extends TestBase {
 
                     if (removed) {
 
-                        if (detail == null) {
+                        if (dropLocation == null) {
                             System.err
                                     .println("No detail of drop place available");
                         }
index 6777eade4daa4010f06651c489a266f11fa8af7f..04162045f71cacdfc7bd3507a60c294ff354ddc9 100644 (file)
@@ -18,6 +18,7 @@ import com.vaadin.ui.HorizontalLayout;
 import com.vaadin.ui.Table;
 import com.vaadin.ui.Tree;
 import com.vaadin.ui.Window;
+import com.vaadin.ui.Tree.TreeDropDetails;
 
 public class DDTest2 extends TestBase {
 
@@ -53,7 +54,7 @@ public class DDTest2 extends TestBase {
 
         AbstractDropHandler dropHandler = new AbstractDropHandler() {
             @Override
-            public void receive(Transferable transferable) {
+            public void receive(Transferable transferable, Object dropdetails) {
                 /*
                  * We know transferrable is from table, so it is of type
                  * DataBindedTransferrable
@@ -63,14 +64,16 @@ public class DDTest2 extends TestBase {
                 Table fromTable = (Table) tr.getSourceComponent();
                 String name = fromTable.getItem(itemId).getItemProperty("Name")
                         .toString();
+
                 tree1.addItem(name);
                 tree1.setChildrenAllowed(name, false);
 
                 /*
-                 * As we also accept only drops on folders, we know data
-                 * contains itemIdOver
+                 * As we also accept only drops on folders, we know dropDetails
+                 * is from Tree and it contains itemIdOver.
                  */
-                Object idOver = tr.getData("itemIdOver");
+                TreeDropDetails details = (TreeDropDetails) dropdetails;
+                Object idOver = details.getItemIdOver();
                 tree1.setParent(name, idOver);
 
                 /*
@@ -99,12 +102,14 @@ public class DDTest2 extends TestBase {
 
         dropHandler = new AbstractDropHandler() {
             @Override
-            public void receive(Transferable transferable) {
+            public void receive(Transferable transferable, Object dropdetails) {
+                TreeDropDetails details = (TreeDropDetails) dropdetails;
+
                 if (transferable instanceof DataBindedTransferrable) {
                     DataBindedTransferrable tr = (DataBindedTransferrable) transferable;
 
                     Object itemId = tree2.addItem();
-                    tree2.setParent(itemId, tr.getData("itemIdOver"));
+                    tree2.setParent(itemId, details.getItemIdOver());
                     if (tr.getSourceComponent() == tree1) {
                         // use item id from tree1 as caption
                         tree2.setItemCaption(itemId, (String) tr.getItemId());