package org.ovirt.engine.ui.uicommonweb.models; import java.util.ArrayList; import java.util.Collection; import java.util.Objects; /** * A {@link ListModel} that allows temporarily hide some of its items. * @param <T> type of items */ public class FilteredListModel<T> extends ListModel<T> { /** * Collection if all unfiltered items. */ private Collection<T> allItems; @Override public void setItems(Collection<T> value, T selectedItem) { super.setItems(value, selectedItem); if (allItems != value) { this.allItems = value; } } /** * It filters items in this list model. Items are shown if and only if * {@link org.ovirt.engine.ui.uicommonweb.models.FilteredListModel.Filter#filter(Object)} returns true. * Input collection for filtering is the last collection passed to {@link #setItems(java.util.Collection, Object)} * @param filter filter; {@code null} means 'show all' */ public void filterItems(Filter<T> filter) { if (filter == null) { if (Objects.equals(this.allItems, getItems())) { return; } setItemsSelectionAware(this.allItems); } final Collection<T> itemsToShow = new ArrayList<>(); if (filter != null) { for (T item : this.allItems) { if (filter.filter(item)) { itemsToShow.add(item); } } } setItemsSelectionAware(itemsToShow); } private void setItemsSelectionAware(Collection<T> items) { final boolean preserveSelection = items.contains(getSelectedItem()); final T selectedItem = preserveSelection ? getSelectedItem() : null; super.setItems(items, selectedItem); } public static interface Filter<T> { /** * @return {@code true} to show item, {@code false} to hide item */ public boolean filter(T item); } }