From 27feab20edab094c1f003dffc6e99dd31dbf6199 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Thu, 18 Feb 2010 11:44:57 +0000 Subject: [PATCH] new criteria + enhancements svn changeset:11376/svn branch:6.3_dd --- .../gwt/client/ui/dd/VIdentifierIs.java | 28 +++++ .../terminal/gwt/client/ui/dd/VIsOverId.java | 28 +++++ src/com/vaadin/ui/AbstractSelect.java | 105 ++++++++++++++++++ src/com/vaadin/ui/Table.java | 44 +------- src/com/vaadin/ui/Tree.java | 27 +---- tests/src/com/vaadin/tests/dd/DDTest1.java | 4 +- tests/src/com/vaadin/tests/dd/DDTest2.java | 9 +- tests/src/com/vaadin/tests/dd/DDTest4.java | 4 +- tests/src/com/vaadin/tests/dd/DDTest5.java | 2 +- 9 files changed, 175 insertions(+), 76 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/ui/dd/VIdentifierIs.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.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 index 0000000000..ebe8a3e23a --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VIdentifierIs.java @@ -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 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 index 0000000000..87b09307bf --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VIsOverId.java @@ -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 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 diff --git a/src/com/vaadin/ui/AbstractSelect.java b/src/com/vaadin/ui/AbstractSelect.java index 088bd5bd0b..cdaf2715e2 100644 --- a/src/com/vaadin/ui/AbstractSelect.java +++ b/src/com/vaadin/ui/AbstractSelect.java @@ -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; /** *

@@ -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 itemIds = new HashSet(); + 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 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; + } + } + + } + } diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index fe28c1fed9..f6e01025d3 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -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; /** *

@@ -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 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 clientVariables) { - return new TableTargetDetails(clientVariables); + return new AbstractSelectDropDetails(clientVariables); } } diff --git a/src/com/vaadin/ui/Tree.java b/src/com/vaadin/ui/Tree.java index c4a1bff12d..02b486046f 100644 --- a/src/com/vaadin/ui/Tree.java +++ b/src/com/vaadin/ui/Tree.java @@ -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 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); diff --git a/tests/src/com/vaadin/tests/dd/DDTest1.java b/tests/src/com/vaadin/tests/dd/DDTest1.java index 0fad439afe..18d0286012 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest1.java +++ b/tests/src/com/vaadin/tests/dd/DDTest1.java @@ -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(); diff --git a/tests/src/com/vaadin/tests/dd/DDTest2.java b/tests/src/com/vaadin/tests/dd/DDTest2.java index d099b1d39a..ff0ed0d4ba 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest2.java +++ b/tests/src/com/vaadin/tests/dd/DDTest2.java @@ -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(); diff --git a/tests/src/com/vaadin/tests/dd/DDTest4.java b/tests/src/com/vaadin/tests/dd/DDTest4.java index fd922c9f4e..84e49cf192 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest4.java +++ b/tests/src/com/vaadin/tests/dd/DDTest4.java @@ -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(); diff --git a/tests/src/com/vaadin/tests/dd/DDTest5.java b/tests/src/com/vaadin/tests/dd/DDTest5.java index 52cccb6a05..7c7ffa3ba3 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest5.java +++ b/tests/src/com/vaadin/tests/dd/DDTest5.java @@ -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); /* -- 2.39.5