diff --git a/src/main/java/io/bitsquare/app/gui/BitsquareApp.java b/src/main/java/io/bitsquare/app/gui/BitsquareApp.java index 041ebb75bf..45519fca96 100644 --- a/src/main/java/io/bitsquare/app/gui/BitsquareApp.java +++ b/src/main/java/io/bitsquare/app/gui/BitsquareApp.java @@ -40,6 +40,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import viewfx.view.View; + import javafx.application.Application; import javafx.scene.*; import javafx.scene.image.*; @@ -94,9 +96,9 @@ public class BitsquareApp extends Application { // load the main view and create the main scene ViewLoader viewLoader = injector.getInstance(ViewLoader.class); - ViewLoader.Item loaded = viewLoader.load(Navigation.Item.MAIN.getFxmlUrl(), false); + View view = viewLoader.load(Navigation.Item.MAIN.getFxmlUrl(), false); - Scene scene = new Scene((Parent) loaded.view, 1000, 600); + Scene scene = new Scene((Parent) view.getRoot(), 1000, 600); scene.getStylesheets().setAll( "/io/bitsquare/gui/bitsquare.css", "/io/bitsquare/gui/images.css"); diff --git a/src/main/java/io/bitsquare/gui/ViewLoader.java b/src/main/java/io/bitsquare/gui/ViewLoader.java index 6fd940b975..3712cb90b8 100644 --- a/src/main/java/io/bitsquare/gui/ViewLoader.java +++ b/src/main/java/io/bitsquare/gui/ViewLoader.java @@ -17,11 +17,8 @@ package io.bitsquare.gui; -import io.bitsquare.BitsquareException; import io.bitsquare.locale.BSResources; -import java.io.IOException; - import java.net.URL; import java.util.HashMap; @@ -29,10 +26,10 @@ import java.util.Map; import javax.inject.Inject; +import viewfx.view.View; + import javafx.fxml.FXMLLoader; -import javafx.fxml.Initializable; import javafx.fxml.JavaFXBuilderFactory; -import javafx.scene.*; import javafx.util.BuilderFactory; /** @@ -41,7 +38,7 @@ import javafx.util.BuilderFactory; */ public class ViewLoader { - private final Map cache = new HashMap<>(); + private final Map cache = new HashMap<>(); private final BuilderFactory builderFactory = new JavaFXBuilderFactory(); private final GuiceControllerFactory controllerFactory; @@ -50,35 +47,18 @@ public class ViewLoader { this.controllerFactory = controllerFactory; } - public Item load(URL url) { + public View load(URL url) { return load(url, true); } - public Item load(URL url, boolean useCaching) { - Item item; - - if (useCaching && cache.containsKey(url)) { + public View load(URL url, boolean useCaching) { + if (useCaching && cache.containsKey(url)) return cache.get(url); - } FXMLLoader loader = new FXMLLoader(url, BSResources.getResourceBundle(), builderFactory, controllerFactory); - try { - item = new Item(loader.load(), loader.getController()); - cache.put(url, item); - return item; - } catch (IOException e) { - throw new BitsquareException(e, "Failed to load view at %s", url); - } - } - - public static class Item { - public final Node view; - public final Initializable controller; - - Item(Node view, Initializable controller) { - this.view = view; - this.controller = controller; - } + View view = loader.getController(); + cache.put(url, view); + return view; } } diff --git a/src/main/java/io/bitsquare/gui/main/MainView.java b/src/main/java/io/bitsquare/gui/main/MainView.java index 3011a5f737..bab345282c 100644 --- a/src/main/java/io/bitsquare/gui/main/MainView.java +++ b/src/main/java/io/bitsquare/gui/main/MainView.java @@ -29,6 +29,7 @@ import io.bitsquare.gui.util.Transitions; import javax.inject.Inject; import javax.inject.Named; +import viewfx.view.View; import viewfx.view.support.ActivatableView; import javafx.application.Platform; @@ -125,8 +126,8 @@ public class MainView extends ActivatableView { if (navItems == null || navItems.length != 2 || navItems[0] != Navigation.Item.MAIN) return; - ViewLoader.Item loaded = viewLoader.load(navItems[1].getFxmlUrl()); - contentContainer.getChildren().setAll(loaded.view); + View view = viewLoader.load(navItems[1].getFxmlUrl()); + contentContainer.getChildren().setAll(view.getRoot()); navButtons.getToggles().stream() .filter(toggle -> toggle instanceof ToggleButton) diff --git a/src/main/java/io/bitsquare/gui/main/account/AccountView.java b/src/main/java/io/bitsquare/gui/main/account/AccountView.java index c58794ade3..a182243481 100644 --- a/src/main/java/io/bitsquare/gui/main/account/AccountView.java +++ b/src/main/java/io/bitsquare/gui/main/account/AccountView.java @@ -22,6 +22,7 @@ import io.bitsquare.gui.ViewLoader; import javax.inject.Inject; +import viewfx.view.View; import viewfx.view.support.ActivatableView; import javafx.beans.value.ChangeListener; @@ -95,7 +96,7 @@ public class AccountView extends ActivatableView { private void loadView(Navigation.Item navigationItem) { - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl()); + View view = viewLoader.load(navigationItem.getFxmlUrl()); final Tab tab; switch (navigationItem) { case ACCOUNT_SETTINGS: @@ -118,7 +119,7 @@ public class AccountView extends ActivatableView { // for IRC demo we deactivate the arbitratorSettingsTab arbitratorSettingsTab.setDisable(true); - tab.setContent(loaded.view); + tab.setContent(view.getRoot()); root.getSelectionModel().select(tab); } } diff --git a/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java b/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java index 9f9f0ed2e6..c8ca06bef3 100644 --- a/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java +++ b/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java @@ -23,6 +23,7 @@ import io.bitsquare.gui.main.account.arbitrator.registration.ArbitratorRegistrat import javax.inject.Inject; +import viewfx.view.View; import viewfx.view.support.AbstractView; import javafx.fxml.FXML; @@ -47,8 +48,8 @@ class ArbitratorSettingsView extends AbstractView { } private void loadView(Navigation.Item navigationItem) { - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl(), false); - arbitratorRegistrationView = (ArbitratorRegistrationView) loaded.controller; + View view = viewLoader.load(navigationItem.getFxmlUrl(), false); + arbitratorRegistrationView = (ArbitratorRegistrationView) view; final Stage stage = new Stage(); stage.setTitle("Arbitrator"); @@ -60,7 +61,7 @@ class ArbitratorSettingsView extends AbstractView { stage.setY(primaryStage.getY() + 50); stage.initModality(Modality.WINDOW_MODAL); stage.initOwner(primaryStage); - Scene scene = new Scene((Parent) loaded.view, 800, 600); + Scene scene = new Scene((Parent) view.getRoot(), 800, 600); stage.setScene(scene); stage.show(); } diff --git a/src/main/java/io/bitsquare/gui/main/account/arbitrator/browser/ArbitratorBrowserView.java b/src/main/java/io/bitsquare/gui/main/account/arbitrator/browser/ArbitratorBrowserView.java index 5e299e32cf..b676883db8 100644 --- a/src/main/java/io/bitsquare/gui/main/account/arbitrator/browser/ArbitratorBrowserView.java +++ b/src/main/java/io/bitsquare/gui/main/account/arbitrator/browser/ArbitratorBrowserView.java @@ -32,6 +32,7 @@ import java.util.List; import javax.inject.Inject; +import viewfx.view.View; import viewfx.view.support.ActivatableView; import javafx.fxml.FXML; @@ -91,9 +92,9 @@ class ArbitratorBrowserView extends ActivatableView implements Arbit private void loadView(Navigation.Item navigationItem) { - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl()); - root.getChildren().set(0, loaded.view); - arbitratorProfileView = (ArbitratorProfileView) loaded.controller; + View view = viewLoader.load(navigationItem.getFxmlUrl()); + root.getChildren().set(0, view.getRoot()); + arbitratorProfileView = (ArbitratorProfileView) view; } @Override diff --git a/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsView.java b/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsView.java index 24b668ff29..899ae53b90 100644 --- a/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsView.java +++ b/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsView.java @@ -146,7 +146,7 @@ public class RestrictionsView extends ActivatableViewAndModel { if (navigationItem == Navigation.Item.ARBITRATOR_BROWSER) diff --git a/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java b/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java index 39654676ab..02790133fd 100644 --- a/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java +++ b/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java @@ -109,11 +109,10 @@ class AccountSettingsView extends ActivatableViewAndModel { } private void loadView(Navigation.Item navigationItem) { - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl()); - content.getChildren().setAll(loaded.view); - View child = (View) loaded.controller; - if (child instanceof Wizard.Step) - ((Wizard.Step) child).hideWizardNavigation(); + View view = viewLoader.load(navigationItem.getFxmlUrl()); + content.getChildren().setAll(view.getRoot()); + if (view instanceof Wizard.Step) + ((Wizard.Step) view).hideWizardNavigation(); } private void selectMainMenuButton(Navigation.Item item) { diff --git a/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java b/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java index cb77a53f53..c09befd3c6 100644 --- a/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java +++ b/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java @@ -153,11 +153,10 @@ class AccountSetupWizard extends ActivatableView implements Wizard { } protected void loadView(Navigation.Item navigationItem) { - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl()); - content.getChildren().setAll(loaded.view); - View child = (View) loaded.controller; - if (child instanceof Wizard.Step) - ((Step) child).setParent(this); + View view = viewLoader.load(navigationItem.getFxmlUrl()); + content.getChildren().setAll(view.getRoot()); + if (view instanceof Wizard.Step) + ((Step) view).setParent(this); } } diff --git a/src/main/java/io/bitsquare/gui/main/funds/FundsView.java b/src/main/java/io/bitsquare/gui/main/funds/FundsView.java index 3fbd251c68..428837120f 100644 --- a/src/main/java/io/bitsquare/gui/main/funds/FundsView.java +++ b/src/main/java/io/bitsquare/gui/main/funds/FundsView.java @@ -23,6 +23,7 @@ import io.bitsquare.gui.ViewLoader; import javax.inject.Inject; import viewfx.model.Activatable; +import viewfx.view.View; import viewfx.view.support.ActivatableViewAndModel; import javafx.beans.value.ChangeListener; @@ -84,7 +85,7 @@ class FundsView extends ActivatableViewAndModel { if (currentTab != null) currentTab.setContent(null); - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl()); + View view = viewLoader.load(navigationItem.getFxmlUrl()); switch (navigationItem) { case WITHDRAWAL: currentTab = withdrawalTab; @@ -93,7 +94,7 @@ class FundsView extends ActivatableViewAndModel { currentTab = transactionsTab; break; } - currentTab.setContent(loaded.view); + currentTab.setContent(view.getRoot()); root.getSelectionModel().select(currentTab); } } diff --git a/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java b/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java index 7e3c227f2f..6cc2f5ffa2 100644 --- a/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java +++ b/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java @@ -24,6 +24,7 @@ import io.bitsquare.trade.TradeManager; import javax.inject.Inject; import viewfx.model.Activatable; +import viewfx.view.View; import viewfx.view.support.ActivatableViewAndModel; import javafx.beans.value.ChangeListener; @@ -92,7 +93,7 @@ class PortfolioView extends ActivatableViewAndModel { if (currentTab != null) currentTab.setContent(null); - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl()); + View view = viewLoader.load(navigationItem.getFxmlUrl()); switch (navigationItem) { case OFFERS: currentTab = offersTab; @@ -104,7 +105,7 @@ class PortfolioView extends ActivatableViewAndModel { currentTab = closedTradesTab; break; } - currentTab.setContent(loaded.view); + currentTab.setContent(view.getRoot()); root.getSelectionModel().select(currentTab); } } diff --git a/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java b/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java index c8ab6392eb..bf74392bd4 100644 --- a/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java +++ b/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java @@ -24,6 +24,7 @@ import io.bitsquare.settings.Preferences; import javax.inject.Inject; import viewfx.model.Activatable; +import viewfx.view.View; import viewfx.view.support.ActivatableViewAndModel; import javafx.beans.value.ChangeListener; @@ -88,7 +89,7 @@ class SettingsView extends ActivatableViewAndModel { } private void loadView(Navigation.Item navigationItem) { - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl()); + View view = viewLoader.load(navigationItem.getFxmlUrl()); final Tab tab; switch (navigationItem) { case PREFERENCES: @@ -100,7 +101,7 @@ class SettingsView extends ActivatableViewAndModel { default: throw new IllegalArgumentException("navigation item of type " + navigationItem + " is not allowed"); } - tab.setContent(loaded.view); + tab.setContent(view.getRoot()); root.getSelectionModel().select(tab); } } diff --git a/src/main/java/io/bitsquare/gui/main/trade/TradeView.java b/src/main/java/io/bitsquare/gui/main/trade/TradeView.java index d3c0f049a6..df1790183b 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/TradeView.java +++ b/src/main/java/io/bitsquare/gui/main/trade/TradeView.java @@ -122,12 +122,12 @@ public class TradeView extends ActivatableView { TabPane tabPane = root; if (navigationItem == Navigation.Item.OFFER_BOOK && offerBookView == null) { // Offerbook must not be cached by ViewLoader as we use 2 instances for sell and buy screens. - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl(), false); + View view = viewLoader.load(navigationItem.getFxmlUrl(), false); final Tab tab = new Tab(direction == Direction.BUY ? "Buy Bitcoin" : "Sell Bitcoin"); tab.setClosable(false); - tab.setContent(loaded.view); + tab.setContent(view.getRoot()); tabPane.getTabs().add(tab); - offerBookView = (OfferBookView) loaded.controller; + offerBookView = (OfferBookView) view; offerBookView.setParent(this); offerBookView.setDirection(direction); @@ -137,10 +137,10 @@ public class TradeView extends ActivatableView { else if (navigationItem == Navigation.Item.CREATE_OFFER && createOfferView == null) { // CreateOffer and TakeOffer must not be cached by ViewLoader as we cannot use a view multiple times // in different graphs - ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl(), false); - createOfferRoot = loaded.view; - createOfferView = (CreateOfferView) loaded.controller; + View view = viewLoader.load(navigationItem.getFxmlUrl(), false); + createOfferView = (CreateOfferView) view; createOfferView.initWithData(direction, amount, price); + createOfferRoot = view.getRoot(); final Tab tab = new Tab("Create offer"); createOfferView.configCloseHandlers(tab.closableProperty()); tab.setContent(createOfferRoot); @@ -152,10 +152,10 @@ public class TradeView extends ActivatableView { offer != null) { // CreateOffer and TakeOffer must not be cached by ViewLoader as we cannot use a view multiple times // in different graphs - ViewLoader.Item loaded = viewLoader.load(Navigation.Item.TAKE_OFFER.getFxmlUrl(), false); - takeOfferRoot = loaded.view; - takeOfferView = (TakeOfferView) loaded.controller; + View view = viewLoader.load(Navigation.Item.TAKE_OFFER.getFxmlUrl(), false); + takeOfferView = (TakeOfferView) view; takeOfferView.initWithData(direction, amount, offer); + takeOfferRoot = view.getRoot(); final Tab tab = new Tab("Take offer"); takeOfferView.configCloseHandlers(tab.closableProperty()); tab.setContent(takeOfferRoot); diff --git a/src/main/java/viewfx/view/View.java b/src/main/java/viewfx/view/View.java index e0efad73e0..6fd44a1e0a 100644 --- a/src/main/java/viewfx/view/View.java +++ b/src/main/java/viewfx/view/View.java @@ -17,5 +17,8 @@ package viewfx.view; +import javafx.scene.*; + public interface View { + Node getRoot(); } diff --git a/src/main/java/viewfx/view/support/AbstractView.java b/src/main/java/viewfx/view/support/AbstractView.java index 89ac694439..608937c62c 100644 --- a/src/main/java/viewfx/view/support/AbstractView.java +++ b/src/main/java/viewfx/view/support/AbstractView.java @@ -39,4 +39,8 @@ public abstract class AbstractView implements View { public AbstractView() { this(null); } + + public R getRoot() { + return root; + } }