diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java b/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java index 32a2e7fe0675c19e3d1c8b16bab9955d8a8bbaf9..a9e88ca005dfd3f37a9ca81f07b774c8cb516d88 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 827d62cf315ac5299a768d483788a75ba7f1549b..9d1f277633a56001c15cfa39fb0375463d77b9c6 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) {