diff --git a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java index 98f73a9f47..7f1318a087 100644 --- a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java +++ b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java @@ -19,13 +19,20 @@ package io.bitsquare.gui.main.portfolio.pending; import io.bitsquare.trade.Trade; +import org.bitcoinj.core.Coin; +import org.bitcoinj.utils.Fiat; + +import java.util.Date; + +import javafx.beans.property.ObjectProperty; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * We could remove that wrapper if it is not needed for additional UI only fields. */ -class PendingTradesListItem { +public class PendingTradesListItem { private static final Logger log = LoggerFactory.getLogger(PendingTradesListItem.class); private final Trade trade; @@ -35,16 +42,35 @@ class PendingTradesListItem { // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - PendingTradesListItem(Trade trade) { + public PendingTradesListItem(Trade trade) { this.trade = trade; } - /////////////////////////////////////////////////////////////////////////////////////////// // Getters /////////////////////////////////////////////////////////////////////////////////////////// - Trade getTrade() { + public Trade getTrade() { return trade; } + + public ObjectProperty tradeAmountProperty() { + return trade.tradeAmountProperty(); + } + + public ObjectProperty tradeVolumeProperty() { + return trade.tradeVolumeProperty(); + } + + public Date getDate() { + return trade.getDate(); + } + + public String getId() { + return trade.getId(); + } + + public Fiat getPrice() { + return trade.getOffer().getPrice(); + } } diff --git a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesPM.java b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesPM.java index 77aa161c21..814423a547 100644 --- a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesPM.java +++ b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesPM.java @@ -24,8 +24,13 @@ import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.validation.BtcAddressValidator; import io.bitsquare.locale.BSResources; +import org.bitcoinj.core.Coin; +import org.bitcoinj.utils.Fiat; + import com.google.inject.Inject; +import java.util.Date; + import javafx.beans.InvalidationListener; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; @@ -174,28 +179,28 @@ public class PendingTradesPM extends PresentationModel { } // columns - String getTradeId(PendingTradesListItem item) { - return item.getTrade().getId(); + String formatTradeId(String value) { + return value; } - String getAmount(PendingTradesListItem item) { - return (item != null) ? formatter.formatCoinWithCode(item.getTrade().getTradeAmount()) : ""; + String formatTradeAmount(Coin value) { + return formatter.formatCoinWithCode(value); } - String getPrice(PendingTradesListItem item) { - return (item != null) ? formatter.formatFiat(item.getTrade().getOffer().getPrice()) : ""; + String formatPrice(Fiat value) { + return formatter.formatFiat(value); } - String getVolume(PendingTradesListItem item) { - return (item != null) ? formatter.formatFiatWithCode(item.getTrade().getTradeVolume()) : ""; + String formatTradeVolume(Fiat value) { + return formatter.formatFiatWithCode(value); } - String getDirectionLabel(PendingTradesListItem item) { + String evaluateDirection(PendingTradesListItem item) { return (item != null) ? formatter.formatDirection(model.getDirection(item.getTrade().getOffer())) : ""; } - String getDate(PendingTradesListItem item) { - return formatter.formatDateTime(item.getTrade().getDate()); + String formatDate(Date value) { + return formatter.formatDateTime(value); } // payment diff --git a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.fxml b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.fxml index af822c5990..3227a0c4e5 100644 --- a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.fxml +++ b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.fxml @@ -26,6 +26,7 @@ + @@ -48,11 +49,31 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewCB.java b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewCB.java index aa19772685..ae3eb587cd 100644 --- a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewCB.java @@ -31,9 +31,13 @@ import io.bitsquare.gui.main.help.Help; import io.bitsquare.gui.main.help.HelpId; import io.bitsquare.locale.BSResources; +import org.bitcoinj.core.Coin; +import org.bitcoinj.utils.Fiat; + import java.net.URL; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.ResourceBundle; @@ -45,8 +49,10 @@ import javafx.beans.value.ChangeListener; import javafx.collections.ListChangeListener; import javafx.fxml.FXML; import javafx.scene.control.*; +import javafx.scene.control.cell.*; import javafx.scene.layout.*; import javafx.util.Callback; +import javafx.util.StringConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,8 +84,13 @@ public class PendingTradesViewCB extends CachedViewCB { @FXML Button confirmPaymentReceiptButton, paymentsButton, withdrawButton; @FXML TextFieldWithCopyIcon fiatAmountTextField, holderNameTextField, secondaryIdTextField, primaryIdTextField; @FXML TableView table; - @FXML TableColumn priceColumn, amountColumn, volumeColumn, - directionColumn, dateColumn, tradeIdColumn; + + @FXML TableColumn priceColumn; + @FXML TableColumn tradeVolumeColumn; + @FXML TableColumn directionColumn; + @FXML TableColumn idColumn; + @FXML TableColumn dateColumn; + @FXML TableColumn tradeAmountColumn; /////////////////////////////////////////////////////////////////////////////////////////// @@ -547,119 +558,79 @@ public class PendingTradesViewCB extends CachedViewCB { /////////////////////////////////////////////////////////////////////////////////////////// private void setTradeIdColumnCellFactory() { - tradeIdColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue())); - tradeIdColumn.setCellFactory( - new Callback, - TableCell>() { + idColumn.setCellFactory(TextFieldTableCell.forTableColumn( + new StringConverter() { + @Override + public String toString(String value) { + return presentationModel.formatTradeId(value); + } @Override - public TableCell call - (TableColumn column) { - return new TableCell() { - private Hyperlink hyperlink; - - @Override - public void updateItem(final PendingTradesListItem item, boolean empty) { - super.updateItem(item, empty); - - if (item != null && !empty) { - hyperlink = new Hyperlink(presentationModel.getTradeId(item)); - hyperlink.setId("id-link"); - Tooltip.install(hyperlink, new Tooltip(presentationModel.getTradeId(item))); - hyperlink.setOnAction(event -> openOfferDetails(item)); - setGraphic(hyperlink); - } - else { - setGraphic(null); - setId(null); - } - } - }; + public String fromString(String string) { + return null; } - }); + })); } private void setDateColumnCellFactory() { - dateColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); - dateColumn.setCellFactory( - new Callback, TableCell>() { + dateColumn.setCellFactory(TextFieldTableCell.forTableColumn( + new StringConverter() { @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final PendingTradesListItem item, boolean empty) { - super.updateItem(item, empty); - if (item != null) - setText(presentationModel.getDate(item)); - else - setText(""); - } - }; + public String toString(Date value) { + return presentationModel.formatDate(value); } - }); + + @Override + public Date fromString(String string) { + return null; + } + })); } private void setAmountColumnCellFactory() { - amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); - amountColumn.setCellFactory( - new Callback, TableCell>() { + tradeAmountColumn.setCellFactory(TextFieldTableCell.forTableColumn( + new StringConverter() { @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final PendingTradesListItem item, boolean empty) { - super.updateItem(item, empty); - setText(presentationModel.getAmount(item)); - } - }; + public String toString(Coin value) { + return presentationModel.formatTradeAmount(value); } - }); + + @Override + public Coin fromString(String string) { + return null; + } + })); } private void setPriceColumnCellFactory() { - priceColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); - priceColumn.setCellFactory( - new Callback, TableCell>() { + priceColumn.setCellFactory(TextFieldTableCell.forTableColumn( + new StringConverter() { @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final PendingTradesListItem item, boolean empty) { - super.updateItem(item, empty); - setText(presentationModel.getPrice(item)); - } - }; + public String toString(Fiat value) { + return presentationModel.formatPrice(value); } - }); + + @Override + public Fiat fromString(String string) { + return null; + } + })); + } private void setVolumeColumnCellFactory() { - volumeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); - volumeColumn.setCellFactory( - new Callback, TableCell>() { + tradeVolumeColumn.setCellFactory(TextFieldTableCell.forTableColumn( + new StringConverter() { @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final PendingTradesListItem item, boolean empty) { - super.updateItem(item, empty); - if (item != null) - setText(presentationModel.getVolume(item)); - else - setText(""); - } - }; + public String toString(Fiat value) { + return presentationModel.formatTradeVolume(value); } - }); + + @Override + public Fiat fromString(String string) { + return null; + } + })); } private void setDirectionColumnCellFactory() { @@ -674,12 +645,14 @@ public class PendingTradesViewCB extends CachedViewCB { @Override public void updateItem(final PendingTradesListItem item, boolean empty) { super.updateItem(item, empty); - setText(presentationModel.getDirectionLabel(item)); + if (item != null && !empty) + setText(presentationModel.evaluateDirection(item)); + else + setText(null); } }; } }); } - } diff --git a/src/main/java/io/bitsquare/trade/Trade.java b/src/main/java/io/bitsquare/trade/Trade.java index 719512357d..376d348b0d 100644 --- a/src/main/java/io/bitsquare/trade/Trade.java +++ b/src/main/java/io/bitsquare/trade/Trade.java @@ -27,13 +27,9 @@ import java.io.Serializable; import java.util.Date; -import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; -//TODO flatten down? - public class Trade implements Serializable { private static final long serialVersionUID = -8275323072940974077L; @@ -52,28 +48,28 @@ public class Trade implements Serializable { COMPLETED } - private final Offer offer; private final Date date; private String takeOfferFeeTxID; - private Coin tradeAmount; private Contract contract; private String contractAsJson; private String takerSignature; private Transaction depositTx; private Transaction payoutTx; + + private Coin tradeAmount; private State state; private Throwable fault; + // For changing values we use properties to get binding support in the UI (table) // When serialized those transient properties are not instantiated, so we instantiate them in the getters at first // access. Only use the accessor not the private field. - // TODO use ObjectProperties instead of BooleanProperty - transient private BooleanProperty _payoutTxChanged; - transient private BooleanProperty _contractChanged; - transient private ObjectProperty _depositTx; + transient private ObjectProperty _tradeAmount; + transient private ObjectProperty _tradeVolume; transient private ObjectProperty _state; transient private ObjectProperty _fault; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @@ -81,6 +77,7 @@ public class Trade implements Serializable { public Trade(Offer offer) { this.offer = offer; date = new Date(); + state = State.OPEN; } @@ -103,6 +100,8 @@ public class Trade implements Serializable { public void setTradeAmount(Coin tradeAmount) { this.tradeAmount = tradeAmount; + tradeAmountProperty().set(tradeAmount); + tradeVolumeProperty().set(getTradeVolume()); } public Contract getContract() { @@ -115,17 +114,14 @@ public class Trade implements Serializable { public void setContract(Contract contract) { this.contract = contract; - contractChangedProperty().set(!contractChangedProperty().get()); } public void setDepositTx(Transaction tx) { this.depositTx = tx; - depositTxProperty().set(tx); } public void setPayoutTx(Transaction tx) { this.payoutTx = tx; - payoutTxChangedProperty().set(!payoutTxChangedProperty().get()); } public void setState(State state) { @@ -192,25 +188,18 @@ public class Trade implements Serializable { } // When serialized those transient properties are not instantiated, so we need to instantiate them at first access - public ObjectProperty depositTxProperty() { - if (_depositTx == null) - _depositTx = new SimpleObjectProperty<>(depositTx); + public ObjectProperty tradeAmountProperty() { + if (_tradeAmount == null) + _tradeAmount = new SimpleObjectProperty<>(); - return _depositTx; + return _tradeAmount; } - public BooleanProperty contractChangedProperty() { - if (_contractChanged == null) - _contractChanged = new SimpleBooleanProperty(); + public ObjectProperty tradeVolumeProperty() { + if (_tradeVolume == null) + _tradeVolume = new SimpleObjectProperty<>(); - return _contractChanged; - } - - public BooleanProperty payoutTxChangedProperty() { - if (_payoutTxChanged == null) - _payoutTxChanged = new SimpleBooleanProperty(); - - return _payoutTxChanged; + return _tradeVolume; } public ObjectProperty stateProperty() { @@ -225,6 +214,4 @@ public class Trade implements Serializable { _fault = new SimpleObjectProperty<>(fault); return _fault; } - - }