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 draggedItems; @Override protected void setup(VaadinRequest request) { getUI().setMobileHtml5DndEnabled(true); // Drag source Grid Grid left = createGridAndFillWithData(50); GridDragSource dragSource = applyDragSource(left); // Drop target Grid Grid right = createGridAndFillWithData(0); GridDropTarget dropTarget = applyDropTarget(right); initializeTestFor(left, right, dragSource, dropTarget); } private GridDragSource applyDragSource(Grid grid) { GridDragSource 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) grid.getDataProvider()).getItems() .removeAll(draggedItems); grid.getDataProvider().refreshAll(); // Remove reference to dragged items draggedItems = null; } }); return dragSource; } private GridDropTarget applyDropTarget(Grid grid) { // Create and attach extension GridDropTarget dropTarget = new GridDropTarget<>(grid, DropMode.BETWEEN); dropTarget.setDropEffect(DropEffect.MOVE); // Add listener dropTarget.addGridDropListener(event -> { event.getDragSourceExtension().ifPresent(source -> { if (source instanceof GridDragSource) { ListDataProvider dataProvider = (ListDataProvider) event .getComponent().getDataProvider(); List items = (List) 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; } }