add support for caching views

This commit is contained in:
Manfred Karrer 2014-08-24 01:43:27 +02:00
parent 3391f6f4d3
commit 71ce70bf4b
59 changed files with 1167 additions and 1227 deletions

View file

@ -7,7 +7,7 @@ import io.bitsquare.btc.WalletFacade;
import io.bitsquare.di.BitSquareModule; import io.bitsquare.di.BitSquareModule;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.popups.Popups; import io.bitsquare.gui.components.Popups;
import io.bitsquare.gui.util.Profiler; import io.bitsquare.gui.util.Profiler;
import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageFacade;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
@ -94,7 +94,7 @@ public class BitSquare extends Application
GuiceFXMLLoader.setInjector(injector); GuiceFXMLLoader.setInjector(injector);
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(NavigationItem.MAIN.getFxmlUrl())); final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(NavigationItem.MAIN.getFxmlUrl()), false);
final Parent view = loader.load(); final Parent view = loader.load();
final Scene scene = new Scene(view, 1000, 750); final Scene scene = new Scene(view, 1000, 750);
scene.getStylesheets().setAll(getClass().getResource("/io/bitsquare/gui/bitsquare.css").toExternalForm()); scene.getStylesheets().setAll(getClass().getResource("/io/bitsquare/gui/bitsquare.css").toExternalForm());

View file

@ -40,8 +40,6 @@ public class GuiceFXMLLoader
{ {
this.url = url; this.url = url;
//TODO
useCaching = false;
isCached = useCaching && cachedGUIItems.containsKey(url); isCached = useCaching && cachedGUIItems.containsKey(url);
if (!isCached) if (!isCached)
{ {

View file

@ -0,0 +1,67 @@
package io.bitsquare.gui;
import java.net.URL;
import java.util.ResourceBundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* If caching is used for loader we use the CachedViewController for turning the controller into sleep mode if not active and awake it at reactivation.
*/
public abstract class CachedViewController extends ViewController
{
private static final Logger log = LoggerFactory.getLogger(CachedViewController.class);
/**
* Get called form GUI framework when the UI is ready.
* In caching controllers the initialize is only used for static UI setup.
* The activate() method is called to start resources like.
*
* @param url
* @param rb
*/
@Override
public void initialize(URL url, ResourceBundle rb)
{
log.trace("Lifecycle: initialize " + this.getClass().getSimpleName());
root.sceneProperty().addListener((ov, oldValue, newValue) -> {
// we got removed from the scene
// lets terminate
log.trace("Lifecycle: sceneProperty changed: " + this.getClass().getSimpleName() + " / oldValue=" + oldValue + " / newValue=" + newValue);
if (oldValue == null && newValue != null) activate();
else if (oldValue != null && newValue == null) deactivate();
});
}
/**
* In caching controllers the terminate calls the deactivate method.
*/
@Override
public void terminate()
{
log.trace("Lifecycle: terminate " + this.getClass().getSimpleName());
super.terminate();
deactivate();
}
/**
* Used for deactivating resources (removing listeners, stopping timers or animations,...)
*/
public void deactivate()
{
log.trace("Lifecycle: deactivate " + this.getClass().getSimpleName());
if (childController instanceof CachedViewController) ((CachedViewController) childController).deactivate();
}
/**
* Used to activate resources (adding listeners, starting timers or animations,...)
*/
public void activate()
{
log.trace("Lifecycle: activate " + this.getClass().getSimpleName());
if (childController instanceof CachedViewController) ((CachedViewController) childController).activate();
}
}

View file

@ -1,8 +0,0 @@
package io.bitsquare.gui;
public interface ChildController
{
void setNavigationController(NavigationController navigationController);
void cleanup();
}

View file

@ -1,9 +0,0 @@
package io.bitsquare.gui;
public interface Hibernate
{
void sleep();
void awake();
}

View file

@ -21,8 +21,6 @@ import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.Node; import javafx.scene.Node;
@ -42,7 +40,7 @@ import org.slf4j.LoggerFactory;
* We use a sequence of Platform.runLater cascaded calls to make the startup more smooth, otherwise the rendering is frozen for too long. * We use a sequence of Platform.runLater cascaded calls to make the startup more smooth, otherwise the rendering is frozen for too long.
* Pre-loading of views is not implemented yet, and after a quick test it seemed that it does not give much improvements. * Pre-loading of views is not implemented yet, and after a quick test it seemed that it does not give much improvements.
*/ */
public class MainController implements Initializable, NavigationController public class MainController extends ViewController
{ {
private static final Logger log = LoggerFactory.getLogger(MainController.class); private static final Logger log = LoggerFactory.getLogger(MainController.class);
private static MainController INSTANCE; private static MainController INSTANCE;
@ -55,7 +53,6 @@ public class MainController implements Initializable, NavigationController
private final ToggleGroup toggleGroup = new ToggleGroup(); private final ToggleGroup toggleGroup = new ToggleGroup();
private final ViewBuilder viewBuilder; private final ViewBuilder viewBuilder;
private ChildController childController;
private ToggleButton prevToggleButton; private ToggleButton prevToggleButton;
private Image prevToggleButtonIcon; private Image prevToggleButtonIcon;
private ToggleButton buyButton, sellButton, homeButton, msgButton, ordersButton, fundsButton, settingsButton; private ToggleButton buyButton, sellButton, homeButton, msgButton, ordersButton, fundsButton, settingsButton;
@ -63,7 +60,15 @@ public class MainController implements Initializable, NavigationController
private boolean messageFacadeInited; private boolean messageFacadeInited;
private boolean walletFacadeInited; private boolean walletFacadeInited;
@FXML private BorderPane root;
///////////////////////////////////////////////////////////////////////////////////////////
// Static
///////////////////////////////////////////////////////////////////////////////////////////
public static MainController GET_INSTANCE()
{
return INSTANCE;
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -84,34 +89,33 @@ public class MainController implements Initializable, NavigationController
MainController.INSTANCE = this; MainController.INSTANCE = this;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Static
///////////////////////////////////////////////////////////////////////////////////////////
public static MainController GET_INSTANCE()
{
return INSTANCE;
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
super.initialize(url, rb);
Profiler.printMsgWithTime("MainController.initialize"); Profiler.printMsgWithTime("MainController.initialize");
Platform.runLater(() -> viewBuilder.buildSplashScreen(root, this)); Platform.runLater(() -> viewBuilder.buildSplashScreen((BorderPane) root, this));
} }
@Override
public void terminate()
{
super.terminate();
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController // Navigation
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public ChildController navigateToView(NavigationItem navigationItem) public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{ {
switch (navigationItem) switch (navigationItem)
{ {
@ -145,7 +149,7 @@ public class MainController implements Initializable, NavigationController
// Startup Handlers // Startup Handlers
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public void onViewInitialized() void onViewInitialized()
{ {
Profiler.printMsgWithTime("MainController.onViewInitialized"); Profiler.printMsgWithTime("MainController.onViewInitialized");
Platform.runLater(this::initFacades); Platform.runLater(this::initFacades);
@ -282,7 +286,7 @@ public class MainController implements Initializable, NavigationController
if (selectedNavigationItem == null) if (selectedNavigationItem == null)
selectedNavigationItem = NavigationItem.BUY; selectedNavigationItem = NavigationItem.BUY;
navigateToView(selectedNavigationItem); loadViewAndGetChildController(selectedNavigationItem);
Platform.runLater(this::onContentViewLoaded); Platform.runLater(this::onContentViewLoaded);
} }
@ -292,14 +296,13 @@ public class MainController implements Initializable, NavigationController
// Private methods // Private methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
private ChildController loadView(NavigationItem navigationItem) private void loadViewFromNavButton(NavigationItem navigationItem)
{ {
if (childController != null)
{ /* if (childController instanceof CachedViewController)
childController.cleanup(); ((CachedViewController) childController).deactivate();
if (childController instanceof Hibernate) else if (childController != null)
((Hibernate) childController).sleep(); childController.terminate();*/
}
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()));
try try
@ -307,16 +310,11 @@ public class MainController implements Initializable, NavigationController
final Node view = loader.load(); final Node view = loader.load();
viewBuilder.contentPane.getChildren().setAll(view); viewBuilder.contentPane.getChildren().setAll(view);
childController = loader.getController(); childController = loader.getController();
childController.setNavigationController(this); childController.setParentController(this);
} catch (IOException e) } catch (IOException e)
{ {
e.printStackTrace();
log.error("Loading view failed. " + navigationItem.getFxmlUrl()); log.error("Loading view failed. " + navigationItem.getFxmlUrl());
} }
if (childController instanceof Hibernate)
((Hibernate) childController).awake();
return childController;
} }
private ToggleButton addNavButton(Pane parent, String title, NavigationItem navigationItem) private ToggleButton addNavButton(Pane parent, String title, NavigationItem navigationItem)
@ -335,7 +333,7 @@ public class MainController implements Initializable, NavigationController
prevToggleButtonIcon = ((ImageView) (toggleButton.getGraphic())).getImage(); prevToggleButtonIcon = ((ImageView) (toggleButton.getGraphic())).getImage();
((ImageView) (toggleButton.getGraphic())).setImage(ImageUtil.getIconImage(navigationItem.getActiveIcon())); ((ImageView) (toggleButton.getGraphic())).setImage(ImageUtil.getIconImage(navigationItem.getActiveIcon()));
childController = loadView(navigationItem); loadViewFromNavButton(navigationItem);
persistence.write(this, "selectedNavigationItem", navigationItem); persistence.write(this, "selectedNavigationItem", navigationItem);

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.BorderPane?> <?import javafx.scene.layout.BorderPane?>
<BorderPane fx:id="root" id="splash" fx:controller="io.bitsquare.gui.MainController" prefHeight="750" prefWidth="1000" stylesheets="/io/bitsquare/gui/bitsquare.css" <BorderPane fx:id="root" id="splash" fx:controller="io.bitsquare.gui.MainController"
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> prefHeight="750" prefWidth="1000" stylesheets="/io/bitsquare/gui/bitsquare.css" xmlns:fx="http://javafx.com/fxml">
</BorderPane> </BorderPane>

View file

@ -1,7 +0,0 @@
package io.bitsquare.gui;
public interface NavigationController
{
ChildController navigateToView(NavigationItem navigationItem);
}

View file

@ -6,16 +6,16 @@ public enum NavigationItem
{ {
MAIN("/io/bitsquare/gui/MainView.fxml"), MAIN("/io/bitsquare/gui/MainView.fxml"),
HOME("/io/bitsquare/gui/home/HomeView.fxml", ImageUtil.HOME, ImageUtil.HOME_ACTIVE), HOME("/io/bitsquare/gui/home/HomeView.fxml", ImageUtil.HOME, ImageUtil.HOME_ACTIVE),
BUY("/io/bitsquare/gui/market/BuyView.fxml", ImageUtil.NAV_BUY, ImageUtil.NAV_BUY_ACTIVE), BUY("/io/bitsquare/gui/trade/BuyView.fxml", ImageUtil.NAV_BUY, ImageUtil.NAV_BUY_ACTIVE),
SELL("/io/bitsquare/gui/market/SellView.fxml", ImageUtil.NAV_SELL, ImageUtil.NAV_SELL_ACTIVE), SELL("/io/bitsquare/gui/trade/SellView.fxml", ImageUtil.NAV_SELL, ImageUtil.NAV_SELL_ACTIVE),
ORDERS("/io/bitsquare/gui/orders/OrdersView.fxml", ImageUtil.ORDERS, ImageUtil.ORDERS_ACTIVE), ORDERS("/io/bitsquare/gui/orders/OrdersView.fxml", ImageUtil.ORDERS, ImageUtil.ORDERS_ACTIVE),
FUNDS("/io/bitsquare/gui/funds/FundsView.fxml", ImageUtil.FUNDS, ImageUtil.FUNDS_ACTIVE), FUNDS("/io/bitsquare/gui/funds/FundsView.fxml", ImageUtil.FUNDS, ImageUtil.FUNDS_ACTIVE),
MSG("/io/bitsquare/gui/msg/MsgView.fxml", ImageUtil.MSG, ImageUtil.MSG_ACTIVE), MSG("/io/bitsquare/gui/msg/MsgView.fxml", ImageUtil.MSG, ImageUtil.MSG_ACTIVE),
SETTINGS("/io/bitsquare/gui/settings/SettingsView.fxml", ImageUtil.SETTINGS, ImageUtil.SETTINGS_ACTIVE), SETTINGS("/io/bitsquare/gui/settings/SettingsView.fxml", ImageUtil.SETTINGS, ImageUtil.SETTINGS_ACTIVE),
ORDER_BOOK("/io/bitsquare/gui/market/orderbook/OrderBookView.fxml"), ORDER_BOOK("/io/bitsquare/gui/trade/orderbook/OrderBookView.fxml"),
CREATE_OFFER("/io/bitsquare/gui/market/createOffer/CreateOfferView.fxml"), CREATE_OFFER("/io/bitsquare/gui/trade/createoffer/CreateOfferView.fxml"),
TAKE_OFFER("/io/bitsquare/gui/market/trade/TakeOfferView.fxml"), TAKE_OFFER("/io/bitsquare/gui/trade/takeoffer/TakeOfferView.fxml"),
//OFFERER_TRADE("/io/bitsquare/gui/orders/OffererTradeView.fxml"), //OFFERER_TRADE("/io/bitsquare/gui/orders/OffererTradeView.fxml"),
OFFER("/io/bitsquare/gui/orders/offer/OfferView.fxml"), OFFER("/io/bitsquare/gui/orders/offer/OfferView.fxml"),

View file

@ -0,0 +1,68 @@
package io.bitsquare.gui;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Base class for all controllers.
*/
public abstract class ViewController implements Initializable
{
private static final Logger log = LoggerFactory.getLogger(ViewController.class);
protected ViewController childController;
protected ViewController parentController;
@FXML protected Parent root;
/**
* Get called form GUI framework when the UI is ready.
*
* @param url
* @param rb
*/
@Override
public void initialize(URL url, ResourceBundle rb)
{
log.trace("Lifecycle: initialize " + this.getClass().getSimpleName());
root.sceneProperty().addListener((ov, oldValue, newValue) -> {
// we got removed from the scene
// lets terminate
if (oldValue != null && newValue == null) terminate();
});
}
/**
* Called automatically when view gets removed. Used for house keeping (removing listeners, stopping timers or animations,...).
*/
public void terminate()
{
log.trace("Lifecycle: terminate " + this.getClass().getSimpleName());
if (childController != null) childController.terminate();
}
/**
* @param parentController Controller who has created this.getClass().getSimpleName() instance (via navigateToView/FXMLLoader).
*/
public void setParentController(ViewController parentController)
{
log.trace("Lifecycle: setParentController " + this.getClass().getSimpleName() + " / parent = " + parentController);
this.parentController = parentController;
}
/**
* @param navigationItem NavigationItem to be loaded.
* @return The ViewController of the loaded view.
*/
public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{
log.trace("Lifecycle: loadViewAndGetChildController " + this.getClass().getSimpleName() + " / navigationItem = " + navigationItem);
return null;
}
}

View file

@ -1,9 +1,9 @@
package io.bitsquare.gui.arbitrators.overview; package io.bitsquare.gui.arbitrators.overview;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.arbitrators.profile.ArbitratorProfileController; import io.bitsquare.gui.arbitrators.profile.ArbitratorProfileController;
import io.bitsquare.locale.LanguageUtil; import io.bitsquare.locale.LanguageUtil;
import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageFacade;
@ -18,10 +18,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.stage.Stage; import javafx.stage.Stage;
import javax.inject.Inject; import javax.inject.Inject;
@ -34,7 +32,7 @@ import net.tomp2p.storage.Data;
* import net.tomp2p.storage.Data; * import net.tomp2p.storage.Data;
*/ */
@SuppressWarnings({"ALL", "UnusedParameters"}) @SuppressWarnings({"ALL", "UnusedParameters"})
public class ArbitratorOverviewController implements Initializable, ChildController, NavigationController, ArbitratorListener public class ArbitratorOverviewController extends CachedViewController implements ArbitratorListener
{ {
private final Settings settings; private final Settings settings;
private final Persistence persistence; private final Persistence persistence;
@ -42,16 +40,11 @@ public class ArbitratorOverviewController implements Initializable, ChildControl
private final MessageFacade messageFacade; private final MessageFacade messageFacade;
private final List<Arbitrator> allArbitrators = new ArrayList<>(); private final List<Arbitrator> allArbitrators = new ArrayList<>();
private Arbitrator currentArbitrator; private Arbitrator currentArbitrator;
private NavigationController navigationController;
private ArbitratorProfileController arbitratorProfileController; private ArbitratorProfileController arbitratorProfileController;
private int index = -1; private int index = -1;
@FXML @FXML private Button prevButton, nextButton, selectButton, closeButton;
private Button prevButton, nextButton, selectButton, closeButton; @FXML private Pane arbitratorProfile;
@FXML
private AnchorPane rootContainer;
@FXML
private Pane arbitratorProfile;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor // Constructor
@ -71,54 +64,57 @@ public class ArbitratorOverviewController implements Initializable, ChildControl
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
navigateToView(NavigationItem.ARBITRATOR_PROFILE); super.initialize(url, rb);
loadViewAndGetChildController(NavigationItem.ARBITRATOR_PROFILE);
checkButtonState(); checkButtonState();
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public void terminate()
{ {
this.navigationController = navigationController; super.terminate();
} }
@Override @Override
public void cleanup() public void deactivate()
{ {
super.deactivate();
}
@Override
public void activate()
{
super.activate();
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController // Navigation
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public ChildController navigateToView(NavigationItem navigationItem) public void setParentController(ViewController parentController)
{ {
if (arbitratorProfileController != null) super.setParentController(parentController);
{
arbitratorProfileController.cleanup();
} }
@Override
public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()));
try try
{ {
final Node view = loader.load(); final Node view = loader.load();
arbitratorProfileController = loader.getController(); arbitratorProfileController = loader.getController();
arbitratorProfileController.setNavigationController(this); arbitratorProfileController.setParentController(this);
rootContainer.getChildren().set(0, view); ((Pane) root).getChildren().set(0, view);
return arbitratorProfileController; return arbitratorProfileController;
} catch (IOException e) } catch (IOException e)
@ -219,7 +215,7 @@ public class ArbitratorOverviewController implements Initializable, ChildControl
@FXML @FXML
public void onClose() public void onClose()
{ {
Stage stage = (Stage) rootContainer.getScene().getWindow(); Stage stage = (Stage) root.getScene().getWindow();
stage.close(); stage.close();
} }

View file

@ -2,8 +2,9 @@
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:id="rootContainer" prefHeight="600" prefWidth="800" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.arbitrators.overview.ArbitratorOverviewController"
AnchorPane.topAnchor="10.0" xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.arbitrators.overview.ArbitratorOverviewController"> prefHeight="600" prefWidth="800" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"
xmlns:fx="http://javafx.com/fxml">
<Pane fx:id="arbitratorProfile"/> <Pane fx:id="arbitratorProfile"/>
<Button fx:id="prevButton" text="Previous" onAction="#onPrevious" AnchorPane.bottomAnchor="45.0" AnchorPane.leftAnchor="10.0"/> <Button fx:id="prevButton" text="Previous" onAction="#onPrevious" AnchorPane.bottomAnchor="45.0" AnchorPane.leftAnchor="10.0"/>
<Button fx:id="nextButton" text="Next" onAction="#onNext" AnchorPane.bottomAnchor="45.0" AnchorPane.rightAnchor="10.0"/> <Button fx:id="nextButton" text="Next" onAction="#onNext" AnchorPane.bottomAnchor="45.0" AnchorPane.rightAnchor="10.0"/>

View file

@ -1,7 +1,8 @@
package io.bitsquare.gui.arbitrators.profile; package io.bitsquare.gui.arbitrators.profile;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
import io.bitsquare.storage.Persistence; import io.bitsquare.storage.Persistence;
@ -9,29 +10,24 @@ import io.bitsquare.user.Arbitrator;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.TextArea; import javafx.scene.control.TextArea;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javax.inject.Inject; import javax.inject.Inject;
@SuppressWarnings("ALL") public class ArbitratorProfileController extends CachedViewController
public class ArbitratorProfileController implements Initializable, ChildController
{ {
private final Settings settings; private final Settings settings;
private final Persistence persistence; private final Persistence persistence;
private Arbitrator arbitrator; private Arbitrator arbitrator;
private NavigationController navigationController;
@FXML
private Label nameLabel; @FXML private Label nameLabel;
@FXML @FXML private TextField nameTextField, languagesTextField, reputationTextField, maxTradeVolumeTextField, passiveServiceFeeTextField, arbitrationFeeTextField, methodsTextField,
private TextField nameTextField, languagesTextField, reputationTextField, maxTradeVolumeTextField, passiveServiceFeeTextField, arbitrationFeeTextField, methodsTextField,
idVerificationsTextField, webPageTextField; idVerificationsTextField, webPageTextField;
@FXML @FXML private TextArea descriptionTextArea;
private TextArea descriptionTextArea;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -49,6 +45,52 @@ public class ArbitratorProfileController implements Initializable, ChildControll
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
super.initialize(url, rb);
}
@Override
public void terminate()
{
super.terminate();
}
@Override
public void deactivate()
{
super.deactivate();
}
@Override
public void activate()
{
super.activate();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Navigation
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setParentController(ViewController parentController)
{
super.setParentController(parentController);
}
@Override
public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{
return null;
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Public Methods // Public Methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -85,41 +127,5 @@ public class ArbitratorProfileController implements Initializable, ChildControll
} }
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
this.navigationController = navigationController;
}
@Override
public void cleanup()
{
}
///////////////////////////////////////////////////////////////////////////////////////////
// UI handlers
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////////////////
} }

View file

@ -3,8 +3,9 @@
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<GridPane xmlns:fx="http://javafx.com/fxml/1" hgap="5.0" vgap="5.0" AnchorPane.bottomAnchor="80.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0" <GridPane fx:id="root" fx:controller="io.bitsquare.gui.arbitrators.profile.ArbitratorProfileController"
xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.arbitrators.profile.ArbitratorProfileController"> hgap="5.0" vgap="5.0" AnchorPane.bottomAnchor="80.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"
xmlns:fx="http://javafx.com/fxml">
<Label fx:id="nameLabel" text="Name:"/> <Label fx:id="nameLabel" text="Name:"/>
<TextField fx:id="nameTextField" editable="false" focusTraversable="false" GridPane.columnIndex="1"/> <TextField fx:id="nameTextField" editable="false" focusTraversable="false" GridPane.columnIndex="1"/>

View file

@ -5,8 +5,9 @@ import com.google.bitcoin.script.Script;
import de.jensd.fx.fontawesome.AwesomeDude; import de.jensd.fx.fontawesome.AwesomeDude;
import de.jensd.fx.fontawesome.AwesomeIcon; import de.jensd.fx.fontawesome.AwesomeIcon;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.arbitrators.profile.ArbitratorProfileController; import io.bitsquare.gui.arbitrators.profile.ArbitratorProfileController;
import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
@ -24,11 +25,9 @@ import java.net.URL;
import java.util.*; import java.util.*;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.input.Clipboard; import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent; import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.util.StringConverter; import javafx.util.StringConverter;
import javax.inject.Inject; import javax.inject.Inject;
@ -36,7 +35,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@SuppressWarnings({"ALL", "EmptyMethod", "UnusedParameters"}) @SuppressWarnings({"ALL", "EmptyMethod", "UnusedParameters"})
public class ArbitratorRegistrationController implements Initializable, ChildController public class ArbitratorRegistrationController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(ArbitratorRegistrationController.class); private static final Logger log = LoggerFactory.getLogger(ArbitratorRegistrationController.class);
@ -56,31 +55,18 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon
private Arbitrator.ID_TYPE idType; private Arbitrator.ID_TYPE idType;
private ConfidenceDisplay confidenceDisplay; private ConfidenceDisplay confidenceDisplay;
@FXML @FXML private Accordion accordion;
private AnchorPane rootContainer; @FXML private TitledPane profileTitledPane, payCollateralTitledPane;
@FXML @FXML private Button saveProfileButton, paymentDoneButton;
private Accordion accordion; @FXML private Label nameLabel, infoLabel, copyIcon, confirmationLabel;
@FXML @FXML private ComboBox<Locale> languageComboBox;
private TitledPane profileTitledPane, payCollateralTitledPane; @FXML private ComboBox<Arbitrator.ID_TYPE> idTypeComboBox;
@FXML @FXML private ComboBox<Arbitrator.METHOD> methodsComboBox;
private Button saveProfileButton, paymentDoneButton; @FXML private ComboBox<Arbitrator.ID_VERIFICATION> idVerificationsComboBox;
@FXML @FXML private TextField nameTextField, idTypeTextField, languagesTextField, maxTradeVolumeTextField, passiveServiceFeeTextField, minPassiveServiceFeeTextField, arbitrationFeeTextField,
private Label nameLabel, infoLabel, copyIcon, confirmationLabel;
@FXML
private ComboBox<Locale> languageComboBox;
@FXML
private ComboBox<Arbitrator.ID_TYPE> idTypeComboBox;
@FXML
private ComboBox<Arbitrator.METHOD> methodsComboBox;
@FXML
private ComboBox<Arbitrator.ID_VERIFICATION> idVerificationsComboBox;
@FXML
private TextField nameTextField, idTypeTextField, languagesTextField, maxTradeVolumeTextField, passiveServiceFeeTextField, minPassiveServiceFeeTextField, arbitrationFeeTextField,
minArbitrationFeeTextField, methodsTextField, idVerificationsTextField, webPageTextField, collateralAddressTextField, balanceTextField; minArbitrationFeeTextField, methodsTextField, idVerificationsTextField, webPageTextField, collateralAddressTextField, balanceTextField;
@FXML @FXML private TextArea descriptionTextArea;
private TextArea descriptionTextArea; @FXML private ConfidenceProgressIndicator progressIndicator;
@FXML
private ConfidenceProgressIndicator progressIndicator;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -98,29 +84,14 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Public Methods // Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
public void setEditMode(@SuppressWarnings("SameParameterValue") boolean isEditMode)
{
this.isEditMode = isEditMode;
if (isEditMode)
{
saveProfileButton.setText("Save");
profileTitledPane.setCollapsible(false);
payCollateralTitledPane.setVisible(false);
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
super.initialize(url, rb);
accordion.setExpandedPane(profileTitledPane); accordion.setExpandedPane(profileTitledPane);
Arbitrator persistedArbitrator = (Arbitrator) persistence.read(arbitrator); Arbitrator persistedArbitrator = (Arbitrator) persistence.read(arbitrator);
@ -207,19 +178,56 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon
}); });
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public void terminate()
{ {
super.terminate();
} }
@Override @Override
public void cleanup() public void deactivate()
{ {
super.deactivate();
}
@Override
public void activate()
{
super.activate();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Navigation
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setParentController(ViewController parentController)
{
super.setParentController(parentController);
}
@Override
public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{
return null;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Public Methods
///////////////////////////////////////////////////////////////////////////////////////////
public void setEditMode(@SuppressWarnings("SameParameterValue") boolean isEditMode)
{
this.isEditMode = isEditMode;
if (isEditMode)
{
saveProfileButton.setText("Save");
profileTitledPane.setCollapsible(false);
payCollateralTitledPane.setVisible(false);
}
} }
@ -506,7 +514,7 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon
private void close() private void close()
{ {
Stage stage = (Stage) rootContainer.getScene().getWindow(); Stage stage = (Stage) root.getScene().getWindow();
stage.close(); stage.close();
} }

View file

@ -4,8 +4,9 @@
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:id="rootContainer" prefHeight="600" prefWidth="800" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.arbitrators.registration.ArbitratorRegistrationController"
AnchorPane.topAnchor="10.0" xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.arbitrators.registration.ArbitratorRegistrationController"> prefHeight="600" prefWidth="800" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"
xmlns:fx="http://javafx.com/fxml">
<Accordion fx:id="accordion" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"> <Accordion fx:id="accordion" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
<panes> <panes>

View file

@ -1,9 +1,7 @@
package io.bitsquare.gui.components; package io.bitsquare.gui.components;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.storage.Persistence; import io.bitsquare.storage.Persistence;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -17,109 +15,100 @@ import org.slf4j.LoggerFactory;
* That class caches the already created views in a tab pane. * That class caches the already created views in a tab pane.
* So when switching back to an already opened tab it is faster as no fxml loading is needed anymore. * So when switching back to an already opened tab it is faster as no fxml loading is needed anymore.
*/ */
//TODO remove manual caching as its done now in loader
public class CachingTabPane extends TabPane public class CachingTabPane extends TabPane
{ {
private static final Logger log = LoggerFactory.getLogger(CachingTabPane.class); private static final Logger log = LoggerFactory.getLogger(CachingTabPane.class);
private final List<TabInfo> tabInfoList = new ArrayList<>(); private final List<TabInfo> tabInfoList = new ArrayList<>();
private NavigationController navigationController; private ViewController parentController;
private Persistence persistence; private Persistence persistence;
private int selectedTabIndex; private int selectedTabIndex;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor // Public methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public CachingTabPane() public void initialize(ViewController parentController, Persistence persistence, String... tabContentFXMLUrls)
{
super();
}
public void initialize(NavigationController navigationController, Persistence persistence, String... tabContentFXMLUrls)
{ {
if (tabContentFXMLUrls.length == 0) if (tabContentFXMLUrls.length == 0)
{ {
throw new IllegalArgumentException("No tabContentFXMLUrls defined"); throw new IllegalArgumentException("No tabContentFXMLUrls defined");
} }
this.navigationController = navigationController; this.parentController = parentController;
this.persistence = persistence; this.persistence = persistence;
for (String tabContentFXMLUrl : tabContentFXMLUrls) tabInfoList.add(new TabInfo(tabContentFXMLUrl)); for (String tabContentFXMLUrl : tabContentFXMLUrls) tabInfoList.add(new TabInfo(tabContentFXMLUrl));
getSelectionModel().selectedItemProperty().addListener((observableValue, oldTab, newTab) -> onTabSelectedIndexChanged()); getSelectionModel().selectedItemProperty().addListener((observableValue, oldTab, newTab) -> loadView());
// use parent to read selectedTabIndex // use parent to read selectedTabIndex
Object indexObject = persistence.read(navigationController, "selectedTabIndex"); Object indexObject = persistence.read(parentController, "selectedTabIndex");
selectedTabIndex = (indexObject == null) ? 0 : (int) indexObject; selectedTabIndex = (indexObject == null) ? 0 : (int) indexObject;
if (selectedTabIndex == 0) onTabSelectedIndexChanged();
getSelectionModel().select(selectedTabIndex); // if selectedTabIndex = 0 the the change listener will not fire so we load it manually
// if (selectedTabIndex == 0) loadView();
//getSelectionModel().select(selectedTabIndex);
} }
public void cleanup() public ViewController loadViewAndGetChildController(String fxmlView)
{
if (tabInfoList.get(selectedTabIndex).controller != null)
tabInfoList.get(selectedTabIndex).controller.cleanup();
}
public ChildController navigateToView(String fxmlView)
{ {
for (int i = 0; i < tabInfoList.size(); i++) for (int i = 0; i < tabInfoList.size(); i++)
{ {
if (tabInfoList.get(i).url.equals(fxmlView)) if (tabInfoList.get(i).url.equals(fxmlView))
{ {
// selection will cause loadView() call
getSelectionModel().select(i); getSelectionModel().select(i);
return tabInfoList.get(selectedTabIndex).controller; return currentController();
} }
} }
// if not found
throw new IllegalArgumentException("fxmlView not defined in tabContentFXMLUrlMap."); throw new IllegalArgumentException("fxmlView not defined in tabContentFXMLUrlMap.");
} }
private void onTabSelectedIndexChanged()
{
selectedTabIndex = getSelectionModel().getSelectedIndex();
if (tabInfoList.get(selectedTabIndex).controller != null)
{
// set old one to sleep
((Hibernate) tabInfoList.get(selectedTabIndex).controller).sleep();
}
else
{
// load for the first time
String fxmlView = tabInfoList.get(selectedTabIndex).url;
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(fxmlView));
try
{
tabInfoList.get(selectedTabIndex).view = loader.load();
tabInfoList.get(selectedTabIndex).controller = loader.getController();
} catch (IOException e)
{
e.printStackTrace();
}
}
getSelectionModel().getSelectedItem().setContent(tabInfoList.get(selectedTabIndex).view);
tabInfoList.get(selectedTabIndex).controller.setNavigationController(navigationController);
((Hibernate) tabInfoList.get(selectedTabIndex).controller).awake();
// use parent to write selectedTabIndex
persistence.write(navigationController, "selectedTabIndex", selectedTabIndex);
}
public void setSelectedTabIndex(int selectedTabIndex) public void setSelectedTabIndex(int selectedTabIndex)
{ {
getSelectionModel().select(selectedTabIndex); getSelectionModel().select(selectedTabIndex);
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////////////////
private void loadView()
{
selectedTabIndex = getSelectionModel().getSelectedIndex();
TabInfo selectedTabInfo = tabInfoList.get(selectedTabIndex);
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(selectedTabInfo.url));
try
{
Node view = loader.load();
selectedTabInfo.controller = loader.getController();
getSelectionModel().getSelectedItem().setContent(view);
} catch (IOException e)
{
log.error(e.getMessage());
}
selectedTabInfo.controller.setParentController(parentController);
// use parent to write selectedTabIndex
persistence.write(parentController, "selectedTabIndex", selectedTabIndex);
}
private ViewController currentController()
{
return tabInfoList.get(selectedTabIndex).controller;
}
} }
class TabInfo class TabInfo
{ {
Node view; ViewController controller;
ChildController controller;
final String url; final String url;
TabInfo(String url) TabInfo(String url)

View file

@ -1,4 +1,4 @@
package io.bitsquare.gui.popups; package io.bitsquare.gui.components;
import com.google.bitcoin.store.BlockStoreException; import com.google.bitcoin.store.BlockStoreException;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;

View file

@ -1,27 +1,21 @@
package io.bitsquare.gui.funds; package io.bitsquare.gui.funds;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.components.CachingTabPane; import io.bitsquare.gui.components.CachingTabPane;
import io.bitsquare.storage.Persistence; import io.bitsquare.storage.Persistence;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class FundsController implements Initializable, ChildController, NavigationController, Hibernate public class FundsController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(FundsController.class); private static final Logger log = LoggerFactory.getLogger(FundsController.class);
private final Persistence persistence; private final Persistence persistence;
private ChildController childController; private ViewController childController;
@FXML
private CachingTabPane root;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -36,58 +30,40 @@ public class FundsController implements Initializable, ChildController, Navigati
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
root.initialize(this, persistence, NavigationItem.DEPOSIT.getFxmlUrl(), NavigationItem.WITHDRAWAL.getFxmlUrl(), NavigationItem.TRANSACTIONS.getFxmlUrl()); super.initialize(url, rb);
((CachingTabPane) root).initialize(this, persistence, NavigationItem.DEPOSIT.getFxmlUrl(), NavigationItem.WITHDRAWAL.getFxmlUrl(), NavigationItem.TRANSACTIONS.getFxmlUrl());
}
@Override
public void deactivate()
{
super.deactivate();
}
@Override
public void activate()
{
super.activate();
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController // Navigation
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{ {
} childController = ((CachingTabPane) root).loadViewAndGetChildController(navigationItem.getFxmlUrl());
@Override
public void cleanup()
{
root.cleanup();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public ChildController navigateToView(NavigationItem navigationItem)
{
childController = root.navigateToView(navigationItem.getFxmlUrl());
return childController; return childController;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void sleep()
{
if (childController instanceof Hibernate)
((Hibernate) childController).sleep();
}
@Override
public void awake()
{
if (childController instanceof Hibernate)
((Hibernate) childController).awake();
}
} }

View file

@ -3,8 +3,9 @@
<?import io.bitsquare.gui.components.CachingTabPane?> <?import io.bitsquare.gui.components.CachingTabPane?>
<?import javafx.scene.control.Tab?> <?import javafx.scene.control.Tab?>
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
<CachingTabPane xmlns:fx="http://javafx.com/fxml/1" fx:id="root" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" <CachingTabPane fx:id="root" fx:controller="io.bitsquare.gui.funds.FundsController"
xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.funds.FundsController"> AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml">
<Tab text="Deposit" closable="false"/> <Tab text="Deposit" closable="false"/>
<Tab text="Withdrawal" closable="false"/> <Tab text="Withdrawal" closable="false"/>

View file

@ -4,9 +4,7 @@ import de.jensd.fx.fontawesome.AwesomeDude;
import de.jensd.fx.fontawesome.AwesomeIcon; import de.jensd.fx.fontawesome.AwesomeIcon;
import io.bitsquare.btc.AddressEntry; import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import java.net.URL; import java.net.URL;
import java.util.List; import java.util.List;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@ -15,24 +13,21 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.input.Clipboard; import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent; import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.VBox;
import javafx.util.Callback; import javafx.util.Callback;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class DepositController implements Initializable, ChildController, Hibernate public class DepositController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(DepositController.class); private static final Logger log = LoggerFactory.getLogger(DepositController.class);
private final WalletFacade walletFacade; private final WalletFacade walletFacade;
private ObservableList<DepositListItem> addressList; private ObservableList<DepositListItem> addressList;
@FXML private VBox root;
@FXML private TableView<DepositListItem> tableView; @FXML private TableView<DepositListItem> tableView;
@FXML private TableColumn<String, DepositListItem> labelColumn, addressColumn, balanceColumn, copyColumn, confidenceColumn; @FXML private TableColumn<String, DepositListItem> labelColumn, addressColumn, balanceColumn, copyColumn, confidenceColumn;
@FXML private Button addNewAddressButton; @FXML private Button addNewAddressButton;
@ -50,13 +45,14 @@ public class DepositController implements Initializable, ChildController, Hibern
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
awake(); super.initialize(url, rb);
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
setLabelColumnCellFactory(); setLabelColumnCellFactory();
@ -65,39 +61,20 @@ public class DepositController implements Initializable, ChildController, Hibern
setConfidenceColumnCellFactory(); setConfidenceColumnCellFactory();
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public void deactivate()
{ {
} super.deactivate();
@Override
public void cleanup()
{
for (DepositListItem anAddressList : addressList) for (DepositListItem anAddressList : addressList)
{
anAddressList.cleanup(); anAddressList.cleanup();
} }
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void sleep() public void activate()
{ {
cleanup(); super.activate();
}
@Override
public void awake()
{
List<AddressEntry> addressEntryList = walletFacade.getAddressEntryList(); List<AddressEntry> addressEntryList = walletFacade.getAddressEntryList();
addressList = FXCollections.observableArrayList(); addressList = FXCollections.observableArrayList();
addressList.addAll(addressEntryList.stream().map(anAddressEntryList -> new DepositListItem(anAddressEntryList, walletFacade)).collect(Collectors.toList())); addressList.addAll(addressEntryList.stream().map(anAddressEntryList -> new DepositListItem(anAddressEntryList, walletFacade)).collect(Collectors.toList()));

View file

@ -4,8 +4,8 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.PropertyValueFactory?> <?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml/1" spacing="10" fx:controller="io.bitsquare.gui.funds.deposit.DepositController" <VBox fx:id="root" fx:controller="io.bitsquare.gui.funds.deposit.DepositController"
xmlns="http://javafx.com/javafx/8"> spacing="10" xmlns:fx="http://javafx.com/fxml">
<padding> <padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</padding> </padding>

View file

@ -2,9 +2,7 @@ package io.bitsquare.gui.funds.transactions;
import com.google.bitcoin.core.Transaction; import com.google.bitcoin.core.Transaction;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import java.net.URL; import java.net.URL;
import java.util.List; import java.util.List;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@ -13,22 +11,19 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.util.Callback; import javafx.util.Callback;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class TransactionsController implements Initializable, ChildController, Hibernate public class TransactionsController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(TransactionsController.class); private static final Logger log = LoggerFactory.getLogger(TransactionsController.class);
private final WalletFacade walletFacade; private final WalletFacade walletFacade;
private ObservableList<TransactionsListItem> transactionsListItems; private ObservableList<TransactionsListItem> transactionsListItems;
@FXML private VBox root;
@FXML private TableView<TransactionsListItem> tableView; @FXML private TableView<TransactionsListItem> tableView;
@FXML private TableColumn<String, TransactionsListItem> dateColumn, addressColumn, amountColumn, typeColumn, confidenceColumn; @FXML private TableColumn<String, TransactionsListItem> dateColumn, addressColumn, amountColumn, typeColumn, confidenceColumn;
@FXML private Button addNewAddressButton; @FXML private Button addNewAddressButton;
@ -46,52 +41,34 @@ public class TransactionsController implements Initializable, ChildController, H
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
awake(); super.initialize(url, rb);
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
setAddressColumnCellFactory(); setAddressColumnCellFactory();
setConfidenceColumnCellFactory(); setConfidenceColumnCellFactory();
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public void deactivate()
{ {
} super.deactivate();
@Override
public void cleanup()
{
for (TransactionsListItem transactionsListItem : transactionsListItems) for (TransactionsListItem transactionsListItem : transactionsListItems)
{
transactionsListItem.cleanup(); transactionsListItem.cleanup();
} }
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void sleep() public void activate()
{ {
cleanup(); super.activate();
}
@Override
public void awake()
{
List<Transaction> transactions = walletFacade.getWallet().getRecentTransactions(10000, true); List<Transaction> transactions = walletFacade.getWallet().getRecentTransactions(10000, true);
transactionsListItems = FXCollections.observableArrayList(); transactionsListItems = FXCollections.observableArrayList();
transactionsListItems.addAll(transactions.stream().map(transaction -> new TransactionsListItem(transaction, walletFacade)).collect(Collectors.toList())); transactionsListItems.addAll(transactions.stream().map(transaction -> new TransactionsListItem(transaction, walletFacade)).collect(Collectors.toList()));

View file

@ -4,8 +4,8 @@
<?import javafx.scene.control.cell.PropertyValueFactory?> <?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml/1" spacing="10" fx:controller="io.bitsquare.gui.funds.transactions.TransactionsController" <VBox fx:id="root" fx:controller="io.bitsquare.gui.funds.transactions.TransactionsController"
xmlns="http://javafx.com/javafx/8"> spacing="10" xmlns:fx="http://javafx.com/fxml">
<padding> <padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</padding> </padding>

View file

@ -11,10 +11,8 @@ import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.BtcValidator; import io.bitsquare.btc.BtcValidator;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.FeePolicy;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate; import io.bitsquare.gui.components.Popups;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.popups.Popups;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
import io.bitsquare.gui.util.BitSquareValidator; import io.bitsquare.gui.util.BitSquareValidator;
import java.net.URL; import java.net.URL;
@ -25,11 +23,9 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.input.Clipboard; import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent; import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.VBox;
import javafx.util.Callback; import javafx.util.Callback;
import javax.inject.Inject; import javax.inject.Inject;
import org.controlsfx.control.action.Action; import org.controlsfx.control.action.Action;
@ -37,7 +33,7 @@ import org.controlsfx.dialog.Dialog;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class WithdrawalController implements Initializable, ChildController, Hibernate public class WithdrawalController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(WithdrawalController.class); private static final Logger log = LoggerFactory.getLogger(WithdrawalController.class);
@ -45,7 +41,6 @@ public class WithdrawalController implements Initializable, ChildController, Hib
private final WalletFacade walletFacade; private final WalletFacade walletFacade;
private ObservableList<WithdrawalListItem> addressList; private ObservableList<WithdrawalListItem> addressList;
@FXML private VBox root;
@FXML private TableView<WithdrawalListItem> tableView; @FXML private TableView<WithdrawalListItem> tableView;
@FXML private TableColumn<String, WithdrawalListItem> labelColumn, addressColumn, balanceColumn, copyColumn, confidenceColumn; @FXML private TableColumn<String, WithdrawalListItem> labelColumn, addressColumn, balanceColumn, copyColumn, confidenceColumn;
@FXML private Button addNewAddressButton; @FXML private Button addNewAddressButton;
@ -62,21 +57,36 @@ public class WithdrawalController implements Initializable, ChildController, Hib
this.walletFacade = walletFacade; this.walletFacade = walletFacade;
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
awake(); super.initialize(url, rb);
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
setLabelColumnCellFactory(); setLabelColumnCellFactory();
setBalanceColumnCellFactory(); setBalanceColumnCellFactory();
setCopyColumnCellFactory(); setCopyColumnCellFactory();
setConfidenceColumnCellFactory(); setConfidenceColumnCellFactory();
}
@Override
public void deactivate()
{
super.deactivate();
for (WithdrawalListItem anAddressList : addressList)
anAddressList.cleanup();
}
@Override
public void activate()
{
super.activate();
tableView.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> { tableView.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
if (newValue != null) if (newValue != null)
@ -98,41 +108,7 @@ public class WithdrawalController implements Initializable, ChildController, Hib
} }
} }
}); });
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
}
@Override
public void cleanup()
{
for (WithdrawalListItem anAddressList : addressList)
{
anAddressList.cleanup();
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void sleep()
{
cleanup();
}
@Override
public void awake()
{
List<AddressEntry> addressEntryList = walletFacade.getAddressEntryList(); List<AddressEntry> addressEntryList = walletFacade.getAddressEntryList();
addressList = FXCollections.observableArrayList(); addressList = FXCollections.observableArrayList();
addressList.addAll(addressEntryList.stream().map(anAddressEntryList -> new WithdrawalListItem(anAddressEntryList, walletFacade)).collect(Collectors.toList())); addressList.addAll(addressEntryList.stream().map(anAddressEntryList -> new WithdrawalListItem(anAddressEntryList, walletFacade)).collect(Collectors.toList()));

View file

@ -4,7 +4,8 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.PropertyValueFactory?> <?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml/1" spacing="10" fx:controller="io.bitsquare.gui.funds.withdrawal.WithdrawalController" xmlns="http://javafx.com/javafx/8"> <VBox fx:id="root" fx:controller="io.bitsquare.gui.funds.withdrawal.WithdrawalController"
spacing="10" xmlns:fx="http://javafx.com/fxml">
<padding> <padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</padding> </padding>

View file

@ -2,60 +2,66 @@ package io.bitsquare.gui.home;
import io.bitsquare.BitSquare; import io.bitsquare.BitSquare;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.arbitrators.registration.ArbitratorRegistrationController; import io.bitsquare.gui.arbitrators.registration.ArbitratorRegistrationController;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Modality; import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
public class HomeController implements Initializable, ChildController, NavigationController public class HomeController extends CachedViewController
{ {
private ArbitratorRegistrationController arbitratorRegistrationController; private ArbitratorRegistrationController arbitratorRegistrationController;
///////////////////////////////////////////////////////////////////////////////////////////
// Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
// navigateToView(NavigationController.ARBITRATOR_REGISTRATION, "Registration as Arbitrator"); super.initialize(url, rb);
} }
@Override @Override
public void setNavigationController(NavigationController navigationController) public void terminate()
{ {
super.terminate();
} }
@Override @Override
public void cleanup() public void deactivate()
{ {
super.deactivate();
} }
@Override
public void activate()
{
super.activate();
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController // Navigation
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public ChildController navigateToView(NavigationItem navigationItem) public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{ {
if (arbitratorRegistrationController != null) // don't use caching here, cause exc. -> need to investigate and is rarely called so no caching is better
{
arbitratorRegistrationController.cleanup();
}
// dont use caching here, cause exc. -> need to investigate and is rarely called so no caching is better
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false);
try try
{ {
final Parent view = loader.load(); final Parent view = loader.load();
arbitratorRegistrationController = loader.getController(); arbitratorRegistrationController = loader.getController();
arbitratorRegistrationController.setNavigationController(this); arbitratorRegistrationController.setParentController(this);
final Stage rootStage = BitSquare.getPrimaryStage(); final Stage rootStage = BitSquare.getPrimaryStage();
final Stage stage = new Stage(); final Stage stage = new Stage();
@ -80,16 +86,21 @@ public class HomeController implements Initializable, ChildController, Navigatio
return null; return null;
} }
///////////////////////////////////////////////////////////////////////////////////////////
// UI Handlers
///////////////////////////////////////////////////////////////////////////////////////////
@FXML @FXML
public void onArbitratorRegistration() public void onArbitratorRegistration()
{ {
navigateToView(NavigationItem.ARBITRATOR_REGISTRATION); loadViewAndGetChildController(NavigationItem.ARBITRATOR_REGISTRATION);
} }
@FXML @FXML
public void onArbitratorEdit() public void onArbitratorEdit()
{ {
navigateToView(NavigationItem.ARBITRATOR_REGISTRATION); loadViewAndGetChildController(NavigationItem.ARBITRATOR_REGISTRATION);
arbitratorRegistrationController.setEditMode(true); arbitratorRegistrationController.setEditMode(true);
} }

View file

@ -1,8 +1,10 @@
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="io.bitsquare.gui.home.HomeController" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.home.HomeController"
AnchorPane.topAnchor="10.0"> AnchorPane.bottomAnchor="30" AnchorPane.leftAnchor="10" AnchorPane.rightAnchor="10" AnchorPane.topAnchor="10"
xmlns:fx="http://javafx.com/fxml">
<VBox spacing="20" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <VBox spacing="20" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<Label id="headline-label" text="Overview"/> <Label id="headline-label" text="Overview"/>
<Label text="TODO"/> <Label text="TODO"/>

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<TabPane xmlns:fx="http://javafx.com/fxml/1" fx:id="tabPane" AnchorPane.bottomAnchor="0.0"
AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
fx:controller="io.bitsquare.gui.market.BuyController"/>

View file

@ -1,143 +0,0 @@
package io.bitsquare.gui.market;
import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.ChildController;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.components.ValidatingTextField;
import io.bitsquare.gui.market.orderbook.OrderBookController;
import io.bitsquare.trade.Direction;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkArgument;
public class SellController implements Initializable, NavigationController, ChildController
{
private static final Logger log = LoggerFactory.getLogger(SellController.class);
protected OrderBookController orderBookController;
protected GuiceFXMLLoader orderBookLoader;
@FXML
protected TabPane tabPane;
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
// TODO find better solution
// Textfield focus out triggers validation, use runLater as quick fix...
tabPane.getSelectionModel().selectedIndexProperty().addListener((observableValue) -> Platform.runLater(() -> ValidatingTextField.hidePopover()));
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public ChildController navigateToView(NavigationItem navigationItem)
{
if (navigationItem == NavigationItem.ORDER_BOOK)
{
return loadOrderBook();
}
else
{
checkArgument(navigationItem.equals(NavigationItem.CREATE_OFFER) || navigationItem.equals(NavigationItem.TAKE_OFFER));
// CreateOffer and TakeOffer must not be cached by GuiceFXMLLoader as we cannot use a view multiple times in different graphs
GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false);
try
{
final Parent view = loader.load();
ChildController childController = loader.getController();
childController.setNavigationController(this);
String tabLabel = navigationItem.equals(NavigationItem.CREATE_OFFER) ? "Create offer" : "Take offer";
final Tab tab = new Tab(tabLabel);
tab.setContent(view);
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1);
return childController;
} catch (IOException e)
{
e.printStackTrace();
log.error(e.getMessage());
}
return null;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
navigateToView(NavigationItem.ORDER_BOOK);
}
@Override
public void cleanup()
{
if (orderBookController != null)
{
orderBookController.cleanup();
orderBookController = null;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Protected
///////////////////////////////////////////////////////////////////////////////////////////
protected void applyDirection()
{
orderBookController.applyDirection(Direction.SELL);
}
protected ChildController loadOrderBook()
{
// Orderbook must not be cached by GuiceFXMLLoader as we use 2 instances for sell and buy screens.
if (orderBookLoader == null)
{
orderBookLoader = new GuiceFXMLLoader(getClass().getResource(NavigationItem.ORDER_BOOK.getFxmlUrl()), false);
try
{
final Parent view = orderBookLoader.load();
final Tab tab = new Tab("Orderbook");
tab.setClosable(false);
tab.setContent(view);
tabPane.getTabs().add(tab);
} catch (IOException e)
{
e.printStackTrace();
}
}
orderBookController = orderBookLoader.getController();
orderBookController.setNavigationController(this);
applyDirection();
return orderBookController;
}
}

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<TabPane xmlns:fx="http://javafx.com/fxml/1" fx:id="tabPane" AnchorPane.bottomAnchor="0.0"
AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
fx:controller="io.bitsquare.gui.market.SellController"/>

View file

@ -1,15 +1,15 @@
package io.bitsquare.gui.msg; package io.bitsquare.gui.msg;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class MsgController implements Initializable, ChildController public class MsgController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(MsgController.class); private static final Logger log = LoggerFactory.getLogger(MsgController.class);
@ -23,30 +23,46 @@ public class MsgController implements Initializable, ChildController
{ {
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
super.initialize(url, rb);
}
@Override
public void terminate()
{
super.terminate();
}
@Override
public void deactivate()
{
super.deactivate();
}
@Override
public void activate()
{
super.activate();
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController // Navigation
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{ {
return null;
} }
@Override
public void cleanup()
{
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// GUI Event handlers // GUI Event handlers

View file

@ -2,9 +2,9 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.bitsquare.gui.msg.MsgController" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.msg.MsgController"
AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0"
xmlns="http://javafx.com/javafx/8"> xmlns:fx="http://javafx.com/fxml">
<VBox spacing="20" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <VBox spacing="20" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<Label id="headline-label" text="Message"/> <Label id="headline-label" text="Message"/>

View file

@ -1,29 +1,21 @@
package io.bitsquare.gui.orders; package io.bitsquare.gui.orders;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.components.CachingTabPane; import io.bitsquare.gui.components.CachingTabPane;
import io.bitsquare.storage.Persistence; import io.bitsquare.storage.Persistence;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class OrdersController implements Initializable, ChildController, NavigationController, Hibernate public class OrdersController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(OrdersController.class); private static final Logger log = LoggerFactory.getLogger(OrdersController.class);
private static int SELECTED_TAB_INDEX = -1;
private static OrdersController INSTANCE; private static OrdersController INSTANCE;
private final Persistence persistence; private final Persistence persistence;
private ChildController childController;
@FXML
private CachingTabPane tabPane;
@Inject @Inject
private OrdersController(Persistence persistence) private OrdersController(Persistence persistence)
@ -42,6 +34,43 @@ public class OrdersController implements Initializable, ChildController, Navigat
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
super.initialize(url, rb);
((CachingTabPane) root).initialize(this, persistence, NavigationItem.OFFER.getFxmlUrl(), NavigationItem.PENDING_TRADE.getFxmlUrl(), NavigationItem.CLOSED_TRADE.getFxmlUrl());
}
@Override
public void deactivate()
{
super.deactivate();
}
@Override
public void activate()
{
super.activate();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Navigation
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{
childController = ((CachingTabPane) root).loadViewAndGetChildController(navigationItem.getFxmlUrl());
return childController;
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Public Methods // Public Methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -49,68 +78,9 @@ public class OrdersController implements Initializable, ChildController, Navigat
public void setSelectedTabIndex(int index) public void setSelectedTabIndex(int index)
{ {
log.trace("setSelectedTabIndex " + index); log.trace("setSelectedTabIndex " + index);
tabPane.setSelectedTabIndex(index); ((CachingTabPane) root).setSelectedTabIndex(index);
persistence.write(this, "selectedTabIndex", index); persistence.write(this, "selectedTabIndex", index);
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
log.trace("initialize ");
tabPane.initialize(this, persistence, NavigationItem.OFFER.getFxmlUrl(), NavigationItem.PENDING_TRADE.getFxmlUrl(), NavigationItem.CLOSED_TRADE.getFxmlUrl());
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
}
@Override
public void cleanup()
{
tabPane.cleanup();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public ChildController navigateToView(NavigationItem navigationItem)
{
childController = tabPane.navigateToView(navigationItem.getFxmlUrl());
return childController;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void sleep()
{
if (childController instanceof Hibernate)
((Hibernate) childController).sleep();
}
@Override
public void awake()
{
if (childController instanceof Hibernate)
((Hibernate) childController).awake();
}
} }

View file

@ -3,8 +3,9 @@
<?import io.bitsquare.gui.components.CachingTabPane?> <?import io.bitsquare.gui.components.CachingTabPane?>
<?import javafx.scene.control.Tab?> <?import javafx.scene.control.Tab?>
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
<CachingTabPane xmlns:fx="http://javafx.com/fxml/1" fx:id="tabPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" <CachingTabPane fx:id="root" fx:controller="io.bitsquare.gui.orders.OrdersController"
xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.orders.OrdersController"> AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml">
<Tab text="Open offers" closable="false"/> <Tab text="Open offers" closable="false"/>
<Tab text="Pending trades" closable="false"/> <Tab text="Pending trades" closable="false"/>

View file

@ -1,16 +1,13 @@
package io.bitsquare.gui.orders.closed; package io.bitsquare.gui.orders.closed;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class ClosedTradeController implements Initializable, ChildController, Hibernate public class ClosedTradeController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(ClosedTradeController.class); private static final Logger log = LoggerFactory.getLogger(ClosedTradeController.class);
@ -26,45 +23,25 @@ public class ClosedTradeController implements Initializable, ChildController, Hi
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
} super.initialize(url, rb);
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
log.debug("setNavigationController" + this);
} }
@Override @Override
public void cleanup() public void deactivate()
{ {
log.debug("cleanup" + this); super.deactivate();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void sleep()
{
cleanup();
} }
@Override @Override
public void awake() public void activate()
{ {
super.activate();
} }

View file

@ -2,9 +2,9 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.bitsquare.gui.orders.closed.ClosedTradeController" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.orders.closed.ClosedTradeController"
AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0"
xmlns="http://javafx.com/javafx/8"> xmlns:fx="http://javafx.com/fxml">
<VBox spacing="20" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <VBox spacing="20" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<Label id="form-header-text" text="Closed"/> <Label id="form-header-text" text="Closed"/>

View file

@ -1,8 +1,6 @@
package io.bitsquare.gui.orders.offer; package io.bitsquare.gui.orders.offer;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.trade.Offer; import io.bitsquare.trade.Offer;
import io.bitsquare.trade.TradeManager; import io.bitsquare.trade.TradeManager;
@ -16,7 +14,6 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.util.Callback; import javafx.util.Callback;
@ -25,15 +22,14 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@SuppressWarnings("EmptyMethod") @SuppressWarnings("EmptyMethod")
public class OfferController implements Initializable, ChildController, Hibernate public class OfferController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(OfferController.class); private static final Logger log = LoggerFactory.getLogger(OfferController.class);
private final TradeManager tradeManager; private final TradeManager tradeManager;
private ObservableList<OfferListItem> offerListItems; private ObservableList<OfferListItem> offerListItems;
@FXML
private TableColumn<String, OfferListItem> offerIdColumn, dateColumn, amountColumn, priceColumn, volumeColumn, removeColumn; @FXML private TableColumn<String, OfferListItem> offerIdColumn, dateColumn, amountColumn, priceColumn, volumeColumn, removeColumn;
@FXML @FXML private TableView<OfferListItem> offerTable;
private TableView<OfferListItem> offerTable;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -48,47 +44,30 @@ public class OfferController implements Initializable, ChildController, Hibernat
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
awake(); super.initialize(url, rb);
setOfferIdColumnColumnCellFactory(); setOfferIdColumnColumnCellFactory();
setRemoveColumnCellFactory(); setRemoveColumnCellFactory();
offerTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); offerTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public void deactivate()
{ {
super.deactivate();
} }
@Override @Override
public void cleanup() public void activate()
{ {
log.debug("cleanup" + this); super.activate();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void sleep()
{
cleanup();
}
@Override
public void awake()
{
offerListItems = FXCollections.observableArrayList(); offerListItems = FXCollections.observableArrayList();
Map<String, Offer> offerMap = tradeManager.getOffers(); Map<String, Offer> offerMap = tradeManager.getOffers();
List<Offer> offerList = new ArrayList<>(offerMap.values()); List<Offer> offerList = new ArrayList<>(offerMap.values());
@ -106,14 +85,12 @@ public class OfferController implements Initializable, ChildController, Hibernat
// Private Methods // Private Methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
private void removeOffer(OfferListItem offerListItem) private void removeOffer(OfferListItem offerListItem)
{ {
tradeManager.removeOffer(offerListItem.getOffer()); tradeManager.removeOffer(offerListItem.getOffer());
offerListItems.remove(offerListItem); offerListItems.remove(offerListItem);
} }
@SuppressWarnings("UnusedParameters")
private void openOfferDetails(OfferListItem offerListItem) private void openOfferDetails(OfferListItem offerListItem)
{ {

View file

@ -4,8 +4,8 @@
<?import javafx.scene.control.cell.*?> <?import javafx.scene.control.cell.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<VBox xmlns:fx="http://javafx.com/fxml/1" spacing="10" fx:controller="io.bitsquare.gui.orders.offer.OfferController" <VBox fx:id="root" fx:controller="io.bitsquare.gui.orders.offer.OfferController"
xmlns="http://javafx.com/javafx/8"> spacing="10" xmlns:fx="http://javafx.com/fxml">
<padding> <padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</padding> </padding>

View file

@ -8,9 +8,7 @@ import io.bitsquare.bank.BankAccount;
import io.bitsquare.bank.BankAccountType; import io.bitsquare.bank.BankAccountType;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.FeePolicy;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
import io.bitsquare.gui.util.ConfidenceDisplay; import io.bitsquare.gui.util.ConfidenceDisplay;
@ -29,7 +27,6 @@ import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.image.Image; import javafx.scene.image.Image;
@ -37,13 +34,12 @@ import javafx.scene.image.ImageView;
import javafx.scene.input.Clipboard; import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent; import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Callback; import javafx.util.Callback;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class PendingTradeController implements Initializable, ChildController, Hibernate public class PendingTradeController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(PendingTradeController.class); private static final Logger log = LoggerFactory.getLogger(PendingTradeController.class);
@ -51,13 +47,11 @@ public class PendingTradeController implements Initializable, ChildController, H
private WalletFacade walletFacade; private WalletFacade walletFacade;
private Trade currentTrade; private Trade currentTrade;
private NavigationController navigationController;
private Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY); private Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY);
private Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL); private Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL);
private ConfidenceDisplay confidenceDisplay; private ConfidenceDisplay confidenceDisplay;
@FXML
private VBox rootContainer;
@FXML @FXML
private TableView openTradesTable; private TableView openTradesTable;
@FXML @FXML
@ -86,43 +80,26 @@ public class PendingTradeController implements Initializable, ChildController, H
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
awake(); super.initialize(url, rb);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
this.navigationController = navigationController;
} }
@Override @Override
public void cleanup() public void deactivate()
{ {
} super.deactivate();
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void sleep()
{
cleanup();
} }
@Override @Override
public void awake() public void activate()
{ {
super.activate();
Map<String, Trade> trades = tradeManager.getTrades(); Map<String, Trade> trades = tradeManager.getTrades();
List<Trade> tradeList = new ArrayList<>(trades.values()); List<Trade> tradeList = new ArrayList<>(trades.values());
ObservableList<PendingTradesListItem> tradeItems = FXCollections.observableArrayList(); ObservableList<PendingTradesListItem> tradeItems = FXCollections.observableArrayList();
@ -174,6 +151,7 @@ public class PendingTradeController implements Initializable, ChildController, H
}); });
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// GUI handlers // GUI handlers
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -5,10 +5,10 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.PropertyValueFactory?> <?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<VBox xmlns:fx="http://javafx.com/fxml/1" fx:id="rootContainer" fx:controller="io.bitsquare.gui.orders.pending.PendingTradeController" spacing="10" AnchorPane.bottomAnchor="0" <VBox fx:id="root" fx:controller="io.bitsquare.gui.orders.pending.PendingTradeController"
AnchorPane.leftAnchor="0" spacing="10" AnchorPane.bottomAnchor="0"
AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0" AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0"
xmlns="http://javafx.com/javafx/8"> xmlns:fx="http://javafx.com/fxml">
<TableView id="orderbook-table" fx:id="openTradesTable" prefHeight="150.0"> <TableView id="orderbook-table" fx:id="openTradesTable" prefHeight="150.0">
<columns> <columns>
<TableColumn fx:id="amountColumn" minWidth="120" text="Amount (Min.)"> <TableColumn fx:id="amountColumn" minWidth="120" text="Amount (Min.)">

View file

@ -1,6 +1,6 @@
package io.bitsquare.gui.orders.pending; package io.bitsquare.gui.orders.pending;
import io.bitsquare.gui.market.orderbook.OrderBookListItem; import io.bitsquare.gui.trade.orderbook.OrderBookListItem;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View file

@ -6,9 +6,9 @@ import io.bitsquare.BitSquare;
import io.bitsquare.bank.BankAccount; import io.bitsquare.bank.BankAccount;
import io.bitsquare.bank.BankAccountType; import io.bitsquare.bank.BankAccountType;
import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.util.BitSquareValidator; import io.bitsquare.gui.util.BitSquareValidator;
import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.locale.*; import io.bitsquare.locale.*;
@ -25,7 +25,6 @@ import java.util.*;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.Parent; import javafx.scene.Parent;
@ -40,43 +39,29 @@ import javafx.util.StringConverter;
import javax.inject.Inject; import javax.inject.Inject;
// TODO separate in 2 view/controllers // TODO separate in 2 view/controllers
public class SettingsController implements Initializable, ChildController, NavigationController public class SettingsController extends CachedViewController
{ {
private final User user; private final User user;
private final Settings settings; private final Settings settings;
private final Persistence persistence; private final Persistence persistence;
private final MessageFacade messageFacade; private final MessageFacade messageFacade;
private final ObservableList<Locale> languageList; private final ObservableList<Locale> languageList;
private final ObservableList<Country> countryList; private final ObservableList<Country> countryList;
private ChildController childController; private ViewController childController;
private List<String> regionList;
private ObservableList<Arbitrator> arbitratorList; private ObservableList<Arbitrator> arbitratorList;
@FXML private TabPane root; @FXML private ListView<Locale> languagesListView;
@FXML @FXML private ListView<Country> countriesListView;
private ListView<Locale> languagesListView; @FXML private ListView<Arbitrator> arbitratorsListView;
@FXML @FXML private ComboBox<Locale> languageComboBox;
private ListView<Country> countriesListView; @FXML private ComboBox<Region> regionComboBox, bankAccountRegionComboBox;
@FXML @FXML private ComboBox<Country> countryComboBox, bankAccountCountryComboBox;
private ListView<Arbitrator> arbitratorsListView; @FXML private TextField bankAccountTitleTextField, bankAccountHolderNameTextField, bankAccountPrimaryIDTextField, bankAccountSecondaryIDTextField;
@FXML @FXML private Button saveBankAccountButton, addBankAccountButton;
private ComboBox<Locale> languageComboBox; @FXML private ComboBox<BankAccount> bankAccountComboBox;
@FXML @FXML private ComboBox<BankAccountType> bankAccountTypesComboBox;
private ComboBox<Region> regionComboBox, bankAccountRegionComboBox; @FXML private ComboBox<Currency> bankAccountCurrencyComboBox;
@FXML
private ComboBox<Country> countryComboBox, bankAccountCountryComboBox;
@FXML
private TextField bankAccountTitleTextField, bankAccountHolderNameTextField, bankAccountPrimaryIDTextField, bankAccountSecondaryIDTextField;
@FXML
private Button saveBankAccountButton, addBankAccountButton;
@FXML
private ComboBox<BankAccount> bankAccountComboBox;
@FXML
private ComboBox<BankAccountType> bankAccountTypesComboBox;
@FXML
private ComboBox<Currency> bankAccountCurrencyComboBox;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -110,106 +95,54 @@ public class SettingsController implements Initializable, ChildController, Navig
} }
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Public Methods // Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
void updateArbitrators()
{
arbitratorList = FXCollections.observableArrayList(settings.getAcceptedArbitrators());
initArbitrators();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
super.initialize(url, rb);
setupGeneralSettingsScreen(); setupGeneralSettingsScreen();
initBankAccountScreen(); initBankAccountScreen();
addMockArbitrator(); addMockArbitrator();
} }
private void addMockArbitrator()
{
if (settings.getAcceptedArbitrators().isEmpty())
{
String pubKeyAsHex = Utils.HEX.encode(new ECKey().getPubKey());
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey());
List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale());
List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>();
arbitrationMethods.add(Arbitrator.METHOD.TLS_NOTARY);
List<Arbitrator.ID_VERIFICATION> idVerifications = new ArrayList<>();
idVerifications.add(Arbitrator.ID_VERIFICATION.PASSPORT);
idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID);
Arbitrator arbitrator = new Arbitrator(pubKeyAsHex,
messagePubKeyAsHex,
"Manfred Karrer",
Arbitrator.ID_TYPE.REAL_LIFE_ID,
languages,
new Reputation(),
1,
0.01,
0.001,
10,
0.1,
arbitrationMethods,
idVerifications,
"http://bitsquare.io/",
"Bla bla...");
arbitratorList.add(arbitrator);
settings.addAcceptedArbitrator(arbitrator);
persistence.write(settings);
messageFacade.addArbitrator(arbitrator);
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void setNavigationController(NavigationController navigationController) public void deactivate()
{ {
super.deactivate();
} }
@Override @Override
public void cleanup() public void activate()
{ {
super.activate();
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: NavigationController // Navigation
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public ChildController navigateToView(NavigationItem navigationItem) public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{ {
if (childController != null) /*if (childController instanceof CachedViewController)
{ ((CachedViewController) childController).deactivate();
childController.cleanup(); else if (childController != null)
} childController.terminate();*/
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); // TODO
// caching causes exception
final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false);
try try
{ {
final Node view = loader.load(); final Node view = loader.load();
childController = loader.getController(); childController = loader.getController();
childController.setNavigationController(this); childController.setParentController(this);
final Stage rootStage = BitSquare.getPrimaryStage(); final Stage rootStage = BitSquare.getPrimaryStage();
final Stage stage = new Stage(); final Stage stage = new Stage();
@ -226,9 +159,7 @@ public class SettingsController implements Initializable, ChildController, Navig
stage.setScene(scene); stage.setScene(scene);
stage.setOnHidden(windowEvent -> { stage.setOnHidden(windowEvent -> {
if (navigationItem == NavigationItem.ARBITRATOR_OVERVIEW) if (navigationItem == NavigationItem.ARBITRATOR_OVERVIEW)
{
updateArbitrators(); updateArbitrators();
}
}); });
stage.show(); stage.show();
@ -242,9 +173,19 @@ public class SettingsController implements Initializable, ChildController, Navig
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// UI handlers // Public Methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
void updateArbitrators()
{
arbitratorList = FXCollections.observableArrayList(settings.getAcceptedArbitrators());
initArbitrators();
}
///////////////////////////////////////////////////////////////////////////////////////////
// UI handlers
///////////////////////////////////////////////////////////////////////////////////////////
// General Settings // General Settings
@FXML @FXML
@ -272,7 +213,7 @@ public class SettingsController implements Initializable, ChildController, Navig
@FXML @FXML
public void onAddArbitrator() public void onAddArbitrator()
{ {
navigateToView(NavigationItem.ARBITRATOR_OVERVIEW); loadViewAndGetChildController(NavigationItem.ARBITRATOR_OVERVIEW);
} }
@ -853,5 +794,49 @@ public class SettingsController implements Initializable, ChildController, Navig
} }
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Arbitrators
///////////////////////////////////////////////////////////////////////////////////////////
private void addMockArbitrator()
{
if (settings.getAcceptedArbitrators().isEmpty())
{
String pubKeyAsHex = Utils.HEX.encode(new ECKey().getPubKey());
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey());
List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale());
List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>();
arbitrationMethods.add(Arbitrator.METHOD.TLS_NOTARY);
List<Arbitrator.ID_VERIFICATION> idVerifications = new ArrayList<>();
idVerifications.add(Arbitrator.ID_VERIFICATION.PASSPORT);
idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID);
Arbitrator arbitrator = new Arbitrator(pubKeyAsHex,
messagePubKeyAsHex,
"Manfred Karrer",
Arbitrator.ID_TYPE.REAL_LIFE_ID,
languages,
new Reputation(),
1,
0.01,
0.001,
10,
0.1,
arbitrationMethods,
idVerifications,
"http://bitsquare.io/",
"Bla bla...");
arbitratorList.add(arbitrator);
settings.addAcceptedArbitrator(arbitrator);
persistence.write(settings);
messageFacade.addArbitrator(arbitrator);
}
}
} }

View file

@ -3,8 +3,9 @@
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<TabPane fx:id="root" xmlns:fx="http://javafx.com/fxml/1" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" <TabPane fx:id="root" fx:controller="io.bitsquare.gui.settings.SettingsController"
xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.settings.SettingsController"> AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml">
<Tab text="General" closable="false"> <Tab text="General" closable="false">
<GridPane hgap="5.0" vgap="5.0"> <GridPane hgap="5.0" vgap="5.0">

View file

@ -1,8 +1,8 @@
package io.bitsquare.gui.market; package io.bitsquare.gui.trade;
import io.bitsquare.trade.Direction; import io.bitsquare.trade.Direction;
public class BuyController extends SellController public class BuyController extends TradeController
{ {
@Override @Override
protected void applyDirection() protected void applyDirection()

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<TabPane fx:id="root" fx:controller="io.bitsquare.gui.trade.BuyController"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml"/>

View file

@ -0,0 +1,15 @@
package io.bitsquare.gui.trade;
import io.bitsquare.trade.Direction;
public class SellController extends TradeController
{
@Override
protected void applyDirection()
{
orderBookController.applyDirection(Direction.SELL);
}
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<TabPane fx:id="root" fx:controller="io.bitsquare.gui.trade.SellController"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
xmlns:fx="http://javafx.com/fxml"/>

View file

@ -0,0 +1,174 @@
package io.bitsquare.gui.trade;
import io.bitsquare.di.GuiceFXMLLoader;
import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.components.ValidatingTextField;
import io.bitsquare.gui.trade.createoffer.CreateOfferController;
import io.bitsquare.gui.trade.orderbook.OrderBookController;
import io.bitsquare.gui.trade.takeoffer.TakerOfferController;
import io.bitsquare.trade.Direction;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.scene.Parent;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkArgument;
public class TradeController extends CachedViewController
{
private static final Logger log = LoggerFactory.getLogger(TradeController.class);
protected OrderBookController orderBookController;
protected CreateOfferController createOfferController;
protected TakerOfferController takerOfferController;
protected GuiceFXMLLoader orderBookLoader;
///////////////////////////////////////////////////////////////////////////////////////////
// Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
super.initialize(url, rb);
loadViewAndGetChildController(NavigationItem.ORDER_BOOK);
}
@Override
public void deactivate()
{
super.deactivate();
}
@Override
public void activate()
{
super.activate();
applyDirection();
// TODO find better solution
// Textfield focus out triggers validation, use runLater as quick fix...
((TabPane) root).getSelectionModel().selectedIndexProperty().addListener((observableValue) -> Platform.runLater(() -> ValidatingTextField.hidePopover()));
}
///////////////////////////////////////////////////////////////////////////////////////////
// Navigation
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{
TabPane tabPane = (TabPane) root;
if (navigationItem == NavigationItem.ORDER_BOOK)
{
checkArgument(orderBookLoader == null);
// Orderbook must not be cached by GuiceFXMLLoader as we use 2 instances for sell and buy screens.
orderBookLoader = new GuiceFXMLLoader(getClass().getResource(NavigationItem.ORDER_BOOK.getFxmlUrl()), false);
try
{
final Parent view = orderBookLoader.load();
final Tab tab = new Tab("Orderbook");
tab.setClosable(false);
tab.setContent(view);
tabPane.getTabs().add(tab);
} catch (IOException e)
{
log.error(e.getMessage());
}
orderBookController = orderBookLoader.getController();
orderBookController.setParentController(this);
return orderBookController;
}
else if (navigationItem == NavigationItem.CREATE_OFFER)
{
checkArgument(createOfferController == null);
// CreateOffer and TakeOffer must not be cached by GuiceFXMLLoader as we cannot use a view multiple times in different graphs
GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false);
try
{
final Parent view = loader.load();
createOfferController = loader.getController();
createOfferController.setParentController(this);
final Tab tab = new Tab("Create offer");
tab.setContent(view);
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1);
return createOfferController;
} catch (IOException e)
{
log.error(e.getMessage());
}
return null;
}
else if (navigationItem == NavigationItem.TAKE_OFFER)
{
checkArgument(takerOfferController == null);
// CreateOffer and TakeOffer must not be cached by GuiceFXMLLoader as we cannot use a view multiple times in different graphs
GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false);
try
{
final Parent view = loader.load();
takerOfferController = loader.getController();
takerOfferController.setParentController(this);
final Tab tab = new Tab("Take offer");
tab.setContent(view);
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tabPane.getTabs().size() - 1);
return takerOfferController;
} catch (IOException e)
{
log.error(e.getMessage());
}
return null;
}
else
{
log.error("navigationItem not supported: " + navigationItem);
return null;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Public
///////////////////////////////////////////////////////////////////////////////////////////
public void onCreateOfferViewRemoved()
{
createOfferController = null;
orderBookController.onCreateOfferViewRemoved();
}
public void onTakeOfferViewRemoved()
{
takerOfferController = null;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Protected
///////////////////////////////////////////////////////////////////////////////////////////
// Template method to be overwritten by sub class.
protected void applyDirection()
{
orderBookController.applyDirection(Direction.SELL);
}
}

View file

@ -1,19 +1,17 @@
package io.bitsquare.gui.market.createOffer; package io.bitsquare.gui.trade.createoffer;
import io.bitsquare.BitSquare; import io.bitsquare.BitSquare;
import io.bitsquare.bank.BankAccount; import io.bitsquare.bank.BankAccount;
import io.bitsquare.btc.AddressEntry; import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.FeePolicy;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.Hibernate; import io.bitsquare.gui.components.Popups;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.components.ValidatingTextField; import io.bitsquare.gui.components.ValidatingTextField;
import io.bitsquare.gui.components.btc.AddressTextField; import io.bitsquare.gui.components.btc.AddressTextField;
import io.bitsquare.gui.components.btc.BalanceTextField; import io.bitsquare.gui.components.btc.BalanceTextField;
import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator;
import io.bitsquare.gui.popups.Popups; import io.bitsquare.gui.trade.TradeController;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
import io.bitsquare.gui.util.BtcValidator; import io.bitsquare.gui.util.BtcValidator;
import io.bitsquare.gui.util.FiatValidator; import io.bitsquare.gui.util.FiatValidator;
@ -32,7 +30,6 @@ import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.TabPane; import javafx.scene.control.TabPane;
@ -43,35 +40,11 @@ import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** public class CreateOfferController extends CachedViewController
* Represents the visible state of the view
*/
class ViewModel
{
final StringProperty amount = new SimpleStringProperty();
final StringProperty minAmount = new SimpleStringProperty();
final StringProperty price = new SimpleStringProperty();
final StringProperty volume = new SimpleStringProperty();
final StringProperty collateral = new SimpleStringProperty();
final StringProperty totals = new SimpleStringProperty();
final StringProperty directionLabel = new SimpleStringProperty();
final StringProperty collateralLabel = new SimpleStringProperty();
final StringProperty feeLabel = new SimpleStringProperty();
final StringProperty bankAccountType = new SimpleStringProperty();
final StringProperty bankAccountCurrency = new SimpleStringProperty();
final StringProperty bankAccountCounty = new SimpleStringProperty();
final StringProperty acceptedCountries = new SimpleStringProperty();
final StringProperty acceptedLanguages = new SimpleStringProperty();
final StringProperty transactionId = new SimpleStringProperty();
final BooleanProperty isOfferPlacedScreen = new SimpleBooleanProperty();
final BooleanProperty isPlaceOfferButtonDisabled = new SimpleBooleanProperty(false);
}
public class CreateOfferController implements Initializable, ChildController, Hibernate
{ {
private static final Logger log = LoggerFactory.getLogger(CreateOfferController.class); private static final Logger log = LoggerFactory.getLogger(CreateOfferController.class);
private NavigationController navigationController;
private final TradeManager tradeManager; private final TradeManager tradeManager;
private final WalletFacade walletFacade; private final WalletFacade walletFacade;
final ViewModel viewModel = new ViewModel(); final ViewModel viewModel = new ViewModel();
@ -90,6 +63,7 @@ public class CreateOfferController implements Initializable, ChildController, Hi
@FXML private AddressTextField addressTextField; @FXML private AddressTextField addressTextField;
@FXML private BalanceTextField balanceTextField; @FXML private BalanceTextField balanceTextField;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor // Constructor
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -117,27 +91,14 @@ public class CreateOfferController implements Initializable, ChildController, Hi
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Public methods // Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
public void setOrderBookFilter(OrderBookFilter orderBookFilter)
{
direction = orderBookFilter.getDirection();
viewModel.directionLabel.set(BitSquareFormatter.formatDirection(direction, false) + ":");
viewModel.amount.set(BitSquareFormatter.formatCoin(orderBookFilter.getAmount()));
viewModel.minAmount.set(BitSquareFormatter.formatCoin(orderBookFilter.getAmount()));
viewModel.price.set(BitSquareFormatter.formatPrice(orderBookFilter.getPrice()));
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
super.initialize(url, rb);
//TODO just for dev testing //TODO just for dev testing
if (BitSquare.fillFormsWithDummyData) if (BitSquare.fillFormsWithDummyData)
{ {
@ -160,6 +121,79 @@ public class CreateOfferController implements Initializable, ChildController, Hi
} }
} }
@Override
public void deactivate()
{
super.deactivate();
((TradeController) parentController).onCreateOfferViewRemoved();
}
@Override
public void activate()
{
super.activate();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////////////////
public void setOrderBookFilter(OrderBookFilter orderBookFilter)
{
direction = orderBookFilter.getDirection();
viewModel.directionLabel.set(BitSquareFormatter.formatDirection(direction, false) + ":");
viewModel.amount.set(BitSquareFormatter.formatCoin(orderBookFilter.getAmount()));
viewModel.minAmount.set(BitSquareFormatter.formatCoin(orderBookFilter.getAmount()));
viewModel.price.set(BitSquareFormatter.formatPrice(orderBookFilter.getPrice()));
}
///////////////////////////////////////////////////////////////////////////////////////////
// UI Handlers
///////////////////////////////////////////////////////////////////////////////////////////
@FXML
public void onPlaceOffer()
{
amountTextField.reValidate();
minAmountTextField.reValidate();
volumeTextField.reValidate();
priceTextField.reValidate();
//balanceTextField.getBalance()
if (amountTextField.getIsValid() && minAmountTextField.getIsValid() && volumeTextField.getIsValid() && amountTextField.getIsValid())
{
viewModel.isPlaceOfferButtonDisabled.set(true);
tradeManager.requestPlaceOffer(direction,
BitSquareFormatter.parseToDouble(viewModel.price.get()),
BitSquareFormatter.parseToCoin(viewModel.amount.get()),
BitSquareFormatter.parseToCoin(viewModel.minAmount.get()),
(transaction) -> {
viewModel.isOfferPlacedScreen.set(true);
viewModel.transactionId.set(transaction.getHashAsString());
},
errorMessage -> {
Popups.openErrorPopup("An error occurred", errorMessage);
viewModel.isPlaceOfferButtonDisabled.set(false);
});
}
}
@FXML
public void onClose()
{
TabPane tabPane = ((TabPane) (rootContainer.getParent().getParent()));
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
}
///////////////////////////////////////////////////////////////////////////////////////////
// Private Methods
///////////////////////////////////////////////////////////////////////////////////////////
private void setupBindings() private void setupBindings()
{ {
viewModel.amount.addListener((ov, oldValue, newValue) -> { viewModel.amount.addListener((ov, oldValue, newValue) -> {
@ -264,80 +298,28 @@ public class CreateOfferController implements Initializable, ChildController, Hi
volumeTextField.reValidate(); volumeTextField.reValidate();
}); });
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
this.navigationController = navigationController;
}
@Override
public void cleanup()
{
}
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Hibernate
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void sleep()
{
cleanup();
}
@Override
public void awake()
{
}
///////////////////////////////////////////////////////////////////////////////////////////
// UI Handlers
///////////////////////////////////////////////////////////////////////////////////////////
@FXML
public void onPlaceOffer()
{
amountTextField.reValidate();
minAmountTextField.reValidate();
volumeTextField.reValidate();
priceTextField.reValidate();
//balanceTextField.getBalance()
if (amountTextField.getIsValid() && minAmountTextField.getIsValid() && volumeTextField.getIsValid() && amountTextField.getIsValid())
{
viewModel.isPlaceOfferButtonDisabled.set(true);
tradeManager.requestPlaceOffer(direction,
BitSquareFormatter.parseToDouble(viewModel.price.get()),
BitSquareFormatter.parseToCoin(viewModel.amount.get()),
BitSquareFormatter.parseToCoin(viewModel.minAmount.get()),
(transaction) -> {
viewModel.isOfferPlacedScreen.set(true);
viewModel.transactionId.set(transaction.getHashAsString());
},
errorMessage -> {
Popups.openErrorPopup("An error occurred", errorMessage);
viewModel.isPlaceOfferButtonDisabled.set(false);
});
}
}
@FXML
public void onClose()
{
TabPane tabPane = ((TabPane) (rootContainer.getParent().getParent()));
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
navigationController.navigateToView(NavigationItem.ORDER_BOOK);
}
} }
/**
* Represents the visible state of the view
*/
class ViewModel
{
final StringProperty amount = new SimpleStringProperty();
final StringProperty minAmount = new SimpleStringProperty();
final StringProperty price = new SimpleStringProperty();
final StringProperty volume = new SimpleStringProperty();
final StringProperty collateral = new SimpleStringProperty();
final StringProperty totals = new SimpleStringProperty();
final StringProperty directionLabel = new SimpleStringProperty();
final StringProperty collateralLabel = new SimpleStringProperty();
final StringProperty feeLabel = new SimpleStringProperty();
final StringProperty bankAccountType = new SimpleStringProperty();
final StringProperty bankAccountCurrency = new SimpleStringProperty();
final StringProperty bankAccountCounty = new SimpleStringProperty();
final StringProperty acceptedCountries = new SimpleStringProperty();
final StringProperty acceptedLanguages = new SimpleStringProperty();
final StringProperty transactionId = new SimpleStringProperty();
final BooleanProperty isOfferPlacedScreen = new SimpleBooleanProperty();
final BooleanProperty isPlaceOfferButtonDisabled = new SimpleBooleanProperty(false);
}

View file

@ -7,8 +7,9 @@
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane fx:id="rootContainer" prefHeight="500" prefWidth="800" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.trade.createoffer.CreateOfferController"
AnchorPane.topAnchor="10.0" xmlns="http://javafx.com/javafx/8" fx:controller="io.bitsquare.gui.market.createOffer.CreateOfferController" xmlns:fx="http://javafx.com/fxml/1"> prefHeight="500" prefWidth="800" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"
xmlns:fx="http://javafx.com/fxml">
<GridPane hgap="5.0" vgap="5.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"> <GridPane hgap="5.0" vgap="5.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">

View file

@ -1,4 +1,4 @@
package io.bitsquare.gui.market.orderbook; package io.bitsquare.gui.trade.orderbook;
import com.google.bitcoin.core.Coin; import com.google.bitcoin.core.Coin;
import com.google.bitcoin.core.InsufficientMoneyException; import com.google.bitcoin.core.InsufficientMoneyException;
@ -7,13 +7,13 @@ import com.google.common.util.concurrent.FutureCallback;
import io.bitsquare.bank.BankAccountType; import io.bitsquare.bank.BankAccountType;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.FeePolicy;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.MainController; import io.bitsquare.gui.MainController;
import io.bitsquare.gui.NavigationController;
import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.market.createOffer.CreateOfferController; import io.bitsquare.gui.ViewController;
import io.bitsquare.gui.market.trade.TakerOfferController; import io.bitsquare.gui.components.Popups;
import io.bitsquare.gui.popups.Popups; import io.bitsquare.gui.trade.createoffer.CreateOfferController;
import io.bitsquare.gui.trade.takeoffer.TakerOfferController;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.locale.Country; import io.bitsquare.locale.Country;
@ -39,12 +39,10 @@ import javafx.animation.AnimationTimer;
import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.transformation.SortedList; import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.util.Callback; import javafx.util.Callback;
import javax.inject.Inject; import javax.inject.Inject;
@ -54,9 +52,10 @@ import org.controlsfx.dialog.Dialogs;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class OrderBookController implements Initializable, ChildController public class OrderBookController extends CachedViewController
{ {
private static final Logger log = LoggerFactory.getLogger(OrderBookController.class); private static final Logger log = LoggerFactory.getLogger(OrderBookController.class);
private final OrderBook orderBook; private final OrderBook orderBook;
private final OrderBookFilter orderBookFilter; private final OrderBookFilter orderBookFilter;
private final User user; private final User user;
@ -65,26 +64,18 @@ public class OrderBookController implements Initializable, ChildController
private final Settings settings; private final Settings settings;
private final Persistence persistence; private final Persistence persistence;
private SortedList<OrderBookListItem> offerList;
private AnimationTimer pollingTimer;
private final Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY); private final Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY);
private final Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL); private final Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL);
@FXML
public AnchorPane holderPane;
@FXML
public HBox topHBox;
@FXML
public TextField volume, amount, price;
@FXML
public TableView<OrderBookListItem> orderBookTable;
@FXML
public TableColumn<OrderBookListItem, String> priceColumn, amountColumn, volumeColumn;
@FXML
public Button createOfferButton;
private NavigationController navigationController;
private SortedList<OrderBookListItem> offerList;
private AnimationTimer pollingTimer; @FXML public HBox topHBox;
@FXML @FXML public TextField volume, amount, price;
private TableColumn<String, OrderBookListItem> directionColumn, countryColumn, bankAccountTypeColumn; @FXML public TableView<OrderBookListItem> orderBookTable;
@FXML public TableColumn<OrderBookListItem, String> priceColumn, amountColumn, volumeColumn;
@FXML public Button createOfferButton;
@FXML private TableColumn<String, OrderBookListItem> directionColumn, countryColumn, bankAccountTypeColumn;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -106,18 +97,66 @@ public class OrderBookController implements Initializable, ChildController
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable // Lifecycle
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Override @Override
public void initialize(URL url, ResourceBundle rb) public void initialize(URL url, ResourceBundle rb)
{ {
super.initialize(url, rb);
// init table // init table
setCountryColumnCellFactory(); setCountryColumnCellFactory();
setBankAccountTypeColumnCellFactory(); setBankAccountTypeColumnCellFactory();
setDirectionColumnCellFactory(); setDirectionColumnCellFactory();
} }
@Override
public void deactivate()
{
super.deactivate();
orderBook.cleanup();
orderBookTable.setItems(null);
orderBookTable.getSortOrder().clear();
offerList.comparatorProperty().unbind();
if (pollingTimer != null)
{
pollingTimer.stop();
pollingTimer = null;
}
}
@Override
public void activate()
{
super.activate();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Navigation
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setParentController(ViewController parentController)
{
super.setParentController(parentController);
}
@Override
public ViewController loadViewAndGetChildController(NavigationItem navigationItem)
{
return null;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Private
///////////////////////////////////////////////////////////////////////////////////////////
private void init() private void init()
{ {
orderBook.init(); orderBook.init();
@ -151,33 +190,6 @@ public class OrderBookController implements Initializable, ChildController
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
this.navigationController = navigationController;
}
@Override
public void cleanup()
{
orderBook.cleanup();
orderBookTable.setItems(null);
orderBookTable.getSortOrder().clear();
offerList.comparatorProperty().unbind();
if (pollingTimer != null)
{
pollingTimer.stop();
pollingTimer = null;
}
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Public methods // Public methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -191,6 +203,35 @@ public class OrderBookController implements Initializable, ChildController
} }
///////////////////////////////////////////////////////////////////////////////////////////
// UI handlers
///////////////////////////////////////////////////////////////////////////////////////////
@FXML
public void createOffer()
{
if (isRegistered())
{
createOfferButton.setDisable(true);
/* if (walletFacade.isUnusedTradeAddressBalanceAboveCreationFee())
{ */
ViewController nextController = parentController.loadViewAndGetChildController(NavigationItem.CREATE_OFFER);
if (nextController != null)
((CreateOfferController) nextController).setOrderBookFilter(orderBookFilter);
/* }
else
{
Action response = Popups.openErrorPopup("No funds for a trade", "You have to add some funds before you create a new offer.");
if (response == Dialog.Actions.OK)
MainController.GET_INSTANCE().navigateToView(NavigationItem.FUNDS);
} */
}
else
{
showRegistrationDialog();
}
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Private methods // Private methods
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -227,7 +268,7 @@ public class OrderBookController implements Initializable, ChildController
"The registration fee transaction has not been confirmed yet in the blockchain. Please wait until it has at least 1 confirmation."); "The registration fee transaction has not been confirmed yet in the blockchain. Please wait until it has at least 1 confirmation.");
if (response == Dialog.Actions.OK) if (response == Dialog.Actions.OK)
{ {
MainController.GET_INSTANCE().navigateToView(NavigationItem.FUNDS); MainController.GET_INSTANCE().loadViewAndGetChildController(NavigationItem.FUNDS);
} }
} }
} }
@ -237,7 +278,7 @@ public class OrderBookController implements Initializable, ChildController
"You have not funded the full registration fee of " + BitSquareFormatter.formatCoinWithCode(FeePolicy.ACCOUNT_REGISTRATION_FEE) + " BTC."); "You have not funded the full registration fee of " + BitSquareFormatter.formatCoinWithCode(FeePolicy.ACCOUNT_REGISTRATION_FEE) + " BTC.");
if (response == Dialog.Actions.OK) if (response == Dialog.Actions.OK)
{ {
MainController.GET_INSTANCE().navigateToView(NavigationItem.FUNDS); MainController.GET_INSTANCE().loadViewAndGetChildController(NavigationItem.FUNDS);
} }
} }
} }
@ -267,11 +308,11 @@ public class OrderBookController implements Initializable, ChildController
selectedIndex); selectedIndex);
if (registrationMissingAction == settingsCommandLink) if (registrationMissingAction == settingsCommandLink)
{ {
MainController.GET_INSTANCE().navigateToView(NavigationItem.SETTINGS); MainController.GET_INSTANCE().loadViewAndGetChildController(NavigationItem.SETTINGS);
} }
else if (registrationMissingAction == depositFeeCommandLink) else if (registrationMissingAction == depositFeeCommandLink)
{ {
MainController.GET_INSTANCE().navigateToView(NavigationItem.FUNDS); MainController.GET_INSTANCE().loadViewAndGetChildController(NavigationItem.FUNDS);
} }
else if (registrationMissingAction == sendRegistrationCommandLink) else if (registrationMissingAction == sendRegistrationCommandLink)
{ {
@ -315,35 +356,11 @@ public class OrderBookController implements Initializable, ChildController
} }
} }
private void createOffer()
{
if (isRegistered())
{
/* if (walletFacade.isUnusedTradeAddressBalanceAboveCreationFee())
{ */
ChildController nextController = navigationController.navigateToView(NavigationItem.CREATE_OFFER);
if (nextController != null)
((CreateOfferController) nextController).setOrderBookFilter(orderBookFilter);
/* }
else
{
Action response = Popups.openErrorPopup("No funds for a trade", "You have to add some funds before you create a new offer.");
if (response == Dialog.Actions.OK)
MainController.GET_INSTANCE().navigateToView(NavigationItem.FUNDS);
} */
}
else
{
showRegistrationDialog();
}
}
private void takeOffer(Offer offer) private void takeOffer(Offer offer)
{ {
if (isRegistered()) if (isRegistered())
{ {
TakerOfferController takerOfferController = (TakerOfferController) navigationController.navigateToView(NavigationItem.TAKE_OFFER); TakerOfferController takerOfferController = (TakerOfferController) parentController.loadViewAndGetChildController(NavigationItem.TAKE_OFFER);
Coin requestedAmount; Coin requestedAmount;
if (!"".equals(amount.getText())) if (!"".equals(amount.getText()))
@ -580,5 +597,13 @@ public class OrderBookController implements Initializable, ChildController
double p = textInputToNumber(price.getText(), price.getText()); double p = textInputToNumber(price.getText(), price.getText());
volume.setText(BitSquareFormatter.formatPrice(a * p)); volume.setText(BitSquareFormatter.formatPrice(a * p));
} }
public void onCreateOfferViewRemoved()
{
createOfferButton.setDisable(false);
}
} }

View file

@ -1,4 +1,4 @@
package io.bitsquare.gui.market.orderbook; package io.bitsquare.gui.trade.orderbook;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
import io.bitsquare.trade.Offer; import io.bitsquare.trade.Offer;

View file

@ -4,9 +4,9 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.PropertyValueFactory?> <?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:id="holderPane" AnchorPane.bottomAnchor="0.0" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.trade.orderbook.OrderBookController"
AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
fx:controller="io.bitsquare.gui.market.orderbook.OrderBookController"> xmlns:fx="http://javafx.com/fxml">
<HBox fx:id="topHBox" prefHeight="22.0" AnchorPane.topAnchor="10.0" AnchorPane.leftAnchor="10.0" <HBox fx:id="topHBox" prefHeight="22.0" AnchorPane.topAnchor="10.0" AnchorPane.leftAnchor="10.0"
AnchorPane.rightAnchor="10.0"> AnchorPane.rightAnchor="10.0">
@ -37,8 +37,7 @@
</Label> </Label>
</HBox> </HBox>
<Button fx:id="createOfferButton" text="Create new offer" AnchorPane.topAnchor="10.0" <Button fx:id="createOfferButton" text="Create new offer" onAction="#createOffer" AnchorPane.topAnchor="10.0" AnchorPane.rightAnchor="10.0"/>
AnchorPane.rightAnchor="10.0"/>
<TableView fx:id="orderBookTable" AnchorPane.leftAnchor="10.0" <TableView fx:id="orderBookTable" AnchorPane.leftAnchor="10.0"
AnchorPane.topAnchor="45.0" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="10.0"> AnchorPane.topAnchor="45.0" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="10.0">

View file

@ -4,8 +4,7 @@
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml" fx:id="rootContainer" <AnchorPane fx:id="root" fx:controller="io.bitsquare.gui.trade.takeoffer.TakerOfferController" xmlns:fx="http://javafx.com/fxml">
fx:controller="io.bitsquare.gui.market.trade.TakerOfferController">
<Accordion fx:id="accordion" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0"> <Accordion fx:id="accordion" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
<panes> <panes>

View file

@ -1,17 +1,15 @@
package io.bitsquare.gui.market.trade; package io.bitsquare.gui.trade.takeoffer;
import com.google.bitcoin.core.Coin; import com.google.bitcoin.core.Coin;
import io.bitsquare.btc.AddressEntry; import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.FeePolicy;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.gui.ChildController; import io.bitsquare.gui.CachedViewController;
import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.components.Popups;
import io.bitsquare.gui.NavigationItem;
import io.bitsquare.gui.components.ValidatedTextField; import io.bitsquare.gui.components.ValidatedTextField;
import io.bitsquare.gui.popups.Popups; import io.bitsquare.gui.trade.TradeController;
import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.BitSquareFormatter;
import io.bitsquare.gui.util.BitSquareValidator; import io.bitsquare.gui.util.BitSquareValidator;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.trade.Offer; import io.bitsquare.trade.Offer;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeManager; import io.bitsquare.trade.TradeManager;
@ -20,31 +18,24 @@ import io.bitsquare.trade.protocol.taker.ProtocolForTakerAsSellerListener;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane;
import javax.inject.Inject; import javax.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@SuppressWarnings("UnusedParameters") public class TakerOfferController extends CachedViewController
public class TakerOfferController implements Initializable, ChildController
{ {
private static final Logger log = LoggerFactory.getLogger(TakerOfferController.class); private static final Logger log = LoggerFactory.getLogger(TakerOfferController.class);
private final TradeManager tradeManager; private final TradeManager tradeManager;
private final WalletFacade walletFacade; private final WalletFacade walletFacade;
private final MessageFacade messageFacade;
private NavigationController navigationController;
private Offer offer; private Offer offer;
private Coin requestedAmount; private Coin requestedAmount;
private String tradeId; private String tradeId;
private String depositTxId; private String depositTxId;
@FXML
private AnchorPane rootContainer;
@FXML @FXML
private Accordion accordion; private Accordion accordion;
@FXML @FXML
@ -65,11 +56,36 @@ public class TakerOfferController implements Initializable, ChildController
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject
private TakerOfferController(TradeManager tradeManager, WalletFacade walletFacade, MessageFacade messageFacade) private TakerOfferController(TradeManager tradeManager, WalletFacade walletFacade)
{ {
this.tradeManager = tradeManager; this.tradeManager = tradeManager;
this.walletFacade = walletFacade; this.walletFacade = walletFacade;
this.messageFacade = messageFacade; }
///////////////////////////////////////////////////////////////////////////////////////////
// Lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
super.initialize(url, rb);
accordion.setExpandedPane(takeOfferTitledPane);
}
@Override
public void deactivate()
{
super.deactivate();
((TradeController) parentController).onTakeOfferViewRemoved();
}
@Override
public void activate()
{
super.activate();
} }
@ -88,16 +104,6 @@ public class TakerOfferController implements Initializable, ChildController
} }
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: Initializable
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void initialize(URL url, ResourceBundle rb)
{
accordion.setExpandedPane(takeOfferTitledPane);
}
public void applyData() public void applyData()
{ {
amountTextField.setText(requestedAmount.toPlainString()); amountTextField.setText(requestedAmount.toPlainString());
@ -127,22 +133,6 @@ public class TakerOfferController implements Initializable, ChildController
} }
///////////////////////////////////////////////////////////////////////////////////////////
// Interface implementation: ChildController
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setNavigationController(NavigationController navigationController)
{
this.navigationController = navigationController;
}
@Override
public void cleanup()
{
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// GUI handlers // GUI handlers
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -248,10 +238,8 @@ public class TakerOfferController implements Initializable, ChildController
@FXML @FXML
public void onClose() public void onClose()
{ {
TabPane tabPane = ((TabPane) (rootContainer.getParent().getParent())); TabPane tabPane = ((TabPane) (root.getParent().getParent()));
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem()); tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
navigationController.navigateToView(NavigationItem.ORDER_BOOK);
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -7,7 +7,7 @@ import com.google.bitcoin.core.Utils;
import io.bitsquare.btc.BlockChainFacade; import io.bitsquare.btc.BlockChainFacade;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.WalletFacade;
import io.bitsquare.crypto.CryptoFacade; import io.bitsquare.crypto.CryptoFacade;
import io.bitsquare.gui.popups.Popups; import io.bitsquare.gui.components.Popups;
import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.listeners.TakeOfferRequestListener; import io.bitsquare.msg.listeners.TakeOfferRequestListener;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;

View file

@ -1,7 +1,7 @@
package io.bitsquare.trade.orderbook; package io.bitsquare.trade.orderbook;
import io.bitsquare.bank.BankAccount; import io.bitsquare.bank.BankAccount;
import io.bitsquare.gui.market.orderbook.OrderBookListItem; import io.bitsquare.gui.trade.orderbook.OrderBookListItem;
import io.bitsquare.locale.Country; import io.bitsquare.locale.Country;
import io.bitsquare.locale.CurrencyUtil; import io.bitsquare.locale.CurrencyUtil;
import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageFacade;

View file

@ -1,35 +0,0 @@
package io.bitsquare.util;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Text;
public class Controller implements Initializable
{
public GridPane root;
public void initialize(URL url, ResourceBundle rb)
{
BorderPane borderPane = new BorderPane();
Text text = new Text("BEFORE");
borderPane.setCenter(text);
MenuBar menuBar = new MenuBar();
Menu mainMenu = new Menu("File");
MenuItem exitCmd = new MenuItem("Exit");
MenuItem textCmd = new MenuItem("Colour Text");
mainMenu.getItems().addAll(textCmd, exitCmd);
// borderPane.setTop(menuBar);
root.getChildren().addAll(menuBar);
}
}