formatting, rename packages

This commit is contained in:
Manfred Karrer 2014-05-01 00:30:55 +02:00
parent 256388e4e3
commit 7d0676a995
25 changed files with 1354 additions and 1306 deletions

View file

@ -2,6 +2,8 @@ package io.bitsquare;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import io.bitsquare.bank.BankAccount;
import io.bitsquare.bank.BankAccountType;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.di.BitSquareModule; import io.bitsquare.di.BitSquareModule;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
@ -10,6 +12,7 @@ import io.bitsquare.settings.Settings;
import io.bitsquare.storage.Storage; import io.bitsquare.storage.Storage;
import io.bitsquare.user.Arbitrator; import io.bitsquare.user.Arbitrator;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import io.bitsquare.util.MockData;
import javafx.application.Application; import javafx.application.Application;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.Scene; import javafx.scene.Scene;
@ -100,32 +103,35 @@ public class BitSquare extends Application
storage.write(settings.getClass().getName(), settings); storage.write(settings.getClass().getName(), settings);
/* initMockUser(storage, user);
BankAccount bankAccount1 = new BankAccount(new BankAccountType(BankAccountType.BankAccountTypeEnum.SEPA,"Iban", "Bic"),
MockData.getCurrencies().get(0),
MockData.getLocales().get(0),
"Main account",
"Manfred Karrer",
"564613242346",
"23432432434"
);
BankAccount bankAccount2 = new BankAccount(new BankAccountType(BankAccountType.BankAccountTypeEnum.OK_PAY,"Number", "ID"),
MockData.getCurrencies().get(0),
MockData.getLocales().get(0),
"OK account",
"Manfred Karrer",
"22312123123123123",
"asdasdasdas"
);
user.addBankAccount(bankAccount2);
user.addBankAccount(bankAccount1);
user.setAccountID(UUID.randomUUID().toString());
storage.write(user.getClass().getName(), user);
*/
} }
else else
{ {
settings.updateFromStorage(savedSettings); settings.updateFromStorage(savedSettings);
} }
} }
private void initMockUser(Storage storage, User user)
{
BankAccount bankAccount1 = new BankAccount(new BankAccountType(BankAccountType.BankAccountTypeEnum.SEPA, "Iban", "Bic"),
MockData.getCurrencies().get(0),
MockData.getLocales().get(0),
"Main account",
"Manfred Karrer",
"564613242346",
"23432432434"
);
BankAccount bankAccount2 = new BankAccount(new BankAccountType(BankAccountType.BankAccountTypeEnum.OK_PAY, "Number", "ID"),
MockData.getCurrencies().get(0),
MockData.getLocales().get(0),
"OK account",
"Manfred Karrer",
"22312123123123123",
"asdasdasdas"
);
user.addBankAccount(bankAccount2);
user.addBankAccount(bankAccount1);
user.setAccountID(UUID.randomUUID().toString());
storage.write(user.getClass().getName(), user);
}
} }

View file

@ -18,12 +18,14 @@ public class BlockChainFacade
public boolean verifyEmbeddedData(String address) public boolean verifyEmbeddedData(String address)
{ {
// tx id 76982adc582657b2eb68f3e43341596a68aadc4ef6b9590e88e93387d4d5d1f9
// address: mjbxLbuVpU1cNXLJbrJZyirYwweoRPVVTj
return true; return true;
/* /*
if (findAddressInBlockChain(address) && isFeePayed(address)) if (findAddressInBlockChain(address) && isFeePayed(address))
return getDataForTxWithAddress(address) != null; return getDataForTxWithAddress(address) != null;
else else
return true; */ return true; */
} }
private boolean findAddressInBlockChain(String address) private boolean findAddressInBlockChain(String address)

View file

@ -3,5 +3,4 @@ package io.bitsquare.gui;
public interface ChildController public interface ChildController
{ {
void setNavigationController(NavigationController navigationController); void setNavigationController(NavigationController navigationController);
} }

View file

@ -5,8 +5,8 @@ import io.bitsquare.bank.BankAccount;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.components.NetworkSyncPane; import io.bitsquare.gui.components.NetworkSyncPane;
import io.bitsquare.gui.market.MarketController;
import io.bitsquare.gui.setup.SetupController; import io.bitsquare.gui.setup.SetupController;
import io.bitsquare.gui.trade.TradeController;
import io.bitsquare.gui.util.Formatter; import io.bitsquare.gui.util.Formatter;
import io.bitsquare.gui.util.Icons; import io.bitsquare.gui.util.Icons;
import io.bitsquare.gui.util.Localisation; import io.bitsquare.gui.util.Localisation;
@ -56,6 +56,11 @@ public class MainController implements Initializable, NavigationController, Wall
@FXML @FXML
public AnchorPane anchorPane; public AnchorPane anchorPane;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject
public MainController(User user, WalletFacade walletFacade) public MainController(User user, WalletFacade walletFacade)
{ {
@ -63,6 +68,11 @@ public class MainController implements Initializable, NavigationController, Wall
this.walletFacade = walletFacade; this.walletFacade = walletFacade;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
@ -87,6 +97,10 @@ public class MainController implements Initializable, NavigationController, Wall
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public ChildController navigateToView(String fxmlView, String title) public ChildController navigateToView(String fxmlView, String title)
{ {
@ -102,9 +116,9 @@ public class MainController implements Initializable, NavigationController, Wall
return null; return null;
} }
if (childController instanceof TradeController) if (childController instanceof MarketController)
{ {
((TradeController) childController).cleanup(); ((MarketController) childController).cleanup();
} }
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(fxmlView), Localisation.getResourceBundle()); final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(fxmlView), Localisation.getResourceBundle());
@ -122,6 +136,11 @@ public class MainController implements Initializable, NavigationController, Wall
return null; return null;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: WalletFacade.DownloadListener
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void progress(double percent, int blocksSoFar, Date date) public void progress(double percent, int blocksSoFar, Date date)
{ {
@ -136,15 +155,10 @@ public class MainController implements Initializable, NavigationController, Wall
Platform.runLater(networkSyncPane::doneDownload); Platform.runLater(networkSyncPane::doneDownload);
} }
public ChildController navigateToView(String fxmlView, Direction direction)
{ ///////////////////////////////////////////////////////////////////////////////////////////
childController = navigateToView(fxmlView, direction == Direction.BUY ? "Orderbook Buy" : "Orderbook Sell"); // Private methods
if (childController instanceof TradeController && direction != null) ///////////////////////////////////////////////////////////////////////////////////////////
{
((TradeController) childController).setDirection(direction);
}
return childController;
}
private void buildSetupView() private void buildSetupView()
{ {
@ -165,8 +179,8 @@ public class MainController implements Initializable, NavigationController, Wall
toggleGroup = new ToggleGroup(); toggleGroup = new ToggleGroup();
ToggleButton homeButton = addNavButton(leftNavPane, "Overview", Icons.HOME, Icons.HOME, NavigationController.HOME); ToggleButton homeButton = addNavButton(leftNavPane, "Overview", Icons.HOME, Icons.HOME, NavigationController.HOME);
ToggleButton buyButton = addNavButton(leftNavPane, "Buy BTC", Icons.NAV_BUY, Icons.NAV_BUY_ACTIVE, NavigationController.TRADE, Direction.BUY); ToggleButton buyButton = addNavButton(leftNavPane, "Buy BTC", Icons.NAV_BUY, Icons.NAV_BUY_ACTIVE, NavigationController.MARKET, Direction.BUY);
ToggleButton sellButton = addNavButton(leftNavPane, "Sell BTC", Icons.NAV_SELL, Icons.NAV_SELL_ACTIVE, NavigationController.TRADE, Direction.SELL); ToggleButton sellButton = addNavButton(leftNavPane, "Sell BTC", Icons.NAV_SELL, Icons.NAV_SELL_ACTIVE, NavigationController.MARKET, Direction.SELL);
addNavButton(leftNavPane, "Orders", Icons.ORDERS, Icons.ORDERS, NavigationController.ORDERS); addNavButton(leftNavPane, "Orders", Icons.ORDERS, Icons.ORDERS, NavigationController.ORDERS);
addNavButton(leftNavPane, "History", Icons.HISTORY, Icons.HISTORY, NavigationController.HISTORY); addNavButton(leftNavPane, "History", Icons.HISTORY, Icons.HISTORY, NavigationController.HISTORY);
addNavButton(leftNavPane, "Funds", Icons.FUNDS, Icons.FUNDS, NavigationController.FUNDS); addNavButton(leftNavPane, "Funds", Icons.FUNDS, Icons.FUNDS, NavigationController.FUNDS);
@ -201,12 +215,18 @@ public class MainController implements Initializable, NavigationController, Wall
prevToggleButtonIcon = ((ImageView) (toggleButton.getGraphic())).getImage(); prevToggleButtonIcon = ((ImageView) (toggleButton.getGraphic())).getImage();
((ImageView) (toggleButton.getGraphic())).setImage(Icons.getIconImage(iconIdActivated)); ((ImageView) (toggleButton.getGraphic())).setImage(Icons.getIconImage(iconIdActivated));
if (childController instanceof TradeController && direction != null) if (childController instanceof MarketController && direction != null)
{ {
((TradeController) childController).setDirection(direction); ((MarketController) childController).setDirection(direction);
} }
else else
navigateToView(navTarget, direction); {
childController = navigateToView(navTarget, direction == Direction.BUY ? "Orderbook Buy" : "Orderbook Sell");
if (childController instanceof MarketController && direction != null)
{
((MarketController) childController).setDirection(direction);
}
}
prevToggleButton = toggleButton; prevToggleButton = toggleButton;

View file

@ -2,20 +2,19 @@ package io.bitsquare.gui;
public interface NavigationController public interface NavigationController
{ {
public static final String SETUP = "/io/bitsquare/gui/setup/SetupView.fxml"; public static final String SETUP = "/io/bitsquare/gui/setup/SetupView.fxml";
public static final String HOME = "/io/bitsquare/gui/home/HomeView.fxml"; public static final String HOME = "/io/bitsquare/gui/home/HomeView.fxml";
public static final String TRADE = "/io/bitsquare/gui/trade/TradeView.fxml"; public static final String MARKET = "/io/bitsquare/gui/market/MarketView.fxml";
public static final String ORDERS = "/io/bitsquare/gui/orders/OrdersView.fxml"; public static final String ORDERS = "/io/bitsquare/gui/orders/OrdersView.fxml";
public static final String FUNDS = "/io/bitsquare/gui/funds/FundsView.fxml"; public static final String FUNDS = "/io/bitsquare/gui/funds/FundsView.fxml";
public static final String MSG = "/io/bitsquare/gui/msg/MsgView.fxml"; public static final String MSG = "/io/bitsquare/gui/msg/MsgView.fxml";
public static final String HISTORY = "/io/bitsquare/gui/history/HistoryView.fxml"; public static final String HISTORY = "/io/bitsquare/gui/history/HistoryView.fxml";
public static final String SETTINGS = "/io/bitsquare/gui/settings/SettingsView.fxml"; public static final String SETTINGS = "/io/bitsquare/gui/settings/SettingsView.fxml";
public static final String TRADE__ORDER_BOOK = "/io/bitsquare/gui/trade/orderbook/OrderBookView.fxml"; public static final String ORDER_BOOK = "/io/bitsquare/gui/market/orderbook/OrderBookView.fxml";
public static final String TRADE__PROCESS = "/io/bitsquare/gui/trade/tradeprocess/TradeProcessView.fxml"; public static final String TRADE = "/io/bitsquare/gui/market/trade/TradeView.fxml";
public static final String TRADE__CREATE_OFFER = "/io/bitsquare/gui/trade/offer/CreateOfferView.fxml"; public static final String CREATE_OFFER = "/io/bitsquare/gui/market/offer/CreateOfferView.fxml";
ChildController navigateToView(String fxmlView, String title); ChildController navigateToView(String fxmlView, String title);
} }

View file

@ -1,97 +1,122 @@
package io.bitsquare.gui.trade; package io.bitsquare.gui.market;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.ChildController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.trade.orderbook.OrderBookController; import io.bitsquare.gui.market.orderbook.OrderBookController;
import io.bitsquare.gui.util.Localisation; import io.bitsquare.gui.util.Localisation;
import io.bitsquare.trade.Direction; import io.bitsquare.trade.Direction;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.control.Tab; import javafx.scene.control.Tab;
import javafx.scene.control.TabPane; import javafx.scene.control.TabPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class TradeController implements Initializable, NavigationController, ChildController public class MarketController implements Initializable, NavigationController, ChildController
{ {
@FXML private ChildController childController;
private TabPane tabPane; private boolean orderbookCreated;
private NavigationController navigationController;
private ChildController childController; private OrderBookController orderBookController;
private boolean orderbookCreated;
private NavigationController navigationController; @FXML
private OrderBookController orderBookController; private TabPane tabPane;
@Override
public ChildController navigateToView(String fxmlView, String title) ///////////////////////////////////////////////////////////////////////////////////////////
{ // Interface implementation: Initializable
if (fxmlView.equals(NavigationController.TRADE__ORDER_BOOK) && orderbookCreated) ///////////////////////////////////////////////////////////////////////////////////////////
{
tabPane.getSelectionModel().select(0); @Override
return null; public void initialize(URL url, ResourceBundle rb)
} {
navigateToView(NavigationController.ORDER_BOOK, "Orderbook");
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(fxmlView), Localisation.getResourceBundle()); }
try
{
Pane view = loader.load(); ///////////////////////////////////////////////////////////////////////////////////////////
childController = loader.getController(); // Interface implementation: NavigationController
childController.setNavigationController(this); ///////////////////////////////////////////////////////////////////////////////////////////
if (childController instanceof OrderBookController) @Override
orderBookController = (OrderBookController) childController; public ChildController navigateToView(String fxmlView, String title)
{
Tab tab = new Tab(title); if (fxmlView.equals(NavigationController.ORDER_BOOK) && orderbookCreated)
tab.setContent(view); {
tabPane.getTabs().add(tab); tabPane.getSelectionModel().select(0);
return null;
if (fxmlView.equals(NavigationController.TRADE__ORDER_BOOK)) }
{
tab.setClosable(false); final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(fxmlView), Localisation.getResourceBundle());
orderbookCreated = true; try
} {
Pane view = loader.load();
tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1); childController = loader.getController();
childController.setNavigationController(this);
return childController;
} catch (IOException e) if (childController instanceof OrderBookController)
{ orderBookController = (OrderBookController) childController;
e.printStackTrace();
} Tab tab = new Tab(title);
return null; tab.setContent(view);
} tabPane.getTabs().add(tab);
@Override if (fxmlView.equals(NavigationController.ORDER_BOOK))
public void initialize(URL url, ResourceBundle rb) {
{ tab.setClosable(false);
navigateToView(NavigationController.TRADE__ORDER_BOOK, "Orderbook"); orderbookCreated = true;
} }
@Override tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1);
public void setNavigationController(NavigationController navigationController)
{ return childController;
} catch (IOException e)
this.navigationController = navigationController; {
} e.printStackTrace();
}
public void setDirection(Direction direction) return null;
{ }
tabPane.getSelectionModel().select(0);
orderBookController.setDirection(direction);
} ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
public void cleanup() ///////////////////////////////////////////////////////////////////////////////////////////
{
if (orderBookController != null) @Override
{ public void setNavigationController(NavigationController navigationController)
orderBookController.cleanup(); {
orderBookController = null;
} this.navigationController = navigationController;
} }
}
///////////////////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////////////////
public void cleanup()
{
if (orderBookController != null)
{
orderBookController.cleanup();
orderBookController = null;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Setter
///////////////////////////////////////////////////////////////////////////////////////////
public void setDirection(Direction direction)
{
tabPane.getSelectionModel().select(0);
orderBookController.setDirection(direction);
}
}

View file

@ -4,4 +4,4 @@
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
<TabPane fx:id="tabPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" <TabPane fx:id="tabPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns:fx="http://javafx.com/fxml/1" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="io.bitsquare.gui.trade.TradeController"/> fx:controller="io.bitsquare.gui.market.MarketController"/>

View file

@ -1,225 +1,225 @@
package io.bitsquare.gui.trade.offer; package io.bitsquare.gui.market.offer;
import com.google.bitcoin.core.InsufficientMoneyException; import com.google.bitcoin.core.InsufficientMoneyException;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.btc.Fees; import io.bitsquare.btc.Fees;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.ChildController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.components.ConfirmationComponent; import io.bitsquare.gui.components.ConfirmationComponent;
import io.bitsquare.gui.util.*; import io.bitsquare.gui.util.*;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
import io.bitsquare.trade.Direction; import io.bitsquare.trade.Direction;
import io.bitsquare.trade.Offer; import io.bitsquare.trade.Offer;
import io.bitsquare.trade.Trading; import io.bitsquare.trade.Trading;
import io.bitsquare.trade.orderbook.OrderBookFilter; import io.bitsquare.trade.orderbook.OrderBookFilter;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.TabPane; import javafx.scene.control.TabPane;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import org.controlsfx.dialog.Dialogs; import org.controlsfx.dialog.Dialogs;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.math.BigInteger; import java.math.BigInteger;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class CreateOfferController implements Initializable, ChildController, WalletFacade.WalletListener public class CreateOfferController implements Initializable, ChildController, WalletFacade.WalletListener
{ {
private static final Logger log = LoggerFactory.getLogger(CreateOfferController.class); private static final Logger log = LoggerFactory.getLogger(CreateOfferController.class);
private NavigationController navigationController; private NavigationController navigationController;
private Trading trading; private Trading trading;
private WalletFacade walletFacade; private WalletFacade walletFacade;
private Settings settings; private Settings settings;
private User user; private User user;
private Direction direction; private Direction direction;
private Button placeOfferButton; private Button placeOfferButton;
private int gridRow; private int gridRow;
@FXML @FXML
private AnchorPane holderPane; private AnchorPane holderPane;
@FXML @FXML
private GridPane formGridPane; private GridPane formGridPane;
@FXML @FXML
public Label buyLabel; public Label buyLabel;
@FXML @FXML
public TextField volume, amount, price, minAmount; public TextField volume, amount, price, minAmount;
@Inject @Inject
public CreateOfferController(Trading trading, WalletFacade walletFacade, Settings settings, User user) public CreateOfferController(Trading trading, WalletFacade walletFacade, Settings settings, User user)
{ {
this.trading = trading; this.trading = trading;
this.walletFacade = walletFacade; this.walletFacade = walletFacade;
this.settings = settings; this.settings = settings;
this.user = user; this.user = user;
} }
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
walletFacade.addRegistrationWalletListener(this); walletFacade.addRegistrationWalletListener(this);
gridRow = 2; gridRow = 2;
FormBuilder.addVSpacer(formGridPane, ++gridRow); FormBuilder.addVSpacer(formGridPane, ++gridRow);
FormBuilder.addHeaderLabel(formGridPane, "Offer details:", ++gridRow); FormBuilder.addHeaderLabel(formGridPane, "Offer details:", ++gridRow);
FormBuilder.addTextField(formGridPane, "Bank account type:", Localisation.get(user.getCurrentBankAccount().getBankAccountType().getType().toString()), ++gridRow); FormBuilder.addTextField(formGridPane, "Bank account type:", Localisation.get(user.getCurrentBankAccount().getBankAccountType().getType().toString()), ++gridRow);
FormBuilder.addTextField(formGridPane, "Bank account currency:", user.getCurrentBankAccount().getCurrency().getCurrencyCode(), ++gridRow); FormBuilder.addTextField(formGridPane, "Bank account currency:", user.getCurrentBankAccount().getCurrency().getCurrencyCode(), ++gridRow);
FormBuilder.addTextField(formGridPane, "Bank account county:", user.getCurrentBankAccount().getCountryLocale().getDisplayCountry(), ++gridRow); FormBuilder.addTextField(formGridPane, "Bank account county:", user.getCurrentBankAccount().getCountryLocale().getDisplayCountry(), ++gridRow);
FormBuilder.addTextField(formGridPane, "Accepted countries:", Formatter.countryLocalesToString(settings.getAcceptedCountryLocales()), ++gridRow); FormBuilder.addTextField(formGridPane, "Accepted countries:", Formatter.countryLocalesToString(settings.getAcceptedCountryLocales()), ++gridRow);
FormBuilder.addTextField(formGridPane, "Accepted languages:", Formatter.languageLocalesToString(settings.getAcceptedLanguageLocales()), ++gridRow); FormBuilder.addTextField(formGridPane, "Accepted languages:", Formatter.languageLocalesToString(settings.getAcceptedLanguageLocales()), ++gridRow);
FormBuilder.addVSpacer(formGridPane, ++gridRow); FormBuilder.addVSpacer(formGridPane, ++gridRow);
Label placeOfferTitle = FormBuilder.addHeaderLabel(formGridPane, "Place offer:", ++gridRow); Label placeOfferTitle = FormBuilder.addHeaderLabel(formGridPane, "Place offer:", ++gridRow);
TextField feeLabel = FormBuilder.addTextField(formGridPane, "Offer fee:", Formatter.formatSatoshis(Fees.OFFER_CREATION_FEE, true), ++gridRow); TextField feeLabel = FormBuilder.addTextField(formGridPane, "Offer fee:", Formatter.formatSatoshis(Fees.OFFER_CREATION_FEE, true), ++gridRow);
feeLabel.setMouseTransparent(true); feeLabel.setMouseTransparent(true);
placeOfferButton = new Button("Place offer"); placeOfferButton = new Button("Place offer");
formGridPane.add(placeOfferButton, 1, ++gridRow); formGridPane.add(placeOfferButton, 1, ++gridRow);
placeOfferButton.setDefaultButton(true); placeOfferButton.setDefaultButton(true);
// handlers // handlers
amount.textProperty().addListener(new ChangeListener<String>() amount.textProperty().addListener(new ChangeListener<String>()
{ {
@Override @Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
{ {
updateVolume(); updateVolume();
} }
}); });
price.textProperty().addListener(new ChangeListener<String>() price.textProperty().addListener(new ChangeListener<String>()
{ {
@Override @Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
{ {
updateVolume(); updateVolume();
} }
}); });
placeOfferButton.setOnAction(e -> { placeOfferButton.setOnAction(e -> {
if (inputValid()) if (inputValid())
{ {
Offer offer = new Offer(user.getAccountID(), Offer offer = new Offer(user.getAccountID(),
user.getMessageID(), user.getMessageID(),
direction, direction,
Converter.stringToDouble(price.getText()), Converter.stringToDouble(price.getText()),
Converter.stringToDouble(amount.getText()), Converter.stringToDouble(amount.getText()),
Converter.stringToDouble(minAmount.getText()), Converter.stringToDouble(minAmount.getText()),
user.getCurrentBankAccount().getBankAccountType().getType(), user.getCurrentBankAccount().getBankAccountType().getType(),
user.getCurrentBankAccount().getCurrency(), user.getCurrentBankAccount().getCurrency(),
user.getCurrentBankAccount().getCountryLocale(), user.getCurrentBankAccount().getCountryLocale(),
settings.getRandomArbitrator(), settings.getRandomArbitrator(),
settings.getAcceptedCountryLocales(), settings.getAcceptedCountryLocales(),
settings.getAcceptedLanguageLocales()); settings.getAcceptedLanguageLocales());
try try
{ {
String txID = trading.placeNewOffer(offer); String txID = trading.placeNewOffer(offer);
formGridPane.getChildren().remove(placeOfferButton); formGridPane.getChildren().remove(placeOfferButton);
placeOfferTitle.setText("Transaction sent:"); placeOfferTitle.setText("Transaction sent:");
buildConfirmationView(txID); buildConfirmationView(txID);
} catch (InsufficientMoneyException e1) } catch (InsufficientMoneyException e1)
{ {
Dialogs.create() Dialogs.create()
.title("Not enough money available") .title("Not enough money available")
.message("There is not enough money available. Please pay in first to your wallet.") .message("There is not enough money available. Please pay in first to your wallet.")
.nativeTitleBar() .nativeTitleBar()
.lightweight() .lightweight()
.showError(); .showError();
} }
} }
}); });
} }
@Override @Override
public void onConfidenceChanged(int numBroadcastPeers, int depthInBlocks) public void onConfidenceChanged(int numBroadcastPeers, int depthInBlocks)
{ {
log.info("onConfidenceChanged " + numBroadcastPeers + " / " + depthInBlocks); log.info("onConfidenceChanged " + numBroadcastPeers + " / " + depthInBlocks);
} }
@Override @Override
public void onCoinsReceived(BigInteger newBalance) public void onCoinsReceived(BigInteger newBalance)
{ {
log.info("onCoinsReceived " + newBalance); log.info("onCoinsReceived " + newBalance);
} }
private void buildConfirmationView(String txID) private void buildConfirmationView(String txID)
{ {
FormBuilder.addTextField(formGridPane, "Transaction ID:", txID, ++gridRow, false, true); FormBuilder.addTextField(formGridPane, "Transaction ID:", txID, ++gridRow, false, true);
ConfirmationComponent confirmationComponent = new ConfirmationComponent(walletFacade, formGridPane, ++gridRow); ConfirmationComponent confirmationComponent = new ConfirmationComponent(walletFacade, formGridPane, ++gridRow);
Button closeButton = new Button("Close"); Button closeButton = new Button("Close");
formGridPane.add(closeButton, 1, ++gridRow); formGridPane.add(closeButton, 1, ++gridRow);
closeButton.setDefaultButton(true); closeButton.setDefaultButton(true);
closeButton.setOnAction(e -> { closeButton.setOnAction(e -> {
TabPane tabPane = ((TabPane) (holderPane.getParent().getParent())); TabPane tabPane = ((TabPane) (holderPane.getParent().getParent()));
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem()); tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
navigationController.navigateToView(NavigationController.TRADE__ORDER_BOOK, "Orderbook"); navigationController.navigateToView(NavigationController.ORDER_BOOK, "Orderbook");
}); });
} }
@Override @Override
public void setNavigationController(NavigationController navigationController) public void setNavigationController(NavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
public void setOrderBookFilter(OrderBookFilter orderBookFilter) public void setOrderBookFilter(OrderBookFilter orderBookFilter)
{ {
direction = orderBookFilter.getDirection(); direction = orderBookFilter.getDirection();
amount.setText(Formatter.formatPrice(orderBookFilter.getAmount())); amount.setText(Formatter.formatPrice(orderBookFilter.getAmount()));
minAmount.setText(Formatter.formatPrice(orderBookFilter.getAmount())); minAmount.setText(Formatter.formatPrice(orderBookFilter.getAmount()));
price.setText(Formatter.formatPrice(orderBookFilter.getPrice())); price.setText(Formatter.formatPrice(orderBookFilter.getPrice()));
String iconPath = (direction == Direction.BUY) ? Icons.BUY : Icons.SELL; String iconPath = (direction == Direction.BUY) ? Icons.BUY : Icons.SELL;
buyLabel.setText(Formatter.formatDirection(direction, false) + ":"); buyLabel.setText(Formatter.formatDirection(direction, false) + ":");
updateVolume(); updateVolume();
} }
//TODO //TODO
private boolean inputValid() private boolean inputValid()
{ {
return true; return true;
} }
private void updateVolume() private void updateVolume()
{ {
double amountAsDouble = Converter.stringToDouble(amount.getText()); double amountAsDouble = Converter.stringToDouble(amount.getText());
double priceAsDouble = Converter.stringToDouble(price.getText()); double priceAsDouble = Converter.stringToDouble(price.getText());
volume.setText(Formatter.formatPrice(amountAsDouble * priceAsDouble)); volume.setText(Formatter.formatPrice(amountAsDouble * priceAsDouble));
} }
private Image getConfirmIconImage(int numBroadcastPeers, int depthInBlocks) private Image getConfirmIconImage(int numBroadcastPeers, int depthInBlocks)
{ {
if (depthInBlocks > 0) if (depthInBlocks > 0)
return Icons.getIconImage(Icons.getIconIDForConfirmations(depthInBlocks)); return Icons.getIconImage(Icons.getIconIDForConfirmations(depthInBlocks));
else else
return Icons.getIconImage(Icons.getIconIDForPeersSeenTx(numBroadcastPeers)); return Icons.getIconImage(Icons.getIconIDForPeersSeenTx(numBroadcastPeers));
} }
private String getConfirmationsText(int registrationConfirmationNumBroadcastPeers, int registrationConfirmationDepthInBlocks) private String getConfirmationsText(int registrationConfirmationNumBroadcastPeers, int registrationConfirmationDepthInBlocks)
{ {
return registrationConfirmationDepthInBlocks + " confirmation(s) / " + "Seen by " + registrationConfirmationNumBroadcastPeers + " peer(s)"; return registrationConfirmationDepthInBlocks + " confirmation(s) / " + "Seen by " + registrationConfirmationNumBroadcastPeers + " peer(s)";
} }
} }

View file

@ -5,7 +5,7 @@
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane fx:id="holderPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" <AnchorPane fx:id="holderPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns:fx="http://javafx.com/fxml/1" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="io.bitsquare.gui.trade.offer.CreateOfferController"> fx:controller="io.bitsquare.gui.market.offer.CreateOfferController">
<children> <children>
<VBox spacing="10" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="5.0" <VBox spacing="10" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="5.0"
AnchorPane.bottomAnchor="10.0"> AnchorPane.bottomAnchor="10.0">

View file

@ -1,348 +1,348 @@
package io.bitsquare.gui.trade.orderbook; package io.bitsquare.gui.market.orderbook;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.bank.BankAccountType; import io.bitsquare.bank.BankAccountType;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.ChildController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.trade.offer.CreateOfferController; import io.bitsquare.gui.market.offer.CreateOfferController;
import io.bitsquare.gui.trade.tradeprocess.TradeProcessController; import io.bitsquare.gui.market.trade.TradeController;
import io.bitsquare.gui.util.Converter; import io.bitsquare.gui.util.Converter;
import io.bitsquare.gui.util.Formatter; import io.bitsquare.gui.util.Formatter;
import io.bitsquare.gui.util.Icons; import io.bitsquare.gui.util.Icons;
import io.bitsquare.gui.util.Localisation; import io.bitsquare.gui.util.Localisation;
import io.bitsquare.trade.Direction; import io.bitsquare.trade.Direction;
import io.bitsquare.trade.orderbook.OrderBook; import io.bitsquare.trade.orderbook.OrderBook;
import io.bitsquare.trade.orderbook.OrderBookFilter; import io.bitsquare.trade.orderbook.OrderBookFilter;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.transformation.SortedList; import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.util.Callback; import javafx.util.Callback;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.net.URL; import java.net.URL;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.ParseException; import java.text.ParseException;
import java.util.Locale; import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class OrderBookController implements Initializable, ChildController public class OrderBookController implements Initializable, ChildController
{ {
private static final Logger log = LoggerFactory.getLogger(OrderBookController.class); private static final Logger log = LoggerFactory.getLogger(OrderBookController.class);
private NavigationController navigationController; private NavigationController navigationController;
private OrderBook orderBook; private OrderBook orderBook;
private SortedList<OrderBookListItem> offerList; private SortedList<OrderBookListItem> offerList;
private final OrderBookFilter orderBookFilter; private final OrderBookFilter orderBookFilter;
private User user; private User user;
private Image buyIcon = Icons.getIconImage(Icons.BUY); private Image buyIcon = Icons.getIconImage(Icons.BUY);
private Image sellIcon = Icons.getIconImage(Icons.SELL); private Image sellIcon = Icons.getIconImage(Icons.SELL);
@FXML @FXML
public AnchorPane holderPane; public AnchorPane holderPane;
@FXML @FXML
public HBox topHBox; public HBox topHBox;
@FXML @FXML
public TextField volume, amount, price; public TextField volume, amount, price;
@FXML @FXML
public TableView<OrderBookListItem> orderBookTable; public TableView<OrderBookListItem> orderBookTable;
@FXML @FXML
public TableColumn priceColumn, amountColumn, volumeColumn; public TableColumn priceColumn, amountColumn, volumeColumn;
@FXML @FXML
private TableColumn<String, OrderBookListItem> directionColumn, countryColumn, bankAccountTypeColumn; private TableColumn<String, OrderBookListItem> directionColumn, countryColumn, bankAccountTypeColumn;
@FXML @FXML
public Button createOfferButton; public Button createOfferButton;
@Inject @Inject
public OrderBookController(OrderBook orderBook, OrderBookFilter orderBookFilter, User user) public OrderBookController(OrderBook orderBook, OrderBookFilter orderBookFilter, User user)
{ {
this.orderBook = orderBook; this.orderBook = orderBook;
this.orderBookFilter = orderBookFilter; this.orderBookFilter = orderBookFilter;
this.user = user; this.user = user;
} }
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
// setup table // setup table
setCountryColumnCellFactory(); setCountryColumnCellFactory();
setBankAccountTypeColumnCellFactory(); setBankAccountTypeColumnCellFactory();
setDirectionColumnCellFactory(); setDirectionColumnCellFactory();
offerList = orderBook.getOfferList(); offerList = orderBook.getOfferList();
offerList.comparatorProperty().bind(orderBookTable.comparatorProperty()); offerList.comparatorProperty().bind(orderBookTable.comparatorProperty());
orderBookTable.setItems(offerList); orderBookTable.setItems(offerList);
orderBookTable.getSortOrder().add(priceColumn); orderBookTable.getSortOrder().add(priceColumn);
orderBookTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); orderBookTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
// handlers // handlers
amount.textProperty().addListener(new ChangeListener<String>() amount.textProperty().addListener(new ChangeListener<String>()
{ {
@Override @Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
{ {
orderBookFilter.setAmount(textInputToNumber(oldValue, newValue)); orderBookFilter.setAmount(textInputToNumber(oldValue, newValue));
updateVolume(); updateVolume();
} }
}); });
price.textProperty().addListener(new ChangeListener<String>() price.textProperty().addListener(new ChangeListener<String>()
{ {
@Override @Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
{ {
orderBookFilter.setPrice(textInputToNumber(oldValue, newValue)); orderBookFilter.setPrice(textInputToNumber(oldValue, newValue));
updateVolume(); updateVolume();
} }
}); });
orderBookFilter.getChangedProperty().addListener(new ChangeListener<Boolean>() orderBookFilter.getChangedProperty().addListener(new ChangeListener<Boolean>()
{ {
@Override @Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue)
{ {
updateOfferList(); updateOfferList();
} }
}); });
user.getChangedProperty().addListener(new ChangeListener<Boolean>() user.getChangedProperty().addListener(new ChangeListener<Boolean>()
{ {
@Override @Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue)
{ {
updateOfferList(); updateOfferList();
} }
}); });
createOfferButton.setOnAction(e -> { createOfferButton.setOnAction(e -> {
ChildController nextController = navigationController.navigateToView(NavigationController.TRADE__CREATE_OFFER, "Create offer"); ChildController nextController = navigationController.navigateToView(NavigationController.CREATE_OFFER, "Create offer");
((CreateOfferController) nextController).setOrderBookFilter(orderBookFilter); ((CreateOfferController) nextController).setOrderBookFilter(orderBookFilter);
}); });
} }
@Override @Override
public void setNavigationController(NavigationController navigationController) public void setNavigationController(NavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
public void setDirection(Direction direction) public void setDirection(Direction direction)
{ {
orderBookTable.getSelectionModel().clearSelection(); orderBookTable.getSelectionModel().clearSelection();
price.setText(""); price.setText("");
orderBookFilter.setDirection(direction); orderBookFilter.setDirection(direction);
} }
public void cleanup() public void cleanup()
{ {
orderBookTable.setItems(null); orderBookTable.setItems(null);
orderBookTable.getSortOrder().clear(); orderBookTable.getSortOrder().clear();
offerList.comparatorProperty().unbind(); offerList.comparatorProperty().unbind();
} }
private void openTradeTab(OrderBookListItem orderBookListItem) private void openTradeTab(OrderBookListItem orderBookListItem)
{ {
String title = orderBookListItem.getOffer().getDirection() == Direction.BUY ? "Trade: Sell Bitcoin" : "Trade: Buy Bitcoin"; String title = orderBookListItem.getOffer().getDirection() == Direction.BUY ? "Trade: Sell Bitcoin" : "Trade: Buy Bitcoin";
TradeProcessController tradeProcessController = (TradeProcessController) navigationController.navigateToView(NavigationController.TRADE__PROCESS, title); TradeController tradeController = (TradeController) navigationController.navigateToView(NavigationController.TRADE, title);
double requestedAmount = orderBookListItem.getOffer().getAmount(); double requestedAmount = orderBookListItem.getOffer().getAmount();
if (!amount.getText().equals("")) if (!amount.getText().equals(""))
requestedAmount = Converter.stringToDouble(amount.getText()); requestedAmount = Converter.stringToDouble(amount.getText());
tradeProcessController.initWithData(orderBookListItem.getOffer(), requestedAmount); tradeController.initWithData(orderBookListItem.getOffer(), requestedAmount);
} }
private void updateOfferList() private void updateOfferList()
{ {
orderBook.updateFilter(orderBookFilter); orderBook.updateFilter(orderBookFilter);
priceColumn.setSortType((orderBookFilter.getDirection() == Direction.BUY) ? TableColumn.SortType.ASCENDING : TableColumn.SortType.DESCENDING); priceColumn.setSortType((orderBookFilter.getDirection() == Direction.BUY) ? TableColumn.SortType.ASCENDING : TableColumn.SortType.DESCENDING);
orderBookTable.sort(); orderBookTable.sort();
if (orderBookTable.getItems() != null) if (orderBookTable.getItems() != null)
createOfferButton.setDefaultButton(orderBookTable.getItems().size() == 0); createOfferButton.setDefaultButton(orderBookTable.getItems().size() == 0);
} }
private void setDirectionColumnCellFactory() private void setDirectionColumnCellFactory()
{ {
directionColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper(offer.getValue())); directionColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper(offer.getValue()));
directionColumn.setCellFactory(new Callback<TableColumn<String, OrderBookListItem>, TableCell<String, OrderBookListItem>>() directionColumn.setCellFactory(new Callback<TableColumn<String, OrderBookListItem>, TableCell<String, OrderBookListItem>>()
{ {
@Override @Override
public TableCell<String, OrderBookListItem> call(TableColumn<String, OrderBookListItem> directionColumn) public TableCell<String, OrderBookListItem> call(TableColumn<String, OrderBookListItem> directionColumn)
{ {
return new TableCell<String, OrderBookListItem>() return new TableCell<String, OrderBookListItem>()
{ {
final ImageView iconView = new ImageView(); final ImageView iconView = new ImageView();
final Button button = new Button(); final Button button = new Button();
{ {
button.setGraphic(iconView); button.setGraphic(iconView);
button.setMinWidth(70); button.setMinWidth(70);
} }
@Override @Override
public void updateItem(final OrderBookListItem orderBookListItem, boolean empty) public void updateItem(final OrderBookListItem orderBookListItem, boolean empty)
{ {
super.updateItem(orderBookListItem, empty); super.updateItem(orderBookListItem, empty);
if (orderBookListItem != null) if (orderBookListItem != null)
{ {
String title; String title;
Image icon; Image icon;
if (orderBookListItem.getOffer().getDirection() == Direction.SELL) if (orderBookListItem.getOffer().getDirection() == Direction.SELL)
{ {
icon = buyIcon; icon = buyIcon;
title = Formatter.formatDirection(Direction.BUY, true); title = Formatter.formatDirection(Direction.BUY, true);
} }
else else
{ {
icon = sellIcon; icon = sellIcon;
title = Formatter.formatDirection(Direction.SELL, true); title = Formatter.formatDirection(Direction.SELL, true);
} }
iconView.setImage(icon); iconView.setImage(icon);
button.setText(title); button.setText(title);
setGraphic(button); setGraphic(button);
button.setDefaultButton(getIndex() == 0); button.setDefaultButton(getIndex() == 0);
button.setOnAction(event -> openTradeTab(orderBookListItem)); button.setOnAction(event -> openTradeTab(orderBookListItem));
} }
else else
{ {
setGraphic(null); setGraphic(null);
} }
} }
}; };
} }
}); });
} }
private void setCountryColumnCellFactory() private void setCountryColumnCellFactory()
{ {
countryColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper(offer.getValue())); countryColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper(offer.getValue()));
countryColumn.setCellFactory(new Callback<TableColumn<String, OrderBookListItem>, TableCell<String, OrderBookListItem>>() countryColumn.setCellFactory(new Callback<TableColumn<String, OrderBookListItem>, TableCell<String, OrderBookListItem>>()
{ {
@Override @Override
public TableCell<String, OrderBookListItem> call(TableColumn<String, OrderBookListItem> directionColumn) public TableCell<String, OrderBookListItem> call(TableColumn<String, OrderBookListItem> directionColumn)
{ {
return new TableCell<String, OrderBookListItem>() return new TableCell<String, OrderBookListItem>()
{ {
final HBox hBox = new HBox(); final HBox hBox = new HBox();
{ {
hBox.setSpacing(3); hBox.setSpacing(3);
hBox.setAlignment(Pos.CENTER); hBox.setAlignment(Pos.CENTER);
setGraphic(hBox); setGraphic(hBox);
} }
@Override @Override
public void updateItem(final OrderBookListItem orderBookListItem, boolean empty) public void updateItem(final OrderBookListItem orderBookListItem, boolean empty)
{ {
super.updateItem(orderBookListItem, empty); super.updateItem(orderBookListItem, empty);
hBox.getChildren().clear(); hBox.getChildren().clear();
if (orderBookListItem != null) if (orderBookListItem != null)
{ {
Locale countryLocale = orderBookListItem.getOffer().getBankAccountCountryLocale(); Locale countryLocale = orderBookListItem.getOffer().getBankAccountCountryLocale();
try try
{ {
hBox.getChildren().add(Icons.getIconImageView("/images/countries/" + countryLocale.getCountry().toLowerCase() + ".png")); hBox.getChildren().add(Icons.getIconImageView("/images/countries/" + countryLocale.getCountry().toLowerCase() + ".png"));
} catch (Exception e) } catch (Exception e)
{ {
log.warn("Country icon not found: " + "/images/countries/" + countryLocale.getCountry().toLowerCase() + ".png country name: " + countryLocale.getDisplayCountry()); log.warn("Country icon not found: " + "/images/countries/" + countryLocale.getCountry().toLowerCase() + ".png country name: " + countryLocale.getDisplayCountry());
} }
Tooltip.install(this, new Tooltip(countryLocale.getDisplayCountry())); Tooltip.install(this, new Tooltip(countryLocale.getDisplayCountry()));
} }
} }
}; };
} }
}); });
} }
private void setBankAccountTypeColumnCellFactory() private void setBankAccountTypeColumnCellFactory()
{ {
bankAccountTypeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper(offer.getValue())); bankAccountTypeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper(offer.getValue()));
bankAccountTypeColumn.setCellFactory(new Callback<TableColumn<String, OrderBookListItem>, TableCell<String, OrderBookListItem>>() bankAccountTypeColumn.setCellFactory(new Callback<TableColumn<String, OrderBookListItem>, TableCell<String, OrderBookListItem>>()
{ {
@Override @Override
public TableCell<String, OrderBookListItem> call(TableColumn<String, OrderBookListItem> directionColumn) public TableCell<String, OrderBookListItem> call(TableColumn<String, OrderBookListItem> directionColumn)
{ {
return new TableCell<String, OrderBookListItem>() return new TableCell<String, OrderBookListItem>()
{ {
@Override @Override
public void updateItem(final OrderBookListItem orderBookListItem, boolean empty) public void updateItem(final OrderBookListItem orderBookListItem, boolean empty)
{ {
super.updateItem(orderBookListItem, empty); super.updateItem(orderBookListItem, empty);
if (orderBookListItem != null) if (orderBookListItem != null)
{ {
BankAccountType.BankAccountTypeEnum bankAccountTypeEnum = orderBookListItem.getOffer().getBankAccountTypeEnum(); BankAccountType.BankAccountTypeEnum bankAccountTypeEnum = orderBookListItem.getOffer().getBankAccountTypeEnum();
setText(Localisation.get(bankAccountTypeEnum.toString())); setText(Localisation.get(bankAccountTypeEnum.toString()));
} }
else else
{ {
setText(""); setText("");
} }
} }
}; };
} }
}); });
} }
private double textInputToNumber(String oldValue, String newValue) private double textInputToNumber(String oldValue, String newValue)
{ {
//TODO use regex.... or custom textfield component //TODO use regex.... or custom textfield component
double d = 0.0; double d = 0.0;
if (!newValue.equals("")) if (!newValue.equals(""))
{ {
try try
{ {
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault()); DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault());
d = decimalFormat.parse(newValue).doubleValue(); d = decimalFormat.parse(newValue).doubleValue();
} catch (ParseException e) } catch (ParseException e)
{ {
amount.setText(oldValue); amount.setText(oldValue);
d = Converter.stringToDouble(oldValue); d = Converter.stringToDouble(oldValue);
} }
} }
return d; return d;
} }
private void updateVolume() private void updateVolume()
{ {
double a = textInputToNumber(amount.getText(), amount.getText()); double a = textInputToNumber(amount.getText(), amount.getText());
double p = textInputToNumber(price.getText(), price.getText()); double p = textInputToNumber(price.getText(), price.getText());
volume.setText(Formatter.formatPrice(a * p)); volume.setText(Formatter.formatPrice(a * p));
} }
// the scrollbar width is not handled correctly from the layout initially // the scrollbar width is not handled correctly from the layout initially
/* private void forceTableLayoutUpdate() /* private void forceTableLayoutUpdate()
{ {
final List<OrderBookListItem> items = orderBookTable.getItems(); final List<OrderBookListItem> items = orderBookTable.getItems();
if (items == null || items.size() == 0) return; if (items == null || items.size() == 0) return;
final OrderBookListItem item = orderBookTable.getItems().get(0); final OrderBookListItem item = orderBookTable.getItems().get(0);
items.remove(0); items.remove(0);
Platform.runLater(new Runnable() Platform.runLater(new Runnable()
{ {
@Override @Override
public void run() public void run()
{ {
items.add(0, item); items.add(0, item);
} }
}); });
} */ } */
} }

View file

@ -1,4 +1,4 @@
package io.bitsquare.gui.trade.orderbook; package io.bitsquare.gui.market.orderbook;
import io.bitsquare.gui.util.Formatter; import io.bitsquare.gui.util.Formatter;
import io.bitsquare.trade.Offer; import io.bitsquare.trade.Offer;

View file

@ -6,7 +6,7 @@
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane fx:id="holderPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" <AnchorPane fx:id="holderPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns:fx="http://javafx.com/fxml/1" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="io.bitsquare.gui.trade.orderbook.OrderBookController"> fx:controller="io.bitsquare.gui.market.orderbook.OrderBookController">
<children> <children>
<HBox fx:id="topHBox" prefHeight="22.0" AnchorPane.topAnchor="10.0" AnchorPane.leftAnchor="10.0" <HBox fx:id="topHBox" prefHeight="22.0" AnchorPane.topAnchor="10.0" AnchorPane.leftAnchor="10.0"

View file

@ -1,460 +1,415 @@
package io.bitsquare.gui.trade.tradeprocess; package io.bitsquare.gui.market.trade;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.btc.BlockChainFacade; import io.bitsquare.btc.BlockChainFacade;
import io.bitsquare.btc.BtcFormatter; import io.bitsquare.btc.BtcFormatter;
import io.bitsquare.btc.Fees; import io.bitsquare.btc.Fees;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.ChildController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.components.processbar.ProcessStepBar; import io.bitsquare.gui.components.processbar.ProcessStepBar;
import io.bitsquare.gui.components.processbar.ProcessStepItem; import io.bitsquare.gui.components.processbar.ProcessStepItem;
import io.bitsquare.gui.util.Converter; import io.bitsquare.gui.util.Converter;
import io.bitsquare.gui.util.FormBuilder; import io.bitsquare.gui.util.FormBuilder;
import io.bitsquare.gui.util.Formatter; import io.bitsquare.gui.util.Formatter;
import io.bitsquare.settings.Settings; import io.bitsquare.gui.util.Popups;
import io.bitsquare.storage.Storage; import io.bitsquare.trade.*;
import io.bitsquare.trade.*; import io.bitsquare.util.Utils;
import io.bitsquare.user.User; import javafx.animation.AnimationTimer;
import io.bitsquare.util.Utils; import javafx.fxml.FXML;
import javafx.animation.AnimationTimer; import javafx.fxml.Initializable;
import javafx.fxml.FXML; import javafx.scene.Node;
import javafx.fxml.Initializable; import javafx.scene.control.*;
import javafx.scene.Node; import javafx.scene.layout.AnchorPane;
import javafx.scene.control.*; import javafx.scene.layout.GridPane;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane;
import javafx.scene.layout.GridPane; import org.controlsfx.dialog.Dialogs;
import javafx.scene.layout.Pane; import org.slf4j.Logger;
import javafx.scene.layout.VBox; import org.slf4j.LoggerFactory;
import org.controlsfx.dialog.Dialogs;
import org.slf4j.Logger; import java.math.BigInteger;
import org.slf4j.LoggerFactory; import java.net.URL;
import java.util.ArrayList;
import java.math.BigInteger; import java.util.List;
import java.net.URL; import java.util.ResourceBundle;
import java.util.ArrayList;
import java.util.List; public class TradeController implements Initializable, ChildController, WalletFacade.WalletListener
import java.util.ResourceBundle; {
private static final Logger log = LoggerFactory.getLogger(TradeController.class);
public class TradeProcessController implements Initializable, ChildController, WalletFacade.WalletListener private static final int SIM_DELAY = 1000;
{
private static final Logger log = LoggerFactory.getLogger(TradeProcessController.class); private Trading trading;
private static final int SIM_DELAY = 1000; private WalletFacade walletFacade;
private BlockChainFacade blockChainFacade;
private Trading trading; private Offer offer;
private User user; private Trade trade;
private WalletFacade walletFacade; private Contract contract;
private BlockChainFacade blockChainFacade; private double requestedAmount;
private Settings settings; private boolean offererIsOnline;
private Storage storage; private int row;
private Offer offer;
private Trade trade; private List<ProcessStepItem> processStepItems = new ArrayList();
private Contract contract;
private double requestedAmount; private NavigationController navigationController;
private boolean offererIsOnline; private TextField amountTextField, totalToPayLabel, totalLabel;
private Label statusTextField, infoLabel;
private List<ProcessStepItem> processStepItems = new ArrayList(); private Button nextButton;
private ProgressBar progressBar;
private NavigationController navigationController;
private TextField amountTextField, totalToPayLabel, totalLabel; @FXML
private Label statusTextField; private AnchorPane rootContainer;
private Button nextButton; @FXML
private ProgressBar progressBar; private ProcessStepBar<String> processStepBar;
@FXML
@FXML private GridPane gridPane;
private AnchorPane rootContainer;
@FXML
private ProcessStepBar<String> processStepBar; ///////////////////////////////////////////////////////////////////////////////////////////
@FXML // Constructor
private GridPane formGridPane; ///////////////////////////////////////////////////////////////////////////////////////////
@FXML
private VBox vBox; @Inject
private Label infoLabel; public TradeController(Trading trading, WalletFacade walletFacade, BlockChainFacade blockChainFacade)
private int gridRow; {
this.trading = trading;
this.walletFacade = walletFacade;
/////////////////////////////////////////////////////////////////////////////////////////// this.blockChainFacade = blockChainFacade;
// Constructor(s) }
///////////////////////////////////////////////////////////////////////////////////////////
@Inject ///////////////////////////////////////////////////////////////////////////////////////////
public TradeProcessController(Trading trading, User user, WalletFacade walletFacade, BlockChainFacade blockChainFacade, Settings settings, Storage storage) // Public methods
{ ///////////////////////////////////////////////////////////////////////////////////////////
this.trading = trading;
this.user = user; public void initWithData(Offer offer, double requestedAmount)
this.walletFacade = walletFacade; {
this.blockChainFacade = blockChainFacade; this.offer = offer;
this.settings = settings; this.requestedAmount = requestedAmount > 0 ? requestedAmount : offer.getAmount();
this.storage = storage;
} trade = trading.createNewTrade(offer);
trade.setTradeAmount(requestedAmount);
contract = trading.createNewContract(trade);
///////////////////////////////////////////////////////////////////////////////////////////
// Public methods processStepItems.add(new ProcessStepItem(takerIsSelling() ? "Sell BTC" : "Buy BTC"));
/////////////////////////////////////////////////////////////////////////////////////////// processStepItems.add(new ProcessStepItem("Bank transfer"));
processStepItems.add(new ProcessStepItem("Completed"));
public void initWithData(Offer offer, double requestedAmount) processStepBar.setProcessStepItems(processStepItems);
{
this.offer = offer; buildTakeOfferScreen();
this.requestedAmount = requestedAmount > 0 ? requestedAmount : offer.getAmount(); }
trade = trading.createNewTrade(offer);
trade.setTradeAmount(requestedAmount); ///////////////////////////////////////////////////////////////////////////////////////////
contract = trading.createNewContract(trade); // Interface implementation: Initializable
///////////////////////////////////////////////////////////////////////////////////////////
processStepItems.add(new ProcessStepItem(takerIsSelling() ? "Sell BTC" : "Buy BTC"));
processStepItems.add(new ProcessStepItem("Bank transfer")); @Override
processStepItems.add(new ProcessStepItem("Completed")); public void initialize(URL url, ResourceBundle rb)
processStepBar.setProcessStepItems(processStepItems); {
walletFacade.addRegistrationWalletListener(this);
buildTakeOfferScreen(); }
}
///////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////// // Interface implementation: ChildController
// Interface implementation: Initializable ///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
@Override
@Override public void setNavigationController(NavigationController navigationController)
public void initialize(URL url, ResourceBundle rb) {
{ this.navigationController = navigationController;
walletFacade.addRegistrationWalletListener(this); }
}
///////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////// // Interface implementation: WalletFacade.WalletListener
// Interface implementation: ChildController ///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
@Override
@Override public void onConfidenceChanged(int numBroadcastPeers, int depthInBlocks)
public void setNavigationController(NavigationController navigationController) {
{ log.info("onConfidenceChanged " + numBroadcastPeers + " / " + depthInBlocks);
this.navigationController = navigationController; }
}
@Override
public void onCoinsReceived(BigInteger newBalance)
/////////////////////////////////////////////////////////////////////////////////////////// {
// Interface implementation: WalletFacade.WalletListener log.info("onCoinsReceived " + newBalance);
/////////////////////////////////////////////////////////////////////////////////////////// }
@Override
public void onConfidenceChanged(int numBroadcastPeers, int depthInBlocks) ///////////////////////////////////////////////////////////////////////////////////////////
{ // Private methods
log.info("onConfidenceChanged " + numBroadcastPeers + " / " + depthInBlocks); ///////////////////////////////////////////////////////////////////////////////////////////
}
// trade process
@Override private void buildTakeOfferScreen()
public void onCoinsReceived(BigInteger newBalance) {
{ row = -1;
log.info("onCoinsReceived " + newBalance);
} FormBuilder.addHeaderLabel(gridPane, "Take offer:", ++row);
amountTextField = FormBuilder.addTextField(gridPane, "Amount BTC:", Formatter.formatAmount(requestedAmount), ++row, true, true);
amountTextField.textProperty().addListener(e -> {
/////////////////////////////////////////////////////////////////////////////////////////// applyVolume();
// Private methods totalToPayLabel.setText(getTotalToPay());
///////////////////////////////////////////////////////////////////////////////////////////
});
Label amountRangeLabel = new Label("(" + Formatter.formatAmount(offer.getMinAmount()) + " - " + Formatter.formatAmount(offer.getAmount()) + ")");
/////////////////////////////////////////////////////////////////////////////////////////// gridPane.add(amountRangeLabel, 2, row);
// trade process
/////////////////////////////////////////////////////////////////////////////////////////// FormBuilder.addTextField(gridPane, "Price:", Formatter.formatPriceWithCurrencyPair(offer.getPrice(), offer.getCurrency()), ++row);
totalLabel = FormBuilder.addTextField(gridPane, "Total:", Formatter.formatVolume(getVolume(), offer.getCurrency()), ++row);
FormBuilder.addTextField(gridPane, "Offer fee:", Formatter.formatSatoshis(Fees.OFFER_TAKER_FEE, true), ++row);
private void buildTakeOfferScreen() totalToPayLabel = FormBuilder.addTextField(gridPane, "Total to pay:", getTotalToPay(), ++row);
{
nextButton = FormBuilder.addButton(gridPane, "Take offer and pay", ++row);
int gridRow = -1; nextButton.setDefaultButton(true);
nextButton.setOnAction(e -> initTrade());
FormBuilder.addHeaderLabel(formGridPane, "Take offer:", ++gridRow);
amountTextField = FormBuilder.addTextField(formGridPane, "Amount BTC:", Formatter.formatAmount(requestedAmount), ++gridRow, true, true); // details
amountTextField.textProperty().addListener(e -> { FormBuilder.addVSpacer(gridPane, ++row);
setVolume(); FormBuilder.addHeaderLabel(gridPane, "Offerer details:", ++row);
totalToPayLabel.setText(getTotalToPay()); TextField isOnlineTextField = FormBuilder.addTextField(gridPane, "Online status:", "Checking offerers online status...", ++row);
ProgressIndicator isOnlineChecker = new ProgressIndicator();
}); isOnlineChecker.setPrefSize(20, 20);
Label amountRangeLabel = new Label("(" + Formatter.formatAmount(offer.getMinAmount()) + " - " + Formatter.formatAmount(offer.getAmount()) + ")"); isOnlineChecker.setLayoutY(3);
formGridPane.add(amountRangeLabel, 2, gridRow); Pane isOnlineCheckerHolder = new Pane();
isOnlineCheckerHolder.getChildren().addAll(isOnlineChecker);
FormBuilder.addTextField(formGridPane, "Price:", Formatter.formatPriceWithCurrencyPair(offer.getPrice(), offer.getCurrency()), ++gridRow); gridPane.add(isOnlineCheckerHolder, 2, row);
totalLabel = FormBuilder.addTextField(formGridPane, "Total:", Formatter.formatVolume(getVolume(), offer.getCurrency()), ++gridRow); checkIfOffererIsOnline(isOnlineCheckerHolder, isOnlineTextField);
FormBuilder.addTextField(formGridPane, "Offer fee:", Formatter.formatSatoshis(Fees.OFFER_TAKER_FEE, true), ++gridRow);
totalToPayLabel = FormBuilder.addTextField(formGridPane, "Total to pay:", getTotalToPay(), ++gridRow); FormBuilder.addTextField(gridPane, "Bank account type:", offer.getBankAccountTypeEnum().toString(), ++row);
FormBuilder.addTextField(gridPane, "Bank account country:", offer.getBankAccountCountryLocale().getDisplayCountry(), ++row);
nextButton = FormBuilder.addButton(formGridPane, "Take offer and pay", ++gridRow); FormBuilder.addTextField(gridPane, "Arbitrator:", offer.getArbitrator().getName(), ++row);
nextButton.setDefaultButton(true); Label arbitratorLink = new Label(offer.getArbitrator().getUrl());
nextButton.setOnAction(e -> { arbitratorLink.setId("label-url");
initTrade(); gridPane.add(arbitratorLink, 2, row);
}); arbitratorLink.setOnMouseClicked(e -> {
try
// details {
FormBuilder.addVSpacer(formGridPane, ++gridRow); Utils.openURL(offer.getArbitrator().getUrl());
FormBuilder.addHeaderLabel(formGridPane, "Offerer details:", ++gridRow); } catch (Exception e1)
TextField isOnlineTextField = FormBuilder.addTextField(formGridPane, "Online status:", "Checking offerers online status...", ++gridRow); {
ProgressIndicator isOnlineChecker = new ProgressIndicator(); log.warn(e1.toString());
isOnlineChecker.setPrefSize(20, 20); }
isOnlineChecker.setLayoutY(3); });
Pane isOnlineCheckerHolder = new Pane();
isOnlineCheckerHolder.getChildren().addAll(isOnlineChecker); FormBuilder.addVSpacer(gridPane, ++row);
formGridPane.add(isOnlineCheckerHolder, 2, gridRow); FormBuilder.addHeaderLabel(gridPane, "More details:", ++row);
checkIfOffererIsOnline(isOnlineCheckerHolder, isOnlineTextField); FormBuilder.addTextField(gridPane, "Offer ID:", offer.getUid().toString(), ++row);
FormBuilder.addTextField(gridPane, "Account ID:", offer.getAccountID(), ++row);
FormBuilder.addTextField(formGridPane, "Bank account type:", offer.getBankAccountTypeEnum().toString(), ++gridRow); FormBuilder.addTextField(gridPane, "Messaging ID:", offer.getMessageID(), ++row);
FormBuilder.addTextField(formGridPane, "Bank account country:", offer.getBankAccountCountryLocale().getDisplayCountry(), ++gridRow); FormBuilder.addTextField(gridPane, "Supported languages:", Formatter.languageLocalesToString(offer.getAcceptedLanguageLocales()), ++row);
FormBuilder.addTextField(formGridPane, "Arbitrator:", offer.getArbitrator().getName(), ++gridRow); FormBuilder.addTextField(gridPane, "Supported countries:", Formatter.countryLocalesToString(offer.getAcceptedCountryLocales()), ++row);
Label arbitratorLink = new Label(offer.getArbitrator().getUrl()); }
arbitratorLink.setId("label-url");
formGridPane.add(arbitratorLink, 2, gridRow); private void initTrade()
arbitratorLink.setOnMouseClicked(e -> { {
try if (!tradeAmountValid())
{ {
Utils.openURL(offer.getArbitrator().getUrl()); Popups.openErrorPopup("Your input is not valid", "The requested amount you entered is outside of the range of the offered amount.");
} catch (Exception e1) return;
{ }
log.warn(e1.toString());
} if (!blockChainFacade.verifyEmbeddedData(offer.getAccountID()))
}); {
Popups.openErrorPopup("Offerers account ID not valid", "Offerers registration tx is not found in blockchain or does not match the requirements.");
FormBuilder.addVSpacer(formGridPane, ++gridRow); return;
FormBuilder.addHeaderLabel(formGridPane, "More details:", ++gridRow); }
FormBuilder.addTextField(formGridPane, "Offer ID:", offer.getUid().toString(), ++gridRow);
FormBuilder.addTextField(formGridPane, "Account ID:", offer.getAccountID(), ++gridRow); if (blockChainFacade.isAccountIDBlacklisted(offer.getAccountID()))
FormBuilder.addTextField(formGridPane, "Messaging ID:", offer.getMessageID(), ++gridRow); {
FormBuilder.addTextField(formGridPane, "Supported languages:", Formatter.languageLocalesToString(offer.getAcceptedLanguageLocales()), ++gridRow); Popups.openErrorPopup("Offerers account ID is blacklisted", "Offerers account ID is blacklisted.");
FormBuilder.addTextField(formGridPane, "Supported countries:", Formatter.countryLocalesToString(offer.getAcceptedCountryLocales()), ++gridRow); return;
}
}
amountTextField.setEditable(false);
private boolean tradeAmountValid()
{ gridPane.getChildren().clear();
double tradeAmount = Converter.stringToDouble(amountTextField.getText());
return tradeAmount <= offer.getAmount() && tradeAmount >= offer.getMinAmount(); row = -1;
} FormBuilder.addHeaderLabel(gridPane, "Trade request inited", ++row, 0);
statusTextField = FormBuilder.addLabel(gridPane, "Current activity:", "Request confirmation from offerer to take that offer.", ++row);
private void initTrade() GridPane.setColumnSpan(statusTextField, 2);
{ FormBuilder.addLabel(gridPane, "Progress:", "", ++row);
if (tradeAmountValid()) progressBar = new ProgressBar();
{ progressBar.setProgress(0.0);
if (blockChainFacade.verifyEmbeddedData(offer.getAccountID())) progressBar.setPrefWidth(300);
{ GridPane.setFillWidth(progressBar, true);
if (!blockChainFacade.isAccountIDBlacklisted(offer.getAccountID())) gridPane.add(progressBar, 1, row);
{
amountTextField.setEditable(false); FormBuilder.addLabel(gridPane, "Status:", "", ++row);
ProgressIndicator progressIndicator = new ProgressIndicator();
formGridPane.getChildren().clear(); progressIndicator.setPrefSize(20, 20);
progressIndicator.setLayoutY(2);
int gridRow = -1; Pane progressIndicatorHolder = new Pane();
FormBuilder.addHeaderLabel(formGridPane, "Trade request inited", ++gridRow, 0); progressIndicatorHolder.getChildren().addAll(progressIndicator);
gridPane.add(progressIndicatorHolder, 1, row);
statusTextField = FormBuilder.addLabel(formGridPane, "Current activity:", "Request confirmation from offerer to take that offer.", ++gridRow);
GridPane.setColumnSpan(statusTextField, 2); trade.setTradeAmount(Converter.stringToDouble(amountTextField.getText()));
FormBuilder.addLabel(formGridPane, "Progress:", "", ++gridRow); trading.sendTakeOfferRequest(trade);
progressBar = new ProgressBar();
progressBar.setProgress(0.0); Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> {
progressBar.setPrefWidth(300); onTakeOfferRequestConfirmed();
GridPane.setFillWidth(progressBar, true); progressBar.setProgress(1.0 / 3.0);
formGridPane.add(progressBar, 1, gridRow); return null;
});
FormBuilder.addLabel(formGridPane, "Status:", "", ++gridRow); }
ProgressIndicator progressIndicator = new ProgressIndicator();
progressIndicator.setPrefSize(20, 20); private void onTakeOfferRequestConfirmed()
progressIndicator.setLayoutY(2); {
Pane progressIndicatorHolder = new Pane(); trading.payOfferFee(trade);
progressIndicatorHolder.getChildren().addAll(progressIndicator);
formGridPane.add(progressIndicatorHolder, 1, gridRow); statusTextField.setText("Offer fee payed. Send offerer payment transaction ID for confirmation.");
Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> {
trade.setTradeAmount(Converter.stringToDouble(amountTextField.getText())); onOfferFeePaymentConfirmed();
trading.sendTakeOfferRequest(trade); progressBar.setProgress(2.0 / 3.0);
return null;
Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> { });
onTakeOfferRequestConfirmed(); }
progressBar.setProgress(1.0 / 3.0);
return null; private void onOfferFeePaymentConfirmed()
}); {
} trading.requestOffererDetailData();
else statusTextField.setText("Request bank account details from offerer.");
{ Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> {
Dialogs.create() onUserDetailsReceived();
.title("Offerers account ID is blacklisted") progressBar.setProgress(1.0);
.message("Offerers account ID is blacklisted.") return null;
.nativeTitleBar() });
.lightweight() }
.showError();
} private void onUserDetailsReceived()
} {
else if (!walletFacade.verifyAccountRegistration(offer.getAccountID(), null, null, null, null))
{ {
Dialogs.create() Dialogs.create()
.title("Offerers account ID not valid") .title("Offerers bank account is blacklisted")
.message("Offerers registration tx is not found in blockchain or does not match the requirements.") .message("Offerers bank account is blacklisted.")
.nativeTitleBar() .nativeTitleBar()
.lightweight() .lightweight()
.showError(); .showError();
} }
}
else trading.signContract(contract);
{ trading.payToDepositTx(trade);
Dialogs.create()
.title("Your input is not valid") buildWaitBankTransfer();
.message("The requested amount you entered is outside of the range of the offered amount.") }
.nativeTitleBar()
.lightweight() private void buildWaitBankTransfer()
.showError(); {
} processStepBar.next();
}
gridPane.getChildren().clear();
private void onTakeOfferRequestConfirmed()
{ row = -1;
trading.payOfferFee(trade); FormBuilder.addHeaderLabel(gridPane, "Bank transfer", ++row, 0);
infoLabel = FormBuilder.addLabel(gridPane, "Status:", "Wait for Bank transfer.", ++row);
statusTextField.setText("Offer fee payed. Send offerer payment transaction ID for confirmation.");
Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> { Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> {
onOfferFeePaymentConfirmed(); onBankTransferInited();
progressBar.setProgress(2.0 / 3.0); return null;
return null; });
}); }
}
private void onBankTransferInited()
private void onOfferFeePaymentConfirmed() {
{ row = 1;
trading.requestOffererDetailData(); infoLabel.setText("Bank transfer has been inited.");
statusTextField.setText("Request bank account details from offerer."); Label label = FormBuilder.addLabel(gridPane, "", "Check your bank account and continue when you have received the money.", ++row);
Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> { GridPane.setColumnSpan(label, 2);
onUserDetailsReceived();
progressBar.setProgress(1.0); gridPane.add(nextButton, 1, ++row);
return null; nextButton.setText("I have received the bank transfer");
}); nextButton.setOnAction(e -> releaseBTC());
} }
private void onUserDetailsReceived() private void releaseBTC()
{ {
if (!walletFacade.verifyAccountRegistration(offer.getAccountID(), null, null, null, null)) processStepBar.next();
{ trading.releaseBTC(trade);
Dialogs.create()
.title("Offerers bank account is blacklisted") nextButton.setText("Close");
.message("Offerers bank account is blacklisted.") nextButton.setOnAction(e -> close());
.nativeTitleBar()
.lightweight() gridPane.getChildren().clear();
.showError(); row = -1;
} FormBuilder.addHeaderLabel(gridPane, "Trade successfully completed", ++row);
FormBuilder.addTextField(gridPane, "You have payed:", getTotalToPay(), ++row);
trading.signContract(contract); FormBuilder.addTextField(gridPane, "You have received:", getTotalToReceive(), ++row);
trading.payToDepositTx(trade); gridPane.add(nextButton, 1, ++row);
}
buildWaitBankTransfer();
} private void close()
{
private void buildWaitBankTransfer() walletFacade.removeRegistrationWalletListener(this);
{
processStepBar.next(); TabPane tabPane = ((TabPane) (rootContainer.getParent().getParent()));
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
formGridPane.getChildren().clear();
navigationController.navigateToView(NavigationController.ORDER_BOOK, "Orderbook");
gridRow = -1; }
FormBuilder.addHeaderLabel(formGridPane, "Bank transfer", ++gridRow, 0);
infoLabel = FormBuilder.addLabel(formGridPane, "Status:", "Wait for Bank transfer.", ++gridRow); // Other Private methods
private boolean tradeAmountValid()
Utils.setTimeout(SIM_DELAY, (AnimationTimer animationTimer) -> { {
onBankTransferInited(); double tradeAmount = Converter.stringToDouble(amountTextField.getText());
return null; return tradeAmount <= offer.getAmount() && tradeAmount >= offer.getMinAmount();
}); }
}
private boolean takerIsSelling()
private void onBankTransferInited() {
{ return offer.getDirection() == Direction.BUY;
int gridRow = 1; }
infoLabel.setText("Bank transfer has been inited.");
Label label = FormBuilder.addLabel(formGridPane, "", "Check your bank account and continue when you have received the money.", ++gridRow);
GridPane.setColumnSpan(label, 2); private void checkIfOffererIsOnline(Node isOnlineChecker, TextField isOnlineTextField)
{
formGridPane.add(nextButton, 1, ++gridRow); // mock
nextButton.setText("I have received the bank transfer"); Utils.setTimeout(3000, (AnimationTimer animationTimer) -> {
nextButton.setOnAction(e -> releaseBTC()); offererIsOnline = Math.random() > 0.3 ? true : false;
} isOnlineTextField.setText(offererIsOnline ? "Online" : "Offline");
gridPane.getChildren().remove(isOnlineChecker);
private void releaseBTC() return null;
{ });
processStepBar.next(); }
trading.releaseBTC(trade);
private void applyVolume()
nextButton.setText("Close"); {
nextButton.setOnAction(e -> close()); totalLabel.setText(Formatter.formatVolume(getVolume(), offer.getCurrency()));
}
formGridPane.getChildren().clear();
gridRow = -1; private double getVolume()
FormBuilder.addHeaderLabel(formGridPane, "Trade successfully completed", ++gridRow); {
FormBuilder.addTextField(formGridPane, "You have payed:", getTotalToPay(), ++gridRow); return offer.getPrice() * Converter.stringToDouble(amountTextField.getText());
FormBuilder.addTextField(formGridPane, "You have received:", getTotalToReceive(), ++gridRow); }
formGridPane.add(nextButton, 1, ++gridRow);
} private String getTotalToPay()
{
String result = "";
private void close() if (takerIsSelling())
{ {
walletFacade.removeRegistrationWalletListener(this); double btcValue = Converter.stringToDouble(amountTextField.getText()) + BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE)/* +
offer.getConstraints().getCollateral() * Converter.stringToDouble(amountTextField.getText())*/;
TabPane tabPane = ((TabPane) (rootContainer.getParent().getParent())); result = Formatter.formatAmount(btcValue, true, true);
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem()); }
else
navigationController.navigateToView(NavigationController.TRADE__ORDER_BOOK, "Orderbook"); {
} double btcValue = BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE) /*+ offer.getConstraints().getCollateral() * Converter.stringToDouble(amountTextField.getText())*/;
result = Formatter.formatAmount(btcValue, true, true) + "\n" + Formatter.formatVolume(getVolume(), offer.getCurrency());
}
/////////////////////////////////////////////////////////////////////////////////////////// return result;
// Private methods }
///////////////////////////////////////////////////////////////////////////////////////////
private String getTotalToReceive()
private boolean takerIsSelling() {
{ if (takerIsSelling())
return offer.getDirection() == Direction.BUY; return Formatter.formatVolume(getVolume(), offer.getCurrency());
} else
return Formatter.formatAmount(offer.getAmount(), true, true);
private String getTotalToReceive() }
{
if (takerIsSelling()) }
return Formatter.formatVolume(getVolume(), offer.getCurrency());
else
return Formatter.formatAmount(offer.getAmount(), true, true);
}
private void checkIfOffererIsOnline(Node isOnlineChecker, TextField isOnlineTextField)
{
// mock
Utils.setTimeout(3000, (AnimationTimer animationTimer) -> {
offererIsOnline = Math.random() > 0.3 ? true : false;
isOnlineTextField.setText(offererIsOnline ? "Online" : "Offline");
formGridPane.getChildren().remove(isOnlineChecker);
return null;
});
}
private void setVolume()
{
totalLabel.setText(Formatter.formatVolume(getVolume(), offer.getCurrency()));
}
private double getVolume()
{
return offer.getPrice() * Converter.stringToDouble(amountTextField.getText());
}
private String getTotalToPay()
{
String result = "";
if (takerIsSelling())
{
double btcValue = Converter.stringToDouble(amountTextField.getText()) + BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE)/* +
offer.getConstraints().getCollateral() * Converter.stringToDouble(amountTextField.getText())*/;
result = Formatter.formatAmount(btcValue, true, true);
}
else
{
double btcValue = BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE) /*+ offer.getConstraints().getCollateral() * Converter.stringToDouble(amountTextField.getText())*/;
result = Formatter.formatAmount(btcValue, true, true) + "\n" + Formatter.formatVolume(getVolume(), offer.getCurrency());
}
return result;
}
}

View file

@ -5,7 +5,7 @@
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.ScrollPane?> <?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane fx:id="rootContainer" fx:controller="io.bitsquare.gui.trade.tradeprocess.TradeProcessController" <AnchorPane fx:id="rootContainer" fx:controller="io.bitsquare.gui.market.trade.TradeController"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
<ScrollPane fitToWidth="true" AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0" <ScrollPane fitToWidth="true" AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0"
AnchorPane.bottomAnchor="0"> AnchorPane.bottomAnchor="0">
@ -17,7 +17,7 @@
</padding> </padding>
<ProcessStepBar fx:id="processStepBar"/> <ProcessStepBar fx:id="processStepBar"/>
<VSpacer prefHeight="5"/> <VSpacer prefHeight="5"/>
<GridPane fx:id="formGridPane" vgap="5" hgap="5"> <GridPane fx:id="gridPane" vgap="5" hgap="5">
<padding> <padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/> <Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/>
</padding> </padding>

View file

@ -65,7 +65,7 @@ public class SetupController implements Initializable, ChildController, WalletFa
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor(s) // Constructor
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject

View file

@ -11,8 +11,6 @@ import java.util.Locale;
public class Formatter public class Formatter
{ {
public static String formatPrice(double price) public static String formatPrice(double price)
{ {
return formatDouble(price); return formatDouble(price);

View file

@ -0,0 +1,16 @@
package io.bitsquare.gui.util;
import org.controlsfx.dialog.Dialogs;
public class Popups
{
public static void openErrorPopup(String title, String message)
{
Dialogs.create()
.title(title)
.message(message)
.nativeTitleBar()
.lightweight()
.showError();
}
}

View file

@ -16,11 +16,21 @@ public class Settings implements Serializable
private List<Locale> acceptedCountryLocales = new ArrayList<>(); private List<Locale> acceptedCountryLocales = new ArrayList<>();
private List<Arbitrator> arbitrators = new ArrayList<>(); private List<Arbitrator> arbitrators = new ArrayList<>();
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject
public Settings() public Settings()
{ {
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Public API
///////////////////////////////////////////////////////////////////////////////////////////
public void updateFromStorage(Settings savedSettings) public void updateFromStorage(Settings savedSettings)
{ {
if (savedSettings != null) if (savedSettings != null)
@ -49,7 +59,11 @@ public class Settings implements Serializable
arbitrators.add(arbitrator); arbitrators.add(arbitrator);
} }
//getters
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////////////////
public List<Arbitrator> getArbitrators() public List<Arbitrator> getArbitrators()
{ {
return arbitrators; return arbitrators;
@ -60,7 +74,6 @@ public class Settings implements Serializable
return acceptedLanguageLocales; return acceptedLanguageLocales;
} }
public List<Locale> getAcceptedCountryLocales() public List<Locale> getAcceptedCountryLocales()
{ {
return acceptedCountryLocales; return acceptedCountryLocales;

View file

@ -1,6 +1,5 @@
package io.bitsquare.storage; package io.bitsquare.storage;
import io.bitsquare.user.User;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -13,56 +12,62 @@ import java.util.Map;
*/ */
public class Storage public class Storage
{ {
private static final Logger log = LoggerFactory.getLogger(Storage.class); private static final Logger log = LoggerFactory.getLogger(Storage.class);
//TODO save in users preferences location
private final String preferencesFileName = "preferences.ser"; private final String preferencesFileName = "preferences.ser";
private final String storageFile; private final String storageFile;
private DataVO dataVO; private Map<String, Object> dict;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
public Storage() public Storage()
{ {
storageFile = Storage.class.getProtectionDomain().getCodeSource().getLocation().getFile() + "/" + preferencesFileName; storageFile = Storage.class.getProtectionDomain().getCodeSource().getLocation().getFile() + "/" + preferencesFileName;
dataVO = readDataVO(); dict = readDataVO();
if (dataVO == null) if (dict == null)
{ {
dataVO = new DataVO(); dict = new HashMap<>();
dataVO.dict = new HashMap<String, Object>(); writeDataVO(dict);
writeDataVO(dataVO);
} }
} }
public void updateUserFromStorage(User user) ///////////////////////////////////////////////////////////////////////////////////////////
{ // Public API
User savedUser = (User) read(user.getClass().getName()); ///////////////////////////////////////////////////////////////////////////////////////////
if (savedUser != null)
user.updateFromStorage(savedUser);
}
public void write(String key, Object value) public void write(String key, Object value)
{ {
//log.info("Write object with key = " + key + " / value = " + value); //log.info("Write object with key = " + key + " / value = " + value);
dataVO.dict.put(key, value); dict.put(key, value);
writeDataVO(dataVO); writeDataVO(dict);
} }
public Object read(String key) public Object read(String key)
{ {
dataVO = readDataVO(); dict = readDataVO();
Object result = dataVO.dict.get(key); Object result = dict.get(key);
//log.info("Read object with key = " + key + " result = " + result); //log.info("Read object with key = " + key + " result = " + result);
return result; return result;
} }
private void writeDataVO(DataVO dataVO)
///////////////////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////////////////
private void writeDataVO(Map<String, Object> dict)
{ {
try try
{ {
FileOutputStream fileOut = new FileOutputStream(storageFile); FileOutputStream fileOut = new FileOutputStream(storageFile);
ObjectOutputStream out = new ObjectOutputStream(fileOut); ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(dataVO); out.writeObject(dict);
out.close(); out.close();
fileOut.close(); fileOut.close();
} catch (IOException i) } catch (IOException i)
@ -71,9 +76,9 @@ public class Storage
} }
} }
private DataVO readDataVO() private Map<String, Object> readDataVO()
{ {
DataVO dataVO = null; Map<String, Object> dict = null;
File file = new File(storageFile); File file = new File(storageFile);
if (file.exists()) if (file.exists())
{ {
@ -81,7 +86,7 @@ public class Storage
{ {
FileInputStream fileIn = new FileInputStream(file); FileInputStream fileIn = new FileInputStream(file);
ObjectInputStream in = new ObjectInputStream(fileIn); ObjectInputStream in = new ObjectInputStream(fileIn);
dataVO = (DataVO) in.readObject(); dict = (Map<String, Object>) in.readObject();
in.close(); in.close();
fileIn.close(); fileIn.close();
} catch (IOException i) } catch (IOException i)
@ -92,16 +97,6 @@ public class Storage
c.printStackTrace(); c.printStackTrace();
} }
} }
return dataVO; return dict;
} }
} }
class DataVO implements Serializable
{
private static final long serialVersionUID = -1127046445783201376L;
public Map<String, Object> dict;
}

View file

@ -7,27 +7,37 @@ import java.util.UUID;
public class Contract public class Contract
{ {
private User taker; private User taker;
private String offererPubKey;
private Trade trade; private Trade trade;
private String takerPubKey; private String takerPubKey;
private String offererPubKey;
public Contract(User taker, Trade trade, String takerPubKey)
public Contract(Trade trade, String takerPubKey)
{ {
this.taker = taker;
this.trade = trade; this.trade = trade;
this.takerPubKey = takerPubKey; this.takerPubKey = takerPubKey;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////////////////
public void setOffererPubKey(String offererPubKey)
{
this.offererPubKey = offererPubKey;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////////////////
public UUID getUid() public UUID getUid()
{ {
return trade.getUid(); return trade.getUid();
} }
public void setTaker(User taker)
{
this.taker = taker;
}
public User getTaker() public User getTaker()
{ {
return taker; return taker;
@ -38,9 +48,9 @@ public class Contract
return takerPubKey; return takerPubKey;
} }
public void setTakerPubKey(String takerPubKey) public Trade getTrade()
{ {
this.takerPubKey = takerPubKey; return trade;
} }
public String getOffererPubKey() public String getOffererPubKey()
@ -48,19 +58,4 @@ public class Contract
return offererPubKey; return offererPubKey;
} }
public void setOffererPubKey(String offererPubKey)
{
this.offererPubKey = offererPubKey;
}
public Trade getTrade()
{
return trade;
}
public void setTrade(Trade trade)
{
this.trade = trade;
}
} }

View file

@ -85,8 +85,7 @@ public class Trading
log.info("create new contract"); log.info("create new contract");
KeyPair address = walletFacade.createNewAddress(); KeyPair address = walletFacade.createNewAddress();
Contract contract = new Contract(trade, address.getPubKey()); Contract contract = new Contract(user, trade, address.getPubKey());
contract.setTaker(user);
contracts.put(trade.getUid().toString(), contract); contracts.put(trade.getUid().toString(), contract);
return contract; return contract;
} }

View file

@ -1,7 +1,7 @@
package io.bitsquare.trade.orderbook; package io.bitsquare.trade.orderbook;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.gui.trade.orderbook.OrderBookListItem; import io.bitsquare.gui.market.orderbook.OrderBookListItem;
import io.bitsquare.gui.util.Converter; import io.bitsquare.gui.util.Converter;
import io.bitsquare.gui.util.Formatter; import io.bitsquare.gui.util.Formatter;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
@ -43,7 +43,7 @@ public class MockOrderBook extends OrderBook
price = 500 - Math.random() * 50; price = 500 - Math.random() * 50;
} }
Offer offer = new Offer(UUID.randomUUID().toString(), Offer offer = new Offer("mjbxLbuVpU1cNXLJbrJZyirYwweoRPVVTj",
UUID.randomUUID().toString(), UUID.randomUUID().toString(),
direction, direction,
price, price,

View file

@ -2,8 +2,7 @@ package io.bitsquare.trade.orderbook;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.bank.BankAccount; import io.bitsquare.bank.BankAccount;
import io.bitsquare.bank.BankAccountType; import io.bitsquare.gui.market.orderbook.OrderBookListItem;
import io.bitsquare.gui.trade.orderbook.OrderBookListItem;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
import io.bitsquare.trade.Direction; import io.bitsquare.trade.Direction;
import io.bitsquare.trade.Offer; import io.bitsquare.trade.Offer;
@ -23,29 +22,30 @@ public class OrderBook
{ {
private static final Logger log = LoggerFactory.getLogger(OrderBook.class); private static final Logger log = LoggerFactory.getLogger(OrderBook.class);
private FilteredList<OrderBookListItem> filteredList;
private SortedList<OrderBookListItem> offerList;
protected ObservableList<OrderBookListItem> allOffers = FXCollections.observableArrayList();
private Settings settings; private Settings settings;
private User user; private User user;
protected ObservableList<OrderBookListItem> allOffers = FXCollections.observableArrayList();
private FilteredList<OrderBookListItem> filteredList = new FilteredList<>(allOffers);
// FilteredList does not support sorting, so we need to wrap it to a SortedList
private SortedList<OrderBookListItem> offerList = new SortedList<>(filteredList);
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject
public OrderBook(Settings settings, User user) public OrderBook(Settings settings, User user)
{ {
this.settings = settings; this.settings = settings;
this.user = user; this.user = user;
filteredList = new FilteredList<>(allOffers);
// FilteredList does not support sorting, so we need to wrap it to a SortedList
offerList = new SortedList<>(filteredList);
} }
public SortedList<OrderBookListItem> getOfferList()
{ ///////////////////////////////////////////////////////////////////////////////////////////
return offerList; // Public API
} ///////////////////////////////////////////////////////////////////////////////////////////
public void updateFilter(OrderBookFilter orderBookFilter) public void updateFilter(OrderBookFilter orderBookFilter)
{ {
@ -130,6 +130,20 @@ public class OrderBook
}); });
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Getter
///////////////////////////////////////////////////////////////////////////////////////////
public SortedList<OrderBookListItem> getOfferList()
{
return offerList;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Private Methods
///////////////////////////////////////////////////////////////////////////////////////////
private boolean countryInList(Locale orderBookFilterLocale, List<Locale> offerConstraintsLocales) private boolean countryInList(Locale orderBookFilterLocale, List<Locale> offerConstraintsLocales)
{ {
for (Locale locale : offerConstraintsLocales) for (Locale locale : offerConstraintsLocales)
@ -152,16 +166,4 @@ public class OrderBook
} }
return false; return false;
} }
private boolean matchBankAccountTypeEnum(BankAccountType.BankAccountTypeEnum orderBookFilterBankAccountType, List<BankAccountType.BankAccountTypeEnum> offerConstraintsBankAccountTypes)
{
for (BankAccountType.BankAccountTypeEnum bankAccountType : offerConstraintsBankAccountTypes)
{
if (bankAccountType.equals(orderBookFilterBankAccountType))
return true;
}
return false;
}
} }

View file

@ -11,7 +11,10 @@ public class OrderBookFilter
private double amount; private double amount;
private Direction direction; private Direction direction;
// setters
///////////////////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////////////////
public void setAmount(double amount) public void setAmount(double amount)
{ {
@ -32,7 +35,10 @@ public class OrderBookFilter
} }
// getters ///////////////////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////////////////
public double getAmount() public double getAmount()
{ {
return amount; return amount;
@ -48,12 +54,16 @@ public class OrderBookFilter
return price; return price;
} }
public SimpleBooleanProperty getChangedProperty() public SimpleBooleanProperty getChangedProperty()
{ {
return changedProperty; return changedProperty;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Private Methods
///////////////////////////////////////////////////////////////////////////////////////////
private void triggerChange() private void triggerChange()
{ {
changedProperty.set(!changedProperty.get()); changedProperty.set(!changedProperty.get());

View file

@ -16,7 +16,7 @@ public class User implements Serializable
private String accountID; private String accountID;
private String messageID; private String messageID;
private boolean online; private boolean isOnline;
private List<BankAccount> bankAccounts = new ArrayList<>(); private List<BankAccount> bankAccounts = new ArrayList<>();
private BankAccount currentBankAccount = null; private BankAccount currentBankAccount = null;
@ -24,39 +24,34 @@ public class User implements Serializable
{ {
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Public Methods
///////////////////////////////////////////////////////////////////////////////////////////
public void updateFromStorage(User savedUser) public void updateFromStorage(User savedUser)
{ {
if (savedUser != null) if (savedUser != null)
{ {
accountID = savedUser.getAccountID(); accountID = savedUser.getAccountID();
messageID = savedUser.getMessageID(); messageID = savedUser.getMessageID();
online = savedUser.isOnline(); isOnline = savedUser.getIsOnline();
bankAccounts = savedUser.getBankAccounts(); bankAccounts = savedUser.getBankAccounts();
currentBankAccount = savedUser.getCurrentBankAccount(); currentBankAccount = savedUser.getCurrentBankAccount();
} }
} }
public String getStringifiedBankAccounts()
{
String bankAccountUIDs = "";
for (Iterator<BankAccount> iterator = getBankAccounts().iterator(); iterator.hasNext(); )
{
BankAccount bankAccount = iterator.next();
bankAccountUIDs += bankAccount.getStringifiedBankAccount();
if (iterator.hasNext())
bankAccountUIDs += ", ";
}
return bankAccountUIDs;
}
public void addBankAccount(BankAccount bankAccount) public void addBankAccount(BankAccount bankAccount)
{ {
bankAccounts.add(bankAccount); bankAccounts.add(bankAccount);
currentBankAccount = bankAccount; currentBankAccount = bankAccount;
} }
// setter
///////////////////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////////////////
public void setMessageID(String messageID) public void setMessageID(String messageID)
{ {
this.messageID = messageID; this.messageID = messageID;
@ -78,14 +73,30 @@ public class User implements Serializable
triggerChange(); triggerChange();
} }
public void setIsOnline(boolean isOnline)
public void setOnline(boolean online)
{ {
this.online = online; this.isOnline = isOnline;
} }
// getter ///////////////////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////////////////
public String getStringifiedBankAccounts()
{
String bankAccountUIDs = "";
for (Iterator<BankAccount> iterator = getBankAccounts().iterator(); iterator.hasNext(); )
{
BankAccount bankAccount = iterator.next();
bankAccountUIDs += bankAccount.getStringifiedBankAccount();
if (iterator.hasNext())
bankAccountUIDs += ", ";
}
return bankAccountUIDs;
}
public String getMessageID() public String getMessageID()
{ {
return messageID; return messageID;
@ -106,18 +117,21 @@ public class User implements Serializable
return currentBankAccount; return currentBankAccount;
} }
public boolean getIsOnline()
public boolean isOnline()
{ {
return online; return isOnline;
} }
public SimpleBooleanProperty getChangedProperty() public SimpleBooleanProperty getChangedProperty()
{ {
return changedProperty; return changedProperty;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Private Methods
///////////////////////////////////////////////////////////////////////////////////////////
private void triggerChange() private void triggerChange()
{ {
changedProperty.set(!changedProperty.get()); changedProperty.set(!changedProperty.get());