From 2604939f967b9586a1aaf4351080c0a60d5866cd Mon Sep 17 00:00:00 2001 From: iMoHax Date: Sun, 17 Aug 2014 22:49:37 +0400 Subject: [PATCH] add paths layout --- client/src/main/java/ru/trader/Main.java | 1 + .../trader/controllers/PathsController.java | 64 +++++++++++++++++++ .../trader/controllers/RoutersController.java | 51 +++++++++++---- .../java/ru/trader/controllers/Screeners.java | 15 +++++ .../java/ru/trader/model/MarketModel.java | 25 +++++++- .../java/ru/trader/model/PathRouteModel.java | 50 +++++++++++++++ .../view/support/cells/PathRouteCell.java | 57 +++++++++++++++++ client/src/main/resources/view/orders.fxml | 4 +- client/src/main/resources/view/paths.fxml | 45 +++++++++++++ client/src/main/resources/view/routers.fxml | 40 ++++++++---- .../java/ru/trader/core/MarketAnalyzer.java | 27 +++++++- .../main/java/ru/trader/graph/PathRoute.java | 15 ++++- 12 files changed, 364 insertions(+), 30 deletions(-) create mode 100644 client/src/main/java/ru/trader/controllers/PathsController.java create mode 100644 client/src/main/java/ru/trader/model/PathRouteModel.java create mode 100644 client/src/main/java/ru/trader/view/support/cells/PathRouteCell.java create mode 100644 client/src/main/resources/view/paths.fxml diff --git a/client/src/main/java/ru/trader/Main.java b/client/src/main/java/ru/trader/Main.java index c525819..8fc85ae 100644 --- a/client/src/main/java/ru/trader/Main.java +++ b/client/src/main/java/ru/trader/Main.java @@ -67,6 +67,7 @@ public class Main extends Application { Screeners.loadAddOfferStage(getUrl(("oEditor.fxml"))); Screeners.loadOrdersStage(getUrl(("orders.fxml"))); Screeners.loadTopOrdersStage(getUrl(("topOrders.fxml"))); + Screeners.loadPathsStage(getUrl(("paths.fxml"))); } private static URL getUrl(String filename) throws MalformedURLException { diff --git a/client/src/main/java/ru/trader/controllers/PathsController.java b/client/src/main/java/ru/trader/controllers/PathsController.java new file mode 100644 index 0000000..7073d49 --- /dev/null +++ b/client/src/main/java/ru/trader/controllers/PathsController.java @@ -0,0 +1,64 @@ +package ru.trader.controllers; + +import javafx.collections.FXCollections; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.Parent; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.cell.TextFieldTableCell; +import javafx.util.converter.LongStringConverter; +import org.controlsfx.control.ButtonBar; +import org.controlsfx.control.action.AbstractAction; +import org.controlsfx.control.action.Action; +import org.controlsfx.dialog.Dialog; +import ru.trader.graph.PathRoute; +import ru.trader.model.OrderModel; +import ru.trader.model.PathRouteModel; + +import java.util.Collection; + +public class PathsController { + private final Action OK = new AbstractAction("OK") { + { + ButtonBar.setType(this, ButtonBar.ButtonType.OK_DONE); + } + + + @Override + public void handle(ActionEvent event) { + Dialog dlg = (Dialog) event.getSource(); + dlg.hide(); + } + }; + + @FXML + private TableView tblPaths; + + + @FXML + private void initialize() { + + } + + + public void showDialog(Parent parent, Parent content, Collection paths) { + + init(paths); + + Dialog dlg = new Dialog(parent, String.format("Доступные маршруты")); + dlg.setContent(content); + dlg.getActions().addAll(OK, Dialog.Actions.CANCEL); + dlg.setResizable(false); + dlg.show(); + } + + + private void init(Collection paths) { + tblPaths.getSelectionModel().clearSelection(); + tblPaths.setItems(FXCollections.observableArrayList(paths)); + if (tblPaths.getSortOrder().size()>0) + tblPaths.sort(); + } + +} diff --git a/client/src/main/java/ru/trader/controllers/RoutersController.java b/client/src/main/java/ru/trader/controllers/RoutersController.java index 96dcd68..1da29bd 100644 --- a/client/src/main/java/ru/trader/controllers/RoutersController.java +++ b/client/src/main/java/ru/trader/controllers/RoutersController.java @@ -21,15 +21,22 @@ public class RoutersController { @FXML private NumberField balance; - @FXML private NumberField cargo; + @FXML + private NumberField distance; + @FXML + private NumberField tank; + @FXML + private NumberField jumps; @FXML private Button add; @FXML - private ComboBox vendors; + private ComboBox source; + @FXML + private ComboBox target; @FXML private TableView tblOrders; @@ -40,10 +47,23 @@ public class RoutersController { @FXML private NumberField totalBalance; + private MarketModel market; + @FXML private void initialize(){ init(); balance.numberProperty().addListener((ov, o, n) -> totalBalance.setValue(n)); + cargo.numberProperty().addListener((ov, o, n) -> market.setCargo(n.longValue())); + 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.setValue(1000); + cargo.setValue(4); + tank.setValue(30); + distance.setValue(7); + jumps.setValue(4); + add.disableProperty().bind(this.balance.wrongProperty().or(this.cargo.wrongProperty())); tblOrders.setItems(FXCollections.observableArrayList()); tblOrders.getItems().addListener((ListChangeListener) c -> { @@ -64,30 +84,30 @@ public class RoutersController { void init(){ - MarketModel market = MainController.getMarket(); - vendors.setItems(market.vendorsProperty()); - vendors.getSelectionModel().selectFirst(); + market = MainController.getMarket(); + source.setItems(market.vendorsProperty()); + source.getSelectionModel().selectFirst(); + target.setItems(market.vendorsProperty()); tblOrders.getItems().clear(); totalBalance.setValue(balance.getValue()); totalProfit.setValue(0); } private Collection getOffers(){ - MarketModel market = MainController.getMarket(); - VendorModel vendor = vendors.getSelectionModel().getSelectedItem(); + VendorModel vendor = source.getSelectionModel().getSelectedItem(); return vendor.getSells(market::asOfferDescModel); } private void onAdd(OrderModel order){ totalProfit.add(order.getProfit()); totalBalance.add(order.getProfit()); - vendors.getSelectionModel().select(order.getBuyer().getVendor()); + source.getSelectionModel().select(order.getBuyer().getVendor()); } private void onRemove(OrderModel order) { totalProfit.sub(order.getProfit()); totalBalance.sub(order.getProfit()); - vendors.getSelectionModel().select(order.getVendor()); + source.getSelectionModel().select(order.getVendor()); } public void addOrders(){ @@ -113,11 +133,20 @@ public class RoutersController { public void showTopOrders(){ - MarketModel market = MainController.getMarket(); - OrderModel order = Screeners.showTopOrders(market.getTop(100, totalBalance.getValue().doubleValue(), cargo.getValue().longValue())); + OrderModel order = Screeners.showTopOrders(market.getTop(100, totalBalance.getValue().doubleValue())); if (order!=null){ tblOrders.getItems().add(order); } } + public void showRoutes(){ + VendorModel s = source.getSelectionModel().getSelectedItem(); + VendorModel t = target.getSelectionModel().getSelectedItem(); + if (t==null) return; + + MarketModel market = MainController.getMarket(); + Screeners.showRouters(market.getRouters(s, t, totalBalance.getValue().doubleValue())); + } + + } diff --git a/client/src/main/java/ru/trader/controllers/Screeners.java b/client/src/main/java/ru/trader/controllers/Screeners.java index 2738575..8f04c38 100644 --- a/client/src/main/java/ru/trader/controllers/Screeners.java +++ b/client/src/main/java/ru/trader/controllers/Screeners.java @@ -24,6 +24,7 @@ public class Screeners { private static Parent editOffersScreen; private static Parent ordersScreen; private static Parent topOrdersScreen; + private static Parent pathsScreen; private static MainController mainController; private static ItemDescController itemDescController; @@ -31,6 +32,7 @@ public class Screeners { private static OffersEditorController oEditorController; private static OrdersController ordersController; private static TopOrdersController topOrdersController; + private static PathsController pathsController; private static FXMLLoader initLoader(URL url){ FXMLLoader loader = new FXMLLoader(url); @@ -94,6 +96,15 @@ public class Screeners { stage.setScene(new Scene(topOrdersScreen)); } + public static void loadPathsStage(URL fxml) throws IOException { + FXMLLoader loader = initLoader(fxml); + pathsScreen = loader.load(); + addStylesheet(pathsScreen); + pathsController = loader.getController(); + Stage stage = new Stage(); + stage.setScene(new Scene(pathsScreen)); + } + public static void show(Node node){ mainController.getMainPane().setCenter(node); } @@ -148,4 +159,8 @@ public class Screeners { public static OrderModel showTopOrders(ObservableList top) { return topOrdersController.showDialog(mainScreen, topOrdersScreen, top); } + + public static void showRouters(ObservableList routers) { + pathsController.showDialog(mainScreen, pathsScreen, routers); + } } diff --git a/client/src/main/java/ru/trader/model/MarketModel.java b/client/src/main/java/ru/trader/model/MarketModel.java index c380f98..5d72072 100644 --- a/client/src/main/java/ru/trader/model/MarketModel.java +++ b/client/src/main/java/ru/trader/model/MarketModel.java @@ -169,13 +169,32 @@ public class MarketModel { return ModelFabrica.getModel(vendor, this); } - public ObservableList getTop(int limit, double balance, long max){ - return BindingsHelper.observableList(analyzer.getTop(limit, balance, max), (o) -> { - OrderModel model = new OrderModel(asOfferDescModel(o.getSell()), balance, max); + public ObservableList getTop(int limit, double balance){ + return BindingsHelper.observableList(analyzer.getTop(limit, balance), (o) -> { + OrderModel model = new OrderModel(asOfferDescModel(o.getSell()), balance, analyzer.getCargo()); model.setBuyer(asModel(o.getBuy())); model.setCount(model.getMax()); return model; }); } + public void setCargo(long cargo){ + analyzer.setCargo(cargo); + } + + public void setTank(double tank){ + analyzer.setTank(tank); + } + + public void setJumps(int jumps){ + analyzer.setJumps(jumps); + } + + public void setDistance(double distance){ + analyzer.setMaxDistance(distance); + } + + public ObservableList getRouters(VendorModel from, VendorModel to, double balance){ + return BindingsHelper.observableList(analyzer.getPaths(from.getVendor(), to.getVendor(), balance), PathRouteModel::new); + } } diff --git a/client/src/main/java/ru/trader/model/PathRouteModel.java b/client/src/main/java/ru/trader/model/PathRouteModel.java new file mode 100644 index 0000000..48f9f92 --- /dev/null +++ b/client/src/main/java/ru/trader/model/PathRouteModel.java @@ -0,0 +1,50 @@ +package ru.trader.model; + +import ru.trader.core.Vendor; +import ru.trader.graph.PathRoute; + +public class PathRouteModel { + private final double distance; + private final double totalProfit; + private final int jumps; + private final int refuels; + + private final PathRoute path; + + public PathRouteModel(PathRoute path) { + this.path = path; + PathRoute p = path.getRoot(); + double pr =0, d = 0; int j = 0, r = 0; + while (p.hasNext()){ + p = p.getNext(); + d += path.getDistance(); + pr += p.getMaxProfit(); + j++; + if (p.isRefill()) r++; + } + totalProfit = pr; + distance = d; + jumps = j; + refuels = r; + } + + public double getDistance() { + return distance; + } + + public double getTotalProfit() { + return totalProfit; + } + + public int getJumps() { + return jumps; + } + + public int getRefuels() { + return refuels; + } + + public PathRoute getPath() { + return path; + } +} diff --git a/client/src/main/java/ru/trader/view/support/cells/PathRouteCell.java b/client/src/main/java/ru/trader/view/support/cells/PathRouteCell.java new file mode 100644 index 0000000..ecf07b2 --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/PathRouteCell.java @@ -0,0 +1,57 @@ +package ru.trader.view.support.cells; + +import javafx.geometry.Pos; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; +import javafx.util.Callback; +import org.controlsfx.glyphfont.GlyphFontRegistry; +import ru.trader.core.Order; +import ru.trader.graph.PathRoute; +import ru.trader.model.PathRouteModel; + +public class PathRouteCell implements Callback, TableCell> { + @Override + public TableCell call(TableColumn param) { + return new TableCell(){ + @Override + public void updateItem(T value, boolean empty) { + super.updateItem(value, empty); + if (!empty){ + PathRoute p = ((PathRouteModel) getTableRow().getItem()).getPath().getRoot(); + HBox hBox = new HBox(); + + HBox v = new HBox(); + v.setAlignment(Pos.BOTTOM_CENTER); + v.getChildren().add(new Text(p.get().getName())); + while (p.hasNext()){ + p = p.getNext(); + if (p.isRefill()) v.getChildren().add(GlyphFontRegistry.glyph("FontAwesome|REFRESH")); + hBox.getChildren().add(v); + + VBox dist = new VBox(new Text(String.format("(%+.0f LY)", p.getDistance()))); + dist.setAlignment(Pos.BASELINE_CENTER); + dist.getChildren().add(GlyphFontRegistry.glyph("FontAwesome|LONG_ARROW_RIGHT")); + hBox.getChildren().addAll(dist); + + v = new HBox(); + v.setAlignment(Pos.BOTTOM_CENTER); + v.getChildren().add(new Text(p.get().getName())); + v.getChildren().add(new Text(String.format(" (%+.0f) ", p.getMaxProfit()))); + } + hBox.getChildren().add(v); + setText(null); + setGraphic(hBox); + } else { + setText(null); + setGraphic(null); + } + } + + + }; + } + +} diff --git a/client/src/main/resources/view/orders.fxml b/client/src/main/resources/view/orders.fxml index 1eb4ceb..8fd6d73 100644 --- a/client/src/main/resources/view/orders.fxml +++ b/client/src/main/resources/view/orders.fxml @@ -21,7 +21,7 @@ - + @@ -34,7 +34,7 @@ - + diff --git a/client/src/main/resources/view/paths.fxml b/client/src/main/resources/view/paths.fxml new file mode 100644 index 0000000..467dbbf --- /dev/null +++ b/client/src/main/resources/view/paths.fxml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/src/main/resources/view/routers.fxml b/client/src/main/resources/view/routers.fxml index 4d5511e..42c49fc 100644 --- a/client/src/main/resources/view/routers.fxml +++ b/client/src/main/resources/view/routers.fxml @@ -12,21 +12,38 @@ - + - - + + + + + + + + + + - + -