Refactor ViewLoader

This commit is contained in:
Chris Beams 2014-11-23 19:58:43 +01:00
parent d120dcad06
commit 318bfc5fb0
No known key found for this signature in database
GPG Key ID: 3D214F8F5BC5ED73
15 changed files with 62 additions and 68 deletions

View File

@ -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");

View File

@ -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<URL, Item> cache = new HashMap<>();
private final Map<URL, View> 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;
}
}

View File

@ -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<StackPane, MainViewModel> {
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)

View File

@ -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<TabPane, AccountViewModel> {
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<TabPane, AccountViewModel> {
// for IRC demo we deactivate the arbitratorSettingsTab
arbitratorSettingsTab.setDisable(true);
tab.setContent(loaded.view);
tab.setContent(view.getRoot());
root.getSelectionModel().select(tab);
}
}

View File

@ -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();
}

View File

@ -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<Pane, Void> 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

View File

@ -146,7 +146,7 @@ public class RestrictionsView extends ActivatableViewAndModel<GridPane, Restrict
}
private void loadView(Navigation.Item navigationItem) {
ViewLoader.Item loaded = viewLoader.load(navigationItem.getFxmlUrl(), false);
View view = viewLoader.load(navigationItem.getFxmlUrl(), false);
final Stage stage = new Stage();
stage.setTitle("Arbitrator selection");
@ -158,7 +158,7 @@ public class RestrictionsView extends ActivatableViewAndModel<GridPane, Restrict
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.setOnHidden(windowEvent -> {
if (navigationItem == Navigation.Item.ARBITRATOR_BROWSER)

View File

@ -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) {

View File

@ -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);
}
}

View File

@ -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<TabPane, Activatable> {
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<TabPane, Activatable> {
currentTab = transactionsTab;
break;
}
currentTab.setContent(loaded.view);
currentTab.setContent(view.getRoot());
root.getSelectionModel().select(currentTab);
}
}

View File

@ -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<TabPane, Activatable> {
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<TabPane, Activatable> {
currentTab = closedTradesTab;
break;
}
currentTab.setContent(loaded.view);
currentTab.setContent(view.getRoot());
root.getSelectionModel().select(currentTab);
}
}

View File

@ -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<TabPane, Activatable> {
}
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<TabPane, Activatable> {
default:
throw new IllegalArgumentException("navigation item of type " + navigationItem + " is not allowed");
}
tab.setContent(loaded.view);
tab.setContent(view.getRoot());
root.getSelectionModel().select(tab);
}
}

View File

@ -122,12 +122,12 @@ public class TradeView extends ActivatableView<TabPane, Void> {
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<TabPane, Void> {
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<TabPane, Void> {
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);

View File

@ -17,5 +17,8 @@
package viewfx.view;
import javafx.scene.*;
public interface View {
Node getRoot();
}

View File

@ -39,4 +39,8 @@ public abstract class AbstractView<R extends Node, M> implements View {
public AbstractView() {
this(null);
}
public R getRoot() {
return root;
}
}