package com.constellio.app.ui.framework.components; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.framework.components.table.BasePagedTable; import com.constellio.app.ui.framework.containers.SearchResultContainer; import com.jensjansson.pagedtable.PagedTable; import com.vaadin.data.Property; import com.vaadin.ui.*; import com.vaadin.ui.themes.ValoTheme; import java.io.Serializable; import java.util.*; import static com.constellio.app.ui.i18n.i18n.$; public class SearchResultDetailedTable extends BasePagedTable<SearchResultContainer> implements SearchResultTable{ public static final String TABLE_STYLE = "search-result-table"; public static final String CHECKBOX_PROPERTY = "checkbox"; private Set<Object> selected; private Set<Object> deselected; private boolean selectAll; private Set<SelectionChangeListener> listeners; public SearchResultDetailedTable(SearchResultContainer container) { this(container, true); } public SearchResultDetailedTable(SearchResultContainer container, boolean withCheckBoxes) { super(container); listeners = new HashSet<>(); selected = new HashSet<>(); deselected = new HashSet<>(); if (withCheckBoxes) { addGeneratedColumn(CHECKBOX_PROPERTY, new ColumnGenerator() { @Override public Object generateCell(Table source, final Object itemId, Object columnId) { final CheckBox checkBox = new CheckBox(); checkBox.setValue(selected.contains(itemId)); checkBox.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { if (checkBox.getValue()) { selected.add(itemId); deselected.remove(itemId); } else { selected.remove(itemId); deselected.add(itemId); } fireSelectionChangeEvent(); } }); return checkBox; } }); setColumnAlignment(CHECKBOX_PROPERTY, Align.CENTER); } setContainerDataSource(container); setColumnHeaderMode(ColumnHeaderMode.HIDDEN); if (withCheckBoxes) { setVisibleColumns(CHECKBOX_PROPERTY, SearchResultContainer.SEARCH_RESULT_PROPERTY); } else { setVisibleColumns(SearchResultContainer.SEARCH_RESULT_PROPERTY); } setColumnExpandRatio(SearchResultContainer.SEARCH_RESULT_PROPERTY, 1); setPageLength(Math.min(container.size(), DEFAULT_PAGE_LENGTH)); addStyleName(TABLE_STYLE); } public List<String> getSelectedRecordIds() { List<String> result = new ArrayList<>(); for (Object itemId : selected) { RecordVO record = container.getRecordVO((int) itemId); result.add(record.getId()); } return result; } public List<String> getUnselectedRecordIds() { List<String> result = new ArrayList<>(); for (Object itemId : deselected) { RecordVO record = container.getRecordVO((int) itemId); result.add(record.getId()); } return result; } public void selectCurrentPage() { selectAll = true; selected.addAll(container.getItemIds((getCurrentPage() - 1) * getPageLength(), getPageLength())); deselected.removeAll(container.getItemIds((getCurrentPage() - 1) * getPageLength(), getPageLength())); refreshRowCache(); fireSelectionChangeEvent(); } public void deselectCurrentPage() { selectAll = false; selected.removeAll(container.getItemIds((getCurrentPage() - 1) * getPageLength(), getPageLength())); deselected.addAll(container.getItemIds((getCurrentPage() - 1) * getPageLength(), getPageLength())); refreshRowCache(); fireSelectionChangeEvent(); } public void addSelectionChangeListener(SelectionChangeListener listener) { listeners.add(listener); } public VerticalLayout createSummary(Component alwaysActive, final Component... extra) { return createSummary(Arrays.asList(alwaysActive), extra); } public VerticalLayout createSummary(List<Component> alwaysActive, final Component... extra) { return createSummary(alwaysActive, Arrays.asList(extra)); } public VerticalLayout createSummary(List<Component> alwaysActive, final List<Component> extra) { Label totalCount = new Label($("SearchResultTable.count", container.size())); totalCount.addStyleName(ValoTheme.LABEL_BOLD); HorizontalLayout count = new HorizontalLayout(totalCount); count.setComponentAlignment(totalCount, Alignment.MIDDLE_LEFT); count.setSizeUndefined(); count.setSpacing(true); for (Component component : alwaysActive) { count.addComponent(component); count.setComponentAlignment(component, Alignment.MIDDLE_LEFT); } final Label selectedCount = new Label($("SearchResultTable.selection", selected.size())); selectedCount.setSizeUndefined(); final HorizontalLayout selection = new HorizontalLayout(selectedCount); selection.setComponentAlignment(selectedCount, Alignment.MIDDLE_LEFT); selection.setSizeUndefined(); selection.setSpacing(true); for (Component component : extra) { component.setEnabled(selected.size() > 0); selection.addComponent(component); selection.setComponentAlignment(component, Alignment.MIDDLE_LEFT); } VerticalLayout summaryBar = new VerticalLayout(count, selection); summaryBar.setWidth("100%"); addSelectionChangeListener(new SelectionChangeListener() { @Override public void selectionChanged(SelectionChangeEvent event) { selectedCount.setValue($("SearchResultTable.selection", event.getSelectionSize())); for (Component component : extra) { component.setEnabled(event.getSelectionSize() > 0); } } }); return summaryBar; } private void fireSelectionChangeEvent() { if (listeners.isEmpty()) { return; } SelectionChangeEvent event = new SelectionChangeEvent(this, selected.size()); for (SelectionChangeListener listener : listeners) { listener.selectionChanged(event); } } public static class SelectionChangeEvent implements Serializable { private final SearchResultDetailedTable table; private final int selectionSize; public SelectionChangeEvent(SearchResultDetailedTable table, int selectionSize) { this.table = table; this.selectionSize = selectionSize; } public SearchResultDetailedTable getTable() { return table; } public int getSelectionSize() { return selectionSize; } } public interface SelectionChangeListener extends Serializable { void selectionChanged(SelectionChangeEvent event); } public interface PageChangeListener extends PagedTable.PageChangeListener, Serializable { } }