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.

GridDragAndDrop.java 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package com.vaadin.tests.components.grid;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. import com.vaadin.annotations.Theme;
  5. import com.vaadin.annotations.Widgetset;
  6. import com.vaadin.data.provider.ListDataProvider;
  7. import com.vaadin.server.VaadinRequest;
  8. import com.vaadin.shared.ui.dnd.DropEffect;
  9. import com.vaadin.shared.ui.dnd.EffectAllowed;
  10. import com.vaadin.shared.ui.grid.DropLocation;
  11. import com.vaadin.shared.ui.grid.DropMode;
  12. import com.vaadin.tests.util.Person;
  13. import com.vaadin.ui.Grid;
  14. import com.vaadin.ui.components.grid.GridDragSource;
  15. import com.vaadin.ui.components.grid.GridDropTarget;
  16. @Theme("valo")
  17. @Widgetset("com.vaadin.DefaultWidgetSet")
  18. public class GridDragAndDrop extends AbstractGridDnD {
  19. private List<Person> draggedItems;
  20. @Override
  21. protected void setup(VaadinRequest request) {
  22. getUI().setMobileHtml5DndEnabled(true);
  23. // Drag source Grid
  24. Grid<Person> left = createGridAndFillWithData(50);
  25. GridDragSource<Person> dragSource = applyDragSource(left);
  26. // Drop target Grid
  27. Grid<Person> right = createGridAndFillWithData(0);
  28. GridDropTarget<Person> dropTarget = applyDropTarget(right);
  29. initializeTestFor(left, right, dragSource, dropTarget);
  30. }
  31. private GridDragSource<Person> applyDragSource(Grid<Person> grid) {
  32. GridDragSource<Person> dragSource = new GridDragSource<>(grid);
  33. dragSource.setEffectAllowed(EffectAllowed.MOVE);
  34. // Set data generator
  35. dragSource.setDragDataGenerator("application/json", person -> {
  36. StringBuilder builder = new StringBuilder();
  37. builder.append('{');
  38. builder.append("\"First Name\":");
  39. builder.append("\"" + person.getFirstName() + "\"");
  40. builder.append(',');
  41. builder.append("\"Last Name\":");
  42. builder.append("\"" + person.getLastName() + "\"");
  43. builder.append('}');
  44. return builder.toString();
  45. });
  46. // Add drag start listener
  47. dragSource.addGridDragStartListener(event -> {
  48. draggedItems = event.getDraggedItems();
  49. log("START: " + draggedItems.size() + ", :"
  50. + draggedItems.stream().map(person -> person.getLastName())
  51. .collect(Collectors.joining(" ")));
  52. });
  53. // Add drag end listener
  54. dragSource.addGridDragEndListener(event -> {
  55. log("END: dropEffect=" + event.getDropEffect());
  56. if (event.getDropEffect() == DropEffect.MOVE
  57. && draggedItems != null) {
  58. // If drop is successful, remove dragged item from source Grid
  59. ((ListDataProvider<Person>) grid.getDataProvider()).getItems()
  60. .removeAll(draggedItems);
  61. grid.getDataProvider().refreshAll();
  62. // Remove reference to dragged items
  63. draggedItems = null;
  64. }
  65. });
  66. return dragSource;
  67. }
  68. private GridDropTarget<Person> applyDropTarget(Grid<Person> grid) {
  69. // Create and attach extension
  70. GridDropTarget<Person> dropTarget = new GridDropTarget<>(grid,
  71. DropMode.BETWEEN);
  72. dropTarget.setDropEffect(DropEffect.MOVE);
  73. // Add listener
  74. dropTarget.addGridDropListener(event -> {
  75. event.getDragSourceExtension().ifPresent(source -> {
  76. if (source instanceof GridDragSource) {
  77. ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) event
  78. .getComponent().getDataProvider();
  79. List<Person> items = (List<Person>) dataProvider.getItems();
  80. // Calculate the target row's index
  81. int index = items.size();
  82. if (event.getDropTargetRow().isPresent()) {
  83. index = items.indexOf(event.getDropTargetRow().get())
  84. + (event.getDropLocation() == DropLocation.BELOW
  85. ? 1
  86. : 0);
  87. }
  88. // Add dragged items to the target Grid
  89. items.addAll(index, draggedItems);
  90. dataProvider.refreshAll();
  91. log("DROP: dragData=" + event.getDataTransferText()
  92. + ", dragDataJson="
  93. + event.getDataTransferData("application/json")
  94. + ", target="
  95. + (event.getDropTargetRow().isPresent()
  96. ? event.getDropTargetRow().get()
  97. .getFirstName()
  98. + " "
  99. + event.getDropTargetRow().get()
  100. .getLastName()
  101. : "[BODY]")
  102. + ", location=" + event.getDropLocation()
  103. + ", mouseEventDetails="
  104. + event.getMouseEventDetails());
  105. }
  106. });
  107. });
  108. return dropTarget;
  109. }
  110. }