From a23ac408d9579c28f8dabb94c14ecb3761a7172b Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 24 Apr 2016 18:30:00 +0300 Subject: [PATCH] change items combobox to autocomplete fields --- .../controllers/MissionsController.java | 29 ++++---- .../trader/controllers/SearchController.java | 66 +++++++------------ .../java/ru/trader/model/MarketModel.java | 18 +++++ .../support/autocomplete/AutoCompletion.java | 1 + .../ItemStringConverter.java | 11 +++- .../support/autocomplete/ItemsProvider.java | 36 ++++++++++ client/src/main/resources/view/missions.fxml | 9 +-- client/src/main/resources/view/search.fxml | 8 ++- 8 files changed, 113 insertions(+), 65 deletions(-) rename client/src/main/java/ru/trader/view/support/{ => autocomplete}/ItemStringConverter.java (53%) create mode 100644 client/src/main/java/ru/trader/view/support/autocomplete/ItemsProvider.java diff --git a/client/src/main/java/ru/trader/controllers/MissionsController.java b/client/src/main/java/ru/trader/controllers/MissionsController.java index c22b048..a5153a2 100644 --- a/client/src/main/java/ru/trader/controllers/MissionsController.java +++ b/client/src/main/java/ru/trader/controllers/MissionsController.java @@ -3,7 +3,6 @@ package ru.trader.controllers; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; @@ -12,6 +11,7 @@ import ru.trader.view.support.DurationField; import ru.trader.view.support.NumberField; 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.StationsProvider; import java.time.Duration; @@ -23,7 +23,8 @@ public class MissionsController { private TextField starportText; private AutoCompletion starport; @FXML - private ComboBox cargo; + private TextField itemText; + private AutoCompletion cargo; @FXML private NumberField quantity; @FXML @@ -55,7 +56,7 @@ public class MissionsController { if (courierBtn.equals(n)){ missionType = MISSION_TYPE.COURIER; starportText.setDisable(false); - cargo.setDisable(true); + itemText.setDisable(true); quantity.setDisable(true); leftTime.setDisable(false); reward.setDisable(false); @@ -63,7 +64,7 @@ public class MissionsController { if (deliveryBtn.equals(n)){ missionType = MISSION_TYPE.DELIVERY; starportText.setDisable(false); - cargo.setDisable(true); + itemText.setDisable(true); quantity.setDisable(false); leftTime.setDisable(false); reward.setDisable(false); @@ -74,14 +75,14 @@ public class MissionsController { starport.setValue(station); } starportText.setDisable(false); - cargo.setDisable(false); + itemText.setDisable(false); quantity.setDisable(false); leftTime.setDisable(false); reward.setDisable(false); } else { missionType = null; starportText.setDisable(true); - cargo.setDisable(true); + itemText.setDisable(true); quantity.setDisable(true); leftTime.setDisable(true); reward.setDisable(true); @@ -95,7 +96,6 @@ public class MissionsController { void init(){ MarketModel world = MainController.getWorld(); - cargo.setItems(world.itemsProperty()); StationsProvider provider = new StationsProvider(world); if (starport == null){ starport = new AutoCompletion<>(starportText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_STATION, provider.getConverter()); @@ -103,14 +103,21 @@ public class MissionsController { starport.setSuggestions(provider.getPossibleSuggestions()); starport.setConverter(provider.getConverter()); } + ItemsProvider itemsProvider = new ItemsProvider(world); + if (cargo == null){ + cargo = new AutoCompletion<>(itemText, new CachedSuggestionProvider<>(itemsProvider), ModelFabric.NONE_ITEM, itemsProvider.getConverter()); + } else { + cargo.setSuggestions(itemsProvider.getPossibleSuggestions()); + cargo.setConverter(itemsProvider.getConverter()); + } } void setStations(ObservableList stationNames) { starport.setSuggestions(stationNames); } - void setItems(ObservableList items){ - cargo.setItems(items); + void setItems(ObservableList itemNames){ + cargo.setSuggestions(itemNames); } public void add(){ @@ -119,13 +126,13 @@ public class MissionsController { long count = quantity.getValue().longValue(); Duration time = leftTime.getValue(); double profit = reward.getValue().doubleValue(); - if (station != null && profit > 0){ + if (!ModelFabric.isFake(station) && profit > 0){ switch (missionType){ case COURIER: missions.add(new MissionModel(station, time, profit)); break; case DELIVERY: if (count > 0) missions.add(new MissionModel(station, count, time, profit)); break; - case SUPPLY: if (item != null && count > 0) missions.add(new MissionModel(station, item, count, time, profit)); + case SUPPLY: if (!ModelFabric.isFake(item) && count > 0) missions.add(new MissionModel(station, item, count, time, profit)); break; } } diff --git a/client/src/main/java/ru/trader/controllers/SearchController.java b/client/src/main/java/ru/trader/controllers/SearchController.java index 8bae9d5..ef980d6 100644 --- a/client/src/main/java/ru/trader/controllers/SearchController.java +++ b/client/src/main/java/ru/trader/controllers/SearchController.java @@ -2,10 +2,11 @@ package ru.trader.controllers; import javafx.beans.property.*; import javafx.collections.FXCollections; -import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.scene.control.*; -import javafx.util.StringConverter; +import javafx.scene.control.RadioButton; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.scene.control.ToggleGroup; import org.controlsfx.control.CheckComboBox; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,8 +22,8 @@ import ru.trader.view.support.ServiceTypeStringConverter; import ru.trader.view.support.StationTypeStringConverter; 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.CustomListCell; import java.util.Collection; import java.util.List; @@ -39,7 +40,8 @@ public class SearchController { @FXML private RadioButton rbBuyer; @FXML - private ComboBox items; + private TextField itemText; + private AutoCompletion items; @FXML private NumberField distance; @FXML @@ -50,7 +52,6 @@ public class SearchController { private TableView tblResults; private final List results = FXCollections.observableArrayList(); - private final ObservableList itemsList = FXCollections.observableArrayList(); private final ToggleGroup offerType = new ToggleGroup(); private MarketModel market; @@ -67,20 +68,7 @@ public class SearchController { rbSeller.setToggleGroup(offerType); rbSeller.setUserData(OFFER_TYPE.SELL); rbSeller.setSelected(true); - items.setCellFactory(new CustomListCell<>(ItemModel::getName)); - items.setConverter(new StringConverter() { - @Override - public String toString(ItemModel item) { - return item.getName(); - } - - @Override - public ItemModel fromString(String string) { - throw new UnsupportedOperationException("Is not editable field"); - } - }); BindingsHelper.setTableViewItems(tblResults, results); - items.setItems(itemsList); } void init(){ @@ -88,20 +76,19 @@ public class SearchController { market = MainController.getMarket(); market.getNotificator().add(searchChangeListener); SystemsProvider provider = market.getSystemsProvider(); - if (source != null) source.dispose(); - source = new AutoCompletion<>(sourceText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter()); - itemsList.clear(); - itemsList.add(ModelFabric.NONE_ITEM); - itemsList.addAll(market.itemsProperty().get()); - } - - - private void addItem(ItemModel item){ - itemsList.add(item); - } - - private void removeItem(ItemModel item){ - itemsList.remove(item); + if (source == null) { + source = new AutoCompletion<>(sourceText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter()); + } else { + source.setSuggestions(provider.getPossibleSuggestions()); + source.setConverter(provider.getConverter()); + } + ItemsProvider itemsProvider = market.getItemsProvider(); + if (items == null){ + items = new AutoCompletion<>(itemText, new CachedSuggestionProvider<>(itemsProvider), ModelFabric.NONE_ITEM, itemsProvider.getConverter()); + } else { + items.setSuggestions(itemsProvider.getPossibleSuggestions()); + items.setConverter(itemsProvider.getConverter()); + } } @FXML @@ -136,7 +123,10 @@ public class SearchController { } } - + @FXML + private void currentAsSource(){ + source.setValue(MainController.getProfile().getSystem()); + } public class ResultEntry { private final StationModel station; @@ -193,15 +183,7 @@ public class SearchController { } private final ChangeMarketListener searchChangeListener = new ChangeMarketListener() { - @Override - public void add(ItemModel item) { - addItem(item); - } - @Override - public void remove(ItemModel item) { - removeItem(item); - } }; } diff --git a/client/src/main/java/ru/trader/model/MarketModel.java b/client/src/main/java/ru/trader/model/MarketModel.java index 7fd2be6..138a96d 100644 --- a/client/src/main/java/ru/trader/model/MarketModel.java +++ b/client/src/main/java/ru/trader/model/MarketModel.java @@ -20,6 +20,7 @@ import ru.trader.model.support.Notificator; import ru.trader.services.OrdersSearchTask; import ru.trader.services.RoutesSearchTask; import ru.trader.view.support.Localization; +import ru.trader.view.support.autocomplete.ItemsProvider; import ru.trader.view.support.autocomplete.StationsProvider; import ru.trader.view.support.autocomplete.SystemsProvider; @@ -40,8 +41,10 @@ public class MarketModel { private final ObservableList systemNames; private final ObservableList stationNames; + private final ObservableList itemNames; private final SystemsProvider systemsProvider; private final StationsProvider stationsProvider; + private final ItemsProvider itemsProvider; private final ListProperty groups; private final ListProperty items; @@ -55,8 +58,11 @@ public class MarketModel { items.sort(ItemModel::compareTo); systemNames = new SimpleListProperty<>(FXCollections.observableArrayList(market.getPlaceNames())); stationNames = new SimpleListProperty<>(FXCollections.observableArrayList(market.getVendorNames())); + List iNames = items.stream().map(ItemModel::getName).collect(Collectors.toList()); + itemNames = new SimpleListProperty<>(FXCollections.observableArrayList(iNames)); systemsProvider = new SystemsProvider(this); stationsProvider = new StationsProvider(this); + itemsProvider = new ItemsProvider(this); } public MarketAnalyzer getAnalyzer() { @@ -79,6 +85,10 @@ public class MarketModel { return stationNames; } + public ObservableList getItemNames() { + return itemNames; + } + public SystemsProvider getSystemsProvider() { return systemsProvider; } @@ -87,6 +97,10 @@ public class MarketModel { return stationsProvider; } + public ItemsProvider getItemsProvider() { + return itemsProvider; + } + public SystemModel get(String name){ Place s = market.get(name); if (s == null){ @@ -159,6 +173,7 @@ public class MarketModel { LOG.info("Add item {} to market {}", item, this); notificator.sendAdd(item); items.add(item); + itemNames.add(item.getName()); return item; } @@ -167,6 +182,7 @@ public class MarketModel { market.remove(ModelFabric.get(item)); notificator.sendRemove(item); items.remove(item); + itemNames.remove(item.getName()); } ItemStat getStat(OFFER_TYPE type, Item item){ @@ -333,5 +349,7 @@ public class MarketModel { groups.get().forEach(GroupModel::updateName); items.get().forEach(ItemModel::updateName); items.sort(ItemModel::compareTo); + List iNames = items.stream().map(ItemModel::getName).collect(Collectors.toList()); + itemNames.setAll(iNames); } } diff --git a/client/src/main/java/ru/trader/view/support/autocomplete/AutoCompletion.java b/client/src/main/java/ru/trader/view/support/autocomplete/AutoCompletion.java index 4367654..34eba02 100644 --- a/client/src/main/java/ru/trader/view/support/autocomplete/AutoCompletion.java +++ b/client/src/main/java/ru/trader/view/support/autocomplete/AutoCompletion.java @@ -38,6 +38,7 @@ public class AutoCompletion { this.converter = converter; this.notFoundItem = notFoundItem; this.suggestionProvider = suggestionProvider; + completion.setValue(notFoundItem); binding = new AutoTextFieldBinding(textField, suggestionProvider); binding.setOnAutoCompleted(e -> completion.setValue(converter.fromString(e.getCompletion()))); } diff --git a/client/src/main/java/ru/trader/view/support/ItemStringConverter.java b/client/src/main/java/ru/trader/view/support/autocomplete/ItemStringConverter.java similarity index 53% rename from client/src/main/java/ru/trader/view/support/ItemStringConverter.java rename to client/src/main/java/ru/trader/view/support/autocomplete/ItemStringConverter.java index 32c2141..9ff362b 100644 --- a/client/src/main/java/ru/trader/view/support/ItemStringConverter.java +++ b/client/src/main/java/ru/trader/view/support/autocomplete/ItemStringConverter.java @@ -1,13 +1,18 @@ -package ru.trader.view.support; +package ru.trader.view.support.autocomplete; import javafx.util.StringConverter; -import ru.trader.controllers.MainController; import ru.trader.model.ItemModel; +import ru.trader.model.MarketModel; import java.util.Optional; public class ItemStringConverter extends StringConverter { + private final MarketModel market; + + public ItemStringConverter(MarketModel market) { + this.market = market; + } @Override public String toString(ItemModel item) { @@ -16,7 +21,7 @@ public class ItemStringConverter extends StringConverter { @Override public ItemModel fromString(String name) { - Optional item = MainController.getWorld().itemsProperty().stream().filter(i -> i.getName().equals(name)).findAny(); + Optional item = market.itemsProperty().stream().filter(i -> i.getName().equals(name)).findAny(); return item.orElse(null); } } diff --git a/client/src/main/java/ru/trader/view/support/autocomplete/ItemsProvider.java b/client/src/main/java/ru/trader/view/support/autocomplete/ItemsProvider.java new file mode 100644 index 0000000..d6900a6 --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/autocomplete/ItemsProvider.java @@ -0,0 +1,36 @@ +package ru.trader.view.support.autocomplete; + +import javafx.util.StringConverter; +import org.controlsfx.control.textfield.AutoCompletionBinding; +import ru.trader.model.ItemModel; +import ru.trader.model.MarketModel; + +import java.util.Comparator; + +public class ItemsProvider extends AbstractSuggestionProvider { + + private final StringConverter converter; + private final Comparator comparator; + + + public ItemsProvider(MarketModel market) { + super(market.getItemNames()); + converter = new ItemStringConverter(market); + comparator = (i1, i2) -> i1.toLowerCase().compareTo(i2.toLowerCase()); + } + + @Override + protected Comparator getComparator() { + return comparator; + } + + @Override + protected boolean isMatch(String suggestion, AutoCompletionBinding.ISuggestionRequest request) { + String s = suggestion.toLowerCase(); + return s.startsWith(request.getUserText().toLowerCase()); + } + + public StringConverter getConverter() { + return converter; + } +} diff --git a/client/src/main/resources/view/missions.fxml b/client/src/main/resources/view/missions.fxml index 85d5d87..ad88efa 100644 --- a/client/src/main/resources/view/missions.fxml +++ b/client/src/main/resources/view/missions.fxml @@ -3,10 +3,8 @@ - - - + @@ -37,10 +35,7 @@