From db999af79b0dd5944163f712d21812a56c55bc1e Mon Sep 17 00:00:00 2001
From: arnaudlabourel <arnaud.labourel@univ-amu.fr>
Date: Wed, 22 Sep 2021 07:34:42 +0200
Subject: [PATCH] first gui version (non-functional)

---
 build.gradle                                  |   8 +-
 .../java/controller/RootLayoutController.java |  20 +++
 src/main/java/main/MainApp.java               |  46 ++++++
 src/main/java/model/Grid.java                 |  50 ++++++
 src/main/java/model/GridIterator.java         |  30 ++++
 src/main/resources/view/DarkTheme.css         | 142 ++++++++++++++++++
 src/main/resources/view/RootLayout.fxml       |  19 +++
 7 files changed, 311 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/controller/RootLayoutController.java
 create mode 100644 src/main/java/main/MainApp.java
 create mode 100644 src/main/java/model/Grid.java
 create mode 100644 src/main/java/model/GridIterator.java
 create mode 100644 src/main/resources/view/DarkTheme.css
 create mode 100644 src/main/resources/view/RootLayout.fxml

diff --git a/build.gradle b/build.gradle
index 178b0ec..8231943 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,9 +13,9 @@ repositories {
 }
 
 dependencies {
-    testImplementation('org.junit.jupiter:junit-jupiter-api:5.7.2',
-            'org.assertj:assertj-core:3.11.1')
-    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2'
+    testImplementation('org.junit.jupiter:junit-jupiter-api:5.8.0',
+            'org.assertj:assertj-core:3.20.2')
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.0'
 }
 
 test {
@@ -23,5 +23,5 @@ test {
 }
 
 application {
-    mainClassName = "viewer.MainAppLauncher"
+    mainClassName = "main.MainApp"
 }
\ No newline at end of file
diff --git a/src/main/java/controller/RootLayoutController.java b/src/main/java/controller/RootLayoutController.java
new file mode 100644
index 0000000..992247b
--- /dev/null
+++ b/src/main/java/controller/RootLayoutController.java
@@ -0,0 +1,20 @@
+package controller;
+
+import javafx.fxml.FXML;
+import javafx.scene.layout.GridPane;
+import main.MainApp;
+
+public class RootLayoutController {
+  @FXML
+  GridPane gridPane;
+  private MainApp mainApp;
+
+  /**
+   * Is called by the main application to give a reference back to itself.
+   *
+   * @param mainApp
+   */
+  public void setMainApp(MainApp mainApp) {
+    this.mainApp = mainApp;
+  }
+}
diff --git a/src/main/java/main/MainApp.java b/src/main/java/main/MainApp.java
new file mode 100644
index 0000000..07282eb
--- /dev/null
+++ b/src/main/java/main/MainApp.java
@@ -0,0 +1,46 @@
+package main;
+
+import controller.RootLayoutController;
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Scene;
+
+import javafx.scene.layout.BorderPane;
+import javafx.stage.Stage;
+
+import java.io.IOException;
+
+public class MainApp extends Application {
+  private Stage primaryStage;
+  private BorderPane rootLayout;
+
+  public void start(Stage primaryStage) {
+    this.primaryStage = primaryStage;
+    this.primaryStage.setTitle("AddressApp");
+    initRootLayout();
+  }
+
+  /**
+   * Initializes the root layout and tries to load the last opened
+   * person file.
+   */
+  public void initRootLayout() {
+    try {
+      // Load root layout from fxml file.
+      FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/RootLayout.fxml"));
+      rootLayout = loader.load();
+
+      // Show the scene containing the root layout.
+      Scene scene = new Scene(rootLayout);
+      primaryStage.setScene(scene);
+
+      // Give the controller access to the main app.
+      RootLayoutController controller = loader.getController();
+      controller.setMainApp(this);
+
+      primaryStage.show();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/model/Grid.java b/src/main/java/model/Grid.java
new file mode 100644
index 0000000..0705e69
--- /dev/null
+++ b/src/main/java/model/Grid.java
@@ -0,0 +1,50 @@
+package model;
+
+import java.util.Iterator;
+
+public class Grid<T> implements Iterable<T> {
+  private final int numberOfRows;
+  private final int numberOfColumns;
+  private final T[][] squares;
+
+  /**
+   * Creates a new {@code Grid} instance given the number of rows and columns.
+   *
+   * @param numberOfRows    the number of rows
+   * @param numberOfColumns the number of columns
+   * @throws IllegalArgumentException if {@code numberOfRows} or {@code numberOfColumns} are
+   *                                  less than or equal to 0
+   */
+  public Grid(int numberOfRows, int numberOfColumns) {
+    this.numberOfRows = numberOfRows;
+    this.numberOfColumns = numberOfColumns;
+    this.squares = allocateMatrix();
+  }
+
+  private T[][] allocateMatrix() {
+    return (T[][]) new Object[getNumberOfRows()][getNumberOfColumns()];
+  }
+
+
+  /**
+   * Returns an iterator over elements of type {@code T}.
+   *
+   * @return an Iterator.
+   */
+  @Override
+  public Iterator<T> iterator() {
+    return new GridIterator<>(this);
+  }
+
+  public T getSquare(int rowIndex, int columnIndex) {
+    return squares[rowIndex][columnIndex];
+  }
+
+  public int getNumberOfRows() {
+    return numberOfRows;
+  }
+
+  public int getNumberOfColumns() {
+    return numberOfColumns;
+  }
+}
diff --git a/src/main/java/model/GridIterator.java b/src/main/java/model/GridIterator.java
new file mode 100644
index 0000000..6fd5510
--- /dev/null
+++ b/src/main/java/model/GridIterator.java
@@ -0,0 +1,30 @@
+package model;
+
+import java.util.Iterator;
+
+public class GridIterator<T> implements Iterator<T> {
+  private int rowIndex;
+  private int columnIndex;
+  private final Grid<T> grid;
+
+  GridIterator(Grid grid) {
+    this.rowIndex = 0;
+    this.columnIndex = 0;
+    this.grid = grid;
+  }
+
+  @Override
+  public boolean hasNext() {
+    return columnIndex < grid.getNumberOfColumns() && rowIndex < grid.getNumberOfRows();
+  }
+
+  @Override
+  public T next() {
+    final T result = grid.getSquare(rowIndex, columnIndex);
+    columnIndex = (columnIndex +1) % grid.getNumberOfColumns();
+    if(columnIndex == 0){
+      rowIndex++;
+    }
+    return result;
+  }
+}
diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css
new file mode 100644
index 0000000..46b78aa
--- /dev/null
+++ b/src/main/resources/view/DarkTheme.css
@@ -0,0 +1,142 @@
+.background {
+    -fx-background-color: #1d1d1d;
+}
+
+.label {
+    -fx-font-size: 11pt;
+    -fx-font-family: "Segoe UI Semibold";
+    -fx-text-fill: white;
+    -fx-opacity: 0.6;
+}
+
+.label-bright {
+    -fx-font-size: 11pt;
+    -fx-font-family: "Segoe UI Semibold";
+    -fx-text-fill: white;
+    -fx-opacity: 1;
+}
+
+.label-header {
+    -fx-font-size: 32pt;
+    -fx-font-family: "Segoe UI Light";
+    -fx-text-fill: white;
+    -fx-opacity: 1;
+}
+
+.table-view {
+    -fx-base: #1d1d1d;
+    -fx-control-inner-background: #1d1d1d;
+    -fx-background-color: #1d1d1d;
+    -fx-table-cell-border-color: transparent;
+    -fx-table-header-border-color: transparent;
+    -fx-padding: 5;
+}
+
+.table-view .column-header-background {
+    -fx-background-color: transparent;
+}
+
+.table-view .column-header, .table-view .filler {
+    -fx-border-width: 0 0 1 0;
+    -fx-background-color: transparent;
+    -fx-border-color: 
+        transparent
+        transparent
+        derive(-fx-base, 80%) 
+        transparent;
+    -fx-border-insets: 0 10 1 0;
+}
+
+.table-view .column-header .label {
+    -fx-font-size: 20pt;
+    -fx-font-family: "Segoe UI Light";
+    -fx-text-fill: white;
+    -fx-alignment: center-left;
+    -fx-opacity: 1;
+}
+
+.table-view:focused .table-row-cell:filled:focused:selected {
+    -fx-background-color: -fx-focus-color;
+}
+
+.split-pane:horizontal > .split-pane-divider {
+    -fx-border-color: transparent #1d1d1d transparent #1d1d1d;
+    -fx-background-color: transparent, derive(#1d1d1d,20%);
+}
+
+.split-pane {
+    -fx-padding: 1 0 0 0;
+}
+
+.menu-bar {
+    -fx-background-color: derive(#1d1d1d,20%);
+}
+
+.context-menu {
+    -fx-background-color: derive(#1d1d1d,50%);
+}
+
+.menu-bar .label {
+    -fx-font-size: 14pt;
+    -fx-font-family: "Segoe UI Light";
+    -fx-text-fill: white;
+    -fx-opacity: 0.9;
+}
+
+.menu .left-container {
+    -fx-background-color: black;
+}
+
+.text-field {
+    -fx-font-size: 12pt;
+    -fx-font-family: "Segoe UI Semibold";
+}
+
+/* 
+ * Metro style Push Button
+ * Author: Pedro Duque Vieira
+ * http://pixelduke.wordpress.com/2012/10/23/jmetro-windows-8-controls-on-java/
+ */
+.button {
+    -fx-padding: 5 22 5 22;   
+    -fx-border-color: #e2e2e2;
+    -fx-border-width: 2;
+    -fx-background-radius: 0;
+    -fx-background-color: #1d1d1d;
+    -fx-font-family: "Segoe UI", Helvetica, Arial, sans-serif;
+    -fx-font-size: 11pt;
+    -fx-text-fill: #d8d8d8;
+    -fx-background-insets: 0 0 0 0, 0, 1, 2;
+}
+
+.button:hover {
+    -fx-background-color: #3a3a3a;
+}
+
+.button:pressed, .button:default:hover:pressed {
+  -fx-background-color: white;
+  -fx-text-fill: #1d1d1d;
+}
+
+.button:focused {
+    -fx-border-color: white, white;
+    -fx-border-width: 1, 1;
+    -fx-border-style: solid;
+    -fx-border-radius: 0, 0;
+    -fx-border-insets: 1 1 1 1, 0;
+}
+
+.button:disabled, .button:default:disabled {
+    -fx-opacity: 0.4;
+    -fx-background-color: #1d1d1d;
+    -fx-text-fill: white;
+}
+
+.button:default {
+    -fx-background-color: -fx-focus-color;
+    -fx-text-fill: #ffffff;
+}
+
+.button:default:hover {
+    -fx-background-color: derive(-fx-focus-color,30%);
+}
\ No newline at end of file
diff --git a/src/main/resources/view/RootLayout.fxml b/src/main/resources/view/RootLayout.fxml
new file mode 100644
index 0000000..8ac5b6f
--- /dev/null
+++ b/src/main/resources/view/RootLayout.fxml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.scene.layout.*?>
+
+
+<BorderPane prefHeight="620.0"
+            prefWidth="620.0"
+            stylesheets="@DarkTheme.css"
+            xmlns="http://javafx.com/javafx"
+            xmlns:fx="http://javafx.com/fxml"
+            fx:controller="controller.RootLayoutController">
+    <top>
+        <GridPane xmlns="http://javafx.com/javafx"
+            xmlns:fx="http://javafx.com/fxml"
+                  fx:id="gridPane"
+            prefHeight="600.0" prefWidth="600.0">
+        </GridPane>
+    </top>
+</BorderPane>
\ No newline at end of file
-- 
GitLab