mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-08-21 12:48:35 -04:00
Change state handling
This commit is contained in:
parent
ca3d1c96f2
commit
398a729a83
62 changed files with 976 additions and 501 deletions
|
@ -135,7 +135,7 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
|
|||
@Override
|
||||
public void doActivate() {
|
||||
addBindings();
|
||||
|
||||
|
||||
// setOfferBookInfo has been called before
|
||||
table.setItems(model.getOfferList());
|
||||
priceColumn.setSortType((model.getDirection() == Offer.Direction.BUY) ? TableColumn.SortType.ASCENDING : TableColumn.SortType.DESCENDING);
|
||||
|
|
|
@ -74,7 +74,7 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
|
|||
|
||||
private final Navigation navigation;
|
||||
private final OverlayManager overlayManager;
|
||||
|
||||
|
||||
@FXML ScrollPane scrollPane;
|
||||
@FXML ImageView imageView;
|
||||
@FXML InputTextField amountTextField;
|
||||
|
|
|
@ -28,10 +28,8 @@ import io.bitsquare.locale.CurrencyUtil;
|
|||
import io.bitsquare.trade.BuyerAsTakerTrade;
|
||||
import io.bitsquare.trade.SellerAsTakerTrade;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.TradeState;
|
||||
import io.bitsquare.trade.offer.Offer;
|
||||
import io.bitsquare.trade.states.BuyerTradeState;
|
||||
import io.bitsquare.trade.states.SellerTradeState;
|
||||
import io.bitsquare.trade.states.TradeState;
|
||||
|
||||
import org.bitcoinj.core.Address;
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
@ -104,7 +102,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
final ObjectProperty<Address> address = new SimpleObjectProperty<>();
|
||||
final ObjectProperty<Coin> totalToPayAsCoin = new SimpleObjectProperty<>();
|
||||
|
||||
final ObjectProperty<State> state = new SimpleObjectProperty<>(State.CHECK_AVAILABILITY);
|
||||
final ObjectProperty<State> state = new SimpleObjectProperty<>(TakeOfferViewModel.State.CHECK_AVAILABILITY);
|
||||
final ObjectProperty<InputValidator.ValidationResult> amountValidationResult = new SimpleObjectProperty<>();
|
||||
|
||||
private boolean takeOfferRequested;
|
||||
|
@ -114,7 +112,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
private ChangeListener<Boolean> isWalletFundedChangeListener;
|
||||
private ChangeListener<Coin> amountAsCoinChangeListener;
|
||||
private ChangeListener<Offer.State> offerStateChangeListener;
|
||||
private ChangeListener<TradeState.ProcessState> tradeStateChangeListener;
|
||||
private ChangeListener<TradeState> tradeStateChangeListener;
|
||||
// Offer and trade are stored only for remove listener at deactivate
|
||||
private Offer offer;
|
||||
private Trade trade;
|
||||
|
@ -204,7 +202,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
offer.stateProperty().removeListener(offerStateChangeListener);
|
||||
|
||||
if (trade != null)
|
||||
trade.processStateProperty().removeListener(tradeStateChangeListener);
|
||||
trade.tradeStateProperty().removeListener(tradeStateChangeListener);
|
||||
}
|
||||
|
||||
|
||||
|
@ -267,14 +265,14 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
isTakeOfferSpinnerVisible.set(true);
|
||||
dataModel.onTakeOffer((trade) -> {
|
||||
this.trade = trade;
|
||||
trade.processStateProperty().addListener(tradeStateChangeListener);
|
||||
applyTradeState(trade.processStateProperty().get());
|
||||
trade.tradeStateProperty().addListener(tradeStateChangeListener);
|
||||
applyTradeState(trade.tradeStateProperty().get());
|
||||
evaluateViewState();
|
||||
});
|
||||
}
|
||||
|
||||
void onShowPaymentScreen() {
|
||||
state.set(State.PAYMENT_SCREEN);
|
||||
state.set(TakeOfferViewModel.State.PAYMENT_SCREEN);
|
||||
}
|
||||
|
||||
void onToggleShowAdvancedSettings() {
|
||||
|
@ -294,7 +292,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
// TODO set spinner?
|
||||
break;
|
||||
case AVAILABLE:
|
||||
this.state.set(State.AMOUNT_SCREEN);
|
||||
this.state.set(TakeOfferViewModel.State.AMOUNT_SCREEN);
|
||||
break;
|
||||
case NOT_AVAILABLE:
|
||||
if (takeOfferRequested)
|
||||
|
@ -343,16 +341,16 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
evaluateViewState();
|
||||
}
|
||||
|
||||
private void applyTradeState(TradeState.ProcessState state) {
|
||||
log.debug("applyTradeState state = " + state);
|
||||
private void applyTradeState(TradeState tradeState) {
|
||||
log.debug("applyTradeState state = " + tradeState);
|
||||
|
||||
String msg = "An error occurred.";
|
||||
if (trade.getErrorMessage() != null)
|
||||
msg = "Error message: " + trade.getErrorMessage();
|
||||
|
||||
if (trade instanceof SellerAsTakerTrade) {
|
||||
switch ((SellerTradeState.ProcessState) state) {
|
||||
case UNDEFINED:
|
||||
switch ((TradeState.SellerState) tradeState) {
|
||||
case PREPARATION:
|
||||
break;
|
||||
case DEPOSIT_PUBLISHED_MSG_RECEIVED:
|
||||
assert trade.getDepositTx() != null;
|
||||
|
@ -367,7 +365,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
case PAYOUT_TX_COMMITTED:
|
||||
case PAYOUT_BROAD_CASTED:
|
||||
break;
|
||||
case TIMEOUT:
|
||||
/* case TIMEOUT:
|
||||
errorMessage.set("A timeout occurred. Maybe there are connection problems. " +
|
||||
"Please try later again.\n" + msg);
|
||||
takeOfferRequested = false;
|
||||
|
@ -375,15 +373,15 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
case FAULT:
|
||||
errorMessage.set(msg);
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
break;*/
|
||||
default:
|
||||
log.warn("Unhandled trade state: " + state);
|
||||
log.warn("Unhandled trade state: " + tradeState);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (trade instanceof BuyerAsTakerTrade) {
|
||||
switch ((BuyerTradeState.ProcessState) state) {
|
||||
case UNDEFINED:
|
||||
switch ((TradeState.BuyerState) tradeState) {
|
||||
case PREPARATION:
|
||||
break;
|
||||
case DEPOSIT_PUBLISHED:
|
||||
assert trade.getDepositTx() != null;
|
||||
|
@ -399,7 +397,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
case PAYOUT_TX_SENT:
|
||||
case PAYOUT_BROAD_CASTED:
|
||||
break;
|
||||
case TIMEOUT:
|
||||
/* case TIMEOUT:
|
||||
errorMessage.set("A timeout occurred. Maybe there are connection problems. " +
|
||||
"Please try later again.\n" + msg);
|
||||
takeOfferRequested = false;
|
||||
|
@ -407,9 +405,9 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
case FAULT:
|
||||
errorMessage.set(msg);
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
break;*/
|
||||
default:
|
||||
log.warn("Unhandled trade state: " + state);
|
||||
log.warn("Unhandled trade state: " + tradeState);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -562,8 +560,8 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
!dataModel.isAmountLargerThanOfferAmount() &&
|
||||
dataModel.isWalletFunded.get();
|
||||
|
||||
if (isAmountAndPriceValidAndWalletFunded && state.get() != State.CHECK_AVAILABILITY)
|
||||
state.set(State.PAYMENT_SCREEN);
|
||||
if (isAmountAndPriceValidAndWalletFunded && state.get() != TakeOfferViewModel.State.CHECK_AVAILABILITY)
|
||||
state.set(TakeOfferViewModel.State.PAYMENT_SCREEN);
|
||||
|
||||
takeOfferButtonDisabled.set(!isAmountAndPriceValidAndWalletFunded || takeOfferRequested);
|
||||
}
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
xmlns:fx="http://javafx.com/fxml">
|
||||
|
||||
<Tab fx:id="openOffersTab" text="Open offers"/>
|
||||
<Tab fx:id="openTradesTab" text="Open trades"/>
|
||||
<Tab fx:id="pendingTradesTab" text="Open trades"/>
|
||||
<Tab fx:id="closedTradesTab" text="History"/>
|
||||
<Tab fx:id="failedTradesTab" text="Failed"/>
|
||||
|
||||
</TabPane>
|
||||
|
|
|
@ -26,6 +26,7 @@ import io.bitsquare.gui.common.view.View;
|
|||
import io.bitsquare.gui.common.view.ViewLoader;
|
||||
import io.bitsquare.gui.main.MainView;
|
||||
import io.bitsquare.gui.main.portfolio.closedtrades.ClosedTradesView;
|
||||
import io.bitsquare.gui.main.portfolio.failedtrades.FailedTradesView;
|
||||
import io.bitsquare.gui.main.portfolio.openoffer.OpenOffersView;
|
||||
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesView;
|
||||
|
||||
|
@ -38,7 +39,7 @@ import javafx.scene.control.*;
|
|||
@FxmlView
|
||||
public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable> {
|
||||
|
||||
@FXML Tab openOffersTab, openTradesTab, closedTradesTab;
|
||||
@FXML Tab openOffersTab, pendingTradesTab, closedTradesTab, failedTradesTab;
|
||||
|
||||
private Tab currentTab;
|
||||
private Navigation.Listener navigationListener;
|
||||
|
@ -65,10 +66,12 @@ public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable>
|
|||
log.debug("tabChangeListener");
|
||||
if (newValue == openOffersTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, OpenOffersView.class);
|
||||
else if (newValue == openTradesTab)
|
||||
else if (newValue == pendingTradesTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, PendingTradesView.class);
|
||||
else if (newValue == closedTradesTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, ClosedTradesView.class);
|
||||
else if (newValue == failedTradesTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, FailedTradesView.class);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -79,10 +82,12 @@ public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable>
|
|||
|
||||
if (root.getSelectionModel().getSelectedItem() == openOffersTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, OpenOffersView.class);
|
||||
else if (root.getSelectionModel().getSelectedItem() == openTradesTab)
|
||||
else if (root.getSelectionModel().getSelectedItem() == pendingTradesTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, PendingTradesView.class);
|
||||
else if (root.getSelectionModel().getSelectedItem() == closedTradesTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, ClosedTradesView.class);
|
||||
else if (root.getSelectionModel().getSelectedItem() == failedTradesTab)
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, FailedTradesView.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -100,8 +105,9 @@ public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable>
|
|||
View view = viewLoader.load(viewClass);
|
||||
|
||||
if (view instanceof OpenOffersView) currentTab = openOffersTab;
|
||||
else if (view instanceof PendingTradesView) currentTab = openTradesTab;
|
||||
else if (view instanceof PendingTradesView) currentTab = pendingTradesTab;
|
||||
else if (view instanceof ClosedTradesView) currentTab = closedTradesTab;
|
||||
else if (view instanceof FailedTradesView) currentTab = failedTradesTab;
|
||||
|
||||
currentTab.setContent(view.getRoot());
|
||||
root.getSelectionModel().select(currentTab);
|
||||
|
|
|
@ -26,20 +26,10 @@ class ClosedTradesListItem {
|
|||
|
||||
private final Tradable tradable;
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Constructor
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClosedTradesListItem(Tradable tradable) {
|
||||
this.tradable = tradable;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Getters
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Tradable getTradable() {
|
||||
return tradable;
|
||||
}
|
||||
|
|
|
@ -20,7 +20,10 @@ package io.bitsquare.gui.main.portfolio.closedtrades;
|
|||
import io.bitsquare.gui.common.model.ActivatableWithDataModel;
|
||||
import io.bitsquare.gui.common.model.ViewModel;
|
||||
import io.bitsquare.gui.util.BSFormatter;
|
||||
import io.bitsquare.trade.BuyerTrade;
|
||||
import io.bitsquare.trade.SellerTrade;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.TradeState;
|
||||
import io.bitsquare.trade.offer.OpenOffer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
|
@ -80,13 +83,29 @@ class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataMod
|
|||
String getState(ClosedTradesListItem item) {
|
||||
if (item != null) {
|
||||
if (item.getTradable() instanceof Trade) {
|
||||
switch (((Trade) item.getTradable()).lifeCycleStateProperty().get()) {
|
||||
case COMPLETED:
|
||||
return "Completed";
|
||||
case FAILED:
|
||||
Trade trade = (Trade) item.getTradable();
|
||||
TradeState tradeState = trade.tradeStateProperty().get();
|
||||
if (trade instanceof BuyerTrade) {
|
||||
if (tradeState == TradeState.BuyerState.FAILED) {
|
||||
return "Failed";
|
||||
case PENDING:
|
||||
throw new RuntimeException("That must not happen. We got a pending state but we are in the closed trades list.");
|
||||
}
|
||||
else if (tradeState == TradeState.BuyerState.WITHDRAW_COMPLETED) {
|
||||
return "Completed";
|
||||
}
|
||||
else {
|
||||
log.error("That must not happen. We got a pending state but we are in the closed trades list.");
|
||||
}
|
||||
}
|
||||
else if (trade instanceof SellerTrade) {
|
||||
if (tradeState == TradeState.SellerState.FAILED) {
|
||||
return "Failed";
|
||||
}
|
||||
else if (tradeState == TradeState.SellerState.WITHDRAW_COMPLETED) {
|
||||
return "Completed";
|
||||
}
|
||||
else {
|
||||
log.error("That must not happen. We got a pending state but we are in the closed trades list.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (item.getTradable() instanceof OpenOffer) {
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* 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.gui.main.portfolio.failedtrades;
|
||||
|
||||
import io.bitsquare.gui.common.model.Activatable;
|
||||
import io.bitsquare.gui.common.model.DataModel;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.failed.FailedTradesManager;
|
||||
import io.bitsquare.trade.offer.Offer;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ListChangeListener;
|
||||
import javafx.collections.ObservableList;
|
||||
|
||||
class FailedTradesDataModel implements Activatable, DataModel {
|
||||
|
||||
private final FailedTradesManager failedTradesManager;
|
||||
|
||||
private final ObservableList<FailedTradesListItem> list = FXCollections.observableArrayList();
|
||||
private final ListChangeListener<Trade> tradesListChangeListener;
|
||||
|
||||
@Inject
|
||||
public FailedTradesDataModel(FailedTradesManager failedTradesManager) {
|
||||
this.failedTradesManager = failedTradesManager;
|
||||
|
||||
tradesListChangeListener = change -> applyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activate() {
|
||||
applyList();
|
||||
failedTradesManager.getFailedTrades().addListener(tradesListChangeListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deactivate() {
|
||||
failedTradesManager.getFailedTrades().removeListener(tradesListChangeListener);
|
||||
}
|
||||
|
||||
public ObservableList<FailedTradesListItem> getList() {
|
||||
return list;
|
||||
}
|
||||
|
||||
public Offer.Direction getDirection(Offer offer) {
|
||||
return failedTradesManager.wasMyOffer(offer) ? offer.getDirection() : offer.getMirroredDirection();
|
||||
}
|
||||
|
||||
private void applyList() {
|
||||
list.clear();
|
||||
|
||||
list.addAll(failedTradesManager.getFailedTrades().stream().map(FailedTradesListItem::new).collect(Collectors.toList()));
|
||||
|
||||
// we sort by date, earliest first
|
||||
list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate()));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* 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.gui.main.portfolio.failedtrades;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
|
||||
/**
|
||||
* We could remove that wrapper if it is not needed for additional UI only fields.
|
||||
*/
|
||||
class FailedTradesListItem {
|
||||
|
||||
private final Trade trade;
|
||||
|
||||
FailedTradesListItem(Trade trade) {
|
||||
this.trade = trade;
|
||||
}
|
||||
|
||||
Trade getTrade() {
|
||||
return trade;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--
|
||||
~ 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/>.
|
||||
-->
|
||||
|
||||
<?import io.bitsquare.gui.components.TitledSeparator?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<GridPane fx:id="root" fx:controller="io.bitsquare.gui.main.portfolio.failedtrades.FailedTradesView"
|
||||
hgap="5.0" vgap="5"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<padding>
|
||||
<Insets bottom="20.0" left="25.0" top="30.0" right="25"/>
|
||||
</padding>
|
||||
|
||||
<TitledSeparator text="Closed trades" GridPane.rowIndex="0" GridPane.columnIndex="0" GridPane.columnSpan="2"/>
|
||||
|
||||
<TableView fx:id="table" GridPane.rowIndex="0" GridPane.columnIndex="0" GridPane.columnSpan="2">
|
||||
<GridPane.margin>
|
||||
<Insets top="10.0" left="-10" right="-10" bottom="-15"/>
|
||||
</GridPane.margin>
|
||||
<columns>
|
||||
<TableColumn text="Trade ID" fx:id="tradeIdColumn" minWidth="100" sortable="false"/>
|
||||
<TableColumn text="Date" fx:id="dateColumn" minWidth="130"/>
|
||||
<TableColumn text="Trade amount in BTC" fx:id="amountColumn" minWidth="130" sortable="false"/>
|
||||
<TableColumn text="Price" fx:id="priceColumn" minWidth="100" sortable="false"/>
|
||||
<TableColumn text="Trade amount in EUR" fx:id="volumeColumn" minWidth="130" sortable="false"/>
|
||||
<TableColumn text="Trade type" fx:id="directionColumn" minWidth="80" sortable="false"/>
|
||||
<TableColumn text="State" fx:id="stateColumn" minWidth="80" sortable="false"/>
|
||||
</columns>
|
||||
</TableView>
|
||||
|
||||
<columnConstraints>
|
||||
<ColumnConstraints halignment="RIGHT" hgrow="SOMETIMES" minWidth="200"/>
|
||||
<ColumnConstraints hgrow="ALWAYS"/>
|
||||
</columnConstraints>
|
||||
|
||||
<rowConstraints>
|
||||
<RowConstraints vgrow="ALWAYS"/>
|
||||
</rowConstraints>
|
||||
|
||||
</GridPane>
|
|
@ -0,0 +1,227 @@
|
|||
/*
|
||||
* 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.gui.main.portfolio.failedtrades;
|
||||
|
||||
import io.bitsquare.gui.common.view.ActivatableViewAndModel;
|
||||
import io.bitsquare.gui.common.view.FxmlView;
|
||||
import io.bitsquare.gui.components.Popups;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import javafx.beans.property.ReadOnlyObjectWrapper;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.*;
|
||||
import javafx.util.Callback;
|
||||
|
||||
@FxmlView
|
||||
public class FailedTradesView extends ActivatableViewAndModel<GridPane, FailedTradesViewModel> {
|
||||
|
||||
@FXML TableView<FailedTradesListItem> table;
|
||||
@FXML TableColumn<FailedTradesListItem, FailedTradesListItem> priceColumn, amountColumn, volumeColumn,
|
||||
directionColumn, dateColumn, tradeIdColumn, stateColumn;
|
||||
|
||||
@Inject
|
||||
public FailedTradesView(FailedTradesViewModel model) {
|
||||
super(model);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
setTradeIdColumnCellFactory();
|
||||
setDirectionColumnCellFactory();
|
||||
setAmountColumnCellFactory();
|
||||
setPriceColumnCellFactory();
|
||||
setVolumeColumnCellFactory();
|
||||
setDateColumnCellFactory();
|
||||
setStateColumnCellFactory();
|
||||
|
||||
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
|
||||
table.setPlaceholder(new Label("No closed trades available"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doActivate() {
|
||||
table.setItems(model.getList());
|
||||
}
|
||||
|
||||
private void openOfferDetails(FailedTradesListItem item) {
|
||||
// TODO Open popup with details view
|
||||
log.debug("Trade details " + item);
|
||||
Popups.openWarningPopup("Under construction", "This will open a details " +
|
||||
"popup but that is not implemented yet.");
|
||||
}
|
||||
|
||||
private void setTradeIdColumnCellFactory() {
|
||||
tradeIdColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue()));
|
||||
tradeIdColumn.setCellFactory(
|
||||
new Callback<TableColumn<FailedTradesListItem, FailedTradesListItem>, TableCell<FailedTradesListItem,
|
||||
FailedTradesListItem>>() {
|
||||
|
||||
@Override
|
||||
public TableCell<FailedTradesListItem, FailedTradesListItem> call(TableColumn<FailedTradesListItem,
|
||||
FailedTradesListItem> column) {
|
||||
return new TableCell<FailedTradesListItem, FailedTradesListItem>() {
|
||||
private Hyperlink hyperlink;
|
||||
|
||||
@Override
|
||||
public void updateItem(final FailedTradesListItem item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
|
||||
if (item != null && !empty) {
|
||||
hyperlink = new Hyperlink(model.getTradeId(item));
|
||||
hyperlink.setId("id-link");
|
||||
Tooltip.install(hyperlink, new Tooltip(model.getTradeId(item)));
|
||||
hyperlink.setOnAction(event -> openOfferDetails(item));
|
||||
setGraphic(hyperlink);
|
||||
}
|
||||
else {
|
||||
setGraphic(null);
|
||||
setId(null);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setDateColumnCellFactory() {
|
||||
dateColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||
dateColumn.setCellFactory(
|
||||
new Callback<TableColumn<FailedTradesListItem, FailedTradesListItem>, TableCell<FailedTradesListItem,
|
||||
FailedTradesListItem>>() {
|
||||
@Override
|
||||
public TableCell<FailedTradesListItem, FailedTradesListItem> call(
|
||||
TableColumn<FailedTradesListItem, FailedTradesListItem> column) {
|
||||
return new TableCell<FailedTradesListItem, FailedTradesListItem>() {
|
||||
@Override
|
||||
public void updateItem(final FailedTradesListItem item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
if (item != null)
|
||||
setText(model.getDate(item));
|
||||
else
|
||||
setText("");
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setStateColumnCellFactory() {
|
||||
stateColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||
stateColumn.setCellFactory(
|
||||
new Callback<TableColumn<FailedTradesListItem, FailedTradesListItem>, TableCell<FailedTradesListItem,
|
||||
FailedTradesListItem>>() {
|
||||
@Override
|
||||
public TableCell<FailedTradesListItem, FailedTradesListItem> call(
|
||||
TableColumn<FailedTradesListItem, FailedTradesListItem> column) {
|
||||
return new TableCell<FailedTradesListItem, FailedTradesListItem>() {
|
||||
@Override
|
||||
public void updateItem(final FailedTradesListItem item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
if (item != null)
|
||||
setText(model.getState(item));
|
||||
else
|
||||
setText("");
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private void setAmountColumnCellFactory() {
|
||||
amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||
amountColumn.setCellFactory(
|
||||
new Callback<TableColumn<FailedTradesListItem, FailedTradesListItem>, TableCell<FailedTradesListItem,
|
||||
FailedTradesListItem>>() {
|
||||
@Override
|
||||
public TableCell<FailedTradesListItem, FailedTradesListItem> call(
|
||||
TableColumn<FailedTradesListItem, FailedTradesListItem> column) {
|
||||
return new TableCell<FailedTradesListItem, FailedTradesListItem>() {
|
||||
@Override
|
||||
public void updateItem(final FailedTradesListItem item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
setText(model.getAmount(item));
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setPriceColumnCellFactory() {
|
||||
priceColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||
priceColumn.setCellFactory(
|
||||
new Callback<TableColumn<FailedTradesListItem, FailedTradesListItem>, TableCell<FailedTradesListItem,
|
||||
FailedTradesListItem>>() {
|
||||
@Override
|
||||
public TableCell<FailedTradesListItem, FailedTradesListItem> call(
|
||||
TableColumn<FailedTradesListItem, FailedTradesListItem> column) {
|
||||
return new TableCell<FailedTradesListItem, FailedTradesListItem>() {
|
||||
@Override
|
||||
public void updateItem(final FailedTradesListItem item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
setText(model.getPrice(item));
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setVolumeColumnCellFactory() {
|
||||
volumeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||
volumeColumn.setCellFactory(
|
||||
new Callback<TableColumn<FailedTradesListItem, FailedTradesListItem>, TableCell<FailedTradesListItem,
|
||||
FailedTradesListItem>>() {
|
||||
@Override
|
||||
public TableCell<FailedTradesListItem, FailedTradesListItem> call(
|
||||
TableColumn<FailedTradesListItem, FailedTradesListItem> column) {
|
||||
return new TableCell<FailedTradesListItem, FailedTradesListItem>() {
|
||||
@Override
|
||||
public void updateItem(final FailedTradesListItem item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
if (item != null)
|
||||
setText(model.getVolume(item));
|
||||
else
|
||||
setText("");
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setDirectionColumnCellFactory() {
|
||||
directionColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
|
||||
directionColumn.setCellFactory(
|
||||
new Callback<TableColumn<FailedTradesListItem, FailedTradesListItem>, TableCell<FailedTradesListItem,
|
||||
FailedTradesListItem>>() {
|
||||
@Override
|
||||
public TableCell<FailedTradesListItem, FailedTradesListItem> call(
|
||||
TableColumn<FailedTradesListItem, FailedTradesListItem> column) {
|
||||
return new TableCell<FailedTradesListItem, FailedTradesListItem>() {
|
||||
@Override
|
||||
public void updateItem(final FailedTradesListItem item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
setText(model.getDirectionLabel(item));
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* 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.gui.main.portfolio.failedtrades;
|
||||
|
||||
import io.bitsquare.gui.common.model.ActivatableWithDataModel;
|
||||
import io.bitsquare.gui.common.model.ViewModel;
|
||||
import io.bitsquare.gui.util.BSFormatter;
|
||||
import io.bitsquare.trade.BuyerTrade;
|
||||
import io.bitsquare.trade.SellerTrade;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.TradeState;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import javafx.collections.ObservableList;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
class FailedTradesViewModel extends ActivatableWithDataModel<FailedTradesDataModel> implements ViewModel {
|
||||
private static final Logger log = LoggerFactory.getLogger(FailedTradesViewModel.class);
|
||||
|
||||
private final BSFormatter formatter;
|
||||
|
||||
|
||||
@Inject
|
||||
public FailedTradesViewModel(FailedTradesDataModel dataModel, BSFormatter formatter) {
|
||||
super(dataModel);
|
||||
|
||||
this.formatter = formatter;
|
||||
}
|
||||
|
||||
public ObservableList<FailedTradesListItem> getList() {
|
||||
return dataModel.getList();
|
||||
}
|
||||
|
||||
String getTradeId(FailedTradesListItem item) {
|
||||
return item.getTrade().getId();
|
||||
}
|
||||
|
||||
String getAmount(FailedTradesListItem item) {
|
||||
if (item != null && item.getTrade() instanceof Trade)
|
||||
return formatter.formatCoinWithCode(((Trade) item.getTrade()).getTradeAmount());
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
||||
String getPrice(FailedTradesListItem item) {
|
||||
return (item != null) ? formatter.formatFiat(item.getTrade().getOffer().getPrice()) : "";
|
||||
}
|
||||
|
||||
String getVolume(FailedTradesListItem item) {
|
||||
if (item != null && item.getTrade() instanceof Trade)
|
||||
return formatter.formatFiatWithCode(((Trade) item.getTrade()).getTradeVolume());
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
||||
String getDirectionLabel(FailedTradesListItem item) {
|
||||
return (item != null) ? formatter.formatDirection(dataModel.getDirection(item.getTrade().getOffer())) : "";
|
||||
}
|
||||
|
||||
String getDate(FailedTradesListItem item) {
|
||||
return formatter.formatDateTime(item.getTrade().getDate());
|
||||
}
|
||||
|
||||
String getState(FailedTradesListItem item) {
|
||||
if (item != null) {
|
||||
Trade trade = item.getTrade();
|
||||
TradeState tradeState = trade.tradeStateProperty().get();
|
||||
if (trade instanceof BuyerTrade) {
|
||||
if (tradeState == TradeState.BuyerState.FAILED) {
|
||||
return "Failed";
|
||||
}
|
||||
else {
|
||||
log.error("Wrong state " + item.getTrade().tradeStateProperty().get());
|
||||
}
|
||||
}
|
||||
else if (trade instanceof SellerTrade) {
|
||||
if (tradeState == TradeState.SellerState.FAILED) {
|
||||
return "Failed";
|
||||
}
|
||||
else {
|
||||
log.error("Wrong state " + item.getTrade().tradeStateProperty().get());
|
||||
}
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -148,23 +148,6 @@ public class BuyerSubView extends TradeSubView {
|
|||
"You can review the details to that trade any time in the closed trades screen.");
|
||||
completedView.setWithdrawAmountTextFieldText(model.getPayoutAmount());
|
||||
break;
|
||||
case CLOSED:
|
||||
showItem(waitTxInBlockchain);
|
||||
((WaitTxInBlockchainView) tradeStepDetailsView).setInfoLabelText("Trade is closed");
|
||||
break;
|
||||
case FAULT:
|
||||
showItem(waitTxInBlockchain);
|
||||
((WaitTxInBlockchainView) tradeStepDetailsView).setInfoLabelText("Error occured");
|
||||
break;
|
||||
/*case MESSAGE_SENDING_FAILED:
|
||||
Popups.openWarningPopup("Sending message to trading peer failed.", model.getErrorMessage());
|
||||
break;
|
||||
case EXCEPTION:
|
||||
if (model.getTradeException() != null)
|
||||
Popups.openExceptionPopup(model.getTradeException());
|
||||
else
|
||||
Popups.openErrorPopup("An error occurred", model.getErrorMessage());
|
||||
break;*/
|
||||
default:
|
||||
log.warn("unhandled buyerState " + state);
|
||||
break;
|
||||
|
|
|
@ -32,8 +32,8 @@ import io.bitsquare.trade.Contract;
|
|||
import io.bitsquare.trade.SellerTrade;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.TradeManager;
|
||||
import io.bitsquare.trade.TradeState;
|
||||
import io.bitsquare.trade.offer.Offer;
|
||||
import io.bitsquare.trade.states.TradeState;
|
||||
import io.bitsquare.user.User;
|
||||
|
||||
import org.bitcoinj.core.BlockChainListener;
|
||||
|
@ -71,8 +71,8 @@ class PendingTradesDataModel implements Activatable, DataModel {
|
|||
private final ListChangeListener<Trade> tradesListChangeListener;
|
||||
private boolean isOffererRole;
|
||||
|
||||
private final ObjectProperty<TradeState.ProcessState> sellerProcessState = new SimpleObjectProperty<>();
|
||||
private final ObjectProperty<TradeState.ProcessState> buyerProcessState = new SimpleObjectProperty<>();
|
||||
private final ObjectProperty<TradeState> sellerProcessState = new SimpleObjectProperty<>();
|
||||
private final ObjectProperty<TradeState> buyerProcessState = new SimpleObjectProperty<>();
|
||||
private final ObjectProperty<Trade> tradeProperty = new SimpleObjectProperty<>();
|
||||
private final StringProperty txId = new SimpleStringProperty();
|
||||
private Trade trade;
|
||||
|
@ -108,8 +108,7 @@ class PendingTradesDataModel implements Activatable, DataModel {
|
|||
|
||||
private void onListChanged() {
|
||||
list.clear();
|
||||
list.addAll(tradeManager.getPendingTrades().stream().filter(e -> !e.isFaultState())
|
||||
.map(PendingTradesListItem::new).collect(Collectors.toList()));
|
||||
list.addAll(tradeManager.getPendingTrades().stream().map(PendingTradesListItem::new).collect(Collectors.toList()));
|
||||
|
||||
// we sort by date, earliest first
|
||||
list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate()));
|
||||
|
@ -147,9 +146,9 @@ class PendingTradesDataModel implements Activatable, DataModel {
|
|||
isOffererRole = tradeManager.isMyOffer(trade.getOffer());
|
||||
|
||||
if (trade instanceof SellerTrade)
|
||||
sellerProcessState.bind(trade.processStateProperty());
|
||||
sellerProcessState.bind(trade.tradeStateProperty());
|
||||
else if (trade instanceof BuyerTrade)
|
||||
buyerProcessState.bind(trade.processStateProperty());
|
||||
buyerProcessState.bind(trade.tradeStateProperty());
|
||||
|
||||
if (trade.getDepositTx() != null)
|
||||
txId.set(trade.getDepositTx().getHashAsString());
|
||||
|
@ -244,10 +243,6 @@ class PendingTradesDataModel implements Activatable, DataModel {
|
|||
return trade.getOffer().getCurrencyCode();
|
||||
}
|
||||
|
||||
Throwable getTradeException() {
|
||||
return trade.getThrowable();
|
||||
}
|
||||
|
||||
String getErrorMessage() {
|
||||
return trade.getErrorMessage();
|
||||
}
|
||||
|
@ -268,11 +263,11 @@ class PendingTradesDataModel implements Activatable, DataModel {
|
|||
return trade;
|
||||
}
|
||||
|
||||
ReadOnlyObjectProperty<TradeState.ProcessState> getSellerProcessState() {
|
||||
ReadOnlyObjectProperty<TradeState> getSellerProcessState() {
|
||||
return sellerProcessState;
|
||||
}
|
||||
|
||||
ReadOnlyObjectProperty<TradeState.ProcessState> getBuyerProcessState() {
|
||||
ReadOnlyObjectProperty<TradeState> getBuyerProcessState() {
|
||||
return buyerProcessState;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,8 +24,7 @@ import io.bitsquare.gui.util.BSFormatter;
|
|||
import io.bitsquare.gui.util.validation.BtcAddressValidator;
|
||||
import io.bitsquare.locale.BSResources;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.states.BuyerTradeState;
|
||||
import io.bitsquare.trade.states.SellerTradeState;
|
||||
import io.bitsquare.trade.TradeState;
|
||||
|
||||
import org.bitcoinj.core.BlockChainListener;
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
@ -62,9 +61,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
REQUEST_START_FIAT_PAYMENT,
|
||||
WAIT_FOR_FIAT_PAYMENT_RECEIPT,
|
||||
WAIT_FOR_UNLOCK_PAYOUT,
|
||||
REQUEST_WITHDRAWAL,
|
||||
CLOSED,
|
||||
FAULT
|
||||
REQUEST_WITHDRAWAL
|
||||
}
|
||||
|
||||
enum SellerState implements State {
|
||||
|
@ -74,9 +71,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
REQUEST_CONFIRM_FIAT_PAYMENT_RECEIVED,
|
||||
WAIT_FOR_PAYOUT_TX,
|
||||
WAIT_FOR_UNLOCK_PAYOUT,
|
||||
REQUEST_WITHDRAWAL,
|
||||
CLOSED,
|
||||
FAULT
|
||||
REQUEST_WITHDRAWAL
|
||||
}
|
||||
|
||||
private final BSFormatter formatter;
|
||||
|
@ -84,8 +79,8 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
private final InvalidationListener buyerStateListener;
|
||||
private final BtcAddressValidator btcAddressValidator;
|
||||
|
||||
private final ObjectProperty<BuyerState> buyerState = new SimpleObjectProperty<>(BuyerState.UNDEFINED);
|
||||
private final ObjectProperty<SellerState> sellerState = new SimpleObjectProperty<>(SellerState.UNDEFINED);
|
||||
private final ObjectProperty<BuyerState> buyerState = new SimpleObjectProperty<>(PendingTradesViewModel.BuyerState.UNDEFINED);
|
||||
private final ObjectProperty<SellerState> sellerState = new SimpleObjectProperty<>(PendingTradesViewModel.SellerState.UNDEFINED);
|
||||
|
||||
private final StringProperty txId = new SimpleStringProperty();
|
||||
private final BooleanProperty withdrawalButtonDisable = new SimpleBooleanProperty(true);
|
||||
|
@ -177,10 +172,6 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
|
||||
public void onWithdrawRequest(String withdrawToAddress) {
|
||||
dataModel.onWithdrawRequest(withdrawToAddress);
|
||||
if (dataModel.getSellerProcessState().get() instanceof SellerTradeState.ProcessState)
|
||||
sellerState.setValue(SellerState.CLOSED);
|
||||
else
|
||||
buyerState.setValue(BuyerState.CLOSED);
|
||||
}
|
||||
|
||||
public void withdrawAddressFocusOut(String text) {
|
||||
|
@ -215,10 +206,6 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
return btcAddressValidator;
|
||||
}
|
||||
|
||||
Throwable getTradeException() {
|
||||
return dataModel.getTradeException();
|
||||
}
|
||||
|
||||
String getErrorMessage() {
|
||||
return dataModel.getErrorMessage();
|
||||
}
|
||||
|
@ -322,51 +309,46 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private void applySellerState() {
|
||||
if (dataModel.getSellerProcessState().get() instanceof SellerTradeState.ProcessState) {
|
||||
SellerTradeState.ProcessState processState = (SellerTradeState.ProcessState) dataModel.getSellerProcessState().get();
|
||||
if (dataModel.getSellerProcessState().get() instanceof TradeState.SellerState) {
|
||||
TradeState.SellerState processState = (TradeState.SellerState) dataModel.getSellerProcessState().get();
|
||||
log.debug("updateSellerState (SellerTradeState) " + processState);
|
||||
if (processState != null) {
|
||||
switch (processState) {
|
||||
case UNDEFINED:
|
||||
sellerState.set(SellerState.UNDEFINED);
|
||||
case PREPARATION:
|
||||
sellerState.set(PendingTradesViewModel.SellerState.UNDEFINED);
|
||||
break;
|
||||
|
||||
case DEPOSIT_PUBLISHED_MSG_RECEIVED:
|
||||
sellerState.set(SellerState.WAIT_FOR_BLOCKCHAIN_CONFIRMATION);
|
||||
sellerState.set(PendingTradesViewModel.SellerState.WAIT_FOR_BLOCKCHAIN_CONFIRMATION);
|
||||
break;
|
||||
|
||||
|
||||
case DEPOSIT_CONFIRMED:
|
||||
sellerState.set(SellerState.WAIT_FOR_FIAT_PAYMENT_STARTED);
|
||||
sellerState.set(PendingTradesViewModel.SellerState.WAIT_FOR_FIAT_PAYMENT_STARTED);
|
||||
break;
|
||||
|
||||
|
||||
case FIAT_PAYMENT_STARTED_MSG_RECEIVED:
|
||||
sellerState.set(SellerState.REQUEST_CONFIRM_FIAT_PAYMENT_RECEIVED);
|
||||
sellerState.set(PendingTradesViewModel.SellerState.REQUEST_CONFIRM_FIAT_PAYMENT_RECEIVED);
|
||||
break;
|
||||
|
||||
|
||||
case FIAT_PAYMENT_RECEIPT:
|
||||
break;
|
||||
case FIAT_PAYMENT_RECEIPT_MSG_SENT:
|
||||
sellerState.set(SellerState.WAIT_FOR_PAYOUT_TX);
|
||||
sellerState.set(PendingTradesViewModel.SellerState.WAIT_FOR_PAYOUT_TX);
|
||||
break;
|
||||
|
||||
|
||||
case PAYOUT_TX_RECEIVED:
|
||||
break;
|
||||
case PAYOUT_TX_COMMITTED:
|
||||
sellerState.set(SellerState.WAIT_FOR_UNLOCK_PAYOUT);
|
||||
sellerState.set(PendingTradesViewModel.SellerState.WAIT_FOR_UNLOCK_PAYOUT);
|
||||
break;
|
||||
|
||||
|
||||
case PAYOUT_BROAD_CASTED:
|
||||
sellerState.set(SellerState.REQUEST_WITHDRAWAL);
|
||||
break;
|
||||
|
||||
|
||||
case FAULT:
|
||||
sellerState.set(SellerState.FAULT);
|
||||
sellerState.set(PendingTradesViewModel.SellerState.REQUEST_WITHDRAWAL);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -381,31 +363,31 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
}
|
||||
|
||||
private void applyBuyerState() {
|
||||
if (dataModel.getBuyerProcessState().get() instanceof BuyerTradeState.ProcessState) {
|
||||
BuyerTradeState.ProcessState processState = (BuyerTradeState.ProcessState) dataModel.getBuyerProcessState().get();
|
||||
if (dataModel.getBuyerProcessState().get() instanceof TradeState.BuyerState) {
|
||||
TradeState.BuyerState processState = (TradeState.BuyerState) dataModel.getBuyerProcessState().get();
|
||||
log.debug("updateBuyerState (BuyerTradeState) " + processState);
|
||||
if (processState != null) {
|
||||
switch (processState) {
|
||||
case UNDEFINED:
|
||||
sellerState.set(SellerState.UNDEFINED);
|
||||
case PREPARATION:
|
||||
sellerState.set(PendingTradesViewModel.SellerState.UNDEFINED);
|
||||
break;
|
||||
|
||||
|
||||
case DEPOSIT_PUBLISHED:
|
||||
case DEPOSIT_PUBLISHED_MSG_SENT:
|
||||
buyerState.set(BuyerState.WAIT_FOR_BLOCKCHAIN_CONFIRMATION);
|
||||
buyerState.set(PendingTradesViewModel.BuyerState.WAIT_FOR_BLOCKCHAIN_CONFIRMATION);
|
||||
break;
|
||||
|
||||
|
||||
case DEPOSIT_CONFIRMED:
|
||||
buyerState.set(BuyerState.REQUEST_START_FIAT_PAYMENT);
|
||||
buyerState.set(PendingTradesViewModel.BuyerState.REQUEST_START_FIAT_PAYMENT);
|
||||
break;
|
||||
|
||||
|
||||
case FIAT_PAYMENT_STARTED:
|
||||
break;
|
||||
case FIAT_PAYMENT_STARTED_MSG_SENT:
|
||||
buyerState.set(BuyerState.WAIT_FOR_FIAT_PAYMENT_RECEIPT);
|
||||
buyerState.set(PendingTradesViewModel.BuyerState.WAIT_FOR_FIAT_PAYMENT_RECEIPT);
|
||||
break;
|
||||
|
||||
|
||||
|
@ -413,17 +395,12 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
|
|||
case PAYOUT_TX_COMMITTED:
|
||||
break;
|
||||
case PAYOUT_TX_SENT:
|
||||
buyerState.set(BuyerState.WAIT_FOR_UNLOCK_PAYOUT);
|
||||
buyerState.set(PendingTradesViewModel.BuyerState.WAIT_FOR_UNLOCK_PAYOUT);
|
||||
break;
|
||||
|
||||
|
||||
case PAYOUT_BROAD_CASTED:
|
||||
buyerState.set(BuyerState.REQUEST_WITHDRAWAL);
|
||||
break;
|
||||
|
||||
|
||||
case FAULT:
|
||||
sellerState.set(SellerState.FAULT);
|
||||
buyerState.set(PendingTradesViewModel.BuyerState.REQUEST_WITHDRAWAL);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -177,24 +177,6 @@ public class SellerSubView extends TradeSubView {
|
|||
|
||||
completedView.setWithdrawAmountTextFieldText(model.getPayoutAmount());
|
||||
break;
|
||||
case CLOSED:
|
||||
showItem(waitTxInBlockchain);
|
||||
((WaitTxInBlockchainView) tradeStepDetailsView).setInfoLabelText("Trade is closed");
|
||||
break;
|
||||
case FAULT:
|
||||
showItem(waitTxInBlockchain);
|
||||
((WaitTxInBlockchainView) tradeStepDetailsView).setInfoLabelText("Error occured");
|
||||
break;
|
||||
|
||||
/* case MESSAGE_SENDING_FAILED:
|
||||
Popups.openWarningPopup("Sending message to trading peer failed.", model.getErrorMessage());
|
||||
break;
|
||||
case EXCEPTION:
|
||||
if (model.getTradeException() != null)
|
||||
Popups.openExceptionPopup(model.getTradeException());
|
||||
else
|
||||
Popups.openErrorPopup("An error occurred", model.getErrorMessage());
|
||||
break;*/
|
||||
default:
|
||||
log.warn("unhandled viewState " + viewState);
|
||||
break;
|
||||
|
|
|
@ -21,7 +21,7 @@ package io.bitsquare.gui.util.validation;
|
|||
* That validator accepts empty inputs
|
||||
*/
|
||||
public class OptionalBtcValidator extends BtcValidator {
|
||||
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
ValidationResult result = validateIfNotEmpty(input);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue