public DataGridDataProvider(DataGridItems<T> dataGridItems, DataGridItemsEventsDelegate<T> dataEventsDelegate) { this.dataGridItems = dataGridItems; this.dataEventsDelegate = dataEventsDelegate; this.itemSetChangeSubscription = this.dataGridItems.addItemSetChangeListener(this::datasourceItemSetChanged); this.valueChangeSubscription = this.dataGridItems.addValueChangeListener(this::datasourceValueChanged); this.stateChangeSubscription = this.dataGridItems.addStateChangeListener(this::datasourceStateChanged); this.selectedItemChangeSubscription = this.dataGridItems.addSelectedItemChangeListener(this::datasourceSelectedItemChanged); }
@Override public Object getId(T item) { return dataGridItems.getItemId(item); }
@Override public void dataGridSourceItemSetChanged(DataGridItems.ItemSetChangeEvent<E> event) { // #PL-2035, reload selection from ds Set<E> selectedItems = getSelected(); Set<E> newSelection = new HashSet<>(); for (E item : selectedItems) { if (event.getSource().containsItem(item)) { newSelection.add(event.getSource().getItem(item.getId())); } } if (event.getSource().getState() == BindingState.ACTIVE && event.getSource().getSelectedItem() != null) { newSelection.add(event.getSource().getSelectedItem()); } if (newSelection.isEmpty()) { setSelected((E) null); } else { // Workaround for the MultiSelect model. // Set the selected items only if the previous selection is different // Otherwise, the DataGrid rows will display the values before editing if (isMultiSelect() && !selectedItems.equals(newSelection)) { setSelectedItems(newSelection); } } refreshActionsState(); }
@Override public void edit(E item) { checkNotNullArgument(item, "Entity must be non null"); DataGridItems<E> dataGridItems = getItems(); if (dataGridItems == null || dataGridItems.getState() == BindingState.INACTIVE) { return; } if (!dataGridItems.containsItem(item)) { throw new IllegalArgumentException("Datasource doesn't contain item"); } int rowIndex = dataGridItems.indexOfItem(item); component.getEditor().editRow(rowIndex); }
protected void onSelectionChange(com.vaadin.event.selection.SelectionEvent<E> e) { DataGridItems<E> dataGridItems = getItems(); if (dataGridItems == null || dataGridItems.getState() == BindingState.INACTIVE) { return; } Set<E> selected = getSelected(); if (selected.isEmpty()) { dataGridItems.setSelectedItem(null); } else { // reset selection and select new item if (isMultiSelect()) { dataGridItems.setSelectedItem(null); } E newItem = selected.iterator().next(); E dsItem = dataGridItems.getSelectedItem(); dataGridItems.setSelectedItem(newItem); if (Objects.equals(dsItem, newItem)) { // in this case item change event will not be generated refreshActionsState(); } } fireSelectionEvent(e); LookupSelectionChangeEvent<E> selectionChangeEvent = new LookupSelectionChangeEvent<>(this); publish(LookupSelectionChangeEvent.class, selectionChangeEvent); }
@Override public void scrollTo(E item, ScrollDestination destination) { Preconditions.checkNotNullArgument(item); Preconditions.checkNotNullArgument(destination); DataGridItems<E> dataGridItems = getDataGridItemsNN(); if (!dataGridItems.containsItem(item)) { throw new IllegalArgumentException("Unable to find item in DataGrid"); } int rowIndex = dataGridItems.indexOfItem(item); component.scrollTo(rowIndex, WebWrapperUtils.convertToGridScrollDestination(destination)); }
Entity item = (Entity) dataGrid.getItems().getItem(itemId);
protected DataGridItems<E> getDataGridItemsNN() { DataGridItems<E> dataGridItems = getItems(); if (dataGridItems == null || dataGridItems.getState() == BindingState.INACTIVE) { throw new IllegalStateException("DataGridItems is not active"); } return dataGridItems; }
@Override public void setSelected(Collection<E> items) { DataGridItems<E> dataGridItems = getDataGridItemsNN(); for (E item : items) { if (!dataGridItems.containsItem(item)) { throw new IllegalStateException("Datasource doesn't contain items"); } } setSelectedItems(items); }
@Override public Stream<T> fetchChildren(HierarchicalQuery<T, SerializablePredicate<T>> query) { if (dataGridItems.getState() == BindingState.INACTIVE) { return Stream.empty(); } return getTreeDataGridSource().getChildren(query.getParent()) .skip(query.getOffset()) .limit(query.getLimit()); }