implement search seller of some items
This commit is contained in:
@@ -3,10 +3,7 @@ package ru.trader.controllers;
|
|||||||
import javafx.beans.property.*;
|
import javafx.beans.property.*;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.scene.control.RadioButton;
|
import javafx.scene.control.*;
|
||||||
import javafx.scene.control.TableView;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import javafx.scene.control.ToggleGroup;
|
|
||||||
import org.controlsfx.control.CheckComboBox;
|
import org.controlsfx.control.CheckComboBox;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.CachedSuggestionProvider;
|
||||||
import ru.trader.view.support.autocomplete.ItemsProvider;
|
import ru.trader.view.support.autocomplete.ItemsProvider;
|
||||||
import ru.trader.view.support.autocomplete.SystemsProvider;
|
import ru.trader.view.support.autocomplete.SystemsProvider;
|
||||||
|
import ru.trader.view.support.cells.ItemListCell;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -41,7 +39,9 @@ public class SearchController {
|
|||||||
private RadioButton rbBuyer;
|
private RadioButton rbBuyer;
|
||||||
@FXML
|
@FXML
|
||||||
private TextField itemText;
|
private TextField itemText;
|
||||||
private AutoCompletion<ItemModel> items;
|
private AutoCompletion<ItemModel> itemField;
|
||||||
|
@FXML
|
||||||
|
private ListView<ItemModel> itemsList;
|
||||||
@FXML
|
@FXML
|
||||||
private NumberField distance;
|
private NumberField distance;
|
||||||
@FXML
|
@FXML
|
||||||
@@ -59,6 +59,8 @@ public class SearchController {
|
|||||||
@FXML
|
@FXML
|
||||||
private void initialize() {
|
private void initialize() {
|
||||||
init();
|
init();
|
||||||
|
itemsList.setItems(FXCollections.observableArrayList());
|
||||||
|
itemsList.setCellFactory(new ItemListCell());
|
||||||
stationTypes.setConverter(new StationTypeStringConverter());
|
stationTypes.setConverter(new StationTypeStringConverter());
|
||||||
stationTypes.getItems().setAll(STATION_TYPE.values());
|
stationTypes.getItems().setAll(STATION_TYPE.values());
|
||||||
services.setConverter(new ServiceTypeStringConverter());
|
services.setConverter(new ServiceTypeStringConverter());
|
||||||
@@ -83,11 +85,11 @@ public class SearchController {
|
|||||||
source.setConverter(provider.getConverter());
|
source.setConverter(provider.getConverter());
|
||||||
}
|
}
|
||||||
ItemsProvider itemsProvider = market.getItemsProvider();
|
ItemsProvider itemsProvider = market.getItemsProvider();
|
||||||
if (items == null){
|
if (itemField == null){
|
||||||
items = new AutoCompletion<>(itemText, new CachedSuggestionProvider<>(itemsProvider), ModelFabric.NONE_ITEM, itemsProvider.getConverter());
|
itemField = new AutoCompletion<>(itemText, new CachedSuggestionProvider<>(itemsProvider), ModelFabric.NONE_ITEM, itemsProvider.getConverter());
|
||||||
} else {
|
} else {
|
||||||
items.setSuggestions(itemsProvider.getPossibleSuggestions());
|
itemField.setSuggestions(itemsProvider.getPossibleSuggestions());
|
||||||
items.setConverter(itemsProvider.getConverter());
|
itemField.setConverter(itemsProvider.getConverter());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,13 +99,19 @@ public class SearchController {
|
|||||||
filter.setDistance(distance.getValue().doubleValue());
|
filter.setDistance(distance.getValue().doubleValue());
|
||||||
stationTypes.getCheckModel().getCheckedItems().forEach(filter::add);
|
stationTypes.getCheckModel().getCheckedItems().forEach(filter::add);
|
||||||
services.getCheckModel().getCheckedItems().forEach(filter::add);
|
services.getCheckModel().getCheckedItems().forEach(filter::add);
|
||||||
ItemModel item = items.getValue();
|
ItemModel item = itemField.getValue();
|
||||||
if (ModelFabric.isFake(item)){
|
Collection<ItemModel> items = itemsList.getItems();
|
||||||
|
if (ModelFabric.isFake(item) && items.isEmpty()){
|
||||||
Collection<StationModel> stations = market.getStations(filter);
|
Collection<StationModel> stations = market.getStations(filter);
|
||||||
fill(stations);
|
fill(stations);
|
||||||
} else {
|
} else {
|
||||||
OFFER_TYPE oType = (OFFER_TYPE) offerType.getSelectedToggle().getUserData();
|
OFFER_TYPE oType = (OFFER_TYPE) offerType.getSelectedToggle().getUserData();
|
||||||
Collection<OfferModel> offers = market.getOffers(oType, item, filter);
|
Collection<OfferModel> offers;
|
||||||
|
if (items.isEmpty()) {
|
||||||
|
offers = market.getOffers(oType, item, filter);
|
||||||
|
} else {
|
||||||
|
offers = market.getOffers(oType, items, filter);
|
||||||
|
}
|
||||||
fill(offers);
|
fill(offers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,6 +136,28 @@ public class SearchController {
|
|||||||
source.setValue(MainController.getProfile().getSystem());
|
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 {
|
public class ResultEntry {
|
||||||
private final StationModel station;
|
private final StationModel station;
|
||||||
private final OfferModel offer;
|
private final OfferModel offer;
|
||||||
|
|||||||
@@ -193,6 +193,10 @@ public class MarketModel {
|
|||||||
return BindingsHelper.observableList(analyzer.getOffers(offerType, ModelFabric.get(item), filter), modeler::get);
|
return BindingsHelper.observableList(analyzer.getOffers(offerType, ModelFabric.get(item), filter), modeler::get);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ObservableList<OfferModel> getOffers(OFFER_TYPE offerType, Collection<ItemModel> items, MarketFilter filter){
|
||||||
|
return BindingsHelper.observableList(analyzer.getOffers(offerType, ModelFabric.get(items), filter), modeler::get);
|
||||||
|
}
|
||||||
|
|
||||||
public ObservableList<StationModel> getStations(){
|
public ObservableList<StationModel> getStations(){
|
||||||
return BindingsHelper.observableList(market.getVendors(), modeler::get);
|
return BindingsHelper.observableList(market.getVendors(), modeler::get);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import java.util.Collection;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ModelFabric {
|
public class ModelFabric {
|
||||||
|
|
||||||
@@ -108,6 +109,10 @@ public class ModelFabric {
|
|||||||
return item.getItem();
|
return item.getItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Collection<Item> get(Collection<ItemModel> items){
|
||||||
|
return items.stream().map(ModelFabric::get).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
public OfferModel get(Offer offer){
|
public OfferModel get(Offer offer){
|
||||||
if (offer == null) return null;
|
if (offer == null) return null;
|
||||||
OfferModel res = null;
|
OfferModel res = null;
|
||||||
|
|||||||
@@ -35,14 +35,22 @@
|
|||||||
</HBox>
|
</HBox>
|
||||||
<Label text="%search.text.item" GridPane.rowIndex="2"/>
|
<Label text="%search.text.item" GridPane.rowIndex="2"/>
|
||||||
<TextField fx:id="itemText" prefWidth="150" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
|
<TextField fx:id="itemText" prefWidth="150" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
|
||||||
<Label text="%search.text.distance" GridPane.rowIndex="3" />
|
<HBox GridPane.columnIndex="1" GridPane.rowIndex="3" spacing="4" alignment="CENTER">
|
||||||
<NumberField fx:id="distance" GridPane.columnIndex="1" GridPane.rowIndex="3" />
|
<ListView fx:id="itemsList" HBox.hgrow="ALWAYS" maxHeight="100"/>
|
||||||
<Label text="%label.station.type" GridPane.rowIndex="4"/>
|
<VBox spacing="4">
|
||||||
<CheckComboBox fx:id="stationTypes" prefWidth="150" GridPane.columnIndex="1" GridPane.rowIndex="4" />
|
<Button prefWidth="30" onAction="#addItem"><graphic><Glyph text="FontAwesome|PLUS"/></graphic></Button>
|
||||||
<Label text="%label.station.services" GridPane.rowIndex="5"/>
|
<Button prefWidth="30" onAction="#removeItem"><graphic><Glyph text="FontAwesome|MINUS"/></graphic></Button>
|
||||||
<CheckComboBox fx:id="services" prefWidth="150" GridPane.columnIndex="1" GridPane.rowIndex="5"/>
|
<Button prefWidth="30" onAction="#clearItems"><graphic><Glyph text="FontAwesome|TRASH"/></graphic></Button>
|
||||||
<Separator GridPane.columnSpan="2" GridPane.rowIndex="6" GridPane.margin="$separator_margin"/>
|
</VBox>
|
||||||
<HBox GridPane.columnSpan="2" GridPane.rowIndex="7" spacing="10" alignment="CENTER">
|
</HBox>
|
||||||
|
<Label text="%search.text.distance" GridPane.rowIndex="4" />
|
||||||
|
<NumberField fx:id="distance" GridPane.columnIndex="1" GridPane.rowIndex="4" />
|
||||||
|
<Label text="%label.station.type" GridPane.rowIndex="5"/>
|
||||||
|
<CheckComboBox fx:id="stationTypes" prefWidth="150" GridPane.columnIndex="1" GridPane.rowIndex="5" />
|
||||||
|
<Label text="%label.station.services" GridPane.rowIndex="6"/>
|
||||||
|
<CheckComboBox fx:id="services" prefWidth="150" GridPane.columnIndex="1" GridPane.rowIndex="6"/>
|
||||||
|
<Separator GridPane.columnSpan="2" GridPane.rowIndex="7" GridPane.margin="$separator_margin"/>
|
||||||
|
<HBox GridPane.columnSpan="2" GridPane.rowIndex="8" spacing="10" alignment="CENTER">
|
||||||
<Button text="%search.button.find" onAction="#searchStations" />
|
<Button text="%search.button.find" onAction="#searchStations" />
|
||||||
</HBox>
|
</HBox>
|
||||||
</GridPane>
|
</GridPane>
|
||||||
|
|||||||
@@ -3,8 +3,11 @@ package ru.trader.analysis;
|
|||||||
import ru.trader.core.*;
|
import ru.trader.core.*;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.NavigableSet;
|
import java.util.NavigableSet;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class FilteredMarket {
|
public class FilteredMarket {
|
||||||
@@ -90,6 +93,33 @@ public class FilteredMarket {
|
|||||||
return res.filter(o -> !MarketUtils.isIncorrect(o) && !filter.isFiltered(o));
|
return res.filter(o -> !MarketUtils.isIncorrect(o) && !filter.isFiltered(o));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stream<Offer> getOffers(OFFER_TYPE offerType, Collection<Item> items){
|
||||||
|
final Set<Vendor> vendors = new HashSet<>();
|
||||||
|
Stream<Offer> res = null;
|
||||||
|
for (Item item : items) {
|
||||||
|
NavigableSet<Offer> offers = market.getStat(offerType, item).getOffers();
|
||||||
|
Stream<Offer> s;
|
||||||
|
if (offerType.getOrder() > 0)
|
||||||
|
s = offers.stream().filter(o -> vendors.contains(o.getVendor()));
|
||||||
|
else
|
||||||
|
s = offers.descendingSet().stream().filter(o -> vendors.contains(o.getVendor()));
|
||||||
|
|
||||||
|
Collection<Vendor> v = offers.stream().map(Offer::getVendor).collect(Collectors.toList());
|
||||||
|
if (res == null){
|
||||||
|
res = s;
|
||||||
|
vendors.addAll(v);
|
||||||
|
} else {
|
||||||
|
res = Stream.concat(res, s);
|
||||||
|
vendors.retainAll(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (res == null) return Stream.empty();
|
||||||
|
if (disableFilter){
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return res.filter(o -> !MarketUtils.isIncorrect(o) && !filter.isFiltered(o));
|
||||||
|
}
|
||||||
|
|
||||||
public FilteredVendor getFiltered(Vendor vendor){
|
public FilteredVendor getFiltered(Vendor vendor){
|
||||||
return new FilteredVendor(vendor, filter.getFilter(vendor));
|
return new FilteredVendor(vendor, filter.getFilter(vendor));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ public class MarketAnalyzer {
|
|||||||
return market.getOffers(offerType, item).filter(o -> !filter.isFiltered(o.getVendor())).collect(Collectors.toList());
|
return market.getOffers(offerType, item).filter(o -> !filter.isFiltered(o.getVendor())).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Offer> getOffers(OFFER_TYPE offerType, Collection<Item> items, MarketFilter filter){
|
||||||
|
return market.getOffers(offerType, items).filter(o -> !filter.isFiltered(o.getVendor())).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
public List<Vendor> getVendors(MarketFilter filter){
|
public List<Vendor> getVendors(MarketFilter filter){
|
||||||
return market.getVendors().filter(v -> !filter.isFiltered(v)).collect(Collectors.toList());
|
return market.getVendors().filter(v -> !filter.isFiltered(v)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user