diff --git a/client/src/main/java/ru/trader/controllers/SearchController.java b/client/src/main/java/ru/trader/controllers/SearchController.java index ef980d6..732516d 100644 --- a/client/src/main/java/ru/trader/controllers/SearchController.java +++ b/client/src/main/java/ru/trader/controllers/SearchController.java @@ -3,10 +3,7 @@ package ru.trader.controllers; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.fxml.FXML; -import javafx.scene.control.RadioButton; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField; -import javafx.scene.control.ToggleGroup; +import javafx.scene.control.*; import org.controlsfx.control.CheckComboBox; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +21,7 @@ import ru.trader.view.support.autocomplete.AutoCompletion; import ru.trader.view.support.autocomplete.CachedSuggestionProvider; import ru.trader.view.support.autocomplete.ItemsProvider; import ru.trader.view.support.autocomplete.SystemsProvider; +import ru.trader.view.support.cells.ItemListCell; import java.util.Collection; import java.util.List; @@ -41,7 +39,9 @@ public class SearchController { private RadioButton rbBuyer; @FXML private TextField itemText; - private AutoCompletion items; + private AutoCompletion itemField; + @FXML + private ListView itemsList; @FXML private NumberField distance; @FXML @@ -59,6 +59,8 @@ public class SearchController { @FXML private void initialize() { init(); + itemsList.setItems(FXCollections.observableArrayList()); + itemsList.setCellFactory(new ItemListCell()); stationTypes.setConverter(new StationTypeStringConverter()); stationTypes.getItems().setAll(STATION_TYPE.values()); services.setConverter(new ServiceTypeStringConverter()); @@ -83,11 +85,11 @@ public class SearchController { source.setConverter(provider.getConverter()); } ItemsProvider itemsProvider = market.getItemsProvider(); - if (items == null){ - items = new AutoCompletion<>(itemText, new CachedSuggestionProvider<>(itemsProvider), ModelFabric.NONE_ITEM, itemsProvider.getConverter()); + if (itemField == null){ + itemField = new AutoCompletion<>(itemText, new CachedSuggestionProvider<>(itemsProvider), ModelFabric.NONE_ITEM, itemsProvider.getConverter()); } else { - items.setSuggestions(itemsProvider.getPossibleSuggestions()); - items.setConverter(itemsProvider.getConverter()); + itemField.setSuggestions(itemsProvider.getPossibleSuggestions()); + itemField.setConverter(itemsProvider.getConverter()); } } @@ -97,13 +99,19 @@ public class SearchController { filter.setDistance(distance.getValue().doubleValue()); stationTypes.getCheckModel().getCheckedItems().forEach(filter::add); services.getCheckModel().getCheckedItems().forEach(filter::add); - ItemModel item = items.getValue(); - if (ModelFabric.isFake(item)){ + ItemModel item = itemField.getValue(); + Collection items = itemsList.getItems(); + if (ModelFabric.isFake(item) && items.isEmpty()){ Collection stations = market.getStations(filter); fill(stations); } else { OFFER_TYPE oType = (OFFER_TYPE) offerType.getSelectedToggle().getUserData(); - Collection offers = market.getOffers(oType, item, filter); + Collection offers; + if (items.isEmpty()) { + offers = market.getOffers(oType, item, filter); + } else { + offers = market.getOffers(oType, items, filter); + } fill(offers); } } @@ -128,6 +136,28 @@ public class SearchController { source.setValue(MainController.getProfile().getSystem()); } + @FXML + private void addItem(){ + ItemModel item = itemField.getValue(); + if (!ModelFabric.isFake(item)){ + if (itemsList.getItems().contains(item)) return; + itemsList.getItems().add(item); + } + } + + @FXML + private void removeItem(){ + int index = itemsList.getSelectionModel().getSelectedIndex(); + if (index != -1){ + itemsList.getItems().remove(index); + } + } + + @FXML + private void clearItems(){ + itemsList.getItems().clear(); + } + public class ResultEntry { private final StationModel station; private final OfferModel offer; diff --git a/client/src/main/java/ru/trader/model/MarketModel.java b/client/src/main/java/ru/trader/model/MarketModel.java index 138a96d..4601f65 100644 --- a/client/src/main/java/ru/trader/model/MarketModel.java +++ b/client/src/main/java/ru/trader/model/MarketModel.java @@ -193,6 +193,10 @@ public class MarketModel { return BindingsHelper.observableList(analyzer.getOffers(offerType, ModelFabric.get(item), filter), modeler::get); } + public ObservableList getOffers(OFFER_TYPE offerType, Collection items, MarketFilter filter){ + return BindingsHelper.observableList(analyzer.getOffers(offerType, ModelFabric.get(items), filter), modeler::get); + } + public ObservableList getStations(){ return BindingsHelper.observableList(market.getVendors(), modeler::get); } diff --git a/client/src/main/java/ru/trader/model/ModelFabric.java b/client/src/main/java/ru/trader/model/ModelFabric.java index cb2eb9e..7871fbc 100644 --- a/client/src/main/java/ru/trader/model/ModelFabric.java +++ b/client/src/main/java/ru/trader/model/ModelFabric.java @@ -13,6 +13,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; public class ModelFabric { @@ -108,6 +109,10 @@ public class ModelFabric { return item.getItem(); } + public static Collection get(Collection items){ + return items.stream().map(ModelFabric::get).collect(Collectors.toList()); + } + public OfferModel get(Offer offer){ if (offer == null) return null; OfferModel res = null; diff --git a/client/src/main/resources/view/search.fxml b/client/src/main/resources/view/search.fxml index 2541caf..0d5aae3 100644 --- a/client/src/main/resources/view/search.fxml +++ b/client/src/main/resources/view/search.fxml @@ -35,14 +35,22 @@