private int calculateDropIndex(GridDropEvent<T> event) { // use custom calculator if present if (getDropIndexCalculator() != null) { return getDropIndexCalculator().calculateDropIndex(event); } // if the source and target grids are the same, then the index has been // calculated before removing the items. In this case the drop location // is always above, since the items will be starting from that point on if (shiftedDropIndex != -1) { return shiftedDropIndex; } ListDataProvider<T> targetDataProvider = (ListDataProvider<T>) getGridDropTarget() .getGrid().getDataProvider(); List<T> items = (List<T>) targetDataProvider.getItems(); int index = items.size(); Optional<T> dropTargetRow = event.getDropTargetRow(); if (dropTargetRow.isPresent()) { index = items.indexOf(dropTargetRow.get()) + (event.getDropLocation() == DropLocation.BELOW ? 1 : 0); } return index; }
@SuppressWarnings("unchecked") private void verifySourceDataProvider() { if (getSourceDataProviderUpdater() != null) { return; // custom updater is always fine } if (!(getSourceDataProvider() instanceof ListDataProvider)) { throwUnsupportedOperationExceptionForUnsupportedDataProvider(true); } if (!(((ListDataProvider<T>) getSourceDataProvider()) .getItems() instanceof List)) { throwUnsupportedOperationExceptionForUnsupportedCollectionInListDataProvider( true); } }
private void handleSourceGridDrop(GridDropEvent<T> event, final Collection<T> droppedItems) { Grid<T> source = getGridDragSource().getGrid(); if (getSourceDataProviderUpdater() != null) { getSourceDataProviderUpdater().removeItems(event.getDropEffect(), source.getDataProvider(), droppedItems); return; } ListDataProvider<T> listDataProvider = (ListDataProvider<T>) source .getDataProvider(); // use the existing data source to keep filters and sort orders etc. in // place. Collection<T> sourceItems = listDataProvider.getItems(); // if reordering the same grid and dropping on top of one of the dragged // rows, need to calculate the new drop index before removing the items if (getGridDragSource().getGrid() == getGridDropTarget().getGrid() && event.getDropTargetRow().isPresent() && getDraggedItems().contains(event.getDropTargetRow().get())) { List<T> sourceItemsList = (List<T>) sourceItems; shiftedDropIndex = sourceItemsList .indexOf(event.getDropTargetRow().get()); shiftedDropIndex -= getDraggedItems().stream().filter( item -> sourceItemsList.indexOf(item) < shiftedDropIndex) .count(); } sourceItems.removeAll(droppedItems); listDataProvider.refreshAll(); }
@SuppressWarnings("unchecked") private void verifyTargetDataProvider() { if (getTargetDataProviderUpdater() != null && getDropIndexCalculator() != null) { return; // custom updater and calculator is always fine } if (!(getTargetDataProvider() instanceof ListDataProvider)) { throwUnsupportedOperationExceptionForUnsupportedDataProvider(false); } if (!(((ListDataProvider<T>) getTargetDataProvider()) .getItems() instanceof List)) { throwUnsupportedOperationExceptionForUnsupportedCollectionInListDataProvider( false); } }
private void handleTargetGridDrop(GridDropEvent<T> event, final int index, Collection<T> droppedItems) { Grid<T> target = getGridDropTarget().getGrid(); if (getTargetDataProviderUpdater() != null) { getTargetDataProviderUpdater().onDrop(event.getDropEffect(), target.getDataProvider(), index, droppedItems); return; } ListDataProvider<T> listDataProvider = (ListDataProvider<T>) target .getDataProvider(); // update the existing to keep filters etc. List<T> targetItems = (List<T>) listDataProvider.getItems(); if (index != Integer.MAX_VALUE) { targetItems.addAll(index, droppedItems); } else { targetItems.addAll(droppedItems); } // instead of using setItems or creating a new data provider, // refresh the existing one to keep filters etc. in place listDataProvider.refreshAll(); // if dropped to the end of the grid, the grid should scroll there so // that the dropped row is visible, but that is just recommended in // documentation and left for the users to take into use }
dataProvider.refreshAll(); Iterator<Task> iterator = dataProvider.getItems().iterator(); if (iterator.hasNext()) { tasksGrid.select(iterator.next());