diff --git a/client/src/main/java/ru/trader/controllers/OrdersController.java b/client/src/main/java/ru/trader/controllers/OrdersController.java index 1ddd2aa..d54cd3e 100644 --- a/client/src/main/java/ru/trader/controllers/OrdersController.java +++ b/client/src/main/java/ru/trader/controllers/OrdersController.java @@ -19,7 +19,6 @@ import ru.trader.model.OrderModel; import ru.trader.model.support.BindingsHelper; import java.util.Collection; -import java.util.Optional; public class OrdersController { private final Action OK = new AbstractAction("OK") { @@ -84,7 +83,7 @@ public class OrdersController { } private Collection getOrders() { - return tblOrders.getItems().filtered((o) -> o.getCount()>0 && o.getBuyer()!=null); + return tblOrders.getItems().filtered((o) -> o.getCount()>0 && o.getBuyOffer()!=null); } private void init(Collection offers, double balance, long max) { @@ -105,7 +104,7 @@ public class OrdersController { private void setBuyer(OfferModel offer) { if (order != null && offer!=null) { - order.setBuyer(offer); + order.setBuyOffer(offer); order.setCount(order.getMax()); } } diff --git a/client/src/main/java/ru/trader/controllers/RoutersController.java b/client/src/main/java/ru/trader/controllers/RoutersController.java index 8aaa81e..225d9bc 100644 --- a/client/src/main/java/ru/trader/controllers/RoutersController.java +++ b/client/src/main/java/ru/trader/controllers/RoutersController.java @@ -1,6 +1,7 @@ package ru.trader.controllers; +import javafx.beans.binding.Bindings; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.fxml.FXML; @@ -13,9 +14,6 @@ import ru.trader.view.support.NumberField; import ru.trader.view.support.RouteNode; -import java.util.Collection; - - public class RoutersController { @FXML @@ -33,7 +31,10 @@ public class RoutersController { private ScrollPane path; @FXML - private Button add; + private Button editBtn; + + @FXML + private Button removeBtn; @FXML private ComboBox source; @@ -51,22 +52,36 @@ public class RoutersController { private MarketModel market; + private PathRouteModel route; + @FXML private void initialize(){ init(); balance.numberProperty().addListener((ov, o, n) -> totalBalance.setValue(n)); - cargo.numberProperty().addListener((ov, o, n) -> market.setCargo(n.longValue())); + cargo.numberProperty().addListener((ov, o, n) -> market.setCargo(n.intValue())); tank.numberProperty().addListener((ov, o, n) -> market.setTank(n.doubleValue())); distance.numberProperty().addListener((ov, o, n) -> market.setDistance(n.doubleValue())); jumps.numberProperty().addListener((ov, o, n) -> market.setJumps(n.intValue())); + balance.setOnAction((v)->cargo.requestFocus()); + cargo.setOnAction((v) -> tank.requestFocus()); + tank.setOnAction((v) -> distance.requestFocus()); + distance.setOnAction((v)->jumps.requestFocus()); + jumps.setOnAction((v)->balance.requestFocus()); + balance.setValue(1000); cargo.setValue(4); tank.setValue(20); distance.setValue(7); jumps.setValue(3); - add.disableProperty().bind(this.balance.wrongProperty().or(this.cargo.wrongProperty())); + editBtn.disableProperty().bind(tblOrders.getSelectionModel().selectedIndexProperty().isEqualTo(-1)); + removeBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> { + int sel = tblOrders.getSelectionModel().getSelectedIndex(); + return sel == -1 || sel != tblOrders.getItems().size()-1; + }, tblOrders.getSelectionModel().selectedIndexProperty())); + + tblOrders.setItems(FXCollections.observableArrayList()); tblOrders.getItems().addListener((ListChangeListener) c -> { while (c.next()) { @@ -96,35 +111,47 @@ public class RoutersController { totalProfit.setValue(0); } - private Collection getOffers(){ - VendorModel vendor = source.getSelectionModel().getSelectedItem(); - return vendor.getSells(market::asOfferDescModel); - } private void onAdd(OrderModel order){ totalProfit.add(order.getProfit()); totalBalance.add(order.getProfit()); - source.getSelectionModel().select(order.getBuyer().getVendor()); + source.getSelectionModel().select(order.getBuyOffer().getVendor()); + balance.setDisable(true); + source.setDisable(true); } private void onRemove(OrderModel order) { totalProfit.sub(order.getProfit()); totalBalance.sub(order.getProfit()); source.getSelectionModel().select(order.getVendor()); + if (tblOrders.getItems().isEmpty()) { + balance.setDisable(false); + source.setDisable(false); + } } - public void addOrders(){ - Collection orders = Screeners.showOrders(getOffers(), totalBalance.getValue().doubleValue(), cargo.getValue().longValue()); - if (orders!=null){ - tblOrders.getItems().addAll(orders); + public void editOrders(){ + OrderModel sel = tblOrders.getSelectionModel().getSelectedItem(); + int index = tblOrders.getSelectionModel().getSelectedIndex(); + + OrderModel order = Screeners.showOrders(market.getOrders(sel.getVendor(), sel.getBuyer(), sel.getBalance())); + if (order!=null){ + tblOrders.getItems().set(index, order); } + } public void removeSelected(){ TableView.TableViewSelectionModel select = tblOrders.getSelectionModel(); if (!select.isEmpty()){ int index = select.getSelectedIndex(); + if (index > 0){ + route = route.remove(select.getSelectedItem()); + } else { + route = null; + } tblOrders.getItems().remove(index); + refreshPath(); } } @@ -132,14 +159,16 @@ public class RoutersController { tblOrders.getItems().clear(); totalBalance.setValue(balance.getValue()); totalProfit.setValue(0); - path.setContent(null); + route = null; + refreshPath(); } public void showTopOrders(){ - OrderModel order = Screeners.showTopOrders(market.getTop(100, totalBalance.getValue().doubleValue())); + OrderModel order = Screeners.showOrders(market.getTop(100, totalBalance.getValue().doubleValue())); if (order!=null){ tblOrders.getItems().add(order); + addOrderToPath(order); } } @@ -148,12 +177,13 @@ public class RoutersController { VendorModel t = target.getSelectionModel().getSelectedItem(); OrderModel order; if (t==null){ - order = Screeners.showTopOrders(market.getOrders(s, totalBalance.getValue().doubleValue())); + order = Screeners.showOrders(market.getOrders(s, totalBalance.getValue().doubleValue())); } else { - order = Screeners.showTopOrders(market.getOrders(t, s, totalBalance.getValue().doubleValue())); + order = Screeners.showOrders(market.getOrders(t, s, totalBalance.getValue().doubleValue())); } if (order!=null){ tblOrders.getItems().add(order); + addOrderToPath(order); } } @@ -168,7 +198,7 @@ public class RoutersController { } if (path!=null){ tblOrders.getItems().addAll(path.getOrders()); - setPath(path); + addRouteToPath(path); } } @@ -176,12 +206,33 @@ public class RoutersController { PathRouteModel path = Screeners.showRouters(market.getTopRoutes(totalBalance.getValue().doubleValue())); if (path!=null){ tblOrders.getItems().addAll(path.getOrders()); - setPath(path); + addRouteToPath(path); } } - private void setPath(PathRouteModel route){ - path.setContent(new RouteNode(route).getNode()); + private void addRouteToPath(PathRouteModel route){ + if (this.route == null){ + this.route = route; + } else { + this.route.add(route.getPath()); + } + refreshPath(); + } + + private void addOrderToPath(OrderModel order){ + if (route != null){ + route.add(order); + } else { + route = market.getPath(order); + } + refreshPath(); + } + + private void refreshPath(){ + if (route != null) + path.setContent(new RouteNode(route).getNode()); + else + path.setContent(null); } } diff --git a/client/src/main/java/ru/trader/controllers/Screeners.java b/client/src/main/java/ru/trader/controllers/Screeners.java index 46c70eb..5bf1f47 100644 --- a/client/src/main/java/ru/trader/controllers/Screeners.java +++ b/client/src/main/java/ru/trader/controllers/Screeners.java @@ -156,8 +156,8 @@ public class Screeners { itemDescController.close(); } - public static OrderModel showTopOrders(ObservableList top) { - return topOrdersController.showDialog(mainScreen, topOrdersScreen, top); + public static OrderModel showOrders(ObservableList orders) { + return topOrdersController.showDialog(mainScreen, topOrdersScreen, orders); } public static PathRouteModel showRouters(ObservableList routers) { diff --git a/client/src/main/java/ru/trader/model/MarketModel.java b/client/src/main/java/ru/trader/model/MarketModel.java index 5db9613..c4160d5 100644 --- a/client/src/main/java/ru/trader/model/MarketModel.java +++ b/client/src/main/java/ru/trader/model/MarketModel.java @@ -178,7 +178,7 @@ public class MarketModel { } - public void setCargo(long cargo){ + public void setCargo(int cargo){ analyzer.setCargo(cargo); } @@ -218,4 +218,15 @@ public class MarketModel { return BindingsHelper.observableList(analyzer.getTopPaths(100, balance), this::asModel); } + PathRoute getPath(VendorModel from, VendorModel to) { + return analyzer.getPath(from.getVendor(), to.getVendor()); + } + + public PathRouteModel getPath(OrderModel order) { + PathRoute p = analyzer.getPath(order.getVendor().getVendor(), order.getBuyer().getVendor()); + p.setOrder(new Order(order.getOffer().getOffer(), order.getBuyOffer().getOffer(), order.getCount())); + order.setPath(p); + return asModel(p); + } + } diff --git a/client/src/main/java/ru/trader/model/OrderModel.java b/client/src/main/java/ru/trader/model/OrderModel.java index 6c77184..785acbe 100644 --- a/client/src/main/java/ru/trader/model/OrderModel.java +++ b/client/src/main/java/ru/trader/model/OrderModel.java @@ -2,6 +2,8 @@ package ru.trader.model; import javafx.beans.property.*; import javafx.beans.value.ObservableValue; +import ru.trader.core.Order; +import ru.trader.graph.PathRoute; import ru.trader.model.support.ModelBindings; import java.util.List; @@ -16,6 +18,7 @@ public class OrderModel { private DoubleProperty profit; private DoubleProperty distance; private DoubleProperty bestProfit; + private PathRoute path; public OrderModel(OfferDescModel offer) { this.offer = offer; @@ -34,7 +37,7 @@ public class OrderModel { public OrderModel(OfferDescModel sellOffer, OfferModel buyOffer, long max) { this(sellOffer); this.max = max; - setBuyer(buyOffer); + setBuyOffer(buyOffer); setCount(max); } @@ -95,16 +98,16 @@ public class OrderModel { return profitProperty().get(); } - public ReadOnlyObjectProperty buyerProperty() { + public ReadOnlyObjectProperty buyOfferProperty() { return buyer; } - public void setBuyer(OfferModel buyer) { + public void setBuyOffer(OfferModel buyer) { this.buyer.set(buyer); if (distance!=null) distance.set(getVendor().getDistance(buyer.getVendor())); } - public OfferModel getBuyer() { + public OfferModel getBuyOffer() { return buyer.get(); } @@ -112,6 +115,11 @@ public class OrderModel { return offer.getOffer().getVendor(); } + public VendorModel getBuyer() { + OfferModel buyOffer = getBuyOffer(); + return buyOffer != null ? buyer.get().getVendor() : null; + } + public long getMax() { return max; } @@ -126,11 +134,22 @@ public class OrderModel { public ReadOnlyDoubleProperty distanceProperty() { if (distance == null){ - OfferModel buyOffer = getBuyer(); - distance = new SimpleDoubleProperty(buyOffer!=null ? getVendor().getDistance(buyOffer.getVendor()) : Double.NaN); + VendorModel buyer = getBuyer(); + distance = new SimpleDoubleProperty(buyer!=null ? getVendor().getDistance(buyer) : Double.NaN); } return distance; } + void setPath(PathRoute path) { + this.path = path; + } + + PathRoute getPath() { + return path; + } + + public double getBalance(){ + return path != null ? path.getBalance() : max * offer.getPrice(); + } } diff --git a/client/src/main/java/ru/trader/model/PathRouteModel.java b/client/src/main/java/ru/trader/model/PathRouteModel.java index 4c564fc..08296f2 100644 --- a/client/src/main/java/ru/trader/model/PathRouteModel.java +++ b/client/src/main/java/ru/trader/model/PathRouteModel.java @@ -21,15 +21,14 @@ public class PathRouteModel { this.path = path; PathRoute p = path.getRoot(); totalProfit = p.getProfit(); - double d = 0; int j = 0, r = 0, l = 0; + lands = p.getLandsCount(); + double d = 0; int j = 0, r = 0; while (p.hasNext()){ p = p.getNext(); d += p.getDistance(); j++; if (p.isRefill()) r++; - if (p.getBest() != null || p.isRefill()) l++; } - lands = l; distance = d; jumps = j; refuels = r; @@ -71,7 +70,9 @@ public class PathRouteModel { p = p.getNext(); if (cargo == null && p.getBest()!=null){ cargo = p.getBest(); - res.add(market.asModel(cargo)); + OrderModel order = market.asModel(cargo); + order.setPath(p); + res.add(order); } if (cargo!=null && cargo.isBuyer(p.get())){ cargo = null; @@ -79,4 +80,21 @@ public class PathRouteModel { } return res; } + + public void add(OrderModel order){ + PathRoute p = market.getPath(order.getVendor(), order.getBuyer()); + if (p == null) return; + p.getRoot().getNext().setOrder(new Order(order.getOffer().getOffer(), order.getBuyOffer().getOffer(), order.getCount())); + PathRoute head = path.getEnd(); + add(p); + order.setPath(head); + } + + public void add(PathRoute route){ + path.getEnd().add(route, true); + } + + public PathRouteModel remove(OrderModel order) { + return new PathRouteModel(path.dropTo(order.getVendor().getVendor()), market); + } } diff --git a/client/src/main/resources/view/orders.fxml b/client/src/main/resources/view/orders.fxml index 8fd6d73..f871d86 100644 --- a/client/src/main/resources/view/orders.fxml +++ b/client/src/main/resources/view/orders.fxml @@ -25,7 +25,7 @@ - + diff --git a/client/src/main/resources/view/routers.fxml b/client/src/main/resources/view/routers.fxml index 0dfacc9..61dd870 100644 --- a/client/src/main/resources/view/routers.fxml +++ b/client/src/main/resources/view/routers.fxml @@ -47,8 +47,8 @@ -