initial commit. gui prototype v 0.1

This commit is contained in:
Manfred Karrer 2014-04-11 11:38:31 +02:00
parent bc09937785
commit 24137c7021
18 changed files with 1296 additions and 1296 deletions

View file

@ -1,51 +1,51 @@
package io.bitsquare; 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.di.BitSquareModule; import io.bitsquare.di.BitSquareModule;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.setup.ISetup; import io.bitsquare.setup.ISetup;
import io.bitsquare.setup.MockSetup; import io.bitsquare.setup.MockSetup;
import javafx.application.Application; import javafx.application.Application;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Stage; import javafx.stage.Stage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
public class BitSquare extends Application public class BitSquare extends Application
{ {
private static final Logger log = LoggerFactory.getLogger(BitSquare.class); private static final Logger log = LoggerFactory.getLogger(BitSquare.class);
public static void main(String[] args) public static void main(String[] args)
{ {
launch(args); launch(args);
} }
@Override @Override
public void start(Stage stage) public void start(Stage stage)
{ {
Injector injector = Guice.createInjector(new BitSquareModule()); Injector injector = Guice.createInjector(new BitSquareModule());
ISetup setup = injector.getInstance(MockSetup.class); ISetup setup = injector.getInstance(MockSetup.class);
setup.applyPersistedData(); setup.applyPersistedData();
stage.setTitle("BitSquare"); stage.setTitle("BitSquare");
GuiceFXMLLoader loader = new GuiceFXMLLoader(injector); GuiceFXMLLoader loader = new GuiceFXMLLoader(injector);
try try
{ {
Parent mainView = loader.load(BitSquare.class.getResourceAsStream("/io/bitsquare/gui/MainView.fxml")); Parent mainView = loader.load(BitSquare.class.getResourceAsStream("/io/bitsquare/gui/MainView.fxml"));
Scene scene = new Scene(mainView, 800, 600); Scene scene = new Scene(mainView, 800, 600);
scene.getStylesheets().setAll(getClass().getResource("/io/bitsquare/gui/global.css").toExternalForm()); scene.getStylesheets().setAll(getClass().getResource("/io/bitsquare/gui/global.css").toExternalForm());
stage.setScene(scene); stage.setScene(scene);
stage.show(); stage.show();
} catch (IOException e) } catch (IOException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }

View file

@ -1,26 +1,26 @@
package io.bitsquare.gui.funds; package io.bitsquare.gui.funds;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class FundsController implements Initializable, IChildController public class FundsController implements Initializable, IChildController
{ {
private INavigationController navigationController; private INavigationController navigationController;
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
} }

View file

@ -1,6 +1,6 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.Pane?>
<Pane fx:controller="io.bitsquare.gui.funds.FundsController" <Pane fx:controller="io.bitsquare.gui.funds.FundsController"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
<Label text="Wallet"/> <Label text="Wallet"/>
</Pane> </Pane>

View file

@ -1,28 +1,28 @@
package io.bitsquare.gui.history; package io.bitsquare.gui.history;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class HistoryController implements Initializable, IChildController public class HistoryController implements Initializable, IChildController
{ {
private INavigationController navigationController; private INavigationController navigationController;
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
} }

View file

@ -1,6 +1,6 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.Pane?>
<Pane fx:controller="io.bitsquare.gui.history.HistoryController" <Pane fx:controller="io.bitsquare.gui.history.HistoryController"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
<Label text="Histroy"/> <Label text="Histroy"/>
</Pane> </Pane>

View file

@ -1,32 +1,32 @@
package io.bitsquare.gui.home; package io.bitsquare.gui.home;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class HomeController implements Initializable, IChildController public class HomeController implements Initializable, IChildController
{ {
private INavigationController navigationController; private INavigationController navigationController;
@FXML @FXML
public Pane rootContainer; public Pane rootContainer;
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
} }

View file

@ -1,4 +1,4 @@
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<VBox fx:id="rootContainer" fx:controller="io.bitsquare.gui.home.HomeController" spacing="10" <VBox fx:id="rootContainer" fx:controller="io.bitsquare.gui.home.HomeController" spacing="10"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
</VBox> </VBox>

View file

@ -1,27 +1,27 @@
package io.bitsquare.gui.msg; package io.bitsquare.gui.msg;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class MsgController implements Initializable, IChildController public class MsgController implements Initializable, IChildController
{ {
private INavigationController navigationController; private INavigationController navigationController;
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
} }

View file

@ -1,6 +1,6 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.Pane?>
<Pane fx:controller="io.bitsquare.gui.msg.MsgController" <Pane fx:controller="io.bitsquare.gui.msg.MsgController"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
<Label text="Msg"/> <Label text="Msg"/>
</Pane> </Pane>

View file

@ -1,30 +1,30 @@
package io.bitsquare.gui.orders; package io.bitsquare.gui.orders;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class OrdersController implements Initializable, IChildController public class OrdersController implements Initializable, IChildController
{ {
private INavigationController navigationController; private INavigationController navigationController;
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
} }

View file

@ -1,6 +1,6 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.Pane?>
<Pane fx:controller="io.bitsquare.gui.orders.OrdersController" <Pane fx:controller="io.bitsquare.gui.orders.OrdersController"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
<Label text="Orders"/> <Label text="Orders"/>
</Pane> </Pane>

View file

@ -1,30 +1,30 @@
package io.bitsquare.gui.settings; package io.bitsquare.gui.settings;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class SettingsController implements Initializable, IChildController public class SettingsController implements Initializable, IChildController
{ {
private INavigationController navigationController; private INavigationController navigationController;
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
} }

View file

@ -1,6 +1,6 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.Pane?>
<Pane fx:controller="io.bitsquare.gui.settings.SettingsController" <Pane fx:controller="io.bitsquare.gui.settings.SettingsController"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
<Label text="Settings"/> <Label text="Settings"/>
</Pane> </Pane>

View file

@ -1,89 +1,89 @@
package io.bitsquare.gui.trade; package io.bitsquare.gui.trade;
import io.bitsquare.BitSquare; import io.bitsquare.BitSquare;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import io.bitsquare.gui.trade.orderbook.OrderBookController; import io.bitsquare.gui.trade.orderbook.OrderBookController;
import io.bitsquare.trade.Direction; import io.bitsquare.trade.Direction;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
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, INavigationController, IChildController public class TradeController implements Initializable, INavigationController, IChildController
{ {
@FXML @FXML
private TabPane tabPane; private TabPane tabPane;
private IChildController childController; private IChildController childController;
private boolean orderbookCreated; private boolean orderbookCreated;
private INavigationController navigationController; private INavigationController navigationController;
private OrderBookController orderBookController; private OrderBookController orderBookController;
@Override @Override
public IChildController navigateToView(String fxmlView, String title) public IChildController navigateToView(String fxmlView, String title)
{ {
if (fxmlView.equals(INavigationController.TRADE__ORDER_BOOK) && orderbookCreated) if (fxmlView.equals(INavigationController.TRADE__ORDER_BOOK) && orderbookCreated)
{ {
tabPane.getSelectionModel().select(0); tabPane.getSelectionModel().select(0);
return null; return null;
} }
FXMLLoader loader = new GuiceFXMLLoader(); FXMLLoader loader = new GuiceFXMLLoader();
try try
{ {
Pane view = loader.load(BitSquare.class.getResourceAsStream(fxmlView)); Pane view = loader.load(BitSquare.class.getResourceAsStream(fxmlView));
childController = loader.getController(); childController = loader.getController();
childController.setNavigationController(this); childController.setNavigationController(this);
if (childController instanceof OrderBookController) if (childController instanceof OrderBookController)
orderBookController = (OrderBookController) childController; orderBookController = (OrderBookController) childController;
Tab tab = new Tab(title); Tab tab = new Tab(title);
tab.setContent(view); tab.setContent(view);
tabPane.getTabs().add(tab); tabPane.getTabs().add(tab);
if (fxmlView.equals(INavigationController.TRADE__ORDER_BOOK)) if (fxmlView.equals(INavigationController.TRADE__ORDER_BOOK))
{ {
tab.setClosable(false); tab.setClosable(false);
orderbookCreated = true; orderbookCreated = true;
} }
tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1); tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1);
return childController; return childController;
} catch (IOException e) } catch (IOException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
return null; return null;
} }
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
navigateToView(INavigationController.TRADE__ORDER_BOOK, "Orderbook"); navigateToView(INavigationController.TRADE__ORDER_BOOK, "Orderbook");
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
public void setDirection(Direction direction) public void setDirection(Direction direction)
{ {
tabPane.getSelectionModel().select(0); tabPane.getSelectionModel().select(0);
orderBookController.setDirection(direction); orderBookController.setDirection(direction);
} }
} }

View file

@ -1,271 +1,271 @@
package io.bitsquare.gui.trade.offer; package io.bitsquare.gui.trade.offer;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
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.OrderBookFilterSettings; import io.bitsquare.settings.OrderBookFilterSettings;
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.OfferConstraints; import io.bitsquare.trade.OfferConstraints;
import io.bitsquare.trade.TradingFacade; import io.bitsquare.trade.TradingFacade;
import io.bitsquare.trade.orderbook.MockOrderBook; import io.bitsquare.trade.orderbook.MockOrderBook;
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.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
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.Pane; import javafx.scene.layout.Pane;
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.util.ArrayList; import java.util.ArrayList;
import java.util.Currency; import java.util.Currency;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.UUID; import java.util.UUID;
public class CreateOfferController implements Initializable, IChildController public class CreateOfferController implements Initializable, IChildController
{ {
private static final Logger log = LoggerFactory.getLogger(CreateOfferController.class); private static final Logger log = LoggerFactory.getLogger(CreateOfferController.class);
private INavigationController navigationController; private INavigationController navigationController;
private TradingFacade tradingFacade; private TradingFacade tradingFacade;
private OrderBookFilterSettings orderBookFilterSettings; private OrderBookFilterSettings orderBookFilterSettings;
private Settings settings; private Settings settings;
private User user; private User user;
private double filterPaneItemOffset; private double filterPaneItemOffset;
private Direction direction; private Direction direction;
@FXML @FXML
public AnchorPane holderPane; public AnchorPane holderPane;
@FXML @FXML
public Pane detailsPane; public Pane detailsPane;
@FXML @FXML
public Label buyLabel; public Label buyLabel;
@FXML @FXML
public TextField volume; public TextField volume;
@FXML @FXML
public ImageView directionImageView; public ImageView directionImageView;
@FXML @FXML
public TextField amount; public TextField amount;
@FXML @FXML
public TextField price; public TextField price;
@FXML @FXML
public TextField minAmount; public TextField minAmount;
@FXML @FXML
public Button placeOfferButton; public Button placeOfferButton;
@Inject @Inject
public CreateOfferController(TradingFacade tradingFacade, OrderBookFilterSettings orderBookFilterSettings, Settings settings, User user) public CreateOfferController(TradingFacade tradingFacade, OrderBookFilterSettings orderBookFilterSettings, Settings settings, User user)
{ {
this.tradingFacade = tradingFacade; this.tradingFacade = tradingFacade;
this.orderBookFilterSettings = orderBookFilterSettings; this.orderBookFilterSettings = orderBookFilterSettings;
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)
{ {
createFilterPane(); createFilterPane();
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)
{ {
setVolume(); setVolume();
} }
}); });
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)
{ {
setVolume(); setVolume();
} }
}); });
placeOfferButton.setOnAction(e -> { placeOfferButton.setOnAction(e -> {
// TODO not impl yet. use mocks // TODO not impl yet. use mocks
OfferConstraints offerConstraints = new MockOrderBook(settings).getRandomOfferConstraints(); OfferConstraints offerConstraints = new MockOrderBook(settings).getRandomOfferConstraints();
Offer offer = new Offer(UUID.randomUUID(), Offer offer = new Offer(UUID.randomUUID(),
direction, direction,
Converter.convertToDouble(price.getText()), Converter.convertToDouble(price.getText()),
Converter.convertToDouble(amount.getText()), Converter.convertToDouble(amount.getText()),
Converter.convertToDouble(minAmount.getText()), Converter.convertToDouble(minAmount.getText()),
settings.getCurrency(), settings.getCurrency(),
user, user,
offerConstraints); offerConstraints);
tradingFacade.placeNewOffer(offer); tradingFacade.placeNewOffer(offer);
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(INavigationController.TRADE__ORDER_BOOK, "Orderbook"); navigationController.navigateToView(INavigationController.TRADE__ORDER_BOOK, "Orderbook");
}); });
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController 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()));
configDirection(); configDirection();
} }
private void configDirection() private void configDirection()
{ {
String iconPath; String iconPath;
String buyLabelText; String buyLabelText;
if (direction == Direction.BUY) if (direction == Direction.BUY)
{ {
iconPath = "/images/buy.png"; iconPath = "/images/buy.png";
buyLabelText = "BUY"; buyLabelText = "BUY";
} }
else else
{ {
iconPath = "/images/sell.png"; iconPath = "/images/sell.png";
buyLabelText = "SELL"; buyLabelText = "SELL";
} }
Image icon = new Image(getClass().getResourceAsStream(iconPath)); Image icon = new Image(getClass().getResourceAsStream(iconPath));
directionImageView.setImage(icon); directionImageView.setImage(icon);
buyLabel.setText(buyLabelText); buyLabel.setText(buyLabelText);
} }
private void createFilterPane() private void createFilterPane()
{ {
filterPaneItemOffset = 30; filterPaneItemOffset = 30;
ArrayList<Currency> currencies = orderBookFilterSettings.getCurrencies(); ArrayList<Currency> currencies = orderBookFilterSettings.getCurrencies();
Currency currency = orderBookFilterSettings.getCurrency(); Currency currency = orderBookFilterSettings.getCurrency();
ComboBox currencyComboBox = createCurrencyItem("Currency: ", currency, currencies); ComboBox currencyComboBox = createCurrencyItem("Currency: ", currency, currencies);
currencyComboBox.valueProperty().addListener(new ChangeListener<Currency>() currencyComboBox.valueProperty().addListener(new ChangeListener<Currency>()
{ {
@Override @Override
public void changed(ObservableValue ov, Currency oldValue, Currency newValue) public void changed(ObservableValue ov, Currency oldValue, Currency newValue)
{ {
orderBookFilterSettings.setCurrency(newValue); orderBookFilterSettings.setCurrency(newValue);
} }
}); });
Label bankLabel = createFilterItem("Bank transfer types: ", "SEPA, OKPAY"); Label bankLabel = createFilterItem("Bank transfer types: ", "SEPA, OKPAY");
Label countriesLabel = createFilterItem("Countries: ", "DE, GB, AT"); Label countriesLabel = createFilterItem("Countries: ", "DE, GB, AT");
Label languagesLabel = createFilterItem("Languages: ", "DE, EN"); Label languagesLabel = createFilterItem("Languages: ", "DE, EN");
Label arbitratorsLabel = createFilterItem("Arbitrators: ", "Paysty, BitRated"); Label arbitratorsLabel = createFilterItem("Arbitrators: ", "Paysty, BitRated");
Label identityLabel = createFilterItem("Identity verifications: ", "Passport, Google+, Facebook, Skype"); Label identityLabel = createFilterItem("Identity verifications: ", "Passport, Google+, Facebook, Skype");
TextField collateralLabel = createCollateralItem("Collateral (%): ", 10); TextField collateralLabel = createCollateralItem("Collateral (%): ", 10);
} }
private ComboBox createCurrencyItem(String labelText, Currency currency, ArrayList<Currency> currencies) private ComboBox createCurrencyItem(String labelText, Currency currency, ArrayList<Currency> currencies)
{ {
final Separator separator = new Separator(); final Separator separator = new Separator();
separator.setPrefWidth(380); separator.setPrefWidth(380);
separator.setLayoutY(0 + filterPaneItemOffset); separator.setLayoutY(0 + filterPaneItemOffset);
separator.setLayoutX(0); separator.setLayoutX(0);
final Label label = new Label(labelText); final Label label = new Label(labelText);
label.setLayoutY(10 + filterPaneItemOffset); label.setLayoutY(10 + filterPaneItemOffset);
ObservableList<Currency> options = FXCollections.observableArrayList(currencies); ObservableList<Currency> options = FXCollections.observableArrayList(currencies);
final ComboBox comboBox = new ComboBox(options); final ComboBox comboBox = new ComboBox(options);
comboBox.setLayoutX(70); comboBox.setLayoutX(70);
comboBox.setLayoutY(5 + filterPaneItemOffset); comboBox.setLayoutY(5 + filterPaneItemOffset);
comboBox.setValue(currency); comboBox.setValue(currency);
detailsPane.getChildren().addAll(separator, label, comboBox); detailsPane.getChildren().addAll(separator, label, comboBox);
filterPaneItemOffset += 40; filterPaneItemOffset += 40;
return comboBox; return comboBox;
} }
private Label createFilterItem(String labelText, String valueText) private Label createFilterItem(String labelText, String valueText)
{ {
final Separator separator = new Separator(); final Separator separator = new Separator();
separator.setPrefWidth(380); separator.setPrefWidth(380);
separator.setLayoutY(0 + filterPaneItemOffset); separator.setLayoutY(0 + filterPaneItemOffset);
separator.setLayoutX(0); separator.setLayoutX(0);
final Label label = new Label(labelText + valueText); final Label label = new Label(labelText + valueText);
label.setLayoutY(10 + filterPaneItemOffset); label.setLayoutY(10 + filterPaneItemOffset);
label.setPrefWidth(310); label.setPrefWidth(310);
Tooltip tooltip = new Tooltip(valueText); Tooltip tooltip = new Tooltip(valueText);
label.setTooltip(tooltip); label.setTooltip(tooltip);
final Button edit = new Button("Edit"); final Button edit = new Button("Edit");
edit.setPrefWidth(50); edit.setPrefWidth(50);
edit.setLayoutX(330); edit.setLayoutX(330);
edit.setLayoutY(5 + filterPaneItemOffset); edit.setLayoutY(5 + filterPaneItemOffset);
detailsPane.getChildren().addAll(separator, label, edit); detailsPane.getChildren().addAll(separator, label, edit);
filterPaneItemOffset += 40; filterPaneItemOffset += 40;
return label; return label;
} }
private TextField createCollateralItem(String labelText, double collateral) private TextField createCollateralItem(String labelText, double collateral)
{ {
final Separator separator = new Separator(); final Separator separator = new Separator();
separator.setPrefWidth(380); separator.setPrefWidth(380);
separator.setLayoutY(0 + filterPaneItemOffset); separator.setLayoutY(0 + filterPaneItemOffset);
separator.setLayoutX(0); separator.setLayoutX(0);
final Label label = new Label(labelText); final Label label = new Label(labelText);
label.setLayoutY(10 + filterPaneItemOffset); label.setLayoutY(10 + filterPaneItemOffset);
label.setPrefWidth(310); label.setPrefWidth(310);
final TextField collateralValue = new TextField(Double.toString(collateral)); final TextField collateralValue = new TextField(Double.toString(collateral));
collateralValue.setLayoutX(90); collateralValue.setLayoutX(90);
collateralValue.setLayoutY(5 + filterPaneItemOffset); collateralValue.setLayoutY(5 + filterPaneItemOffset);
collateralValue.setPrefWidth(50); collateralValue.setPrefWidth(50);
detailsPane.getChildren().addAll(separator, label, collateralValue); detailsPane.getChildren().addAll(separator, label, collateralValue);
filterPaneItemOffset += 40; filterPaneItemOffset += 40;
return collateralValue; return collateralValue;
} }
private double textInputToNumber(String oldValue, String newValue) private double textInputToNumber(String oldValue, String newValue)
{ {
//TODO use regex.... or better custom textfield component //TODO use regex.... or better custom textfield component
double d = 0.0; double d = 0.0;
if (!newValue.equals("")) if (!newValue.equals(""))
{ {
d = Converter.convertToDouble(newValue); d = Converter.convertToDouble(newValue);
if (d == Double.NEGATIVE_INFINITY) if (d == Double.NEGATIVE_INFINITY)
{ {
amount.setText(oldValue); amount.setText(oldValue);
d = Converter.convertToDouble(oldValue); d = Converter.convertToDouble(oldValue);
} }
} }
return d; return d;
} }
private void setVolume() private void setVolume()
{ {
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));
} }
} }

View file

@ -1,242 +1,242 @@
package io.bitsquare.gui.trade.orderbook; package io.bitsquare.gui.trade.orderbook;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import io.bitsquare.gui.trade.offer.CreateOfferController; import io.bitsquare.gui.trade.offer.CreateOfferController;
import io.bitsquare.gui.trade.tradeprocess.TradeProcessController; import io.bitsquare.gui.trade.tradeprocess.TradeProcessController;
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.settings.Settings; import io.bitsquare.settings.Settings;
import io.bitsquare.trade.Direction; import io.bitsquare.trade.Direction;
import io.bitsquare.trade.orderbook.IOrderBook; import io.bitsquare.trade.orderbook.IOrderBook;
import io.bitsquare.trade.orderbook.MockOrderBook; import io.bitsquare.trade.orderbook.MockOrderBook;
import io.bitsquare.trade.orderbook.OrderBookFilter; import io.bitsquare.trade.orderbook.OrderBookFilter;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
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.TableColumn; import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView; import javafx.scene.control.TableView;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
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.scene.layout.Pane; import javafx.scene.layout.Pane;
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.Arrays; import java.util.Arrays;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class OrderBookController implements Initializable, IChildController public class OrderBookController implements Initializable, IChildController
{ {
private INavigationController navigationController; private INavigationController navigationController;
private IOrderBook orderBook; private IOrderBook orderBook;
private Settings settings; private Settings settings;
private OrderBookListItem selectedOrderBookListItem; private OrderBookListItem selectedOrderBookListItem;
private final OrderBookFilter orderBookFilter; private final OrderBookFilter orderBookFilter;
private Button createOfferButton; private Button createOfferButton;
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
private Button tradeButton; private Button tradeButton;
@FXML @FXML
public TextField volume, amount, price; public TextField volume, amount, price;
@FXML @FXML
public Pane filterPane; public Pane filterPane;
@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 ImageView tradeButtonImageView; private ImageView tradeButtonImageView;
@Inject @Inject
public OrderBookController(IOrderBook orderBook, OrderBookFilter orderBookFilter, Settings settings) public OrderBookController(IOrderBook orderBook, OrderBookFilter orderBookFilter, Settings settings)
{ {
this.orderBook = orderBook; this.orderBook = orderBook;
this.orderBookFilter = orderBookFilter; this.orderBookFilter = orderBookFilter;
this.settings = settings; this.settings = settings;
} }
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
orderBookFilter.getCurrencyProperty().addListener(new ChangeListener<String>() orderBookFilter.getCurrencyProperty().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)
{ {
updateOfferList(); updateOfferList();
} }
}); });
createFilterPane(); createFilterPane();
updateOfferList(); updateOfferList();
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));
updateOfferList(); updateOfferList();
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));
updateOfferList(); updateOfferList();
updateVolume(); updateVolume();
} }
}); });
orderBookTable.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> { orderBookTable.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
selectedOrderBookListItem = orderBookTable.getSelectionModel().getSelectedItem(); selectedOrderBookListItem = orderBookTable.getSelectionModel().getSelectedItem();
tradeButton.setDisable(selectedOrderBookListItem == null); tradeButton.setDisable(selectedOrderBookListItem == null);
}); });
tradeButton.setOnAction(e -> openTradeTab(selectedOrderBookListItem)); tradeButton.setOnAction(e -> openTradeTab(selectedOrderBookListItem));
tradeButton.setDisable(true); tradeButton.setDisable(true);
tradeButton.setDefaultButton(true); tradeButton.setDefaultButton(true);
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
public void setDirection(Direction direction) public void setDirection(Direction direction)
{ {
orderBookTable.getSelectionModel().clearSelection(); orderBookTable.getSelectionModel().clearSelection();
tradeButton.setDisable(true); tradeButton.setDisable(true);
price.setText(""); price.setText("");
String title; String title;
Image icon; Image icon;
if (direction == Direction.SELL) if (direction == Direction.SELL)
{ {
title = "SELL"; title = "SELL";
icon = sellIcon; icon = sellIcon;
} }
else else
{ {
title = "BUY"; title = "BUY";
icon = buyIcon; icon = buyIcon;
} }
tradeButton.setText(title); tradeButton.setText(title);
tradeButtonImageView.setImage(icon); tradeButtonImageView.setImage(icon);
orderBookFilter.setDirection(direction); orderBookFilter.setDirection(direction);
updateOfferList(); updateOfferList();
} }
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(INavigationController.TRADE__PROCESS, title); TradeProcessController tradeProcessController = (TradeProcessController) navigationController.navigateToView(INavigationController.TRADE__PROCESS, title);
double requestedAmount = orderBookListItem.getOffer().getAmount(); double requestedAmount = orderBookListItem.getOffer().getAmount();
if (!amount.getText().equals("")) if (!amount.getText().equals(""))
requestedAmount = Converter.convertToDouble(amount.getText()); requestedAmount = Converter.convertToDouble(amount.getText());
tradeProcessController.initView(orderBookListItem.getOffer(), requestedAmount); tradeProcessController.initView(orderBookListItem.getOffer(), requestedAmount);
} }
private void displayCreateOfferButton() private void displayCreateOfferButton()
{ {
if (createOfferButton == null) if (createOfferButton == null)
{ {
createOfferButton = new Button("Create new offer"); createOfferButton = new Button("Create new offer");
holderPane.setBottomAnchor(createOfferButton, 375.0); holderPane.setBottomAnchor(createOfferButton, 375.0);
holderPane.setLeftAnchor(createOfferButton, 200.0); holderPane.setLeftAnchor(createOfferButton, 200.0);
holderPane.getChildren().add(createOfferButton); holderPane.getChildren().add(createOfferButton);
createOfferButton.setOnAction(e -> { createOfferButton.setOnAction(e -> {
IChildController nextController = navigationController.navigateToView(INavigationController.TRADE__CREATE_OFFER, "Create offer"); IChildController nextController = navigationController.navigateToView(INavigationController.TRADE__CREATE_OFFER, "Create offer");
((CreateOfferController) nextController).setOrderBookFilter(orderBookFilter); ((CreateOfferController) nextController).setOrderBookFilter(orderBookFilter);
}); });
} }
createOfferButton.setVisible(true); createOfferButton.setVisible(true);
holderPane.setBottomAnchor(orderBookTable, 410.0); holderPane.setBottomAnchor(orderBookTable, 410.0);
} }
private void updateOfferList() private void updateOfferList()
{ {
ObservableList offers = orderBook.getFilteredList(orderBookFilter); ObservableList offers = orderBook.getFilteredList(orderBookFilter);
orderBookTable.setItems(offers); orderBookTable.setItems(offers);
orderBookTable.getSortOrder().add(priceColumn); orderBookTable.getSortOrder().add(priceColumn);
priceColumn.setSortType((orderBookFilter.getDirection() == Direction.BUY) ? TableColumn.SortType.ASCENDING : TableColumn.SortType.DESCENDING); priceColumn.setSortType((orderBookFilter.getDirection() == Direction.BUY) ? TableColumn.SortType.ASCENDING : TableColumn.SortType.DESCENDING);
if (offers.size() == 0) if (offers.size() == 0)
{ {
displayCreateOfferButton(); displayCreateOfferButton();
} }
else if (createOfferButton != null) else if (createOfferButton != null)
{ {
createOfferButton.setVisible(false); createOfferButton.setVisible(false);
holderPane.setBottomAnchor(orderBookTable, 10.0); holderPane.setBottomAnchor(orderBookTable, 10.0);
} }
} }
private void createFilterPane() private void createFilterPane()
{ {
MockOrderBook mockOrderBook = new MockOrderBook(settings); MockOrderBook mockOrderBook = new MockOrderBook(settings);
orderBookFilter.setOfferConstraints(mockOrderBook.getRandomOfferConstraints()); orderBookFilter.setOfferConstraints(mockOrderBook.getRandomOfferConstraints());
OrderBookFilterTextItemBuilder.build(filterPane, "Bank transfer types: ", orderBookFilter.getOfferConstraints().getBankTransferTypes(), settings.getAllBankTransferTypes()); OrderBookFilterTextItemBuilder.build(filterPane, "Bank transfer types: ", orderBookFilter.getOfferConstraints().getBankTransferTypes(), settings.getAllBankTransferTypes());
OrderBookFilterTextItemBuilder.build(filterPane, "Countries: ", orderBookFilter.getOfferConstraints().getCountries(), settings.getAllCountries()); OrderBookFilterTextItemBuilder.build(filterPane, "Countries: ", orderBookFilter.getOfferConstraints().getCountries(), settings.getAllCountries());
OrderBookFilterTextItemBuilder.build(filterPane, "Languages: ", orderBookFilter.getOfferConstraints().getLanguages(), settings.getAllLanguages()); OrderBookFilterTextItemBuilder.build(filterPane, "Languages: ", orderBookFilter.getOfferConstraints().getLanguages(), settings.getAllLanguages());
OrderBookFilterTextItemBuilder.build(filterPane, "Collateral: ", Arrays.asList(String.valueOf(orderBookFilter.getOfferConstraints().getCollateral())), settings.getAllCollaterals()); OrderBookFilterTextItemBuilder.build(filterPane, "Collateral: ", Arrays.asList(String.valueOf(orderBookFilter.getOfferConstraints().getCollateral())), settings.getAllCollaterals());
OrderBookFilterTextItemBuilder.build(filterPane, "Arbitrator: ", Arrays.asList(orderBookFilter.getOfferConstraints().getArbitrator()), settings.getAllArbitrators()); OrderBookFilterTextItemBuilder.build(filterPane, "Arbitrator: ", Arrays.asList(orderBookFilter.getOfferConstraints().getArbitrator()), settings.getAllArbitrators());
} }
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(Settings.getLocale()); DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(Settings.getLocale());
d = decimalFormat.parse(newValue).doubleValue(); d = decimalFormat.parse(newValue).doubleValue();
} catch (ParseException e) } catch (ParseException e)
{ {
amount.setText(oldValue); amount.setText(oldValue);
d = Converter.convertToDouble(oldValue); d = Converter.convertToDouble(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));
} }
} }

View file

@ -1,436 +1,436 @@
package io.bitsquare.gui.trade.tradeprocess; package io.bitsquare.gui.trade.tradeprocess;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bitsquare.btc.BtcFormatter; import io.bitsquare.btc.BtcFormatter;
import io.bitsquare.btc.Fees; import io.bitsquare.btc.Fees;
import io.bitsquare.gui.IChildController; import io.bitsquare.gui.IChildController;
import io.bitsquare.gui.INavigationController; import io.bitsquare.gui.INavigationController;
import io.bitsquare.gui.components.VSpacer; import io.bitsquare.gui.components.VSpacer;
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.Colors; import io.bitsquare.gui.util.Colors;
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.Utils; import io.bitsquare.gui.util.Utils;
import io.bitsquare.trade.*; import io.bitsquare.trade.*;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import javafx.animation.AnimationTimer; import javafx.animation.AnimationTimer;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import org.controlsfx.dialog.Dialogs; import org.controlsfx.dialog.Dialogs;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class TradeProcessController implements Initializable, IChildController public class TradeProcessController implements Initializable, IChildController
{ {
private TradingFacade tradingFacade; private TradingFacade tradingFacade;
private Offer offer; private Offer offer;
private Trade trade; private Trade trade;
private Contract contract; private Contract contract;
private INavigationController navigationController; private INavigationController navigationController;
private List<ProcessStepItem> processStepItems = new ArrayList(); private List<ProcessStepItem> processStepItems = new ArrayList();
private double requestedAmount; private double requestedAmount;
private VBox vBox; private VBox vBox;
private TitledPane offerDetailsTitlePane, contractTitlePane; private TitledPane offerDetailsTitlePane, contractTitlePane;
private ProcessStepBar<String> processStepBar; private ProcessStepBar<String> processStepBar;
private Button nextButton; private Button nextButton;
private TextField amountTextField; private TextField amountTextField;
private Label offererPubKeyLabel, offererAccountPrimaryID, offererAccountSecondaryIDLabel, private Label offererPubKeyLabel, offererAccountPrimaryID, offererAccountSecondaryIDLabel,
offererAccountHolderNameLabel, feedbackLabel, infoLabel, totalLabel, volumeLabel, totalToPayLabel, offererAccountHolderNameLabel, feedbackLabel, infoLabel, totalLabel, volumeLabel, totalToPayLabel,
totalToReceiveLabel, collateralLabel1, collateralLabel2, amountLabel; totalToReceiveLabel, collateralLabel1, collateralLabel2, amountLabel;
private Pane progressPane; private Pane progressPane;
private ProgressBar progressBar; private ProgressBar progressBar;
private ProgressIndicator progressIndicator; private ProgressIndicator progressIndicator;
@FXML @FXML
public AnchorPane rootContainer; public AnchorPane rootContainer;
@Inject @Inject
public TradeProcessController(TradingFacade tradingFacade) public TradeProcessController(TradingFacade tradingFacade)
{ {
this.tradingFacade = tradingFacade; this.tradingFacade = tradingFacade;
} }
@Override @Override
public void setNavigationController(INavigationController navigationController) public void setNavigationController(INavigationController navigationController)
{ {
this.navigationController = navigationController; this.navigationController = navigationController;
} }
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} }
public void initView(Offer offer, double requestedAmount) public void initView(Offer offer, double requestedAmount)
{ {
this.offer = offer; this.offer = offer;
this.requestedAmount = requestedAmount; this.requestedAmount = requestedAmount;
trade = tradingFacade.createNewTrade(offer); trade = tradingFacade.createNewTrade(offer);
trade.setRequestedAmount(requestedAmount); trade.setRequestedAmount(requestedAmount);
contract = tradingFacade.createNewContract(trade); contract = tradingFacade.createNewContract(trade);
processStepItems.add(new ProcessStepItem(takerIsSelling() ? "Sell BTC" : "Buy BTC", Colors.BLUE)); processStepItems.add(new ProcessStepItem(takerIsSelling() ? "Sell BTC" : "Buy BTC", Colors.BLUE));
processStepItems.add(new ProcessStepItem("Bank transfer", Colors.BLUE)); processStepItems.add(new ProcessStepItem("Bank transfer", Colors.BLUE));
processStepItems.add(new ProcessStepItem("Completed", Colors.BLUE)); processStepItems.add(new ProcessStepItem("Completed", Colors.BLUE));
processStepBar = new ProcessStepBar(processStepItems); processStepBar = new ProcessStepBar(processStepItems);
buildStep1(); buildStep1();
} }
private void trade() private void trade()
{ {
double requestedAmount = Converter.convertToDouble(amountTextField.getText()); double requestedAmount = Converter.convertToDouble(amountTextField.getText());
if (requestedAmount <= offer.getAmount() && requestedAmount >= offer.getMinAmount()) if (requestedAmount <= offer.getAmount() && requestedAmount >= offer.getMinAmount())
{ {
amountTextField.setEditable(false); amountTextField.setEditable(false);
trade.setRequestedAmount(requestedAmount); trade.setRequestedAmount(requestedAmount);
vBox.getChildren().remove(nextButton); vBox.getChildren().remove(nextButton);
AnchorPane.setTopAnchor(contractTitlePane, 350.0); AnchorPane.setTopAnchor(contractTitlePane, 350.0);
progressBar = new ProgressBar(); progressBar = new ProgressBar();
progressBar.setProgress(0.0); progressBar.setProgress(0.0);
progressBar.setPrefWidth(200); progressBar.setPrefWidth(200);
progressBar.relocate(10, 10); progressBar.relocate(10, 10);
progressIndicator = new ProgressIndicator(); progressIndicator = new ProgressIndicator();
progressIndicator.setProgress(-1.0); progressIndicator.setProgress(-1.0);
progressIndicator.setPrefSize(20, 20); progressIndicator.setPrefSize(20, 20);
progressIndicator.relocate(220, 10); progressIndicator.relocate(220, 10);
feedbackLabel = new Label(); feedbackLabel = new Label();
feedbackLabel.setPadding(new Insets(-10, 0, 0, 0)); feedbackLabel.setPadding(new Insets(-10, 0, 0, 0));
feedbackLabel.setId("feedback-text"); feedbackLabel.setId("feedback-text");
feedbackLabel.relocate(10, 50); feedbackLabel.relocate(10, 50);
progressPane = new Pane(); progressPane = new Pane();
progressPane.getChildren().addAll(progressBar, progressIndicator, feedbackLabel); progressPane.getChildren().addAll(progressBar, progressIndicator, feedbackLabel);
vBox.getChildren().add(progressPane); vBox.getChildren().add(progressPane);
sendTakeOfferRequest(); sendTakeOfferRequest();
} }
else else
{ {
Dialogs.create() Dialogs.create()
.title("Your input is not valid") .title("Your input is not valid")
.message("The requested amount you entered is outside of the range of the offered amount.") .message("The requested amount you entered is outside of the range of the offered amount.")
.nativeTitleBar() .nativeTitleBar()
.lightweight() .lightweight()
.showError(); .showError();
} }
} }
// Payment Process // Payment Process
private void sendTakeOfferRequest() private void sendTakeOfferRequest()
{ {
tradingFacade.sendTakeOfferRequest(trade); tradingFacade.sendTakeOfferRequest(trade);
feedbackLabel.setText("Request take offer confirmation from peer."); feedbackLabel.setText("Request take offer confirmation from peer.");
Utils.setTimeout(500, (AnimationTimer animationTimer) -> { Utils.setTimeout(500, (AnimationTimer animationTimer) -> {
onTakeOfferRequestConfirmed(); onTakeOfferRequestConfirmed();
progressBar.setProgress(1.0 / 3.0); progressBar.setProgress(1.0 / 3.0);
return null; return null;
}); });
} }
private void onTakeOfferRequestConfirmed() private void onTakeOfferRequestConfirmed()
{ {
tradingFacade.payOfferFee(trade); tradingFacade.payOfferFee(trade);
feedbackLabel.setText("Request offer fee payment confirmation from peer."); feedbackLabel.setText("Request offer fee payment confirmation from peer.");
Utils.setTimeout(500, (AnimationTimer animationTimer) -> { Utils.setTimeout(500, (AnimationTimer animationTimer) -> {
onOfferFeePaymentConfirmed(); onOfferFeePaymentConfirmed();
progressBar.setProgress(2.0 / 3.0); progressBar.setProgress(2.0 / 3.0);
return null; return null;
}); });
} }
private void onOfferFeePaymentConfirmed() private void onOfferFeePaymentConfirmed()
{ {
tradingFacade.requestOffererDetailData(); tradingFacade.requestOffererDetailData();
feedbackLabel.setText("Request detail data from peer."); feedbackLabel.setText("Request detail data from peer.");
Utils.setTimeout(500, (AnimationTimer animationTimer) -> { Utils.setTimeout(500, (AnimationTimer animationTimer) -> {
onUserDetailsReceived(); onUserDetailsReceived();
progressBar.setProgress(1.0); progressBar.setProgress(1.0);
return null; return null;
}); });
} }
private void onUserDetailsReceived() private void onUserDetailsReceived()
{ {
tradingFacade.signContract(contract); tradingFacade.signContract(contract);
tradingFacade.payToDepositTx(trade); tradingFacade.payToDepositTx(trade);
buildWaitBankTransfer(); buildWaitBankTransfer();
} }
private void buildWaitBankTransfer() private void buildWaitBankTransfer()
{ {
processStepBar.next(); processStepBar.next();
vBox.getChildren().remove(progressPane); vBox.getChildren().remove(progressPane);
vBox.getChildren().remove(offerDetailsTitlePane); vBox.getChildren().remove(offerDetailsTitlePane);
vBox.getChildren().remove(nextButton); vBox.getChildren().remove(nextButton);
rootContainer.getChildren().remove(contractTitlePane); rootContainer.getChildren().remove(contractTitlePane);
infoLabel = new Label("Wait for Bank transfer."); infoLabel = new Label("Wait for Bank transfer.");
vBox.getChildren().addAll(infoLabel); vBox.getChildren().addAll(infoLabel);
Utils.setTimeout(2000, (AnimationTimer animationTimer) -> { Utils.setTimeout(2000, (AnimationTimer animationTimer) -> {
onBankTransferInited(); onBankTransferInited();
return null; return null;
}); });
} }
private void onBankTransferInited() private void onBankTransferInited()
{ {
infoLabel.setText("Bank transfer has been inited.\nCheck your bank account and continue when you have received the money.\n"); infoLabel.setText("Bank transfer has been inited.\nCheck your bank account and continue when you have received the money.\n");
nextButton.setText("Money received on Bank account"); nextButton.setText("Money received on Bank account");
nextButton.setOnAction(e -> releaseBTC()); nextButton.setOnAction(e -> releaseBTC());
vBox.getChildren().add(nextButton); vBox.getChildren().add(nextButton);
} }
private void releaseBTC() private void releaseBTC()
{ {
processStepBar.next(); processStepBar.next();
tradingFacade.releaseBTC(trade); tradingFacade.releaseBTC(trade);
vBox.getChildren().remove(infoLabel); vBox.getChildren().remove(infoLabel);
nextButton.setText("Close"); nextButton.setText("Close");
nextButton.setOnAction(e -> close()); nextButton.setOnAction(e -> close());
GridPane summaryGridPane = new GridPane(); GridPane summaryGridPane = new GridPane();
int row = 0; int row = 0;
summaryGridPane.setVgap(5); summaryGridPane.setVgap(5);
summaryGridPane.setHgap(5); summaryGridPane.setHgap(5);
summaryGridPane.setPadding(new Insets(5, 5, 5, 5)); summaryGridPane.setPadding(new Insets(5, 5, 5, 5));
addLabel(summaryGridPane, "You have payed:", getTotalToPay(), ++row); addLabel(summaryGridPane, "You have payed:", getTotalToPay(), ++row);
addLabel(summaryGridPane, "You have received:\n ", getTotalToReceive(), ++row); addLabel(summaryGridPane, "You have received:\n ", getTotalToReceive(), ++row);
TitledPane summaryTitlePane = new TitledPane("Trade summary:", summaryGridPane); TitledPane summaryTitlePane = new TitledPane("Trade summary:", summaryGridPane);
summaryTitlePane.setCollapsible(false); summaryTitlePane.setCollapsible(false);
vBox.getChildren().add(2, summaryTitlePane); vBox.getChildren().add(2, summaryTitlePane);
} }
private void close() private void close()
{ {
TabPane tabPane = ((TabPane) (rootContainer.getParent().getParent())); TabPane tabPane = ((TabPane) (rootContainer.getParent().getParent()));
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem()); tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
navigationController.navigateToView(INavigationController.TRADE__ORDER_BOOK, "Orderbook"); navigationController.navigateToView(INavigationController.TRADE__ORDER_BOOK, "Orderbook");
} }
private void buildStep1() private void buildStep1()
{ {
OfferConstraints offerConstraints = offer.getOfferConstraints(); OfferConstraints offerConstraints = offer.getOfferConstraints();
User taker = contract.getTaker(); User taker = contract.getTaker();
User offerer = contract.getOfferer(); User offerer = contract.getOfferer();
GridPane offerDetailsGridPane = new GridPane(); GridPane offerDetailsGridPane = new GridPane();
int row = 0; int row = 0;
offerDetailsGridPane.setVgap(5); offerDetailsGridPane.setVgap(5);
offerDetailsGridPane.setHgap(5); offerDetailsGridPane.setHgap(5);
offerDetailsGridPane.setPadding(new Insets(5, 5, 5, 5)); offerDetailsGridPane.setPadding(new Insets(5, 5, 5, 5));
amountTextField = addInputField(offerDetailsGridPane, "Amount (BTC):", Formatter.formatAmount(getAmount()), ++row); amountTextField = addInputField(offerDetailsGridPane, "Amount (BTC):", Formatter.formatAmount(getAmount()), ++row);
amountTextField.textProperty().addListener(e -> { amountTextField.textProperty().addListener(e -> {
setTotal(); setTotal();
setVolume(); setVolume();
setCollateral(); setCollateral();
totalToPayLabel.setText(getTotalToPay()); totalToPayLabel.setText(getTotalToPay());
totalToReceiveLabel.setText(getTotalToReceive()); totalToReceiveLabel.setText(getTotalToReceive());
amountLabel.setText(amountTextField.getText()); amountLabel.setText(amountTextField.getText());
}); });
offerDetailsGridPane.add(new Label("(" + offer.getAmount() + "BTC - " + offer.getMinAmount() + "BTC)"), 2, row); offerDetailsGridPane.add(new Label("(" + offer.getAmount() + "BTC - " + offer.getMinAmount() + "BTC)"), 2, row);
addLabel(offerDetailsGridPane, "Price:", Formatter.formatPriceWithCurrencyPair(offer.getPrice(), offer.getCurrency()), ++row); addLabel(offerDetailsGridPane, "Price:", Formatter.formatPriceWithCurrencyPair(offer.getPrice(), offer.getCurrency()), ++row);
totalLabel = addLabel(offerDetailsGridPane, "Total:", "", ++row); totalLabel = addLabel(offerDetailsGridPane, "Total:", "", ++row);
setTotal(); setTotal();
collateralLabel1 = addLabel(offerDetailsGridPane, "Collateral:", Formatter.formatCollateral(offer.getOfferConstraints().getCollateral(), getAmount()), ++row); collateralLabel1 = addLabel(offerDetailsGridPane, "Collateral:", Formatter.formatCollateral(offer.getOfferConstraints().getCollateral(), getAmount()), ++row);
addLabel(offerDetailsGridPane, "Offer fee:", Formatter.formatSatoshis(Fees.OFFER_CREATION_FEE, true), ++row); addLabel(offerDetailsGridPane, "Offer fee:", Formatter.formatSatoshis(Fees.OFFER_CREATION_FEE, true), ++row);
addVSpacer(offerDetailsGridPane, ++row); addVSpacer(offerDetailsGridPane, ++row);
totalToPayLabel = addLabel(offerDetailsGridPane, "You pay:", getTotalToPay(), ++row); totalToPayLabel = addLabel(offerDetailsGridPane, "You pay:", getTotalToPay(), ++row);
totalToReceiveLabel = addLabel(offerDetailsGridPane, "You receive:\n ", getTotalToReceive(), ++row); totalToReceiveLabel = addLabel(offerDetailsGridPane, "You receive:\n ", getTotalToReceive(), ++row);
offerDetailsTitlePane = new TitledPane(takerIsSelling() ? "Sell Bitcoin" : "Buy Bitcoin", offerDetailsGridPane); offerDetailsTitlePane = new TitledPane(takerIsSelling() ? "Sell Bitcoin" : "Buy Bitcoin", offerDetailsGridPane);
offerDetailsTitlePane.setCollapsible(false); offerDetailsTitlePane.setCollapsible(false);
nextButton = new Button(processStepItems.get(0).getLabel()); nextButton = new Button(processStepItems.get(0).getLabel());
nextButton.setDefaultButton(true); nextButton.setDefaultButton(true);
nextButton.setOnAction(e -> trade()); nextButton.setOnAction(e -> trade());
GridPane contractGridPane = new GridPane(); GridPane contractGridPane = new GridPane();
contractGridPane.setVgap(5); contractGridPane.setVgap(5);
contractGridPane.setHgap(5); contractGridPane.setHgap(5);
contractGridPane.setPadding(new Insets(5, 5, 5, 5)); contractGridPane.setPadding(new Insets(5, 5, 5, 5));
row = 0; row = 0;
addHeaderLabel(contractGridPane, "Offer details:", row); addHeaderLabel(contractGridPane, "Offer details:", row);
addLabel(contractGridPane, "Offer ID:", offer.getUid().toString(), ++row); addLabel(contractGridPane, "Offer ID:", offer.getUid().toString(), ++row);
addLabel(contractGridPane, "Offer type:", Formatter.formatDirection((offer.getDirection() == Direction.BUY ? Direction.SELL : Direction.BUY), false), ++row); addLabel(contractGridPane, "Offer type:", Formatter.formatDirection((offer.getDirection() == Direction.BUY ? Direction.SELL : Direction.BUY), false), ++row);
amountLabel = addLabel(contractGridPane, "Amount:", Formatter.formatAmount(getAmount()), ++row); amountLabel = addLabel(contractGridPane, "Amount:", Formatter.formatAmount(getAmount()), ++row);
volumeLabel = addLabel(contractGridPane, "Volume:", "", ++row); volumeLabel = addLabel(contractGridPane, "Volume:", "", ++row);
setVolume(); setVolume();
addLabel(contractGridPane, "Price:", Formatter.formatPriceWithCurrencyPair(offer.getPrice(), offer.getCurrency()), ++row); addLabel(contractGridPane, "Price:", Formatter.formatPriceWithCurrencyPair(offer.getPrice(), offer.getCurrency()), ++row);
collateralLabel2 = addLabel(contractGridPane, "Collateral:", "", ++row); collateralLabel2 = addLabel(contractGridPane, "Collateral:", "", ++row);
setCollateral(); setCollateral();
addLabel(contractGridPane, "Language:", Formatter.formatList(offerConstraints.getLanguages()), ++row); addLabel(contractGridPane, "Language:", Formatter.formatList(offerConstraints.getLanguages()), ++row);
addLabel(contractGridPane, "Arbitrator:", offerConstraints.getArbitrator(), ++row); addLabel(contractGridPane, "Arbitrator:", offerConstraints.getArbitrator(), ++row);
// addLabel(contractGridPane, "Identity verification:", Formatter.formatList(offerConstraints.getIdentityVerifications()), ++row); // addLabel(contractGridPane, "Identity verification:", Formatter.formatList(offerConstraints.getIdentityVerifications()), ++row);
addLabel(contractGridPane, "Bank transfer reference ID:", "Purchase xyz 01.04.2014", ++row); addLabel(contractGridPane, "Bank transfer reference ID:", "Purchase xyz 01.04.2014", ++row);
addVSpacer(contractGridPane, ++row); addVSpacer(contractGridPane, ++row);
addHeaderLabel(contractGridPane, "Offerer data:", ++row); addHeaderLabel(contractGridPane, "Offerer data:", ++row);
addLabel(contractGridPane, "Account ID:", offerer.getAccountID(), ++row); addLabel(contractGridPane, "Account ID:", offerer.getAccountID(), ++row);
addLabel(contractGridPane, "Messaging ID:", offerer.getMessageID(), ++row); addLabel(contractGridPane, "Messaging ID:", offerer.getMessageID(), ++row);
addLabel(contractGridPane, "Country:", offerer.getCountry(), ++row); addLabel(contractGridPane, "Country:", offerer.getCountry(), ++row);
offererPubKeyLabel = addLabel(contractGridPane, "Payment public key:", contract.getOffererPubKey(), ++row); offererPubKeyLabel = addLabel(contractGridPane, "Payment public key:", contract.getOffererPubKey(), ++row);
addLabel(contractGridPane, "Bank transfer type:", offerer.getBankDetails().getBankTransferType(), ++row); addLabel(contractGridPane, "Bank transfer type:", offerer.getBankDetails().getBankTransferType(), ++row);
offererAccountPrimaryID = addLabel(contractGridPane, "Bank account IBAN:", offerer.getBankDetails().getAccountPrimaryID(), ++row); offererAccountPrimaryID = addLabel(contractGridPane, "Bank account IBAN:", offerer.getBankDetails().getAccountPrimaryID(), ++row);
offererAccountSecondaryIDLabel = addLabel(contractGridPane, "Bank account BIC:", offerer.getBankDetails().getAccountSecondaryID(), ++row); offererAccountSecondaryIDLabel = addLabel(contractGridPane, "Bank account BIC:", offerer.getBankDetails().getAccountSecondaryID(), ++row);
offererAccountHolderNameLabel = addLabel(contractGridPane, "Bank account holder:", offerer.getBankDetails().getAccountHolderName(), ++row); offererAccountHolderNameLabel = addLabel(contractGridPane, "Bank account holder:", offerer.getBankDetails().getAccountHolderName(), ++row);
addVSpacer(contractGridPane, ++row); addVSpacer(contractGridPane, ++row);
addHeaderLabel(contractGridPane, "Offer taker data:", ++row); addHeaderLabel(contractGridPane, "Offer taker data:", ++row);
addLabel(contractGridPane, "Account ID:", taker.getAccountID(), ++row); addLabel(contractGridPane, "Account ID:", taker.getAccountID(), ++row);
addLabel(contractGridPane, "Messaging ID:", taker.getMessageID(), ++row); addLabel(contractGridPane, "Messaging ID:", taker.getMessageID(), ++row);
addLabel(contractGridPane, "Country:", taker.getCountry(), ++row); addLabel(contractGridPane, "Country:", taker.getCountry(), ++row);
addLabel(contractGridPane, "Payment public key:", contract.getTakerPubKey(), ++row); addLabel(contractGridPane, "Payment public key:", contract.getTakerPubKey(), ++row);
addLabel(contractGridPane, "Bank transfer type:", taker.getBankDetails().getBankTransferType(), ++row); addLabel(contractGridPane, "Bank transfer type:", taker.getBankDetails().getBankTransferType(), ++row);
addLabel(contractGridPane, "Bank account IBAN:", taker.getBankDetails().getAccountPrimaryID(), ++row); addLabel(contractGridPane, "Bank account IBAN:", taker.getBankDetails().getAccountPrimaryID(), ++row);
addLabel(contractGridPane, "Bank account BIC:", taker.getBankDetails().getAccountSecondaryID(), ++row); addLabel(contractGridPane, "Bank account BIC:", taker.getBankDetails().getAccountSecondaryID(), ++row);
addLabel(contractGridPane, "Bank account holder:", taker.getBankDetails().getAccountHolderName(), ++row); addLabel(contractGridPane, "Bank account holder:", taker.getBankDetails().getAccountHolderName(), ++row);
ScrollPane scrollPane = new ScrollPane(); ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(contractGridPane); scrollPane.setContent(contractGridPane);
contractTitlePane = new TitledPane("Contract", scrollPane); contractTitlePane = new TitledPane("Contract", scrollPane);
contractTitlePane.setCollapsible(false); contractTitlePane.setCollapsible(false);
AnchorPane.setLeftAnchor(contractTitlePane, 10.0); AnchorPane.setLeftAnchor(contractTitlePane, 10.0);
AnchorPane.setRightAnchor(contractTitlePane, 10.0); AnchorPane.setRightAnchor(contractTitlePane, 10.0);
AnchorPane.setTopAnchor(contractTitlePane, 324.0); AnchorPane.setTopAnchor(contractTitlePane, 324.0);
AnchorPane.setBottomAnchor(contractTitlePane, 10.0); AnchorPane.setBottomAnchor(contractTitlePane, 10.0);
vBox = new VBox(); vBox = new VBox();
AnchorPane.setLeftAnchor(vBox, 10.0); AnchorPane.setLeftAnchor(vBox, 10.0);
AnchorPane.setRightAnchor(vBox, 10.0); AnchorPane.setRightAnchor(vBox, 10.0);
AnchorPane.setTopAnchor(vBox, 10.0); AnchorPane.setTopAnchor(vBox, 10.0);
vBox.setSpacing(10); vBox.setSpacing(10);
vBox.getChildren().addAll(processStepBar, new VSpacer(5), offerDetailsTitlePane, nextButton); vBox.getChildren().addAll(processStepBar, new VSpacer(5), offerDetailsTitlePane, nextButton);
rootContainer.getChildren().addAll(vBox, contractTitlePane); rootContainer.getChildren().addAll(vBox, contractTitlePane);
} }
private Label addLabel(GridPane gridPane, String title, String value, int row) private Label addLabel(GridPane gridPane, String title, String value, int row)
{ {
gridPane.add(new Label(title), 0, row); gridPane.add(new Label(title), 0, row);
Label valueLabel = new Label(value); Label valueLabel = new Label(value);
gridPane.add(valueLabel, 1, row); gridPane.add(valueLabel, 1, row);
return valueLabel; return valueLabel;
} }
private void addHeaderLabel(GridPane gridPane, String title, int row) private void addHeaderLabel(GridPane gridPane, String title, int row)
{ {
Label headerLabel = new Label(title); Label headerLabel = new Label(title);
headerLabel.setId("form-header-text"); headerLabel.setId("form-header-text");
gridPane.add(headerLabel, 0, row); gridPane.add(headerLabel, 0, row);
} }
private TextField addInputField(GridPane gridPane, String title, String value, int row) private TextField addInputField(GridPane gridPane, String title, String value, int row)
{ {
gridPane.add(new Label(title), 0, row); gridPane.add(new Label(title), 0, row);
TextField textField = new TextField(value); TextField textField = new TextField(value);
gridPane.add(textField, 1, row); gridPane.add(textField, 1, row);
return textField; return textField;
} }
private void addVSpacer(GridPane gridPane, int row) private void addVSpacer(GridPane gridPane, int row)
{ {
gridPane.add(new VSpacer(10), 0, row); gridPane.add(new VSpacer(10), 0, row);
} }
private void setTotal() private void setTotal()
{ {
totalLabel.setText(Formatter.formatVolume(getVolume())); totalLabel.setText(Formatter.formatVolume(getVolume()));
} }
private void setVolume() private void setVolume()
{ {
totalLabel.setText(Formatter.formatVolume(getVolume(), offer.getCurrency())); totalLabel.setText(Formatter.formatVolume(getVolume(), offer.getCurrency()));
} }
private boolean takerIsSelling() private boolean takerIsSelling()
{ {
return offer.getDirection() == Direction.BUY; return offer.getDirection() == Direction.BUY;
} }
private double getVolume() private double getVolume()
{ {
return offer.getPrice() * Converter.convertToDouble(amountTextField.getText()); return offer.getPrice() * Converter.convertToDouble(amountTextField.getText());
} }
private double getAmount() private double getAmount()
{ {
return requestedAmount > 0 ? requestedAmount : offer.getAmount(); return requestedAmount > 0 ? requestedAmount : offer.getAmount();
} }
private String getTotalToPay() private String getTotalToPay()
{ {
String result = ""; String result = "";
if (takerIsSelling()) if (takerIsSelling())
{ {
double btcValue = Converter.convertToDouble(amountTextField.getText()) + BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE) + double btcValue = Converter.convertToDouble(amountTextField.getText()) + BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE) +
offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText()); offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText());
result = Formatter.formatAmount(btcValue, true, true); result = Formatter.formatAmount(btcValue, true, true);
} }
else else
{ {
double btcValue = BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE) + offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText()); double btcValue = BtcFormatter.satoshiToBTC(Fees.OFFER_CREATION_FEE) + offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText());
result = Formatter.formatAmount(btcValue, true, true) + "\n" + Formatter.formatVolume(getVolume(), offer.getCurrency()); result = Formatter.formatAmount(btcValue, true, true) + "\n" + Formatter.formatVolume(getVolume(), offer.getCurrency());
} }
return result; return result;
} }
private String getTotalToReceive() private String getTotalToReceive()
{ {
String result = ""; String result = "";
if (takerIsSelling()) if (takerIsSelling())
{ {
double btcValue = offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText()); double btcValue = offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText());
result = Formatter.formatAmount(btcValue, true, true) + "\n" + Formatter.formatVolume(getVolume(), offer.getCurrency()); result = Formatter.formatAmount(btcValue, true, true) + "\n" + Formatter.formatVolume(getVolume(), offer.getCurrency());
} }
else else
{ {
double btcValue = Converter.convertToDouble(amountTextField.getText()) + double btcValue = Converter.convertToDouble(amountTextField.getText()) +
offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText()); offer.getOfferConstraints().getCollateral() * Converter.convertToDouble(amountTextField.getText());
result = Formatter.formatAmount(btcValue, true, true); result = Formatter.formatAmount(btcValue, true, true);
} }
return result; return result;
} }
public void setCollateral() public void setCollateral()
{ {
String value = Formatter.formatCollateral(offer.getOfferConstraints().getCollateral(), Converter.convertToDouble(amountTextField.getText())); String value = Formatter.formatCollateral(offer.getOfferConstraints().getCollateral(), Converter.convertToDouble(amountTextField.getText()));
collateralLabel1.setText(value); collateralLabel1.setText(value);
collateralLabel2.setText(value); collateralLabel2.setText(value);
} }
} }

View file

@ -1,6 +1,6 @@
Manifest-Version: 1.0 Manifest-Version: 1.0
Archiver-Version: Plexus Archiver Archiver-Version: Plexus Archiver
Created-By: Apache Maven Created-By: Apache Maven
Built-By: Manfred Karrer Built-By: Manfred Karrer
Build-Jdk: 1.8.0 Build-Jdk: 1.8.0
Main-Class: io.bitsquare.BitSquare Main-Class: io.bitsquare.BitSquare