From bab70abf9e652784d6091977314d390f950e8029 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 10 Mar 2016 22:51:05 +0100 Subject: [PATCH] Add check for payment accounts in use when trying to delete --- .../java/io/bitsquare/gui/main/MainView.java | 22 +++++++++++------ .../AltCoinAccountsDataModel.java | 24 ++++++++++++++++--- .../altcoinaccounts/AltCoinAccountsView.java | 12 ++++++++-- .../AltCoinAccountsViewModel.java | 4 ++-- .../fiataccounts/FiatAccountsDataModel.java | 23 +++++++++++++++--- .../fiataccounts/FiatAccountsView.java | 12 ++++++++-- .../fiataccounts/FiatAccountsViewModel.java | 4 ++-- .../bitsquare/gui/main/funds/FundsView.java | 2 +- .../main/offer/offerbook/OfferBookView.java | 2 +- .../overlays/windows/OfferDetailsWindow.java | 6 +++-- .../steps/seller/SellerStep3View.java | 3 ++- .../io/bitsquare/gui/util/BSFormatter.java | 4 ++-- 12 files changed, 90 insertions(+), 28 deletions(-) diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainView.java b/gui/src/main/java/io/bitsquare/gui/main/MainView.java index faddf86cd6..cc6b36a2f3 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainView.java @@ -47,6 +47,8 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.text.TextAlignment; +import org.fxmisc.easybind.EasyBind; +import org.fxmisc.easybind.monadic.MonadicBinding; import javax.inject.Inject; import javax.inject.Named; @@ -59,6 +61,7 @@ import static javafx.scene.layout.AnchorPane.*; public class MainView extends InitializableView { public static final String TITLE_KEY = "view.title"; + private MonadicBinding marketPriceBinding; public static StackPane getRootContainer() { return MainView.rootContainer; @@ -138,14 +141,19 @@ public class MainView extends InitializableView { Tuple3 marketPriceBox = getMarketPriceBox("Market price"); final BooleanProperty priceInverted = new SimpleBooleanProperty(false); marketPriceBox.first.setOnMouseClicked(e -> priceInverted.setValue(!priceInverted.get())); - marketPriceBox.first.textProperty().bind(createStringBinding( - () -> (priceInverted.get() ? - model.marketPriceInverted.get() : - model.marketPrice.get()) + + marketPriceBinding = EasyBind.combine( + model.marketPriceCurrency, model.marketPrice, model.marketPriceInverted, priceInverted, + (marketPriceCurrency, marketPrice, marketPriceInverted, inverted) -> (priceInverted.get() ? - " BTC/" + model.marketPriceCurrency.get() : - " " + model.marketPriceCurrency.get() + "/BTC"), - model.marketPriceCurrency, model.marketPrice, priceInverted)); + marketPriceInverted : + marketPrice) + + (priceInverted.get() ? + " BTC/" + marketPriceCurrency : + " " + marketPriceCurrency + "/BTC")); + + marketPriceBinding.subscribe((observable, oldValue, newValue) -> { + marketPriceBox.first.setText(newValue); + }); marketPriceBox.second.textProperty().bind(createStringBinding( () -> { diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java index 298ad73c3d..2bc5275d81 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java @@ -21,6 +21,8 @@ import com.google.inject.Inject; import io.bitsquare.gui.common.model.ActivatableDataModel; import io.bitsquare.payment.PaymentAccount; import io.bitsquare.payment.PaymentMethod; +import io.bitsquare.trade.TradeManager; +import io.bitsquare.trade.offer.OpenOfferManager; import io.bitsquare.user.User; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -31,12 +33,16 @@ import java.util.stream.Collectors; class AltCoinAccountsDataModel extends ActivatableDataModel { private final User user; + private final OpenOfferManager openOfferManager; + private final TradeManager tradeManager; final ObservableList paymentAccounts = FXCollections.observableArrayList(); private final SetChangeListener setChangeListener; @Inject - public AltCoinAccountsDataModel(User user) { + public AltCoinAccountsDataModel(User user, OpenOfferManager openOfferManager, TradeManager tradeManager) { this.user = user; + this.openOfferManager = openOfferManager; + this.tradeManager = tradeManager; setChangeListener = change -> fillAndSortPaymentAccounts(); } @@ -67,8 +73,20 @@ class AltCoinAccountsDataModel extends ActivatableDataModel { user.addPaymentAccount(paymentAccount); } - public void onDeleteAccount(PaymentAccount paymentAccount) { - user.removePaymentAccount(paymentAccount); + + public boolean onDeleteAccount(PaymentAccount paymentAccount) { + boolean isPaymentAccountUsed = openOfferManager.getOpenOffers().stream() + .filter(o -> o.getOffer().getOffererPaymentAccountId().equals(paymentAccount.getId())) + .findAny() + .isPresent(); + isPaymentAccountUsed = isPaymentAccountUsed || tradeManager.getTrades().stream() + .filter(t -> t.getOffer().getOffererPaymentAccountId().equals(paymentAccount.getId()) || + t.getTakerPaymentAccountId().equals(paymentAccount.getId())) + .findAny() + .isPresent(); + if (!isPaymentAccountUsed) + user.removePaymentAccount(paymentAccount); + return isPaymentAccountUsed; } public void onSelectAccount(PaymentAccount paymentAccount) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsView.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsView.java index dbc155ddf9..3994b2b992 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsView.java @@ -17,6 +17,7 @@ package io.bitsquare.gui.main.account.content.altcoinaccounts; +import io.bitsquare.common.UserThread; import io.bitsquare.common.util.Tuple2; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; @@ -44,6 +45,7 @@ import javafx.scene.layout.GridPane; import javafx.util.Callback; import javax.inject.Inject; +import java.util.concurrent.TimeUnit; import static io.bitsquare.gui.util.FormBuilder.*; @@ -143,8 +145,14 @@ public class AltCoinAccountsView extends ActivatableViewAndModel { - model.onDeleteAccount(paymentAccount); - removeSelectAccountForm(); + boolean isPaymentAccountUsed = model.onDeleteAccount(paymentAccount); + if (!isPaymentAccountUsed) + removeSelectAccountForm(); + else + UserThread.runAfter(() -> { + new Popup().warning("You cannot delete that account because it is used in an " + + "open offer or in a trade.").show(); + }, 100, TimeUnit.MILLISECONDS); }) .closeButtonText("Cancel") .show(); diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsViewModel.java index 8a8f20b6c6..2fdd33b3b6 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/altcoinaccounts/AltCoinAccountsViewModel.java @@ -72,8 +72,8 @@ class AltCoinAccountsViewModel extends ActivatableWithDataModel paymentAccounts = FXCollections.observableArrayList(); private final SetChangeListener setChangeListener; @Inject - public FiatAccountsDataModel(User user, Preferences preferences) { + public FiatAccountsDataModel(User user, Preferences preferences, OpenOfferManager openOfferManager, TradeManager tradeManager) { this.user = user; this.preferences = preferences; + this.openOfferManager = openOfferManager; + this.tradeManager = tradeManager; setChangeListener = change -> fillAndSortPaymentAccounts(); } @@ -90,8 +96,19 @@ class FiatAccountsDataModel extends ActivatableDataModel { } } - public void onDeleteAccount(PaymentAccount paymentAccount) { - user.removePaymentAccount(paymentAccount); + public boolean onDeleteAccount(PaymentAccount paymentAccount) { + boolean isPaymentAccountUsed = openOfferManager.getOpenOffers().stream() + .filter(o -> o.getOffer().getOffererPaymentAccountId().equals(paymentAccount.getId())) + .findAny() + .isPresent(); + isPaymentAccountUsed = isPaymentAccountUsed || tradeManager.getTrades().stream() + .filter(t -> t.getOffer().getOffererPaymentAccountId().equals(paymentAccount.getId()) || + t.getTakerPaymentAccountId().equals(paymentAccount.getId())) + .findAny() + .isPresent(); + if (!isPaymentAccountUsed) + user.removePaymentAccount(paymentAccount); + return isPaymentAccountUsed; } public void onSelectAccount(PaymentAccount paymentAccount) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java index f897b59002..b3c1ce148a 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsView.java @@ -17,6 +17,7 @@ package io.bitsquare.gui.main.account.content.fiataccounts; +import io.bitsquare.common.UserThread; import io.bitsquare.common.util.Tuple2; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; @@ -45,6 +46,7 @@ import javafx.util.StringConverter; import javax.inject.Inject; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static io.bitsquare.gui.util.FormBuilder.*; @@ -146,8 +148,14 @@ public class FiatAccountsView extends ActivatableViewAndModel { - model.onDeleteAccount(paymentAccount); - removeSelectAccountForm(); + boolean isPaymentAccountUsed = model.onDeleteAccount(paymentAccount); + if (!isPaymentAccountUsed) + removeSelectAccountForm(); + else + UserThread.runAfter(() -> { + new Popup().warning("You cannot delete that account because it is used in an " + + "open offer or in a trade.").show(); + }, 100, TimeUnit.MILLISECONDS); }) .closeButtonText("Cancel") .show(); diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsViewModel.java index a5950510d2..e7d35f253f 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiataccounts/FiatAccountsViewModel.java @@ -48,8 +48,8 @@ class FiatAccountsViewModel extends ActivatableWithDataModel { new Popup().backgroundInfo("Bitsquare does not use a single application wallet, but dedicated wallets for every trade.\n\n" + "Funding of the wallet will be done when needed, for instance when you create or take an offer.\n" + "Withdrawing funds can be done after a trade is completed.\n\n" + - "Dedicated wallets help protect user privacy and prevent leaking information of previous trades to other" + + "Dedicated wallets help protect user privacy and prevent leaking information of previous trades to other " + "traders.") .actionButtonText("Visit FAQ web page") .onAction(() -> Utilities.openWebPage("https://bitsquare.io/faq")) diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java index 61a32dcde0..793d945524 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java @@ -550,7 +550,7 @@ public class OfferBookView extends ActivatableViewAndModel onTakeOffer(offer)); } - if (!isTradable) + if (!myOffer && !isTradable) button.setOnAction(e -> onShowInfo(isPaymentAccountValidForOffer, hasMatchingArbitrator, hasSameProtocolVersion)); button.setText(title); diff --git a/gui/src/main/java/io/bitsquare/gui/main/overlays/windows/OfferDetailsWindow.java b/gui/src/main/java/io/bitsquare/gui/main/overlays/windows/OfferDetailsWindow.java index b31d97c275..52a2129e71 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/overlays/windows/OfferDetailsWindow.java +++ b/gui/src/main/java/io/bitsquare/gui/main/overlays/windows/OfferDetailsWindow.java @@ -149,9 +149,11 @@ public class OfferDetailsWindow extends Overlay { addTitledGroupBg(gridPane, ++rowIndex, rows, "Offer"); if (takeOfferHandlerOptional.isPresent()) - addLabelTextField(gridPane, rowIndex, "Offer type:", formatter.getDirectionForTaker(offer.getDirection()), Layout.FIRST_ROW_DISTANCE); + addLabelTextField(gridPane, rowIndex, "Offer type:", formatter.getDirectionForTakeOffer(offer.getDirection()), Layout.FIRST_ROW_DISTANCE); + else if (placeOfferHandlerOptional.isPresent()) + addLabelTextField(gridPane, rowIndex, "Offer type:", formatter.getOfferDirectionForCreateOffer(offer.getDirection()), Layout.FIRST_ROW_DISTANCE); else - addLabelTextField(gridPane, rowIndex, "Offer type:", formatter.getOfferDirectionForOfferer(offer.getDirection()), Layout.FIRST_ROW_DISTANCE); + addLabelTextField(gridPane, rowIndex, "Offer type:", formatter.getDirectionBothSides(offer.getDirection()), Layout.FIRST_ROW_DISTANCE); if (takeOfferHandlerOptional.isPresent()) { addLabelTextField(gridPane, ++rowIndex, "Trade amount:", formatter.formatCoinWithCode(tradeAmount)); diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java index f26f94f9d3..a06d2047dd 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java @@ -230,7 +230,8 @@ public class SellerStep3View extends TradeStepView { if (preferences.showAgain(key)) { new Popup() .headLine("Confirm that you have received the payment") - .confirmation("Have you received the " + model.dataModel.getCurrencyCode() + " payment from your trading partner?\n\n" + + .confirmation("Have you received the " + CurrencyUtil.getNameByCode(model.dataModel.getCurrencyCode()) + + " payment from your trading partner?\n\n" + "Please note that as soon you have confirmed the receipt, the locked trade amount will be released " + "to the bitcoin buyer and the security deposit will be refunded.") .width(700) diff --git a/gui/src/main/java/io/bitsquare/gui/util/BSFormatter.java b/gui/src/main/java/io/bitsquare/gui/util/BSFormatter.java index 379c0d721e..dad2abb33e 100644 --- a/gui/src/main/java/io/bitsquare/gui/util/BSFormatter.java +++ b/gui/src/main/java/io/bitsquare/gui/util/BSFormatter.java @@ -409,12 +409,12 @@ public class BSFormatter { "You are selling bitcoin as taker / Offerer is buying bitcoin"; } - public String getDirectionForTaker(Offer.Direction direction) { + public String getDirectionForTakeOffer(Offer.Direction direction) { return direction == Offer.Direction.BUY ? "You are selling bitcoin (by taking an offer from someone who wants to buy bitcoin)" : "You are buying bitcoin (by taking an offer from someone who wants to sell bitcoin)"; } - public String getOfferDirectionForOfferer(Offer.Direction direction) { + public String getOfferDirectionForCreateOffer(Offer.Direction direction) { return direction == Offer.Direction.BUY ? "You are creating an offer for buying bitcoin" : "You are creating an offer for selling bitcoin"; }