From fa77df4a7fc6ab78de621222837c0a6ee72e75e2 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Fri, 29 Aug 2014 16:11:19 +0400 Subject: [PATCH] - add group item - add color indication on edit offer --- client/ext-resources/all/world.xml | 290 ++++++++++-------- .../controllers/VendorEditorController.java | 56 +++- .../main/java/ru/trader/model/ItemModel.java | 4 + .../view/support/cells/EditOfferCell.java | 54 ++++ .../view/support/cells/TextFieldCell.java | 14 +- client/src/main/resources/view/style.css | 17 + client/src/main/resources/view/vEditor.fxml | 6 +- .../main/java/ru/trader/core/GROUP_TYPE.java | 5 + core/src/main/java/ru/trader/core/Group.java | 31 ++ core/src/main/java/ru/trader/core/Item.java | 9 + .../ru/trader/store/MarketDocHandler.java | 18 ++ .../ru/trader/store/MarketStreamWriter.java | 18 +- core/src/main/resources/store/trader.xsd | 19 +- 13 files changed, 393 insertions(+), 148 deletions(-) create mode 100644 client/src/main/java/ru/trader/view/support/cells/EditOfferCell.java create mode 100644 core/src/main/java/ru/trader/core/GROUP_TYPE.java create mode 100644 core/src/main/java/ru/trader/core/Group.java diff --git a/client/ext-resources/all/world.xml b/client/ext-resources/all/world.xml index 8472de2..1a09a41 100644 --- a/client/ext-resources/all/world.xml +++ b/client/ext-resources/all/world.xml @@ -1,128 +1,174 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/src/main/java/ru/trader/controllers/VendorEditorController.java b/client/src/main/java/ru/trader/controllers/VendorEditorController.java index 42abfb9..7a253cd 100644 --- a/client/src/main/java/ru/trader/controllers/VendorEditorController.java +++ b/client/src/main/java/ru/trader/controllers/VendorEditorController.java @@ -1,5 +1,6 @@ package ru.trader.controllers; +import javafx.application.Platform; import javafx.beans.property.DoubleProperty; import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.SimpleDoubleProperty; @@ -12,6 +13,7 @@ import javafx.scene.control.TextField; import org.controlsfx.control.ButtonBar; import org.controlsfx.control.action.AbstractAction; import org.controlsfx.control.action.Action; +import org.controlsfx.dialog.DefaultDialogAction; import org.controlsfx.dialog.Dialog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +27,7 @@ import ru.trader.view.support.Localization; 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; +import ru.trader.view.support.cells.EditOfferCell; import java.util.Optional; @@ -48,6 +50,18 @@ public class VendorEditorController { } }; + private final Action actCancel = new DefaultDialogAction(impl.org.controlsfx.i18n.Localization.asKey("dlg.cancel.button")) { + { + ButtonBar.setType(this, ButtonBar.ButtonType.CANCEL_CLOSE); + } + + @Override + public void handle(ActionEvent event) { + items.getSelectionModel().selectFirst(); + super.handle(event); + } + }; + @FXML private TextField name; @@ -69,8 +83,8 @@ public class VendorEditorController { @FXML private void initialize() { items.getSelectionModel().setCellSelectionEnabled(true); - buy.setCellFactory(TextFieldCell.forTableColumn(new PriceStringConverter())); - sell.setCellFactory(TextFieldCell.forTableColumn(new PriceStringConverter())); + buy.setCellFactory(EditOfferCell.forTable(new PriceStringConverter(), false)); + sell.setCellFactory(EditOfferCell.forTable(new PriceStringConverter(), true)); actSave.disabledProperty().bind(x.wrongProperty().or(y.wrongProperty().or(z.wrongProperty()))); fillItems(); name.setOnAction((v)->x.requestFocus()); @@ -90,7 +104,7 @@ public class VendorEditorController { } Dialog dlg = new Dialog(parent, Localization.getString(vendor == null ? "vEditor.title.add" : "vEditor.title.edit")); dlg.setContent(content); - dlg.getActions().addAll(actSave, Dialog.Actions.CANCEL); + dlg.getActions().addAll(actSave, actCancel); dlg.setResizable(false); return dlg.show(); } @@ -111,6 +125,7 @@ public class VendorEditorController { y.setValue(0); z.setValue(0); items.getItems().forEach(FakeOffer::reset); + items.getSelectionModel().clearSelection(); } private void fillItems() { @@ -226,14 +241,21 @@ public class VendorEditorController { public void updateFromEMDN(){ Station emdnData = World.getEMDN(vendor.getName()); - LOG.debug("Update from EMDN"); - if (emdnData == null) return; + LOG.debug("Update {} from EMDN", vendor.getName()); + if (emdnData == null){ + LOG.trace("Not found in EMDN"); + return; + } for (FakeOffer offer : items.getItems()) { - ItemData data = emdnData.getData(offer.item.getId()); - LOG.debug("Update item {} to {}", offer.item.getName(), data); - if (data != null){ - offer.setSprice(data.getBuy()); - offer.setBprice(data.getSell()); + if (offer.item.isMarketItem()){ + ItemData data = emdnData.getData(offer.item.getId()); + LOG.debug("Update item {} to {}", offer.item.getName(), data); + if (data != null){ + offer.setSprice(data.getBuy()); + offer.setBprice(data.getSell()); + } + } else { + LOG.trace("Is not market item, skip"); } } } @@ -313,6 +335,14 @@ public class VendorEditorController { return this.item.equals(item); } + public double getOldSprice() { + return sell != null ? sell.getPrice() : 0; + } + + public double getOldBprice() { + return buy != null ? buy.getPrice() : 0; + } + public void setSell(OfferModel sell) { this.sell = sell; sprice.set(sell.getPrice()); @@ -324,10 +354,10 @@ public class VendorEditorController { } public void reset(){ - sprice.setValue(0); - bprice.setValue(0); this.sell = null; this.buy = null; + sprice.setValue(0); + bprice.setValue(0); } @Override diff --git a/client/src/main/java/ru/trader/model/ItemModel.java b/client/src/main/java/ru/trader/model/ItemModel.java index d60fe43..d17a8a2 100644 --- a/client/src/main/java/ru/trader/model/ItemModel.java +++ b/client/src/main/java/ru/trader/model/ItemModel.java @@ -23,6 +23,10 @@ public class ItemModel{ public String getId() {return item.getName();} + public boolean isMarketItem(){ + return item.getGroup() != null && item.getGroup().isMarket(); + } + public void setName(String value) { LOG.info("Change name of item {} to {}", item, name); market.updateName(this, value); diff --git a/client/src/main/java/ru/trader/view/support/cells/EditOfferCell.java b/client/src/main/java/ru/trader/view/support/cells/EditOfferCell.java new file mode 100644 index 0000000..0a1d6d7 --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/EditOfferCell.java @@ -0,0 +1,54 @@ +package ru.trader.view.support.cells; + +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableRow; +import javafx.scene.layout.HBox; +import javafx.scene.text.Text; +import javafx.util.Callback; +import javafx.util.StringConverter; +import ru.trader.controllers.VendorEditorController; + +public class EditOfferCell extends TextFieldCell { + private final static String CSS_CHANGE = "change"; + private final static String CSS_ADD = "add"; + private final static String CSS_REMOVE = "remove"; + private boolean isSell; + + public EditOfferCell(StringConverter converter, boolean isSell) { + super(converter); + this.isSell = isSell; + } + + public static Callback, TableCell> forTable(final StringConverter converter, boolean isSell) { + return list -> new EditOfferCell(converter, isSell); + } + + @Override + protected void outItem() { + VendorEditorController.FakeOffer offer = (VendorEditorController.FakeOffer) getTableRow().getItem(); + double d = isSell? offer.getSprice() - offer.getOldSprice() : offer.getBprice() - offer.getOldBprice(); + getStyleClass().removeAll(CSS_ADD, CSS_CHANGE, CSS_REMOVE); + if (d!=0){ + HBox hBox = new HBox(); + Text nTxt = new Text(getConverter().toString(isSell ? offer.getSprice() : offer.getBprice())); + Text diff = new Text(String.format(" (%+.0f)", d)); + if (isSell){ + getStyleClass().add(offer.isNewSell()? CSS_ADD : offer.isRemoveSell() ? CSS_REMOVE : CSS_CHANGE); + } else { + getStyleClass().add(offer.isNewBuy()? CSS_ADD : offer.isRemoveBuy() ? CSS_REMOVE : CSS_CHANGE); + } + hBox.getChildren().add(nTxt); + if (!offer.isRemoveBuy() && !offer.isRemoveSell() && !offer.isNewBuy() && !offer.isNewSell()){ + hBox.getChildren().add(diff); + } + setText(null); + setGraphic(hBox); + } else { + setText(getItemText()); + setGraphic(null); + } + + + } +} diff --git a/client/src/main/java/ru/trader/view/support/cells/TextFieldCell.java b/client/src/main/java/ru/trader/view/support/cells/TextFieldCell.java index c53b649..de559c2 100644 --- a/client/src/main/java/ru/trader/view/support/cells/TextFieldCell.java +++ b/client/src/main/java/ru/trader/view/support/cells/TextFieldCell.java @@ -1,6 +1,7 @@ package ru.trader.view.support.cells; import javafx.application.Platform; +import javafx.geometry.Insets; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseButton; @@ -56,7 +57,7 @@ public class TextFieldCell extends TableCell { public void updateItem(T item, boolean empty) { LOG.trace("Update edit"); super.updateItem(item, empty); - if (empty) { + if (empty || getTableRow() == null) { setText(null); setGraphic(null); @@ -89,9 +90,9 @@ public class TextFieldCell extends TableCell { } private void createTextField(){ - this.textField = new TextField(getItemText()); - this.setGraphic(textField); - textField.prefWidthProperty().bind(this.getTableColumn().widthProperty()); + textField = new TextField(getItemText()); + textField.prefWidthProperty().bind(getTableColumn().widthProperty()); + textField.setPadding(Insets.EMPTY); textField.setOnKeyPressed(t -> { if (t.getCode() == KeyCode.ENTER) { if (commit(true)) ViewUtils.editNext(getTableView()); @@ -104,7 +105,7 @@ public class TextFieldCell extends TableCell { } - private String getItemText(){ + protected String getItemText(){ return converter.toString(getItem()); } @@ -132,4 +133,7 @@ public class TextFieldCell extends TableCell { return textField == null; } + public StringConverter getConverter() { + return converter; + } } diff --git a/client/src/main/resources/view/style.css b/client/src/main/resources/view/style.css index 6686074..a4cf9d3 100644 --- a/client/src/main/resources/view/style.css +++ b/client/src/main/resources/view/style.css @@ -83,4 +83,21 @@ HBox.fields-group hbox-margin{ .path-pane { -fx-padding: 10; -fx-alignment: center-left; +} + +/* EditOfferCell */ +#items .change { + -fx-background-color: lightgreen; +} + +#items .remove { + -fx-background-color: lightsalmon; +} + +#items .remove .text{ + -fx-strikethrough: true; +} + +#items .add { + -fx-background-color: lightblue; } \ No newline at end of file diff --git a/client/src/main/resources/view/vEditor.fxml b/client/src/main/resources/view/vEditor.fxml index 76897bf..4592016 100644 --- a/client/src/main/resources/view/vEditor.fxml +++ b/client/src/main/resources/view/vEditor.fxml @@ -28,15 +28,15 @@ - + - + - + diff --git a/core/src/main/java/ru/trader/core/GROUP_TYPE.java b/core/src/main/java/ru/trader/core/GROUP_TYPE.java new file mode 100644 index 0000000..2e6659b --- /dev/null +++ b/core/src/main/java/ru/trader/core/GROUP_TYPE.java @@ -0,0 +1,5 @@ +package ru.trader.core; + +public enum GROUP_TYPE { + MARKET, SHIP, OUTFIT +} diff --git a/core/src/main/java/ru/trader/core/Group.java b/core/src/main/java/ru/trader/core/Group.java new file mode 100644 index 0000000..1298cd9 --- /dev/null +++ b/core/src/main/java/ru/trader/core/Group.java @@ -0,0 +1,31 @@ +package ru.trader.core; + +public class Group { + private final String name; + private final GROUP_TYPE type; + + public Group(String name, GROUP_TYPE type) { + this.name = name; + this.type = type; + } + + public String getName() { + return name; + } + + public boolean isMarket(){ + return GROUP_TYPE.MARKET.equals(type); + } + + public boolean isShip(){ + return GROUP_TYPE.SHIP.equals(type); + } + + public boolean isOutfit(){ + return GROUP_TYPE.OUTFIT.equals(type); + } + + public GROUP_TYPE getType() { + return type; + } +} diff --git a/core/src/main/java/ru/trader/core/Item.java b/core/src/main/java/ru/trader/core/Item.java index 5931dc4..bc2cbc7 100644 --- a/core/src/main/java/ru/trader/core/Item.java +++ b/core/src/main/java/ru/trader/core/Item.java @@ -6,6 +6,7 @@ import java.util.Objects; public class Item implements Comparable{ private String name; + private Group group; public Item(String name) { setName(name); @@ -30,4 +31,12 @@ public class Item implements Comparable{ if (this == other) return 0; return name != null ? other.name != null ? name.compareTo(other.name) : -1 : 0; } + + public Group getGroup() { + return group; + } + + public void setGroup(Group group) { + this.group = group; + } } diff --git a/core/src/main/java/ru/trader/store/MarketDocHandler.java b/core/src/main/java/ru/trader/store/MarketDocHandler.java index 511ab42..0bd13c7 100644 --- a/core/src/main/java/ru/trader/store/MarketDocHandler.java +++ b/core/src/main/java/ru/trader/store/MarketDocHandler.java @@ -20,6 +20,7 @@ public class MarketDocHandler extends DefaultHandler { protected final static String VENDOR_LIST = "vendors"; protected final static String VENDOR = "vendor"; protected final static String OFFER = "offer"; + protected final static String GROUP = "group"; protected final static String ID_ATTR = "id"; protected final static String NAME_ATTR = "name"; @@ -32,6 +33,7 @@ public class MarketDocHandler extends DefaultHandler { protected Market world; protected Vendor curVendor; + protected Group curGroup; protected final HashMap items = new HashMap<>(); @Override @@ -48,6 +50,8 @@ public class MarketDocHandler extends DefaultHandler { break; case OFFER: parseOffer(attributes); break; + case GROUP: parseGroup(attributes); + break; } } @@ -56,6 +60,8 @@ public class MarketDocHandler extends DefaultHandler { switch (qName){ case VENDOR: world.add(curVendor); break; + case GROUP: curGroup = null; + break; } } @@ -90,6 +96,13 @@ public class MarketDocHandler extends DefaultHandler { onOffer(offerType, item, price); } + protected void parseGroup(Attributes attributes) throws SAXException { + String name = attributes.getValue(NAME_ATTR); + GROUP_TYPE type = GROUP_TYPE.valueOf(attributes.getValue(TYPE_ATTR)); + LOG.debug("parse group {} ({})", name, type); + onGroup(name, type); + } + protected void onOffer(OFFER_TYPE offerType, Item item, double price){ Offer offer = new Offer(offerType, item, price); curVendor.add(offer); @@ -104,10 +117,15 @@ public class MarketDocHandler extends DefaultHandler { protected void onItem(String name, String id) { Item item = new Item(name); + item.setGroup(curGroup); world.add(item); items.put(id, item); } + protected void onGroup(String name, GROUP_TYPE type) { + curGroup = new Group(name, type); + } + public Market getWorld(){ return world; } diff --git a/core/src/main/java/ru/trader/store/MarketStreamWriter.java b/core/src/main/java/ru/trader/store/MarketStreamWriter.java index c9381dc..4863d7c 100644 --- a/core/src/main/java/ru/trader/store/MarketStreamWriter.java +++ b/core/src/main/java/ru/trader/store/MarketStreamWriter.java @@ -2,10 +2,7 @@ package ru.trader.store; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ru.trader.core.Item; -import ru.trader.core.Market; -import ru.trader.core.Offer; -import ru.trader.core.Vendor; +import ru.trader.core.*; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; @@ -51,9 +48,16 @@ public class MarketStreamWriter { protected void writeItems() throws XMLStreamException { out.writeStartElement(MarketDocHandler.ITEM_LIST); + Group group = null; for (Item entry : market.getItems()) { + if (group!=entry.getGroup()){ + if (group != null) out.writeEndElement(); + group = entry.getGroup(); + if (group != null) writeGroup(group); + } writeItem(entry, items.get(entry)); } + if (group != null) out.writeEndElement(); out.writeEndElement(); } @@ -92,6 +96,12 @@ public class MarketStreamWriter { out.writeAttribute(MarketDocHandler.PRICE_ATTR, String.valueOf(offer.getPrice())); } + protected void writeGroup(Group group) throws XMLStreamException { + out.writeStartElement(MarketDocHandler.GROUP); + out.writeAttribute(MarketDocHandler.NAME_ATTR, group.getName()); + out.writeAttribute(MarketDocHandler.TYPE_ATTR, group.getType().toString()); + } + private static Map generateId(Collection items){ HashMap res = new HashMap<>(items.size()); int index=0; diff --git a/core/src/main/resources/store/trader.xsd b/core/src/main/resources/store/trader.xsd index 25fe6a6..3a12be1 100644 --- a/core/src/main/resources/store/trader.xsd +++ b/core/src/main/resources/store/trader.xsd @@ -18,10 +18,27 @@ - + + + + + + + + + + + + + + + + + +