diff options
author | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-02-12 11:40:21 +0000 |
---|---|---|
committer | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-02-12 11:40:21 +0000 |
commit | b361498f510e144419b19bf3865f39895b07f1d2 (patch) | |
tree | 8333305362dd2d4658741a44ef129efd299e0a67 /src/com/vaadin/ui/Tree.java | |
parent | ac88783e91f6d4a40280d5c345fd4bd83ed4051d (diff) | |
download | vaadin-framework-b361498f510e144419b19bf3865f39895b07f1d2.tar.gz vaadin-framework-b361498f510e144419b19bf3865f39895b07f1d2.zip |
n:th proto
svn changeset:11292/svn branch:6.3_dd
Diffstat (limited to 'src/com/vaadin/ui/Tree.java')
-rw-r--r-- | src/com/vaadin/ui/Tree.java | 105 |
1 files changed, 92 insertions, 13 deletions
diff --git a/src/com/vaadin/ui/Tree.java b/src/com/vaadin/ui/Tree.java index 566d8ed4ea..c235405b36 100644 --- a/src/com/vaadin/ui/Tree.java +++ b/src/com/vaadin/ui/Tree.java @@ -22,18 +22,18 @@ import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.data.util.ContainerHierarchicalWrapper; import com.vaadin.data.util.IndexedContainer; -import com.vaadin.event.AbstractDropHandler; import com.vaadin.event.Action; import com.vaadin.event.DataBindedTransferable; -import com.vaadin.event.DragDropDataTranslator; -import com.vaadin.event.DragDropDetailsImpl; -import com.vaadin.event.DropHandler; -import com.vaadin.event.DropTarget; 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.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.ServerSideCriterion; import com.vaadin.terminal.KeyMapper; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; @@ -53,8 +53,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, DragSource, DropTarget, - DragDropDataTranslator { + Action.Container, ItemClickSource, DragSource, DropTarget { private static final Method EXPAND_METHOD; @@ -135,6 +134,9 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, } public Object getData(String dataFlawor) { + if (dataFlawor.equals("Text")) { + return getItemCaption(getItemId()); + } return data.get(dataFlawor); } @@ -644,8 +646,8 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, // New items target.addVariable(this, "newitem", new String[] {}); - if (dropHandler instanceof AbstractDropHandler) { - ((AbstractDropHandler) dropHandler).paint(target); + if (dropHandler != null) { + dropHandler.getAcceptCriterion().paint(target); } } @@ -1158,14 +1160,14 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, TOP, BOTTOM, MIDDLE } - public class TreeDropDetails extends DragDropDetailsImpl { + public class TreeDropDetails extends TargetDetailsImpl { private Object idOver; TreeDropDetails(Map<String, Object> rawVariables) { super(rawVariables); // eagar fetch itemid, mapper may be emptied - String keyover = (String) get("itemIdOver"); + String keyover = (String) getData("itemIdOver"); if (keyover != null) { idOver = itemIdMapper.get(keyover); } @@ -1176,7 +1178,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, } public Location getDropLocation() { - String s = (String) get("detail"); + String s = (String) getData("detail"); if ("Top".equals(s)) { return Location.TOP; } else if ("Bottom".equals(s)) { @@ -1193,4 +1195,81 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, return new TreeDropDetails(clientVariables); } + /** + * API for {@link TreeDropCriterion} + * + * @param itemId + * @return + */ + private String key(Object itemId) { + return itemIdMapper.key(itemId); + } + + /** + * An example of lazy initializing criterion. Initially pretty much no data + * is sent to client, on first accepts set (per drag request) the client + * side data structure is initialized and no subsequent requests requests + * are needed during that drag and drop operation. + * <p> + * See client side counterpart + */ + public static abstract class TreeDropCriterion extends ServerSideCriterion { + + private Tree tree; + + private Set<Object> allowedItemIds; + + /* + * (non-Javadoc) + * + * @see + * com.vaadin.event.dd.acceptCriteria.ServerSideCriterion#getIdentifier + * () + */ + @Override + protected String getIdentifier() { + return TreeDropCriterion.class.getCanonicalName(); + } + + /* + * (non-Javadoc) + * + * @see + * com.vaadin.event.dd.acceptCriteria.AcceptCriterion#accepts(com.vaadin + * .event.dd.DragAndDropEvent) + */ + public boolean accepts(DragAndDropEvent dragEvent) { + TreeDropDetails dropTargetData = (TreeDropDetails) dragEvent + .getDropTargetData(); + tree = (Tree) dragEvent.getDropTargetData().getTarget(); + allowedItemIds = getAllowedItemIds(dragEvent, tree); + return allowedItemIds.contains(dropTargetData.getItemIdOver()); + } + + /* + * (non-Javadoc) + * + * @see + * com.vaadin.event.dd.acceptCriteria.AcceptCriterion#paintResponse( + * com.vaadin.terminal.PaintTarget) + */ + @Override + public void paintResponse(PaintTarget target) throws PaintException { + /* + * send allowed nodes to client so subsequent requests can be + * avoided + */ + Object[] array = allowedItemIds.toArray(); + for (int i = 0; i < array.length; i++) { + String key = tree.key(array[i]); + array[i] = key; + } + target.addAttribute("allowedIds", array); + } + + protected abstract Set<Object> getAllowedItemIds( + DragAndDropEvent dragEvent, Tree tree); + + } + } |