package org.phoenicis.javafx.views.mainwindow.apps; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import java.util.function.BiPredicate; import java.util.function.Predicate; /** * Created by marc on 29.03.17. */ public class ApplicationFilter<E> { private StringProperty filterText; private BiPredicate<String, E> filterTextMatcher; private ObservableList<Predicate<E>> filters; public ApplicationFilter(FilteredList<E> filteredList, BiPredicate<String, E> filterTextMatcher) { this.filterTextMatcher = filterTextMatcher; this.filterText = new SimpleStringProperty(""); this.filters = FXCollections.observableArrayList(); this.filterText.addListener((observableValue, oldValue, newValue) -> filteredList.setPredicate(this::filter)); this.filters.addListener( (ListChangeListener<? super Predicate<E>>) change -> filteredList.setPredicate(this::filter)); } public void setFilterText(String filterText) { this.filterText.setValue(filterText); } public void addFilter(Predicate<E> filter) { this.filters.add(filter); } public void setFilters(Predicate<E>... filters) { this.filters.setAll(filters); } public void clearAll() { this.filterText.setValue(""); this.filters.clear(); } public void clearFilters() { this.filters.clear(); } public boolean filter(E value) { boolean result = false; if (filters.isEmpty()) { result = true; } for (Predicate<E> filter : filters) { result |= filter.test(value); } return result && filterTextMatcher.test(filterText.getValue(), value); } }