From 01fc65ec94f55d4f0254951c8173730a9f3331bc Mon Sep 17 00:00:00 2001 From: iMoHax Date: Mon, 14 Mar 2016 14:15:35 +0300 Subject: [PATCH] implement illegal commodity visualisation --- .../trader/controllers/HelperController.java | 8 +-- .../controllers/RouteTrackController.java | 3 +- .../main/java/ru/trader/model/OfferModel.java | 4 ++ .../main/java/ru/trader/model/OrderModel.java | 5 ++ .../ru/trader/view/support/ViewUtils.java | 1 + .../support/cells/DecoratedCellFactory.java | 45 +++++++++++++ .../cells/DecoratedListCellFactory.java | 64 +++++++++++++++++++ .../support/cells/DecoratedRowFactory.java | 44 +++++++++++++ .../support/cells/OfferDecoratedListCell.java | 32 ++++++++++ .../view/support/cells/OfferDecoratedRow.java | 26 ++++++++ .../support/cells/OrderDecoratedListCell.java | 27 ++++++++ client/src/main/resources/view/itemDesc.fxml | 6 +- client/src/main/resources/view/offers.fxml | 2 + client/src/main/resources/view/style.css | 12 ++++ 14 files changed, 270 insertions(+), 9 deletions(-) create mode 100644 client/src/main/java/ru/trader/view/support/cells/DecoratedCellFactory.java create mode 100644 client/src/main/java/ru/trader/view/support/cells/DecoratedListCellFactory.java create mode 100644 client/src/main/java/ru/trader/view/support/cells/DecoratedRowFactory.java create mode 100644 client/src/main/java/ru/trader/view/support/cells/OfferDecoratedListCell.java create mode 100644 client/src/main/java/ru/trader/view/support/cells/OfferDecoratedRow.java create mode 100644 client/src/main/java/ru/trader/view/support/cells/OrderDecoratedListCell.java diff --git a/client/src/main/java/ru/trader/controllers/HelperController.java b/client/src/main/java/ru/trader/controllers/HelperController.java index 2b532d7..dc262a7 100644 --- a/client/src/main/java/ru/trader/controllers/HelperController.java +++ b/client/src/main/java/ru/trader/controllers/HelperController.java @@ -20,9 +20,7 @@ import ru.trader.KeyBinding; import ru.trader.Main; import ru.trader.model.*; import ru.trader.view.support.ViewUtils; -import ru.trader.view.support.cells.OfferListCell; -import ru.trader.view.support.cells.OrderListCell; -import ru.trader.view.support.cells.StationListCell; +import ru.trader.view.support.cells.*; import javax.swing.*; @@ -70,8 +68,8 @@ public class HelperController { @FXML private void initialize(){ buyOrders.setCellFactory(new OrderListCell(false)); - sellOrders.setCellFactory(new OrderListCell(true)); - sellOffers.setCellFactory(new OfferListCell(true)); + sellOrders.setCellFactory(new OrderDecoratedListCell(true)); + sellOffers.setCellFactory(new OfferDecoratedListCell(true)); stations.setCellFactory(new StationListCell()); infoBtn.selectedProperty().addListener((ov, o, n) -> { if (n) showInfo(); diff --git a/client/src/main/java/ru/trader/controllers/RouteTrackController.java b/client/src/main/java/ru/trader/controllers/RouteTrackController.java index 3f20e4a..532d447 100644 --- a/client/src/main/java/ru/trader/controllers/RouteTrackController.java +++ b/client/src/main/java/ru/trader/controllers/RouteTrackController.java @@ -17,6 +17,7 @@ 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 ru.trader.view.support.cells.OrderDecoratedListCell; import ru.trader.view.support.cells.OrderListCell; import java.util.ArrayList; @@ -70,7 +71,7 @@ public class RouteTrackController { private void initialize(){ addMissionsList.setItems(missionsController.getMissions()); buyOrders.setCellFactory(new OrderListCell(false)); - sellOrders.setCellFactory(new OrderListCell(true)); + sellOrders.setCellFactory(new OrderDecoratedListCell(true)); editGroup.setVisible(false); init(); newEntrySystem.valueProperty().addListener((ov, o , n) -> { diff --git a/client/src/main/java/ru/trader/model/OfferModel.java b/client/src/main/java/ru/trader/model/OfferModel.java index 8d93f1c..f356131 100644 --- a/client/src/main/java/ru/trader/model/OfferModel.java +++ b/client/src/main/java/ru/trader/model/OfferModel.java @@ -51,6 +51,10 @@ public class OfferModel { return item; } + public boolean isIllegal() { + return offer.isIllegal(); + } + public OFFER_TYPE getType(){ return offer.getType(); } diff --git a/client/src/main/java/ru/trader/model/OrderModel.java b/client/src/main/java/ru/trader/model/OrderModel.java index baf89ff..dd6bbc9 100644 --- a/client/src/main/java/ru/trader/model/OrderModel.java +++ b/client/src/main/java/ru/trader/model/OrderModel.java @@ -65,6 +65,11 @@ public class OrderModel { this.count.set(count); } + public boolean isIllegal(){ + OfferModel offer = getBuyOffer(); + return offer != null && offer.isIllegal(); + } + public LongProperty countProperty() { return count; } diff --git a/client/src/main/java/ru/trader/view/support/ViewUtils.java b/client/src/main/java/ru/trader/view/support/ViewUtils.java index 021c7a8..cb833f8 100644 --- a/client/src/main/java/ru/trader/view/support/ViewUtils.java +++ b/client/src/main/java/ru/trader/view/support/ViewUtils.java @@ -15,6 +15,7 @@ import java.awt.event.InputEvent; import java.awt.event.KeyEvent; public class ViewUtils { + public final static String ILLEGAL_ITEM_STYLE = "illegal_item"; //Scroll to row if invisible public static void show(TableView tableView, int index){ diff --git a/client/src/main/java/ru/trader/view/support/cells/DecoratedCellFactory.java b/client/src/main/java/ru/trader/view/support/cells/DecoratedCellFactory.java new file mode 100644 index 0000000..8eddf72 --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/DecoratedCellFactory.java @@ -0,0 +1,45 @@ +package ru.trader.view.support.cells; + +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; +import javafx.util.Callback; + +public abstract class DecoratedCellFactory implements Callback, TableCell> { + private final Callback, TableCell> decorated; + + public DecoratedCellFactory() { + //noinspection unchecked + this((Callback) TableColumn.DEFAULT_CELL_FACTORY); + } + + public DecoratedCellFactory(Callback, TableCell> decorated) { + this.decorated = decorated; + } + + abstract void doStyle(TableCell cell, S entry, T item); + + @Override + public final TableCell call(TableColumn param) { + TableCell cell = decorated.call(param); + cell.itemProperty().addListener(new ItemChangeListener(cell)); + return cell; + } + + private class ItemChangeListener implements ChangeListener { + private final TableCell cell; + + private ItemChangeListener(TableCell cell) { + this.cell = cell; + } + + @Override + public void changed(ObservableValue observable, T oldValue, T newValue) { + @SuppressWarnings("unchecked") + S entry = (S) cell.getTableRow().getItem(); + doStyle(cell, entry, newValue); + } + } + +} diff --git a/client/src/main/java/ru/trader/view/support/cells/DecoratedListCellFactory.java b/client/src/main/java/ru/trader/view/support/cells/DecoratedListCellFactory.java new file mode 100644 index 0000000..0f85cbd --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/DecoratedListCellFactory.java @@ -0,0 +1,64 @@ +package ru.trader.view.support.cells; + +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.scene.Node; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.util.Callback; + +public abstract class DecoratedListCellFactory implements Callback, ListCell> { + private final Callback, ListCell> decorated; + private final static Callback, ListCell> DEFAULT_CELL_FACTORY = cell -> new ListCell() { + @Override + public void updateItem(Object item, boolean empty) { + super.updateItem(item, empty); + if (empty) { + setText(null); + setGraphic(null); + } else if (item instanceof Node) { + setText(null); + Node currentNode = getGraphic(); + Node newNode = (Node) item; + if (currentNode == null || ! currentNode.equals(newNode)) { + setGraphic(newNode); + } + } else { + setText(item == null ? "null" : item.toString()); + setGraphic(null); + } + } + }; + + public DecoratedListCellFactory() { + //noinspection unchecked + this((Callback) DEFAULT_CELL_FACTORY); + } + + public DecoratedListCellFactory(Callback, ListCell> decorated) { + this.decorated = decorated; + } + + abstract void doStyle(ListCell cell, T item); + + @Override + public final ListCell call(ListView param) { + ListCell cell = decorated.call(param); + cell.itemProperty().addListener(new ItemChangeListener(cell)); + return cell; + } + + private class ItemChangeListener implements ChangeListener { + private final ListCell cell; + + private ItemChangeListener(ListCell cell) { + this.cell = cell; + } + + @Override + public void changed(ObservableValue observable, T oldValue, T newValue) { + doStyle(cell, newValue); + } + } + +} diff --git a/client/src/main/java/ru/trader/view/support/cells/DecoratedRowFactory.java b/client/src/main/java/ru/trader/view/support/cells/DecoratedRowFactory.java new file mode 100644 index 0000000..33b0704 --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/DecoratedRowFactory.java @@ -0,0 +1,44 @@ +package ru.trader.view.support.cells; + +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.scene.control.TableRow; +import javafx.scene.control.TableView; +import javafx.util.Callback; + +public abstract class DecoratedRowFactory implements Callback, TableRow> { + private final Callback, TableRow> decorated; + private final static Callback, TableRow> DEFAULT_ROW_FACTORY = row -> new TableRow<>(); + + public DecoratedRowFactory() { + //noinspection unchecked + this((Callback) DEFAULT_ROW_FACTORY); + } + + public DecoratedRowFactory(Callback, TableRow> decorated) { + this.decorated = decorated; + } + + abstract void doStyle(TableRow row, S entry); + + @Override + public final TableRow call(TableView param) { + TableRow row = decorated.call(param); + row.itemProperty().addListener(new ItemChangeListener(row)); + return row; + } + + private class ItemChangeListener implements ChangeListener { + private final TableRow row; + + private ItemChangeListener(TableRow row) { + this.row = row; + } + + @Override + public void changed(ObservableValue observable, S oldValue, S newValue) { + doStyle(row, newValue); + } + } + +} diff --git a/client/src/main/java/ru/trader/view/support/cells/OfferDecoratedListCell.java b/client/src/main/java/ru/trader/view/support/cells/OfferDecoratedListCell.java new file mode 100644 index 0000000..895ccdd --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/OfferDecoratedListCell.java @@ -0,0 +1,32 @@ +package ru.trader.view.support.cells; + +import javafx.collections.ObservableList; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.util.Callback; +import ru.trader.model.OfferModel; +import ru.trader.model.OrderModel; +import ru.trader.view.support.ViewUtils; + +public class OfferDecoratedListCell extends DecoratedListCellFactory { + public OfferDecoratedListCell() { + this(new OfferListCell()); + } + + public OfferDecoratedListCell(boolean asItem) { + this(new OfferListCell(asItem)); + } + + public OfferDecoratedListCell(Callback, ListCell> decorated) { + super(decorated); + } + + @Override + void doStyle(ListCell cell, OfferModel item) { + ObservableList styles = cell.getStyleClass(); + styles.remove(ViewUtils.ILLEGAL_ITEM_STYLE); + if (item != null && item.isIllegal()){ + styles.add(ViewUtils.ILLEGAL_ITEM_STYLE); + } + } +} diff --git a/client/src/main/java/ru/trader/view/support/cells/OfferDecoratedRow.java b/client/src/main/java/ru/trader/view/support/cells/OfferDecoratedRow.java new file mode 100644 index 0000000..90b656e --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/OfferDecoratedRow.java @@ -0,0 +1,26 @@ +package ru.trader.view.support.cells; + +import javafx.collections.ObservableList; +import javafx.scene.control.TableRow; +import javafx.scene.control.TableView; +import javafx.util.Callback; +import ru.trader.model.OfferModel; +import ru.trader.view.support.ViewUtils; + +public class OfferDecoratedRow extends DecoratedRowFactory { + public OfferDecoratedRow() { + } + + public OfferDecoratedRow(Callback, TableRow> decorated) { + super(decorated); + } + + @Override + void doStyle(TableRow row, OfferModel entry) { + ObservableList styles = row.getStyleClass(); + styles.remove(ViewUtils.ILLEGAL_ITEM_STYLE); + if (entry != null && entry.isIllegal()){ + styles.add(ViewUtils.ILLEGAL_ITEM_STYLE); + } + } +} diff --git a/client/src/main/java/ru/trader/view/support/cells/OrderDecoratedListCell.java b/client/src/main/java/ru/trader/view/support/cells/OrderDecoratedListCell.java new file mode 100644 index 0000000..01eed4d --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/OrderDecoratedListCell.java @@ -0,0 +1,27 @@ +package ru.trader.view.support.cells; + +import javafx.collections.ObservableList; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.util.Callback; +import ru.trader.model.OrderModel; +import ru.trader.view.support.ViewUtils; + +public class OrderDecoratedListCell extends DecoratedListCellFactory { + public OrderDecoratedListCell(boolean isBuy) { + this(new OrderListCell(isBuy)); + } + + public OrderDecoratedListCell(Callback, ListCell> decorated) { + super(decorated); + } + + @Override + void doStyle(ListCell cell, OrderModel item) { + ObservableList styles = cell.getStyleClass(); + styles.remove(ViewUtils.ILLEGAL_ITEM_STYLE); + if (item != null && item.isIllegal()){ + styles.add(ViewUtils.ILLEGAL_ITEM_STYLE); + } + } +} diff --git a/client/src/main/resources/view/itemDesc.fxml b/client/src/main/resources/view/itemDesc.fxml index 1fdb3ee..da0cb0b 100644 --- a/client/src/main/resources/view/itemDesc.fxml +++ b/client/src/main/resources/view/itemDesc.fxml @@ -3,8 +3,8 @@ - + @@ -12,10 +12,10 @@ diff --git a/client/src/main/resources/view/offers.fxml b/client/src/main/resources/view/offers.fxml index 6d87be6..193e8c3 100644 --- a/client/src/main/resources/view/offers.fxml +++ b/client/src/main/resources/view/offers.fxml @@ -67,6 +67,7 @@ + @@ -115,6 +116,7 @@ + diff --git a/client/src/main/resources/view/style.css b/client/src/main/resources/view/style.css index e509cc9..3b1638c 100644 --- a/client/src/main/resources/view/style.css +++ b/client/src/main/resources/view/style.css @@ -1,3 +1,11 @@ +.illegal_item { + -fx-base: red; +} + +.illegal_item .bad .diff { + -fx-fill: white; +} + .good .diff { -fx-fill: green; -fx-font-weight: bold; @@ -204,6 +212,10 @@ HBox.fields-group hbox-margin{ -fx-faint-focus-color: #bb6b0022; } +#helper .illegal_item { + -fx-base: darkred; +} + .text-small, .text-medium, .text-big { -fx-font-weight: bold; }