diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java index af5f1781..698af73f 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java @@ -331,6 +331,22 @@ public class GUIStringTool { public static String getAccountLevelColumnHeaderLabel() { return "Niveau d'accréditation"; } + + public static String getServerSectionTitleLabel() { + return "Serveur"; + } + + public static String getAccountSectionTitleLabel() { + return "Compte"; + } + + public static String getServerHostLabel() { + return "Host : "; + } + + public static String getServerPortLabel() { + return "Port : "; + } } diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrame.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrame.java index 330a1914..07721397 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrame.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrame.java @@ -21,7 +21,7 @@ public class StartupFrame implements IFXComponent{ } @Override - public Pane getMainPane() { - return view.getMainPane(); + public Pane getPane() { + return view.getPane(); } } diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameController.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameController.java index 2aca60ca..8500064e 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameController.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameController.java @@ -18,4 +18,17 @@ public class StartupFrameController implements IStartupFrameModelListener { public void updateView() { //TODO écrire corps méthd StartupFrameController.updateView() } + + public void onValidation() { + if(!model.isStartupProcessRunning()){ + //TODO catch following exceptions and update GUI when needed : + //NullPointerException && IllegalArgumentException + model.beginStartupProcess( + view.getServerHostTextFieldContent(), + view.getServerPortTextFieldContent(), + view.getAccountUsernameTextFieldContent(), + view.getAccountPasswordTextFieldContent() + ); + } + } } diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameModel.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameModel.java index 37d29221..daf3dc0a 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameModel.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameModel.java @@ -2,7 +2,10 @@ package com.pqt.client.gui.startup_frame; import com.pqt.client.gui.startup_frame.listeners.IStartupFrameModelListener; import com.pqt.client.module.account.AccountService; +import com.pqt.client.module.account.listeners.AccountListenerAdapter; +import com.pqt.client.module.account.listeners.IAccountListener; import com.pqt.client.module.network.NetworkService; +import com.pqt.client.module.network.listeners.INetworkServiceListener; import javax.swing.event.EventListenerList; @@ -12,13 +15,44 @@ public class StartupFrameModel { private final NetworkService networkService; private final EventListenerList listenerList; + private boolean startupProcessBegan; + public StartupFrameModel(AccountService accountService, NetworkService networkService) { this.accountService = accountService; this.networkService = networkService; this.listenerList = new EventListenerList(); + startupProcessBegan = false; } public void addListener(IStartupFrameModelListener ctrl) { listenerList.add(IStartupFrameModelListener.class, ctrl); } + + public boolean isStartupProcessRunning() { + return startupProcessBegan; + } + + public void beginStartupProcess(String requiredHost, String requiredPort, String username, String password) { + if(!startupProcessBegan){ + checkParameters(requiredHost, requiredPort, username, password); + startupProcessBegan = true; + + Integer requiredIntPort = Integer.parseInt(requiredPort); + + new StartupProcedureHandler(networkService, accountService) + .init(requiredHost, requiredIntPort, username, password) + .handle(); + } + } + + private void checkParameters(String host, String port, String username, String password) { + if(host==null || port == null || username == null || password == null) + throw new NullPointerException("Null parameters are not allowed on startup"); + + if(username.isEmpty() || host.isEmpty() || port.isEmpty()) + throw new IllegalArgumentException("The following parameters must be filled : host, port, username"); + + if(!port.matches("^\\d+$")) + throw new IllegalArgumentException("Given port is not a positive integer"); + } } diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameView.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameView.java index 9b29aa2b..3cc5dcd4 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameView.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameView.java @@ -1,26 +1,81 @@ package com.pqt.client.gui.startup_frame; import com.pqt.client.gui.ressources.components.generics.IFXComponent; -import javafx.scene.layout.BorderPane; -import javafx.scene.layout.Pane; +import com.pqt.client.gui.ressources.strings.GUIStringTool; +import javafx.scene.control.*; +import javafx.scene.layout.*; public class StartupFrameView implements IFXComponent{ - private BorderPane mainPane; + private VBox mainPane; private final StartupFrameController ctrl; + private TextField serverHostTextField; + private TextField serverPortTextField; + private TextField usernameTextField; + private TextField passwordTextField; + public StartupFrameView(StartupFrameController ctrl) { this.ctrl = ctrl; initGui(); } private void initGui() { - mainPane = new BorderPane(); - //TODO ajouter GUI StartupFrameView + mainPane = new VBox(); + + Label serverHostLabel = new Label(GUIStringTool.getServerHostLabel()); + serverHostTextField = new TextField(); + Label serverPortLabel = new Label(GUIStringTool.getServerPortLabel()); + serverPortTextField = new TextField(); + + GridPane serverFieldGridPane = new GridPane(); + serverFieldGridPane.add(serverHostLabel,0,0); + serverFieldGridPane.add(serverHostTextField,1,0); + serverFieldGridPane.add(serverPortLabel,0,1); + serverFieldGridPane.add(serverPortTextField,1,1); + + TitledPane serverTitledPane = new TitledPane(GUIStringTool.getServerSectionTitleLabel(),serverFieldGridPane); + + + Label usernameLabel = new Label(GUIStringTool.getUsernameLabel()); + usernameTextField = new TextField(); + Label passwordLabel = new Label(GUIStringTool.getPasswordLabel()); + passwordTextField = new PasswordField(); + + GridPane accountFieldGridPane = new GridPane(); + accountFieldGridPane.add(usernameLabel,0,0); + accountFieldGridPane.add(usernameTextField,1,0); + accountFieldGridPane.add(passwordLabel,0,1); + accountFieldGridPane.add(passwordTextField,1,1); + + TitledPane accountTitledPane = new TitledPane(GUIStringTool.getAccountSectionTitleLabel(),accountFieldGridPane); + + Button validationButton = new Button(GUIStringTool.getValidationButtonLabel()); + validationButton.setOnAction((event)->{ + ctrl.onValidation(); + }); + + mainPane.getChildren().addAll(serverTitledPane, accountTitledPane, validationButton); + } + + String getServerHostTextFieldContent(){ + return serverHostTextField.getText(); + } + + String getServerPortTextFieldContent(){ + return serverPortTextField.getText(); + } + + String getAccountUsernameTextFieldContent(){ + return usernameTextField.getText(); + } + + String getAccountPasswordTextFieldContent(){ + return passwordTextField.getText(); } @Override - public Pane getMainPane() { + public Pane getPane() { return mainPane; } } diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupProcedureHandler.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupProcedureHandler.java new file mode 100644 index 00000000..7471d3cf --- /dev/null +++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupProcedureHandler.java @@ -0,0 +1,106 @@ +package com.pqt.client.gui.startup_frame; + +import com.pqt.client.module.account.AccountService; +import com.pqt.client.module.account.listeners.AccountListenerAdapter; +import com.pqt.client.module.account.listeners.IAccountListener; +import com.pqt.client.module.network.NetworkService; +import com.pqt.client.module.network.listeners.INetworkServiceListener; +import com.pqt.core.entities.user_account.Account; + +class StartupProcedureHandler { + + private NetworkService networkService; + private AccountService accountService; + + private String host, username, password; + private Integer port; + + StartupProcedureHandler(NetworkService networkService, AccountService accountService) { + this.networkService = networkService; + this.accountService = accountService; + } + + StartupProcedureHandler init(String host, Integer port, String username, String password){ + this.host = host; + this.port = port; + this.username = username; + this.password = password; + + return this; + } + + void handle(){ + testConnection(); + } + + private void testConnection(){ + networkService.addListener(getPingListener()); + networkService.sendPQTPing(host, port); + } + + private void useRequestedServer(){ + //TODO notify this + networkService.setActiveServer(host, port); + accountService.addListener(getUpdateAccountListListener()); + accountService.refreshAccounts(); + } + + private void connectAccount(){ + Account match = accountService.getAllAccounts().stream() + .filter(account -> account.getUsername().equals(username)) + .findFirst() + .orElse(null); + + if(match==null){ + //TODO notify this + }else{ + accountService.setCurrentAccount(match); + accountService.addListener(getConnectAccountListener()); + accountService.logInCurrentAccount(StartupProcedureHandler.this.password); + } + } + + private INetworkServiceListener getPingListener(){ + return new INetworkServiceListener() { + @Override + public void onPQTPingSuccessEvent(String host, Integer port) { + if(StartupProcedureHandler.this.host.equals(host) + && StartupProcedureHandler.this.port.equals(port)){ + useRequestedServer(); + } + } + + @Override + public void onPQTPingFailureEvent(String host, Integer port, Throwable cause) { + + } + + @Override + public void onNewServerConfigData() { + + } + }; + } + + private IAccountListener getUpdateAccountListListener(){ + return new AccountListenerAdapter(){ + @Override + public void onAccountListChangedEvent(){ + connectAccount(); + } + }; + } + + private IAccountListener getConnectAccountListener(){ + return new AccountListenerAdapter(){ + @Override + public void onAccountStatusChangedEvent(boolean status) { + if(status){ + //TODO notify this + }else{ + //TODO notify this + } + } + }; + } +} diff --git a/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java b/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java index 1c46f8a6..9c9c96bb 100644 --- a/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java +++ b/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java @@ -27,7 +27,6 @@ public class AccountService { this.executor = executor; listenerList = new EventListenerList(); accounts = new ArrayList<>(); - refreshAccounts(); } public Account getCurrentAccount() { diff --git a/Workspace/client/src/main/java/com/pqt/client/module/network/NetworkService.java b/Workspace/client/src/main/java/com/pqt/client/module/network/NetworkService.java index 9dee5ebe..154265d6 100644 --- a/Workspace/client/src/main/java/com/pqt/client/module/network/NetworkService.java +++ b/Workspace/client/src/main/java/com/pqt/client/module/network/NetworkService.java @@ -1,5 +1,6 @@ package com.pqt.client.module.network; +import com.pqt.client.module.connection.ConnectionService; import com.pqt.client.module.network.listeners.INetworkServiceListener; import com.pqt.client.module.query.QueryExecutor; import com.pqt.client.module.query.query_callback.IMapItemMessageCallback; @@ -18,11 +19,13 @@ import java.util.*; public class NetworkService { private final QueryExecutor queryExecutor; + private final ConnectionService connectionService; private final EventListenerList listenerList; private final ServerConfigCache configCache; - public NetworkService(QueryExecutor queryExecutor) { + public NetworkService(QueryExecutor queryExecutor, ConnectionService connectionService) { this.queryExecutor = queryExecutor; + this.connectionService = connectionService; listenerList = new EventListenerList(); configCache = new ServerConfigCache(); } @@ -59,11 +62,20 @@ public class NetworkService { }); } + public boolean hasServerConfig(String host, Integer port){ + checkData(host, port); + return configCache.hasConfig(host, port); + } + public ServerConfig getServerConfig(String host, Integer port){ checkData(host, port); return configCache.getConfig(host, port); } + public void setActiveServer(String host, Integer port){ + connectionService.setServerUrl(String.format("%s:%s", host, port)); + } + private void sendConfigRequest(String host, Integer port){ queryExecutor.executeConfigListQuery(new IMapItemMessageCallback(){ diff --git a/Workspace/client/src/main/resources/nightmode.css b/Workspace/client/src/main/resources/nightmode.css index a33217d2..080c1589 100644 --- a/Workspace/client/src/main/resources/nightmode.css +++ b/Workspace/client/src/main/resources/nightmode.css @@ -2,13 +2,6 @@ -fx-background-color: #1d1d1d; } -.label { - -fx-font-size: 11pt; - -fx-font-family: "Segoe UI Semibold"; - -fx-text-fill: white; - -fx-opacity: 0.8; -} - .label-bright { -fx-font-size: 11pt; -fx-font-family: "Segoe UI Semibold"; @@ -127,15 +120,29 @@ .context-menu { -fx-background-color: derive(#1d1d1d,5%); } -.text-field, .password-field, .choice-box, .text-area, .combo-box, .button { + +.titled-pane, .titled-pane > .title, .titled-pane > *.content, .text-field, +.password-field, .choice-box, .text-area, .combo-box, .button, .label { -fx-font-size: 12pt; -fx-font-family: "Segoe UI Semibold"; + -fx-background-color: #1d1d1d; + -fx-text-fill: #d8d8d8; +} + +.titled-pane, .titled-pane > .title, .titled-pane > *.content { + -fx-border-width: 0; +} + +.text-field, .password-field, .choice-box, .text-area, .combo-box, .button{ -fx-pref-width: 150; -fx-pref-height: 30; - -fx-background-color: #1d1d1d; -fx-border-color: #e2e2e2; -fx-border-width: 2; - -fx-text-fill: #d8d8d8; +} + +.label{ + -fx-pref-width: 150; + -fx-pref-height: 30; } .button:hover {