From f1bdab062454227688d73ffe57041bc9d0d600fe Mon Sep 17 00:00:00 2001 From: "alexandre.ducarne" <alexandre.ducarne@renault.com> Date: Wed, 6 Nov 2019 18:47:03 +0100 Subject: [PATCH] Add maven support and base client app --- pom.xml | 50 ++++++++++++ src/baleine/client/ClientApp.java | 39 ++++++++++ src/baleine/client/game/.gitkeep | 0 .../TransApplicationController.java | 77 +++++++++++++++++++ .../game/model/TransApplicationModel.java | 40 ++++++++++ src/baleine/client/game/model/TransItem.java | 27 +++++++ src/baleine/client/game/view/CardShape.java | 75 ++++++++++++++++++ .../game/view/TransApplicationView.java | 47 +++++++++++ .../TransApplicationController.java | 77 +++++++++++++++++++ .../main/model/TransApplicationModel.java | 40 ++++++++++ src/baleine/client/main/model/TransItem.java | 27 +++++++ src/baleine/client/main/view/CardShape.java | 75 ++++++++++++++++++ .../main/view/TransApplicationView.java | 47 +++++++++++ src/baleine/common/dataModel/UserHeavy.java | 2 + 14 files changed, 623 insertions(+) create mode 100644 pom.xml create mode 100644 src/baleine/client/ClientApp.java delete mode 100644 src/baleine/client/game/.gitkeep create mode 100644 src/baleine/client/game/controller/TransApplicationController.java create mode 100644 src/baleine/client/game/model/TransApplicationModel.java create mode 100644 src/baleine/client/game/model/TransItem.java create mode 100644 src/baleine/client/game/view/CardShape.java create mode 100644 src/baleine/client/game/view/TransApplicationView.java create mode 100644 src/baleine/client/main/controller/TransApplicationController.java create mode 100644 src/baleine/client/main/model/TransApplicationModel.java create mode 100644 src/baleine/client/main/model/TransItem.java create mode 100644 src/baleine/client/main/view/CardShape.java create mode 100644 src/baleine/client/main/view/TransApplicationView.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..9c798b7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>2.2.0.RELEASE</version> + <relativePath/> <!-- lookup parent from repository --> + </parent> + <groupId>com.ai12</groupId> + <artifactId>othello</artifactId> + <version>0.0.1-SNAPSHOT</version> + <name>othello</name> + <description>ai12 othello game</description> + <packaging>jar</packaging> + + <properties> + <java.version>1.8</java.version> + </properties> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-websocket</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + </plugin> + </plugins> + </build> + +</project> diff --git a/src/baleine/client/ClientApp.java b/src/baleine/client/ClientApp.java new file mode 100644 index 0000000..e6e7992 --- /dev/null +++ b/src/baleine/client/ClientApp.java @@ -0,0 +1,39 @@ +package baleine.client; + +import baleine.client.game.controller.TransApplicationController; +import baleine.client.game.view.TransApplicationView; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.stage.Stage; + +/** + * Main application + * + * @author thomas + */ +public class ClientApp extends Application { + private TransApplicationView view; + private TransApplicationController controller; + + @Override + public void start(Stage stage) throws Exception { + + view = new TransApplicationView(); + controller = new TransApplicationController(view); + + // Application content display + stage.setTitle("Translator"); + stage.setScene(new Scene(view, 600, 400)); + stage.setResizable(false); + stage.show(); + } + + /** + * Run + * + * @param args + */ + public static void main(String[] args) { + launch(args); + } +} diff --git a/src/baleine/client/game/.gitkeep b/src/baleine/client/game/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/baleine/client/game/controller/TransApplicationController.java b/src/baleine/client/game/controller/TransApplicationController.java new file mode 100644 index 0000000..129085c --- /dev/null +++ b/src/baleine/client/game/controller/TransApplicationController.java @@ -0,0 +1,77 @@ +package baleine.client.game.controller; + +import java.io.File; + +import baleine.client.game.model.TransApplicationModel; +import baleine.client.game.model.TransItem; +import baleine.client.game.view.CardShape; +import baleine.client.game.view.TransApplicationView; +import javafx.collections.SetChangeListener; +import javafx.stage.FileChooser; +import javafx.stage.FileChooser.ExtensionFilter; +import javafx.stage.Stage; + +public class TransApplicationController { + /** + * Main application view + */ + private TransApplicationView mainView; + + /** + * Application model + */ + private TransApplicationModel model; + + /** + * Class constructor + * + * @param view : application view + */ + public TransApplicationController(TransApplicationView view) { + mainView = view; + + model = new TransApplicationModel(); + + initViewActions(); + initModelBiding(); + } + + /** + * Actions mapping of all components in the view + */ + private void initViewActions() { + mainView.openButton.setOnAction(evt -> actionOpenFile()); + } + + /** + * Model change listener + */ + private void initModelBiding() { + // DeÌfinition de la fonction de reÌponse + SetChangeListener<TransItem> f; + f = change -> { + if (change.wasRemoved()) { + mainView.cardsTilePane.getChildren().clear(); + } + if (change.wasAdded()) { + mainView.cardsTilePane.getChildren().add(new CardShape(change.getElementAdded())); + } + }; + // Installation de la fonction + model.transItemsSet.addListener(f); + } + + /** + * Method called on openButton click + */ + private void actionOpenFile() { + FileChooser fileChooser = new FileChooser(); + fileChooser.getExtensionFilters().add(new ExtensionFilter("Text file", "*.txt")); + fileChooser.setInitialDirectory(new File(System.getProperty("user.dir") + "/src/td2/transFiles")); + + File f = fileChooser.showOpenDialog(new Stage()); + if (f != null) { + model.parse(f); + } + } +} diff --git a/src/baleine/client/game/model/TransApplicationModel.java b/src/baleine/client/game/model/TransApplicationModel.java new file mode 100644 index 0000000..754eed2 --- /dev/null +++ b/src/baleine/client/game/model/TransApplicationModel.java @@ -0,0 +1,40 @@ +package baleine.client.game.model; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableSet; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +public class TransApplicationModel { + + public ObservableSet<TransItem> transItemsSet; + + public TransApplicationModel() { + transItemsSet = FXCollections.observableSet(); + } + + /** + * Parsing of the specified file + * + * @param f + */ + public void parse(File f) { + transItemsSet.clear(); + try { + List<String> lines = Files.readAllLines(Paths.get(f.getAbsolutePath())); + + for (String l : lines) { + String[] content = l.replace(" ", "").split("="); + transItemsSet.add(new TransItem(content[0], content[1])); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/src/baleine/client/game/model/TransItem.java b/src/baleine/client/game/model/TransItem.java new file mode 100644 index 0000000..ef40206 --- /dev/null +++ b/src/baleine/client/game/model/TransItem.java @@ -0,0 +1,27 @@ +package baleine.client.game.model; + +public class TransItem { + private String word; + private String translation; + + /** + * Constructor using a word and its translation + * + * @param w : word + * @param t : word's translation + */ + public TransItem(String w, String t) { + word = w; + translation = t; + } + + // Getters + public final String getWord() { + return word; + } + + public final String getTranslation() { + return translation; + } + +} diff --git a/src/baleine/client/game/view/CardShape.java b/src/baleine/client/game/view/CardShape.java new file mode 100644 index 0000000..4121218 --- /dev/null +++ b/src/baleine/client/game/view/CardShape.java @@ -0,0 +1,75 @@ +package baleine.client.game.view; + +import baleine.client.game.model.TransItem; +import javafx.scene.layout.StackPane; +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; +import javafx.scene.text.Text; + +public class CardShape extends StackPane { + private TransItem relatedItem; + private boolean isTranslated; + + private Text currentText; + private Rectangle rect; + + private static final Color REGULAR_COLOR = Color.BURLYWOOD; + private static final Color SECONDARY_COLOR = Color.CORNFLOWERBLUE; + + /** + * Constructor + * + * @param item : related TransItem + */ + public CardShape(TransItem item) { + relatedItem = item; + isTranslated = false; // default value + + initHmi(); + new CardController().bind(); + } + + /** + * HMI initialization + */ + private void initHmi() { + rect = new Rectangle(147, 60); + rect.setFill(Color.BURLYWOOD); + rect.setStroke(Color.WHITESMOKE); + rect.setStrokeWidth(3); + + currentText = new Text(relatedItem.getWord()); + + getChildren().addAll(rect, currentText); + } + + /** + * Changes the displayed text + */ + private void switchToTranslation() { + isTranslated = !isTranslated; + currentText.setText(isTranslated ? relatedItem.getTranslation() : relatedItem.getWord()); + + // Change color + if (rect.getFill().equals(REGULAR_COLOR)) { + rect.setFill(SECONDARY_COLOR); + } else { + rect.setFill(REGULAR_COLOR); + } + } + + /** + * CardShape controller + * + * @author thomas + */ + private class CardController { + /** + * Binds the clic on the card to the language switch + */ + private void bind() { + currentText.setOnMouseClicked(evt -> switchToTranslation()); + rect.setOnMouseClicked(evt -> switchToTranslation()); + } + } +} diff --git a/src/baleine/client/game/view/TransApplicationView.java b/src/baleine/client/game/view/TransApplicationView.java new file mode 100644 index 0000000..cfc15a4 --- /dev/null +++ b/src/baleine/client/game/view/TransApplicationView.java @@ -0,0 +1,47 @@ +package baleine.client.game.view; + +import javafx.scene.control.Button; +import javafx.scene.control.ToolBar; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.TilePane; + +/** + * Main application view + */ +public class TransApplicationView extends BorderPane { + + public Button openButton; + + public TilePane cardsTilePane; + + /** + * Main application view constructor + */ + public TransApplicationView() { + super(); + + initToolBar(); + + initTilePane(); + } + + /** + * Application toolbar initialization, places the toolbar at the top + */ + private void initToolBar() { + openButton = new Button("Ouvrir"); + + ToolBar bar = new ToolBar(openButton); + + setTop(bar); + } + + /** + * Application cards panel + */ + private void initTilePane() { + cardsTilePane = new TilePane(); + setCenter(cardsTilePane); + } + +} diff --git a/src/baleine/client/main/controller/TransApplicationController.java b/src/baleine/client/main/controller/TransApplicationController.java new file mode 100644 index 0000000..097ea40 --- /dev/null +++ b/src/baleine/client/main/controller/TransApplicationController.java @@ -0,0 +1,77 @@ +package baleine.client.main.controller; + +import baleine.client.game.model.TransApplicationModel; +import baleine.client.game.model.TransItem; +import baleine.client.game.view.CardShape; +import baleine.client.game.view.TransApplicationView; +import javafx.collections.SetChangeListener; +import javafx.stage.FileChooser; +import javafx.stage.FileChooser.ExtensionFilter; +import javafx.stage.Stage; + +import java.io.File; + +public class TransApplicationController { + /** + * Main application view + */ + private TransApplicationView mainView; + + /** + * Application model + */ + private TransApplicationModel model; + + /** + * Class constructor + * + * @param view : application view + */ + public TransApplicationController(TransApplicationView view) { + mainView = view; + + model = new TransApplicationModel(); + + initViewActions(); + initModelBiding(); + } + + /** + * Actions mapping of all components in the view + */ + private void initViewActions() { + mainView.openButton.setOnAction(evt -> actionOpenFile()); + } + + /** + * Model change listener + */ + private void initModelBiding() { + // DeÌfinition de la fonction de reÌponse + SetChangeListener<TransItem> f; + f = change -> { + if (change.wasRemoved()) { + mainView.cardsTilePane.getChildren().clear(); + } + if (change.wasAdded()) { + mainView.cardsTilePane.getChildren().add(new CardShape(change.getElementAdded())); + } + }; + // Installation de la fonction + model.transItemsSet.addListener(f); + } + + /** + * Method called on openButton click + */ + private void actionOpenFile() { + FileChooser fileChooser = new FileChooser(); + fileChooser.getExtensionFilters().add(new ExtensionFilter("Text file", "*.txt")); + fileChooser.setInitialDirectory(new File(System.getProperty("user.dir") + "/src/td2/transFiles")); + + File f = fileChooser.showOpenDialog(new Stage()); + if (f != null) { + model.parse(f); + } + } +} diff --git a/src/baleine/client/main/model/TransApplicationModel.java b/src/baleine/client/main/model/TransApplicationModel.java new file mode 100644 index 0000000..94d654b --- /dev/null +++ b/src/baleine/client/main/model/TransApplicationModel.java @@ -0,0 +1,40 @@ +package baleine.client.main.model; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableSet; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +public class TransApplicationModel { + + public ObservableSet<TransItem> transItemsSet; + + public TransApplicationModel() { + transItemsSet = FXCollections.observableSet(); + } + + /** + * Parsing of the specified file + * + * @param f + */ + public void parse(File f) { + transItemsSet.clear(); + try { + List<String> lines = Files.readAllLines(Paths.get(f.getAbsolutePath())); + + for (String l : lines) { + String[] content = l.replace(" ", "").split("="); + transItemsSet.add(new TransItem(content[0], content[1])); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/src/baleine/client/main/model/TransItem.java b/src/baleine/client/main/model/TransItem.java new file mode 100644 index 0000000..cef27a1 --- /dev/null +++ b/src/baleine/client/main/model/TransItem.java @@ -0,0 +1,27 @@ +package baleine.client.main.model; + +public class TransItem { + private String word; + private String translation; + + /** + * Constructor using a word and its translation + * + * @param w : word + * @param t : word's translation + */ + public TransItem(String w, String t) { + word = w; + translation = t; + } + + // Getters + public final String getWord() { + return word; + } + + public final String getTranslation() { + return translation; + } + +} diff --git a/src/baleine/client/main/view/CardShape.java b/src/baleine/client/main/view/CardShape.java new file mode 100644 index 0000000..46a2669 --- /dev/null +++ b/src/baleine/client/main/view/CardShape.java @@ -0,0 +1,75 @@ +package baleine.client.main.view; + +import baleine.client.main.model.TransItem; +import javafx.scene.layout.StackPane; +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; +import javafx.scene.text.Text; + +public class CardShape extends StackPane { + private TransItem relatedItem; + private boolean isTranslated; + + private Text currentText; + private Rectangle rect; + + private static final Color REGULAR_COLOR = Color.BURLYWOOD; + private static final Color SECONDARY_COLOR = Color.CORNFLOWERBLUE; + + /** + * Constructor + * + * @param item : related TransItem + */ + public CardShape(TransItem item) { + relatedItem = item; + isTranslated = false; // default value + + initHmi(); + new CardController().bind(); + } + + /** + * HMI initialization + */ + private void initHmi() { + rect = new Rectangle(147, 60); + rect.setFill(Color.BURLYWOOD); + rect.setStroke(Color.WHITESMOKE); + rect.setStrokeWidth(3); + + currentText = new Text(relatedItem.getWord()); + + getChildren().addAll(rect, currentText); + } + + /** + * Changes the displayed text + */ + private void switchToTranslation() { + isTranslated = !isTranslated; + currentText.setText(isTranslated ? relatedItem.getTranslation() : relatedItem.getWord()); + + // Change color + if (rect.getFill().equals(REGULAR_COLOR)) { + rect.setFill(SECONDARY_COLOR); + } else { + rect.setFill(REGULAR_COLOR); + } + } + + /** + * CardShape controller + * + * @author thomas + */ + private class CardController { + /** + * Binds the clic on the card to the language switch + */ + private void bind() { + currentText.setOnMouseClicked(evt -> switchToTranslation()); + rect.setOnMouseClicked(evt -> switchToTranslation()); + } + } +} diff --git a/src/baleine/client/main/view/TransApplicationView.java b/src/baleine/client/main/view/TransApplicationView.java new file mode 100644 index 0000000..e1d369d --- /dev/null +++ b/src/baleine/client/main/view/TransApplicationView.java @@ -0,0 +1,47 @@ +package baleine.client.main.view; + +import javafx.scene.control.Button; +import javafx.scene.control.ToolBar; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.TilePane; + +/** + * Main application view + */ +public class TransApplicationView extends BorderPane { + + public Button openButton; + + public TilePane cardsTilePane; + + /** + * Main application view constructor + */ + public TransApplicationView() { + super(); + + initToolBar(); + + initTilePane(); + } + + /** + * Application toolbar initialization, places the toolbar at the top + */ + private void initToolBar() { + openButton = new Button("Ouvrir"); + + ToolBar bar = new ToolBar(openButton); + + setTop(bar); + } + + /** + * Application cards panel + */ + private void initTilePane() { + cardsTilePane = new TilePane(); + setCenter(cardsTilePane); + } + +} diff --git a/src/baleine/common/dataModel/UserHeavy.java b/src/baleine/common/dataModel/UserHeavy.java index ee65f09..aa06924 100644 --- a/src/baleine/common/dataModel/UserHeavy.java +++ b/src/baleine/common/dataModel/UserHeavy.java @@ -1,5 +1,7 @@ package baleine.common.dataModel; +import java.util.List; + public class UserHeavy extends UserMeta { String password; String serverAddress; -- GitLab