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() {
+		// Définition de la fonction de ré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() {
+		// Définition de la fonction de ré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