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.

DDTest1.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package com.vaadin.tests.dd;
  2. import java.util.Collection;
  3. import com.vaadin.data.Item;
  4. import com.vaadin.data.util.HierarchicalContainer;
  5. import com.vaadin.event.DataBoundTransferable;
  6. import com.vaadin.event.Transferable;
  7. import com.vaadin.event.dd.DragAndDropEvent;
  8. import com.vaadin.event.dd.DropHandler;
  9. import com.vaadin.event.dd.acceptCriteria.AcceptCriterion;
  10. import com.vaadin.event.dd.acceptCriteria.IsDataBound;
  11. import com.vaadin.event.dd.acceptCriteria.ServerSideCriterion;
  12. import com.vaadin.terminal.ExternalResource;
  13. import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation;
  14. import com.vaadin.tests.components.TestBase;
  15. import com.vaadin.ui.Component;
  16. import com.vaadin.ui.DragDropPane;
  17. import com.vaadin.ui.GridLayout;
  18. import com.vaadin.ui.Label;
  19. import com.vaadin.ui.Layout;
  20. import com.vaadin.ui.Link;
  21. import com.vaadin.ui.Table;
  22. import com.vaadin.ui.Tree;
  23. import com.vaadin.ui.Table.DragModes;
  24. import com.vaadin.ui.Tree.TreeDragMode;
  25. import com.vaadin.ui.Tree.TreeDropTargetDetails;
  26. /**
  27. * DD playground. Better quality example/prototype codes in {@link DDTest2}.
  28. */
  29. public class DDTest1 extends TestBase {
  30. @Override
  31. protected void setup() {
  32. GridLayout gl = new GridLayout(3, 2);
  33. gl.setSizeFull();
  34. gl.setSpacing(true);
  35. Layout main = gl;
  36. DragDropPane pane1 = new DragDropPane();
  37. pane1.setSizeFull();
  38. pane1.setCaption("Pane1");
  39. Label label = new Label("Foo");
  40. label.setSizeUndefined();
  41. pane1.addComponent(label);
  42. Link l = new Link("This is link", new ExternalResource(
  43. "http://www.google.com/"));
  44. pane1.addComponent(l, "top:100px; left: 20px;");
  45. label = new Label("Bar");
  46. label.setSizeUndefined();
  47. pane1.addComponent(label);
  48. DragDropPane pane2 = new DragDropPane();
  49. pane2
  50. .setCaption("Pane2 (accept needs server side visit, check for \"Bar\")");
  51. DropHandler dropHandler = new DragDropPane.ImportPrettyMuchAnything() {
  52. private final AcceptCriterion crit = new ServerSideCriterion() {
  53. public boolean accepts(DragAndDropEvent dragEvent) {
  54. Transferable transferable = dragEvent.getTransferable();
  55. // System.out.println("Simulating 500ms processing...");
  56. // try {
  57. // Thread.sleep(200);
  58. // } catch (InterruptedException e) {
  59. // // TODO Auto-generated catch block
  60. // e.printStackTrace();
  61. // }
  62. // System.out.println("Done get to work.");
  63. Component component = (Component) transferable
  64. .getData("component");
  65. if (component == null) {
  66. component = transferable.getSourceComponent();
  67. }
  68. if (component != null) {
  69. if (component.toString() != null
  70. && component.toString().contains("Bar")) {
  71. return true;
  72. }
  73. }
  74. return false;
  75. }
  76. };
  77. @Override
  78. public AcceptCriterion getAcceptCriterion() {
  79. return crit;
  80. }
  81. };
  82. pane2.setDropHandler(dropHandler);
  83. pane2.setDebugId("pane2");
  84. pane2.setSizeFull();
  85. DragDropPane pane3 = new DragDropPane();
  86. pane3.setSizeFull();
  87. pane3.setCaption("Pane3");
  88. final Tree t = new Tree(
  89. "Tree with sorting enabled. Also allows dragging elsewhere.");
  90. final HierarchicalContainer idx = new HierarchicalContainer();
  91. t.setContainerDataSource(idx);
  92. t.setDebugId("perseys");
  93. t.addItem("Foo");
  94. t.addItem("Bar");
  95. t.addItem("Bar1");
  96. t.addItem("Bar2");
  97. t.addItem("Bar3");
  98. t.addItem("Bar4");
  99. t.addItem("Bar5");
  100. t.addItem("Child");
  101. t.setParent("Child", "Foo");
  102. t.setSizeFull();
  103. t.setDragMode(TreeDragMode.NODE);
  104. /*
  105. * Moves items in tree (and could work in Table too). Also supports
  106. * "building" tree.
  107. *
  108. * TODO fix algorithm, broken in some cases.
  109. */
  110. DropHandler itemSorter = new DropHandler() {
  111. private void populateSubTree(HierarchicalContainer idx,
  112. HierarchicalContainer subtree, Object itemId) {
  113. Collection children = subtree.getChildren(itemId);
  114. if (children != null) {
  115. for (Object childId : children) {
  116. Item addItem = idx.addItem(childId);
  117. if (addItem != null) {
  118. // did not exist, populate properties
  119. Item item = subtree.getItem(itemId);
  120. Collection<?> itemPropertyIds = item
  121. .getItemPropertyIds();
  122. for (Object propId : itemPropertyIds) {
  123. addItem.getItemProperty(propId)
  124. .setValue(
  125. item.getItemProperty(propId)
  126. .getValue());
  127. }
  128. }
  129. idx.setParent(childId, itemId);
  130. populateSubTree(idx, subtree, childId);
  131. }
  132. }
  133. }
  134. private HierarchicalContainer getSubTree(HierarchicalContainer idx,
  135. Object itemId) {
  136. HierarchicalContainer hierarchicalContainer = new HierarchicalContainer();
  137. Collection containerPropertyIds = idx.getContainerPropertyIds();
  138. for (Object object : containerPropertyIds) {
  139. hierarchicalContainer.addContainerProperty(object, idx
  140. .getType(object), null);
  141. }
  142. hierarchicalContainer.addItem(itemId);
  143. copyChildren(idx, hierarchicalContainer, itemId);
  144. return hierarchicalContainer;
  145. }
  146. private void copyChildren(HierarchicalContainer source,
  147. HierarchicalContainer target, Object itemId) {
  148. Collection children = source.getChildren(itemId);
  149. if (children != null) {
  150. for (Object childId : children) {
  151. Item item = source.getItem(childId);
  152. Item addedItem = target.addItem(childId);
  153. target.setParent(childId, itemId);
  154. Collection<?> itemPropertyIds = item
  155. .getItemPropertyIds();
  156. for (Object propertyId : itemPropertyIds) {
  157. addedItem.getItemProperty(propertyId)
  158. .setValue(
  159. item.getItemProperty(propertyId)
  160. .getValue());
  161. }
  162. copyChildren(source, target, childId);
  163. }
  164. }
  165. }
  166. public void drop(DragAndDropEvent event) {
  167. TreeDropTargetDetails details = (TreeDropTargetDetails) event
  168. .getDropTargetDetails();
  169. // TODO set properties, so same sorter could be used in Table
  170. Transferable transferable = event.getTransferable();
  171. if (transferable instanceof DataBoundTransferable) {
  172. DataBoundTransferable transferrable2 = (DataBoundTransferable) transferable;
  173. Object itemId = transferrable2.getItemId();
  174. Object itemIdOver = details.getItemIdOver();
  175. // TODO could use the "folder" node id to make the drop
  176. // logic simpler
  177. Object itemIdInto = details.getItemIdInto();
  178. VerticalDropLocation dropLocation = details
  179. .getDropLocation();
  180. if (dropLocation == VerticalDropLocation.MIDDLE) {
  181. t.setParent(itemId, itemIdOver);
  182. return;
  183. } else if (VerticalDropLocation.TOP == dropLocation) {
  184. // if on top of the caption area, add before
  185. itemIdOver = idx.prevItemId(itemIdOver);
  186. }
  187. if (itemId.equals(itemIdOver)) {
  188. // the location is same
  189. return;
  190. }
  191. HierarchicalContainer subtree = getSubTree(idx, itemId);
  192. boolean removed = idx.removeItem(itemId);
  193. if (removed) {
  194. if (dropLocation == null) {
  195. System.err
  196. .println("No detail of drop place available");
  197. }
  198. Item addItemAfter = idx
  199. .addItemAfter(itemIdOver, itemId);
  200. populateSubTree(idx, subtree, itemId);
  201. // ensure the same parent as with related item
  202. Object parent = idx.getParent(itemIdOver);
  203. idx.setParent(itemId, parent);
  204. }
  205. }
  206. return;
  207. }
  208. public AcceptCriterion getAcceptCriterion() {
  209. // TODO should actually check that source is same as target
  210. return IsDataBound.get();
  211. }
  212. };
  213. t.setDropHandler(itemSorter);
  214. Table ta = new Table("Test table");
  215. ta.setContainerDataSource(idx);
  216. ta.addContainerProperty("Foos", String.class, "Foo");
  217. ta.addContainerProperty("Bars", String.class, "Bar");
  218. ta.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);
  219. ta.setSizeFull();
  220. ta.setDragMode(DragModes.ROWS);
  221. main.addComponent(pane1);
  222. main.addComponent(pane2);
  223. main.addComponent(pane3);
  224. main.addComponent(t);
  225. main.addComponent(ta);
  226. main.addComponent(new Link("Foo", new ExternalResource(
  227. "http://www.itmill.com/")));
  228. getLayout().setSizeFull();
  229. addComponent(main);
  230. }
  231. @Override
  232. protected String getDescription() {
  233. return "Random DD tests";
  234. }
  235. @Override
  236. protected Integer getTicketNumber() {
  237. return 119;
  238. }
  239. }