From a0090a185d57e325ea18a7111c38db64e6d011ad Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 22 May 2016 20:49:10 +0200 Subject: [PATCH] Add ComboBox with search option --- .../gui/components/SearchComboBox.java | 42 +++++++++++++++++++ .../paymentmethods/BlockChainForm.java | 16 +++++-- .../fiataccounts/FiatAccountsView.java | 2 +- .../io/bitsquare/gui/util/FormBuilder.java | 14 +++++++ 4 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 gui/src/main/java/io/bitsquare/gui/components/SearchComboBox.java diff --git a/gui/src/main/java/io/bitsquare/gui/components/SearchComboBox.java b/gui/src/main/java/io/bitsquare/gui/components/SearchComboBox.java new file mode 100644 index 0000000000..d8ac5d0e6b --- /dev/null +++ b/gui/src/main/java/io/bitsquare/gui/components/SearchComboBox.java @@ -0,0 +1,42 @@ +package io.bitsquare.gui.components; + +import io.bitsquare.common.UserThread; +import javafx.beans.value.WeakChangeListener; +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 extends ComboBox { + private static final Logger log = LoggerFactory.getLogger(SearchComboBox.class); + private FilteredList filteredList; + + public SearchComboBox() { + this(FXCollections.observableArrayList()); + } + + public SearchComboBox(final ObservableList items) { + super(new FilteredList<>(items)); + filteredList = new FilteredList<>(items); + setEditable(true); + + itemsProperty().addListener(new WeakChangeListener<>((observable, oldValue, newValue) -> { + filteredList = new FilteredList<>(newValue); + setItems(filteredList); + })); + getEditor().textProperty().addListener(new WeakChangeListener<>((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().startsWith(newValue.toLowerCase())); + hide(); + setVisibleRowCount(Math.min(20, filteredList.size())); + show(); + }); + } + })); + } +} \ No newline at end of file diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java index f0b7c44ec8..840560ad20 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java @@ -40,6 +40,8 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Optional; + import static io.bitsquare.gui.util.FormBuilder.*; public class BlockChainForm extends PaymentMethodForm { @@ -127,19 +129,25 @@ public class BlockChainForm extends PaymentMethodForm { @Override protected void addTradeCurrencyComboBox() { - currencyComboBox = addLabelComboBox(gridPane, ++gridRow, "Cryptocurrency:", Layout.FIRST_ROW_AND_GROUP_DISTANCE).second; - currencyComboBox.setPromptText("Select cryptocurrency"); + currencyComboBox = addLabelSearchComboBox(gridPane, ++gridRow, "Cryptocurrency:", Layout.FIRST_ROW_AND_GROUP_DISTANCE).second; + currencyComboBox.setPromptText("Select or search cryptocurrency"); currencyComboBox.setItems(FXCollections.observableArrayList(CurrencyUtil.getAllSortedCryptoCurrencies())); currencyComboBox.setVisibleRowCount(Math.min(currencyComboBox.getItems().size(), 20)); currencyComboBox.setConverter(new StringConverter() { @Override public String toString(TradeCurrency tradeCurrency) { - return tradeCurrency.getNameAndCode(); + return tradeCurrency != null ? tradeCurrency.getNameAndCode() : ""; } @Override public TradeCurrency fromString(String s) { - return null; + Optional tradeCurrencyOptional = currencyComboBox.getItems().stream(). + filter(tradeCurrency -> tradeCurrency.getNameAndCode().equals(s)). + findAny(); + if (tradeCurrencyOptional.isPresent()) + return tradeCurrencyOptional.get(); + else + return null; } }); currencyComboBox.setOnAction(e -> { diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java index b4038fbba3..69cd4cd7d1 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java @@ -224,7 +224,7 @@ public class FiatAccountsView extends ActivatableViewAndModel() { @Override public String toString(PaymentMethod paymentMethod) { - return BSResources.get(paymentMethod.getId()); + return paymentMethod != null ? BSResources.get(paymentMethod.getId()) : ""; } @Override diff --git a/gui/src/main/java/io/bitsquare/gui/util/FormBuilder.java b/gui/src/main/java/io/bitsquare/gui/util/FormBuilder.java index 333bcd8eda..2e7cadd122 100644 --- a/gui/src/main/java/io/bitsquare/gui/util/FormBuilder.java +++ b/gui/src/main/java/io/bitsquare/gui/util/FormBuilder.java @@ -558,6 +558,20 @@ public class FormBuilder { return new Tuple2<>(label, comboBox); } + public static Tuple2 addLabelSearchComboBox(GridPane gridPane, int rowIndex, String title, double top) { + Label label = null; + if (title != null) + label = addLabel(gridPane, rowIndex, title, top); + + SearchComboBox comboBox = new SearchComboBox(); + GridPane.setRowIndex(comboBox, rowIndex); + GridPane.setColumnIndex(comboBox, 1); + GridPane.setMargin(comboBox, new Insets(top, 0, 0, 0)); + gridPane.getChildren().add(comboBox); + + return new Tuple2<>(label, comboBox); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Label + ComboBox + ComboBox