From 2894b77f86ac83f2a61f14e70808473c2d6ab469 Mon Sep 17 00:00:00 2001
From: stephane <stephane.dervaux@inrae.fr>
Date: Wed, 13 Nov 2024 15:38:32 +0100
Subject: [PATCH] =?UTF-8?q?ajout=20de=20fonction=20permettant=20la=20sauve?=
 =?UTF-8?q?garde=20&=20restauration=20de=20l'=C3=A9tat=20de=20l'arbre=20?=
 =?UTF-8?q?=3D>=20passage=20de=20refresh=20de=20l'arbre=20=C3=A0=20reconst?=
 =?UTF-8?q?ruction=20compl=C3=A9te=20pour=20=C3=A9vit=C3=A9=20le=20soucis?=
 =?UTF-8?q?=20de=20graph=20pas=20=C3=A0=20jour?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../utils/RecursiveTreeItem.java              | 30 +++++++++++++++++++
 .../ontoView/OntologyOverviewController.java  | 15 ++++++++--
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java b/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java
index 32a2e7fe..a9e88ca0 100644
--- a/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java
+++ b/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java
@@ -28,6 +28,7 @@ import javafx.util.Callback;
 
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 public class RecursiveTreeItem<T> extends TreeItem<T> {
@@ -38,6 +39,35 @@ public class RecursiveTreeItem<T> extends TreeItem<T> {
 
     private OntologyOverviewController controller;
 
+    // Méthode récursive pour obtenir le chemin d'un TreeItem
+    public static String getPath(TreeItem<?> item) {
+        if (item.getParent() == null) {
+            return "/"; // Retourne la racine
+        }
+        int index = item.getParent().getChildren().indexOf(item);
+        return getPath(item.getParent()) + index + "/";
+    }
+
+    // Méthode pour sauvegarder l'état d'ouverture des nœuds en fonction de leur chemin
+    public static void saveExpandedState(TreeItem<?> item, Map<String, Boolean> expandedStates) {
+        if(item == null) return;
+        expandedStates.put(RecursiveTreeItem.getPath(item), item.isExpanded());
+        for (TreeItem<?> child : item.getChildren()) {
+            saveExpandedState(child, expandedStates);
+        }
+    }
+
+    // Méthode pour restaurer l'état d'ouverture des nœuds en fonction de leur chemin
+    public static void restoreExpandedState(TreeItem<?> item, Map<String, Boolean> expandedStates) {
+        Boolean isExpanded = expandedStates.get(RecursiveTreeItem.getPath(item));
+        if (isExpanded != null) {
+            item.setExpanded(isExpanded);
+        }
+        for (TreeItem<?> child : item.getChildren()) {
+            restoreExpandedState(child, expandedStates);
+        }
+    }
+
     private Comparator<TreeItem<? extends T>> comparator = (o1, o2) -> {
         if(o1.getValue() instanceof DataNode && o2.getValue() instanceof DataNode) {
             DataNode do1 = ((DataNode) o1.getValue());
diff --git a/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java b/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java
index 827d62cf..9d1f2776 100644
--- a/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java
+++ b/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java
@@ -581,12 +581,22 @@ TableView<SimpleStringProperty> tableClose;
     }
 
     public void refreshTree(){
-        vocabTree.refresh();
+        rebuildTree(false, false);
     }
 
 
     public void rebuildTree(boolean rebuildConstraint) {
+        rebuildTree(rebuildConstraint, false);
+    }
+    public void rebuildTree(boolean rebuildConstraint, boolean resetState) {
+        // Sauvegarde de l'état des nœuds ouverts
+        Map<String, Boolean> expandedStates = new HashMap<>();
+        if(!resetState) {
+            RecursiveTreeItem.saveExpandedState(rootItem, expandedStates);
+        }
         rootItem = new RecursiveTreeItem<>(currentOntology.getRootNode(), VocabConcept::getGraphic, VocabConcept::getSubNodeInScheme, this);
+        // Restauration de l'état des nœuds ouverts
+        RecursiveTreeItem.restoreExpandedState(rootItem, expandedStates);
         setTree(rootItem);
         if(rebuildConstraint) {
             currentOntology.rebuildConstraints();
@@ -680,7 +690,7 @@ TableView<SimpleStringProperty> tableClose;
                         MainApp.getOntologyControler().setIsOnMainScheme(true);
 
                         MainApp.updateConceptScheme();
-                        rebuildTree(false);
+                        rebuildTree(false, true);
 
                         try {
                             MutablePair<String, Date> versionDate = CloudConnector.getDavVersion(currentOntology);
@@ -1016,7 +1026,6 @@ TableView<SimpleStringProperty> tableClose;
             labelChemin.setText(sb.toString());
 
 
-            MainApp.logger.debug("node :" + currentNode + " selected");
             ObservableList<VocabNodeWLang> print = FXCollections.observableArrayList();
 
             for(String l : VocabConcept.listLang) {
-- 
GitLab