mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-07-25 16:05:28 -04:00
Add OpenOffer
This commit is contained in:
parent
4f6761a6d9
commit
9c8ae1bc10
12 changed files with 160 additions and 110 deletions
|
@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.offer;
|
||||||
|
|
||||||
import io.bitsquare.offer.Direction;
|
import io.bitsquare.offer.Direction;
|
||||||
import io.bitsquare.offer.Offer;
|
import io.bitsquare.offer.Offer;
|
||||||
|
import io.bitsquare.offer.OpenOffer;
|
||||||
import io.bitsquare.trade.TradeManager;
|
import io.bitsquare.trade.TradeManager;
|
||||||
import io.bitsquare.user.User;
|
import io.bitsquare.user.User;
|
||||||
import io.bitsquare.util.handlers.ErrorMessageHandler;
|
import io.bitsquare.util.handlers.ErrorMessageHandler;
|
||||||
|
@ -44,8 +45,8 @@ class OffersDataModel implements Activatable, DataModel {
|
||||||
private final TradeManager tradeManager;
|
private final TradeManager tradeManager;
|
||||||
private final User user;
|
private final User user;
|
||||||
|
|
||||||
private final ObservableList<OfferListItem> list = FXCollections.observableArrayList();
|
private final ObservableList<OpenOfferListItem> list = FXCollections.observableArrayList();
|
||||||
private final MapChangeListener<String, Offer> offerMapChangeListener;
|
private final MapChangeListener<String, OpenOffer> offerMapChangeListener;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -55,19 +56,19 @@ class OffersDataModel implements Activatable, DataModel {
|
||||||
|
|
||||||
this.offerMapChangeListener = change -> {
|
this.offerMapChangeListener = change -> {
|
||||||
if (change.wasAdded())
|
if (change.wasAdded())
|
||||||
list.add(new OfferListItem(change.getValueAdded()));
|
list.add(new OpenOfferListItem(change.getValueAdded()));
|
||||||
else if (change.wasRemoved())
|
else if (change.wasRemoved())
|
||||||
list.removeIf(e -> e.getOffer().getId().equals(change.getValueRemoved().getId()));
|
list.removeIf(e -> e.getOpenOffer().getId().equals(change.getValueRemoved().getId()));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void activate() {
|
public void activate() {
|
||||||
list.clear();
|
list.clear();
|
||||||
list.addAll(tradeManager.getOpenOffers().values().stream().map(OfferListItem::new).collect(Collectors.toList()));
|
list.addAll(tradeManager.getOpenOffers().values().stream().map(OpenOfferListItem::new).collect(Collectors.toList()));
|
||||||
|
|
||||||
// we sort by date, earliest first
|
// we sort by date, earliest first
|
||||||
list.sort((o1, o2) -> o2.getOffer().getCreationDate().compareTo(o1.getOffer().getCreationDate()));
|
list.sort((o1, o2) -> o2.getOpenOffer().getOffer().getCreationDate().compareTo(o1.getOpenOffer().getOffer().getCreationDate()));
|
||||||
|
|
||||||
tradeManager.getOpenOffers().addListener(offerMapChangeListener);
|
tradeManager.getOpenOffers().addListener(offerMapChangeListener);
|
||||||
}
|
}
|
||||||
|
@ -77,16 +78,17 @@ class OffersDataModel implements Activatable, DataModel {
|
||||||
tradeManager.getOpenOffers().removeListener(offerMapChangeListener);
|
tradeManager.getOpenOffers().removeListener(offerMapChangeListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
void removeOpenOffer(String offerId, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||||
tradeManager.requestRemoveOffer(offer, resultHandler, errorMessageHandler);
|
tradeManager.requestRemoveOpenOffer(offerId, resultHandler, errorMessageHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public ObservableList<OfferListItem> getList() {
|
public ObservableList<OpenOfferListItem> getList() {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Direction getDirection(Offer offer) {
|
public Direction getDirection(OpenOffer openOffer) {
|
||||||
|
Offer offer = openOffer.getOffer();
|
||||||
return offer.getMessagePublicKey().equals(user.getMessagePublicKey()) ?
|
return offer.getMessagePublicKey().equals(user.getMessagePublicKey()) ?
|
||||||
offer.getDirection() : offer.getMirroredDirection();
|
offer.getDirection() : offer.getMirroredDirection();
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,8 @@ import javafx.util.Callback;
|
||||||
@FxmlView
|
@FxmlView
|
||||||
public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewModel> {
|
public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewModel> {
|
||||||
|
|
||||||
@FXML TableView<OfferListItem> table;
|
@FXML TableView<OpenOfferListItem> table;
|
||||||
@FXML TableColumn<OfferListItem, OfferListItem> priceColumn, amountColumn, volumeColumn,
|
@FXML TableColumn<OpenOfferListItem, OpenOfferListItem> priceColumn, amountColumn, volumeColumn,
|
||||||
directionColumn, dateColumn, offerIdColumn, removeItemColumn;
|
directionColumn, dateColumn, offerIdColumn, removeItemColumn;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -63,14 +63,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
table.setItems(model.getList());
|
table.setItems(model.getList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeOffer(OfferListItem item) {
|
private void removeOpenOffer(String offerId) {
|
||||||
model.removeOffer(item);
|
model.removeOpenOffer(offerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void openOfferDetails(OfferListItem item) {
|
private void openOfferDetails(OpenOfferListItem item) {
|
||||||
// TODO Open popup with details view
|
// TODO Open popup with details view
|
||||||
log.debug("openOfferDetails " + item);
|
log.debug("openOfferDetails " + item);
|
||||||
Utilities.copyToClipboard(item.getOffer().getId());
|
Utilities.copyToClipboard(item.getOpenOffer().getId());
|
||||||
Popups.openWarningPopup("Under construction",
|
Popups.openWarningPopup("Under construction",
|
||||||
"The offer ID was copied to the clipboard. " +
|
"The offer ID was copied to the clipboard. " +
|
||||||
"Use that to identify your trading peer in the IRC chat room \n\n" +
|
"Use that to identify your trading peer in the IRC chat room \n\n" +
|
||||||
|
@ -80,16 +80,16 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
private void setOfferIdColumnCellFactory() {
|
private void setOfferIdColumnCellFactory() {
|
||||||
offerIdColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue()));
|
offerIdColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue()));
|
||||||
offerIdColumn.setCellFactory(
|
offerIdColumn.setCellFactory(
|
||||||
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, OfferListItem>>() {
|
new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem, OpenOfferListItem>>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TableCell<OfferListItem, OfferListItem> call(TableColumn<OfferListItem,
|
public TableCell<OpenOfferListItem, OpenOfferListItem> call(TableColumn<OpenOfferListItem,
|
||||||
OfferListItem> column) {
|
OpenOfferListItem> column) {
|
||||||
return new TableCell<OfferListItem, OfferListItem>() {
|
return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
|
||||||
private Hyperlink hyperlink;
|
private Hyperlink hyperlink;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateItem(final OfferListItem item, boolean empty) {
|
public void updateItem(final OpenOfferListItem item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
|
|
||||||
if (item != null && !empty) {
|
if (item != null && !empty) {
|
||||||
|
@ -112,14 +112,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
private void setDateColumnCellFactory() {
|
private void setDateColumnCellFactory() {
|
||||||
dateColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
dateColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||||
dateColumn.setCellFactory(
|
dateColumn.setCellFactory(
|
||||||
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem,
|
new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
|
||||||
OfferListItem>>() {
|
OpenOfferListItem>>() {
|
||||||
@Override
|
@Override
|
||||||
public TableCell<OfferListItem, OfferListItem> call(
|
public TableCell<OpenOfferListItem, OpenOfferListItem> call(
|
||||||
TableColumn<OfferListItem, OfferListItem> column) {
|
TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
|
||||||
return new TableCell<OfferListItem, OfferListItem>() {
|
return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
|
||||||
@Override
|
@Override
|
||||||
public void updateItem(final OfferListItem item, boolean empty) {
|
public void updateItem(final OpenOfferListItem item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
if (item != null)
|
if (item != null)
|
||||||
setText(model.getDate(item));
|
setText(model.getDate(item));
|
||||||
|
@ -134,14 +134,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
private void setAmountColumnCellFactory() {
|
private void setAmountColumnCellFactory() {
|
||||||
amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||||
amountColumn.setCellFactory(
|
amountColumn.setCellFactory(
|
||||||
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem,
|
new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
|
||||||
OfferListItem>>() {
|
OpenOfferListItem>>() {
|
||||||
@Override
|
@Override
|
||||||
public TableCell<OfferListItem, OfferListItem> call(
|
public TableCell<OpenOfferListItem, OpenOfferListItem> call(
|
||||||
TableColumn<OfferListItem, OfferListItem> column) {
|
TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
|
||||||
return new TableCell<OfferListItem, OfferListItem>() {
|
return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
|
||||||
@Override
|
@Override
|
||||||
public void updateItem(final OfferListItem item, boolean empty) {
|
public void updateItem(final OpenOfferListItem item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
setText(model.getAmount(item));
|
setText(model.getAmount(item));
|
||||||
}
|
}
|
||||||
|
@ -153,14 +153,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
private void setPriceColumnCellFactory() {
|
private void setPriceColumnCellFactory() {
|
||||||
priceColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
priceColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||||
priceColumn.setCellFactory(
|
priceColumn.setCellFactory(
|
||||||
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem,
|
new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
|
||||||
OfferListItem>>() {
|
OpenOfferListItem>>() {
|
||||||
@Override
|
@Override
|
||||||
public TableCell<OfferListItem, OfferListItem> call(
|
public TableCell<OpenOfferListItem, OpenOfferListItem> call(
|
||||||
TableColumn<OfferListItem, OfferListItem> column) {
|
TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
|
||||||
return new TableCell<OfferListItem, OfferListItem>() {
|
return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
|
||||||
@Override
|
@Override
|
||||||
public void updateItem(final OfferListItem item, boolean empty) {
|
public void updateItem(final OpenOfferListItem item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
setText(model.getPrice(item));
|
setText(model.getPrice(item));
|
||||||
}
|
}
|
||||||
|
@ -172,14 +172,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
private void setVolumeColumnCellFactory() {
|
private void setVolumeColumnCellFactory() {
|
||||||
volumeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
volumeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||||
volumeColumn.setCellFactory(
|
volumeColumn.setCellFactory(
|
||||||
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem,
|
new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
|
||||||
OfferListItem>>() {
|
OpenOfferListItem>>() {
|
||||||
@Override
|
@Override
|
||||||
public TableCell<OfferListItem, OfferListItem> call(
|
public TableCell<OpenOfferListItem, OpenOfferListItem> call(
|
||||||
TableColumn<OfferListItem, OfferListItem> column) {
|
TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
|
||||||
return new TableCell<OfferListItem, OfferListItem>() {
|
return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
|
||||||
@Override
|
@Override
|
||||||
public void updateItem(final OfferListItem item, boolean empty) {
|
public void updateItem(final OpenOfferListItem item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
if (item != null)
|
if (item != null)
|
||||||
setText(model.getVolume(item));
|
setText(model.getVolume(item));
|
||||||
|
@ -194,14 +194,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
private void setDirectionColumnCellFactory() {
|
private void setDirectionColumnCellFactory() {
|
||||||
directionColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
directionColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||||
directionColumn.setCellFactory(
|
directionColumn.setCellFactory(
|
||||||
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem,
|
new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
|
||||||
OfferListItem>>() {
|
OpenOfferListItem>>() {
|
||||||
@Override
|
@Override
|
||||||
public TableCell<OfferListItem, OfferListItem> call(
|
public TableCell<OpenOfferListItem, OpenOfferListItem> call(
|
||||||
TableColumn<OfferListItem, OfferListItem> column) {
|
TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
|
||||||
return new TableCell<OfferListItem, OfferListItem>() {
|
return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
|
||||||
@Override
|
@Override
|
||||||
public void updateItem(final OfferListItem item, boolean empty) {
|
public void updateItem(final OpenOfferListItem item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
setText(model.getDirectionLabel(item));
|
setText(model.getDirectionLabel(item));
|
||||||
}
|
}
|
||||||
|
@ -213,11 +213,11 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
private void setRemoveColumnCellFactory() {
|
private void setRemoveColumnCellFactory() {
|
||||||
removeItemColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue()));
|
removeItemColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue()));
|
||||||
removeItemColumn.setCellFactory(
|
removeItemColumn.setCellFactory(
|
||||||
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, OfferListItem>>() {
|
new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem, OpenOfferListItem>>() {
|
||||||
@Override
|
@Override
|
||||||
public TableCell<OfferListItem, OfferListItem> call(TableColumn<OfferListItem,
|
public TableCell<OpenOfferListItem, OpenOfferListItem> call(TableColumn<OpenOfferListItem,
|
||||||
OfferListItem> directionColumn) {
|
OpenOfferListItem> directionColumn) {
|
||||||
return new TableCell<OfferListItem, OfferListItem>() {
|
return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
|
||||||
final ImageView iconView = new ImageView();
|
final ImageView iconView = new ImageView();
|
||||||
final Button button = new Button();
|
final Button button = new Button();
|
||||||
|
|
||||||
|
@ -229,11 +229,11 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateItem(final OfferListItem item, boolean empty) {
|
public void updateItem(final OpenOfferListItem item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
|
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
button.setOnAction(event -> removeOffer(item));
|
button.setOnAction(event -> removeOpenOffer(item.getOpenOffer().getId()));
|
||||||
setGraphic(button);
|
setGraphic(button);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -44,8 +44,8 @@ class OffersViewModel extends ActivatableWithDataModel<OffersDataModel> implemen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void removeOffer(OfferListItem item) {
|
void removeOpenOffer(String offerId) {
|
||||||
dataModel.removeOffer(item.getOffer(),
|
dataModel.removeOpenOffer(offerId,
|
||||||
() -> {
|
() -> {
|
||||||
// visual feedback?
|
// visual feedback?
|
||||||
log.debug("Remove offer was successful");
|
log.debug("Remove offer was successful");
|
||||||
|
@ -56,32 +56,32 @@ class OffersViewModel extends ActivatableWithDataModel<OffersDataModel> implemen
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ObservableList<OfferListItem> getList() {
|
public ObservableList<OpenOfferListItem> getList() {
|
||||||
return dataModel.getList();
|
return dataModel.getList();
|
||||||
}
|
}
|
||||||
|
|
||||||
String getTradeId(OfferListItem item) {
|
String getTradeId(OpenOfferListItem item) {
|
||||||
return item.getOffer().getId();
|
return item.getOpenOffer().getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
String getAmount(OfferListItem item) {
|
String getAmount(OpenOfferListItem item) {
|
||||||
return (item != null) ? formatter.formatAmountWithMinAmount(item.getOffer()) : "";
|
return (item != null) ? formatter.formatAmountWithMinAmount(item.getOpenOffer().getOffer()) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
String getPrice(OfferListItem item) {
|
String getPrice(OpenOfferListItem item) {
|
||||||
return (item != null) ? formatter.formatFiat(item.getOffer().getPrice()) : "";
|
return (item != null) ? formatter.formatFiat(item.getOpenOffer().getOffer().getPrice()) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
String getVolume(OfferListItem item) {
|
String getVolume(OpenOfferListItem item) {
|
||||||
return (item != null) ? formatter.formatVolumeWithMinVolume(item.getOffer()) : "";
|
return (item != null) ? formatter.formatVolumeWithMinVolume(item.getOpenOffer().getOffer()) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
String getDirectionLabel(OfferListItem item) {
|
String getDirectionLabel(OpenOfferListItem item) {
|
||||||
return (item != null) ? formatter.formatDirection(dataModel.getDirection(item.getOffer())) : "";
|
return (item != null) ? formatter.formatDirection(dataModel.getDirection(item.getOpenOffer())) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
String getDate(OfferListItem item) {
|
String getDate(OpenOfferListItem item) {
|
||||||
return formatter.formatDateTime(item.getOffer().getCreationDate());
|
return formatter.formatDateTime(item.getOpenOffer().getOffer().getCreationDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,20 +17,20 @@
|
||||||
|
|
||||||
package io.bitsquare.gui.main.portfolio.offer;
|
package io.bitsquare.gui.main.portfolio.offer;
|
||||||
|
|
||||||
import io.bitsquare.offer.Offer;
|
import io.bitsquare.offer.OpenOffer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We could remove that wrapper if it is not needed for additional UI only fields.
|
* We could remove that wrapper if it is not needed for additional UI only fields.
|
||||||
*/
|
*/
|
||||||
class OfferListItem {
|
class OpenOfferListItem {
|
||||||
|
|
||||||
private final Offer offer;
|
private final OpenOffer openOffer;
|
||||||
|
|
||||||
public OfferListItem(Offer offer) {
|
public OpenOfferListItem(OpenOffer openOffer) {
|
||||||
this.offer = offer;
|
this.openOffer = openOffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Offer getOffer() {
|
public OpenOffer getOpenOffer() {
|
||||||
return offer;
|
return openOffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -114,8 +114,8 @@ class OfferBookDataModel implements Activatable, DataModel {
|
||||||
btcCode.unbind();
|
btcCode.unbind();
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
void removeOpenOffer(String offerId, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||||
tradeManager.requestRemoveOffer(offer, resultHandler, errorMessageHandler);
|
tradeManager.requestRemoveOpenOffer(offerId, resultHandler, errorMessageHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
void calculateVolume() {
|
void calculateVolume() {
|
||||||
|
|
|
@ -468,8 +468,8 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
|
||||||
if (model.isMyOffer(offer)) {
|
if (model.isMyOffer(offer)) {
|
||||||
iconView.setId("image-remove");
|
iconView.setId("image-remove");
|
||||||
title = "Remove";
|
title = "Remove";
|
||||||
button.setOnAction(event -> model.removeOffer(item
|
button.setOnAction(event -> model.removeOpenOffer(item
|
||||||
.getOffer()));
|
.getOffer().getId()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (offer.getDirection() == Direction.SELL)
|
if (offer.getDirection() == Direction.SELL)
|
||||||
|
|
|
@ -103,8 +103,8 @@ class OfferBookViewModel extends ActivatableWithDataModel<OfferBookDataModel> im
|
||||||
(newValue)));
|
(newValue)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeOffer(Offer offer) {
|
void removeOpenOffer(String offerId) {
|
||||||
dataModel.removeOffer(offer,
|
dataModel.removeOpenOffer(offerId,
|
||||||
() -> {
|
() -> {
|
||||||
// visual feedback?
|
// visual feedback?
|
||||||
log.debug("Remove offer was successful");
|
log.debug("Remove offer was successful");
|
||||||
|
|
|
@ -76,9 +76,13 @@ public class Offer implements Serializable {
|
||||||
private final String bankAccountUID;
|
private final String bankAccountUID;
|
||||||
private final List<Arbitrator> arbitrators;
|
private final List<Arbitrator> arbitrators;
|
||||||
|
|
||||||
|
// Mutable property. Has to be set before offer is save in DHT as it changes the objects hash!
|
||||||
private String offerFeePaymentTxID;
|
private String offerFeePaymentTxID;
|
||||||
private State state = State.UNKNOWN;
|
|
||||||
private transient ObjectProperty<State> stateProperty; // don't access directly, use getStateProperty()
|
// Those state properties are transient and only used at runtime!
|
||||||
|
private transient State state = State.UNKNOWN;
|
||||||
|
// don't access directly as it might be null; use getStateProperty() which creates an object if not instantiated
|
||||||
|
private transient ObjectProperty<State> stateProperty;
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -139,7 +139,7 @@ public class OfferBook {
|
||||||
country = bankAccount.getCountry();
|
country = bankAccount.getCountry();
|
||||||
fiatCode = bankAccount.getCurrency().getCurrencyCode();
|
fiatCode = bankAccount.getCurrency().getCurrencyCode();
|
||||||
|
|
||||||
// TODO check why that was used
|
// TODO check why that was used (probably just for update triggering, if so refactor that)
|
||||||
//offerBookListItems.stream().forEach(e -> e.setBankAccountCountry(country));
|
//offerBookListItems.stream().forEach(e -> e.setBankAccountCountry(country));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
43
gui/src/main/java/io/bitsquare/offer/OpenOffer.java
Normal file
43
gui/src/main/java/io/bitsquare/offer/OpenOffer.java
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Bitsquare.
|
||||||
|
*
|
||||||
|
* Bitsquare is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.bitsquare.offer;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class OpenOffer implements Serializable {
|
||||||
|
private static final long serialVersionUID = -7523483764145982933L;
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(OpenOffer.class);
|
||||||
|
|
||||||
|
private final Offer offer;
|
||||||
|
|
||||||
|
public OpenOffer( Offer offer) {
|
||||||
|
this.offer = offer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Offer getOffer() {
|
||||||
|
return offer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return offer.getId();
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,7 @@ import io.bitsquare.network.Peer;
|
||||||
import io.bitsquare.offer.Direction;
|
import io.bitsquare.offer.Direction;
|
||||||
import io.bitsquare.offer.Offer;
|
import io.bitsquare.offer.Offer;
|
||||||
import io.bitsquare.offer.OfferBookService;
|
import io.bitsquare.offer.OfferBookService;
|
||||||
|
import io.bitsquare.offer.OpenOffer;
|
||||||
import io.bitsquare.persistence.Persistence;
|
import io.bitsquare.persistence.Persistence;
|
||||||
import io.bitsquare.trade.handlers.TransactionResultHandler;
|
import io.bitsquare.trade.handlers.TransactionResultHandler;
|
||||||
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol;
|
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol;
|
||||||
|
@ -94,7 +95,7 @@ public class TradeManager {
|
||||||
private final Map<String, BuyerAcceptsOfferProtocol> offererAsBuyerProtocolMap = new HashMap<>();
|
private final Map<String, BuyerAcceptsOfferProtocol> offererAsBuyerProtocolMap = new HashMap<>();
|
||||||
private final Map<String, RequestIsOfferAvailableProtocol> requestIsOfferAvailableProtocolMap = new HashMap<>();
|
private final Map<String, RequestIsOfferAvailableProtocol> requestIsOfferAvailableProtocolMap = new HashMap<>();
|
||||||
|
|
||||||
private final ObservableMap<String, Offer> openOffers = FXCollections.observableHashMap();
|
private final ObservableMap<String, OpenOffer> openOffers = FXCollections.observableHashMap();
|
||||||
private final ObservableMap<String, Trade> pendingTrades = FXCollections.observableHashMap();
|
private final ObservableMap<String, Trade> pendingTrades = FXCollections.observableHashMap();
|
||||||
private final ObservableMap<String, Trade> closedTrades = FXCollections.observableHashMap();
|
private final ObservableMap<String, Trade> closedTrades = FXCollections.observableHashMap();
|
||||||
|
|
||||||
|
@ -121,9 +122,9 @@ public class TradeManager {
|
||||||
this.signatureService = signatureService;
|
this.signatureService = signatureService;
|
||||||
this.offerBookService = offerBookService;
|
this.offerBookService = offerBookService;
|
||||||
|
|
||||||
Object offersObject = persistence.read(this, "offers");
|
Object openOffersObject = persistence.read(this, "openOffers");
|
||||||
if (offersObject instanceof Map) {
|
if (openOffersObject instanceof Map) {
|
||||||
openOffers.putAll((Map<String, Offer>) offersObject);
|
openOffers.putAll((Map<String, OpenOffer>) openOffersObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object pendingTradesObject = persistence.read(this, "pendingTrades");
|
Object pendingTradesObject = persistence.read(this, "pendingTrades");
|
||||||
|
@ -177,12 +178,13 @@ public class TradeManager {
|
||||||
accountSettings.getAcceptedCountries(),
|
accountSettings.getAcceptedCountries(),
|
||||||
accountSettings.getAcceptedLanguageLocales());
|
accountSettings.getAcceptedLanguageLocales());
|
||||||
|
|
||||||
|
|
||||||
PlaceOfferProtocol placeOfferProtocol = new PlaceOfferProtocol(
|
PlaceOfferProtocol placeOfferProtocol = new PlaceOfferProtocol(
|
||||||
offer,
|
offer,
|
||||||
walletService,
|
walletService,
|
||||||
offerBookService,
|
offerBookService,
|
||||||
(transaction) -> {
|
(transaction) -> {
|
||||||
saveOffer(offer);
|
saveOpenOffer(new OpenOffer(offer));
|
||||||
resultHandler.handleResult(transaction);
|
resultHandler.handleResult(transaction);
|
||||||
},
|
},
|
||||||
(message, throwable) -> errorMessageHandler.handleErrorMessage(message)
|
(message, throwable) -> errorMessageHandler.handleErrorMessage(message)
|
||||||
|
@ -191,22 +193,22 @@ public class TradeManager {
|
||||||
placeOfferProtocol.placeOffer();
|
placeOfferProtocol.placeOffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveOffer(Offer offer) {
|
private void saveOpenOffer(OpenOffer openOffer) {
|
||||||
openOffers.put(offer.getId(), offer);
|
openOffers.put(openOffer.getId(), openOffer);
|
||||||
persistOffers();
|
persistOpenOffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void requestRemoveOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
public void requestRemoveOpenOffer(String offerId, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||||
offerBookService.removeOffer(offer,
|
offerBookService.removeOffer(openOffers.get(offerId).getOffer(),
|
||||||
() -> {
|
() -> {
|
||||||
if (openOffers.containsKey(offer.getId())) {
|
if (openOffers.containsKey(offerId)) {
|
||||||
openOffers.remove(offer.getId());
|
openOffers.remove(offerId);
|
||||||
persistOffers();
|
persistOpenOffers();
|
||||||
resultHandler.handleResult();
|
resultHandler.handleResult();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
log.error("Locally stored offers does not contain the offer with the ID " + offer.getId());
|
log.error("Locally stored offers does not contain the offer with the ID " + offerId);
|
||||||
errorMessageHandler.handleErrorMessage("Locally stored offers does not contain the offer with the ID " + offer.getId());
|
errorMessageHandler.handleErrorMessage("Locally stored offers does not contain the offer with the ID " + offerId);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
(message, throwable) -> errorMessageHandler.handleErrorMessage(message));
|
(message, throwable) -> errorMessageHandler.handleErrorMessage(message));
|
||||||
|
@ -247,8 +249,7 @@ public class TradeManager {
|
||||||
private void createOffererAsBuyerProtocol(String offerId, Peer sender) {
|
private void createOffererAsBuyerProtocol(String offerId, Peer sender) {
|
||||||
log.trace("createOffererAsBuyerProtocol offerId = " + offerId);
|
log.trace("createOffererAsBuyerProtocol offerId = " + offerId);
|
||||||
if (openOffers.containsKey(offerId)) {
|
if (openOffers.containsKey(offerId)) {
|
||||||
Offer offer = openOffers.get(offerId);
|
Offer offer = openOffers.get(offerId).getOffer();
|
||||||
|
|
||||||
Trade trade = createTrade(offer);
|
Trade trade = createTrade(offer);
|
||||||
currentPendingTrade = trade;
|
currentPendingTrade = trade;
|
||||||
|
|
||||||
|
@ -264,7 +265,7 @@ public class TradeManager {
|
||||||
public void onOfferAccepted(Offer offer) {
|
public void onOfferAccepted(Offer offer) {
|
||||||
trade.setState(Trade.State.OFFERER_ACCEPTED);
|
trade.setState(Trade.State.OFFERER_ACCEPTED);
|
||||||
persistPendingTrades();
|
persistPendingTrades();
|
||||||
requestRemoveOffer(offer,
|
requestRemoveOpenOffer(offer.getId(),
|
||||||
() -> log.debug("remove was successful"),
|
() -> log.debug("remove was successful"),
|
||||||
(message) -> log.error(message));
|
(message) -> log.error(message));
|
||||||
}
|
}
|
||||||
|
@ -535,7 +536,7 @@ public class TradeManager {
|
||||||
// Getters
|
// Getters
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
public ObservableMap<String, Offer> getOpenOffers() {
|
public ObservableMap<String, OpenOffer> getOpenOffers() {
|
||||||
return openOffers;
|
return openOffers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,8 +564,8 @@ public class TradeManager {
|
||||||
// Private
|
// Private
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private void persistOffers() {
|
private void persistOpenOffers() {
|
||||||
persistence.write(this, "offers", (Map<String, Offer>) new HashMap<>(openOffers));
|
persistence.write(this, "openOffers", (Map<String, OpenOffer>) new HashMap<>(openOffers));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void persistPendingTrades() {
|
private void persistPendingTrades() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue