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
public void run() {
market.systemsProperty().get().forEach(system -> {
market.getSystemNames().forEach(system -> {
LOG.trace("Auto update {}", system);
Station emdnData = emdn.pop(system.getName());
Station emdnData = emdn.pop(system);
if (emdnData != null){
//TODO: implement new model
//updater.init(system);

View File

@@ -1,6 +1,5 @@
package ru.trader.controllers;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.*;
@@ -15,6 +14,9 @@ import ru.trader.model.SystemModel;
import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Localization;
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 java.util.Optional;
@@ -22,15 +24,17 @@ public class FilterController {
private final static Logger LOG = LoggerFactory.getLogger(FilterController.class);
@FXML
private ComboBox<SystemModel> center;
private TextField centerText;
private AutoCompletion<SystemModel> center;
@FXML
private NumberField radius;
@FXML
private NumberField distance;
@FXML
private ComboBox<SystemModel> system;
private TextField systemText;
private AutoCompletion<SystemModel> system;
@FXML
private ComboBox<StationModel> station;
private ComboBox<String> station;
@FXML
private CheckBox cbMarket;
@FXML
@@ -56,15 +60,29 @@ public class FilterController {
@FXML
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();
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(){
market = MainController.getMarket();
center.setItems(market.systemsListProperty());
system.setItems(market.systemsProperty());
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());
}
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){
@@ -102,7 +120,7 @@ public class FilterController {
private void clear(){
this.filter = null;
center.getSelectionModel().clearSelection();
center.setValue(ModelFabric.NONE_SYSTEM);
radius.clear();
distance.clear();
excludes.getItems().clear();
@@ -111,7 +129,7 @@ public class FilterController {
private void save() {
SystemModel s = center.getValue();
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.setDistance(distance.getValue().doubleValue());
if (cbMarket.isSelected()) filter.add(SERVICE_TYPE.MARKET); else filter.remove(SERVICE_TYPE.MARKET);
@@ -145,11 +163,12 @@ public class FilterController {
return result;
}
public void add(ActionEvent actionEvent) {
@FXML
private void add() {
SystemModel s = system.getValue();
if (s != null){
StationModel st = station.getValue();
if (st != null && st != ModelFabric.NONE_STATION){
StationModel st = s.get(station.getValue());
if (!ModelFabric.isFake(st)){
excludes.getItems().add(st);
} else {
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();
if (index >= 0){
excludes.getItems().remove(index);
}
}
public void clean(ActionEvent actionEvent) {
@FXML
private void clean() {
excludes.getItems().clear();
}

View File

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

View File

@@ -10,8 +10,11 @@ import javafx.scene.control.TextField;
import ru.trader.model.*;
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.StationsProvider;
import java.util.Collection;
public class MissionsController {
@FXML
@@ -43,8 +46,6 @@ public class MissionsController {
private final ObservableList<MissionModel> missions;
private StationModel station;
private StationsProvider receiverProvider;
private StationsProvider buyerProvider;
public MissionsController() {
missions = FXCollections.observableArrayList();
@@ -52,16 +53,11 @@ public class MissionsController {
@FXML
private void initialize(){
MarketModel world = MainController.getWorld();
receiverProvider = new StationsProvider(world);
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())
init();
addCourierBtn.disableProperty().bind(Bindings.createBooleanBinding(() -> receiver.getValue() == null, receiver.valueProperty())
.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(deliveryProfit.wrongProperty())
);
@@ -71,21 +67,36 @@ public class MissionsController {
);
}
StationsProvider getReceiverProvider() {
return receiverProvider;
void init(){
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() {
return buyerProvider;
void setStations(ObservableList<String> stationNames) {
receiver.setSuggestions(stationNames);
buyer.setSuggestions(stationNames);
}
ComboBox<ItemModel> getItem() {
return item;
void setItems(ObservableList<ItemModel> items){
item.setItems(items);
}
@FXML
private void addCourier(){
StationModel station = receiver.getCompletion();
StationModel station = receiver.getValue();
double profit = courierProfit.getValue().doubleValue();
if (station != null && profit > 0){
missions.add(new MissionModel(station, profit));
@@ -94,7 +105,7 @@ public class MissionsController {
@FXML
private void addDelivery(){
StationModel station = buyer.getCompletion();
StationModel station = buyer.getValue();
long count = deliveryCount.getValue().longValue();
double profit = deliveryProfit.getValue().doubleValue();
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.GovernmentStringConverter;
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;
@@ -25,12 +28,12 @@ public class OffersController {
private final static Logger LOG = LoggerFactory.getLogger(OffersController.class);
private StationModel station;
private SystemModel system;
@FXML
private Insets stationsMargin;
@FXML
private ListView<SystemModel> systems;
private TextField systemText;
private AutoCompletion<SystemModel> system;
@FXML
private SegmentedButton stationsBar;
@FXML
@@ -68,13 +71,10 @@ public class OffersController {
// инициализируем форму данными
@FXML
private void initialize() {
systems.getSelectionModel().selectedItemProperty().addListener((ob, oldValue, newValue) ->{
if (newValue != null){
LOG.info("Change system to {}", newValue);
fillDetails(newValue);
} else {
systems.getSelectionModel().select(oldValue);
}
init();
system.valueProperty().addListener((ob, oldValue, newValue) -> {
LOG.info("Change system to {}", newValue);
fillDetails(newValue);
});
stationsGrp.selectedToggleProperty().addListener((v, o, n) -> {
if (n != null){
@@ -103,23 +103,26 @@ public class OffersController {
});
BindingsHelper.setTableViewItems(tblSell, sells);
BindingsHelper.setTableViewItems(tblBuy, buys);
init();
}
void init(){
station = null;
system = null;
MarketModel market = MainController.getMarket();
market.getNotificator().add(new OffersChangeListener());
systems.setItems(market.systemsProperty());
systems.getSelectionModel().selectFirst();
//TODO: create global notificator
market.getNotificator().add(offersChangeListener);
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){
this.system = system;
List<StationModel> stations = system.getStations();
if (ModelFabric.isFake(system)) return;
stationsBar.getButtons().clear();
List<StationModel> stations = system.getStations();
stations.forEach(s -> stationsBar.getButtons().add(buildStationNode(s)));
if (!stations.isEmpty()){
stationsBar.getButtons().get(0).setSelected(true);
@@ -186,19 +189,21 @@ public class OffersController {
}
public SystemModel getSystem() {
return system;
return system.getValue();
}
public StationModel getStation() {
return station;
}
public void addStation(ActionEvent actionEvent) {
Screeners.showAddStation(system);
@FXML
private void addStation() {
Screeners.showAddStation(getSystem());
}
public void editStation(ActionEvent actionEvent) {
Screeners.showEditStation(station);
@FXML
private void editStation() {
Screeners.showEditStation(getStation());
}
@@ -226,10 +231,11 @@ public class OffersController {
tblBuy.getItems().forEach(OfferModel::refresh);
}
private class OffersChangeListener extends ChangeMarketListener {
private final ChangeMarketListener offersChangeListener = new ChangeMarketListener() {
@Override
public void priceChange(OfferModel offer, double oldPrice, double newPrice) {
StationModel station = getStation();
if (station.hasBuy(offer.getItem()) || station.hasSell(offer.getItem())){
ViewUtils.doFX(OffersController.this::sort);
}
@@ -237,7 +243,7 @@ public class OffersController {
@Override
public void add(OfferModel offer) {
if (offer.getStation().equals(station)){
if (offer.getStation().equals(getStation())){
ViewUtils.doFX(()-> addOffer(offer));
}
}
@@ -253,7 +259,7 @@ public class OffersController {
@Override
public void remove(OfferModel offer) {
if (offer.getStation().equals(station)){
if (offer.getStation().equals(getStation())){
ViewUtils.doFX(() -> removeOffer(offer));
}
}
@@ -267,6 +273,5 @@ public class OffersController {
sort();
});
}
}
};
}

View File

@@ -13,6 +13,7 @@ import ru.trader.model.*;
import ru.trader.view.support.NumberField;
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;
@@ -26,7 +27,7 @@ public class ProfileController {
@FXML
private TextField systemText;
@FXML
private ComboBox<StationModel> station;
private ComboBox<String> station;
@FXML
private CheckBox docked;
@FXML
@@ -54,10 +55,15 @@ public class ProfileController {
@FXML
private void initialize() {
init();
profile = MainController.getProfile();
MarketModel world = MainController.getWorld();
SystemsProvider provider = new SystemsProvider(world);
system = new AutoCompletion<>(systemText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter());
system.valueProperty().addListener((ov, o , n) -> {
doAndConsumeChanges(() -> {
station.setItems(n.getStationNamesList());
station.getSelectionModel().selectFirst();
});
consumeChanges(() -> {profile.setSystem(n); profile.setStation(ModelFabric.NONE_STATION);});
});
engine.setItems(FXCollections.observableList(Engine.getEngines()));
engine.setConverter(new EngineStringConverter());
btnAddSystem.setOnAction(e -> {
@@ -102,14 +108,21 @@ public class ProfileController {
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(){
name.textProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setName(n)));
balance.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setBalance(n.doubleValue())));
system.completionProperty().addListener((ov, o , 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)));
station.valueProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setStation(getStation(n))));
docked.selectedProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setDocked(n)));
mass.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipMass(n.doubleValue())));
tank.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipTank(n.doubleValue())));
@@ -126,7 +139,7 @@ public class ProfileController {
name.setText(profile.getName());
balance.setValue(profile.getBalance());
system.setValue(profile.getSystem());
station.setValue(profile.getStation());
station.setValue(profile.getStation().getName());
docked.setSelected(profile.isDocked());
mass.setValue(profile.getShipMass());
tank.setValue(profile.getShipTank());
@@ -136,6 +149,11 @@ public class ProfileController {
bind();
}
private StationModel getStation(String name){
SystemModel s = system.getValue();
return s == null ? ModelFabric.NONE_STATION : s.get(name);
}
private void bind(){
profile.nameProperty().addListener(nameListener);
profile.balanceProperty().addListener(balanceListener);
@@ -146,9 +164,7 @@ public class ProfileController {
profile.shipTankProperty().addListener(tankListener);
profile.shipCargoProperty().addListener(cargoListener);
profile.shipEngineProperty().addListener(engineListener);
jumpRange.textProperty().bind(Bindings.createStringBinding(()-> {
return String.format("%.1f - %.1f", profile.getShipJumpRange(), profile.getMaxShipJumpRange());
},
jumpRange.textProperty().bind(Bindings.createStringBinding(()-> String.format("%.1f - %.1f", profile.getShipJumpRange(), profile.getMaxShipJumpRange()),
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<Number> balanceListener = (ov, o, n) -> consumeChanges(() -> balance.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<Number> massListener = (ov, o, n) -> consumeChanges(() -> mass.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.model.*;
import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.Optional;
@@ -18,12 +19,12 @@ public class RouteSearchController {
private TextField fromSystemText;
private AutoCompletion<SystemModel> fromSystem;
@FXML
private ComboBox<StationModel> fromStation;
private ComboBox<String> fromStation;
@FXML
private TextField toSystemText;
private AutoCompletion<SystemModel> toSystem;
@FXML
private ComboBox<StationModel> toStation;
private ComboBox<String> toStation;
@FXML
private CheckBox cbFast;
@FXML
@@ -37,43 +38,60 @@ public class RouteSearchController {
@FXML
private void initialize(){
init();
profile = MainController.getProfile();
missionsList.setItems(missionsController.getMissions());
initListeners();
}
private void init(){
market = MainController.getMarket();
profile = MainController.getProfile();
SystemsProvider provider = new SystemsProvider(market);
fromSystem = new AutoCompletion<>(fromSystemText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter());
provider = new SystemsProvider(market);
toSystem = new AutoCompletion<>(toSystemText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter());
SystemsProvider provider = market.getSystemsProvider();
if (fromSystem == null){
fromSystem = new AutoCompletion<>(fromSystemText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
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(){
fromSystem.completionProperty().addListener((ov, o , n) -> fromStation.setItems(n.getStationsList()));
fromStation.valueProperty().addListener((ov, o , n) -> missionsController.setStation(n));
toSystem.completionProperty().addListener((ov, o , n) -> toStation.setItems(n.getStationsList()));
fromSystem.valueProperty().addListener((ov, o , n) -> {
fromStation.setItems(n.getStationNamesList());
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
private void currentAsFrom(){
fromSystem.setValue(profile.getSystem());
fromStation.setValue(profile.getStation());
fromStation.setValue(profile.getStation().getName());
}
@FXML
private void loop(){
toSystem.setValue(fromSystem.getCompletion());
toSystem.setValue(fromSystem.getValue());
toStation.setValue(fromStation.getValue());
}
@FXML
private void search(){
SystemModel f = fromSystem.getCompletion();
SystemModel t = toSystem.getCompletion();
StationModel fS = fromStation.getValue();
StationModel tS = toStation.getValue();
SystemModel f = fromSystem.getValue();
SystemModel t = toSystem.getValue();
StationModel fS = f != null ? f.get(fromStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = t != null ? t.get(toStation.getValue()) : ModelFabric.NONE_STATION;
CrawlerSpecificator specificator = new CrawlerSpecificator();
specificator.setByTime(cbFast.isSelected());

View File

@@ -7,21 +7,13 @@ import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import ru.trader.analysis.CrawlerSpecificator;
import ru.trader.model.*;
import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Track;
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.StationListCell;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class RouteTrackController {
@@ -93,11 +85,10 @@ public class RouteTrackController {
if (index == -1) return;
RouteEntryModel entry = route.get(index);
missionsController.setStation(entry.getStation());
ObservableList<StationModel> stations = FXCollections.observableArrayList(route.getStations(index));
missionsController.getBuyerProvider().setPossibleSuggestions(stations);
missionsController.getReceiverProvider().setPossibleSuggestions(stations);
List<ItemModel> items = route.getSellOffers(index).stream().map(OfferModel::getItem).collect(Collectors.toList());
missionsController.getItem().getItems().setAll(items);
ObservableList<String> stations = BindingsHelper.observableList(route.getStations(index), StationModel::getFullName);
missionsController.setStations(stations);
ObservableList<ItemModel> items = FXCollections.observableList(route.getSellOffers(index).stream().map(OfferModel::getItem).collect(Collectors.toList()));
missionsController.setItems(items);
station.setText(entry.getStation().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.RouteNode;
import ru.trader.view.support.autocomplete.AutoCompletion;
import ru.trader.view.support.autocomplete.CachedSuggestionProvider;
import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.Optional;
@@ -49,14 +50,14 @@ public class RouterController {
private AutoCompletion<SystemModel> source;
@FXML
private ComboBox<StationModel> sStation;
private ComboBox<String> sStation;
@FXML
private TextField targetText;
private AutoCompletion<SystemModel> target;
@FXML
private ComboBox<StationModel> tStation;
private ComboBox<String> tStation;
@FXML
private TableView<OrderModel> tblOrders;
@@ -81,19 +82,21 @@ public class RouterController {
cargo.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setCargo(n.intValue()));
tank.numberProperty().addListener((ov, o, n) -> Main.SETTINGS.setTank(n.doubleValue()));
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) {
sStation.setItems(n.getStationsList());
sStation.setItems(n.getStationNamesList());
} else {
sStation.setItems(FXCollections.emptyObservableList());
}
sStation.getSelectionModel().selectFirst();
});
target.completionProperty().addListener((ov, o, n) -> {
target.valueProperty().addListener((ov, o, n) -> {
if (n != null) {
tStation.setItems(n.getStationsList());
tStation.setItems(n.getStationNamesList());
} else {
tStation.setItems(FXCollections.emptyObservableList());
}
tStation.getSelectionModel().selectFirst();
});
@@ -109,9 +112,9 @@ public class RouterController {
jumps.setValue(Main.SETTINGS.getJumps());
addBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> {
SystemModel system = target.getCompletion();
SystemModel system = target.getValue();
return ModelFabric.isFake(system);
}, target.completionProperty()));
}, target.valueProperty()));
editBtn.disableProperty().bind(tblOrders.getSelectionModel().selectedIndexProperty().isEqualTo(-1));
removeBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> {
@@ -134,15 +137,27 @@ public class RouterController {
void init(){
if (market != null){
market.getNotificator().remove(routerChangeListener);
}
market = MainController.getMarket();
market.getNotificator().add(new RouterChangeListener());
SystemsProvider provider = new SystemsProvider(market);
if (source != null) source.dispose();
source = new AutoCompletion<>(sourceText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter());
if (target != null) target.dispose();
provider = new SystemsProvider(market);
target = new AutoCompletion<>(targetText, provider, ModelFabric.NONE_SYSTEM, provider.getConverter());
market.getNotificator().add(routerChangeListener);
SystemsProvider provider = market.getSystemsProvider();
if (source == null){
source = new AutoCompletion<>(sourceText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
} else {
source.setSuggestions(provider.getPossibleSuggestions());
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();
sStation.setValue(ModelFabric.NONE_STATION.getName());
tStation.setValue(ModelFabric.NONE_STATION.getName());
totalBalance.setValue(balance.getValue());
totalProfit.setValue(0);
}
@@ -152,7 +167,7 @@ public class RouterController {
totalProfit.add(order.getProfit());
totalBalance.add(order.getProfit());
source.setValue(order.getBuyer().getSystem());
sStation.setValue(order.getBuyer());
sStation.setValue(order.getBuyer().getName());
target.setValue(ModelFabric.NONE_SYSTEM);
balance.setDisable(true);
}
@@ -161,7 +176,7 @@ public class RouterController {
totalProfit.sub(order.getProfit());
totalBalance.sub(order.getProfit());
source.setValue(order.getSystem());
sStation.setValue(order.getStation());
sStation.setValue(order.getStation().getName());
target.setValue(ModelFabric.NONE_SYSTEM);
if (orders.isEmpty()) {
balance.setDisable(false);
@@ -169,10 +184,10 @@ public class RouterController {
}
public void addStationToRoute(){
SystemModel s = source.getCompletion();
SystemModel t = target.getCompletion();
StationModel sS = sStation.getValue();
StationModel tS = tStation.getValue();
SystemModel s = source.getValue();
SystemModel t = target.getValue();
StationModel sS = s != null ? s.get(sStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = t != null ? t.get(tStation.getValue()) : ModelFabric.NONE_STATION;
RouteModel r = market.getPath(s, sS, t, tS);
if (r == null) return;
if (route != null){
@@ -181,8 +196,8 @@ public class RouterController {
route = r;
}
refreshPath();
source.setValue(target.getCompletion());
sStation.setValue(tS);
source.setValue(target.getValue());
sStation.setValue(tS.getName());
}
public void editOrders(){
@@ -256,10 +271,10 @@ public class RouterController {
}
public void showOrders(){
SystemModel s = source.getCompletion();
SystemModel t = target.getCompletion();
StationModel sS = sStation.getValue();
StationModel tS = tStation.getValue();
SystemModel s = source.getValue();
SystemModel t = target.getValue();
StationModel sS = s != null ? s.get(sStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = t != null ? t.get(tStation.getValue()) : ModelFabric.NONE_STATION;
market.getOrders(s, sS, t, tS, totalBalance.getValue().doubleValue(), result -> {
Optional<OrderModel> order = Screeners.showOrders(result);
if (order.isPresent()){
@@ -270,10 +285,10 @@ public class RouterController {
}
public void showRoutes(){
SystemModel s = source.getCompletion();
SystemModel t = target.getCompletion();
StationModel sS = sStation.getValue();
StationModel tS = tStation.getValue();
SystemModel s = source.getValue();
SystemModel t = target.getValue();
StationModel sS = s != null ? s.get(sStation.getValue()) : ModelFabric.NONE_STATION;
StationModel tS = t != null ? t.get(tStation.getValue()) : ModelFabric.NONE_STATION;
market.getRoutes(s, sS, t, tS, totalBalance.getValue().doubleValue(), new CrawlerSpecificator(), routes -> {
Optional<RouteModel> path = Screeners.showRouters(routes);
if (path.isPresent()){
@@ -319,26 +334,26 @@ public class RouterController {
path.setContent(null);
}
private class RouterChangeListener extends ChangeMarketListener {
private final ChangeMarketListener routerChangeListener = new ChangeMarketListener() {
@Override
public void add(StationModel station) {
if (station.getSystem().equals(source.getCompletion())){
sStation.getItems().add(station);
if (station.getSystem().equals(source.getValue())){
sStation.getItems().add(station.getName());
}
if (station.getSystem().equals(target.getCompletion())){
tStation.getItems().add(station);
if (station.getSystem().equals(target.getValue())){
tStation.getItems().add(station.getName());
}
}
@Override
public void remove(StationModel station) {
if (station.getSystem().equals(source.getCompletion())){
sStation.getItems().remove(station);
if (station.getSystem().equals(source.getValue())){
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.ChangeMarketListener;
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 java.util.Collection;
@@ -25,7 +28,8 @@ public class SearchController {
private final static Logger LOG = LoggerFactory.getLogger(SearchController.class);
@FXML
private ComboBox<SystemModel> source;
private TextField sourceText;
private AutoCompletion<SystemModel> source;
@FXML
private RadioButton rbSeller;
@FXML
@@ -61,6 +65,7 @@ public class SearchController {
@FXML
private void initialize() {
init();
rbBuyer.setToggleGroup(offerType);
rbBuyer.setUserData(OFFER_TYPE.BUY);
rbSeller.setToggleGroup(offerType);
@@ -80,17 +85,18 @@ public class SearchController {
});
BindingsHelper.setTableViewItems(tblResults, results);
items.setItems(itemsList);
init();
}
void init(){
if (market != null) market.getNotificator().remove(searchChangeListener);
market = MainController.getMarket();
market.getNotificator().add(new SearchChangeListener());
source.setItems(market.systemsProperty());
market.getNotificator().add(searchChangeListener);
SystemsProvider provider = market.getSystemsProvider();
if (source != null) source.dispose();
source = new AutoCompletion<>(sourceText, new CachedSuggestionProvider<>(provider), ModelFabric.NONE_SYSTEM, provider.getConverter());
itemsList.clear();
itemsList.add(ModelFabric.NONE_ITEM);
itemsList.addAll(market.itemsProperty().get());
source.getSelectionModel().selectFirst();
}
@@ -105,6 +111,7 @@ public class SearchController {
@FXML
private void searchStations(){
MarketFilter filter = new MarketFilter();
//TODO: set center = source
filter.setDistance(distance.getValue().doubleValue());
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);
@@ -195,8 +202,7 @@ public class SearchController {
}
private class SearchChangeListener extends ChangeMarketListener {
private final ChangeMarketListener searchChangeListener = new ChangeMarketListener() {
@Override
public void add(ItemModel item) {
addItem(item);
@@ -206,6 +212,6 @@ public class SearchController {
public void remove(ItemModel item) {
removeItem(item);
}
}
};
}

View File

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

View File

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

View File

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

View File

@@ -209,7 +209,9 @@ public class RouteModel {
Collection<StationModel> res = new HashSet<>();
int startIndex = _route.isLoop() ? 1 : offset+1;
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)
.forEach(res::add);
return res;

View File

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

View File

@@ -9,6 +9,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.trader.core.*;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
@@ -100,17 +101,26 @@ public class SystemModel {
return system.get().stream().map(this::asModel).collect(Collectors.toList());
}
public ObservableList<StationModel> getStationsList() {
ObservableList<StationModel> res = FXCollections.observableArrayList(ModelFabric.NONE_STATION);
res.addAll(getStations());
public Collection<String> getStationNames() {
return system.getVendorNames();
}
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;
}
public List<StationModel> getStations(final SERVICE_TYPE service) {
return system.get().stream().filter(v -> v.has(service)).map(this::asModel).collect(Collectors.toList());
public List<String> getStationNames(final SERVICE_TYPE service) {
return system.get().stream().filter(v -> v.has(service)).map(Vendor::getName).collect(Collectors.toList());
}
public StationModel get(String name){
if (name == null) return ModelFabric.NONE_STATION;
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() {
synchronized (listener){
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.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.control.TextField;
import javafx.util.Callback;
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 StringConverter<T> converter;
private final AutoTextFieldBinding binding;
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());
}
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.notFoundItem = notFoundItem;
this.suggestionProvider = 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;
}
public T getCompletion() {
public T getValue() {
return completion.get();
}
@@ -51,7 +54,7 @@ public class AutoCompletion<T> {
return binding.getCompletionTarget();
}
public ObjectProperty<T> completionProperty() {
public ObjectProperty<T> valueProperty() {
return completion;
}
@@ -61,14 +64,22 @@ public class AutoCompletion<T> {
public void setValue(T value) {
completion.setValue(value);
binding.completeUserInput(value);
binding.completeUserInput(converter.toString(value));
}
private class AutoTextFieldBinding extends AutoCompletionBinding<T>{
public AutoTextFieldBinding(final TextField textField,
Callback<ISuggestionRequest, Collection<T>> suggestionProvider) {
public void setConverter(StringConverter<T> converter){
this.converter = converter;
}
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().focusedProperty().addListener(focusChangedListener);
@@ -86,10 +97,9 @@ public class AutoCompletion<T> {
}
/** {@inheritDoc} */
@Override protected void completeUserInput(T completion){
String newText = converter.toString(completion);
getCompletionTarget().setText(newText);
getCompletionTarget().positionCaret(newText.length());
@Override protected void completeUserInput(String completion){
getCompletionTarget().setText(completion);
getCompletionTarget().positionCaret(completion.length());
}
private final ChangeListener<String> textChangeListener = (obs, oldText, newText) -> {
@@ -100,7 +110,7 @@ public class AutoCompletion<T> {
};
private final ChangeListener<Boolean> focusChangedListener = (obs, oldFocused, newFocused) -> {
if(newFocused == false)
if(newFocused != null && !newFocused)
hidePopup();
};
}

View File

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

View File

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

View File

@@ -7,26 +7,26 @@ import ru.trader.model.StationModel;
import java.util.Comparator;
public class StationsProvider extends CachedSuggestionProvider<StationModel> {
public class StationsProvider extends AbstractSuggestionProvider<String> {
private final StringConverter<StationModel> converter;
private final Comparator<StationModel> comparator;
private final Comparator<String> comparator;
public StationsProvider(MarketModel market) {
super(market.stationsProperty());
super(market.getStationNames());
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
protected Comparator<StationModel> getComparator() {
protected Comparator<String> getComparator() {
return comparator;
}
@Override
protected boolean isMatch(StationModel suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String s = converter.toString(suggestion).toLowerCase();
protected boolean isMatch(String suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String s = suggestion.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;
public class SystemsProvider extends CachedSuggestionProvider<SystemModel> {
public class SystemsProvider extends AbstractSuggestionProvider<String> {
private final StringConverter<SystemModel> converter;
private final Comparator<SystemModel> comparator;
private final Comparator<String> comparator;
public SystemsProvider(MarketModel market) {
super(market.systemsProperty());
super(market.getSystemNames());
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
protected Comparator<SystemModel> getComparator() {
protected Comparator<String> getComparator() {
return comparator;
}
@Override
protected boolean isMatch(SystemModel suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String s = converter.toString(suggestion).toLowerCase();
return s.contains(request.getUserText().toLowerCase());
protected boolean isMatch(String suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String s = suggestion.toLowerCase();
return s.startsWith(request.getUserText().toLowerCase());
}
public StringConverter<SystemModel> getConverter() {

View File

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

View File

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

View File

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

View File

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

View File

@@ -25,7 +25,7 @@
<ColumnConstraints minWidth="150" maxWidth="150"/>
</columnConstraints>
<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">
<RadioButton fx:id="rbSeller" text="%market.order.seller"/>
<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("Sol", 0, 0, 0);
MarketModel marketModel = new MarketModel(market);
system1 = marketModel.systemsProperty().get(0);
system2 = marketModel.systemsProperty().get(1);
system3 = marketModel.systemsProperty().get(2);
system4 = marketModel.systemsProperty().get(3);
system5 = marketModel.systemsProperty().get(4);
system6 = marketModel.systemsProperty().get(5);
system7 = marketModel.systemsProperty().get(6);
system8 = marketModel.systemsProperty().get(7);
system1 = marketModel.get(marketModel.getSystemNames().get(0));
system2 = marketModel.get(marketModel.getSystemNames().get(1));
system3 = marketModel.get(marketModel.getSystemNames().get(2));
system4 = marketModel.get(marketModel.getSystemNames().get(3));
system5 = marketModel.get(marketModel.getSystemNames().get(4));
system6 = marketModel.get(marketModel.getSystemNames().get(5));
system7 = marketModel.get(marketModel.getSystemNames().get(6));
system8 = marketModel.get(marketModel.getSystemNames().get(7));
}
@Test