Refactor trade UIs to new pattern, more changes

This commit is contained in:
Manfred Karrer 2014-09-11 13:00:41 +02:00
parent 81129b8203
commit f20fe3a22b
12 changed files with 66 additions and 80 deletions

View file

@ -77,7 +77,7 @@ public abstract class ViewController implements Initializable {
* @param parentController Controller who has created this.getClass().getSimpleName() instance (via * @param parentController Controller who has created this.getClass().getSimpleName() instance (via
* navigateToView/FXMLLoader). * navigateToView/FXMLLoader).
*/ */
public void setParentController(ViewController parentController) { public void setParentController(Initializable parentController) {
log.trace("Lifecycle: setParentController " + this.getClass().getSimpleName() + " / parent = " + log.trace("Lifecycle: setParentController " + this.getClass().getSimpleName() + " / parent = " +
parentController); parentController);
this.parentController = parentController; this.parentController = parentController;

View file

@ -20,7 +20,6 @@ package io.bitsquare.gui.main.arbitrators.browser;
import io.bitsquare.arbitrator.Arbitrator; import io.bitsquare.arbitrator.Arbitrator;
import io.bitsquare.gui.CachedViewController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.main.arbitrators.profile.ArbitratorProfileController; import io.bitsquare.gui.main.arbitrators.profile.ArbitratorProfileController;
import io.bitsquare.locale.LanguageUtil; import io.bitsquare.locale.LanguageUtil;
import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageFacade;
@ -117,7 +116,7 @@ public class ArbitratorBrowserController extends CachedViewController implements
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setParentController(ViewController parentController) { public void setParentController(Initializable parentController) {
super.setParentController(parentController); super.setParentController(parentController);
} }

View file

@ -20,7 +20,6 @@ package io.bitsquare.gui.main.arbitrators.profile;
import io.bitsquare.arbitrator.Arbitrator; import io.bitsquare.arbitrator.Arbitrator;
import io.bitsquare.gui.CachedViewController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.persistence.Persistence; import io.bitsquare.persistence.Persistence;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
@ -95,7 +94,7 @@ public class ArbitratorProfileController extends CachedViewController {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setParentController(ViewController parentController) { public void setParentController(Initializable parentController) {
super.setParentController(parentController); super.setParentController(parentController);
} }

View file

@ -22,7 +22,6 @@ import io.bitsquare.arbitrator.Reputation;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.CachedViewController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.components.ConfidenceDisplay; import io.bitsquare.gui.components.ConfidenceDisplay;
import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator;
import io.bitsquare.gui.main.arbitrators.profile.ArbitratorProfileController; import io.bitsquare.gui.main.arbitrators.profile.ArbitratorProfileController;
@ -220,7 +219,7 @@ public class ArbitratorRegistrationController extends CachedViewController {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setParentController(ViewController parentController) { public void setParentController(Initializable parentController) {
super.setParentController(parentController); super.setParentController(parentController);
} }

View file

@ -19,7 +19,7 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.trade.BuyController" <TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.trade.BuyViewCB"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml"/> xmlns:fx="http://javafx.com/fxml"/>

View file

@ -21,17 +21,16 @@ import io.bitsquare.trade.Direction;
import javax.inject.Inject; import javax.inject.Inject;
public class BuyController extends TradeController { public class BuyViewCB extends TradeViewCB {
@Inject @Inject
public BuyController(TradePM presentationModel) { public BuyViewCB(TradePM presentationModel) {
super(presentationModel); super(presentationModel);
} }
@Override @Override
protected void applyDirection() { protected void initOrderBook() {
//tabPane.getSelectionModel().select(0); orderBookViewCB.initOrderBook(Direction.BUY);
orderBookController.applyDirection(Direction.BUY);
} }
} }

View file

@ -19,7 +19,7 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.trade.SellController" <TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.trade.SellViewCB"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml"/> xmlns:fx="http://javafx.com/fxml"/>

View file

@ -21,16 +21,16 @@ import io.bitsquare.trade.Direction;
import javax.inject.Inject; import javax.inject.Inject;
public class SellController extends TradeController { public class SellViewCB extends TradeViewCB {
@Inject @Inject
public SellController(TradePM presentationModel) { public SellViewCB(TradePM presentationModel) {
super(presentationModel); super(presentationModel);
} }
@Override @Override
protected void applyDirection() { protected void initOrderBook() {
orderBookController.applyDirection(Direction.SELL); orderBookViewCB.initOrderBook(Direction.SELL);
} }

View file

@ -21,9 +21,8 @@ import io.bitsquare.gui.CachedViewCB;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.components.InputTextField; import io.bitsquare.gui.components.InputTextField;
import io.bitsquare.gui.main.trade.createoffer.CreateOfferViewCB; import io.bitsquare.gui.main.trade.createoffer.CreateOfferViewCB;
import io.bitsquare.gui.main.trade.orderbook.OrderBookController; import io.bitsquare.gui.main.trade.orderbook.OrderBookViewCB;
import io.bitsquare.gui.main.trade.takeoffer.TakeOfferController; import io.bitsquare.gui.main.trade.takeoffer.TakeOfferController;
import io.bitsquare.trade.Direction;
import io.bitsquare.util.BSFXMLLoader; import io.bitsquare.util.BSFXMLLoader;
import java.io.IOException; import java.io.IOException;
@ -33,6 +32,7 @@ import java.net.URL;
import java.util.List; import java.util.List;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.*; import javafx.scene.*;
@ -43,13 +43,12 @@ import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
public class TradeController extends CachedViewCB<TradePM> { public abstract class TradeViewCB extends CachedViewCB<TradePM> {
private static final Logger log = LoggerFactory.getLogger(TradeController.class); private static final Logger log = LoggerFactory.getLogger(TradeViewCB.class);
protected OrderBookController orderBookController; protected OrderBookViewCB orderBookViewCB;
protected CreateOfferViewCB createOfferCodeBehind; protected CreateOfferViewCB createOfferViewCB;
protected TakeOfferController takeOfferController; protected TakeOfferController takeOfferController;
protected BSFXMLLoader orderBookLoader;
private Node createOfferView; private Node createOfferView;
@ -57,7 +56,7 @@ public class TradeController extends CachedViewCB<TradePM> {
// Constructor // Constructor
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
protected TradeController(TradePM presentationModel) { protected TradeViewCB(TradePM presentationModel) {
super(presentationModel); super(presentationModel);
} }
@ -72,33 +71,29 @@ public class TradeController extends CachedViewCB<TradePM> {
super.initialize(url, rb); super.initialize(url, rb);
loadView(NavigationItem.ORDER_BOOK); loadView(NavigationItem.ORDER_BOOK);
initOrderBook();
} }
@Override @Override
public void activate() { public void activate() {
super.activate(); super.activate();
applyDirection(); // 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
// TODO find better solution // Platform.runLater needed as focusout evetn is called after selectedIndexProperty changed
// Textfield focus out triggers validation, use runLater as quick fix... TabPane tabPane = (TabPane) root;
tabPane.getSelectionModel().selectedIndexProperty()
//TODO update to new verison .addListener((observableValue, oldValue, newValue) ->
((TabPane) root).getSelectionModel().selectedIndexProperty().addListener((observableValue, oldValue, Platform.runLater(InputTextField::hideErrorMessageDisplay));
newValue) ->
{
InputTextField.hideErrorMessageDisplay();
}
);
// We want to get informed when a tab get closed // We want to get informed when a tab get closed
((TabPane) root).getTabs().addListener((ListChangeListener<Tab>) change -> { tabPane.getTabs().addListener((ListChangeListener<Tab>) change -> {
change.next(); change.next();
List<? extends Tab> removedTabs = change.getRemoved(); List<? extends Tab> removedTabs = change.getRemoved();
if (removedTabs.size() == 1 && removedTabs.get(0).getContent().equals(createOfferView)) { if (removedTabs.size() == 1 && removedTabs.get(0).getContent().equals(createOfferView)) {
if (createOfferCodeBehind != null) { if (createOfferViewCB != null) {
createOfferCodeBehind.terminate(); createOfferViewCB.terminate();
createOfferCodeBehind = null; createOfferViewCB = null;
} }
} }
}); });
@ -127,47 +122,46 @@ public class TradeController extends CachedViewCB<TradePM> {
TabPane tabPane = (TabPane) root; TabPane tabPane = (TabPane) root;
if (navigationItem == NavigationItem.ORDER_BOOK) { if (navigationItem == NavigationItem.ORDER_BOOK) {
checkArgument(orderBookLoader == null); checkArgument(orderBookViewCB == null);
// Orderbook must not be cached by GuiceFXMLLoader as we use 2 instances for sell and buy screens. // Orderbook must not be cached by GuiceFXMLLoader as we use 2 instances for sell and buy screens.
orderBookLoader = BSFXMLLoader orderBookLoader =
new BSFXMLLoader(getClass().getResource(NavigationItem.ORDER_BOOK.getFxmlUrl()), false); new BSFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false);
try { try {
final Parent view = orderBookLoader.load(); final Parent view = orderBookLoader.load();
final Tab tab = new Tab("Orderbook"); final Tab tab = new Tab("Orderbook");
tab.setClosable(false); tab.setClosable(false);
tab.setContent(view); tab.setContent(view);
tabPane.getTabs().add(tab); tabPane.getTabs().add(tab);
orderBookViewCB = orderBookLoader.getController();
orderBookViewCB.setParent(this);
return orderBookViewCB;
} catch (IOException e) { } catch (IOException e) {
log.error(e.getMessage()); log.error(e.getMessage());
} }
orderBookController = orderBookLoader.getController();
orderBookController.setParent(this);
return orderBookController;
} }
else if (navigationItem == NavigationItem.CREATE_OFFER) { else if (navigationItem == NavigationItem.CREATE_OFFER) {
checkArgument(createOfferCodeBehind == null); checkArgument(createOfferViewCB == null);
// CreateOffer and TakeOffer must not be cached by GuiceFXMLLoader as we cannot use a view multiple times // CreateOffer and TakeOffer must not be cached by GuiceFXMLLoader as we cannot use a view multiple times
// in different graphs // in different graphs
BSFXMLLoader loader = new BSFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); BSFXMLLoader loader = new BSFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false);
try { try {
createOfferView = loader.load(); createOfferView = loader.load();
createOfferCodeBehind = loader.getController(); createOfferViewCB = loader.getController();
createOfferCodeBehind.setParent(this); createOfferViewCB.setParent(this);
createOfferCodeBehind.setOnClose(() -> { createOfferViewCB.setOnClose(() -> {
orderBookController.onCreateOfferViewRemoved(); orderBookViewCB.enableCreateOfferButton();
return null; return null;
}); });
final Tab tab = new Tab("Create offer"); final Tab tab = new Tab("Create offer");
tab.setContent(createOfferView); tab.setContent(createOfferView);
tabPane.getTabs().add(tab); tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1); tabPane.getSelectionModel().select(tab);
return createOfferCodeBehind; return createOfferViewCB;
} catch (IOException e) { } catch (IOException e) {
log.error(e.getMessage()); log.error(e.getMessage());
} }
return null;
} }
else if (navigationItem == NavigationItem.TAKE_OFFER) { else if (navigationItem == NavigationItem.TAKE_OFFER) {
checkArgument(takeOfferController == null); checkArgument(takeOfferController == null);
@ -178,22 +172,20 @@ public class TradeController extends CachedViewCB<TradePM> {
try { try {
final Parent view = loader.load(); final Parent view = loader.load();
takeOfferController = loader.getController(); takeOfferController = loader.getController();
//TODO takeOfferController.setParentController(this);
//takeOfferController.setParentController(this);
final Tab tab = new Tab("Take offer"); final Tab tab = new Tab("Take offer");
tab.setContent(view); tab.setContent(view);
tabPane.getTabs().add(tab); tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1); tabPane.getSelectionModel().select(tab);
return takeOfferController; return takeOfferController;
} catch (IOException e) { } catch (IOException e) {
log.error(e.getMessage()); log.error(e.getMessage());
} }
return null;
} }
else { else {
log.error("navigationItem not supported: " + navigationItem); log.error("navigationItem not supported: " + navigationItem);
return null;
} }
return null;
} }
@ -202,7 +194,8 @@ public class TradeController extends CachedViewCB<TradePM> {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public void onCreateOfferViewRemoved() { public void onCreateOfferViewRemoved() {
orderBookController.onCreateOfferViewRemoved(); createOfferViewCB = null;
orderBookViewCB.enableCreateOfferButton();
} }
public void onTakeOfferViewRemoved() { public void onTakeOfferViewRemoved() {
@ -211,13 +204,10 @@ public class TradeController extends CachedViewCB<TradePM> {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Protected // Abstract methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Template method to be overwritten by sub class. abstract protected void initOrderBook();
protected void applyDirection() {
orderBookController.applyDirection(Direction.SELL);
}
} }

View file

@ -21,7 +21,7 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.*?> <?import javafx.scene.control.cell.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.main.trade.orderbook.OrderBookController" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.main.trade.orderbook.OrderBookViewCB"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">

View file

@ -82,8 +82,8 @@ import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class OrderBookController extends CachedViewCB<OrderBookPM> { public class OrderBookViewCB extends CachedViewCB<OrderBookPM> {
private static final Logger log = LoggerFactory.getLogger(OrderBookController.class); private static final Logger log = LoggerFactory.getLogger(OrderBookViewCB.class);
private NavigationController navigationController; private NavigationController navigationController;
private OverlayController overlayController; private OverlayController overlayController;
@ -114,12 +114,12 @@ public class OrderBookController extends CachedViewCB<OrderBookPM> {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject
private OrderBookController(OrderBookPM presentationModel, private OrderBookViewCB(OrderBookPM presentationModel,
NavigationController navigationController, NavigationController navigationController,
OverlayController overlayController, OverlayController overlayController,
OrderBook orderBook, User user, OrderBook orderBook, User user,
MessageFacade messageFacade, MessageFacade messageFacade,
WalletFacade walletFacade, Settings settings, Persistence persistence) { WalletFacade walletFacade, Settings settings, Persistence persistence) {
super(presentationModel); super(presentationModel);
this.navigationController = navigationController; this.navigationController = navigationController;
@ -226,7 +226,7 @@ public class OrderBookController extends CachedViewCB<OrderBookPM> {
// Public methods // Public methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public void applyDirection(Direction direction) { public void initOrderBook(Direction direction) {
init(); init();
orderBookTable.getSelectionModel().clearSelection(); orderBookTable.getSelectionModel().clearSelection();
price.setText(""); price.setText("");
@ -542,7 +542,7 @@ public class OrderBookController extends CachedViewCB<OrderBookPM> {
volume.setText(BSFormatter.formatFiat(Fiat.valueOf("EUR", (long) (a * p)))); volume.setText(BSFormatter.formatFiat(Fiat.valueOf("EUR", (long) (a * p))));
} }
public void onCreateOfferViewRemoved() { public void enableCreateOfferButton() {
createOfferButton.setDisable(false); createOfferButton.setDisable(false);
} }

View file

@ -23,7 +23,7 @@ import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.CachedViewController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.components.Popups;
import io.bitsquare.gui.components.ValidatedTextField; import io.bitsquare.gui.components.ValidatedTextField;
import io.bitsquare.gui.main.trade.TradeController; import io.bitsquare.gui.main.trade.TradeViewCB;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.BitSquareValidator; import io.bitsquare.gui.util.BitSquareValidator;
import io.bitsquare.trade.Offer; import io.bitsquare.trade.Offer;
@ -95,7 +95,7 @@ public class TakeOfferController extends CachedViewController {
@Override @Override
public void deactivate() { public void deactivate() {
super.deactivate(); super.deactivate();
((TradeController) parentController).onTakeOfferViewRemoved(); ((TradeViewCB) parentController).onTakeOfferViewRemoved();
} }
@Override @Override