Archived
0

optimise memory using

This commit is contained in:
iMoHax
2015-10-15 15:10:00 +03:00
parent f7bc506508
commit 61e7b3a9cb
37 changed files with 599 additions and 324 deletions

View File

@@ -121,9 +121,9 @@ public class EMDNUpdater {
@Override @Override
public void run() { public void run() {
market.systemsProperty().get().forEach(system -> { market.getSystemNames().forEach(system -> {
LOG.trace("Auto update {}", system); LOG.trace("Auto update {}", system);
Station emdnData = emdn.pop(system.getName()); Station emdnData = emdn.pop(system);
if (emdnData != null){ if (emdnData != null){
//TODO: implement new model //TODO: implement new model
//updater.init(system); //updater.init(system);

View File

@@ -1,6 +1,5 @@
package ru.trader.controllers; package ru.trader.controllers;
import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.control.*; import javafx.scene.control.*;
@@ -15,6 +14,9 @@ import ru.trader.model.SystemModel;
import ru.trader.model.support.BindingsHelper; import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Localization; import ru.trader.view.support.Localization;
import ru.trader.view.support.NumberField; 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.SystemsProvider;
import ru.trader.view.support.cells.CustomListCell; import ru.trader.view.support.cells.CustomListCell;
import java.util.Optional; import java.util.Optional;
@@ -22,15 +24,17 @@ public class FilterController {
private final static Logger LOG = LoggerFactory.getLogger(FilterController.class); private final static Logger LOG = LoggerFactory.getLogger(FilterController.class);
@FXML @FXML
private ComboBox<SystemModel> center; private TextField centerText;
private AutoCompletion<SystemModel> center;
@FXML @FXML
private NumberField radius; private NumberField radius;
@FXML @FXML
private NumberField distance; private NumberField distance;
@FXML @FXML
private ComboBox<SystemModel> system; private TextField systemText;
private AutoCompletion<SystemModel> system;
@FXML @FXML
private ComboBox<StationModel> station; private ComboBox<String> station;
@FXML @FXML
private CheckBox cbMarket; private CheckBox cbMarket;
@FXML @FXML
@@ -56,15 +60,29 @@ public class FilterController {
@FXML @FXML
private void initialize(){ private void initialize(){
system.valueProperty().addListener((ov, o, n) -> station.setItems(n.getStationsList()));
excludes.setCellFactory(new CustomListCell<>(s -> String.format("%s (%s)", s.getSystem().getName(), s.getName())));
init(); init();
excludes.setCellFactory(new CustomListCell<>(s -> String.format("%s (%s)", s.getSystem().getName(), s.getName())));
system.valueProperty().addListener((ov, o, n) -> {
station.setItems(n.getStationNamesList());
station.getSelectionModel().selectFirst();
});
} }
void init(){ void init(){
market = MainController.getMarket(); market = MainController.getMarket();
center.setItems(market.systemsListProperty()); SystemsProvider provider = market.getSystemsProvider();
system.setItems(market.systemsProperty()); if (system == null){
system = new AutoCompletion<>(systemText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system.setSuggestions(provider.getPossibleSuggestions());
system.setConverter(provider.getConverter());
}
if (center == null){
center = new AutoCompletion<>(centerText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
center.setSuggestions(provider.getPossibleSuggestions());
center.setConverter(provider.getConverter());
}
} }
private void createDialog(Parent owner, Parent content){ private void createDialog(Parent owner, Parent content){
@@ -102,7 +120,7 @@ public class FilterController {
private void clear(){ private void clear(){
this.filter = null; this.filter = null;
center.getSelectionModel().clearSelection(); center.setValue(ModelFabric.NONE_SYSTEM);
radius.clear(); radius.clear();
distance.clear(); distance.clear();
excludes.getItems().clear(); excludes.getItems().clear();
@@ -111,7 +129,7 @@ public class FilterController {
private void save() { private void save() {
SystemModel s = center.getValue(); SystemModel s = center.getValue();
LOG.trace("Old filter", filter); LOG.trace("Old filter", filter);
filter.setCenter(s == ModelFabric.NONE_SYSTEM ? null : market.getModeler().get(s)); filter.setCenter(ModelFabric.isFake(s) ? null : market.getModeler().get(s));
filter.setRadius(radius.getValue().doubleValue()); filter.setRadius(radius.getValue().doubleValue());
filter.setDistance(distance.getValue().doubleValue()); filter.setDistance(distance.getValue().doubleValue());
if (cbMarket.isSelected()) filter.add(SERVICE_TYPE.MARKET); else filter.remove(SERVICE_TYPE.MARKET); if (cbMarket.isSelected()) filter.add(SERVICE_TYPE.MARKET); else filter.remove(SERVICE_TYPE.MARKET);
@@ -145,11 +163,12 @@ public class FilterController {
return result; return result;
} }
public void add(ActionEvent actionEvent) { @FXML
private void add() {
SystemModel s = system.getValue(); SystemModel s = system.getValue();
if (s != null){ if (s != null){
StationModel st = station.getValue(); StationModel st = s.get(station.getValue());
if (st != null && st != ModelFabric.NONE_STATION){ if (!ModelFabric.isFake(st)){
excludes.getItems().add(st); excludes.getItems().add(st);
} else { } else {
excludes.getItems().addAll(s.getStations()); excludes.getItems().addAll(s.getStations());
@@ -157,14 +176,16 @@ public class FilterController {
} }
} }
public void remove(ActionEvent actionEvent) { @FXML
private void remove() {
int index = excludes.getSelectionModel().getSelectedIndex(); int index = excludes.getSelectionModel().getSelectedIndex();
if (index >= 0){ if (index >= 0){
excludes.getItems().remove(index); excludes.getItems().remove(index);
} }
} }
public void clean(ActionEvent actionEvent) { @FXML
private void clean() {
excludes.getItems().clear(); excludes.getItems().clear();
} }

View File

@@ -101,6 +101,7 @@ public class MainController {
} }
public void setMarket(MarketModel market) { public void setMarket(MarketModel market) {
market.getNotificator().clear();
MainController.market = market; MainController.market = market;
Screeners.reinitAll(); Screeners.reinitAll();
} }

View File

@@ -10,8 +10,11 @@ import javafx.scene.control.TextField;
import ru.trader.model.*; import ru.trader.model.*;
import ru.trader.view.support.NumberField; import ru.trader.view.support.NumberField;
import ru.trader.view.support.autocomplete.AutoCompletion; import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.StationsProvider; import ru.trader.view.support.autocomplete.StationsProvider;
import java.util.Collection;
public class MissionsController { public class MissionsController {
@FXML @FXML
@@ -43,8 +46,6 @@ public class MissionsController {
private final ObservableList<MissionModel> missions; private final ObservableList<MissionModel> missions;
private StationModel station; private StationModel station;
private StationsProvider receiverProvider;
private StationsProvider buyerProvider;
public MissionsController() { public MissionsController() {
missions = FXCollections.observableArrayList(); missions = FXCollections.observableArrayList();
@@ -52,16 +53,11 @@ public class MissionsController {
@FXML @FXML
private void initialize(){ private void initialize(){
MarketModel world = MainController.getWorld(); init();
receiverProvider = new StationsProvider(world); addCourierBtn.disableProperty().bind(Bindings.createBooleanBinding(() -> receiver.getValue() == null, receiver.valueProperty())
receiver = new AutoCompletion<>(receiverText, receiverProvider, ModelFabric.NONE_STATION, receiverProvider.getConverter());
buyerProvider = new StationsProvider(world);
buyer = new AutoCompletion<>(buyerText, buyerProvider, ModelFabric.NONE_STATION, buyerProvider.getConverter());
item.setItems(world.itemsProperty());
addCourierBtn.disableProperty().bind(Bindings.createBooleanBinding(() -> receiver.getCompletion() == null, receiver.completionProperty())
.or(courierProfit.wrongProperty()) .or(courierProfit.wrongProperty())
); );
addDeliveryBtn.disableProperty().bind(Bindings.createBooleanBinding(() -> buyer.getCompletion() == null, buyer.completionProperty()) addDeliveryBtn.disableProperty().bind(Bindings.createBooleanBinding(() -> buyer.getValue() == null, buyer.valueProperty())
.or(deliveryCount.wrongProperty()) .or(deliveryCount.wrongProperty())
.or(deliveryProfit.wrongProperty()) .or(deliveryProfit.wrongProperty())
); );
@@ -71,21 +67,36 @@ public class MissionsController {
); );
} }
StationsProvider getReceiverProvider() { void init(){
return receiverProvider; MarketModel world = MainController.getWorld();
item.setItems(world.itemsProperty());
StationsProvider provider = new StationsProvider(world);
if (receiver == null){
receiver = new AutoCompletion<>(receiverText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_STATION, provider.getConverter());
} else {
receiver.setSuggestions(provider.getPossibleSuggestions());
receiver.setConverter(provider.getConverter());
}
if (buyer == null){
buyer = new AutoCompletion<>(buyerText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_STATION, provider.getConverter());
} else {
buyer.setSuggestions(provider.getPossibleSuggestions());
buyer.setConverter(provider.getConverter());
}
} }
StationsProvider getBuyerProvider() { void setStations(ObservableList<String> stationNames) {
return buyerProvider; receiver.setSuggestions(stationNames);
buyer.setSuggestions(stationNames);
} }
ComboBox<ItemModel> getItem() { void setItems(ObservableList<ItemModel> items){
return item; item.setItems(items);
} }
@FXML @FXML
private void addCourier(){ private void addCourier(){
StationModel station = receiver.getCompletion(); StationModel station = receiver.getValue();
double profit = courierProfit.getValue().doubleValue(); double profit = courierProfit.getValue().doubleValue();
if (station != null && profit > 0){ if (station != null && profit > 0){
missions.add(new MissionModel(station, profit)); missions.add(new MissionModel(station, profit));
@@ -94,7 +105,7 @@ public class MissionsController {
@FXML @FXML
private void addDelivery(){ private void addDelivery(){
StationModel station = buyer.getCompletion(); StationModel station = buyer.getValue();
long count = deliveryCount.getValue().longValue(); long count = deliveryCount.getValue().longValue();
double profit = deliveryProfit.getValue().doubleValue(); double profit = deliveryProfit.getValue().doubleValue();
if (station != null && profit > 0){ if (station != null && profit > 0){

View File

@@ -17,6 +17,9 @@ import ru.trader.model.support.ChangeMarketListener;
import ru.trader.view.support.FactionStringConverter; import ru.trader.view.support.FactionStringConverter;
import ru.trader.view.support.GovernmentStringConverter; import ru.trader.view.support.GovernmentStringConverter;
import ru.trader.view.support.ViewUtils; import ru.trader.view.support.ViewUtils;
import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.List; import java.util.List;
@@ -25,12 +28,12 @@ public class OffersController {
private final static Logger LOG = LoggerFactory.getLogger(OffersController.class); private final static Logger LOG = LoggerFactory.getLogger(OffersController.class);
private StationModel station; private StationModel station;
private SystemModel system;
@FXML @FXML
private Insets stationsMargin; private Insets stationsMargin;
@FXML @FXML
private ListView<SystemModel> systems; private TextField systemText;
private AutoCompletion<SystemModel> system;
@FXML @FXML
private SegmentedButton stationsBar; private SegmentedButton stationsBar;
@FXML @FXML
@@ -68,13 +71,10 @@ public class OffersController {
// инициализируем форму данными // инициализируем форму данными
@FXML @FXML
private void initialize() { private void initialize() {
systems.getSelectionModel().selectedItemProperty().addListener((ob, oldValue, newValue) ->{ init();
if (newValue != null){ system.valueProperty().addListener((ob, oldValue, newValue) -> {
LOG.info("Change system to {}", newValue); LOG.info("Change system to {}", newValue);
fillDetails(newValue); fillDetails(newValue);
} else {
systems.getSelectionModel().select(oldValue);
}
}); });
stationsGrp.selectedToggleProperty().addListener((v, o, n) -> { stationsGrp.selectedToggleProperty().addListener((v, o, n) -> {
if (n != null){ if (n != null){
@@ -103,23 +103,26 @@ public class OffersController {
}); });
BindingsHelper.setTableViewItems(tblSell, sells); BindingsHelper.setTableViewItems(tblSell, sells);
BindingsHelper.setTableViewItems(tblBuy, buys); BindingsHelper.setTableViewItems(tblBuy, buys);
init();
} }
void init(){ void init(){
station = null; station = null;
system = null;
MarketModel market = MainController.getMarket(); MarketModel market = MainController.getMarket();
market.getNotificator().add(new OffersChangeListener()); //TODO: create global notificator
systems.setItems(market.systemsProperty()); market.getNotificator().add(offersChangeListener);
systems.getSelectionModel().selectFirst(); SystemsProvider provider = market.getSystemsProvider();
if (system == null){
system = new AutoCompletion<>(systemText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system.setSuggestions(provider.getPossibleSuggestions());
system.setConverter(provider.getConverter());
}
} }
private void fillDetails(SystemModel system){ private void fillDetails(SystemModel system){
this.system = system; if (ModelFabric.isFake(system)) return;
List<StationModel> stations = system.getStations();
stationsBar.getButtons().clear(); stationsBar.getButtons().clear();
List<StationModel> stations = system.getStations();
stations.forEach(s -> stationsBar.getButtons().add(buildStationNode(s))); stations.forEach(s -> stationsBar.getButtons().add(buildStationNode(s)));
if (!stations.isEmpty()){ if (!stations.isEmpty()){
stationsBar.getButtons().get(0).setSelected(true); stationsBar.getButtons().get(0).setSelected(true);
@@ -186,19 +189,21 @@ public class OffersController {
} }
public SystemModel getSystem() { public SystemModel getSystem() {
return system; return system.getValue();
} }
public StationModel getStation() { public StationModel getStation() {
return station; return station;
} }
public void addStation(ActionEvent actionEvent) { @FXML
Screeners.showAddStation(system); private void addStation() {
Screeners.showAddStation(getSystem());
} }
public void editStation(ActionEvent actionEvent) { @FXML
Screeners.showEditStation(station); private void editStation() {
Screeners.showEditStation(getStation());
} }
@@ -226,10 +231,11 @@ public class OffersController {
tblBuy.getItems().forEach(OfferModel::refresh); tblBuy.getItems().forEach(OfferModel::refresh);
} }
private class OffersChangeListener extends ChangeMarketListener { private final ChangeMarketListener offersChangeListener = new ChangeMarketListener() {
@Override @Override
public void priceChange(OfferModel offer, double oldPrice, double newPrice) { public void priceChange(OfferModel offer, double oldPrice, double newPrice) {
StationModel station = getStation();
if (station.hasBuy(offer.getItem()) || station.hasSell(offer.getItem())){ if (station.hasBuy(offer.getItem()) || station.hasSell(offer.getItem())){
ViewUtils.doFX(OffersController.this::sort); ViewUtils.doFX(OffersController.this::sort);
} }
@@ -237,7 +243,7 @@ public class OffersController {
@Override @Override
public void add(OfferModel offer) { public void add(OfferModel offer) {
if (offer.getStation().equals(station)){ if (offer.getStation().equals(getStation())){
ViewUtils.doFX(()-> addOffer(offer)); ViewUtils.doFX(()-> addOffer(offer));
} }
} }
@@ -253,7 +259,7 @@ public class OffersController {
@Override @Override
public void remove(OfferModel offer) { public void remove(OfferModel offer) {
if (offer.getStation().equals(station)){ if (offer.getStation().equals(getStation())){
ViewUtils.doFX(() -> removeOffer(offer)); ViewUtils.doFX(() -> removeOffer(offer));
} }
} }
@@ -267,6 +273,5 @@ public class OffersController {
sort(); sort();
}); });
} }
};
}
} }

View File

@@ -13,6 +13,7 @@ import ru.trader.model.*;
import ru.trader.view.support.NumberField; import ru.trader.view.support.NumberField;
import ru.trader.view.support.ViewUtils; import ru.trader.view.support.ViewUtils;
import ru.trader.view.support.autocomplete.AutoCompletion; import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider; import ru.trader.view.support.autocomplete.SystemsProvider;
@@ -26,7 +27,7 @@ public class ProfileController {
@FXML @FXML
private TextField systemText; private TextField systemText;
@FXML @FXML
private ComboBox<StationModel> station; private ComboBox<String> station;
@FXML @FXML
private CheckBox docked; private CheckBox docked;
@FXML @FXML
@@ -54,10 +55,15 @@ public class ProfileController {
@FXML @FXML
private void initialize() { private void initialize() {
init();
profile = MainController.getProfile(); profile = MainController.getProfile();
MarketModel world = MainController.getWorld(); system.valueProperty().addListener((ov, o , n) -> {
SystemsProvider provider = new SystemsProvider(world); doAndConsumeChanges(() -> {
system = new AutoCompletion<>(systemText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter()); station.setItems(n.getStationNamesList());
station.getSelectionModel().selectFirst();
});
consumeChanges(() -> {profile.setSystem(n); profile.setStation(ModelFabric.NONE_STATION);});
});
engine.setItems(FXCollections.observableList(Engine.getEngines())); engine.setItems(FXCollections.observableList(Engine.getEngines()));
engine.setConverter(new EngineStringConverter()); engine.setConverter(new EngineStringConverter());
btnAddSystem.setOnAction(e -> { btnAddSystem.setOnAction(e -> {
@@ -102,14 +108,21 @@ public class ProfileController {
ignoreChanges = old; ignoreChanges = old;
} }
void init(){
MarketModel world = MainController.getWorld();
SystemsProvider provider = world.getSystemsProvider();
if (system == null){
system = new AutoCompletion<>(systemText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system.setSuggestions(provider.getPossibleSuggestions());
system.setConverter(provider.getConverter());
}
}
private void initListeners(){ private void initListeners(){
name.textProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setName(n))); name.textProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setName(n)));
balance.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setBalance(n.doubleValue()))); balance.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setBalance(n.doubleValue())));
system.completionProperty().addListener((ov, o , n) -> { station.valueProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setStation(getStation(n))));
doAndConsumeChanges(() -> station.setItems(n.getStationsList()));
consumeChanges(() -> {profile.setSystem(n); profile.setStation(ModelFabric.NONE_STATION);});
});
station.valueProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setStation(n)));
docked.selectedProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setDocked(n))); docked.selectedProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setDocked(n)));
mass.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipMass(n.doubleValue()))); mass.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipMass(n.doubleValue())));
tank.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipTank(n.doubleValue()))); tank.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipTank(n.doubleValue())));
@@ -126,7 +139,7 @@ public class ProfileController {
name.setText(profile.getName()); name.setText(profile.getName());
balance.setValue(profile.getBalance()); balance.setValue(profile.getBalance());
system.setValue(profile.getSystem()); system.setValue(profile.getSystem());
station.setValue(profile.getStation()); station.setValue(profile.getStation().getName());
docked.setSelected(profile.isDocked()); docked.setSelected(profile.isDocked());
mass.setValue(profile.getShipMass()); mass.setValue(profile.getShipMass());
tank.setValue(profile.getShipTank()); tank.setValue(profile.getShipTank());
@@ -136,6 +149,11 @@ public class ProfileController {
bind(); bind();
} }
private StationModel getStation(String name){
SystemModel s = system.getValue();
return s == null ? ModelFabric.NONE_STATION : s.get(name);
}
private void bind(){ private void bind(){
profile.nameProperty().addListener(nameListener); profile.nameProperty().addListener(nameListener);
profile.balanceProperty().addListener(balanceListener); profile.balanceProperty().addListener(balanceListener);
@@ -146,9 +164,7 @@ public class ProfileController {
profile.shipTankProperty().addListener(tankListener); profile.shipTankProperty().addListener(tankListener);
profile.shipCargoProperty().addListener(cargoListener); profile.shipCargoProperty().addListener(cargoListener);
profile.shipEngineProperty().addListener(engineListener); profile.shipEngineProperty().addListener(engineListener);
jumpRange.textProperty().bind(Bindings.createStringBinding(()-> { jumpRange.textProperty().bind(Bindings.createStringBinding(()-> String.format("%.1f - %.1f", profile.getShipJumpRange(), profile.getMaxShipJumpRange()),
return String.format("%.1f - %.1f", profile.getShipJumpRange(), profile.getMaxShipJumpRange());
},
profile.shipMassProperty(), profile.shipCargoProperty(), profile.shipTankProperty(), profile.shipEngineProperty() profile.shipMassProperty(), profile.shipCargoProperty(), profile.shipTankProperty(), profile.shipEngineProperty()
)); ));
} }
@@ -170,7 +186,7 @@ public class ProfileController {
private final ChangeListener<String> nameListener = (ov, o, n) -> consumeChanges(() -> name.setText(n)); private final ChangeListener<String> nameListener = (ov, o, n) -> consumeChanges(() -> name.setText(n));
private final ChangeListener<Number> balanceListener = (ov, o, n) -> consumeChanges(() -> balance.setValue(n)); private final ChangeListener<Number> balanceListener = (ov, o, n) -> consumeChanges(() -> balance.setValue(n));
private final ChangeListener<SystemModel> systemListener = (ov, o, n) -> consumeChanges(() -> system.setValue(n)); private final ChangeListener<SystemModel> systemListener = (ov, o, n) -> consumeChanges(() -> system.setValue(n));
private final ChangeListener<StationModel> stationListener = (ov, o, n) -> consumeChanges(() -> station.setValue(n)); private final ChangeListener<StationModel> stationListener = (ov, o, n) -> consumeChanges(() -> station.setValue(n.getName()));
private final ChangeListener<Boolean> dockedListener = (ov, o, n) -> consumeChanges(() -> docked.setSelected(n)); private final ChangeListener<Boolean> dockedListener = (ov, o, n) -> consumeChanges(() -> docked.setSelected(n));
private final ChangeListener<Number> massListener = (ov, o, n) -> consumeChanges(() -> mass.setValue(n)); private final ChangeListener<Number> massListener = (ov, o, n) -> consumeChanges(() -> mass.setValue(n));
private final ChangeListener<Number> tankListener = (ov, o, n) -> consumeChanges(() -> tank.setValue(n)); private final ChangeListener<Number> tankListener = (ov, o, n) -> consumeChanges(() -> tank.setValue(n));

View File

@@ -8,6 +8,7 @@ import javafx.scene.control.TextField;
import ru.trader.analysis.CrawlerSpecificator; import ru.trader.analysis.CrawlerSpecificator;
import ru.trader.model.*; import ru.trader.model.*;
import ru.trader.view.support.autocomplete.AutoCompletion; import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider; import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.Optional; import java.util.Optional;
@@ -18,12 +19,12 @@ public class RouteSearchController {
private TextField fromSystemText; private TextField fromSystemText;
private AutoCompletion<SystemModel> fromSystem; private AutoCompletion<SystemModel> fromSystem;
@FXML @FXML
private ComboBox<StationModel> fromStation; private ComboBox<String> fromStation;
@FXML @FXML
private TextField toSystemText; private TextField toSystemText;
private AutoCompletion<SystemModel> toSystem; private AutoCompletion<SystemModel> toSystem;
@FXML @FXML
private ComboBox<StationModel> toStation; private ComboBox<String> toStation;
@FXML @FXML
private CheckBox cbFast; private CheckBox cbFast;
@FXML @FXML
@@ -37,43 +38,60 @@ public class RouteSearchController {
@FXML @FXML
private void initialize(){ private void initialize(){
init(); init();
profile = MainController.getProfile();
missionsList.setItems(missionsController.getMissions()); missionsList.setItems(missionsController.getMissions());
initListeners(); initListeners();
} }
private void init(){ private void init(){
market = MainController.getMarket(); market = MainController.getMarket();
profile = MainController.getProfile(); SystemsProvider provider = market.getSystemsProvider();
SystemsProvider provider = new SystemsProvider(market); if (fromSystem == null){
fromSystem = new AutoCompletion<>(fromSystemText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter()); fromSystem = new AutoCompletion<>(fromSystemText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
provider = new SystemsProvider(market); } else {
toSystem = new AutoCompletion<>(toSystemText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter()); fromSystem.setSuggestions(provider.getPossibleSuggestions());
fromSystem.setConverter(provider.getConverter());
}
if (toSystem == null){
toSystem = new AutoCompletion<>(toSystemText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
toSystem.setSuggestions(provider.getPossibleSuggestions());
toSystem.setConverter(provider.getConverter());
}
fromStation.setValue(ModelFabric.NONE_STATION.getName());
toStation.setValue(ModelFabric.NONE_STATION.getName());
} }
private void initListeners(){ private void initListeners(){
fromSystem.completionProperty().addListener((ov, o , n) -> fromStation.setItems(n.getStationsList())); fromSystem.valueProperty().addListener((ov, o , n) -> {
fromStation.valueProperty().addListener((ov, o , n) -> missionsController.setStation(n)); fromStation.setItems(n.getStationNamesList());
toSystem.completionProperty().addListener((ov, o , n) -> toStation.setItems(n.getStationsList())); fromStation.getSelectionModel().selectFirst();
});
fromStation.valueProperty().addListener((ov, o , n) -> missionsController.setStation(fromSystem.getValue().get(n)));
toSystem.valueProperty().addListener((ov, o , n) -> {
toStation.setItems(n.getStationNamesList());
toStation.getSelectionModel().selectFirst();
});
} }
@FXML @FXML
private void currentAsFrom(){ private void currentAsFrom(){
fromSystem.setValue(profile.getSystem()); fromSystem.setValue(profile.getSystem());
fromStation.setValue(profile.getStation()); fromStation.setValue(profile.getStation().getName());
} }
@FXML @FXML
private void loop(){ private void loop(){
toSystem.setValue(fromSystem.getCompletion()); toSystem.setValue(fromSystem.getValue());
toStation.setValue(fromStation.getValue()); toStation.setValue(fromStation.getValue());
} }
@FXML @FXML
private void search(){ private void search(){
SystemModel f = fromSystem.getCompletion(); SystemModel f = fromSystem.getValue();
SystemModel t = toSystem.getCompletion(); SystemModel t = toSystem.getValue();
StationModel fS = fromStation.getValue(); StationModel fS = f != null ? f.get(fromStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = toStation.getValue(); StationModel tS = t != null ? t.get(toStation.getValue()) : ModelFabric.NONE_STATION;
CrawlerSpecificator specificator = new CrawlerSpecificator(); CrawlerSpecificator specificator = new CrawlerSpecificator();
specificator.setByTime(cbFast.isSelected()); specificator.setByTime(cbFast.isSelected());

View File

@@ -7,21 +7,13 @@ import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import ru.trader.analysis.CrawlerSpecificator;
import ru.trader.model.*; import ru.trader.model.*;
import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Track; import ru.trader.view.support.Track;
import ru.trader.view.support.ViewUtils; import ru.trader.view.support.ViewUtils;
import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.SystemsProvider;
import ru.trader.view.support.cells.OfferListCell;
import ru.trader.view.support.cells.OrderListCell; import ru.trader.view.support.cells.OrderListCell;
import ru.trader.view.support.cells.StationListCell;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class RouteTrackController { public class RouteTrackController {
@@ -93,11 +85,10 @@ public class RouteTrackController {
if (index == -1) return; if (index == -1) return;
RouteEntryModel entry = route.get(index); RouteEntryModel entry = route.get(index);
missionsController.setStation(entry.getStation()); missionsController.setStation(entry.getStation());
ObservableList<StationModel> stations = FXCollections.observableArrayList(route.getStations(index)); ObservableList<String> stations = BindingsHelper.observableList(route.getStations(index), StationModel::getFullName);
missionsController.getBuyerProvider().setPossibleSuggestions(stations); missionsController.setStations(stations);
missionsController.getReceiverProvider().setPossibleSuggestions(stations); ObservableList<ItemModel> items = FXCollections.observableList(route.getSellOffers(index).stream().map(OfferModel::getItem).collect(Collectors.toList()));
List<ItemModel> items = route.getSellOffers(index).stream().map(OfferModel::getItem).collect(Collectors.toList()); missionsController.setItems(items);
missionsController.getItem().getItems().setAll(items);
station.setText(entry.getStation().getName()); station.setText(entry.getStation().getName());
system.setText(entry.getStation().getSystem().getName()); system.setText(entry.getStation().getSystem().getName());

View File

@@ -14,6 +14,7 @@ import ru.trader.model.support.ChangeMarketListener;
import ru.trader.view.support.NumberField; import ru.trader.view.support.NumberField;
import ru.trader.view.support.RouteNode; import ru.trader.view.support.RouteNode;
import ru.trader.view.support.autocomplete.AutoCompletion; import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider; import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.Optional; import java.util.Optional;
@@ -49,14 +50,14 @@ public class RouterController {
private AutoCompletion<SystemModel> source; private AutoCompletion<SystemModel> source;
@FXML @FXML
private ComboBox<StationModel> sStation; private ComboBox<String> sStation;
@FXML @FXML
private TextField targetText; private TextField targetText;
private AutoCompletion<SystemModel> target; private AutoCompletion<SystemModel> target;
@FXML @FXML
private ComboBox<StationModel> tStation; private ComboBox<String> tStation;
@FXML @FXML
private TableView<OrderModel> tblOrders; private TableView<OrderModel> tblOrders;
@@ -81,19 +82,21 @@ public class RouterController {
cargo.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setCargo(n.intValue())); cargo.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setCargo(n.intValue()));
tank.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setTank(n.doubleValue())); tank.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setTank(n.doubleValue()));
jumps.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setJumps(n.intValue())); jumps.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setJumps(n.intValue()));
source.completionProperty().addListener((ov, o, n) -> { source.valueProperty().addListener((ov, o, n) -> {
if (n != null) { if (n != null) {
sStation.setItems(n.getStationsList()); sStation.setItems(n.getStationNamesList());
} else { } else {
sStation.setItems(FXCollections.emptyObservableList()); sStation.setItems(FXCollections.emptyObservableList());
} }
sStation.getSelectionModel().selectFirst();
}); });
target.completionProperty().addListener((ov, o, n) -> { target.valueProperty().addListener((ov, o, n) -> {
if (n != null) { if (n != null) {
tStation.setItems(n.getStationsList()); tStation.setItems(n.getStationNamesList());
} else { } else {
tStation.setItems(FXCollections.emptyObservableList()); tStation.setItems(FXCollections.emptyObservableList());
} }
tStation.getSelectionModel().selectFirst();
}); });
@@ -109,9 +112,9 @@ public class RouterController {
jumps.setValue(Main.SETTINGS.getJumps()); jumps.setValue(Main.SETTINGS.getJumps());
addBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> { addBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> {
SystemModel system = target.getCompletion(); SystemModel system = target.getValue();
return ModelFabric.isFake(system); return ModelFabric.isFake(system);
}, target.completionProperty())); }, target.valueProperty()));
editBtn.disableProperty().bind(tblOrders.getSelectionModel().selectedIndexProperty().isEqualTo(-1)); editBtn.disableProperty().bind(tblOrders.getSelectionModel().selectedIndexProperty().isEqualTo(-1));
removeBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> { removeBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> {
@@ -134,15 +137,27 @@ public class RouterController {
void init(){ void init(){
if (market != null){
market.getNotificator().remove(routerChangeListener);
}
market = MainController.getMarket(); market = MainController.getMarket();
market.getNotificator().add(new RouterChangeListener()); market.getNotificator().add(routerChangeListener);
SystemsProvider provider = new SystemsProvider(market); SystemsProvider provider = market.getSystemsProvider();
if (source != null) source.dispose(); if (source == null){
source = new AutoCompletion<>(sourceText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter()); source = new AutoCompletion<>(sourceText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
if (target != null) target.dispose(); } else {
provider = new SystemsProvider(market); source.setSuggestions(provider.getPossibleSuggestions());
target = new AutoCompletion<>(targetText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter()); source.setConverter(provider.getConverter());
}
if (target == null){
target = new AutoCompletion<>(targetText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
target.setSuggestions(provider.getPossibleSuggestions());
target.setConverter(provider.getConverter());
}
orders.clear(); orders.clear();
sStation.setValue(ModelFabric.NONE_STATION.getName());
tStation.setValue(ModelFabric.NONE_STATION.getName());
totalBalance.setValue(balance.getValue()); totalBalance.setValue(balance.getValue());
totalProfit.setValue(0); totalProfit.setValue(0);
} }
@@ -152,7 +167,7 @@ public class RouterController {
totalProfit.add(order.getProfit()); totalProfit.add(order.getProfit());
totalBalance.add(order.getProfit()); totalBalance.add(order.getProfit());
source.setValue(order.getBuyer().getSystem()); source.setValue(order.getBuyer().getSystem());
sStation.setValue(order.getBuyer()); sStation.setValue(order.getBuyer().getName());
target.setValue(ModelFabric.NONE_SYSTEM); target.setValue(ModelFabric.NONE_SYSTEM);
balance.setDisable(true); balance.setDisable(true);
} }
@@ -161,7 +176,7 @@ public class RouterController {
totalProfit.sub(order.getProfit()); totalProfit.sub(order.getProfit());
totalBalance.sub(order.getProfit()); totalBalance.sub(order.getProfit());
source.setValue(order.getSystem()); source.setValue(order.getSystem());
sStation.setValue(order.getStation()); sStation.setValue(order.getStation().getName());
target.setValue(ModelFabric.NONE_SYSTEM); target.setValue(ModelFabric.NONE_SYSTEM);
if (orders.isEmpty()) { if (orders.isEmpty()) {
balance.setDisable(false); balance.setDisable(false);
@@ -169,10 +184,10 @@ public class RouterController {
} }
public void addStationToRoute(){ public void addStationToRoute(){
SystemModel s = source.getCompletion(); SystemModel s = source.getValue();
SystemModel t = target.getCompletion(); SystemModel t = target.getValue();
StationModel sS = sStation.getValue(); StationModel sS = s != null ? s.get(sStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = tStation.getValue(); StationModel tS = t != null ? t.get(tStation.getValue()) : ModelFabric.NONE_STATION;
RouteModel r = market.getPath(s, sS, t, tS); RouteModel r = market.getPath(s, sS, t, tS);
if (r == null) return; if (r == null) return;
if (route != null){ if (route != null){
@@ -181,8 +196,8 @@ public class RouterController {
route = r; route = r;
} }
refreshPath(); refreshPath();
source.setValue(target.getCompletion()); source.setValue(target.getValue());
sStation.setValue(tS); sStation.setValue(tS.getName());
} }
public void editOrders(){ public void editOrders(){
@@ -256,10 +271,10 @@ public class RouterController {
} }
public void showOrders(){ public void showOrders(){
SystemModel s = source.getCompletion(); SystemModel s = source.getValue();
SystemModel t = target.getCompletion(); SystemModel t = target.getValue();
StationModel sS = sStation.getValue(); StationModel sS = s != null ? s.get(sStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = tStation.getValue(); StationModel tS = t != null ? t.get(tStation.getValue()) : ModelFabric.NONE_STATION;
market.getOrders(s, sS, t, tS, totalBalance.getValue().doubleValue(), result -> { market.getOrders(s, sS, t, tS, totalBalance.getValue().doubleValue(), result -> {
Optional<OrderModel> order = Screeners.showOrders(result); Optional<OrderModel> order = Screeners.showOrders(result);
if (order.isPresent()){ if (order.isPresent()){
@@ -270,10 +285,10 @@ public class RouterController {
} }
public void showRoutes(){ public void showRoutes(){
SystemModel s = source.getCompletion(); SystemModel s = source.getValue();
SystemModel t = target.getCompletion(); SystemModel t = target.getValue();
StationModel sS = sStation.getValue(); StationModel sS = s != null ? s.get(sStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = tStation.getValue(); StationModel tS = t != null ? t.get(tStation.getValue()) : ModelFabric.NONE_STATION;
market.getRoutes(s, sS, t, tS, totalBalance.getValue().doubleValue(), new CrawlerSpecificator(), routes -> { market.getRoutes(s, sS, t, tS, totalBalance.getValue().doubleValue(), new CrawlerSpecificator(), routes -> {
Optional<RouteModel> path = Screeners.showRouters(routes); Optional<RouteModel> path = Screeners.showRouters(routes);
if (path.isPresent()){ if (path.isPresent()){
@@ -319,26 +334,26 @@ public class RouterController {
path.setContent(null); path.setContent(null);
} }
private class RouterChangeListener extends ChangeMarketListener { private final ChangeMarketListener routerChangeListener = new ChangeMarketListener() {
@Override @Override
public void add(StationModel station) { public void add(StationModel station) {
if (station.getSystem().equals(source.getCompletion())){ if (station.getSystem().equals(source.getValue())){
sStation.getItems().add(station); sStation.getItems().add(station.getName());
} }
if (station.getSystem().equals(target.getCompletion())){ if (station.getSystem().equals(target.getValue())){
tStation.getItems().add(station); tStation.getItems().add(station.getName());
} }
} }
@Override @Override
public void remove(StationModel station) { public void remove(StationModel station) {
if (station.getSystem().equals(source.getCompletion())){ if (station.getSystem().equals(source.getValue())){
sStation.getItems().remove(station); sStation.getItems().remove(station.getName());
}
if (station.getSystem().equals(target.getCompletion())){
tStation.getItems().remove(station);
} }
if (station.getSystem().equals(target.getValue())){
tStation.getItems().remove(station.getName());
} }
} }
};
} }

View File

@@ -15,6 +15,9 @@ import ru.trader.model.*;
import ru.trader.model.support.BindingsHelper; import ru.trader.model.support.BindingsHelper;
import ru.trader.model.support.ChangeMarketListener; import ru.trader.model.support.ChangeMarketListener;
import ru.trader.view.support.NumberField; 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.SystemsProvider;
import ru.trader.view.support.cells.CustomListCell; import ru.trader.view.support.cells.CustomListCell;
import java.util.Collection; import java.util.Collection;
@@ -25,7 +28,8 @@ public class SearchController {
private final static Logger LOG = LoggerFactory.getLogger(SearchController.class); private final static Logger LOG = LoggerFactory.getLogger(SearchController.class);
@FXML @FXML
private ComboBox<SystemModel> source; private TextField sourceText;
private AutoCompletion<SystemModel> source;
@FXML @FXML
private RadioButton rbSeller; private RadioButton rbSeller;
@FXML @FXML
@@ -61,6 +65,7 @@ public class SearchController {
@FXML @FXML
private void initialize() { private void initialize() {
init();
rbBuyer.setToggleGroup(offerType); rbBuyer.setToggleGroup(offerType);
rbBuyer.setUserData(OFFER_TYPE.BUY); rbBuyer.setUserData(OFFER_TYPE.BUY);
rbSeller.setToggleGroup(offerType); rbSeller.setToggleGroup(offerType);
@@ -80,17 +85,18 @@ public class SearchController {
}); });
BindingsHelper.setTableViewItems(tblResults, results); BindingsHelper.setTableViewItems(tblResults, results);
items.setItems(itemsList); items.setItems(itemsList);
init();
} }
void init(){ void init(){
if (market != null) market.getNotificator().remove(searchChangeListener);
market = MainController.getMarket(); market = MainController.getMarket();
market.getNotificator().add(new SearchChangeListener()); market.getNotificator().add(searchChangeListener);
source.setItems(market.systemsProperty()); SystemsProvider provider = market.getSystemsProvider();
if (source != null) source.dispose();
source = new AutoCompletion<>(sourceText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
itemsList.clear(); itemsList.clear();
itemsList.add(ModelFabric.NONE_ITEM); itemsList.add(ModelFabric.NONE_ITEM);
itemsList.addAll(market.itemsProperty().get()); itemsList.addAll(market.itemsProperty().get());
source.getSelectionModel().selectFirst();
} }
@@ -105,6 +111,7 @@ public class SearchController {
@FXML @FXML
private void searchStations(){ private void searchStations(){
MarketFilter filter = new MarketFilter(); MarketFilter filter = new MarketFilter();
//TODO: set center = source
filter.setDistance(distance.getValue().doubleValue()); filter.setDistance(distance.getValue().doubleValue());
if (cbMarket.isSelected()) filter.add(SERVICE_TYPE.MARKET); else filter.remove(SERVICE_TYPE.MARKET); if (cbMarket.isSelected()) filter.add(SERVICE_TYPE.MARKET); else filter.remove(SERVICE_TYPE.MARKET);
if (cbBlackMarket.isSelected()) filter.add(SERVICE_TYPE.BLACK_MARKET); else filter.remove(SERVICE_TYPE.BLACK_MARKET); if (cbBlackMarket.isSelected()) filter.add(SERVICE_TYPE.BLACK_MARKET); else filter.remove(SERVICE_TYPE.BLACK_MARKET);
@@ -195,8 +202,7 @@ public class SearchController {
} }
private class SearchChangeListener extends ChangeMarketListener { private final ChangeMarketListener searchChangeListener = new ChangeMarketListener() {
@Override @Override
public void add(ItemModel item) { public void add(ItemModel item) {
addItem(item); addItem(item);
@@ -206,6 +212,6 @@ public class SearchController {
public void remove(ItemModel item) { public void remove(ItemModel item) {
removeItem(item); removeItem(item);
} }
} };
} }

View File

@@ -13,9 +13,13 @@ import javafx.util.converter.DoubleStringConverter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.model.MarketModel; import ru.trader.model.MarketModel;
import ru.trader.model.ModelFabric;
import ru.trader.model.SystemModel; import ru.trader.model.SystemModel;
import ru.trader.model.support.PositionComputer; import ru.trader.model.support.PositionComputer;
import ru.trader.view.support.Localization; import ru.trader.view.support.Localization;
import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider;
import ru.trader.view.support.cells.TextFieldCell; import ru.trader.view.support.cells.TextFieldCell;
public class SystemsEditorController { public class SystemsEditorController {
@@ -45,23 +49,30 @@ public class SystemsEditorController {
@FXML @FXML
private TableColumn<SystemData, Double> clnS6; private TableColumn<SystemData, Double> clnS6;
@FXML @FXML
private ComboBox<SystemModel> system1; private TextField system1Text;
private AutoCompletion<SystemModel> system1;
@FXML @FXML
private ComboBox<SystemModel> system2; private TextField system2Text;
private AutoCompletion<SystemModel> system2;
@FXML @FXML
private ComboBox<SystemModel> system3; private TextField system3Text;
private AutoCompletion<SystemModel> system3;
@FXML @FXML
private ComboBox<SystemModel> system4; private TextField system4Text;
private AutoCompletion<SystemModel> system4;
@FXML @FXML
private ComboBox<SystemModel> system5; private TextField system5Text;
private AutoCompletion<SystemModel> system5;
@FXML @FXML
private ComboBox<SystemModel> system6; private TextField system6Text;
private AutoCompletion<SystemModel> system6;
private Dialog<ButtonType> dlg; private Dialog<ButtonType> dlg;
private MarketModel market; private MarketModel market;
@FXML @FXML
private void initialize() { private void initialize() {
init();
clnName.setCellFactory(TextFieldCell.forTableColumn(new DefaultStringConverter())); clnName.setCellFactory(TextFieldCell.forTableColumn(new DefaultStringConverter()));
clnX.setCellFactory(TextFieldCell.forTableColumn(new DoubleStringConverter())); clnX.setCellFactory(TextFieldCell.forTableColumn(new DoubleStringConverter()));
clnY.setCellFactory(TextFieldCell.forTableColumn(new DoubleStringConverter())); clnY.setCellFactory(TextFieldCell.forTableColumn(new DoubleStringConverter()));
@@ -81,17 +92,47 @@ public class SystemsEditorController {
system4.valueProperty().addListener((ov, o, n) -> clnS4.setText(n != null ? n.getName() : "")); system4.valueProperty().addListener((ov, o, n) -> clnS4.setText(n != null ? n.getName() : ""));
system5.valueProperty().addListener((ov, o, n) -> clnS5.setText(n != null ? n.getName() : "")); system5.valueProperty().addListener((ov, o, n) -> clnS5.setText(n != null ? n.getName() : ""));
system6.valueProperty().addListener((ov, o, n) -> clnS6.setText(n != null ? n.getName() : "")); system6.valueProperty().addListener((ov, o, n) -> clnS6.setText(n != null ? n.getName() : ""));
init();
} }
void init(){ void init(){
market = MainController.getMarket(); market = MainController.getMarket();
system1.setItems(market.systemsProperty()); SystemsProvider provider = market.getSystemsProvider();
system2.setItems(market.systemsProperty()); if (system1 == null){
system3.setItems(market.systemsProperty()); system1 = new AutoCompletion<>(system1Text, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
system4.setItems(market.systemsProperty()); } else {
system5.setItems(market.systemsProperty()); system1.setSuggestions(provider.getPossibleSuggestions());
system6.setItems(market.systemsProperty()); system1.setConverter(provider.getConverter());
}
if (system2 == null){
system2 = new AutoCompletion<>(system2Text, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system2.setSuggestions(provider.getPossibleSuggestions());
system2.setConverter(provider.getConverter());
}
if (system3 == null){
system3 = new AutoCompletion<>(system3Text, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system3.setSuggestions(provider.getPossibleSuggestions());
system3.setConverter(provider.getConverter());
}
if (system4 == null){
system4 = new AutoCompletion<>(system4Text, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system4.setSuggestions(provider.getPossibleSuggestions());
system4.setConverter(provider.getConverter());
}
if (system5 == null){
system5 = new AutoCompletion<>(system5Text, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system5.setSuggestions(provider.getPossibleSuggestions());
system5.setConverter(provider.getConverter());
}
if (system6 == null){
system6 = new AutoCompletion<>(system6Text, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
system6.setSuggestions(provider.getPossibleSuggestions());
system6.setConverter(provider.getConverter());
}
} }
private void createDialog(Parent owner, Parent content){ private void createDialog(Parent owner, Parent content){

View File

@@ -5,7 +5,6 @@ import javafx.beans.property.ListProperty;
import javafx.beans.property.ReadOnlyListProperty; import javafx.beans.property.ReadOnlyListProperty;
import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -21,6 +20,8 @@ import ru.trader.model.support.Notificator;
import ru.trader.services.OrdersSearchTask; import ru.trader.services.OrdersSearchTask;
import ru.trader.services.RoutesSearchTask; import ru.trader.services.RoutesSearchTask;
import ru.trader.view.support.Localization; import ru.trader.view.support.Localization;
import ru.trader.view.support.autocomplete.StationsProvider;
import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -34,10 +35,10 @@ public class MarketModel {
private final ModelFabric modeler; private final ModelFabric modeler;
private final Notificator notificator; private final Notificator notificator;
private final ListProperty<SystemModel> systems; private final ObservableList<String> systemNames;
private final ListProperty<StationModel> stations; private final ObservableList<String> stationNames;
// with NONE_SYSTEM private final SystemsProvider systemsProvider;
private ListProperty<SystemModel> systemsList; private final StationsProvider stationsProvider;
private final ListProperty<GroupModel> groups; private final ListProperty<GroupModel> groups;
private final ListProperty<ItemModel> items; private final ListProperty<ItemModel> items;
@@ -49,24 +50,12 @@ public class MarketModel {
groups = new SimpleListProperty<>(BindingsHelper.observableList(market.getGroups(), modeler::get)); groups = new SimpleListProperty<>(BindingsHelper.observableList(market.getGroups(), modeler::get));
items = new SimpleListProperty<>(BindingsHelper.observableList(market.getItems(), modeler::get)); items = new SimpleListProperty<>(BindingsHelper.observableList(market.getItems(), modeler::get));
items.sort(ItemModel::compareTo); items.sort(ItemModel::compareTo);
systems = new SimpleListProperty<>(BindingsHelper.observableList(market.get(), modeler::get)); systemNames = new SimpleListProperty<>(FXCollections.observableArrayList(market.getPlaceNames()));
systemsList = new SimpleListProperty<>(FXCollections.observableArrayList(ModelFabric.NONE_SYSTEM)); stationNames = new SimpleListProperty<>(FXCollections.observableArrayList(market.getVendorNames()));
systemsList.addAll(systems); systemsProvider = new SystemsProvider(this);
stations = new SimpleListProperty<>(BindingsHelper.observableList(market.getVendors(), modeler::get)); stationsProvider = new StationsProvider(this);
systems.addListener(SYSTEMS_CHANGE_LISTENER);
} }
private ListChangeListener<SystemModel> SYSTEMS_CHANGE_LISTENER = l -> {
while (l.next()) {
if (l.wasRemoved()) {
systemsList.removeAll(l.getRemoved());
}
if (l.wasAdded()) {
systemsList.addAll(l.getAddedSubList());
}
}
};
public MarketAnalyzer getAnalyzer() { public MarketAnalyzer getAnalyzer() {
return analyzer; return analyzer;
} }
@@ -79,15 +68,20 @@ public class MarketModel {
return notificator; return notificator;
} }
public ReadOnlyListProperty<SystemModel> systemsProperty() { public ObservableList<String> getSystemNames() {
return systems; return systemNames;
}
public ReadOnlyListProperty<SystemModel> systemsListProperty() {
return systemsList;
} }
public ReadOnlyListProperty<StationModel> stationsProperty() { public ObservableList<String> getStationNames() {
return stations; return stationNames;
}
public SystemsProvider getSystemsProvider() {
return systemsProvider;
}
public StationsProvider getStationsProvider() {
return stationsProvider;
} }
public SystemModel get(String name){ public SystemModel get(String name){
@@ -102,23 +96,23 @@ public class MarketModel {
SystemModel system = modeler.get(market.addPlace(name, x, y, z)); SystemModel system = modeler.get(market.addPlace(name, x, y, z));
LOG.info("Add system {} to market {}", system, this); LOG.info("Add system {} to market {}", system, this);
notificator.sendAdd(system); notificator.sendAdd(system);
systems.add(system); systemNames.add(system.getName());
stations.addAll(system.getStations()); stationNames.addAll(system.getStationFullNames());
return system; return system;
} }
public void remove(SystemModel system) { public void remove(SystemModel system) {
LOG.info("Remove system {} from market {}", system, this); LOG.info("Remove system {} from market {}", system, this);
notificator.sendRemove(system); notificator.sendRemove(system);
stations.removeAll(system.getStations()); stationNames.removeAll(system.getStationFullNames());
market.remove(system.getSystem()); market.remove(system.getSystem());
systems.remove(system); systemNames.remove(system.getName());
} }
StationModel addStation(SystemModel system, String name) { StationModel addStation(SystemModel system, String name) {
StationModel station = modeler.get(system.getSystem().addVendor(name)); StationModel station = modeler.get(system.getSystem().addVendor(name));
LOG.info("Add station {} to system {}", station, system); LOG.info("Add station {} to system {}", station, system);
stations.add(station); stationNames.add(station.getFullName());
notificator.sendAdd(station); notificator.sendAdd(station);
return station; return station;
} }
@@ -126,7 +120,7 @@ public class MarketModel {
void removeStation(StationModel station) { void removeStation(StationModel station) {
LOG.info("Remove station {} from system {}", station, station.getSystem()); LOG.info("Remove station {} from system {}", station, station.getSystem());
notificator.sendRemove(station); notificator.sendRemove(station);
stations.remove(station); stationNames.remove(station.getFullName());
station.getSystem().getSystem().remove(station.getStation()); station.getSystem().getSystem().remove(station.getStation());
} }

View File

@@ -10,6 +10,7 @@ import ru.trader.core.*;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -180,18 +181,23 @@ public class ModelFabric {
} }
@Override @Override
public List<StationModel> getStations() { public StationModel get(String name) {
throw new UnsupportedOperationException("Is fake system, change unsupported"); return ModelFabric.NONE_STATION;
} }
@Override @Override
public ObservableList<StationModel> getStationsList() { public List<String> getStationNames() {
return FXCollections.observableArrayList(ModelFabric.NONE_STATION); return Collections.emptyList();
} }
@Override @Override
public List<StationModel> getStations(SERVICE_TYPE service) { public ObservableList<String> getStationNamesList() {
throw new UnsupportedOperationException("Is fake system, change unsupported"); return FXCollections.observableArrayList(ModelFabric.NONE_STATION.getName());
}
@Override
public List<String> getStationNames(SERVICE_TYPE service) {
return Collections.emptyList();
} }
@Override @Override
@@ -213,7 +219,7 @@ public class ModelFabric {
@Override @Override
Vendor getStation() { Vendor getStation() {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
@@ -221,19 +227,44 @@ public class ModelFabric {
return ""; return "";
} }
@Override
public String getFullName() {
return "";
}
@Override
public FACTION getFaction() {
throw new UnsupportedOperationException("Is fake station, unsupported");
}
@Override
public void setFaction(FACTION faction) {
throw new UnsupportedOperationException("Is fake station, unsupported");
}
@Override
public GOVERNMENT getGovernment() {
throw new UnsupportedOperationException("Is fake station, unsupported");
}
@Override
public void setGovernment(GOVERNMENT government) {
throw new UnsupportedOperationException("Is fake station, unsupported");
}
@Override @Override
public void setName(String value) { public void setName(String value) {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public double getDistance() { public double getDistance() {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public void setDistance(double value) { public void setDistance(double value) {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
@@ -243,42 +274,42 @@ public class ModelFabric {
@Override @Override
public Collection<SERVICE_TYPE> getServices() { public Collection<SERVICE_TYPE> getServices() {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public void addService(SERVICE_TYPE service) { public void addService(SERVICE_TYPE service) {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public void removeService(SERVICE_TYPE service) { public void removeService(SERVICE_TYPE service) {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public SystemModel getSystem() { public SystemModel getSystem() {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public List<OfferModel> getSells() { public List<OfferModel> getSells() {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public List<OfferModel> getBuys() { public List<OfferModel> getBuys() {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public OfferModel add(OFFER_TYPE type, ItemModel item, double price, long count) { public OfferModel add(OFFER_TYPE type, ItemModel item, double price, long count) {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
public void remove(OfferModel offer) { public void remove(OfferModel offer) {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override
@@ -293,7 +324,7 @@ public class ModelFabric {
@Override @Override
public double getDistance(StationModel other) { public double getDistance(StationModel other) {
throw new UnsupportedOperationException("Is fake system, unsupported"); throw new UnsupportedOperationException("Is fake station, unsupported");
} }
@Override @Override

View File

@@ -209,7 +209,9 @@ public class RouteModel {
Collection<StationModel> res = new HashSet<>(); Collection<StationModel> res = new HashSet<>();
int startIndex = _route.isLoop() ? 1 : offset+1; int startIndex = _route.isLoop() ? 1 : offset+1;
if (startIndex >= entries.size()) return res; if (startIndex >= entries.size()) return res;
entries.subList(startIndex, entries.size()).stream().map(RouteEntryModel::getStation) entries.subList(startIndex, entries.size()).stream()
.filter(e -> !e.isTransit())
.map(RouteEntryModel::getStation)
.filter(station -> station != ModelFabric.NONE_STATION) .filter(station -> station != ModelFabric.NONE_STATION)
.forEach(res::add); .forEach(res::add);
return res; return res;

View File

@@ -1,11 +1,8 @@
package ru.trader.model; package ru.trader.model;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.StringBinding;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.core.*; import ru.trader.core.*;
import ru.trader.model.support.ModelBindings;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -46,6 +43,10 @@ public class StationModel {
station.setName(value); station.setName(value);
} }
public String getFullName(){
return station.getFullName();
}
public FACTION getFaction() {return station.getFaction();} public FACTION getFaction() {return station.getFaction();}
public void setFaction(FACTION faction) { public void setFaction(FACTION faction) {
@@ -133,10 +134,6 @@ public class StationModel {
return station.getDistance(other.station); return station.getDistance(other.station);
} }
public StringBinding asString(){
return Bindings.createStringBinding(() -> getSystem().getName()+": "+getName());
}
@Override @Override
public String toString() { public String toString() {
if (LOG.isTraceEnabled()){ if (LOG.isTraceEnabled()){

View File

@@ -9,6 +9,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.core.*; import ru.trader.core.*;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -100,17 +101,26 @@ public class SystemModel {
return system.get().stream().map(this::asModel).collect(Collectors.toList()); return system.get().stream().map(this::asModel).collect(Collectors.toList());
} }
public ObservableList<StationModel> getStationsList() { public Collection<String> getStationNames() {
ObservableList<StationModel> res = FXCollections.observableArrayList(ModelFabric.NONE_STATION); return system.getVendorNames();
res.addAll(getStations()); }
public List<String> getStationFullNames() {
return system.get().stream().map(Vendor::getFullName).collect(Collectors.toList());
}
public ObservableList<String> getStationNamesList() {
ObservableList<String> res = FXCollections.observableArrayList(ModelFabric.NONE_STATION.getName());
res.addAll(getStationNames());
return res; return res;
} }
public List<StationModel> getStations(final SERVICE_TYPE service) { public List<String> getStationNames(final SERVICE_TYPE service) {
return system.get().stream().filter(v -> v.has(service)).map(this::asModel).collect(Collectors.toList()); return system.get().stream().filter(v -> v.has(service)).map(Vendor::getName).collect(Collectors.toList());
} }
public StationModel get(String name){ public StationModel get(String name){
if (name == null) return ModelFabric.NONE_STATION;
return asModel(system.get(name)); return asModel(system.get(name));
} }

View File

@@ -29,6 +29,12 @@ public class Notificator {
} }
} }
public void remove(ChangeMarketListener listener){
synchronized (this.listener){
this.listener.remove(listener);
}
}
public void clear() { public void clear() {
synchronized (listener){ synchronized (listener){
listener.clear(); listener.clear();

View File

@@ -0,0 +1,41 @@
package ru.trader.view.support.autocomplete;
import javafx.collections.ObservableList;
import org.controlsfx.control.textfield.AutoCompletionBinding;
import java.util.*;
import java.util.stream.Collectors;
public abstract class AbstractSuggestionProvider<T> implements SuggestionProvider<T> {
private ObservableList<T> possibleSuggestions;
protected AbstractSuggestionProvider(ObservableList<T> possibleSuggestions) {
this.possibleSuggestions = possibleSuggestions;
}
@Override
public ObservableList<T> getPossibleSuggestions() {
return possibleSuggestions;
}
@Override
public void setPossibleSuggestions(ObservableList<T> possibleSuggestions){
this.possibleSuggestions = possibleSuggestions;
}
@Override
public final Collection<T> call(final AutoCompletionBinding.ISuggestionRequest request) {
List<T> suggestions = new ArrayList<>();
if(!request.getUserText().isEmpty()){
suggestions = possibleSuggestions.stream().filter(s -> isMatch(s, request))
.sorted(getComparator())
.collect(Collectors.toList());
}
return suggestions;
}
protected abstract Comparator<T> getComparator();
protected abstract boolean isMatch(T suggestion, AutoCompletionBinding.ISuggestionRequest request);
}

View File

@@ -3,6 +3,7 @@ package ru.trader.view.support.autocomplete;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.util.Callback; import javafx.util.Callback;
import javafx.util.StringConverter; import javafx.util.StringConverter;
@@ -23,27 +24,29 @@ public class AutoCompletion<T> {
}; };
} }
private final SuggestionProvider<String> suggestionProvider;
private final ObjectProperty<T> completion = new SimpleObjectProperty<>(); private final ObjectProperty<T> completion = new SimpleObjectProperty<>();
private final StringConverter<T> converter;
private final AutoTextFieldBinding binding; private final AutoTextFieldBinding binding;
private final T notFoundItem; private final T notFoundItem;
private StringConverter<T> converter;
public AutoCompletion(final TextField textField, final Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> suggestionProvider) { public AutoCompletion(final TextField textField, final SuggestionProvider<String> suggestionProvider) {
this(textField, suggestionProvider, null, defaultStringConverter()); this(textField, suggestionProvider, null, defaultStringConverter());
} }
public AutoCompletion(final TextField textField, final Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> suggestionProvider, T notFoundItem, final StringConverter<T> converter) { public AutoCompletion(final TextField textField, final SuggestionProvider<String> suggestionProvider, T notFoundItem, final StringConverter<T> converter) {
this.converter = converter; this.converter = converter;
this.notFoundItem = notFoundItem; this.notFoundItem = notFoundItem;
this.suggestionProvider = suggestionProvider;
binding = new AutoTextFieldBinding(textField, suggestionProvider); binding = new AutoTextFieldBinding(textField, suggestionProvider);
binding.setOnAutoCompleted(e -> completion.setValue(e.getCompletion())); binding.setOnAutoCompleted(e -> completion.setValue(converter.fromString(e.getCompletion())));
} }
public AutoCompletionBinding<T> getBinding() { public AutoCompletionBinding<String> getBinding() {
return binding; return binding;
} }
public T getCompletion() { public T getValue() {
return completion.get(); return completion.get();
} }
@@ -51,7 +54,7 @@ public class AutoCompletion<T> {
return binding.getCompletionTarget(); return binding.getCompletionTarget();
} }
public ObjectProperty<T> completionProperty() { public ObjectProperty<T> valueProperty() {
return completion; return completion;
} }
@@ -61,14 +64,22 @@ public class AutoCompletion<T> {
public void setValue(T value) { public void setValue(T value) {
completion.setValue(value); completion.setValue(value);
binding.completeUserInput(value); binding.completeUserInput(converter.toString(value));
} }
private class AutoTextFieldBinding extends AutoCompletionBinding<T>{ public void setConverter(StringConverter<T> converter){
public AutoTextFieldBinding(final TextField textField, this.converter = converter;
Callback<ISuggestionRequest, Collection<T>> suggestionProvider) { }
super(textField, suggestionProvider, converter); public void setSuggestions(ObservableList<String> suggestions){
suggestionProvider.setPossibleSuggestions(suggestions);
}
private class AutoTextFieldBinding extends AutoCompletionBinding<String>{
public AutoTextFieldBinding(final TextField textField,
Callback<ISuggestionRequest, Collection<String>> suggestionProvider) {
super(textField, suggestionProvider, defaultStringConverter());
getCompletionTarget().textProperty().addListener(textChangeListener); getCompletionTarget().textProperty().addListener(textChangeListener);
getCompletionTarget().focusedProperty().addListener(focusChangedListener); getCompletionTarget().focusedProperty().addListener(focusChangedListener);
@@ -86,10 +97,9 @@ public class AutoCompletion<T> {
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override protected void completeUserInput(T completion){ @Override protected void completeUserInput(String completion){
String newText = converter.toString(completion); getCompletionTarget().setText(completion);
getCompletionTarget().setText(newText); getCompletionTarget().positionCaret(completion.length());
getCompletionTarget().positionCaret(newText.length());
} }
private final ChangeListener<String> textChangeListener = (obs, oldText, newText) -> { private final ChangeListener<String> textChangeListener = (obs, oldText, newText) -> {
@@ -100,7 +110,7 @@ public class AutoCompletion<T> {
}; };
private final ChangeListener<Boolean> focusChangedListener = (obs, oldFocused, newFocused) -> { private final ChangeListener<Boolean> focusChangedListener = (obs, oldFocused, newFocused) -> {
if(newFocused == false) if(newFocused != null && !newFocused)
hidePopup(); hidePopup();
}; };
} }

View File

@@ -1,30 +1,40 @@
package ru.trader.view.support.autocomplete; package ru.trader.view.support.autocomplete;
import javafx.collections.ListChangeListener; import javafx.beans.InvalidationListener;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.util.Callback;
import org.controlsfx.control.textfield.AutoCompletionBinding; import org.controlsfx.control.textfield.AutoCompletionBinding;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
public abstract class CachedSuggestionProvider<T> implements Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> { public class CachedSuggestionProvider<T> implements SuggestionProvider<T> {
private final List<T> cache = new ArrayList<>(); private final List<T> cache = new ArrayList<>();
private final ReentrantLock lock = new ReentrantLock(); private final ReentrantLock lock = new ReentrantLock();
private ObservableList<T> possibleSuggestions; private final AbstractSuggestionProvider<T> provider;
private AutoCompletionBinding.ISuggestionRequest lastRequest; private AutoCompletionBinding.ISuggestionRequest lastRequest;
protected CachedSuggestionProvider(ObservableList<T> possibleSuggestions) { public CachedSuggestionProvider(AbstractSuggestionProvider<T> provider) {
this.possibleSuggestions = possibleSuggestions; this.provider = provider;
possibleSuggestions.addListener(listChangeListener); provider.getPossibleSuggestions().addListener(listChangeListener);
} }
@Override
public ObservableList<T> getPossibleSuggestions() {
return provider.getPossibleSuggestions();
}
@Override
public void setPossibleSuggestions(ObservableList<T> possibleSuggestions){ public void setPossibleSuggestions(ObservableList<T> possibleSuggestions){
this.possibleSuggestions.removeListener(listChangeListener); lock.lock();
this.possibleSuggestions = possibleSuggestions; try {
provider.getPossibleSuggestions().removeListener(listChangeListener);
provider.setPossibleSuggestions(possibleSuggestions);
cache.clear(); cache.clear();
this.possibleSuggestions.addListener(listChangeListener); provider.getPossibleSuggestions().addListener(listChangeListener);
} finally {
lock.unlock();
}
} }
@Override @Override
@@ -36,17 +46,12 @@ public abstract class CachedSuggestionProvider<T> implements Callback<AutoComple
boolean cached = lastRequest != null && isContinue(lastRequest, request); boolean cached = lastRequest != null && isContinue(lastRequest, request);
if (!cached){ if (!cached){
cache.clear(); cache.clear();
for (T possibleSuggestion : possibleSuggestions) { cache.addAll(provider.call(request));
if (isMatch(possibleSuggestion, request)) {
cache.add(possibleSuggestion);
}
}
Collections.sort(cache, getComparator());
} else { } else {
Iterator<T> iterator = cache.iterator(); Iterator<T> iterator = cache.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
T possibleSuggestion = iterator.next(); T possibleSuggestion = iterator.next();
if (!isMatch(possibleSuggestion, request)) { if (!provider.isMatch(possibleSuggestion, request)) {
iterator.remove(); iterator.remove();
} }
} }
@@ -66,14 +71,11 @@ public abstract class CachedSuggestionProvider<T> implements Callback<AutoComple
return last != null && current != null && current.toLowerCase().startsWith(last.toLowerCase()); return last != null && current != null && current.toLowerCase().startsWith(last.toLowerCase());
} }
protected abstract Comparator<T> getComparator();
protected abstract boolean isMatch(T suggestion, AutoCompletionBinding.ISuggestionRequest request);
public void dispose(){ public void dispose(){
possibleSuggestions.removeListener(listChangeListener); provider.getPossibleSuggestions().removeListener(listChangeListener);
} }
private final ListChangeListener<T> listChangeListener = c -> { private final InvalidationListener listChangeListener = o -> {
lock.lock(); lock.lock();
try { try {
lastRequest = null; lastRequest = null;

View File

@@ -18,7 +18,7 @@ public class StationStringConverter extends StringConverter<StationModel> {
@Override @Override
public String toString(StationModel station) { public String toString(StationModel station) {
return station.getSystem().getName()+": "+station.getName(); return station.getFullName();
} }
@Override @Override

View File

@@ -7,26 +7,26 @@ import ru.trader.model.StationModel;
import java.util.Comparator; import java.util.Comparator;
public class StationsProvider extends CachedSuggestionProvider<StationModel> { public class StationsProvider extends AbstractSuggestionProvider<String> {
private final StringConverter<StationModel> converter; private final StringConverter<StationModel> converter;
private final Comparator<StationModel> comparator; private final Comparator<String> comparator;
public StationsProvider(MarketModel market) { public StationsProvider(MarketModel market) {
super(market.stationsProperty()); super(market.getStationNames());
converter = new StationStringConverter(market); converter = new StationStringConverter(market);
comparator = (s1, s2) -> converter.toString(s1).toLowerCase().compareTo(converter.toString(s2).toLowerCase()); comparator = (s1, s2) -> s1.toLowerCase().compareTo(s2.toLowerCase());
} }
@Override @Override
protected Comparator<StationModel> getComparator() { protected Comparator<String> getComparator() {
return comparator; return comparator;
} }
@Override @Override
protected boolean isMatch(StationModel suggestion, AutoCompletionBinding.ISuggestionRequest request) { protected boolean isMatch(String suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String s = converter.toString(suggestion).toLowerCase(); String s = suggestion.toLowerCase();
return s.contains(request.getUserText().toLowerCase()); return s.contains(request.getUserText().toLowerCase());
} }

View File

@@ -0,0 +1,14 @@
package ru.trader.view.support.autocomplete;
import javafx.collections.ObservableList;
import javafx.util.Callback;
import org.controlsfx.control.textfield.AutoCompletionBinding;
import java.util.Collection;
public interface SuggestionProvider<T> extends Callback<AutoCompletionBinding.ISuggestionRequest, Collection<T>> {
ObservableList<T> getPossibleSuggestions();
void setPossibleSuggestions(ObservableList<T> possibleSuggestions);
}

View File

@@ -7,27 +7,27 @@ import ru.trader.model.SystemModel;
import java.util.Comparator; import java.util.Comparator;
public class SystemsProvider extends CachedSuggestionProvider<SystemModel> { public class SystemsProvider extends AbstractSuggestionProvider<String> {
private final StringConverter<SystemModel> converter; private final StringConverter<SystemModel> converter;
private final Comparator<SystemModel> comparator; private final Comparator<String> comparator;
public SystemsProvider(MarketModel market) { public SystemsProvider(MarketModel market) {
super(market.systemsProperty()); super(market.getSystemNames());
converter = new SystemsStringConverter(market); converter = new SystemsStringConverter(market);
comparator = (s1, s2) -> converter.toString(s1).toLowerCase().compareTo(converter.toString(s2).toLowerCase()); comparator = (s1, s2) -> s1.toLowerCase().compareTo(s2.toLowerCase());
} }
@Override @Override
protected Comparator<SystemModel> getComparator() { protected Comparator<String> getComparator() {
return comparator; return comparator;
} }
@Override @Override
protected boolean isMatch(SystemModel suggestion, AutoCompletionBinding.ISuggestionRequest request) { protected boolean isMatch(String suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String s = converter.toString(suggestion).toLowerCase(); String s = suggestion.toLowerCase();
return s.contains(request.getUserText().toLowerCase()); return s.startsWith(request.getUserText().toLowerCase());
} }
public StringConverter<SystemModel> getConverter() { public StringConverter<SystemModel> getConverter() {

View File

@@ -18,12 +18,10 @@ public class StationListCell implements Callback<ListView<StationModel>, ListCel
super.updateItem(station, empty); super.updateItem(station, empty);
if (!empty){ if (!empty){
if (s != station){ if (s != station){
textProperty().unbind(); setText(station.getFullName());
textProperty().bind(station.asString());
s = station; s = station;
} }
} else { } else {
textProperty().unbind();
s = null; s = null;
setText(null); setText(null);
setGraphic(null); setGraphic(null);

View File

@@ -12,6 +12,7 @@
<?import org.controlsfx.glyphfont.Glyph?> <?import org.controlsfx.glyphfont.Glyph?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.ListView?> <?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextField?>
<GridPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ru.trader.controllers.FilterController" <GridPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ru.trader.controllers.FilterController"
styleClass="dialog" vgap="4" hgap="8"> styleClass="dialog" vgap="4" hgap="8">
<columnConstraints> <columnConstraints>
@@ -20,7 +21,7 @@
</columnConstraints> </columnConstraints>
<Label text="%filter.title" styleClass="settings-group" GridPane.halignment="CENTER" GridPane.columnSpan="2"/> <Label text="%filter.title" styleClass="settings-group" GridPane.halignment="CENTER" GridPane.columnSpan="2"/>
<Label text="%filter.center" GridPane.rowIndex="1"/> <Label text="%filter.center" GridPane.rowIndex="1"/>
<ComboBox fx:id="center" GridPane.columnIndex="1" GridPane.rowIndex="1" minWidth="250"/> <TextField fx:id="centerText" GridPane.columnIndex="1" GridPane.rowIndex="1" minWidth="250"/>
<Label text="%filter.radius" GridPane.rowIndex="2" /> <Label text="%filter.radius" GridPane.rowIndex="2" />
<NumberField fx:id="radius" GridPane.columnIndex="1" GridPane.rowIndex="2" /> <NumberField fx:id="radius" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<Label text="%filter.distance" GridPane.rowIndex="3" /> <Label text="%filter.distance" GridPane.rowIndex="3" />
@@ -38,7 +39,7 @@
</TilePane> </TilePane>
<Label text="%filter.excludes" GridPane.rowIndex="5" /> <Label text="%filter.excludes" GridPane.rowIndex="5" />
<VBox GridPane.rowIndex="6" spacing="4"> <VBox GridPane.rowIndex="6" spacing="4">
<ComboBox fx:id="system" minWidth="180"/> <TextField fx:id="systemText" minWidth="180"/>
<ComboBox fx:id="station" minWidth="180"/> <ComboBox fx:id="station" minWidth="180"/>
<HBox spacing="2" alignment="BASELINE_RIGHT"> <HBox spacing="2" alignment="BASELINE_RIGHT">
<Button prefWidth="30" onAction="#add"><graphic><Glyph text="FontAwesome|PLUS"/></graphic></Button> <Button prefWidth="30" onAction="#add"><graphic><Glyph text="FontAwesome|PLUS"/></graphic></Button>

View File

@@ -18,16 +18,7 @@
</columnConstraints> </columnConstraints>
<TitledPane GridPane.rowSpan="3" text="%market.systems" minWidth="270" prefHeight="590" collapsible="false"> <TitledPane GridPane.rowSpan="3" text="%market.systems" minWidth="270" prefHeight="590" collapsible="false">
<ListView fx:id="systems"> <TextField fx:id="systemText" />
<contextMenu>
<ContextMenu>
<items>
<MenuItem text="%main.menu.edit.addStation" onAction="#addStation" />
<MenuItem text="%main.menu.edit.editStation" onAction="#editStation" />
</items>
</ContextMenu>
</contextMenu>
</ListView>
</TitledPane> </TitledPane>
<TitledPane GridPane.columnIndex="1" text="%market.stations" maxHeight="60" collapsible="false"> <TitledPane GridPane.columnIndex="1" text="%market.stations" maxHeight="60" collapsible="false">

View File

@@ -23,12 +23,12 @@
</columnConstraints> </columnConstraints>
<Label text="%sEditor.text.orientates" prefWidth="170" GridPane.rowSpan="2"/> <Label text="%sEditor.text.orientates" prefWidth="170" GridPane.rowSpan="2"/>
<ComboBox fx:id="system1" prefWidth="160" GridPane.columnIndex="1" /> <TextField fx:id="system1Text" prefWidth="160" GridPane.columnIndex="1" />
<ComboBox fx:id="system2" prefWidth="160" GridPane.columnIndex="2" /> <TextField fx:id="system2Text" prefWidth="160" GridPane.columnIndex="2" />
<ComboBox fx:id="system3" prefWidth="160" GridPane.columnIndex="3" /> <TextField fx:id="system3Text" prefWidth="160" GridPane.columnIndex="3" />
<ComboBox fx:id="system4" prefWidth="160" GridPane.rowIndex="1" GridPane.columnIndex="1" /> <TextField fx:id="system4Text" prefWidth="160" GridPane.rowIndex="1" GridPane.columnIndex="1" />
<ComboBox fx:id="system5" prefWidth="160" GridPane.rowIndex="1" GridPane.columnIndex="2" /> <TextField fx:id="system5Text" prefWidth="160" GridPane.rowIndex="1" GridPane.columnIndex="2" />
<ComboBox fx:id="system6" prefWidth="160" GridPane.rowIndex="1" GridPane.columnIndex="3" /> <TextField fx:id="system6Text" prefWidth="160" GridPane.rowIndex="1" GridPane.columnIndex="3" />
<HBox GridPane.rowIndex="2" spacing="4"> <HBox GridPane.rowIndex="2" spacing="4">
<Button prefWidth="30" onAction="#add"> <Button prefWidth="30" onAction="#add">

View File

@@ -25,7 +25,7 @@
<ColumnConstraints minWidth="150" maxWidth="150"/> <ColumnConstraints minWidth="150" maxWidth="150"/>
</columnConstraints> </columnConstraints>
<Label text="%search.text.from" /> <Label text="%search.text.from" />
<ComboBox fx:id="source" prefWidth="150" GridPane.columnIndex="1" /> <TextField fx:id="sourceText" prefWidth="150" GridPane.columnIndex="1" />
<HBox GridPane.columnSpan="2" GridPane.rowIndex="1" spacing="10" alignment="BOTTOM_CENTER"> <HBox GridPane.columnSpan="2" GridPane.rowIndex="1" spacing="10" alignment="BOTTOM_CENTER">
<RadioButton fx:id="rbSeller" text="%market.order.seller"/> <RadioButton fx:id="rbSeller" text="%market.order.seller"/>
<RadioButton fx:id="rbBuyer" text="%market.order.buyer" /> <RadioButton fx:id="rbBuyer" text="%market.order.buyer" />

View File

@@ -34,14 +34,14 @@ public class PositionComputerTest extends Assert {
market.addPlace("System7", -50.75, 50.0312, -13.2813); market.addPlace("System7", -50.75, 50.0312, -13.2813);
market.addPlace("Sol", 0, 0, 0); market.addPlace("Sol", 0, 0, 0);
MarketModel marketModel = new MarketModel(market); MarketModel marketModel = new MarketModel(market);
system1 = marketModel.systemsProperty().get(0); system1 = marketModel.get(marketModel.getSystemNames().get(0));
system2 = marketModel.systemsProperty().get(1); system2 = marketModel.get(marketModel.getSystemNames().get(1));
system3 = marketModel.systemsProperty().get(2); system3 = marketModel.get(marketModel.getSystemNames().get(2));
system4 = marketModel.systemsProperty().get(3); system4 = marketModel.get(marketModel.getSystemNames().get(3));
system5 = marketModel.systemsProperty().get(4); system5 = marketModel.get(marketModel.getSystemNames().get(4));
system6 = marketModel.systemsProperty().get(5); system6 = marketModel.get(marketModel.getSystemNames().get(5));
system7 = marketModel.systemsProperty().get(6); system7 = marketModel.get(marketModel.getSystemNames().get(6));
system8 = marketModel.systemsProperty().get(7); system8 = marketModel.get(marketModel.getSystemNames().get(7));
} }
@Test @Test

View File

@@ -1,9 +1,7 @@
package ru.trader.core; package ru.trader.core;
import java.util.ArrayList; import java.util.*;
import java.util.Collection; import java.util.stream.Collectors;
import java.util.HashMap;
import java.util.Optional;
public interface Market { public interface Market {
@@ -28,12 +26,18 @@ public interface Market {
} }
Collection<Place> get(); Collection<Place> get();
default Collection<String> getPlaceNames(){
return get() .stream().map(Place::getName).collect(Collectors.toList());
}
default Collection<Vendor> getVendors(){ default Collection<Vendor> getVendors(){
return getVendors(false); return getVendors(false);
} }
default Collection<Vendor> getVendors(boolean includeTransit){ default Collection<Vendor> getVendors(boolean includeTransit){
return new PlacesWrapper(get(), includeTransit); return new PlacesWrapper(get(), includeTransit);
} }
default Collection<String> getVendorNames(){
return getVendors() .stream().map(Vendor::getFullName).collect(Collectors.toList());
}
Collection<Group> getGroups(); Collection<Group> getGroups();
Collection<Item> getItems(); Collection<Item> getItems();
ItemStat getStat(OFFER_TYPE type, Item item); ItemStat getStat(OFFER_TYPE type, Item item);

View File

@@ -5,6 +5,7 @@ import ru.trader.analysis.graph.Connectable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
public interface Place extends Connectable<Place> { public interface Place extends Connectable<Place> {
@@ -33,6 +34,9 @@ public interface Place extends Connectable<Place> {
return get(); return get();
} }
} }
default Collection<String> getVendorNames(){
return get().stream().map(Vendor::getName).collect(Collectors.toList());
}
default Vendor get(String name){ default Vendor get(String name){
Optional<Vendor> vendor = get().stream().filter(p -> name.equalsIgnoreCase(p.getName())).findFirst(); Optional<Vendor> vendor = get().stream().filter(p -> name.equalsIgnoreCase(p.getName())).findFirst();

View File

@@ -10,6 +10,10 @@ public interface Vendor extends Connectable<Vendor> {
String getName(); String getName();
void setName(String name); void setName(String name);
default String getFullName(){
return getPlace().getName()+": "+getName();
}
Place getPlace(); Place getPlace();
double getDistance(); double getDistance();

View File

@@ -6,6 +6,7 @@ import ru.trader.core.*;
import ru.trader.store.berkeley.entities.BDBGroup; import ru.trader.store.berkeley.entities.BDBGroup;
import ru.trader.store.berkeley.entities.BDBItem; import ru.trader.store.berkeley.entities.BDBItem;
import ru.trader.store.berkeley.entities.BDBPlace; import ru.trader.store.berkeley.entities.BDBPlace;
import ru.trader.store.berkeley.entities.BDBVendor;
import java.util.*; import java.util.*;
@@ -136,6 +137,24 @@ public class BDBMarket extends AbstractMarket {
return vendors; return vendors;
} }
@Override
public Collection<String> getPlaceNames() {
return store.getPlaceAccessor().getAllNames();
}
@Override
public Collection<String> getVendorNames() {
Collection<BDBPlace> places = store.getPlaceAccessor().getAllPlaces();
Collection<String> res = new LinkedList<>();
for (BDBPlace place : places) {
Collection<String> names = store.getVendorAccessor().getNamesByPlace(place.getId());
for (String name : names) {
res.add(place.getName()+": "+name);
}
}
return res;
}
@Override @Override
public ItemStat getStat(OFFER_TYPE type, Item item) { public ItemStat getStat(OFFER_TYPE type, Item item) {
ItemStat entry = getItemCache(type).get(item); ItemStat entry = getItemCache(type).get(item);

View File

@@ -147,6 +147,11 @@ public class PlaceProxy extends AbstractPlace {
return !store.getVendorAccessor().contains(place.getId()); return !store.getVendorAccessor().contains(place.getId());
} }
@Override
public Collection<String> getVendorNames() {
return store.getVendorAccessor().getNamesByPlace(place.getId());
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;

View File

@@ -45,6 +45,14 @@ public class PlaceDA<T> {
}); });
} }
public Collection<BDBPlace> getAllPlaces(){
return DAUtils.getAll(indexById, p -> p);
}
public Collection<String> getAllNames(){
return DAUtils.getAll(indexById, BDBPlace::getName);
}
public BDBPlace put(BDBPlace place){ public BDBPlace put(BDBPlace place){
return indexById.put(place); return indexById.put(place);
} }

View File

@@ -29,6 +29,15 @@ public class VendorDA<T> {
return DAUtils.getAll(indexByPlaceId, placeId, convertFunc); return DAUtils.getAll(indexByPlaceId, placeId, convertFunc);
} }
public Collection<BDBVendor> getAllVendors(){
return DAUtils.getAll(indexById, v -> v);
}
public Collection<String> getNamesByPlace(long placeId){
return DAUtils.getAll(indexByPlaceId, placeId, BDBVendor::getName);
}
public boolean contains(long placeId){ public boolean contains(long placeId){
return indexByPlaceId.contains(placeId); return indexByPlaceId.contains(placeId);
} }