package io.bitsquare.gui.components; import io.bitsquare.common.UserThread; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.scene.control.ComboBox; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SearchComboBox<T> extends ComboBox<T> { private static final Logger log = LoggerFactory.getLogger(SearchComboBox.class); private FilteredList<T> filteredList; public SearchComboBox() { this(FXCollections.<T>observableArrayList()); } public SearchComboBox(final ObservableList<T> items) { super(new FilteredList<>(items)); filteredList = new FilteredList<>(items); setEditable(true); itemsProperty().addListener((observable, oldValue, newValue) -> { filteredList = new FilteredList<>(newValue); setItems(filteredList); }); getEditor().textProperty().addListener((observable, oldValue, newValue) -> { if (!filteredList.stream().filter(item -> getConverter().toString(item).equals(newValue)). findAny().isPresent()) { UserThread.execute(() -> { filteredList.setPredicate(item -> newValue.isEmpty() || getConverter().toString(item).toLowerCase().contains(newValue.toLowerCase())); hide(); setVisibleRowCount(Math.min(12, filteredList.size())); show(); }); } }); } }