From 33e8a8f92193eacbb2db47165deaac3b7e6ed1a2 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 15 Sep 2014 23:08:03 +0200 Subject: [PATCH] Refactor navigation handling --- .../java/io/bitsquare/gui/NavigationItem.java | 71 ++++---- .../io/bitsquare/gui/NavigationListener.java | 22 --- .../io/bitsquare/gui/NavigationManager.java | 58 +++++-- src/main/java/io/bitsquare/gui/ViewCB.java | 2 +- .../io/bitsquare/gui/main/MainViewCB.java | 27 +-- .../gui/main/account/AccountViewCB.java | 48 +++--- .../restrictions/RestrictionsViewCB.java | 8 +- .../settings/AccountSettingsViewCB.java | 145 ++++++++-------- .../account/setup/AccountSetupViewCB.java | 70 ++++---- .../main/orders/offer/OfferController.java | 2 +- .../pending/PendingTradeController.java | 4 +- .../bitsquare/gui/main/trade/BuyViewCB.java | 6 +- .../gui/main/trade/OrderBookInfo.java | 11 ++ .../bitsquare/gui/main/trade/SellViewCB.java | 6 +- .../bitsquare/gui/main/trade/TradeViewCB.java | 53 +++--- .../trade/createoffer/CreateOfferViewCB.java | 3 +- .../main/trade/orderbook/OrderBookViewCB.java | 160 ++++++++---------- .../trade/takeoffer/TakeOfferController.java | 10 +- .../java/io/bitsquare/gui/util/ImageUtil.java | 14 +- .../java/io/bitsquare/locale/BSResources.java | 2 +- .../java/io/bitsquare/msg/MessageFacade.java | 2 +- 21 files changed, 375 insertions(+), 349 deletions(-) delete mode 100644 src/main/java/io/bitsquare/gui/NavigationListener.java diff --git a/src/main/java/io/bitsquare/gui/NavigationItem.java b/src/main/java/io/bitsquare/gui/NavigationItem.java index b2c45641be..58e30585d4 100644 --- a/src/main/java/io/bitsquare/gui/NavigationItem.java +++ b/src/main/java/io/bitsquare/gui/NavigationItem.java @@ -25,21 +25,21 @@ public enum NavigationItem { // Application /////////////////////////////////////////////////////////////////////////////////////////// - MAIN(0, "/io/bitsquare/gui/main/MainView.fxml"), + MAIN("/io/bitsquare/gui/main/MainView.fxml"), /////////////////////////////////////////////////////////////////////////////////////////// // Main menu screens /////////////////////////////////////////////////////////////////////////////////////////// - HOME(1, "/io/bitsquare/gui/main/home/HomeView.fxml", ImageUtil.HOME, ImageUtil.HOME_ACTIVE), - BUY(1, "/io/bitsquare/gui/main/trade/BuyView.fxml", ImageUtil.NAV_BUY, ImageUtil.NAV_BUY_ACTIVE), - SELL(1, "/io/bitsquare/gui/main/trade/SellView.fxml", ImageUtil.NAV_SELL, ImageUtil.NAV_SELL_ACTIVE), - ORDERS(1, "/io/bitsquare/gui/main/orders/OrdersView.fxml", ImageUtil.ORDERS, ImageUtil.ORDERS_ACTIVE), - FUNDS(1, "/io/bitsquare/gui/main/funds/FundsView.fxml", ImageUtil.FUNDS, ImageUtil.FUNDS_ACTIVE), - MSG(1, "/io/bitsquare/gui/main/msg/MsgView.fxml", ImageUtil.MSG, ImageUtil.MSG_ACTIVE), - SETTINGS(1, "/io/bitsquare/gui/main/settings/SettingsView.fxml", ImageUtil.SETTINGS, ImageUtil.SETTINGS_ACTIVE), - ACCOUNT(1, "/io/bitsquare/gui/main/account/AccountView.fxml", ImageUtil.ACCOUNT, ImageUtil.ACCOUNT_ACTIVE), + HOME("/io/bitsquare/gui/main/home/HomeView.fxml", ImageUtil.HOME, ImageUtil.HOME_ACTIVE), + BUY("/io/bitsquare/gui/main/trade/BuyView.fxml", ImageUtil.BUY, ImageUtil.BUY_ACTIVE), + SELL("/io/bitsquare/gui/main/trade/SellView.fxml", ImageUtil.SELL, ImageUtil.SELL_ACTIVE), + ORDERS("/io/bitsquare/gui/main/orders/OrdersView.fxml", ImageUtil.ORDERS, ImageUtil.ORDERS_ACTIVE), + FUNDS("/io/bitsquare/gui/main/funds/FundsView.fxml", ImageUtil.FUNDS, ImageUtil.FUNDS_ACTIVE), + MSG("/io/bitsquare/gui/main/msg/MsgView.fxml", ImageUtil.MSG, ImageUtil.MSG_ACTIVE), + SETTINGS("/io/bitsquare/gui/main/settings/SettingsView.fxml", ImageUtil.SETTINGS, ImageUtil.SETTINGS_ACTIVE), + ACCOUNT("/io/bitsquare/gui/main/account/AccountView.fxml", ImageUtil.ACCOUNT, ImageUtil.ACCOUNT_ACTIVE), /////////////////////////////////////////////////////////////////////////////////////////// @@ -47,23 +47,23 @@ public enum NavigationItem { /////////////////////////////////////////////////////////////////////////////////////////// // buy/sell (trade) - ORDER_BOOK(2, "/io/bitsquare/gui/main/trade/orderbook/OrderBookView.fxml"), - CREATE_OFFER(2, "/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.fxml"), - TAKE_OFFER(2, "/io/bitsquare/gui/main/trade/takeoffer/TakeOfferView.fxml"), + ORDER_BOOK("/io/bitsquare/gui/main/trade/orderbook/OrderBookView.fxml"), + CREATE_OFFER("/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.fxml"), + TAKE_OFFER("/io/bitsquare/gui/main/trade/takeoffer/TakeOfferView.fxml"), // orders - OFFER(2, "/io/bitsquare/gui/main/orders/offer/OfferView.fxml"), - PENDING_TRADE(2, "/io/bitsquare/gui/main/orders/pending/PendingTradeView.fxml"), - CLOSED_TRADE(2, "/io/bitsquare/gui/main/orders/closed/ClosedTradeView.fxml"), + OFFER("/io/bitsquare/gui/main/orders/offer/OfferView.fxml"), + PENDING_TRADE("/io/bitsquare/gui/main/orders/pending/PendingTradeView.fxml"), + CLOSED_TRADE("/io/bitsquare/gui/main/orders/closed/ClosedTradeView.fxml"), // funds - DEPOSIT(2, "/io/bitsquare/gui/main/funds/deposit/DepositView.fxml"), - WITHDRAWAL(2, "/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.fxml"), - TRANSACTIONS(2, "/io/bitsquare/gui/main/funds/transactions/TransactionsView.fxml"), + DEPOSIT("/io/bitsquare/gui/main/funds/deposit/DepositView.fxml"), + WITHDRAWAL("/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.fxml"), + TRANSACTIONS("/io/bitsquare/gui/main/funds/transactions/TransactionsView.fxml"), // account - ACCOUNT_SETUP(2, "/io/bitsquare/gui/main/account/setup/AccountSetupView.fxml"), - ACCOUNT_SETTINGS(2, "/io/bitsquare/gui/main/account/settings/AccountSettingsView.fxml"), + ACCOUNT_SETUP("/io/bitsquare/gui/main/account/setup/AccountSetupView.fxml"), + ACCOUNT_SETTINGS("/io/bitsquare/gui/main/account/settings/AccountSettingsView.fxml"), /////////////////////////////////////////////////////////////////////////////////////////// @@ -71,12 +71,12 @@ public enum NavigationItem { /////////////////////////////////////////////////////////////////////////////////////////// // account content - SEED_WORDS(3, "/io/bitsquare/gui/main/account/content/seedwords/SeedWordsView.fxml"), - ADD_PASSWORD(3, "/io/bitsquare/gui/main/account/content/password/PasswordView.fxml"), - CHANGE_PASSWORD(3, "/io/bitsquare/gui/main/account/content/password/PasswordView.fxml"), - RESTRICTIONS(3, "/io/bitsquare/gui/main/account/content/restrictions/RestrictionsView.fxml"), - REGISTRATION(3, "/io/bitsquare/gui/main/account/content/registration/RegistrationView.fxml"), - FIAT_ACCOUNT(3, "/io/bitsquare/gui/main/account/content/fiat/FiatAccountView.fxml"), + SEED_WORDS("/io/bitsquare/gui/main/account/content/seedwords/SeedWordsView.fxml"), + ADD_PASSWORD("/io/bitsquare/gui/main/account/content/password/PasswordView.fxml"), + CHANGE_PASSWORD("/io/bitsquare/gui/main/account/content/password/PasswordView.fxml"), + RESTRICTIONS("/io/bitsquare/gui/main/account/content/restrictions/RestrictionsView.fxml"), + REGISTRATION("/io/bitsquare/gui/main/account/content/registration/RegistrationView.fxml"), + FIAT_ACCOUNT("/io/bitsquare/gui/main/account/content/fiat/FiatAccountView.fxml"), /////////////////////////////////////////////////////////////////////////////////////////// @@ -84,39 +84,30 @@ public enum NavigationItem { /////////////////////////////////////////////////////////////////////////////////////////// // arbitrator - ARBITRATOR_PROFILE(2, "/io/bitsquare/gui/main/arbitrators/profile/ArbitratorProfileView.fxml"), - ARBITRATOR_BROWSER(-1, "/io/bitsquare/gui/main/arbitrators/browser/ArbitratorBrowserView.fxml"), - ARBITRATOR_REGISTRATION(-1, "/io/bitsquare/gui/main/arbitrators/registration/ArbitratorRegistrationView.fxml"); + ARBITRATOR_PROFILE("/io/bitsquare/gui/main/arbitrators/profile/ArbitratorProfileView.fxml"), + ARBITRATOR_BROWSER("/io/bitsquare/gui/main/arbitrators/browser/ArbitratorBrowserView.fxml"), + ARBITRATOR_REGISTRATION("/io/bitsquare/gui/main/arbitrators/registration/ArbitratorRegistrationView.fxml"); - private int level; private final String fxmlUrl; private String icon; private String activeIcon; /** - * @param level The navigation hierarchy depth. 0 is main app level, 1 is main menu items, 2 is sub-menus, - * 3 content in sub-menus, -1 is popup window * @param fxmlUrl * @param icon * @param activeIcon */ - NavigationItem(int level, String fxmlUrl, String icon, String activeIcon) { - this.level = level; + NavigationItem(String fxmlUrl, String icon, String activeIcon) { this.fxmlUrl = fxmlUrl; this.icon = icon; this.activeIcon = activeIcon; } - NavigationItem(int level, String fxmlUrl) { - this.level = level; + NavigationItem(String fxmlUrl) { this.fxmlUrl = fxmlUrl; } - public int getLevel() { - return level; - } - public String getFxmlUrl() { return fxmlUrl; } diff --git a/src/main/java/io/bitsquare/gui/NavigationListener.java b/src/main/java/io/bitsquare/gui/NavigationListener.java deleted file mode 100644 index 442f385ec5..0000000000 --- a/src/main/java/io/bitsquare/gui/NavigationListener.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * This file is part of Bitsquare. - * - * Bitsquare is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bitsquare is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bitsquare. If not, see . - */ - -package io.bitsquare.gui; - -public interface NavigationListener { - public void navigate(NavigationItem navigationItem); -} diff --git a/src/main/java/io/bitsquare/gui/NavigationManager.java b/src/main/java/io/bitsquare/gui/NavigationManager.java index ac85c80236..46f93efbb3 100644 --- a/src/main/java/io/bitsquare/gui/NavigationManager.java +++ b/src/main/java/io/bitsquare/gui/NavigationManager.java @@ -22,27 +22,34 @@ import io.bitsquare.persistence.Persistence; import com.google.inject.Inject; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NavigationManager { private static final Logger log = LoggerFactory.getLogger(NavigationManager.class); - private Persistence persistence; /////////////////////////////////////////////////////////////////////////////////////////// // Interface /////////////////////////////////////////////////////////////////////////////////////////// - public interface NavigationListener { + public interface Listener { void onNavigationRequested(NavigationItem... navigationItems); } - private List listeners = new ArrayList<>(); - private NavigationItem[] previousMainNavigationItems; + // New listeners can be added during iteration so we use CopyOnWriteArrayList to prevent invalid array + // modification + private List listeners = new CopyOnWriteArrayList<>(); + private Persistence persistence; private NavigationItem[] currentNavigationItems; + // Used for returning to the last important view + // After setup is done we want to return to the last opened view (e.g. sell/buy) + private NavigationItem[] navigationItemsForReturning; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor @@ -58,18 +65,38 @@ public class NavigationManager { /////////////////////////////////////////////////////////////////////////////////////////// public void navigationTo(NavigationItem... navigationItems) { - previousMainNavigationItems = currentNavigationItems; + log.trace("navigationTo " + Arrays.asList(navigationItems).toString()); + List temp = new ArrayList<>(); + for (int i = 0; i < navigationItems.length; i++) { + NavigationItem item = navigationItems[i]; + temp.add(item); + if (currentNavigationItems == null || + (currentNavigationItems != null && + currentNavigationItems.length > i && + item != currentNavigationItems[i] && + i != navigationItems.length - 1)) { + List temp2 = new ArrayList<>(temp); + for (int n = i + 1; n < navigationItems.length; n++) { + NavigationItem[] newTemp = new NavigationItem[i + 1]; + currentNavigationItems = temp2.toArray(newTemp); + navigationTo(currentNavigationItems); + item = navigationItems[n]; + temp2.add(item); + } + } + } currentNavigationItems = navigationItems; persistence.write(this, "navigationItems", navigationItems); - + log.trace("navigationTo notify listeners " + Arrays.asList(navigationItems).toString() + " / " + listeners + .size()); listeners.stream().forEach((e) -> e.onNavigationRequested(navigationItems)); } public void navigateToLastStoredItem() { NavigationItem[] navigationItems = (NavigationItem[]) persistence.read(this, "navigationItems"); if (navigationItems == null || navigationItems.length == 0) - navigationItems = new NavigationItem[]{NavigationItem.HOME}; + navigationItems = new NavigationItem[]{NavigationItem.MAIN, NavigationItem.HOME}; navigationTo(navigationItems); } @@ -77,11 +104,11 @@ public class NavigationManager { // Listeners /////////////////////////////////////////////////////////////////////////////////////////// - public void addListener(NavigationListener listener) { + public void addListener(Listener listener) { listeners.add(listener); } - public void removeListener(NavigationListener listener) { + public void removeListener(Listener listener) { listeners.remove(listener); } @@ -90,12 +117,21 @@ public class NavigationManager { // Getters /////////////////////////////////////////////////////////////////////////////////////////// - public NavigationItem[] getPreviousMainNavigationItems() { - return previousMainNavigationItems; + public NavigationItem[] getNavigationItemsForReturning() { + return navigationItemsForReturning; } public NavigationItem[] getCurrentNavigationItems() { return currentNavigationItems; } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Setters + /////////////////////////////////////////////////////////////////////////////////////////// + + public void setNavigationItemsForReturning(NavigationItem[] navigationItemsForReturning) { + this.navigationItemsForReturning = navigationItemsForReturning; + } + } diff --git a/src/main/java/io/bitsquare/gui/ViewCB.java b/src/main/java/io/bitsquare/gui/ViewCB.java index 02ca06e1a6..fdbe4b4d2d 100644 --- a/src/main/java/io/bitsquare/gui/ViewCB.java +++ b/src/main/java/io/bitsquare/gui/ViewCB.java @@ -83,7 +83,7 @@ public class ViewCB implements Initializable { * @param navigationItem NavigationItem to be loaded. * @return The ViewController of the loaded view. */ - public Initializable loadView(NavigationItem navigationItem) { + protected Initializable loadView(NavigationItem navigationItem) { log.trace("Lifecycle: loadViewAndGetChildController " + this.getClass().getSimpleName() + " / navigationItem " + "= " + navigationItem); return null; diff --git a/src/main/java/io/bitsquare/gui/main/MainViewCB.java b/src/main/java/io/bitsquare/gui/main/MainViewCB.java index dad9151a35..866571b42b 100644 --- a/src/main/java/io/bitsquare/gui/main/MainViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/MainViewCB.java @@ -57,7 +57,6 @@ public class MainViewCB extends ViewCB { private final OverlayManager overlayManager; private final ToggleGroup navButtonsGroup = new ToggleGroup(); - private NavigationItem mainNavigationItem; private BorderPane baseApplicationContainer; private VBox baseOverlayContainer; @@ -97,20 +96,12 @@ public class MainViewCB extends ViewCB { Popups.setOverlayManager(overlayManager); navigationManager.addListener(navigationItems -> { - if (navigationItems != null) { - for (NavigationItem navigationItem : navigationItems) { - if (navigationItem.getLevel() == 1) { - mainNavigationItem = navigationItem; - break; - } + if (navigationItems != null && navigationItems.length == 2) { + if (navigationItems[0] == NavigationItem.MAIN) { + loadView(navigationItems[1]); + selectMainMenuButton(navigationItems[1]); } } - - if (mainNavigationItem == null) - mainNavigationItem = NavigationItem.HOME; - - loadView(mainNavigationItem); - selectMainMenuButton(mainNavigationItem); }); overlayManager.addListener(new OverlayManager.OverlayListener() { @@ -140,9 +131,8 @@ public class MainViewCB extends ViewCB { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public Initializable loadView(NavigationItem navigationItem) { + protected Initializable loadView(NavigationItem navigationItem) { super.loadView((navigationItem)); - final ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl())); try { final Node view = loader.load(); @@ -203,7 +193,9 @@ public class MainViewCB extends ViewCB { alertButton.setId("nav-alert-button"); alertButton.relocate(36, 19); alertButton.setOnAction((e) -> - navigationManager.navigationTo(NavigationItem.ORDERS, NavigationItem.PENDING_TRADE)); + navigationManager.navigationTo(NavigationItem.MAIN, + NavigationItem.ORDERS, + NavigationItem.PENDING_TRADE)); Tooltip.install(alertButton, new Tooltip("Your offer has been accepted")); ordersButtonButtonPane.getChildren().add(alertButton); @@ -399,8 +391,7 @@ public class MainViewCB extends ViewCB { } }); - toggleButton.setOnAction(e -> navigationManager.navigationTo(navigationItem)); - // toggleButton.setOnAction(e -> loadView(navigationItem)); + toggleButton.setOnAction(e -> navigationManager.navigationTo(NavigationItem.MAIN, navigationItem)); parent.getChildren().add(toggleButton); return toggleButton; diff --git a/src/main/java/io/bitsquare/gui/main/account/AccountViewCB.java b/src/main/java/io/bitsquare/gui/main/account/AccountViewCB.java index 2c5cd4630d..a04df820e5 100644 --- a/src/main/java/io/bitsquare/gui/main/account/AccountViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/account/AccountViewCB.java @@ -21,7 +21,6 @@ import io.bitsquare.gui.CachedViewCB; import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationManager; import io.bitsquare.gui.ViewCB; -import io.bitsquare.gui.main.account.setup.AccountSetupViewCB; import io.bitsquare.util.ViewLoader; import java.io.IOException; @@ -45,6 +44,7 @@ public class AccountViewCB extends CachedViewCB { public Tab tab; private NavigationManager navigationManager; + private NavigationManager.Listener listener; /////////////////////////////////////////////////////////////////////////////////////////// @@ -54,6 +54,7 @@ public class AccountViewCB extends CachedViewCB { @Inject private AccountViewCB(AccountPM presentationModel, NavigationManager navigationManager) { super(presentationModel); + this.navigationManager = navigationManager; } @@ -65,6 +66,13 @@ public class AccountViewCB extends CachedViewCB { @SuppressWarnings("EmptyMethod") @Override public void initialize(URL url, ResourceBundle rb) { + listener = navigationItems -> { + if (navigationItems != null && + navigationItems.length == 3 && + navigationItems[1] == NavigationItem.ACCOUNT) + loadView(navigationItems[2]); + }; + super.initialize(url, rb); } @@ -72,22 +80,24 @@ public class AccountViewCB extends CachedViewCB { public void activate() { super.activate(); - if (childController == null) { - if (presentationModel.getNeedRegistration()) { - childController = loadView(NavigationItem.ACCOUNT_SETUP); - tab.setText("Account setup"); - } - else { - childController = loadView(NavigationItem.ACCOUNT_SETTINGS); - tab.setText("Account settings"); - } + navigationManager.addListener(listener); + + if (navigationManager.getCurrentNavigationItems().length == 2 && + navigationManager.getCurrentNavigationItems()[1] == NavigationItem.ACCOUNT) { + if (presentationModel.getNeedRegistration()) + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.ACCOUNT, + NavigationItem.ACCOUNT_SETUP); + else + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.ACCOUNT, + NavigationItem.ACCOUNT_SETTINGS); } } - @SuppressWarnings("EmptyMethod") @Override public void deactivate() { super.deactivate(); + + navigationManager.removeListener(listener); } @SuppressWarnings("EmptyMethod") @@ -102,22 +112,17 @@ public class AccountViewCB extends CachedViewCB { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public Initializable loadView(NavigationItem navigationItem) { + protected Initializable loadView(NavigationItem navigationItem) { super.loadView(navigationItem); + tab.setText((navigationItem == NavigationItem.ACCOUNT_SETUP) ? "Account setup" : "Account settings"); final ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl())); try { - Pane view = loader.load(); + AnchorPane view = loader.load(); tab.setContent(view); Initializable childController = loader.getController(); ((ViewCB) childController).setParent(this); - if (childController instanceof AccountSetupViewCB) - ((AccountSetupViewCB) childController).setRemoveCallBack(() -> { - removeSetup(); - return null; - }); - } catch (IOException e) { log.error("Loading view failed. FxmlUrl = " + NavigationItem.ACCOUNT_SETUP.getFxmlUrl()); e.getStackTrace(); @@ -130,11 +135,6 @@ public class AccountViewCB extends CachedViewCB { // Private /////////////////////////////////////////////////////////////////////////////////////////// - private void removeSetup() { - childController = null; - - navigationManager.navigationTo(navigationManager.getPreviousMainNavigationItems()); - } } diff --git a/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewCB.java b/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewCB.java index 4417383b4c..4250f9c0fa 100644 --- a/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewCB.java @@ -185,7 +185,7 @@ public class RestrictionsViewCB extends CachedViewCB implements /////////////////////////////////////////////////////////////////////////////////////////// @Override - public Initializable loadView(NavigationItem navigationItem) { + protected Initializable loadView(NavigationItem navigationItem) { // TODO caching causes exception final ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); try { @@ -236,7 +236,7 @@ public class RestrictionsViewCB extends CachedViewCB implements public ListCell call(ListView list) { return new ListCell() { final Label label = new Label(); - final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE); + final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE_ICON); final Button removeButton = new Button("", icon); final AnchorPane pane = new AnchorPane(label, removeButton); @@ -294,7 +294,7 @@ public class RestrictionsViewCB extends CachedViewCB implements public ListCell call(ListView list) { return new ListCell() { final Label label = new Label(); - final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE); + final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE_ICON); final Button removeButton = new Button("", icon); final AnchorPane pane = new AnchorPane(label, removeButton); @@ -338,7 +338,7 @@ public class RestrictionsViewCB extends CachedViewCB implements public ListCell call(ListView list) { return new ListCell() { final Label label = new Label(); - final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE); + final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE_ICON); final Button removeButton = new Button("", icon); final AnchorPane pane = new AnchorPane(label, removeButton); diff --git a/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsViewCB.java b/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsViewCB.java index 4497bb9210..a5927b5d86 100644 --- a/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsViewCB.java @@ -33,9 +33,9 @@ import java.util.ResourceBundle; import javax.inject.Inject; +import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.geometry.Pos; -import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.scene.paint.*; @@ -50,12 +50,13 @@ public class AccountSettingsViewCB extends CachedViewCB { private static final Logger log = LoggerFactory.getLogger(AccountSettingsViewCB.class); - public NavigationItem subMenuNavigationItem; - - public VBox leftVBox; - public AnchorPane content; private MenuItem seedWords, password, restrictions, fiatAccount, registration; private NavigationManager navigationManager; + private NavigationManager.Listener listener; + + @FXML VBox leftVBox; + @FXML AnchorPane content; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor @@ -75,18 +76,25 @@ public class AccountSettingsViewCB extends CachedViewCB { @Override public void initialize(URL url, ResourceBundle rb) { - super.initialize(url, rb); + listener = navigationItems -> { + if (navigationItems != null && + navigationItems.length == 4 && + navigationItems[2] == NavigationItem.ACCOUNT_SETTINGS) { + loadView(navigationItems[3]); + selectMainMenuButton(navigationItems[3]); + } + }; ToggleGroup toggleGroup = new ToggleGroup(); - seedWords = new MenuItem(this, content, "Wallet seed", + seedWords = new MenuItem(navigationManager, "Wallet seed", NavigationItem.SEED_WORDS, toggleGroup); - password = new MenuItem(this, content, "Wallet password", + password = new MenuItem(navigationManager, "Wallet password", NavigationItem.CHANGE_PASSWORD, toggleGroup); - restrictions = new MenuItem(this, content, "Trading restrictions", + restrictions = new MenuItem(navigationManager, "Trading restrictions", NavigationItem.RESTRICTIONS, toggleGroup); - fiatAccount = new MenuItem(this, content, "Payments account(s)", + fiatAccount = new MenuItem(navigationManager, "Payments account(s)", NavigationItem.FIAT_ACCOUNT, toggleGroup); - registration = new MenuItem(this, content, "Renew your account", + registration = new MenuItem(navigationManager, "Renew your account", NavigationItem.REGISTRATION, toggleGroup); registration.setDisable(true); @@ -94,27 +102,72 @@ public class AccountSettingsViewCB extends CachedViewCB { leftVBox.getChildren().addAll(seedWords, password, restrictions, fiatAccount, registration); - + super.initialize(url, rb); } @Override public void activate() { super.activate(); - NavigationItem[] navigationItems = navigationManager.getCurrentNavigationItems(); - for (int i = 0; i < navigationItems.length; i++) { - if (navigationItems[i].getLevel() == 3) { - subMenuNavigationItem = navigationItems[i]; - break; + navigationManager.addListener(listener); + NavigationItem[] items = navigationManager.getCurrentNavigationItems(); + if (items.length == 3 && + items[2] == NavigationItem.ACCOUNT_SETTINGS) { + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.ACCOUNT, + NavigationItem.ACCOUNT_SETTINGS, NavigationItem.SEED_WORDS); + } + else { + if (items != null && + items.length == 4 && + items[2] == NavigationItem.ACCOUNT_SETTINGS) { + loadView(items[3]); + selectMainMenuButton(items[3]); } } + } - if (subMenuNavigationItem == null) - subMenuNavigationItem = NavigationItem.SEED_WORDS; + @Override + public void deactivate() { + super.deactivate(); - loadView(subMenuNavigationItem); + navigationManager.removeListener(listener); + } - switch (subMenuNavigationItem) { + @SuppressWarnings("EmptyMethod") + @Override + public void terminate() { + super.terminate(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Public Methods + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected Initializable loadView(NavigationItem navigationItem) { + final ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl())); + try { + final Pane view = loader.load(); + content.getChildren().setAll(view); + childController = loader.getController(); + ((ViewCB) childController).setParent(this); + ((ContextAware) childController).useSettingsContext(true); + return childController; + } catch (IOException e) { + log.error("Loading view failed. FxmlUrl = " + navigationItem.getFxmlUrl()); + e.getStackTrace(); + } + return null; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void selectMainMenuButton(NavigationItem navigationItem) { + switch (navigationItem) { case SEED_WORDS: seedWords.setSelected(true); break; @@ -131,60 +184,17 @@ public class AccountSettingsViewCB extends CachedViewCB { registration.setSelected(true); break; default: - log.error(subMenuNavigationItem.getFxmlUrl() + " is no subMenuNavigationItem"); + log.error(navigationItem.getFxmlUrl() + " is invalid"); break; } } - - @SuppressWarnings("EmptyMethod") - @Override - public void deactivate() { - super.deactivate(); - } - - @SuppressWarnings("EmptyMethod") - @Override - public void terminate() { - super.terminate(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Public Methods - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public Initializable loadView(NavigationItem navigationItem) { - final ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl())); - try { - final Pane view = loader.load(); - content.getChildren().setAll(view); - childController = loader.getController(); - ((ViewCB) childController).setParent(this); - ((ContextAware) childController).useSettingsContext(true); - return childController; - } catch (IOException e) { - log.error("Loading view failed. FxmlUrl = " + navigationItem.getFxmlUrl()); - e.getStackTrace(); - } - return null; - } } class MenuItem extends ToggleButton { private static final Logger log = LoggerFactory.getLogger(MenuItem.class); - private ViewCB childController; - - private final AccountSettingsViewCB parentCB; - private final Parent content; - private final NavigationItem navigationItem; - - MenuItem(AccountSettingsViewCB parentCB, Parent content, String title, NavigationItem navigationItem, + MenuItem(NavigationManager navigationManager, String title, NavigationItem navigationItem, ToggleGroup toggleGroup) { - this.parentCB = parentCB; - this.content = content; - this.navigationItem = navigationItem; setToggleGroup(toggleGroup); setText(title); @@ -204,7 +214,8 @@ class MenuItem extends ToggleButton { setGraphic(icon); - setOnAction((event) -> parentCB.loadView(navigationItem)); + setOnAction((event) -> navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.ACCOUNT, + NavigationItem.ACCOUNT_SETTINGS, navigationItem)); selectedProperty().addListener((ov, oldValue, newValue) -> { if (newValue) { diff --git a/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupViewCB.java b/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupViewCB.java index 879b5f1575..4afdf651df 100644 --- a/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupViewCB.java @@ -19,6 +19,7 @@ package io.bitsquare.gui.main.account.setup; import io.bitsquare.gui.CachedViewCB; import io.bitsquare.gui.NavigationItem; +import io.bitsquare.gui.NavigationManager; import io.bitsquare.gui.PresentationModel; import io.bitsquare.gui.ViewCB; import io.bitsquare.gui.main.account.MultiStepNavigation; @@ -36,14 +37,12 @@ import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; -import java.util.concurrent.Callable; import javax.inject.Inject; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.geometry.Insets; -import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.image.*; import javafx.scene.layout.*; @@ -56,10 +55,11 @@ public class AccountSetupViewCB extends CachedViewCB implements private static final Logger log = LoggerFactory.getLogger(AccountSetupViewCB.class); private WizardItem seedWords, password, fiatAccount, restrictions, registration; - private Callable requestCloseCallable; + private NavigationManager navigationManager; + private NavigationManager.Listener listener; - @FXML private VBox leftVBox; - @FXML private AnchorPane content; + @FXML VBox leftVBox; + @FXML AnchorPane content; /////////////////////////////////////////////////////////////////////////////////////////// @@ -67,8 +67,9 @@ public class AccountSetupViewCB extends CachedViewCB implements /////////////////////////////////////////////////////////////////////////////////////////// @Inject - private AccountSetupViewCB(AccountSetupPM presentationModel) { + private AccountSetupViewCB(AccountSetupPM presentationModel, NavigationManager navigationManager) { super(presentationModel); + this.navigationManager = navigationManager; } @@ -78,37 +79,49 @@ public class AccountSetupViewCB extends CachedViewCB implements @Override public void initialize(URL url, ResourceBundle rb) { - super.initialize(url, rb); + listener = navigationItems -> { + if (navigationItems != null && + navigationItems.length == 4 && + navigationItems[2] == NavigationItem.ACCOUNT_SETUP) { + loadView(navigationItems[3]); + } + }; - seedWords = new WizardItem(this, content, "Backup wallet seed", "Write down the seed word for your wallet", + seedWords = new WizardItem(navigationManager, "Backup wallet seed", "Write down the seed word for your wallet", NavigationItem.SEED_WORDS); - password = new WizardItem(this, content, "Setup password", "Protect your wallet with a password", + password = new WizardItem(navigationManager, "Setup password", "Protect your wallet with a password", NavigationItem.ADD_PASSWORD); - restrictions = new WizardItem(this, content, "Setup your preferences", + restrictions = new WizardItem(navigationManager, "Setup your preferences", "Define your preferences with whom you want to trade", NavigationItem.RESTRICTIONS); - fiatAccount = new WizardItem(this, content, " Setup Payments account(s)", + fiatAccount = new WizardItem(navigationManager, " Setup Payments account(s)", "You need to add a payments account to your trading account", NavigationItem.FIAT_ACCOUNT); - registration = new WizardItem(this, content, "Register your account", + registration = new WizardItem(navigationManager, "Register your account", "Pay in the registration fee of 0.0002 BTC and store your account in the BTC block chain", NavigationItem.REGISTRATION); leftVBox.getChildren().addAll(seedWords, password, restrictions, fiatAccount, registration); - childController = seedWords.show(); + super.initialize(url, rb); } - @SuppressWarnings("EmptyMethod") + @Override public void activate() { super.activate(); + + navigationManager.addListener(listener); + + // triggers navigationTo + childController = seedWords.show(); } - @SuppressWarnings("EmptyMethod") @Override public void deactivate() { super.deactivate(); + + navigationManager.removeListener(listener); } @SuppressWarnings("EmptyMethod") @@ -143,13 +156,7 @@ public class AccountSetupViewCB extends CachedViewCB implements registration.onCompleted(); childController = null; - if (requestCloseCallable != null) { - try { - requestCloseCallable.call(); - } catch (Exception e) { - e.printStackTrace(); - } - } + navigationManager.navigationTo(navigationManager.getNavigationItemsForReturning()); } } @@ -158,13 +165,8 @@ public class AccountSetupViewCB extends CachedViewCB implements // Public Methods /////////////////////////////////////////////////////////////////////////////////////////// - public void setRemoveCallBack(Callable requestCloseCallable) { - - this.requestCloseCallable = requestCloseCallable; - } - @Override - public Initializable loadView(NavigationItem navigationItem) { + protected Initializable loadView(NavigationItem navigationItem) { final ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl())); try { final Pane view = loader.load(); @@ -189,14 +191,12 @@ class WizardItem extends HBox { private final ImageView imageView; private final Label titleLabel; private final Label subTitleLabel; - private final AccountSetupViewCB parentCB; - private final Parent content; private final NavigationItem navigationItem; + private final NavigationManager navigationManager; - WizardItem(AccountSetupViewCB parentCB, Parent content, String title, String subTitle, + WizardItem(NavigationManager navigationManager, String title, String subTitle, NavigationItem navigationItem) { - this.parentCB = parentCB; - this.content = content; + this.navigationManager = navigationManager; this.navigationItem = navigationItem; setId("wizard-item-background-deactivated"); @@ -233,7 +233,9 @@ class WizardItem extends HBox { } ViewCB show() { - parentCB.loadView(navigationItem); + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.ACCOUNT, NavigationItem.ACCOUNT_SETUP, + navigationItem); + setId("wizard-item-background-active"); imageView.setImage(ImageUtil.getIconImage(ImageUtil.ARROW_BLUE)); titleLabel.setId("wizard-title-active"); diff --git a/src/main/java/io/bitsquare/gui/main/orders/offer/OfferController.java b/src/main/java/io/bitsquare/gui/main/orders/offer/OfferController.java index e25a4a8e92..2594fd9cdd 100644 --- a/src/main/java/io/bitsquare/gui/main/orders/offer/OfferController.java +++ b/src/main/java/io/bitsquare/gui/main/orders/offer/OfferController.java @@ -155,7 +155,7 @@ public class OfferController extends CachedViewController { @Override public TableCell call(TableColumn directionColumn) { return new TableCell() { - final ImageView iconView = ImageUtil.getIconImageView(ImageUtil.REMOVE); + final ImageView iconView = ImageUtil.getIconImageView(ImageUtil.REMOVE_ICON); final Button button = new Button(); { diff --git a/src/main/java/io/bitsquare/gui/main/orders/pending/PendingTradeController.java b/src/main/java/io/bitsquare/gui/main/orders/pending/PendingTradeController.java index f93d17d314..f4738cbd66 100644 --- a/src/main/java/io/bitsquare/gui/main/orders/pending/PendingTradeController.java +++ b/src/main/java/io/bitsquare/gui/main/orders/pending/PendingTradeController.java @@ -78,8 +78,8 @@ public class PendingTradeController extends CachedViewController { private Trade currentTrade; - private final Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY); - private final Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL); + private final Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY_ICON); + private final Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL_ICON); private ConfidenceDisplay confidenceDisplay; @FXML private TableView openTradesTable; diff --git a/src/main/java/io/bitsquare/gui/main/trade/BuyViewCB.java b/src/main/java/io/bitsquare/gui/main/trade/BuyViewCB.java index f8f91ee89b..f1a4ed552b 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/BuyViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/trade/BuyViewCB.java @@ -17,13 +17,15 @@ package io.bitsquare.gui.main.trade; +import io.bitsquare.gui.NavigationManager; + import javax.inject.Inject; public class BuyViewCB extends TradeViewCB { @Inject - public BuyViewCB() { - super(); + public BuyViewCB(NavigationManager navigationManager) { + super(navigationManager); } } diff --git a/src/main/java/io/bitsquare/gui/main/trade/OrderBookInfo.java b/src/main/java/io/bitsquare/gui/main/trade/OrderBookInfo.java index 51e2eddb37..8e83cdb227 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/OrderBookInfo.java +++ b/src/main/java/io/bitsquare/gui/main/trade/OrderBookInfo.java @@ -18,6 +18,7 @@ package io.bitsquare.gui.main.trade; import io.bitsquare.trade.Direction; +import io.bitsquare.trade.Offer; import com.google.bitcoin.core.Coin; import com.google.bitcoin.utils.Fiat; @@ -36,6 +37,9 @@ public class OrderBookInfo { private Fiat volume; + private Offer offer; + + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @@ -64,6 +68,9 @@ public class OrderBookInfo { this.direction.set(direction); } + public Offer getOffer() { + return offer; + } /////////////////////////////////////////////////////////////////////////////////////////// // Getters @@ -88,4 +95,8 @@ public class OrderBookInfo { public ObjectProperty directionProperty() { return direction; } + + public void setOffer(Offer offer) { + this.offer = offer; + } } diff --git a/src/main/java/io/bitsquare/gui/main/trade/SellViewCB.java b/src/main/java/io/bitsquare/gui/main/trade/SellViewCB.java index b99f733b8a..3846f02f6a 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/SellViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/trade/SellViewCB.java @@ -17,13 +17,15 @@ package io.bitsquare.gui.main.trade; +import io.bitsquare.gui.NavigationManager; + import javax.inject.Inject; public class SellViewCB extends TradeViewCB { @Inject - public SellViewCB() { - super(); + public SellViewCB(NavigationManager navigationManager) { + super(navigationManager); } } diff --git a/src/main/java/io/bitsquare/gui/main/trade/TradeViewCB.java b/src/main/java/io/bitsquare/gui/main/trade/TradeViewCB.java index 1a536f7444..04762fe044 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/TradeViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/trade/TradeViewCB.java @@ -19,6 +19,7 @@ package io.bitsquare.gui.main.trade; import io.bitsquare.gui.CachedViewCB; import io.bitsquare.gui.NavigationItem; +import io.bitsquare.gui.NavigationManager; import io.bitsquare.gui.components.InputTextField; import io.bitsquare.gui.main.trade.createoffer.CreateOfferViewCB; import io.bitsquare.gui.main.trade.orderbook.OrderBookViewCB; @@ -42,8 +43,6 @@ import javafx.scene.control.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.google.common.base.Preconditions.checkArgument; - public class TradeViewCB extends CachedViewCB { private static final Logger log = LoggerFactory.getLogger(TradeViewCB.class); @@ -52,14 +51,19 @@ public class TradeViewCB extends CachedViewCB { private CreateOfferViewCB createOfferViewCB; private TakeOfferController takeOfferController; private Node createOfferView; + private NavigationManager navigationManager; + private NavigationManager.Listener listener; + private NavigationItem tradeNavigationItem; /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - protected TradeViewCB() { + protected TradeViewCB(NavigationManager navigationManager) { super(); + + this.navigationManager = navigationManager; } @@ -67,15 +71,19 @@ public class TradeViewCB extends CachedViewCB { // Lifecycle /////////////////////////////////////////////////////////////////////////////////////////// - @SuppressWarnings("EmptyMethod") @Override public void initialize(URL url, ResourceBundle rb) { - super.initialize(url, rb); + listener = navigationItems -> { + if (navigationItems != null && navigationItems.length == 3 && navigationItems[1] == tradeNavigationItem) { + loadView(navigationItems[2]); + } + }; Direction direction = (this instanceof BuyViewCB) ? Direction.BUY : Direction.SELL; orderBookInfo.setDirection(direction); + tradeNavigationItem = (direction == Direction.BUY) ? NavigationItem.BUY : NavigationItem.SELL; - loadView(NavigationItem.ORDER_BOOK); + super.initialize(url, rb); } @Override @@ -83,8 +91,9 @@ public class TradeViewCB extends CachedViewCB { super.activate(); // We need to remove open validation error popups - // TODO Find a way to do that in the InputTextField directly, but a tab change does not trigger any event there - // Platform.runLater needed as focusout evetn is called after selectedIndexProperty changed + // TODO Find a way to do that in the InputTextField directly, but a tab change does not trigger any event + // there + // Platform.runLater needed as focus-out event is called after selectedIndexProperty changed TabPane tabPane = (TabPane) root; tabPane.getSelectionModel().selectedIndexProperty() .addListener((observableValue, oldValue, newValue) -> @@ -94,9 +103,13 @@ public class TradeViewCB extends CachedViewCB { tabPane.getTabs().addListener((ListChangeListener) change -> { change.next(); List removedTabs = change.getRemoved(); - if (removedTabs.size() == 1 && removedTabs.get(0).getContent().equals(createOfferView)) + if (removedTabs.size() == 1 && removedTabs.get(0).getContent().equals(createOfferView)) { onCreateOfferViewRemoved(); + } }); + + navigationManager.addListener(listener); + navigationManager.navigationTo(NavigationItem.MAIN, tradeNavigationItem, NavigationItem.ORDER_BOOK); } @SuppressWarnings("EmptyMethod") @@ -117,12 +130,11 @@ public class TradeViewCB extends CachedViewCB { /////////////////////////////////////////////////////////////////////////////////////////// // @Override - public Initializable loadView(NavigationItem navigationItem) { - super.loadView(navigationItem); + protected Initializable loadView(NavigationItem navigationItem) { + super.loadView(navigationItem); TabPane tabPane = (TabPane) root; - if (navigationItem == NavigationItem.ORDER_BOOK) { - checkArgument(orderBookViewCB == null); + if (navigationItem == NavigationItem.ORDER_BOOK && orderBookViewCB == null) { // Orderbook must not be cached by GuiceFXMLLoader as we use 2 instances for sell and buy screens. ViewLoader orderBookLoader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); @@ -135,16 +147,14 @@ public class TradeViewCB extends CachedViewCB { orderBookViewCB = orderBookLoader.getController(); orderBookViewCB.setParent(this); orderBookViewCB.setOrderBookInfo(orderBookInfo); - orderBookViewCB.setNavigationListener(n -> loadView(n)); + // orderBookViewCB.setNavigationListener(n -> loadView(n)); return orderBookViewCB; } catch (IOException e) { log.error(e.getMessage()); } } - else if (navigationItem == NavigationItem.CREATE_OFFER) { - checkArgument(createOfferViewCB == null); - + else if (navigationItem == NavigationItem.CREATE_OFFER && createOfferViewCB == null) { // CreateOffer and TakeOffer must not be cached by GuiceFXMLLoader as we cannot use a view multiple times // in different graphs ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); @@ -163,9 +173,7 @@ public class TradeViewCB extends CachedViewCB { log.error(e.getMessage()); } } - else if (navigationItem == NavigationItem.TAKE_OFFER) { - checkArgument(takeOfferController == null); - + else if (navigationItem == NavigationItem.TAKE_OFFER && takeOfferController == null) { // CreateOffer and TakeOffer must not be cached by GuiceFXMLLoader as we cannot use a view multiple times // in different graphs ViewLoader loader = new ViewLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); @@ -173,10 +181,12 @@ public class TradeViewCB extends CachedViewCB { final Parent view = loader.load(); takeOfferController = loader.getController(); takeOfferController.setParentController(this); + takeOfferController.initWithData(orderBookInfo); final Tab tab = new Tab("Take offer"); tab.setContent(view); tabPane.getTabs().add(tab); tabPane.getSelectionModel().select(tab); + return takeOfferController; } catch (IOException e) { log.error(e.getMessage()); @@ -207,6 +217,9 @@ public class TradeViewCB extends CachedViewCB { if (createOfferViewCB != null) createOfferViewCB = null; orderBookViewCB.enableCreateOfferButton(); + + // update the navigation state + navigationManager.navigationTo(NavigationItem.MAIN, tradeNavigationItem, NavigationItem.ORDER_BOOK); } } diff --git a/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewCB.java b/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewCB.java index 56f86e537b..06e8039e53 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewCB.java @@ -237,7 +237,8 @@ public class CreateOfferViewCB extends CachedViewCB { /////////////////////////////////////////////////////////////////////////////////////////// private void openAccountSettings() { - navigationManager.navigationTo(NavigationItem.ACCOUNT, + navigationManager.navigationTo(NavigationItem.MAIN, + NavigationItem.ACCOUNT, NavigationItem.ACCOUNT_SETTINGS, NavigationItem.RESTRICTIONS); } diff --git a/src/main/java/io/bitsquare/gui/main/trade/orderbook/OrderBookViewCB.java b/src/main/java/io/bitsquare/gui/main/trade/orderbook/OrderBookViewCB.java index cfe78235ba..0f3c0e9941 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/orderbook/OrderBookViewCB.java +++ b/src/main/java/io/bitsquare/gui/main/trade/orderbook/OrderBookViewCB.java @@ -19,16 +19,11 @@ package io.bitsquare.gui.main.trade.orderbook; import io.bitsquare.gui.CachedViewCB; import io.bitsquare.gui.NavigationItem; -import io.bitsquare.gui.NavigationListener; import io.bitsquare.gui.NavigationManager; import io.bitsquare.gui.OverlayManager; -import io.bitsquare.gui.ViewCB; -import io.bitsquare.gui.ViewController; import io.bitsquare.gui.components.InputTextField; import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.main.trade.OrderBookInfo; -import io.bitsquare.gui.main.trade.takeoffer.TakeOfferController; -import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.gui.util.validation.OptionalBtcValidator; import io.bitsquare.gui.util.validation.OptionalFiatValidator; @@ -37,8 +32,6 @@ import io.bitsquare.locale.Country; import io.bitsquare.trade.Direction; import io.bitsquare.trade.Offer; -import com.google.bitcoin.core.Coin; - import java.net.URL; import java.util.ArrayList; @@ -69,32 +62,30 @@ import static javafx.beans.binding.Bindings.createStringBinding; public class OrderBookViewCB extends CachedViewCB { private static final Logger log = LoggerFactory.getLogger(OrderBookViewCB.class); - //TODO nav? private NavigationManager navigationManager; + private NavigationItem tradeNavigationItem; private OverlayManager overlayManager; private OptionalBtcValidator optionalBtcValidator; private OptionalFiatValidator optionalFiatValidator; - private NavigationListener navigationListener; private boolean detailsVisible; private boolean advancedScreenInited; - private final Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY); - private final Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL); + private final Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY_ICON); + private final Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL_ICON); private ImageView expand; private ImageView collapse; - @FXML private CheckBox extendedCheckBox; - @FXML private Label amountBtcLabel, priceDescriptionLabel, priceFiatLabel, volumeDescriptionLabel, + @FXML CheckBox extendedCheckBox; + @FXML Label amountBtcLabel, priceDescriptionLabel, priceFiatLabel, volumeDescriptionLabel, volumeFiatLabel, extendedButton1Label, extendedButton2Label, extendedCheckBoxLabel; - @FXML private InputTextField volumeTextField, amountTextField, priceTextField; - @FXML private TableView orderBookTable; - @FXML private Button createOfferButton, showAdvancedSettingsButton, extendedButton1, extendedButton2; - @FXML private TableColumn priceColumn, amountColumn, volumeColumn, + @FXML InputTextField volumeTextField, amountTextField, priceTextField; + @FXML TableView orderBookTable; + @FXML Button createOfferButton, showAdvancedSettingsButton, extendedButton1, extendedButton2; + @FXML TableColumn priceColumn, amountColumn, volumeColumn, directionColumn, countryColumn, bankAccountTypeColumn; - /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @@ -120,8 +111,6 @@ public class OrderBookViewCB extends CachedViewCB { @Override public void initialize(URL url, ResourceBundle rb) { - super.initialize(url, rb); - // init table setAmountColumnCellFactory(); setPriceColumnCellFactory(); @@ -129,72 +118,41 @@ public class OrderBookViewCB extends CachedViewCB { setCountryColumnCellFactory(); setBankAccountTypeColumnCellFactory(); setDirectionColumnCellFactory(); - //setRowFactory(); - - amountTextField.textProperty().bindBidirectional(presentationModel.amount); - priceTextField.textProperty().bindBidirectional(presentationModel.price); - volumeTextField.textProperty().bindBidirectional(presentationModel.volume); - amountBtcLabel.textProperty().bind(presentationModel.btcCode); - priceFiatLabel.textProperty().bind(presentationModel.fiatCode); - volumeFiatLabel.textProperty().bind(presentationModel.fiatCode); - priceDescriptionLabel.textProperty().bind(presentationModel.fiatCode); - volumeDescriptionLabel.textProperty().bind(presentationModel.fiatCode);//Price per Bitcoin in EUR - priceDescriptionLabel.textProperty().bind(createStringBinding(() -> - BSResources.get("Filter by price in {0}", presentationModel.fiatCode.get()), - presentationModel.fiatCode)); - volumeDescriptionLabel.textProperty().bind(createStringBinding(() -> - BSResources.get("Filter by amount in {0}", presentationModel.fiatCode.get()), - presentationModel.fiatCode)); - volumeTextField.promptTextProperty().bind(createStringBinding(() -> - BSResources.get("Amount in {0}", presentationModel.fiatCode.get()), - presentationModel.fiatCode)); orderBookTable.getSortOrder().add(priceColumn); orderBookTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); - amountTextField.setValidator(optionalBtcValidator); - priceTextField.setValidator(optionalFiatValidator); - volumeTextField.setValidator(optionalFiatValidator); + setupBindings(); + setupValidators(); + setupComparators(); expand = ImageUtil.getIconImageView(ImageUtil.EXPAND); collapse = ImageUtil.getIconImageView(ImageUtil.COLLAPSE); showAdvancedSettingsButton.setGraphic(expand); - } + super.initialize(url, rb); + } @Override public void activate() { super.activate(); + // setOrderBookInfo has been called before SortedList offerList = presentationModel.getOfferList(); orderBookTable.setItems(offerList); - // presentationModel.comparator.bind(orderBookTable.comparatorProperty()); offerList.comparatorProperty().bind(orderBookTable.comparatorProperty()); - priceColumn.setComparator((o1, o2) -> o1.getOffer().getPrice().compareTo(o2.getOffer().getPrice())); - amountColumn.setComparator((o1, o2) -> o1.getOffer().getAmount().compareTo(o2.getOffer().getAmount())); - volumeColumn.setComparator((o1, o2) -> - o1.getOffer().getOfferVolume().compareTo(o2.getOffer().getOfferVolume())); - countryColumn.setComparator((o1, o2) -> o1.getOffer().getBankAccountCountry().getName().compareTo(o2.getOffer() - .getBankAccountCountry().getName())); - bankAccountTypeColumn.setComparator((o1, o2) -> o1.getOffer().getBankAccountType().compareTo(o2.getOffer() - .getBankAccountType())); priceColumn.setSortType((presentationModel.getOrderBookInfo().getDirection() == Direction.BUY) ? TableColumn.SortType.ASCENDING : TableColumn.SortType.DESCENDING); orderBookTable.sort(); - - - /* if (orderBookTable.getItems() != null) - createOfferButton.setDefaultButton(orderBookTable.getItems().isEmpty());*/ } + @SuppressWarnings("EmptyMethod") @Override public void deactivate() { super.deactivate(); - // orderBookTable.getSelectionModel().clearSelection(); - // orderBookTable.setItems(null); } @SuppressWarnings("EmptyMethod") @@ -219,10 +177,9 @@ public class OrderBookViewCB extends CachedViewCB { public void setOrderBookInfo(OrderBookInfo orderBookInfo) { presentationModel.setOrderBookInfo(orderBookInfo); - } + tradeNavigationItem = (orderBookInfo.getDirection() == Direction.BUY) ? NavigationItem.BUY : NavigationItem + .SELL; - public void setNavigationListener(NavigationListener navigationListener) { - this.navigationListener = navigationListener; } @@ -234,7 +191,11 @@ public class OrderBookViewCB extends CachedViewCB { void createOffer() { if (presentationModel.isRegistered()) { createOfferButton.setDisable(true); - navigationListener.navigate(NavigationItem.CREATE_OFFER); + if (presentationModel.getOrderBookInfo().getDirection() == Direction.BUY) + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.BUY, NavigationItem.CREATE_OFFER); + else + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.SELL, NavigationItem.CREATE_OFFER); + } else { openSetupScreen(); @@ -261,6 +222,7 @@ public class OrderBookViewCB extends CachedViewCB { // Private methods /////////////////////////////////////////////////////////////////////////////////////////// + private void openSetupScreen() { overlayManager.blurContent(); List actions = new ArrayList<>(); @@ -269,7 +231,9 @@ public class OrderBookViewCB extends CachedViewCB { public void handle(ActionEvent actionEvent) { Dialog.Actions.OK.handle(actionEvent); overlayManager.removeBlurContent(); - navigationManager.navigationTo(NavigationItem.ACCOUNT, NavigationItem.ACCOUNT_SETUP); + navigationManager.setNavigationItemsForReturning(navigationManager.getCurrentNavigationItems()); + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.ACCOUNT, + NavigationItem.ACCOUNT_SETUP); } }); Popups.openInfo("You need to setup your trading account before you can trade.", @@ -279,30 +243,13 @@ public class OrderBookViewCB extends CachedViewCB { //TODO not updated yet private void takeOffer(Offer offer) { if (presentationModel.isRegistered()) { - //TODO Remove that when all UIs are converted to CodeBehind - TakeOfferController takeOfferController = null; - if (parent != null) { - if (parent instanceof ViewController) - takeOfferController = (TakeOfferController) ((ViewController) parent) - .loadViewAndGetChildController(NavigationItem - .TAKE_OFFER); - else if (parent instanceof ViewCB) - takeOfferController = (TakeOfferController) ((ViewCB) parent) - .loadView(NavigationItem - .TAKE_OFFER); - } - Coin requestedAmount; - if (!"".equals(amountTextField.getText())) { - requestedAmount = BSFormatter.parseToCoin(amountTextField.getText()); - } - else { - requestedAmount = offer.getAmount(); - } + presentationModel.getOrderBookInfo().setOffer(offer); - if (takeOfferController != null) { - takeOfferController.initWithData(offer, requestedAmount); - } + if (presentationModel.getOrderBookInfo().getDirection() == Direction.BUY) + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.BUY, NavigationItem.TAKE_OFFER); + else + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.SELL, NavigationItem.TAKE_OFFER); } else { openSetupScreen(); @@ -320,7 +267,7 @@ public class OrderBookViewCB extends CachedViewCB { actions); if (response == Dialog.Actions.YES) - navigationManager.navigationTo(NavigationItem.ACCOUNT, NavigationItem.ACCOUNT_SETTINGS, + navigationManager.navigationTo(NavigationItem.MAIN, NavigationItem.ACCOUNT, NavigationItem.ACCOUNT_SETTINGS, NavigationItem.RESTRICTIONS); else orderBookTable.getSelectionModel().clearSelection(); @@ -364,9 +311,46 @@ public class OrderBookViewCB extends CachedViewCB { /////////////////////////////////////////////////////////////////////////////////////////// - // Table + // Setup /////////////////////////////////////////////////////////////////////////////////////////// + private void setupBindings() { + amountTextField.textProperty().bindBidirectional(presentationModel.amount); + priceTextField.textProperty().bindBidirectional(presentationModel.price); + volumeTextField.textProperty().bindBidirectional(presentationModel.volume); + amountBtcLabel.textProperty().bind(presentationModel.btcCode); + priceFiatLabel.textProperty().bind(presentationModel.fiatCode); + volumeFiatLabel.textProperty().bind(presentationModel.fiatCode); + priceDescriptionLabel.textProperty().bind(presentationModel.fiatCode); + volumeDescriptionLabel.textProperty().bind(presentationModel.fiatCode);//Price per Bitcoin in EUR + priceDescriptionLabel.textProperty().bind(createStringBinding(() -> + BSResources.get("Filter by price in {0}", presentationModel.fiatCode.get()), + presentationModel.fiatCode)); + volumeDescriptionLabel.textProperty().bind(createStringBinding(() -> + BSResources.get("Filter by amount in {0}", presentationModel.fiatCode.get()), + presentationModel.fiatCode)); + volumeTextField.promptTextProperty().bind(createStringBinding(() -> + BSResources.get("Amount in {0}", presentationModel.fiatCode.get()), + presentationModel.fiatCode)); + } + + private void setupValidators() { + amountTextField.setValidator(optionalBtcValidator); + priceTextField.setValidator(optionalFiatValidator); + volumeTextField.setValidator(optionalFiatValidator); + } + + private void setupComparators() { + priceColumn.setComparator((o1, o2) -> o1.getOffer().getPrice().compareTo(o2.getOffer().getPrice())); + amountColumn.setComparator((o1, o2) -> o1.getOffer().getAmount().compareTo(o2.getOffer().getAmount())); + volumeColumn.setComparator((o1, o2) -> + o1.getOffer().getOfferVolume().compareTo(o2.getOffer().getOfferVolume())); + countryColumn.setComparator((o1, o2) -> o1.getOffer().getBankAccountCountry().getName().compareTo(o2.getOffer() + .getBankAccountCountry().getName())); + bankAccountTypeColumn.setComparator((o1, o2) -> o1.getOffer().getBankAccountType().compareTo(o2.getOffer() + .getBankAccountType())); + } + private void setAmountColumnCellFactory() { amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper(offer.getValue())); amountColumn.setCellFactory( @@ -479,7 +463,7 @@ public class OrderBookViewCB extends CachedViewCB { Offer offer = item.getOffer(); if (presentationModel.isMyOffer(offer)) { - icon = ImageUtil.getIconImage(ImageUtil.REMOVE); + icon = ImageUtil.getIconImage(ImageUtil.REMOVE_ICON); title = "Remove"; button.setOnAction(event -> presentationModel.removeOffer(item .getOffer())); diff --git a/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferController.java b/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferController.java index fc4067f487..3b2b803bb4 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferController.java +++ b/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferController.java @@ -23,6 +23,7 @@ import io.bitsquare.btc.WalletFacade; import io.bitsquare.gui.CachedViewController; import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.components.ValidatedTextField; +import io.bitsquare.gui.main.trade.OrderBookInfo; import io.bitsquare.gui.main.trade.TradeViewCB; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BitSquareValidator; @@ -108,9 +109,12 @@ public class TakeOfferController extends CachedViewController { // Public methods /////////////////////////////////////////////////////////////////////////////////////////// - public void initWithData(Offer offer, Coin requestedAmount) { - this.offer = offer; - this.requestedAmount = requestedAmount.compareTo(Coin.ZERO) == 0 ? offer.getAmount() : requestedAmount; + public void initWithData(OrderBookInfo orderBookInfo) { + this.offer = orderBookInfo.getOffer(); + if (orderBookInfo.getAmount() != null && !orderBookInfo.getAmount().isZero()) + requestedAmount = orderBookInfo.getAmount(); + else + requestedAmount = offer.getAmount(); if (amountTextField != null) { applyData(); diff --git a/src/main/java/io/bitsquare/gui/util/ImageUtil.java b/src/main/java/io/bitsquare/gui/util/ImageUtil.java index 92eb60555b..a24a3ee5ab 100644 --- a/src/main/java/io/bitsquare/gui/util/ImageUtil.java +++ b/src/main/java/io/bitsquare/gui/util/ImageUtil.java @@ -34,10 +34,10 @@ public class ImageUtil { public static final String HOME = "/images/nav/home.png"; public static final String HOME_ACTIVE = "/images/nav/home_active.png"; - public static final String NAV_BUY = "/images/nav/buy.png"; - public static final String NAV_BUY_ACTIVE = "/images/nav/buy_active.png"; - public static final String NAV_SELL = "/images/nav/sell.png"; - public static final String NAV_SELL_ACTIVE = "/images/nav/sell_active.png"; + public static final String BUY = "/images/nav/buy.png"; + public static final String BUY_ACTIVE = "/images/nav/buy_active.png"; + public static final String SELL = "/images/nav/sell.png"; + public static final String SELL_ACTIVE = "/images/nav/sell_active.png"; public static final String ORDERS = "/images/nav/orders.png"; public static final String ORDERS_ACTIVE = "/images/nav/orders_active.png"; public static final String FUNDS = "/images/nav/funds.png"; @@ -51,9 +51,9 @@ public class ImageUtil { public static final String MSG_ALERT = "/images/nav/alertRound.png"; - public static final String BUY = "/images/buy.png"; - public static final String SELL = "/images/sell.png"; - public static final String REMOVE = "/images/removeOffer.png"; + public static final String BUY_ICON = "/images/buy.png"; + public static final String SELL_ICON = "/images/sell.png"; + public static final String REMOVE_ICON = "/images/removeOffer.png"; public static final String EXPAND = "/images/expand.png"; public static final String COLLAPSE = "/images/collapse.png"; diff --git a/src/main/java/io/bitsquare/locale/BSResources.java b/src/main/java/io/bitsquare/locale/BSResources.java index 7c1db7cc77..429c436e91 100644 --- a/src/main/java/io/bitsquare/locale/BSResources.java +++ b/src/main/java/io/bitsquare/locale/BSResources.java @@ -48,7 +48,7 @@ public class BSResources { try { return BSResources.getResourceBundle().getString(key); } catch (MissingResourceException e) { - log.error("MissingResourceException for key: " + key); + log.warn("MissingResourceException for key: " + key); return key; } } diff --git a/src/main/java/io/bitsquare/msg/MessageFacade.java b/src/main/java/io/bitsquare/msg/MessageFacade.java index ed5b5b0a97..fd1ea89b90 100644 --- a/src/main/java/io/bitsquare/msg/MessageFacade.java +++ b/src/main/java/io/bitsquare/msg/MessageFacade.java @@ -299,7 +299,7 @@ public class MessageFacade implements MessageBroker { listener.onOffersReceived(offers))); } - log.trace("Get offers from DHT was successful"); + //log.trace("Get offers from DHT was successful"); /* log.trace("Get offers from DHT was successful. Stored data: [key: " + locationKey + ", values: " + futureGet.dataMap() + "]");*/ }