]> source.dussan.org Git - vaadin-framework.git/commitdiff
new criteria + enhancements
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 18 Feb 2010 11:44:57 +0000 (11:44 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 18 Feb 2010 11:44:57 +0000 (11:44 +0000)
svn changeset:11376/svn branch:6.3_dd

src/com/vaadin/terminal/gwt/client/ui/dd/VIdentifierIs.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.java [new file with mode: 0644]
src/com/vaadin/ui/AbstractSelect.java
src/com/vaadin/ui/Table.java
src/com/vaadin/ui/Tree.java
tests/src/com/vaadin/tests/dd/DDTest1.java
tests/src/com/vaadin/tests/dd/DDTest2.java
tests/src/com/vaadin/tests/dd/DDTest4.java
tests/src/com/vaadin/tests/dd/DDTest5.java

diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VIdentifierIs.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VIdentifierIs.java
new file mode 100644 (file)
index 0000000..ebe8a3e
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package com.vaadin.terminal.gwt.client.ui.dd;
+
+import java.util.Set;
+
+import com.vaadin.terminal.gwt.client.UIDL;
+
+final public class VIdentifierIs implements VAcceptCriteria {
+    public void accept(VDragEvent drag, UIDL configuration,
+            VAcceptCallback callback) {
+        try {
+            Object data = drag.getTransferable().getData("itemId");
+            Set<String> stringArrayVariableAsSet = configuration
+                    .getStringArrayVariableAsSet("keys");
+            if (stringArrayVariableAsSet.contains(data)) {
+                callback.accepted(drag);
+            }
+        } catch (Exception e) {
+        }
+        return;
+    }
+
+    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/VIsOverId.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.java
new file mode 100644 (file)
index 0000000..87b0930
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package com.vaadin.terminal.gwt.client.ui.dd;
+
+import java.util.Set;
+
+import com.vaadin.terminal.gwt.client.UIDL;
+
+final public class VIsOverId implements VAcceptCriteria {
+    public void accept(VDragEvent drag, UIDL configuration,
+            VAcceptCallback callback) {
+        try {
+            Set<String> stringArrayVariableAsSet = configuration
+                    .getStringArrayVariableAsSet("keys");
+            if (stringArrayVariableAsSet.contains(drag.getDropDetails().get(
+                    "itemIdOver"))) {
+                callback.accepted(drag);
+            }
+        } catch (Exception e) {
+        }
+        return;
+    }
+
+    public boolean needsServerSideCheck(VDragEvent drag, UIDL criterioUIDL) {
+        return false;
+    }
+}
\ No newline at end of file
index 088bd5bd0b3ee43b0ef6a708416f27514e0ee654..cdaf2715e28e52e7f033c8cbe72744bfbe20cac0 100644 (file)
@@ -19,10 +19,19 @@ import com.vaadin.data.Container;
 import com.vaadin.data.Item;
 import com.vaadin.data.Property;
 import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.event.DataBoundTransferable;
+import com.vaadin.event.Transferable;
+import com.vaadin.event.dd.DragAndDropEvent;
+import com.vaadin.event.dd.TargetDetailsImpl;
+import com.vaadin.event.dd.acceptCriteria.ClientCriterion;
+import com.vaadin.event.dd.acceptCriteria.ClientSideCriterion;
 import com.vaadin.terminal.KeyMapper;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
+import com.vaadin.terminal.gwt.client.ui.dd.VIdentifierIs;
+import com.vaadin.terminal.gwt.client.ui.dd.VIsOverId;
+import com.vaadin.ui.Tree.Location;
 
 /**
  * <p>
@@ -1681,4 +1690,100 @@ public abstract class AbstractSelect extends AbstractField implements
 
     }
 
+    /**
+     * Criterion for selects that support drop (Tree and Table). With this
+     * criterion drop is accepted on given identifier or set of identifiers.
+     */
+    @ClientCriterion(VIsOverId.class)
+    public static class IsOverId extends AbstractItemSetCriterion {
+
+        public IsOverId(AbstractSelect select, Object... itemId) {
+            super(select, itemId);
+        }
+
+        public boolean accepts(DragAndDropEvent dragEvent) {
+            AbstractSelectDropDetails dropTargetData = (AbstractSelectDropDetails) dragEvent
+                    .getDropTargetData();
+            return itemIds.contains(dropTargetData.getItemIdOver());
+        }
+
+    }
+
+    private static abstract class AbstractItemSetCriterion extends
+            ClientSideCriterion {
+        protected final Collection<Object> itemIds = new HashSet<Object>();
+        private AbstractSelect select;
+
+        public AbstractItemSetCriterion(AbstractSelect select, Object... itemId) {
+            if (itemIds == null || select == null) {
+                throw new IllegalArgumentException(
+                        "Accepted item identifiers must be accepted.");
+            }
+            Collections.addAll(itemIds, itemId);
+            this.select = select;
+        }
+
+        @Override
+        public void paintContent(PaintTarget target) throws PaintException {
+            super.paintContent(target);
+            String[] keys = new String[itemIds.size()];
+            int i = 0;
+            for (Object itemId : itemIds) {
+                String key = select.itemIdMapper.key(itemId);
+                keys[i++] = key;
+            }
+            target.addVariable(select, "keys", keys);
+        }
+
+    }
+
+    /**
+     * Criterion for selects that support drop (Tree and Table). With this
+     * criterion drop is accepted only if {@link Transferable} (from this
+     * {@link AbstractSelect}) contains given item identifier or identifiers.
+     */
+    @ClientCriterion(VIdentifierIs.class)
+    public static class IdentifierIs extends AbstractItemSetCriterion {
+        public IdentifierIs(AbstractSelect select, Object... itemId) {
+            super(select, itemId);
+        }
+
+        public boolean accepts(DragAndDropEvent dragEvent) {
+            DataBoundTransferable transferable = (DataBoundTransferable) dragEvent
+                    .getTransferable();
+            return itemIds.contains(transferable.getItemId());
+        }
+
+    }
+
+    public class AbstractSelectDropDetails extends TargetDetailsImpl {
+
+        private Object idOver;
+
+        AbstractSelectDropDetails(Map<String, Object> rawVariables) {
+            super(rawVariables);
+            // eagar fetch itemid, mapper may be emptied
+            String keyover = (String) getData("itemIdOver");
+            if (keyover != null) {
+                idOver = itemIdMapper.get(keyover);
+            }
+        }
+
+        public Object getItemIdOver() {
+            return idOver;
+        }
+
+        public Location getDropLocation() {
+            String s = (String) getData("detail");
+            if ("TOP".equals(s)) {
+                return Location.TOP;
+            } else if ("BOTTOM".equals(s)) {
+                return Location.BOTTOM;
+            } else {
+                return Location.MIDDLE;
+            }
+        }
+
+    }
+
 }
index fe28c1fed9941e51cae12bdbb69adb3a9ed16ca4..f6e01025d3757bc3eabd8d1da57b3f7704b096c5 100644 (file)
@@ -32,15 +32,12 @@ import com.vaadin.event.ItemClickEvent.ItemClickSource;
 import com.vaadin.event.dd.DragSource;
 import com.vaadin.event.dd.DropHandler;
 import com.vaadin.event.dd.DropTarget;
-import com.vaadin.event.dd.TargetDetails;
-import com.vaadin.event.dd.TargetDetailsImpl;
 import com.vaadin.terminal.KeyMapper;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.VScrollTable;
-import com.vaadin.ui.Tree.Location;
 
 /**
  * <p>
@@ -3388,45 +3385,8 @@ public class Table extends AbstractSelect implements Action.Container,
         this.dropHandler = dropHandler;
     }
 
-    /*
-     * TODO add propertyId
-     */
-    public class TableTargetDetails extends TargetDetailsImpl {
-        private Object idOver;
-
-        public TableTargetDetails(Map<String, Object> rawDropData) {
-            super(rawDropData);
-            // eagar fetch itemid, mapper may be emptied
-            String keyover = (String) getData("itemIdOver");
-            if (keyover != null) {
-                idOver = itemIdMapper.get(keyover);
-            }
-        }
-
-        public Object getItemIdOver() {
-            return idOver;
-        }
-
-        public Location getDropLocation() {
-            String s = (String) getData("detail");
-            if ("TOP".equals(s)) {
-                return Location.TOP;
-            } else if ("BOTTOM".equals(s)) {
-                return Location.BOTTOM;
-            } else {
-                return Location.MIDDLE;
-            }
-        }
-
-        @Override
-        public Table getTarget() {
-            return (Table) super.getTarget();
-        }
-
-    }
-
-    public TargetDetails translateDragDropDetails(
+    public AbstractSelectDropDetails translateDragDropDetails(
             Map<String, Object> clientVariables) {
-        return new TableTargetDetails(clientVariables);
+        return new AbstractSelectDropDetails(clientVariables);
     }
 }
index c4a1bff12d5057db22b368f74c71522529f19bfa..02b486046f64801a69b3ad04ca27cce332f2650b 100644 (file)
@@ -32,7 +32,6 @@ import com.vaadin.event.dd.DragAndDropEvent;
 import com.vaadin.event.dd.DragSource;
 import com.vaadin.event.dd.DropHandler;
 import com.vaadin.event.dd.DropTarget;
-import com.vaadin.event.dd.TargetDetailsImpl;
 import com.vaadin.event.dd.acceptCriteria.ClientCriterion;
 import com.vaadin.event.dd.acceptCriteria.ServerSideCriterion;
 import com.vaadin.terminal.KeyMapper;
@@ -1162,32 +1161,10 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
         TOP, BOTTOM, MIDDLE;
     }
 
-    public class TreeDropDetails extends TargetDetailsImpl {
-
-        private Object idOver;
+    public class TreeDropDetails extends AbstractSelectDropDetails {
 
         TreeDropDetails(Map<String, Object> rawVariables) {
             super(rawVariables);
-            // eagar fetch itemid, mapper may be emptied
-            String keyover = (String) getData("itemIdOver");
-            if (keyover != null) {
-                idOver = itemIdMapper.get(keyover);
-            }
-        }
-
-        public Object getItemIdOver() {
-            return idOver;
-        }
-
-        public Location getDropLocation() {
-            String s = (String) getData("detail");
-            if ("TOP".equals(s)) {
-                return Location.TOP;
-            } else if ("BOTTOM".equals(s)) {
-                return Location.BOTTOM;
-            } else {
-                return Location.MIDDLE;
-            }
         }
 
         @Override
@@ -1247,7 +1224,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
          * .event.dd.DragAndDropEvent)
          */
         public boolean accepts(DragAndDropEvent dragEvent) {
-            TreeDropDetails dropTargetData = (TreeDropDetails) dragEvent
+            AbstractSelectDropDetails dropTargetData = (AbstractSelectDropDetails) dragEvent
                     .getDropTargetData();
             tree = (Tree) dragEvent.getDropTargetData().getTarget();
             allowedItemIds = getAllowedItemIds(dragEvent, tree);
index 0fad439afed9bad62b73457923f42ab3fdffd23c..18d028601215cb8b93d26da29e74d1ec92777929 100644 (file)
@@ -23,9 +23,9 @@ import com.vaadin.ui.Layout;
 import com.vaadin.ui.Link;
 import com.vaadin.ui.Table;
 import com.vaadin.ui.Tree;
+import com.vaadin.ui.AbstractSelect.AbstractSelectDropDetails;
 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}.
@@ -188,7 +188,7 @@ public class DDTest1 extends TestBase {
             }
 
             public void drop(DropEvent event) {
-                TreeDropDetails details = (TreeDropDetails) event
+                AbstractSelectDropDetails details = (AbstractSelectDropDetails) event
                         .getDropTargetData();
                 // TODO set properties, so same sorter could be used in Table
                 Transferable transferable = event.getTransferable();
index d099b1d39adeeefdbe27980b5658aefae3fd41ad..ff0ed0d4bad3fda7dd8c5c5ef20acb59edfd9c48 100644 (file)
@@ -23,11 +23,12 @@ import com.vaadin.event.dd.acceptCriteria.OverTreeNode;
 import com.vaadin.terminal.Resource;
 import com.vaadin.terminal.ThemeResource;
 import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.AbstractSelect;
 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;
+import com.vaadin.ui.AbstractSelect.AbstractSelectDropDetails;
 
 public class DDTest2 extends TestBase {
 
@@ -88,7 +89,7 @@ public class DDTest2 extends TestBase {
                     data = "-no Text data flawor-";
                 }
                 tree3.addItem(data);
-                TreeDropDetails dropTargetData = (TreeDropDetails) dropEvent
+                AbstractSelect.AbstractSelectDropDetails dropTargetData = (AbstractSelect.AbstractSelectDropDetails) dropEvent
                         .getDropTargetData();
                 tree3.setParent(data, dropTargetData.getItemIdOver());
 
@@ -147,7 +148,7 @@ public class DDTest2 extends TestBase {
                  * As we also accept only drops on folders, we know dropDetails
                  * is from Tree and it contains itemIdOver.
                  */
-                TreeDropDetails details = (TreeDropDetails) event
+                AbstractSelectDropDetails details = (AbstractSelectDropDetails) event
                         .getDropTargetData();
                 Object idOver = details.getItemIdOver();
                 tree1.setParent(itemId, idOver);
@@ -172,7 +173,7 @@ public class DDTest2 extends TestBase {
 
         dropHandler = new DropHandler() {
             public void drop(DropEvent event) {
-                TreeDropDetails details = (TreeDropDetails) event
+                AbstractSelectDropDetails details = (AbstractSelectDropDetails) event
                         .getDropTargetData();
                 Transferable transferable = event.getTransferable();
 
index fd922c9f4ea442b799c410be2fe92d28b17e370a..84e49cf19225791849903a7b0b9ed6f658f97694 100644 (file)
@@ -15,7 +15,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.Table.TableTargetDetails;
+import com.vaadin.ui.AbstractSelect.AbstractSelectDropDetails;
 import com.vaadin.ui.Tree.Location;
 
 public class DDTest4 extends TestBase {
@@ -57,7 +57,7 @@ public class DDTest4 extends TestBase {
             }
 
             public void drop(DropEvent dropEvent) {
-                Table.TableTargetDetails dropTargetData = (TableTargetDetails) dropEvent
+                AbstractSelectDropDetails dropTargetData = (AbstractSelectDropDetails) dropEvent
                         .getDropTargetData();
                 DataBoundTransferable transferable = (DataBoundTransferable) dropEvent
                         .getTransferable();
index 52cccb6a05c7a51c40c4e4ffc50fab38fcae2667..7c7ffa3ba327efcb45ff05d956fc22bd720f6098 100644 (file)
@@ -50,7 +50,7 @@ public class DDTest5 extends TestBase {
     protected void setup() {
         Window w = getLayout().getWindow();
 
-        VerticalSortableCssLayoutWithWrappers verticalSortableCssLayoutWithWrappers = new VerticalSortableCssLayoutWithWrappers();
+        HorizontalSortableCssLayoutWithWrappers verticalSortableCssLayoutWithWrappers = new HorizontalSortableCssLayoutWithWrappers();
         w.addWindow(verticalSortableCssLayoutWithWrappers);
         verticalSortableCssLayoutWithWrappers.setPositionX(200);
         verticalSortableCssLayoutWithWrappers.setPositionY(40); /*