From 02d29a978b9a49f2c7d23d5e845eeda23be362ba Mon Sep 17 00:00:00 2001
From: Numbtus <matias.mennecart.etu@univ-lille.fr>
Date: Fri, 29 Nov 2024 21:06:14 +0100
Subject: [PATCH] Fix exception while trying to write text into double or
 integer spinner

---
 .../controller/AddDataController.java         | 63 ++++++++++++++++---
 .../classification/model/PointFactory.java    |  1 +
 2 files changed, 54 insertions(+), 10 deletions(-)

diff --git a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java
index 4d38f1f..b59ca6d 100644
--- a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java
+++ b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java
@@ -12,11 +12,11 @@ import javafx.stage.Stage;
 
 import java.io.IOException;
 import java.lang.reflect.Array;
+import java.text.ParseException;
 import java.time.temporal.Temporal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.function.UnaryOperator;
+import java.util.regex.Pattern;
 
 /**
  * Controlleur pour le FXML add-data-stage, pour ajouter une nouvelle donnée
@@ -67,6 +67,22 @@ public class AddDataController {
                                         0.5
                                 );
                         doubleSpinner.setValueFactory(valueFactory);
+
+                        TextField editor = doubleSpinner.getEditor();
+
+                        // On bloque la siasi de texte autre que des chiffres dans le spinner
+                        Pattern validDoublePattern = Pattern.compile("-?\\d*(\\.\\d*)?");
+                        UnaryOperator<TextFormatter.Change> filter = change -> {
+                            String newText = change.getControlNewText();
+                            if (validDoublePattern.matcher(newText).matches()) {
+                                return change;
+                            }
+                            return null;
+                        };
+
+                        TextFormatter<String> textFormatter = new TextFormatter<>(filter);
+                        editor.setTextFormatter(textFormatter);
+
                         hbox.getChildren().add(doubleSpinner);
                         components.add(doubleSpinner);
                     }
@@ -81,6 +97,22 @@ public class AddDataController {
                                         1
                                 );
                         integerSpinner.setValueFactory(valueFactory);
+
+                        TextField editor = integerSpinner.getEditor();
+
+                        Pattern validIntegerPattern = Pattern.compile("-?\\d*");
+                        UnaryOperator<TextFormatter.Change> filter = change -> {
+                            String newText = change.getControlNewText();
+                            if (validIntegerPattern.matcher(newText).matches()) {
+                                return change;
+                            }
+                            return null;
+                        };
+
+                        // Appliquer le TextFormatter au TextField du Spinner
+                        TextFormatter<String> textFormatter = new TextFormatter<>(filter);
+                        editor.setTextFormatter(textFormatter);
+
                         hbox.getChildren().add(integerSpinner);
                         components.add(integerSpinner);
                     }
@@ -130,16 +162,27 @@ public class AddDataController {
                 return null;
             }).toArray();
 
+            System.out.println("State in");
+
             System.out.println(Arrays.toString(values));
             ClassificationModel.getClassificationModel().ajouterDonnee(values);
-        }catch (IllegalArgumentException e){
-            Alert alert = new Alert(Alert.AlertType.ERROR);
-            alert.setTitle("Erreur");
-            alert.setHeaderText(null);
-            alert.setContentText(e.getMessage());
-            alert.showAndWait();
+        }catch (NumberFormatException e) {
+            openErrorStage(e, "Erreur, les données ne respecte pas le format specifié");
+        }catch (IllegalArgumentException e) {
+            openErrorStage(e);
         }
         stage.close();
     }
+    private void openErrorStage(Exception e, String message) {
+        Alert alert = new Alert(Alert.AlertType.ERROR);
+        alert.setTitle("Erreur - " + e.getClass());
+        alert.setHeaderText(null);
+        alert.setContentText(message);
+        alert.showAndWait();
+    }
+
+    private void openErrorStage(Exception e) {
+        openErrorStage(e, e.getMessage());
+    }
 
 }
diff --git a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java
index 63a1bc9..8ad7826 100644
--- a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java
+++ b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java
@@ -1,5 +1,6 @@
 package fr.univlille.sae.classification.model;
 
+import java.text.ParseException;
 import java.util.Arrays;
 
 /**
-- 
GitLab