123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- package com.vaadin.tests.components.grid;
-
- import java.util.List;
- import java.util.stream.Collectors;
-
- import com.vaadin.annotations.Theme;
- import com.vaadin.annotations.Widgetset;
- import com.vaadin.data.provider.ListDataProvider;
- import com.vaadin.server.VaadinRequest;
- import com.vaadin.shared.ui.dnd.DropEffect;
- import com.vaadin.shared.ui.dnd.EffectAllowed;
- import com.vaadin.shared.ui.grid.DropLocation;
- import com.vaadin.shared.ui.grid.DropMode;
- import com.vaadin.tests.util.Person;
- import com.vaadin.ui.Grid;
- import com.vaadin.ui.components.grid.GridDragSource;
- import com.vaadin.ui.components.grid.GridDropTarget;
-
- @Theme("valo")
- @Widgetset("com.vaadin.DefaultWidgetSet")
- public class GridDragAndDrop extends AbstractGridDnD {
-
- private List<Person> draggedItems;
-
- @Override
- protected void setup(VaadinRequest request) {
- getUI().setMobileHtml5DndEnabled(true);
-
- // Drag source Grid
- Grid<Person> left = createGridAndFillWithData(50);
- GridDragSource<Person> dragSource = applyDragSource(left);
-
- // Drop target Grid
- Grid<Person> right = createGridAndFillWithData(0);
- GridDropTarget<Person> dropTarget = applyDropTarget(right);
-
- initializeTestFor(left, right, dragSource, dropTarget);
- }
-
- private GridDragSource<Person> applyDragSource(Grid<Person> grid) {
- GridDragSource<Person> dragSource = new GridDragSource<>(grid);
-
- dragSource.setEffectAllowed(EffectAllowed.MOVE);
-
- // Set data generator
- dragSource.setDragDataGenerator("application/json", person -> {
- StringBuilder builder = new StringBuilder();
- builder.append('{');
- builder.append("\"First Name\":");
- builder.append("\"" + person.getFirstName() + "\"");
- builder.append(',');
- builder.append("\"Last Name\":");
- builder.append("\"" + person.getLastName() + "\"");
- builder.append('}');
- return builder.toString();
- });
-
- // Add drag start listener
- dragSource.addGridDragStartListener(event -> {
- draggedItems = event.getDraggedItems();
- log("START: " + draggedItems.size() + ", :"
- + draggedItems.stream().map(person -> person.getLastName())
- .collect(Collectors.joining(" ")));
- });
-
- // Add drag end listener
- dragSource.addGridDragEndListener(event -> {
- log("END: dropEffect=" + event.getDropEffect());
- if (event.getDropEffect() == DropEffect.MOVE
- && draggedItems != null) {
- // If drop is successful, remove dragged item from source Grid
- ((ListDataProvider<Person>) grid.getDataProvider()).getItems()
- .removeAll(draggedItems);
- grid.getDataProvider().refreshAll();
- // Remove reference to dragged items
- draggedItems = null;
- }
- });
-
- return dragSource;
- }
-
- private GridDropTarget<Person> applyDropTarget(Grid<Person> grid) {
- // Create and attach extension
- GridDropTarget<Person> dropTarget = new GridDropTarget<>(grid,
- DropMode.BETWEEN);
- dropTarget.setDropEffect(DropEffect.MOVE);
-
- // Add listener
- dropTarget.addGridDropListener(event -> {
- event.getDragSourceExtension().ifPresent(source -> {
- if (source instanceof GridDragSource) {
- ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) event
- .getComponent().getDataProvider();
- List<Person> items = (List<Person>) dataProvider.getItems();
-
- // Calculate the target row's index
- int index = items.size();
- if (event.getDropTargetRow().isPresent()) {
- index = items.indexOf(event.getDropTargetRow().get())
- + (event.getDropLocation() == DropLocation.BELOW
- ? 1
- : 0);
- }
-
- // Add dragged items to the target Grid
- items.addAll(index, draggedItems);
- dataProvider.refreshAll();
-
- log("DROP: dragData=" + event.getDataTransferText()
- + ", dragDataJson="
- + event.getDataTransferData("application/json")
- + ", target="
- + (event.getDropTargetRow().isPresent()
- ? event.getDropTargetRow().get()
- .getFirstName()
- + " "
- + event.getDropTargetRow().get()
- .getLastName()
- : "[BODY]")
- + ", location=" + event.getDropLocation()
- + ", mouseEventDetails="
- + event.getMouseEventDetails());
- }
- });
- });
-
- return dropTarget;
- }
-
- }
|