From 65d97819ac620bd70a0a4a8e5a1c47edb8674da8 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 7 Jul 2014 16:28:40 +0200 Subject: [PATCH] add system try support, add address to create offer screen --- META-INF/MANIFEST.MF | 3 + bitsquare.properties | 4 + bitsquare.xml | 489 ++++++++++++++++++ pom.xml | 20 +- src/main/java/META-INF/MANIFEST.MF | 3 + src/main/java/io/bitsquare/BitSquare.java | 281 +++++----- .../bitsquare/btc/BitSquareWalletAppKit.java | 1 - .../io/bitsquare/btc/BlockChainFacade.java | 2 +- .../java/io/bitsquare/btc/BtcValidator.java | 2 +- src/main/java/io/bitsquare/btc/FeePolicy.java | 2 +- .../java/io/bitsquare/btc/WalletFacade.java | 17 +- .../io/bitsquare/crypto/CryptoFacade.java | 2 +- .../java/io/bitsquare/di/BitSquareModule.java | 6 +- .../java/io/bitsquare/gui/MainController.java | 8 +- src/main/java/io/bitsquare/gui/MainView.fxml | 4 +- .../ArbitratorOverviewController.java | 2 +- .../profile/ArbitratorProfileController.java | 2 +- .../ArbitratorRegistrationController.java | 2 +- src/main/java/io/bitsquare/gui/bitsquare.css | 10 + .../gui/components/btc/AddressTextField.java | 65 +++ .../gui/components/btc/BalanceTextField.java | 143 +++++ .../bitsquare/gui/funds/FundsController.java | 2 +- .../gui/funds/deposit/DepositController.java | 2 +- .../transactions/TransactionsController.java | 2 +- .../withdrawal/WithdrawalController.java | 2 +- .../funds/withdrawal/WithdrawalListItem.java | 5 +- .../io/bitsquare/gui/home/HomeController.java | 2 +- .../createOffer/CreateOfferController.java | 45 +- .../market/createOffer/CreateOfferView.fxml | 79 ++- .../market/orderbook/OrderBookController.java | 20 +- .../gui/market/trade/TakeOfferView.fxml | 8 +- .../market/trade/TakerOfferController.java | 2 +- .../market/trade/TakerTradeController.java | 488 ----------------- .../gui/market/trade/TakerTradeView.fxml | 31 -- .../io/bitsquare/gui/msg/MsgController.java | 2 +- .../gui/orders/OrdersController.java | 2 +- .../orders/closed/ClosedTradeController.java | 2 +- .../gui/orders/closed/ClosedTradeView.fxml | 2 +- .../gui/orders/offer/OfferController.java | 2 +- .../pending/PendingTradeController.java | 31 +- .../gui/orders/pending/PendingTradeView.fxml | 4 +- .../java/io/bitsquare/gui/popups/Popups.java | 39 +- .../gui/settings/SettingsController.java | 4 +- .../java/io/bitsquare/msg/MessageFacade.java | 6 +- .../java/io/bitsquare/settings/Settings.java | 2 +- .../java/io/bitsquare/storage/Storage.java | 2 +- src/main/java/io/bitsquare/trade/Trade.java | 49 +- src/main/java/io/bitsquare/trade/Trading.java | 2 +- .../bitsquare/trade/orderbook/OrderBook.java | 2 +- .../offerer/ProtocolForOffererAsBuyer.java | 1 - .../trade/protocol/old/PaymentProcess.java | 2 +- .../java/io/bitsquare/util/AWTSystemTray.java | 87 ++++ .../java/io/bitsquare/util/Controller.java | 35 ++ src/main/java/io/bitsquare/util/FileUtil.java | 37 +- .../io/bitsquare/util/StorageDirectory.java | 89 ++++ src/main/resources/images/systemTrayIcon.png | Bin 0 -> 367 bytes .../java/io/bitsquare/BitSquareTestSuite.java | 18 - .../io/bitsquare/btc/BtcValidatorTest.java | 34 -- .../gui/util/BitSquareConverterTest.java | 29 -- .../gui/util/BitSquareValidatorTest.java | 79 --- 60 files changed, 1278 insertions(+), 1040 deletions(-) create mode 100644 META-INF/MANIFEST.MF create mode 100644 bitsquare.properties create mode 100644 bitsquare.xml create mode 100644 src/main/java/META-INF/MANIFEST.MF create mode 100644 src/main/java/io/bitsquare/gui/components/btc/AddressTextField.java create mode 100644 src/main/java/io/bitsquare/gui/components/btc/BalanceTextField.java delete mode 100644 src/main/java/io/bitsquare/gui/market/trade/TakerTradeController.java delete mode 100644 src/main/java/io/bitsquare/gui/market/trade/TakerTradeView.fxml create mode 100644 src/main/java/io/bitsquare/util/AWTSystemTray.java create mode 100644 src/main/java/io/bitsquare/util/Controller.java create mode 100644 src/main/java/io/bitsquare/util/StorageDirectory.java create mode 100644 src/main/resources/images/systemTrayIcon.png delete mode 100644 src/test/java/io/bitsquare/BitSquareTestSuite.java delete mode 100644 src/test/java/io/bitsquare/btc/BtcValidatorTest.java delete mode 100644 src/test/java/io/bitsquare/gui/util/BitSquareConverterTest.java delete mode 100644 src/test/java/io/bitsquare/gui/util/BitSquareValidatorTest.java diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..83370c8576 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: io.bitsquare.BitSquare + diff --git a/bitsquare.properties b/bitsquare.properties new file mode 100644 index 0000000000..122dbe06a1 --- /dev/null +++ b/bitsquare.properties @@ -0,0 +1,4 @@ +path.variable.maven_repository=/Users/mk/.m2/repository +jdk.home.1.8=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home +idea.home=/Applications/_DEV/IntelliJ IDEA 13 CE.app +javac2.instrumentation.includeJavaRuntime=false \ No newline at end of file diff --git a/bitsquare.xml b/bitsquare.xml new file mode 100644 index 0000000000..b0fef2e870 --- /dev/null +++ b/bitsquare.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index e38afde78d..efb31f7d9e 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,7 @@ + @@ -107,6 +108,11 @@ bitcoinj 0.11.3 + + com.madgag + sc-light-jdk15on + 1.47.0.2 + net.tomp2p @@ -126,7 +132,18 @@ slf4j-api 1.7.7 - + + + ch.qos.logback + logback-core + 1.1.2 + ch.qos.logback logback-classic @@ -134,6 +151,7 @@ compile + com.google.inject guice diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..83370c8576 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: io.bitsquare.BitSquare + diff --git a/src/main/java/io/bitsquare/BitSquare.java b/src/main/java/io/bitsquare/BitSquare.java index 1921605666..d3fbc66c78 100644 --- a/src/main/java/io/bitsquare/BitSquare.java +++ b/src/main/java/io/bitsquare/BitSquare.java @@ -1,124 +1,157 @@ -package io.bitsquare; - -import com.google.common.base.Throwables; -import com.google.inject.Guice; -import com.google.inject.Injector; -import io.bitsquare.btc.WalletFacade; -import io.bitsquare.di.BitSquareModule; -import io.bitsquare.di.GuiceFXMLLoader; -import io.bitsquare.gui.NavigationItem; -import io.bitsquare.gui.popups.Popups; -import io.bitsquare.locale.Localisation; -import io.bitsquare.msg.MessageFacade; -import io.bitsquare.settings.Settings; -import io.bitsquare.storage.Storage; -import io.bitsquare.user.User; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.stage.Stage; -import org.controlsfx.control.action.Action; -import org.controlsfx.dialog.Dialog; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class BitSquare extends Application -{ - private static final Logger log = LoggerFactory.getLogger(BitSquare.class); - public static String ID = "bitsquare"; - private static Stage stage; - private WalletFacade walletFacade; - private MessageFacade messageFacade; - - public static void main(String[] args) - { - log.debug("Startup: main"); - if (args != null && args.length > 0) - { - ID = args[0]; - } - - launch(args); - } - - public static Stage getStage() - { - return stage; - } - - @Override - public void start(Stage stage) - { - Thread.currentThread().setUncaughtExceptionHandler((thread, throwable) -> Popups.handleUncaughtExceptions(Throwables.getRootCause(throwable))); - init(stage); - } - - private void init(Stage stage) - { - BitSquare.stage = stage; - - log.debug("Startup: start"); - final Injector injector = Guice.createInjector(new BitSquareModule()); - - walletFacade = injector.getInstance(WalletFacade.class); - messageFacade = injector.getInstance(MessageFacade.class); - log.debug("Startup: messageFacade, walletFacade inited"); - - // apply stored data - final User user = injector.getInstance(User.class); - final Settings settings = injector.getInstance(Settings.class); - final Storage storage = injector.getInstance(Storage.class); - storage.init(); - user.updateFromStorage((User) storage.read(user.getClass().getName())); - settings.updateFromStorage((Settings) storage.read(settings.getClass().getName())); - - if (ID.isEmpty()) - { - stage.setTitle("BitSquare"); - } - else - { - stage.setTitle("BitSquare (" + ID + ")"); - } - - GuiceFXMLLoader.setInjector(injector); - - stage.setMinWidth(800); - stage.setMinHeight(400); - stage.setWidth(800); - stage.setHeight(600); - - try - { - final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(NavigationItem.MAIN.getFxmlUrl()), Localisation.getResourceBundle()); - final Parent mainView = loader.load(); - final Scene scene = new Scene(mainView, 800, 600); - stage.setScene(scene); - - final String bitsquare = getClass().getResource("/io/bitsquare/gui/bitsquare.css").toExternalForm(); - scene.getStylesheets().setAll(bitsquare); - - stage.show(); - log.debug("Startup: stage displayed"); - } catch (Exception e) - { - stage.show(); - Action response = Popups.openExceptionPopup(e); - if (response == Dialog.Actions.OK) - { - Platform.exit(); - } - } - } - - @Override - public void stop() throws Exception - { - walletFacade.shutDown(); - messageFacade.shutDown(); - - super.stop(); - } -} +package io.bitsquare; + +import com.google.common.base.Throwables; +import com.google.inject.Guice; +import com.google.inject.Injector; +import io.bitsquare.btc.WalletFacade; +import io.bitsquare.di.BitSquareModule; +import io.bitsquare.di.GuiceFXMLLoader; +import io.bitsquare.gui.NavigationItem; +import io.bitsquare.gui.popups.Popups; +import io.bitsquare.locale.Localisation; +import io.bitsquare.msg.MessageFacade; +import io.bitsquare.settings.Settings; +import io.bitsquare.storage.Storage; +import io.bitsquare.user.User; +import io.bitsquare.util.AWTSystemTray; +import io.bitsquare.util.StorageDirectory; +import java.io.File; +import java.io.IOException; +import javafx.application.Application; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Menu; +import javafx.scene.control.MenuBar; +import javafx.scene.control.MenuItem; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class BitSquare extends Application +{ + private static final Logger log = LoggerFactory.getLogger(BitSquare.class); + public static String ID = "bitsquare"; + private static Stage primaryStage; + private WalletFacade walletFacade; + private MessageFacade messageFacade; + + public static void main(String[] args) + { + log.debug("Startup: main"); + if (args != null && args.length > 0) ID = args[0]; + + launch(args); + } + + public static Stage getPrimaryStage() + { + return primaryStage; + } + + @Override + public void start(Stage primaryStage) throws IOException + { + log.trace("Startup: start"); + BitSquare.primaryStage = primaryStage; + + // use a local data dir as default storage dir (can be overwritten in the settings) + // TODO save root preferences always in app dir top get preferred storage location + StorageDirectory.setStorageDirectory(new File(StorageDirectory.getApplicationDirectory().getAbsolutePath() + "/data")); + + Thread.currentThread().setUncaughtExceptionHandler((thread, throwable) -> Popups.handleUncaughtExceptions(Throwables.getRootCause(throwable))); + + // currently there is not SystemTray support for java fx (planned for version 3) so we use the old AWT + AWTSystemTray.createSystemTray(primaryStage); + + final Injector injector = Guice.createInjector(new BitSquareModule()); + + walletFacade = injector.getInstance(WalletFacade.class); + messageFacade = injector.getInstance(MessageFacade.class); + log.trace("Startup: messageFacade, walletFacade inited"); + + // apply stored data + final User user = injector.getInstance(User.class); + final Settings settings = injector.getInstance(Settings.class); + final Storage storage = injector.getInstance(Storage.class); + storage.init(); + user.updateFromStorage((User) storage.read(user.getClass().getName())); + settings.updateFromStorage((Settings) storage.read(settings.getClass().getName())); + + if (ID.isEmpty()) primaryStage.setTitle("BitSquare"); + else primaryStage.setTitle("BitSquare (" + ID + ")"); + + GuiceFXMLLoader.setInjector(injector); + + final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(NavigationItem.MAIN.getFxmlUrl()), Localisation.getResourceBundle()); + final Parent mainView = loader.load(); + BorderPane rootPane = new BorderPane(); + rootPane.setTop(getMenuBar()); + rootPane.setCenter(mainView); + + final Scene scene = new Scene(rootPane, 800, 600); + scene.getStylesheets().setAll(getClass().getResource("/io/bitsquare/gui/bitsquare.css").toExternalForm()); + + setupCloseHandlers(primaryStage, scene); + + primaryStage.setScene(scene); + primaryStage.setMinWidth(800); + primaryStage.setMinHeight(400); + primaryStage.setWidth(800); + primaryStage.setHeight(600); + + primaryStage.show(); + + log.debug("Startup: stage displayed"); + } + + private void setupCloseHandlers(Stage primaryStage, Scene scene) + { + primaryStage.setOnCloseRequest(e -> AWTSystemTray.setStageHidden()); + + KeyCodeCombination keyCodeCombination = new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN); + scene.setOnKeyReleased(keyEvent -> { + if (keyCodeCombination.match(keyEvent)) AWTSystemTray.setStageHidden(); + }); + + } + + private MenuBar getMenuBar() + { + MenuBar menuBar = new MenuBar(); + menuBar.setUseSystemMenuBar(true); + + Menu fileMenu = new Menu("_File"); + fileMenu.setMnemonicParsing(true); + MenuItem backupMenuItem = new MenuItem("Backup wallet"); + fileMenu.getItems().addAll(backupMenuItem); + + Menu settingsMenu = new Menu("_Settings"); + settingsMenu.setMnemonicParsing(true); + MenuItem changePwMenuItem = new MenuItem("Change password"); + settingsMenu.getItems().addAll(changePwMenuItem); + + Menu helpMenu = new Menu("_Help"); + helpMenu.setMnemonicParsing(true); + MenuItem faqMenuItem = new MenuItem("FAQ"); + MenuItem forumMenuItem = new MenuItem("Forum"); + helpMenu.getItems().addAll(faqMenuItem, forumMenuItem); + + menuBar.getMenus().setAll(fileMenu, settingsMenu, helpMenu); + return menuBar; + } + + @Override + public void stop() throws Exception + { + walletFacade.shutDown(); + messageFacade.shutDown(); + + super.stop(); + System.exit(0); + } +} diff --git a/src/main/java/io/bitsquare/btc/BitSquareWalletAppKit.java b/src/main/java/io/bitsquare/btc/BitSquareWalletAppKit.java index 09ca44ad98..5a2926cb17 100644 --- a/src/main/java/io/bitsquare/btc/BitSquareWalletAppKit.java +++ b/src/main/java/io/bitsquare/btc/BitSquareWalletAppKit.java @@ -159,7 +159,6 @@ public class BitSquareWalletAppKit extends WalletAppKit try { BitSquareWalletAppKit.this.stopAsync(); - BitSquareWalletAppKit.this.awaitTerminated(); } catch (Exception e) { diff --git a/src/main/java/io/bitsquare/btc/BlockChainFacade.java b/src/main/java/io/bitsquare/btc/BlockChainFacade.java index 8e937a3725..93c2de4b33 100644 --- a/src/main/java/io/bitsquare/btc/BlockChainFacade.java +++ b/src/main/java/io/bitsquare/btc/BlockChainFacade.java @@ -1,7 +1,7 @@ package io.bitsquare.btc; -import com.google.inject.Inject; import io.bitsquare.bank.BankAccount; +import javax.inject.Inject; /** * That facade delivers blockchain functionality from the bitcoinJ library diff --git a/src/main/java/io/bitsquare/btc/BtcValidator.java b/src/main/java/io/bitsquare/btc/BtcValidator.java index a37bd3a312..2fd5388ced 100644 --- a/src/main/java/io/bitsquare/btc/BtcValidator.java +++ b/src/main/java/io/bitsquare/btc/BtcValidator.java @@ -4,8 +4,8 @@ import com.google.bitcoin.core.Address; import com.google.bitcoin.core.AddressFormatException; import com.google.bitcoin.core.NetworkParameters; import com.google.bitcoin.core.Transaction; -import com.google.inject.Inject; import java.math.BigInteger; +import javax.inject.Inject; public class BtcValidator { diff --git a/src/main/java/io/bitsquare/btc/FeePolicy.java b/src/main/java/io/bitsquare/btc/FeePolicy.java index a39d8c8389..eb1a8d72f9 100644 --- a/src/main/java/io/bitsquare/btc/FeePolicy.java +++ b/src/main/java/io/bitsquare/btc/FeePolicy.java @@ -1,8 +1,8 @@ package io.bitsquare.btc; import com.google.bitcoin.core.*; -import com.google.inject.Inject; import java.math.BigInteger; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/bitsquare/btc/WalletFacade.java b/src/main/java/io/bitsquare/btc/WalletFacade.java index 3ca10f357e..8d64eacfcc 100644 --- a/src/main/java/io/bitsquare/btc/WalletFacade.java +++ b/src/main/java/io/bitsquare/btc/WalletFacade.java @@ -13,7 +13,6 @@ import com.google.common.collect.Lists; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import com.google.inject.Inject; import io.bitsquare.BitSquare; import io.bitsquare.btc.listeners.BalanceListener; import io.bitsquare.btc.listeners.ConfidenceListener; @@ -27,6 +26,7 @@ import java.util.stream.Collectors; import javafx.application.Platform; import javafx.util.Pair; import javax.annotation.concurrent.GuardedBy; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -196,7 +196,6 @@ public class WalletFacade wallet.removeEventListener(walletEventListener); walletAppKit.stopAsync(); - walletAppKit.awaitTerminated(); } public Wallet getWallet() @@ -272,12 +271,10 @@ public class WalletFacade } - AddressEntry getUnusedTradeAddressInfo() + public AddressEntry getUnusedTradeAddressInfo() { List filteredList = Lists.newArrayList(Collections2.filter(ImmutableList.copyOf(addressEntryList), - addressInfo -> (addressInfo != null && addressInfo.getAddressContext() - .equals(AddressEntry.AddressContext.TRADE) && addressInfo - .getTradeId() == null))); + e -> (e != null && e.getAddressContext().equals(AddressEntry.AddressContext.TRADE) && e.getTradeId() == null))); if (filteredList != null && !filteredList.isEmpty()) { @@ -293,9 +290,7 @@ public class WalletFacade private AddressEntry getAddressInfoByAddressContext(AddressEntry.AddressContext addressContext) { List filteredList = Lists.newArrayList(Collections2.filter(ImmutableList.copyOf(addressEntryList), - addressInfo -> (addressInfo != null && addressInfo.getAddressContext() != null && addressInfo.getAddressContext() - .equals(addressContext) - ))); + e -> (e != null && e.getAddressContext() != null && e.getAddressContext().equals(addressContext)))); if (filteredList != null && !filteredList.isEmpty()) { @@ -363,18 +358,16 @@ public class WalletFacade for (AddressEntry addressEntry : addressEntryList) { if (addressEntry.getAddressString().equals(address)) - { return addressEntry; - } } return null; } + /////////////////////////////////////////////////////////////////////////////////////////// // TransactionConfidence /////////////////////////////////////////////////////////////////////////////////////////// - public TransactionConfidence getConfidenceForAddress(Address address) { List transactionConfidenceList = new ArrayList<>(); diff --git a/src/main/java/io/bitsquare/crypto/CryptoFacade.java b/src/main/java/io/bitsquare/crypto/CryptoFacade.java index de6cec609a..f4bf25a049 100644 --- a/src/main/java/io/bitsquare/crypto/CryptoFacade.java +++ b/src/main/java/io/bitsquare/crypto/CryptoFacade.java @@ -3,8 +3,8 @@ package io.bitsquare.crypto; import com.google.bitcoin.core.ECKey; import com.google.bitcoin.core.Utils; import com.google.common.base.Charsets; -import com.google.inject.Inject; import java.security.SignatureException; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/bitsquare/di/BitSquareModule.java b/src/main/java/io/bitsquare/di/BitSquareModule.java index 3dfdac3e2f..37a971b055 100644 --- a/src/main/java/io/bitsquare/di/BitSquareModule.java +++ b/src/main/java/io/bitsquare/di/BitSquareModule.java @@ -6,7 +6,6 @@ import com.google.bitcoin.params.MainNetParams; import com.google.bitcoin.params.RegTestParams; import com.google.bitcoin.params.TestNet3Params; import com.google.inject.AbstractModule; -import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.name.Named; import com.google.inject.name.Names; @@ -22,7 +21,8 @@ import io.bitsquare.trade.Trading; import io.bitsquare.trade.orderbook.OrderBook; import io.bitsquare.trade.orderbook.OrderBookFilter; import io.bitsquare.user.User; -import io.bitsquare.util.FileUtil; +import io.bitsquare.util.StorageDirectory; +import javax.inject.Inject; public class BitSquareModule extends AbstractModule { @@ -68,7 +68,7 @@ class BitSquareWalletAppKitProvider implements Provider public BitSquareWalletAppKit get() { - return new BitSquareWalletAppKit(networkParameters, FileUtil.getRootDirectory()); + return new BitSquareWalletAppKit(networkParameters, StorageDirectory.getStorageDirectory()); } } diff --git a/src/main/java/io/bitsquare/gui/MainController.java b/src/main/java/io/bitsquare/gui/MainController.java index c86cdf7f2d..cbacdc592c 100644 --- a/src/main/java/io/bitsquare/gui/MainController.java +++ b/src/main/java/io/bitsquare/gui/MainController.java @@ -1,6 +1,5 @@ package io.bitsquare.gui; -import com.google.inject.Inject; import io.bitsquare.bank.BankAccount; import io.bitsquare.btc.BtcFormatter; import io.bitsquare.btc.WalletFacade; @@ -35,6 +34,7 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.util.StringConverter; +import javax.inject.Inject; import net.tomp2p.peers.PeerAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -175,6 +175,7 @@ public class MainController implements Initializable, NavigationController private void init() { + messageFacade.init(); trading.addTakeOfferRequestListener(this::onTakeOfferRequested); @@ -196,7 +197,7 @@ public class MainController implements Initializable, NavigationController walletFacade.initWallet(); - buildNavigation(); + addNavigation(); Transitions.fadeOutAndRemove(loadingLabel); Transitions.fadeOutAndRemove(loadingBar); @@ -214,7 +215,6 @@ public class MainController implements Initializable, NavigationController navigateToView(selectedNavigationItem); } - private void onTakeOfferRequested(String offerId, PeerAddress sender) { final Button alertButton = new Button("", Icons.getIconImageView(Icons.MSG_ALERT)); @@ -228,7 +228,7 @@ public class MainController implements Initializable, NavigationController ordersButtonButtonHolder.getChildren().add(alertButton); } - private void buildNavigation() + private void addNavigation() { homeButton = addNavButton(leftNavPane, "Overview", NavigationItem.HOME); diff --git a/src/main/java/io/bitsquare/gui/MainView.fxml b/src/main/java/io/bitsquare/gui/MainView.fxml index 72b7168b06..f68e1d896d 100644 --- a/src/main/java/io/bitsquare/gui/MainView.fxml +++ b/src/main/java/io/bitsquare/gui/MainView.fxml @@ -4,8 +4,8 @@ - + diff --git a/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java b/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java index 02aed20303..3220ff867d 100644 --- a/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java +++ b/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java @@ -1,6 +1,5 @@ package io.bitsquare.gui.arbitrators.overview; -import com.google.inject.Inject; import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.gui.ChildController; import io.bitsquare.gui.NavigationController; @@ -26,6 +25,7 @@ import javafx.scene.control.Button; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.stage.Stage; +import javax.inject.Inject; import net.tomp2p.peers.Number160; import net.tomp2p.storage.Data; diff --git a/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java b/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java index b11ea135f6..161d47dea8 100644 --- a/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java +++ b/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java @@ -1,6 +1,5 @@ package io.bitsquare.gui.arbitrators.profile; -import com.google.inject.Inject; import io.bitsquare.gui.ChildController; import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.util.BitSquareFormatter; @@ -14,6 +13,7 @@ import javafx.fxml.Initializable; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; +import javax.inject.Inject; @SuppressWarnings("ALL") public class ArbitratorProfileController implements Initializable, ChildController diff --git a/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java b/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java index d55c0c3c4a..a26e1d25a3 100644 --- a/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java +++ b/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java @@ -5,7 +5,6 @@ import com.google.bitcoin.core.Transaction; import com.google.bitcoin.core.Wallet; import com.google.bitcoin.core.WalletEventListener; import com.google.bitcoin.script.Script; -import com.google.inject.Inject; import de.jensd.fx.fontawesome.AwesomeDude; import de.jensd.fx.fontawesome.AwesomeIcon; import io.bitsquare.btc.WalletFacade; @@ -37,6 +36,7 @@ import javafx.scene.input.ClipboardContent; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; import javafx.util.StringConverter; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/bitsquare/gui/bitsquare.css b/src/main/java/io/bitsquare/gui/bitsquare.css index be87fffb36..e33b5b5baf 100644 --- a/src/main/java/io/bitsquare/gui/bitsquare.css +++ b/src/main/java/io/bitsquare/gui/bitsquare.css @@ -71,6 +71,16 @@ -fx-background-color: transparent; } +#copy-icon { + -fx-fill: black; + -fx-cursor: hand; + } + +#copy-icon .hover{ + -fx-fill: #0096c9; + -fx-cursor: hand; +} + .copy-icon { -fx-fill: #0096c9; -fx-cursor: hand; diff --git a/src/main/java/io/bitsquare/gui/components/btc/AddressTextField.java b/src/main/java/io/bitsquare/gui/components/btc/AddressTextField.java new file mode 100644 index 0000000000..cf4143cdb9 --- /dev/null +++ b/src/main/java/io/bitsquare/gui/components/btc/AddressTextField.java @@ -0,0 +1,65 @@ +package io.bitsquare.gui.components.btc; + +import de.jensd.fx.fontawesome.AwesomeDude; +import de.jensd.fx.fontawesome.AwesomeIcon; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.control.Tooltip; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; +import javafx.scene.layout.AnchorPane; + +public class AddressTextField extends AnchorPane +{ + private final Label copyIcon; + private final TextField addressTextField; + private String address; + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + public AddressTextField() + { + addressTextField = new TextField(); + addressTextField.setEditable(false); + + copyIcon = new Label(); + copyIcon.setLayoutY(3); + copyIcon.setOnMouseClicked(e -> { + if (address != null && address.length() > 0) + { + Clipboard clipboard = Clipboard.getSystemClipboard(); + ClipboardContent content = new ClipboardContent(); + content.putString(address); + clipboard.setContent(content); + } + }); + + Tooltip copyIconTooltip = new Tooltip("Copy address to clipboard"); + Tooltip.install(copyIcon, copyIconTooltip); + + + AwesomeDude.setIcon(copyIcon, AwesomeIcon.COPY); + copyIcon.setId("copy-icon"); + + AnchorPane.setRightAnchor(copyIcon, 5.0); + AnchorPane.setRightAnchor(addressTextField, 35.0); + AnchorPane.setLeftAnchor(addressTextField, 0.0); + + getChildren().addAll(addressTextField, copyIcon); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Setters + /////////////////////////////////////////////////////////////////////////////////////////// + + + public void setAddress(String address) + { + this.address = address; + addressTextField.setText(address); + } + +} diff --git a/src/main/java/io/bitsquare/gui/components/btc/BalanceTextField.java b/src/main/java/io/bitsquare/gui/components/btc/BalanceTextField.java new file mode 100644 index 0000000000..e4ffd20cb8 --- /dev/null +++ b/src/main/java/io/bitsquare/gui/components/btc/BalanceTextField.java @@ -0,0 +1,143 @@ +package io.bitsquare.gui.components.btc; + +import com.google.bitcoin.core.Address; +import com.google.bitcoin.core.TransactionConfidence; +import io.bitsquare.btc.BtcFormatter; +import io.bitsquare.btc.WalletFacade; +import io.bitsquare.btc.listeners.BalanceListener; +import io.bitsquare.btc.listeners.ConfidenceListener; +import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; +import java.math.BigInteger; +import javafx.scene.control.TextField; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.AnchorPane; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BalanceTextField extends AnchorPane +{ + private static final Logger log = LoggerFactory.getLogger(BalanceTextField.class); + + private final TextField balanceTextField; + private Address address; + private final Tooltip progressIndicatorTooltip; + private final ConfidenceProgressIndicator progressIndicator; + private WalletFacade walletFacade; + private ConfidenceListener confidenceListener; + private BalanceListener balanceListener; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + public BalanceTextField() + { + balanceTextField = new TextField(); + balanceTextField.setEditable(false); + + progressIndicator = new ConfidenceProgressIndicator(); + progressIndicator.setPrefSize(24, 24); + progressIndicator.setId("funds-confidence"); + progressIndicator.setLayoutY(1); + progressIndicator.setProgress(0); + progressIndicator.setVisible(false); + + progressIndicatorTooltip = new Tooltip("-"); + Tooltip.install(progressIndicator, progressIndicatorTooltip); + + AnchorPane.setRightAnchor(progressIndicator, 0.0); + AnchorPane.setRightAnchor(balanceTextField, 35.0); + AnchorPane.setLeftAnchor(balanceTextField, 0.0); + + getChildren().addAll(balanceTextField, progressIndicator); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Setters + /////////////////////////////////////////////////////////////////////////////////////////// + + public void setAddress(Address address) + { + this.address = address; + } + + public void setWalletFacade(WalletFacade walletFacade) + { + this.walletFacade = walletFacade; + confidenceListener = walletFacade.addConfidenceListener(new ConfidenceListener(address) + { + @Override + public void onTransactionConfidenceChanged(TransactionConfidence confidence) + { + updateConfidence(confidence); + } + }); + updateConfidence(walletFacade.getConfidenceForAddress(address)); + + + balanceListener = walletFacade.addBalanceListener(new BalanceListener(address) + { + @Override + public void onBalanceChanged(BigInteger balance) + { + updateBalance(balance); + } + }); + updateBalance(walletFacade.getBalanceForAddress(address)); + } + + // TODO not called yet... + public void cleanup() + { + walletFacade.removeConfidenceListener(confidenceListener); + walletFacade.removeBalanceListener(balanceListener); + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private methods + /////////////////////////////////////////////////////////////////////////////////////////// + + + private void updateConfidence(TransactionConfidence confidence) + { + if (confidence != null) + { + switch (confidence.getConfidenceType()) + { + case UNKNOWN: + progressIndicatorTooltip.setText("Unknown transaction status"); + progressIndicator.setProgress(0); + break; + case PENDING: + progressIndicatorTooltip.setText("Seen by " + confidence.numBroadcastPeers() + " peer(s) / 0 confirmations"); + progressIndicator.setProgress(-1.0); + break; + case BUILDING: + progressIndicatorTooltip.setText("Confirmed in " + confidence.getDepthInBlocks() + " block(s)"); + progressIndicator.setProgress(Math.min(1, (double) confidence.getDepthInBlocks() / 6.0)); + break; + case DEAD: + progressIndicatorTooltip.setText("Transaction is invalid."); + progressIndicator.setProgress(0); + break; + } + + if (progressIndicator.getProgress() != 0) + { + progressIndicator.setVisible(true); + AnchorPane.setRightAnchor(progressIndicator, 0.0); + AnchorPane.setRightAnchor(balanceTextField, 35.0); + } + } + } + + private void updateBalance(BigInteger balance) + { + if (balance != null) + { + balanceTextField.setText(BtcFormatter.formatSatoshis(balance)); + } + } +} diff --git a/src/main/java/io/bitsquare/gui/funds/FundsController.java b/src/main/java/io/bitsquare/gui/funds/FundsController.java index ddfcfa7a34..0946496ee7 100644 --- a/src/main/java/io/bitsquare/gui/funds/FundsController.java +++ b/src/main/java/io/bitsquare/gui/funds/FundsController.java @@ -1,6 +1,5 @@ package io.bitsquare.gui.funds; -import com.google.inject.Inject; import io.bitsquare.gui.ChildController; import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem; @@ -10,6 +9,7 @@ import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/bitsquare/gui/funds/deposit/DepositController.java b/src/main/java/io/bitsquare/gui/funds/deposit/DepositController.java index 2c8f9ba8d4..25fcb57768 100644 --- a/src/main/java/io/bitsquare/gui/funds/deposit/DepositController.java +++ b/src/main/java/io/bitsquare/gui/funds/deposit/DepositController.java @@ -1,6 +1,5 @@ package io.bitsquare.gui.funds.deposit; -import com.google.inject.Inject; import de.jensd.fx.fontawesome.AwesomeDude; import de.jensd.fx.fontawesome.AwesomeIcon; import io.bitsquare.btc.AddressEntry; @@ -21,6 +20,7 @@ import javafx.scene.control.*; import javafx.scene.input.Clipboard; import javafx.scene.input.ClipboardContent; import javafx.util.Callback; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/bitsquare/gui/funds/transactions/TransactionsController.java b/src/main/java/io/bitsquare/gui/funds/transactions/TransactionsController.java index 6e74044fea..d04fb93bbe 100644 --- a/src/main/java/io/bitsquare/gui/funds/transactions/TransactionsController.java +++ b/src/main/java/io/bitsquare/gui/funds/transactions/TransactionsController.java @@ -1,7 +1,6 @@ package io.bitsquare.gui.funds.transactions; import com.google.bitcoin.core.Transaction; -import com.google.inject.Inject; import io.bitsquare.btc.WalletFacade; import io.bitsquare.gui.ChildController; import io.bitsquare.gui.Hibernate; @@ -17,6 +16,7 @@ import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.*; import javafx.util.Callback; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalController.java b/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalController.java index b4c0fc3eee..41b6ed2703 100644 --- a/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalController.java +++ b/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalController.java @@ -4,7 +4,6 @@ import com.google.bitcoin.core.AddressFormatException; import com.google.bitcoin.core.InsufficientMoneyException; import com.google.bitcoin.core.Transaction; import com.google.common.util.concurrent.FutureCallback; -import com.google.inject.Inject; import de.jensd.fx.fontawesome.AwesomeDude; import de.jensd.fx.fontawesome.AwesomeIcon; import io.bitsquare.btc.*; @@ -27,6 +26,7 @@ import javafx.scene.control.*; import javafx.scene.input.Clipboard; import javafx.scene.input.ClipboardContent; import javafx.util.Callback; +import javax.inject.Inject; import org.controlsfx.control.action.Action; import org.controlsfx.dialog.Dialog; import org.slf4j.Logger; diff --git a/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalListItem.java b/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalListItem.java index aa0124a672..05ff1aa395 100644 --- a/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalListItem.java +++ b/src/main/java/io/bitsquare/gui/funds/withdrawal/WithdrawalListItem.java @@ -43,8 +43,7 @@ public class WithdrawalListItem progressIndicator.setId("funds-confidence"); tooltip = new Tooltip("Not used yet"); progressIndicator.setProgress(0); - progressIndicator.setPrefHeight(30); - progressIndicator.setPrefWidth(30); + progressIndicator.setPrefSize(24, 24); Tooltip.install(progressIndicator, tooltip); confidenceListener = walletFacade.addConfidenceListener(new ConfidenceListener(getAddress()) @@ -112,8 +111,6 @@ public class WithdrawalListItem progressIndicator.setProgress(0); break; } - - progressIndicator.setPrefSize(24, 24); } } diff --git a/src/main/java/io/bitsquare/gui/home/HomeController.java b/src/main/java/io/bitsquare/gui/home/HomeController.java index 91f9537857..cd6bcef421 100644 --- a/src/main/java/io/bitsquare/gui/home/HomeController.java +++ b/src/main/java/io/bitsquare/gui/home/HomeController.java @@ -61,7 +61,7 @@ public class HomeController implements Initializable, ChildController, Navigatio arbitratorRegistrationController = loader.getController(); arbitratorRegistrationController.setNavigationController(this); - final Stage rootStage = BitSquare.getStage(); + final Stage rootStage = BitSquare.getPrimaryStage(); final Stage stage = new Stage(); stage.setTitle("Arbitrator"); stage.setMinWidth(800); diff --git a/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferController.java b/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferController.java index 9efb9b3898..6d32155f4d 100644 --- a/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferController.java +++ b/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferController.java @@ -3,8 +3,8 @@ package io.bitsquare.gui.market.createOffer; import com.google.bitcoin.core.InsufficientMoneyException; import com.google.bitcoin.core.Transaction; import com.google.common.util.concurrent.FutureCallback; -import com.google.inject.Inject; import io.bitsquare.bank.BankAccount; +import io.bitsquare.btc.AddressEntry; import io.bitsquare.btc.BtcFormatter; import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.WalletFacade; @@ -12,6 +12,8 @@ import io.bitsquare.gui.ChildController; import io.bitsquare.gui.Hibernate; import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem; +import io.bitsquare.gui.components.btc.AddressTextField; +import io.bitsquare.gui.components.btc.BalanceTextField; import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; import io.bitsquare.gui.popups.Popups; import io.bitsquare.gui.util.BitSquareConverter; @@ -36,6 +38,8 @@ import javafx.scene.control.Label; import javafx.scene.control.TabPane; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; +import javax.inject.Inject; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,22 +48,21 @@ public class CreateOfferController implements Initializable, ChildController, Hi private static final Logger log = LoggerFactory.getLogger(CreateOfferController.class); private final Trading trading; - private final WalletFacade walletFacade; - private final Settings settings; - private final User user; + private NavigationController navigationController; private Direction direction; private Offer offer; + private AddressEntry addressEntry; @FXML private AnchorPane rootContainer; @FXML private Label buyLabel, placeOfferTitle, confirmationLabel, txTitleLabel; @FXML - private TextField volumeTextField, amountTextField, priceTextField; + private TextField volumeTextField, amountTextField, priceTextField, totalTextField; @FXML private Button placeOfferButton, closeButton; @FXML @@ -67,7 +70,8 @@ public class CreateOfferController implements Initializable, ChildController, Hi acceptedLanguagesTextField, feeLabel, txTextField; @FXML private ConfidenceProgressIndicator progressIndicator; - + @FXML private AddressTextField addressTextField; + @FXML private BalanceTextField balanceTextField; /////////////////////////////////////////////////////////////////////////////////////////// // Constructor @@ -96,7 +100,7 @@ public class CreateOfferController implements Initializable, ChildController, Hi buyLabel.setText(BitSquareFormatter.formatDirection(direction, false) + ":"); collateralTextField.setText(BitSquareFormatter.formatVolume(settings.getMinCollateral())); updateVolume(); - + updateTotals(); //TODO //amountTextField.setText("" + (int) (new Random().nextDouble() * 100 / 10 + 1)); @@ -105,8 +109,12 @@ public class CreateOfferController implements Initializable, ChildController, Hi minAmountTextField.setText("0,1"); collateralTextField.setText("10"); updateVolume(); + updateTotals(); - amountTextField.textProperty().addListener((observable, oldValue, newValue) -> updateVolume()); + amountTextField.textProperty().addListener((observable, oldValue, newValue) -> { + updateVolume(); + updateTotals(); + }); priceTextField.textProperty().addListener((observable, oldValue, newValue) -> updateVolume()); } @@ -128,6 +136,12 @@ public class CreateOfferController implements Initializable, ChildController, Hi acceptedCountriesTextField.setText(BitSquareFormatter.countryLocalesToString(settings.getAcceptedCountries())); acceptedLanguagesTextField.setText(BitSquareFormatter.languageLocalesToString(settings.getAcceptedLanguageLocales())); feeLabel.setText(BtcFormatter.formatSatoshis(FeePolicy.CREATE_OFFER_FEE)); + + addressEntry = walletFacade.getUnusedTradeAddressInfo(); + addressTextField.setAddress(addressEntry.getAddress().toString()); + + balanceTextField.setAddress(addressEntry.getAddress()); + balanceTextField.setWalletFacade(walletFacade); } @@ -201,6 +215,7 @@ public class CreateOfferController implements Initializable, ChildController, Hi settings.getAcceptedCountries(), settings.getAcceptedLanguageLocales()); + addressEntry.setTradeId(offer.getId()); try { @@ -215,7 +230,7 @@ public class CreateOfferController implements Initializable, ChildController, Hi offer.setOfferFeePaymentTxID(transaction.getHashAsString()); setupSuccessScreen(transaction); - placeOfferTitle.setText("Transaction sent:"); + // placeOfferTitle.setText("Transaction sent:"); try { trading.addOffer(offer); @@ -227,7 +242,7 @@ public class CreateOfferController implements Initializable, ChildController, Hi } @Override - public void onFailure(Throwable t) + public void onFailure(@NotNull Throwable t) { log.warn("sendResult onFailure:" + t); Popups.openErrorPopup("Fee payment failed", "Fee payment failed. " + t); @@ -267,8 +282,16 @@ public class CreateOfferController implements Initializable, ChildController, Hi closeButton.setVisible(true); txTextField.setText(newTransaction.getHashAsString()); + } - // ConfidenceDisplay confidenceDisplay = new ConfidenceDisplay(walletFacade.getWallet(), confirmationLabel, newTransaction, progressIndicator); + private void updateTotals() + { + double amountAsDouble = BitSquareConverter.stringToDouble(amountTextField.getText()); + double collateralPercentAsDouble = BitSquareConverter.stringToDouble(collateralTextField.getText()); + double collateralAmountAsDouble = collateralPercentAsDouble * amountAsDouble / 100; + BigInteger collateral = BtcFormatter.doubleValueToSatoshis(collateralAmountAsDouble); + BigInteger totals = FeePolicy.CREATE_OFFER_FEE.add(collateral); + totalTextField.setText(BtcFormatter.formatSatoshis(totals)); } private void updateVolume() diff --git a/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferView.fxml b/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferView.fxml index d3cd63f4e2..57032d327d 100644 --- a/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferView.fxml +++ b/src/main/java/io/bitsquare/gui/market/createOffer/CreateOfferView.fxml @@ -1,5 +1,7 @@ + + @@ -8,6 +10,7 @@ AnchorPane.topAnchor="10.0" xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.market.createOffer.CreateOfferController"> +