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,7 +114,7 @@ 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,
@ -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