From fe9abae295087bf4d74f04a0fb408e50294ba104 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Wed, 6 Aug 2014 16:10:33 +0400 Subject: [PATCH] add support position of station --- .../trader/controllers/OrdersController.java | 9 ++++- .../controllers/VendorEditorController.java | 14 ++++++++ .../java/ru/trader/model/MarketModel.java | 9 +++++ .../main/java/ru/trader/model/OrderModel.java | 13 ++++++- .../java/ru/trader/model/VendorModel.java | 34 ++++++++++++++++++ .../model/support/ChangeMarketListener.java | 3 ++ .../ru/trader/view/support/NumberField.java | 2 +- .../trader/view/support/cells/DoubleCell.java | 12 ++++++- client/src/main/resources/view/orders.fxml | 12 ++++--- client/src/main/resources/view/routers.fxml | 8 +++-- client/src/main/resources/view/topOrders.fxml | 10 ++++-- client/src/main/resources/view/vEditor.fxml | 17 +++++++-- core/src/main/java/ru/trader/core/Market.java | 2 ++ .../java/ru/trader/core/MarketSupport.java | 8 +++++ core/src/main/java/ru/trader/core/Vendor.java | 36 +++++++++++++++++++ .../ru/trader/store/MarketDocHandler.java | 16 +++++++-- .../ru/trader/store/MarketStreamWriter.java | 4 +++ core/src/main/resources/store/trader.xsd | 3 ++ 18 files changed, 193 insertions(+), 19 deletions(-) diff --git a/client/src/main/java/ru/trader/controllers/OrdersController.java b/client/src/main/java/ru/trader/controllers/OrdersController.java index 72789ae..1ddd2aa 100644 --- a/client/src/main/java/ru/trader/controllers/OrdersController.java +++ b/client/src/main/java/ru/trader/controllers/OrdersController.java @@ -50,6 +50,9 @@ public class OrdersController { @FXML private TableColumn curProfit; + @FXML + private TableColumn curDistance; + private OrderModel order; @FXML @@ -60,7 +63,11 @@ public class OrdersController { tblBuyers.getSelectionModel().selectedItemProperty().addListener((v, o, n) -> setBuyer(n)); curProfit.setCellValueFactory(param -> { OfferModel offer = param.getValue(); - return order !=null ? order.getProfit(offer) : new SimpleDoubleProperty(Double.NaN).asObject(); + return order !=null ? order.getProfit(offer) : new SimpleDoubleProperty(Double.NaN).asObject(); + }); + curDistance.setCellValueFactory(param -> { + OfferModel offer = param.getValue(); + return new SimpleDoubleProperty(order !=null ? order.getVendor().getDistance(offer.getVendor()) :Double.NaN).asObject(); }); } diff --git a/client/src/main/java/ru/trader/controllers/VendorEditorController.java b/client/src/main/java/ru/trader/controllers/VendorEditorController.java index 575075b..489be49 100644 --- a/client/src/main/java/ru/trader/controllers/VendorEditorController.java +++ b/client/src/main/java/ru/trader/controllers/VendorEditorController.java @@ -19,6 +19,7 @@ import org.slf4j.LoggerFactory; import ru.trader.core.OFFER_TYPE; import ru.trader.model.*; import ru.trader.model.support.BindingsHelper; +import ru.trader.view.support.NumberField; import ru.trader.view.support.PriceStringConverter; import ru.trader.view.support.ViewUtils; import ru.trader.view.support.cells.TextFieldCell; @@ -54,6 +55,14 @@ public class VendorEditorController { @FXML private TableColumn sell; + @FXML + private NumberField x; + @FXML + private NumberField y; + @FXML + private NumberField z; + + @FXML private void initialize() { items.getSelectionModel().setCellSelectionEnabled(true); @@ -78,6 +87,9 @@ public class VendorEditorController { private void fill(){ name.setText(vendor.getName()); + x.setValue(vendor.getX()); + y.setValue(vendor.getY()); + z.setValue(vendor.getZ()); vendor.getSells().forEach(this::fillOffer); vendor.getBuys().forEach(this::fillOffer); } @@ -151,11 +163,13 @@ public class VendorEditorController { if (vendor == null) { market.setAlert(false); vendor = market.newVendor(name.getText()); + vendor.setPosition(x.getValue().doubleValue(), y.getValue().doubleValue(), z.getValue().doubleValue()); items.getItems().forEach((o) -> commit(market, vendor, o)); market.setAlert(true); market.add(vendor); } else { vendor.setName(name.getText()); + vendor.setPosition(x.getValue().doubleValue(), y.getValue().doubleValue(), z.getValue().doubleValue()); items.getItems().forEach((o) -> commit(market, vendor, o)); } } diff --git a/client/src/main/java/ru/trader/model/MarketModel.java b/client/src/main/java/ru/trader/model/MarketModel.java index c0eb745..2e384e9 100644 --- a/client/src/main/java/ru/trader/model/MarketModel.java +++ b/client/src/main/java/ru/trader/model/MarketModel.java @@ -67,6 +67,15 @@ public class MarketModel { return listener; } + void updatePosition(VendorModel model, double x, double y, double z) { + Vendor vendor = model.getVendor(); + double oldX = vendor.getX(); + double oldY = vendor.getY(); + double oldZ = vendor.getZ(); + market.updatePosition(vendor, x, y, z); + if (alert) listener.forEach((c) -> c.positionChange(model, oldX, oldY, oldZ, x, y, z)); + } + void updateName(ItemModel model, String value) { Item item = model.getItem(); String old = item.getName(); diff --git a/client/src/main/java/ru/trader/model/OrderModel.java b/client/src/main/java/ru/trader/model/OrderModel.java index 7b67144..d3312fb 100644 --- a/client/src/main/java/ru/trader/model/OrderModel.java +++ b/client/src/main/java/ru/trader/model/OrderModel.java @@ -14,6 +14,7 @@ public class OrderModel { private final ObjectProperty buyer = new SimpleObjectProperty<>(); private long max; private DoubleProperty profit; + private DoubleProperty distance; private DoubleProperty bestProfit; public OrderModel(OfferDescModel offer) { @@ -87,12 +88,13 @@ public class OrderModel { return profitProperty().get(); } - public ObjectProperty buyerProperty() { + public ReadOnlyObjectProperty buyerProperty() { return buyer; } public void setBuyer(OfferModel buyer) { this.buyer.set(buyer); + if (distance!=null) distance.set(getVendor().getDistance(buyer.getVendor())); } public OfferModel getBuyer() { @@ -115,4 +117,13 @@ public class OrderModel { return offer.getBuyer(); } + public ReadOnlyDoubleProperty distanceProperty() { + if (distance == null){ + OfferModel buyOffer = getBuyer(); + distance = new SimpleDoubleProperty(buyOffer!=null ? getVendor().getDistance(buyOffer.getVendor()) : Double.NaN); + } + return distance; + } + + } diff --git a/client/src/main/java/ru/trader/model/VendorModel.java b/client/src/main/java/ru/trader/model/VendorModel.java index a46b892..c003c7b 100644 --- a/client/src/main/java/ru/trader/model/VendorModel.java +++ b/client/src/main/java/ru/trader/model/VendorModel.java @@ -36,6 +36,40 @@ public class VendorModel { return name; } + public void setPosition(double x, double y, double z){ + if (x == vendor.getX() && y == vendor.getY() && z == vendor.getZ()) return; + LOG.info("Change position of vendor {} to ({};{};{})", vendor, x, y, z); + market.updatePosition(this, x, y, z); + } + + public double getX(){ + return vendor.getX(); + } + + public double getY(){ + return vendor.getY(); + } + + public double getZ(){ + return vendor.getZ(); + } + + public ReadOnlyDoubleProperty xProperty(){ + return new SimpleDoubleProperty(vendor.getX()); + } + + public ReadOnlyDoubleProperty yProperty(){ + return new SimpleDoubleProperty(vendor.getY()); + } + + public ReadOnlyDoubleProperty zProperty(){ + return new SimpleDoubleProperty(vendor.getZ()); + } + + public double getDistance(VendorModel other){ + return vendor.getDistance(other.vendor); + } + public List getSells() { return vendor.getAllSellOffers().stream().map(market::asModel).collect(Collectors.toList()); } diff --git a/client/src/main/java/ru/trader/model/support/ChangeMarketListener.java b/client/src/main/java/ru/trader/model/support/ChangeMarketListener.java index f2f8f22..dd0280d 100644 --- a/client/src/main/java/ru/trader/model/support/ChangeMarketListener.java +++ b/client/src/main/java/ru/trader/model/support/ChangeMarketListener.java @@ -31,4 +31,7 @@ public class ChangeMarketListener { public void remove(OfferModel offer) { } + + public void positionChange(VendorModel vendor, double oldX, double oldY, double oldZ, double x, double y, double z) { + } } diff --git a/client/src/main/java/ru/trader/view/support/NumberField.java b/client/src/main/java/ru/trader/view/support/NumberField.java index 73e7fab..eaecced 100644 --- a/client/src/main/java/ru/trader/view/support/NumberField.java +++ b/client/src/main/java/ru/trader/view/support/NumberField.java @@ -12,7 +12,7 @@ public class NumberField extends TextField { private final static NumberStringConverter converter = new NumberStringConverter("#0.#"); private final Tooltip tooltip = new Tooltip(); - private final ObjectProperty number = new SimpleObjectProperty<>(0); + private final ObjectProperty number = new SimpleObjectProperty(0); private final BooleanProperty wrong = new SimpleBooleanProperty(false); public ObjectProperty numberProperty() { diff --git a/client/src/main/java/ru/trader/view/support/cells/DoubleCell.java b/client/src/main/java/ru/trader/view/support/cells/DoubleCell.java index 7076534..0563270 100644 --- a/client/src/main/java/ru/trader/view/support/cells/DoubleCell.java +++ b/client/src/main/java/ru/trader/view/support/cells/DoubleCell.java @@ -1,11 +1,21 @@ package ru.trader.view.support.cells; +import javafx.beans.NamedArg; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.util.Callback; import ru.trader.view.support.NaNComparator; public class DoubleCell implements Callback, TableCell> { + private String format = "%.0f"; + + public DoubleCell() { + } + + public DoubleCell(@NamedArg("format")String format) { + this.format = format; + } + @Override public TableCell call(TableColumn param) { param.setComparator(new NaNComparator<>()); @@ -17,7 +27,7 @@ public class DoubleCell implements Callback, TableCell setText(null); setGraphic(null); } else { - setText(String.format("%.0f", item)); + setText(String.format(format, item)); setGraphic(null); } } diff --git a/client/src/main/resources/view/orders.fxml b/client/src/main/resources/view/orders.fxml index e2b8da3..1eb4ceb 100644 --- a/client/src/main/resources/view/orders.fxml +++ b/client/src/main/resources/view/orders.fxml @@ -11,7 +11,7 @@ + prefWidth="1010"> @@ -24,7 +24,7 @@ - + @@ -51,15 +51,17 @@ - + - + + + + - diff --git a/client/src/main/resources/view/routers.fxml b/client/src/main/resources/view/routers.fxml index f5f9e2c..4d5511e 100644 --- a/client/src/main/resources/view/routers.fxml +++ b/client/src/main/resources/view/routers.fxml @@ -56,10 +56,10 @@ - + - + @@ -72,6 +72,10 @@ + + + + diff --git a/client/src/main/resources/view/topOrders.fxml b/client/src/main/resources/view/topOrders.fxml index 327d0fc..d27cfa1 100644 --- a/client/src/main/resources/view/topOrders.fxml +++ b/client/src/main/resources/view/topOrders.fxml @@ -11,21 +11,25 @@ + prefWidth="715"> - + - + + + + + diff --git a/client/src/main/resources/view/vEditor.fxml b/client/src/main/resources/view/vEditor.fxml index a5c5953..e3d728c 100644 --- a/client/src/main/resources/view/vEditor.fxml +++ b/client/src/main/resources/view/vEditor.fxml @@ -7,16 +7,27 @@ + + - - + + + + + - + diff --git a/core/src/main/java/ru/trader/core/Market.java b/core/src/main/java/ru/trader/core/Market.java index d459c2a..fab2fbb 100644 --- a/core/src/main/java/ru/trader/core/Market.java +++ b/core/src/main/java/ru/trader/core/Market.java @@ -47,4 +47,6 @@ public interface Market { void updateName(Vendor vendor, String name); void updateName(Item item, String name); + + void updatePosition(Vendor vendor, double x, double y, double z); } diff --git a/core/src/main/java/ru/trader/core/MarketSupport.java b/core/src/main/java/ru/trader/core/MarketSupport.java index 8a8b767..7ff323f 100644 --- a/core/src/main/java/ru/trader/core/MarketSupport.java +++ b/core/src/main/java/ru/trader/core/MarketSupport.java @@ -144,6 +144,14 @@ public abstract class MarketSupport implements Market { vendor.setName(name); } + @Override + public void updatePosition(Vendor vendor, double x, double y, double z){ + change = true; + vendor.setX(x); + vendor.setY(y); + vendor.setZ(z); + } + @Override public void updateName(Item item, String name){ change = true; diff --git a/core/src/main/java/ru/trader/core/Vendor.java b/core/src/main/java/ru/trader/core/Vendor.java index 9f54a18..9c70fa4 100644 --- a/core/src/main/java/ru/trader/core/Vendor.java +++ b/core/src/main/java/ru/trader/core/Vendor.java @@ -14,6 +14,9 @@ public abstract class Vendor implements Comparable { private final static Logger LOG = LoggerFactory.getLogger(Vendor.class); private String name; + private double x; + private double y; + private double z; protected abstract Collection getOffers(); protected abstract Collection getItems(OFFER_TYPE offerType); @@ -107,4 +110,37 @@ public abstract class Vendor implements Comparable { if (this == other) return 0; return name != null ? other.name != null ? name.compareTo(other.name) : -1 : 0; } + + public double getDistance(Vendor other){ + return getDistance(other.x, other.y, other.z); + } + + public double getDistance(double x, double y, double z){ + return Math.sqrt(Math.pow(x - this.x, 2) + Math.pow(y-this.y, 2) + Math.pow(z - this.z, 2)); + } + + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getZ() { + return z; + } + + public void setZ(double z) { + this.z = z; + } } diff --git a/core/src/main/java/ru/trader/store/MarketDocHandler.java b/core/src/main/java/ru/trader/store/MarketDocHandler.java index 969566f..511ab42 100644 --- a/core/src/main/java/ru/trader/store/MarketDocHandler.java +++ b/core/src/main/java/ru/trader/store/MarketDocHandler.java @@ -9,6 +9,7 @@ import org.xml.sax.helpers.DefaultHandler; import ru.trader.core.*; import java.util.HashMap; +import java.util.OptionalLong; public class MarketDocHandler extends DefaultHandler { private final static Logger LOG = LoggerFactory.getLogger(MarketDocHandler.class); @@ -25,6 +26,9 @@ public class MarketDocHandler extends DefaultHandler { protected final static String TYPE_ATTR = "type"; protected final static String PRICE_ATTR = "price"; protected final static String ITEM_ATTR = "item"; + protected final static String X_ATTR = "x"; + protected final static String Y_ATTR = "y"; + protected final static String Z_ATTR = "z"; protected Market world; protected Vendor curVendor; @@ -62,12 +66,17 @@ public class MarketDocHandler extends DefaultHandler { protected void parseVendor(Attributes attributes) throws SAXException { String name = attributes.getValue(NAME_ATTR); - onVendor(name); + String x = attributes.getValue(X_ATTR); + String y = attributes.getValue(Y_ATTR); + String z = attributes.getValue(Z_ATTR); + LOG.debug("parse vendor {} position ({};{};{})", name, x, y, z); + onVendor(name, x != null ? Double.valueOf(x) : 0, y != null ? Double.valueOf(y) : 0, z != null ? Double.valueOf(z) : 0); } protected void parseItem(Attributes attributes) throws SAXException { String name = attributes.getValue(NAME_ATTR); String id = attributes.getValue(ID_ATTR); + LOG.debug("parse item {} ({})", name, id); onItem(name, id); } @@ -86,8 +95,11 @@ public class MarketDocHandler extends DefaultHandler { curVendor.add(offer); } - protected void onVendor(String name){ + protected void onVendor(String name, double x, double y, double z){ curVendor = new SimpleVendor(name); + curVendor.setX(x); + curVendor.setY(y); + curVendor.setZ(z); } protected void onItem(String name, String id) { diff --git a/core/src/main/java/ru/trader/store/MarketStreamWriter.java b/core/src/main/java/ru/trader/store/MarketStreamWriter.java index b2a4c87..c9381dc 100644 --- a/core/src/main/java/ru/trader/store/MarketStreamWriter.java +++ b/core/src/main/java/ru/trader/store/MarketStreamWriter.java @@ -75,6 +75,10 @@ public class MarketStreamWriter { protected void writeVendor(Vendor vendor) throws XMLStreamException { out.writeStartElement(MarketDocHandler.VENDOR); out.writeAttribute(MarketDocHandler.NAME_ATTR, vendor.getName()); + out.writeAttribute(MarketDocHandler.X_ATTR, String.valueOf(vendor.getX())); + out.writeAttribute(MarketDocHandler.Y_ATTR, String.valueOf(vendor.getY())); + out.writeAttribute(MarketDocHandler.Z_ATTR, String.valueOf(vendor.getZ())); + for (Offer offer : vendor.getAllOffers()) { writeOffer(offer); } diff --git a/core/src/main/resources/store/trader.xsd b/core/src/main/resources/store/trader.xsd index 7b0f289..881ffbf 100644 --- a/core/src/main/resources/store/trader.xsd +++ b/core/src/main/resources/store/trader.xsd @@ -32,6 +32,9 @@ + + +