]> source.dussan.org Git - vaadin-framework.git/commitdiff
wrapper enhancements + rules
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 17 Feb 2010 16:33:11 +0000 (16:33 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 17 Feb 2010 16:33:11 +0000 (16:33 +0000)
svn changeset:11363/svn branch:6.3_dd

14 files changed:
src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java [new file with mode: 0644]
src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java [new file with mode: 0644]
src/com/vaadin/event/dd/acceptCriteria/Not.java
src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/VCustomComponent.java
src/com/vaadin/terminal/gwt/client/ui/VDragAndDropWrapper.java
src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java
src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/customcomponent/ClipContent.java [new file with mode: 0644]
tests/src/com/vaadin/tests/dd/HorizontalLayoutSortableWithWrappers.java [new file with mode: 0644]
tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java [new file with mode: 0644]
tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java [deleted file]

diff --git a/src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java b/src/com/vaadin/event/dd/acceptCriteria/ContainsDataFlawor.java
new file mode 100644 (file)
index 0000000..536de5e
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * 
+ */
+package com.vaadin.event.dd.acceptCriteria;
+
+import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.terminal.PaintException;
+import com.vaadin.terminal.PaintTarget;
+import com.vaadin.terminal.gwt.client.ui.dd.VContainsDataFlawor;
+
+@ClientCriterion(VContainsDataFlawor.class)
+public final class ContainsDataFlawor extends ClientSideCriterion {
+
+    private String dataFlaworId;
+
+    /**
+     * TODO should support basic UIDL data types
+     * 
+     * @param dataFlawor
+     * @param value
+     */
+    public ContainsDataFlawor(String dataFlawor) {
+        dataFlaworId = dataFlawor;
+    }
+
+    @Override
+    public void paintContent(PaintTarget target) throws PaintException {
+        super.paintContent(target);
+        target.addAttribute("p", dataFlaworId);
+    }
+
+    public boolean accepts(DragAndDropEvent dragEvent) {
+        return dragEvent.getTransferable().getDataFlawors().contains(
+                dataFlaworId);
+    }
+}
\ No newline at end of file
diff --git a/src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java b/src/com/vaadin/event/dd/acceptCriteria/DropDetailEquals.java
new file mode 100644 (file)
index 0000000..a7852a6
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * 
+ */
+package com.vaadin.event.dd.acceptCriteria;
+
+import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.terminal.PaintException;
+import com.vaadin.terminal.PaintTarget;
+import com.vaadin.terminal.gwt.client.ui.dd.VDropDetailEquals;
+
+@ClientCriterion(VDropDetailEquals.class)
+public final class DropDetailEquals extends ClientSideCriterion {
+
+    private String propertyName;
+    private String value;
+
+    /**
+     * TODO should support basic UIDL data types
+     * 
+     * @param propertyName
+     * @param value
+     */
+    public DropDetailEquals(String propertyName, String value) {
+        this.propertyName = propertyName;
+        this.value = value;
+    }
+
+    @Override
+    public void paintContent(PaintTarget target) throws PaintException {
+        super.paintContent(target);
+        target.addAttribute("p", propertyName);
+        target.addAttribute("v", value);
+    }
+
+    public boolean accepts(DragAndDropEvent dragEvent) {
+        Object data = dragEvent.getDropTargetData().getData(propertyName);
+        return value.equals(data);
+    }
+}
\ No newline at end of file
index d11df81d55849dbc56ee533865e36e744e6bad04..72c1f5e629d908f2a6de2b14156c32ca45a82473 100644 (file)
@@ -4,6 +4,8 @@
 package com.vaadin.event.dd.acceptCriteria;
 
 import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.terminal.PaintException;
+import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.gwt.client.ui.dd.VNot;
 
 @ClientCriterion(VNot.class)
@@ -15,6 +17,12 @@ public class Not extends ClientSideCriterion {
         this.acceptCriterion = acceptCriterion;
     }
 
+    @Override
+    public void paintContent(PaintTarget target) throws PaintException {
+        super.paintContent(target);
+        acceptCriterion.paint(target);
+    }
+
     public boolean accepts(DragAndDropEvent dragEvent) {
         return !acceptCriterion.accepts(dragEvent);
     }
diff --git a/src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java b/src/com/vaadin/event/dd/acceptCriteria/SourceIsSameAsTarget.java
new file mode 100644 (file)
index 0000000..a0a0afe
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * 
+ */
+package com.vaadin.event.dd.acceptCriteria;
+
+import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.event.dd.DropTarget;
+import com.vaadin.terminal.gwt.client.ui.dd.VSourceIsSameAsTarget;
+import com.vaadin.ui.Component;
+
+@ClientCriterion(VSourceIsSameAsTarget.class)
+public class SourceIsSameAsTarget extends ClientSideCriterion {
+
+    public boolean accepts(DragAndDropEvent dragEvent) {
+        if (dragEvent.getTransferable() instanceof ComponentTransferable) {
+            Component sourceComponent = ((ComponentTransferable) dragEvent
+                    .getTransferable()).getSourceComponent();
+            DropTarget target = dragEvent.getDropTargetData().getTarget();
+            return sourceComponent == target;
+        }
+
+        return false;
+    }
+
+}
\ No newline at end of file
index dc3cd6b2e3a8dbb644765bafa41707143595d731..9cd6cc27a68024e547e1cda8560d69d8a3b66c57 100644 (file)
@@ -93,11 +93,11 @@ public class VCustomComponent extends SimplePanel implements Container {
         return updated;
     }
 
-    private boolean isDynamicWidth() {
+    protected boolean isDynamicWidth() {
         return width == null || width.equals("");
     }
 
-    private boolean isDynamicHeight() {
+    protected boolean isDynamicHeight() {
         return height == null || height.equals("");
     }
 
@@ -138,7 +138,7 @@ public class VCustomComponent extends SimplePanel implements Container {
         if (!height.equals(this.height)) {
             this.height = height;
             if (!rendering) {
-                client.runDescendentsLayout(this);
+                client.handleComponentRelativeSize(getWidget());
             }
         }
     }
@@ -151,7 +151,7 @@ public class VCustomComponent extends SimplePanel implements Container {
         if (!width.equals(this.width)) {
             this.width = width;
             if (!rendering) {
-                client.runDescendentsLayout(this);
+                client.handleComponentRelativeSize(getWidget());
             }
         }
     }
index 5aab1fa9550f10f582e17ab72d2c50c97c317b18..70072a8066586fcd8e0e7bc4d7caaa80787a0c99 100644 (file)
@@ -11,7 +11,10 @@ import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.Paintable;
+import com.vaadin.terminal.gwt.client.RenderInformation;
 import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.Util;
+import com.vaadin.terminal.gwt.client.RenderInformation.Size;
 import com.vaadin.terminal.gwt.client.ui.dd.HorizontalDropLocation;
 import com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler;
 import com.vaadin.terminal.gwt.client.ui.dd.VAcceptCallback;
@@ -198,14 +201,18 @@ public class VDragAndDropWrapper extends VCustomComponent implements
         return dropHandler;
     }
 
-    private class CustomDropHandler extends VAbstractDropHandler {
+    protected VerticalDropLocation verticalDropLocation;
+    protected HorizontalDropLocation horizontalDropLocation;
+    private VerticalDropLocation emphasizedVDrop;
+    private HorizontalDropLocation emphasizedHDrop;
 
-        private static final String OVER_STYLE = "v-ddwrapper-over";
-        private VerticalDropLocation verticalDropLocation;
-        private HorizontalDropLocation horizontalDropLocation;
+    private static final String OVER_STYLE = "v-ddwrapper-over";
+
+    public class CustomDropHandler extends VAbstractDropHandler {
 
         @Override
         public void dragEnter(VDragEvent drag) {
+            updateDropDetails(drag);
             ApplicationConnection.getConsole().log("DDWrapper DragEnter");
             super.dragEnter(drag);
         }
@@ -213,11 +220,12 @@ public class VDragAndDropWrapper extends VCustomComponent implements
         @Override
         public void dragLeave(VDragEvent drag) {
             ApplicationConnection.getConsole().log("DDWrapper DragLeave");
-            deEmphasis();
+            deEmphasis(true);
         }
 
         @Override
         public void dragOver(final VDragEvent drag) {
+            updateDropDetails(drag);
             validate(new VAcceptCallback() {
                 public void accepted(VDragEvent event) {
                     dragAccepted(drag);
@@ -228,7 +236,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements
         @Override
         public boolean drop(VDragEvent drag) {
             ApplicationConnection.getConsole().log("Drop" + drag.sinceStart());
-            deEmphasis();
+            deEmphasis(true);
 
             Map<String, Object> dd = drag.getDropDetails();
 
@@ -243,22 +251,12 @@ public class VDragAndDropWrapper extends VCustomComponent implements
             dd.put("absoluteLeft", absoluteLeft);
             dd.put("absoluteTop", absoluteTop);
 
-            dd.put("verticalLocation", verticalDropLocation.toString());
-            dd.put("horizontalLocation", horizontalDropLocation.toString());
-
-            return super.drop(drag);
-        }
-
-        private void deEmphasis() {
             if (verticalDropLocation != null) {
-                VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE,
-                        false);
-                VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
-                        + verticalDropLocation.toString().toLowerCase(), false);
-                VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
-                        + horizontalDropLocation.toString().toLowerCase(),
-                        false);
+                dd.put("verticalLocation", verticalDropLocation.toString());
+                dd.put("horizontalLocation", horizontalDropLocation.toString());
             }
+
+            return super.drop(drag);
         }
 
         @Override
@@ -266,23 +264,6 @@ public class VDragAndDropWrapper extends VCustomComponent implements
             emphasis(drag);
         }
 
-        private void emphasis(VDragEvent drag) {
-            deEmphasis();
-            verticalDropLocation = VerticalDropLocation.get(getElement(), drag
-                    .getCurrentGwtEvent().getClientY(), 0.2);
-            horizontalDropLocation = HorizontalDropLocation.get(getElement(),
-                    drag.getCurrentGwtEvent().getClientX(), 0.2);
-            VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE, true);
-            VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
-                    + verticalDropLocation.toString().toLowerCase(), true);
-            VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
-                    + horizontalDropLocation.toString().toLowerCase(), true);
-
-            // TODO build (to be an example) an emphasis mode where drag image
-            // is fitted before or after the content
-
-        }
-
         @Override
         public Paintable getPaintable() {
             return VDragAndDropWrapper.this;
@@ -341,4 +322,61 @@ public class VDragAndDropWrapper extends VCustomComponent implements
         
     }-*/;
 
+    public void updateDropDetails(VDragEvent drag) {
+        verticalDropLocation = VerticalDropLocation.get(getElement(), drag
+                .getCurrentGwtEvent().getClientY(), 0.2);
+        drag.getDropDetails().put("verticalLocation",
+                verticalDropLocation.toString());
+        horizontalDropLocation = HorizontalDropLocation.get(getElement(), drag
+                .getCurrentGwtEvent().getClientX(), 0.2);
+        drag.getDropDetails().put("horizontalLocation",
+                horizontalDropLocation.toString());
+    }
+
+    protected void deEmphasis(boolean doLayout) {
+        Size size = null;
+        if (doLayout) {
+            size = new RenderInformation.Size(getOffsetWidth(),
+                    getOffsetHeight());
+        }
+        if (emphasizedVDrop != null) {
+            VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE, false);
+            VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
+                    + emphasizedVDrop.toString().toLowerCase(), false);
+            VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
+                    + emphasizedHDrop.toString().toLowerCase(), false);
+        }
+        if (doLayout) {
+            handleVaadinRelatedSizeChange(size);
+        }
+    }
+
+    protected void emphasis(VDragEvent drag) {
+        Size size = new RenderInformation.Size(getOffsetWidth(),
+                getOffsetHeight());
+        deEmphasis(false);
+        VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE, true);
+        VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
+                + verticalDropLocation.toString().toLowerCase(), true);
+        VDragAndDropWrapper.setStyleName(getElement(), OVER_STYLE + "-"
+                + horizontalDropLocation.toString().toLowerCase(), true);
+        emphasizedVDrop = verticalDropLocation;
+        emphasizedHDrop = horizontalDropLocation;
+
+        // TODO build (to be an example) an emphasis mode where drag image
+        // is fitted before or after the content
+        handleVaadinRelatedSizeChange(size);
+
+    }
+
+    protected void handleVaadinRelatedSizeChange(Size originalSize) {
+        if (isDynamicHeight() || isDynamicWidth()) {
+            if (!originalSize.equals(new RenderInformation.Size(
+                    getOffsetWidth(), getOffsetHeight()))) {
+                Util.notifyParentOfSizeChange(VDragAndDropWrapper.this, false);
+            }
+        }
+        client.handleComponentRelativeSize(VDragAndDropWrapper.this);
+    }
+
 }
diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VContainsDataFlawor.java
new file mode 100644 (file)
index 0000000..51f4bf8
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * 
+ */
+package com.vaadin.terminal.gwt.client.ui.dd;
+
+import com.vaadin.terminal.gwt.client.UIDL;
+
+final public class VContainsDataFlawor implements VAcceptCriteria {
+    public void accept(VDragEvent drag, UIDL configuration,
+            VAcceptCallback callback) {
+        String name = configuration.getStringAttribute("p");
+        boolean contains = drag.getTransferable().getDataFlawors().contains(
+                name);
+        if (contains) {
+            callback.accepted(drag);
+        }
+    }
+
+    public boolean needsServerSideCheck(VDragEvent drag, UIDL criterioUIDL) {
+        return false;
+    }
+}
\ No newline at end of file
index e499f929b8999db3d2bc17c11a61e40826ac628b..8c7617537ab69aa7efd374f8b04be7d0f10b4154 100644 (file)
@@ -84,6 +84,7 @@ public class VDragAndDropManager {
                                 // dragleave on old
                                 if (currentDropHandler != null) {
                                     currentDropHandler.dragLeave(currentDrag);
+                                    currentDrag.getDropDetails().clear();
                                     serverCallback = null;
                                 }
                                 // dragenter on new
@@ -138,6 +139,7 @@ public class VDragAndDropManager {
                 if (target != null && target != currentDropHandler) {
                     if (currentDropHandler != null) {
                         currentDropHandler.dragLeave(currentDrag);
+                        currentDrag.getDropDetails().clear();
                     }
 
                     currentDropHandler = target;
@@ -148,6 +150,7 @@ public class VDragAndDropManager {
                 } else if (target == null && currentDropHandler != null) {
                     ApplicationConnection.getConsole().log("Invalid state!?");
                     currentDropHandler.dragLeave(currentDrag);
+                    currentDrag.getDropDetails().clear();
                     currentDropHandler = null;
                 }
                 break;
@@ -168,6 +171,7 @@ public class VDragAndDropManager {
                 if (currentDropHandler != null
                         && currentDropHandler != newDragHanler) {
                     currentDropHandler.dragLeave(currentDrag);
+                    currentDrag.getDropDetails().clear();
                     currentDropHandler = null;
                     serverCallback = null;
                 }
diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDropDetailEquals.java
new file mode 100644 (file)
index 0000000..ba5275d
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * 
+ */
+package com.vaadin.terminal.gwt.client.ui.dd;
+
+import com.vaadin.terminal.gwt.client.UIDL;
+
+final public class VDropDetailEquals implements VAcceptCriteria {
+    public void accept(VDragEvent drag, UIDL configuration,
+            VAcceptCallback callback) {
+        String name = configuration.getStringAttribute("p");
+        String value = configuration.getStringAttribute("v");
+        Object object = drag.getDropDetails().get(name);
+        if (value.equals(object)) {
+            callback.accepted(drag);
+        }
+    }
+
+    public boolean needsServerSideCheck(VDragEvent drag, UIDL criterioUIDL) {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VSourceIsSameAsTarget.java
new file mode 100644 (file)
index 0000000..952c159
--- /dev/null
@@ -0,0 +1,24 @@
+/**
+ * 
+ */
+package com.vaadin.terminal.gwt.client.ui.dd;
+
+import com.vaadin.terminal.gwt.client.Paintable;
+import com.vaadin.terminal.gwt.client.UIDL;
+
+final public class VSourceIsSameAsTarget implements VAcceptCriteria {
+    public void accept(VDragEvent drag, UIDL configuration,
+            VAcceptCallback callback) {
+        Paintable dragSource = drag.getTransferable().getDragSource();
+        Paintable paintable = VDragAndDropManager.get().getCurrentDropHandler()
+                .getPaintable();
+
+        if (paintable == dragSource) {
+            callback.accepted(drag);
+        }
+    }
+
+    public boolean needsServerSideCheck(VDragEvent drag, UIDL criterioUIDL) {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/tests/src/com/vaadin/tests/components/customcomponent/ClipContent.java b/tests/src/com/vaadin/tests/components/customcomponent/ClipContent.java
new file mode 100644 (file)
index 0000000..cc7320a
--- /dev/null
@@ -0,0 +1,56 @@
+package com.vaadin.tests.components.customcomponent;\r
+\r
+import com.vaadin.data.Property.ValueChangeEvent;\r
+import com.vaadin.tests.components.TestBase;\r
+import com.vaadin.ui.Button;\r
+import com.vaadin.ui.CustomComponent;\r
+import com.vaadin.ui.Label;\r
+import com.vaadin.ui.TextField;\r
+\r
+public class ClipContent extends TestBase {\r
+\r
+    @Override\r
+    protected void setup() {\r
+\r
+        Label text = new Label(\r
+                "1_long_line_that_should_be_clipped<br/>2_long_line_that_should_be_clipped<br/>3_long_line_that_should_be_clipped<br/>4_long_line_that_should_be_clipped<br/>",\r
+                Label.CONTENT_XHTML);\r
+\r
+        final CustomComponent cc = new CustomComponent(text);\r
+        cc.setWidth("20px");\r
+        cc.setHeight("20px");\r
+\r
+        final TextField w = new TextField("Width");\r
+        w.setValue("20px");\r
+        w.addListener(new TextField.ValueChangeListener() {\r
+            public void valueChange(ValueChangeEvent event) {\r
+                cc.setWidth((String) w.getValue());\r
+            }\r
+        });\r
+        addComponent(w);\r
+        final TextField h = new TextField("Height");\r
+        h.setValue("20px");\r
+        h.addListener(new TextField.ValueChangeListener() {\r
+            public void valueChange(ValueChangeEvent event) {\r
+                cc.setHeight((String) h.getValue());\r
+            }\r
+        });\r
+        addComponent(h);\r
+        Button b = new Button("apply");\r
+        addComponent(b);\r
+\r
+        addComponent(cc);\r
+\r
+    }\r
+\r
+    @Override\r
+    protected String getDescription() {\r
+        return "The text in CustomComponent should be clipped if it has size defined.";\r
+    }\r
+\r
+    @Override\r
+    protected Integer getTicketNumber() {\r
+        return null;\r
+    }\r
+\r
+}\r
diff --git a/tests/src/com/vaadin/tests/dd/HorizontalLayoutSortableWithWrappers.java b/tests/src/com/vaadin/tests/dd/HorizontalLayoutSortableWithWrappers.java
new file mode 100644 (file)
index 0000000..5caeaf4
--- /dev/null
@@ -0,0 +1,111 @@
+package com.vaadin.tests.dd;
+
+import java.util.Iterator;
+
+import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.Transferable;
+import com.vaadin.event.dd.DropEvent;
+import com.vaadin.event.dd.DropHandler;
+import com.vaadin.event.dd.DropTarget;
+import com.vaadin.event.dd.TargetDetails;
+import com.vaadin.event.dd.acceptCriteria.AcceptCriterion;
+import com.vaadin.event.dd.acceptCriteria.And;
+import com.vaadin.event.dd.acceptCriteria.DropDetailEquals;
+import com.vaadin.event.dd.acceptCriteria.Not;
+import com.vaadin.event.dd.acceptCriteria.SourceIsSameAsTarget;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.DragAndDropWrapper;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Window;
+
+/**
+ * Same as with css layout but tests size change propagation on emphasis +
+ * rules.
+ * 
+ * 
+ */
+public class HorizontalLayoutSortableWithWrappers extends Window {
+
+    static int count;
+
+    private HorizontalLayout layout = new HorizontalLayout();
+
+    class WrappedLabel extends DragAndDropWrapper {
+
+        private static final long serialVersionUID = 1L;
+
+        public WrappedLabel(String content) {
+            super(new Label(content + " c:" + ++count));
+            getCompositionRoot().setWidth("60px");
+            getCompositionRoot().setHeight("60px");
+            setSizeUndefined();
+            setDragStartMode(DragStartMode.WRAPPER);
+        }
+
+        @Override
+        public DropHandler getDropHandler() {
+            return dh;
+        }
+
+    }
+
+    private DropHandler dh = new DropHandler() {
+        AcceptCriterion crit = new And(new DropDetailEquals(
+                "horizontalLocation", "LEFT"), new Not(
+                new SourceIsSameAsTarget()));
+
+        public AcceptCriterion getAcceptCriterion() {
+            return crit;
+        }
+
+        public void drop(DropEvent dropEvent) {
+            Transferable transferable = dropEvent.getTransferable();
+            if (transferable instanceof ComponentTransferable) {
+                ComponentTransferable ct = (ComponentTransferable) transferable;
+                Component sourceComponent = ct.getSourceComponent();
+                if (sourceComponent instanceof WrappedLabel) {
+                    int index = 1;
+                    Iterator<Component> componentIterator = layout
+                            .getComponentIterator();
+                    Component next = componentIterator.next();
+                    TargetDetails dropTargetData = dropEvent
+                            .getDropTargetData();
+                    DropTarget target = dropTargetData.getTarget();
+                    while (next != target) {
+                        if (next != sourceComponent) {
+                            index++;
+                        }
+                        next = componentIterator.next();
+                    }
+                    if (dropTargetData.getData("horizontalLocation").equals(
+                            "LEFT")) {
+                        index--;
+                        if (index < 0) {
+                            index = 0;
+                        }
+                    }
+
+                    layout.removeComponent(sourceComponent);
+                    layout.addComponent(sourceComponent, index);
+                }
+            }
+            // TODO Auto-generated method stub
+
+        }
+    };
+
+    public HorizontalLayoutSortableWithWrappers() {
+        setCaption("Horizontally sortable layout via (ddwrappers):Try sorting blocks by draggin them");
+        DragAndDropWrapper pane = new DragAndDropWrapper(layout);
+        setContent(pane);
+        pane.setSizeFull();
+        setWidth("400px");
+        setHeight("100px");
+
+        for (int i = 0; i < 4; i++) {
+            layout.addComponent(new WrappedLabel("Block"));
+        }
+
+    }
+}
diff --git a/tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java b/tests/src/com/vaadin/tests/dd/HorizontalSortableCssLayoutWithWrappers.java
new file mode 100644 (file)
index 0000000..8673ffb
--- /dev/null
@@ -0,0 +1,104 @@
+package com.vaadin.tests.dd;
+
+import java.util.Iterator;
+
+import com.vaadin.event.ComponentTransferable;
+import com.vaadin.event.Transferable;
+import com.vaadin.event.dd.DropEvent;
+import com.vaadin.event.dd.DropHandler;
+import com.vaadin.event.dd.DropTarget;
+import com.vaadin.event.dd.TargetDetails;
+import com.vaadin.event.dd.acceptCriteria.AcceptAll;
+import com.vaadin.event.dd.acceptCriteria.AcceptCriterion;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.DragAndDropWrapper;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Window;
+
+public class HorizontalSortableCssLayoutWithWrappers extends Window {
+
+    static int count;
+
+    private CssLayout cssLayout = new CssLayout() {
+        @Override
+        protected String getCss(Component c) {
+            return "float:left; width:60px;height:60px;background: yellow;padding:2px;";
+        };
+    };
+
+    class WrappedLabel extends DragAndDropWrapper {
+
+        private static final long serialVersionUID = 1L;
+
+        public WrappedLabel(String content) {
+            super(new Label(content + " c:" + ++count));
+            setSizeUndefined(); // via css
+            setHeight("60px"); // FIXME custom component seems to be broken:
+            // can't set height with css only
+            setDragStartMode(DragStartMode.WRAPPER);
+        }
+
+        @Override
+        public DropHandler getDropHandler() {
+            return dh;
+        }
+
+    }
+
+    private DropHandler dh = new DropHandler() {
+
+        public AcceptCriterion getAcceptCriterion() {
+            return AcceptAll.get();
+        }
+
+        public void drop(DropEvent dropEvent) {
+            Transferable transferable = dropEvent.getTransferable();
+            if (transferable instanceof ComponentTransferable) {
+                ComponentTransferable ct = (ComponentTransferable) transferable;
+                Component sourceComponent = ct.getSourceComponent();
+                if (sourceComponent instanceof WrappedLabel) {
+                    int index = 1;
+                    Iterator<Component> componentIterator = cssLayout
+                            .getComponentIterator();
+                    Component next = componentIterator.next();
+                    TargetDetails dropTargetData = dropEvent
+                            .getDropTargetData();
+                    DropTarget target = dropTargetData.getTarget();
+                    while (next != target) {
+                        if (next != sourceComponent) {
+                            index++;
+                        }
+                        next = componentIterator.next();
+                    }
+                    if (dropTargetData.getData("horizontalLocation").equals(
+                            "LEFT")) {
+                        index--;
+                        if (index < 0) {
+                            index = 0;
+                        }
+                    }
+
+                    cssLayout.removeComponent(sourceComponent);
+                    cssLayout.addComponent(sourceComponent, index);
+                }
+            }
+            // TODO Auto-generated method stub
+
+        }
+    };
+
+    public HorizontalSortableCssLayoutWithWrappers() {
+        setCaption("Horizontally sortable csslayout via (ddwrappers):Try sorting blocks by draggin them");
+        DragAndDropWrapper pane = new DragAndDropWrapper(cssLayout);
+        setContent(pane);
+        pane.setSizeFull();
+        setWidth("400px");
+        setHeight("100px");
+
+        for (int i = 0; i < 4; i++) {
+            cssLayout.addComponent(new WrappedLabel("Block"));
+        }
+
+    }
+}
diff --git a/tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java b/tests/src/com/vaadin/tests/dd/VerticalSortableCssLayoutWithWrappers.java
deleted file mode 100644 (file)
index ac27755..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.vaadin.tests.dd;
-
-import java.util.Iterator;
-
-import com.vaadin.event.ComponentTransferable;
-import com.vaadin.event.Transferable;
-import com.vaadin.event.dd.DropEvent;
-import com.vaadin.event.dd.DropHandler;
-import com.vaadin.event.dd.DropTarget;
-import com.vaadin.event.dd.TargetDetails;
-import com.vaadin.event.dd.acceptCriteria.AcceptAll;
-import com.vaadin.event.dd.acceptCriteria.AcceptCriterion;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CssLayout;
-import com.vaadin.ui.DragAndDropWrapper;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.Window;
-
-public class VerticalSortableCssLayoutWithWrappers extends Window {
-
-    static int count;
-
-    private CssLayout cssLayout = new CssLayout() {
-        @Override
-        protected String getCss(Component c) {
-            return "float:left; width:60px;height:60px;background: yellow;padding:2px;";
-        };
-    };
-
-    class WrappedLabel extends DragAndDropWrapper {
-
-        private static final long serialVersionUID = 1L;
-
-        public WrappedLabel(String content) {
-            super(new Label(content + " c:" + ++count));
-            setSizeUndefined(); // via css
-            setHeight("60px"); // FIXME custom component seems to be broken:
-                               // can't set height with css only
-            setDragStartMode(DragStartMode.WRAPPER);
-        }
-
-        @Override
-        public DropHandler getDropHandler() {
-            return dh;
-        }
-
-    }
-
-    private DropHandler dh = new DropHandler() {
-
-        public AcceptCriterion getAcceptCriterion() {
-            return AcceptAll.get();
-        }
-
-        public void drop(DropEvent dropEvent) {
-            Transferable transferable = dropEvent.getTransferable();
-            if (transferable instanceof ComponentTransferable) {
-                ComponentTransferable ct = (ComponentTransferable) transferable;
-                Component sourceComponent = ct.getSourceComponent();
-                if (sourceComponent instanceof WrappedLabel) {
-                    int index = 1;
-                    Iterator<Component> componentIterator = cssLayout
-                            .getComponentIterator();
-                    Component next = componentIterator.next();
-                    TargetDetails dropTargetData = dropEvent
-                            .getDropTargetData();
-                    DropTarget target = dropTargetData.getTarget();
-                    while (next != target) {
-                        if (next != sourceComponent) {
-                            index++;
-                        }
-                        next = componentIterator.next();
-                    }
-                    if (dropTargetData.getData("horizontalLocation").equals(
-                            "LEFT")) {
-                        index--;
-                        if (index < 0) {
-                            index = 0;
-                        }
-                    }
-
-                    cssLayout.removeComponent(sourceComponent);
-                    cssLayout.addComponent(sourceComponent, index);
-                }
-            }
-            // TODO Auto-generated method stub
-
-        }
-    };
-
-    public VerticalSortableCssLayoutWithWrappers() {
-        setCaption("Horizontally sortable csslayout via (ddwrappers):Try sorting block by draggin them");
-        DragAndDropWrapper pane = new DragAndDropWrapper(cssLayout);
-        setContent(pane);
-        pane.setSizeFull();
-        setWidth("400px");
-        setHeight("100px");
-
-        for (int i = 0; i < 4; i++) {
-            cssLayout.addComponent(new WrappedLabel("Block"));
-        }
-
-    }
-}