You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DDTest2.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package com.vaadin.tests.dd;
  2. import java.util.Collection;
  3. import com.vaadin.data.Container;
  4. import com.vaadin.data.Item;
  5. import com.vaadin.data.util.HierarchicalContainer;
  6. import com.vaadin.demo.tutorial.addressbook.data.Person;
  7. import com.vaadin.demo.tutorial.addressbook.data.PersonContainer;
  8. import com.vaadin.event.DataBoundTransferable;
  9. import com.vaadin.event.Transferable;
  10. import com.vaadin.event.dd.DragAndDropEvent;
  11. import com.vaadin.event.dd.DropHandler;
  12. import com.vaadin.event.dd.acceptCriteria.AcceptCriterion;
  13. import com.vaadin.event.dd.acceptCriteria.And;
  14. import com.vaadin.event.dd.acceptCriteria.DragSourceIs;
  15. import com.vaadin.event.dd.acceptCriteria.IsDataBound;
  16. import com.vaadin.event.dd.acceptCriteria.Or;
  17. import com.vaadin.event.dd.acceptCriteria.ServerSideCriterion;
  18. import com.vaadin.terminal.Resource;
  19. import com.vaadin.terminal.ThemeResource;
  20. import com.vaadin.tests.components.TestBase;
  21. import com.vaadin.ui.AbstractSelect;
  22. import com.vaadin.ui.HorizontalLayout;
  23. import com.vaadin.ui.Table;
  24. import com.vaadin.ui.Tree;
  25. import com.vaadin.ui.Window;
  26. import com.vaadin.ui.AbstractSelect.AbstractSelectDropTargetDetails;
  27. import com.vaadin.ui.Tree.OverFolderNode;
  28. import com.vaadin.ui.Tree.TreeDragMode;
  29. import com.vaadin.ui.Tree.TreeDropTargetDetails;
  30. public class DDTest2 extends TestBase {
  31. java.util.Random r = new java.util.Random(1);
  32. HorizontalLayout hl = new HorizontalLayout();
  33. Tree tree1 = new Tree("Tree that accepts table rows to folders");
  34. Table table = new Table("Drag rows to Tree on left or right");
  35. Tree tree2 = new Tree("Accepts items, copies values");
  36. private Tree tree3;
  37. @Override
  38. protected void setup() {
  39. Window w = getLayout().getWindow();
  40. /* darn reindeer has no icons */
  41. /* Make all trees (their nodes actually) draggable */
  42. tree1.setDragMode(TreeDragMode.NODE);
  43. tree2.setDragMode(TreeDragMode.NODE);
  44. hl.addComponent(tree1);
  45. hl.addComponent(table);
  46. hl.addComponent(tree2);
  47. hl.setWidth("100%");
  48. hl.setSpacing(true);
  49. hl.setExpandRatio(table, 1);
  50. popuplateTrees();
  51. table.setWidth("100%");
  52. table.setPageLength(10);
  53. populateTable();
  54. addComponent(hl);
  55. tree3 = new Tree(
  56. "Tree with lazy loading criteria, of first server visit caches accept rules for all captions");
  57. tree3.setDragMode(TreeDragMode.NODE);
  58. tree3.addItem("Drag on me");
  59. tree3.addItem("Or me");
  60. /*
  61. * An example of lazy initializing drop criterion with component
  62. * specific api for easy rule writing.
  63. *
  64. * Example is pretty stupid (accepts drop on all nodes, but by
  65. * explicitly defining them here), but demonstrates lazy initialization
  66. * option if rules are heavy.
  67. */
  68. final AcceptCriterion crit = new ServerSideCriterion() {
  69. public boolean accepts(DragAndDropEvent dragEvent) {
  70. TreeDropTargetDetails dropTargetData = (TreeDropTargetDetails) dragEvent
  71. .getDropTargetDetails();
  72. Object itemIdOver = dropTargetData.getItemIdOver();
  73. int i = r.nextInt();
  74. if (i % 2 == 0) {
  75. return true;
  76. }
  77. return false;
  78. }
  79. };
  80. tree3.setDropHandler(new DropHandler() {
  81. public void drop(DragAndDropEvent dropEvent) {
  82. Transferable transferable = dropEvent.getTransferable();
  83. String data = (String) transferable.getData("Text");
  84. if (data == null) {
  85. data = "-no Text data flawor-";
  86. }
  87. tree3.addItem(data);
  88. AbstractSelect.AbstractSelectDropTargetDetails dropTargetData = (AbstractSelect.AbstractSelectDropTargetDetails) dropEvent
  89. .getDropTargetDetails();
  90. tree3.setParent(data, dropTargetData.getItemIdOver());
  91. }
  92. public AcceptCriterion getAcceptCriterion() {
  93. return crit;
  94. }
  95. });
  96. addComponent(tree3);
  97. /*
  98. * Make table rows draggable
  99. */
  100. table.setDragMode(Table.DragModes.ROWS);
  101. OverFolderNode onNode = new OverFolderNode();
  102. DragSourceIs fromTable = new DragSourceIs(table);
  103. DragSourceIs fromTree = new DragSourceIs(tree1);
  104. final Or fromTree1OrTable = new Or(fromTable, fromTree);
  105. // Or could in the case be replaced with, keeping here as an example and
  106. // test
  107. DragSourceIs treeOrTable = new DragSourceIs(table, tree1);
  108. final And and = new And(fromTree1OrTable, onNode);
  109. DropHandler dropHandler = new DropHandler() {
  110. public void drop(DragAndDropEvent event) {
  111. /*
  112. * We know transferrable is from table, so it is of type
  113. * DataBindedTransferrable
  114. */
  115. DataBoundTransferable tr = (DataBoundTransferable) event
  116. .getTransferable();
  117. Object itemId = tr.getItemId();
  118. Container sourceContainer = (Container) tr.getSourceComponent();
  119. if (sourceContainer != tree1) {
  120. // if the source is from table (not from tree1 itself),
  121. // transfer Name property and use it as an indentifier in
  122. // tree1
  123. String name = sourceContainer.getItem(itemId)
  124. .getItemProperty("Name").toString();
  125. tree1.addItem(name);
  126. tree1.setChildrenAllowed(name, false);
  127. /*
  128. * Remove the item from table
  129. */
  130. sourceContainer.removeItem(itemId);
  131. itemId = name;
  132. }
  133. /*
  134. * As we also accept only drops on folders, we know dropDetails
  135. * is from Tree and it contains itemIdOver.
  136. */
  137. AbstractSelectDropTargetDetails details = (AbstractSelectDropTargetDetails) event
  138. .getDropTargetDetails();
  139. Object idOver = details.getItemIdOver();
  140. tree1.setParent(itemId, idOver);
  141. }
  142. public AcceptCriterion getAcceptCriterion() {
  143. return and;
  144. }
  145. };
  146. tree1.setDropHandler(dropHandler);
  147. /*
  148. * First step done. tree1 now accepts drags only from table and only
  149. * over tree nodes aka "folders"
  150. */
  151. /*
  152. * Now set the rightmost tree accept any item drag. On drop, copy from
  153. * source. Also make drags from tree1 possible.
  154. */
  155. dropHandler = new DropHandler() {
  156. public void drop(DragAndDropEvent event) {
  157. AbstractSelectDropTargetDetails details = (AbstractSelectDropTargetDetails) event
  158. .getDropTargetDetails();
  159. Transferable transferable = event.getTransferable();
  160. if (transferable instanceof DataBoundTransferable) {
  161. DataBoundTransferable tr = (DataBoundTransferable) transferable;
  162. Object itemId = tree2.addItem();
  163. tree2.setParent(itemId, details.getItemIdOver());
  164. if (tr.getSourceComponent() == tree1) {
  165. // use item id from tree1 as caption
  166. tree2.setItemCaption(itemId, (String) tr.getItemId());
  167. // if comes from tree1, move subtree too
  168. copySubTree(tr.getItemId(), itemId);
  169. } else if (tr.getSourceComponent() == table) {
  170. // comes from table, override caption with name
  171. String name = (String) table.getItem(tr.getItemId())
  172. .getItemProperty("Name").getValue();
  173. tree2.setItemCaption(itemId, name);
  174. } else if (tr.getSourceComponent() == tree2) {
  175. tree2.setItemCaption(itemId, tree2.getItemCaption(tr
  176. .getItemId()));
  177. }
  178. }
  179. }
  180. private void copySubTree(Object itemId, Object itemIdTo) {
  181. Collection children = tree1.getChildren(itemId);
  182. if (children != null) {
  183. for (Object childId : children) {
  184. Object newItemId = tree2.addItem();
  185. tree2.setItemCaption(newItemId, (String) childId);
  186. tree2.setParent(newItemId, itemIdTo);
  187. copySubTree(childId, newItemId);
  188. }
  189. }
  190. }
  191. public AcceptCriterion getAcceptCriterion() {
  192. return IsDataBound.get();
  193. }
  194. };
  195. tree2.setDropHandler(dropHandler);
  196. /*
  197. * Finally add two windows with DragDropPane. First accept anything,
  198. * second has server side accept rule to allow only drops from Tree1.
  199. * Check the code in implementing classes.
  200. */
  201. Window acceptAnyThing = new AcceptAnythingWindow();
  202. Window acceptFromTree1viaServerCheck = new AcceptFromComponent(tree1);
  203. w.addWindow(acceptAnyThing);
  204. acceptAnyThing.setPositionY(450);
  205. acceptAnyThing.setPositionX(150);
  206. w.addWindow(acceptFromTree1viaServerCheck);
  207. acceptFromTree1viaServerCheck.setPositionY(450);
  208. acceptFromTree1viaServerCheck.setPositionX(450);
  209. }
  210. private void populateTable() {
  211. table.addContainerProperty("Name", String.class, "");
  212. table.addContainerProperty("Weight", Integer.class, 0);
  213. PersonContainer testData = PersonContainer.createWithTestData();
  214. for (int i = 0; i < 10; i++) {
  215. Item addItem = table.addItem("Item" + i);
  216. Person p = testData.getIdByIndex(i);
  217. addItem.getItemProperty("Name").setValue(
  218. p.getFirstName() + " " + p.getLastName());
  219. addItem.getItemProperty("Weight").setValue(50 + r.nextInt(60));
  220. }
  221. }
  222. private final static ThemeResource FOLDER = new ThemeResource(
  223. "../runo/icons/16/folder.png");
  224. private final static ThemeResource DOC = new ThemeResource(
  225. "../runo/icons/16/document.png");
  226. private void popuplateTrees() {
  227. HierarchicalContainer hc = new HierarchicalContainer();
  228. hc.addContainerProperty("icon", Resource.class, DOC);
  229. Item addItem = hc.addItem("Fats");
  230. addItem.getItemProperty("icon").setValue(FOLDER);
  231. hc.addItem("Tarja");
  232. hc.setParent("Tarja", "Fats");
  233. hc.setChildrenAllowed("Tarja", false);
  234. addItem = hc.addItem("Thins");
  235. addItem.getItemProperty("icon").setValue(FOLDER);
  236. addItem = hc.addItem("Anorectic");
  237. addItem.getItemProperty("icon").setValue(FOLDER);
  238. hc.setParent("Anorectic", "Thins");
  239. addItem = hc.addItem("Normal weighted");
  240. addItem.getItemProperty("icon").setValue(FOLDER);
  241. tree1.setContainerDataSource(hc);
  242. tree1.setItemIconPropertyId("icon");
  243. tree2.setContainerDataSource(new HierarchicalContainer());
  244. tree2.addItem("/");
  245. }
  246. @Override
  247. protected String getDescription() {
  248. return "dd";
  249. }
  250. @Override
  251. protected Integer getTicketNumber() {
  252. return 119;
  253. }
  254. }