From 368e7874e8f5aa3903719f1a710c2f1b38b16f66 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hallvard=20Tr=C3=A6tteberg?= <hal@ntnu.no>
Date: Fri, 25 Sep 2020 14:23:28 +0000
Subject: [PATCH] Font awesome support

---
 todolist/fxui/pom.xml                         | 44 ++++++++++++++++++-
 .../main/java/todolist/ui/TodoController.java | 31 +++++++++++++
 .../src/main/resources/todolist/ui/Todo.fxml  | 21 ++++++++-
 3 files changed, 93 insertions(+), 3 deletions(-)

diff --git a/todolist/fxui/pom.xml b/todolist/fxui/pom.xml
index 6b10cf6..d09fb28 100644
--- a/todolist/fxui/pom.xml
+++ b/todolist/fxui/pom.xml
@@ -11,6 +11,15 @@
 
     <artifactId>fxui</artifactId>
 
+    <!-- 
+        <repositories>
+            <repository>
+                <id>bintray</id>
+                <url>https://dl.bintray.com/jerady/maven</url>
+            </repository>
+        </repositories>
+    -->
+
     <dependencies>
 
         <dependency>
@@ -37,6 +46,21 @@
             <version>14.0.2</version>
         </dependency>
 
+        <!-- 
+            <dependency>
+                <groupId>de.jensd</groupId>
+                <artifactId>fontawesomefx-fontawesome</artifactId>
+                <version>4.7.0-11</version>
+            </dependency>
+        -->
+
+        <!-- https://mvnrepository.com/artifact/de.jensd/fontawesomefx-controls -->
+        <dependency>
+            <groupId>de.jensd</groupId>
+            <artifactId>fontawesomefx-fontawesome</artifactId>
+            <version>4.7.0-9.1.2</version>
+        </dependency>
+
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
@@ -66,6 +90,24 @@
 		</dependency>
     </dependencies>
 
+    <profiles>
+        <profile>
+            <id>fontawesome</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.openjfx</groupId>
+                        <artifactId>javafx-maven-plugin</artifactId>
+                        <version>0.0.4</version>
+                        <configuration>                    
+                            <mainClass>de.jensd.fx.glyphs.fontawesome.demo.FontAwesomeIconsDemoApp</mainClass>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
     <build>
         <plugins>
             <plugin>
@@ -79,7 +121,7 @@
                 <groupId>org.openjfx</groupId>
                 <artifactId>javafx-maven-plugin</artifactId>
                 <version>0.0.4</version>
-                <configuration>
+                <configuration>                    
                     <options>
                         <!-- 
                             <option>dash dash enable-preview</option>
diff --git a/todolist/fxui/src/main/java/todolist/ui/TodoController.java b/todolist/fxui/src/main/java/todolist/ui/TodoController.java
index d11928a..5223f83 100644
--- a/todolist/fxui/src/main/java/todolist/ui/TodoController.java
+++ b/todolist/fxui/src/main/java/todolist/ui/TodoController.java
@@ -15,8 +15,11 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.function.Predicate;
 import javafx.fxml.FXML;
+import javafx.scene.Node;
 import javafx.scene.control.Button;
+import javafx.scene.control.ListCell;
 import javafx.scene.control.ListView;
 import javafx.scene.control.TextField;
 import todolist.core.TodoItem;
@@ -136,6 +139,34 @@ public class TodoController {
     for (Button button : selectionButtons) {
       button.setDisable(disable);
     }
+    double rowLayoutY = getRowLayoutY(todoListView, listCell -> isSelected(todoListView, listCell), 0);
+    System.out.println(rowLayoutY);
+  }
+
+  private boolean isSelected(ListView<?> listView, ListCell<?> listCell) {
+    return isSelected(listView, listCell.getItem());
+  }
+  private boolean isSelected(ListView<?> listView, Object item) {
+    return todoListView.getSelectionModel().getSelectedItems().contains(item);
+  }
+
+  @SuppressWarnings("unchecked")
+  private <T> double getRowLayoutY(ListView<T> listView, Predicate<ListCell<T>> test, int num) {
+    for (Node child : listView.lookupAll(".list-cell")) {
+      if (child instanceof ListCell) {
+        ListCell<T> listCell = (ListCell<T>) child;
+        if (test.test(listCell) && num-- == 0) {
+          double dy = 0;
+          Node node = listCell;
+          while (node != todoListView) {
+            dy += node.getLayoutY();
+            node = node.getParent();
+          }
+          return dy;
+        }
+      }
+    }
+    return -1;
   }
 
   @FXML
diff --git a/todolist/fxui/src/main/resources/todolist/ui/Todo.fxml b/todolist/fxui/src/main/resources/todolist/ui/Todo.fxml
index 4cd262f..489121f 100644
--- a/todolist/fxui/src/main/resources/todolist/ui/Todo.fxml
+++ b/todolist/fxui/src/main/resources/todolist/ui/Todo.fxml
@@ -4,21 +4,38 @@
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.VBox?>
 <?import javafx.scene.control.Button?>
+<?import javafx.scene.control.Tooltip?>
 <?import javafx.scene.control.TextField?>
 <?import javafx.scene.control.ListView?>
 
+<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
+
 <VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="todolist.ui.TodoController">
     <fx:define>
         <String fx:id="userTodoListPath" fx:value="todolist.json"/>
         <String fx:id="sampleTodoListResource" fx:value="sample-todolist.json"/>
     </fx:define>
     <HBox>
-        <Button fx:id="newTodoItemButton" text="New Item" onAction="#handleNewTodoItemAction"/>
+        <Button fx:id="newTodoItemButton" onAction="#handleNewTodoItemAction">
+            <graphic>
+                <FontAwesomeIconView glyphName="PLUS" size="18px" glyphStyle="-fx-fill: green" />
+            </graphic>
+            <tooltip>
+                <Tooltip text="New Item"/>
+            </tooltip>
+        </Button>
         <TextField fx:id="newTodoItemText" promptText="Skriv inn tekst her" onAction="#handleNewTodoItemAction"/>
     </HBox>
     <ListView fx:id="todoListView">
     </ListView>
     <HBox>
-        <Button fx:id="deleteTodoItemButton" text="Delete Item" onAction="#handleDeleteItemAction"/>
+        <Button fx:id="deleteTodoItemButton" onAction="#handleDeleteItemAction">
+            <graphic>
+                <FontAwesomeIconView glyphName="TIMES_CIRCLE_ALT" size="18px" glyphStyle="-fx-fill: red" />
+            </graphic>
+            <tooltip>
+                <Tooltip text="Delete Item"/>
+            </tooltip>
+        </Button>
     </HBox>
 </VBox>
-- 
GitLab