From 201cee1c7729323ae48e25679825bb6cb1e33afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Mon, 16 Dec 2024 16:40:00 +0100 Subject: [PATCH] Adapt dictionary help lists to push non-storable dictionaries in the end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avec la possibilité d'avoir des dictionnaire avec ou sans cle, on peut avoir des dictionnaires stockable ou non. Au moment du choix d'un dictionnaire d'analyse, dans la liste d'aide, on met en tete les dictionnaires storable, puis une ligne blanche, puis les dictionnaires non storable. On les garde tous dans la liste d'aide, pour des raisons didactiques, et pour ne pas "inquieter" les utilisateurs en cas d'absence de dictionnaires. Note: il aurait ete preferable de mettre ces nomde dictionnaire en gris dans les liste d'aide, mais le rapport cout/benefice de cette option est tres defavorable (necessite de modifier significativement le moteur de la GUI dans Norm) Impacts principaux - KWClassManagementActionView - mise en place d'une liste d'aide rafraichie dynamiquement, dediee aux noms dictionnaire, selon la specification - RefreshHelpLists: mise a jour de la liste, appelee dans EventRefresh - KWLearningProblemView::KWLearningProblemView: parametrage de la liste d'aide avec le service de KWClassManagementActionView - CCLearningProblemView::CCLearningProblemView: parametrage de la liste d'aide avec le service de KWClassManagementActionView - KWDatabaseTransferView::Open: variante similaire, mais avec liste d'aide locale (pas de rafaichssement necessaire) - KWDataTableKeyExtractorView::Open: commentaire expliquant pourquoi on garde cette fois tous les dictionnaires - KWDataTableSorterView::Open: commentaire expliquant pourquoi on garde cette fois tous les dictionnaires - norGUI: bibliotheque java norm.jar - GUIObject::getParametersAsArray: correction pour prendre en compte les items vide dans une liste de parametres - GUIStringElementHelpedComboBox: correction pour autoriser les doublons (deux fois la valeur vide, par exemple) --- CMakePresets.json | 2 +- .../KWLearningProblemView.cpp | 5 +- .../KWClassManagementActionView.cpp | 70 ++++++++++++++++++- .../KWClassManagementActionView.h | 3 + .../KWDataTableKeyExtractorView.cpp | 2 + .../KWUserInterface/KWDataTableSorterView.cpp | 2 + .../KWDatabaseTransferView.cpp | 22 ++++-- .../CCLearningProblemView.cpp | 5 +- .../NormGUI/src/normGUI/engine/GUIObject.java | 10 ++- .../GUIStringElementHelpedComboBox.java | 5 +- 10 files changed, 106 insertions(+), 20 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index e1ddb701f..5560440cb 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -14,7 +14,7 @@ "cacheVariables": { "MPI": "ON", "TESTING": "ON", - "BUILD_JARS": "OFF", + "BUILD_JARS": "ON", "BUILD_LEX_YACC": "OFF", "GENERATE_VIEWS": "OFF", "C11": "ON" diff --git a/src/Learning/KWLearningProblem/KWLearningProblemView.cpp b/src/Learning/KWLearningProblem/KWLearningProblemView.cpp index 16336a3fc..36b1249f4 100644 --- a/src/Learning/KWLearningProblem/KWLearningProblemView.cpp +++ b/src/Learning/KWLearningProblem/KWLearningProblemView.cpp @@ -69,9 +69,10 @@ KWLearningProblemView::KWLearningProblemView() // On utilise le meme nom que dans l'onglet ClassManagement trainDatabaseView->GetFieldAt("ClassName")->SetLabel("Analysis dictionary"); - // On parametre la liste des dictionnaires en fonction des dictionnaire charges dans ClassManagement + // On parametre la liste des dictionnaires en fonction de la liste d'aide + // sur les noms de dictionnaires, geree dans ClassManagementView trainDatabaseView->GetFieldAt("ClassName")->SetStyle("HelpedComboBox"); - trainDatabaseView->GetFieldAt("ClassName")->SetParameters("ClassManagement.Classes:ClassName"); + trainDatabaseView->GetFieldAt("ClassName")->SetParameters("ClassManagement.ClassNames:Name"); // On indique que le champ de parametrage du dictionnaire declenche une action de rafraichissement // de l'interface immediatement apres une mise a jour, pour pouvoir rafraichir les mapping des databases diff --git a/src/Learning/KWUserInterface/KWClassManagementActionView.cpp b/src/Learning/KWUserInterface/KWClassManagementActionView.cpp index aedf0f7cb..860809e84 100644 --- a/src/Learning/KWUserInterface/KWClassManagementActionView.cpp +++ b/src/Learning/KWUserInterface/KWClassManagementActionView.cpp @@ -9,16 +9,24 @@ KWClassManagementActionView::KWClassManagementActionView() { + UIList* classNameHelpList; + // Titre SetIdentifier("KWClassManagementAction"); SetLabel("Dictionary management"); - // Ajout d'une donnee liste pour obtenir de l'aide sur les dictionnaires charges en memoire - // depuis les autres panneaux de l'interface + // Liste des dictionnaires charges en memoire, par defaut non visible AddListField("Classes", "Dictionaries", new KWClassSpecArrayView); GetFieldAt("Classes")->SetEditable(false); GetFieldAt("Classes")->SetVisible(false); + // Creation d'une liste cachee des nom des dictionnaires, permettant de service de liste d'aide + // depuis les autres panneaux de l'interface + classNameHelpList = new UIList; + classNameHelpList->AddStringField("Name", "Name", ""); + AddListField("ClassNames", "Dictionaries", classNameHelpList); + classNameHelpList->SetVisible(false); + // Declaration des actions AddAction("OpenFile", "Open...", (ActionMethod)(&KWClassManagementActionView::OpenFile)); AddAction("CloseFile", "Close", (ActionMethod)(&KWClassManagementActionView::CloseFile)); @@ -85,6 +93,9 @@ void KWClassManagementActionView::EventRefresh(Object* object) // Reactualisation des specs de classes GetClassManagement()->RefreshClassSpecs(); + + // Rafraichissement des listes d'aide + RefreshHelpLists(); } const ALString KWClassManagementActionView::GetClassLabel() const @@ -300,6 +311,61 @@ void KWClassManagementActionView::SetObject(Object* object) UIObjectView::SetObject(object); } +void KWClassManagementActionView::RefreshHelpLists() +{ + UIList* classNameHelpList; + KWClass* kwcClass; + StringVector svClassNames; + StringVector svNonStorableClassNames; + int i; + + assert(objValue != NULL); + + // Liste des dictionnaires charges en memoire, par defaut non visible + classNameHelpList = cast(UIList*, GetFieldAt("ClassNames")); + + // On commence vider la liste + classNameHelpList->RemoveAllItems(); + + // Collecte de classe stockables ou non a partir du domaine courant, + for (i = 0; i < KWClassDomain::GetCurrentDomain()->GetClassNumber(); i++) + { + kwcClass = KWClassDomain::GetCurrentDomain()->GetClassAt(i); + if (kwcClass->IsKeyBasedStorable()) + svClassNames.Add(kwcClass->GetName()); + else + svNonStorableClassNames.Add(kwcClass->GetName()); + } + + // Parametrage des classes stockables en premier, avec ligne blanche prealable + // comme pour le style "EditableComboBox" utilise dans les boites de dialogues + // ou la liste des dictionnaire est connue a l'avance + if (svClassNames.GetSize() > 0) + { + classNameHelpList->AddItem(); + for (i = 0; i < svClassNames.GetSize(); i++) + { + // Ajout du nom de la classe dans la liste d'aide a la saisie + classNameHelpList->AddItem(); + classNameHelpList->SetStringValueAt("Name", svClassNames.GetAt(i)); + } + } + + // Parametrage des classes non stockables ensuite, avec ligne blanche de separation + if (svNonStorableClassNames.GetSize() > 0) + { + assert(svClassNames.GetSize() > 0); + assert(classNameHelpList->GetItemNumber() >= 2); + classNameHelpList->AddItem(); + for (i = 0; i < svNonStorableClassNames.GetSize(); i++) + { + // Ajout du nom de la classe dans la liste d'aide a la saisie + classNameHelpList->AddItem(); + classNameHelpList->SetStringValueAt("Name", svNonStorableClassNames.GetAt(i)); + } + } +} + KWClassManagement* KWClassManagementActionView::GetClassManagement() { require(objValue != NULL); diff --git a/src/Learning/KWUserInterface/KWClassManagementActionView.h b/src/Learning/KWUserInterface/KWClassManagementActionView.h index 808f5ffbd..f04efc7b0 100644 --- a/src/Learning/KWUserInterface/KWClassManagementActionView.h +++ b/src/Learning/KWUserInterface/KWClassManagementActionView.h @@ -75,6 +75,9 @@ class KWClassManagementActionView : public UIObjectView //////////////////////////////////////////////////////// ///// Implementation protected: + // Rafraichissement des listes d'aide + void RefreshHelpLists(); + // Acces a l'objet sous son bon type KWClassManagement* GetClassManagement(); diff --git a/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp b/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp index a6d155813..87e2ee1de 100644 --- a/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp +++ b/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp @@ -120,6 +120,8 @@ void KWDataTableKeyExtractorView::Open() // Parametrage du champ de saisie des dictionnaires en style ComboBox, // avec la liste des dictionnaires en cours + // Les dictionnaires sont ici utilises uniquement en tant que format d'un fichier de donnees. + // Leurs caracteristiques multi-tables sont ignorees. SetStringValueAt("ClassName", sInputClassName); for (i = 0; i < KWClassDomain::GetCurrentDomain()->GetClassNumber(); i++) { diff --git a/src/Learning/KWUserInterface/KWDataTableSorterView.cpp b/src/Learning/KWUserInterface/KWDataTableSorterView.cpp index f57a788b8..78327b566 100644 --- a/src/Learning/KWUserInterface/KWDataTableSorterView.cpp +++ b/src/Learning/KWUserInterface/KWDataTableSorterView.cpp @@ -154,6 +154,8 @@ void KWDataTableSorterView::Open() // Parametrage du champ de saisie des dictionnaires en style ComboBox, // avec la liste des dictionnaires en cours + // Les dictionnaires sont ici utilises uniquement en tant que format d'un fichier de donnees. + // Leurs caracteristiques multi-tables sont ignorees. SetStringValueAt("ClassName", sSortClassName); for (i = 0; i < KWClassDomain::GetCurrentDomain()->GetClassNumber(); i++) { diff --git a/src/Learning/KWUserInterface/KWDatabaseTransferView.cpp b/src/Learning/KWUserInterface/KWDatabaseTransferView.cpp index 3cc716e08..cfcbd3ab9 100644 --- a/src/Learning/KWUserInterface/KWDatabaseTransferView.cpp +++ b/src/Learning/KWUserInterface/KWDatabaseTransferView.cpp @@ -157,6 +157,7 @@ void KWDatabaseTransferView::Open() { KWClass* kwcClass; ALString sClassNames; + ALString sNonStorableClassNames; const int nMaxTotalShownLineNumber = 12; int nMaxInputNativeRelationAttributeNumber; int nMaxOutputNativeRelationAttributeNumber; @@ -167,7 +168,7 @@ void KWDatabaseTransferView::Open() AddWarning("No available dictionary"); // Collecte de la liste des dictionnaires disponibles et de stats - // sur la taille de leur mapping + // sur la taille de leur mapping, selon leur caractere stockable ou non nMaxInputNativeRelationAttributeNumber = 0; nMaxOutputNativeRelationAttributeNumber = 0; for (i = 0; i < KWClassDomain::GetCurrentDomain()->GetClassNumber(); i++) @@ -175,9 +176,18 @@ void KWDatabaseTransferView::Open() kwcClass = KWClassDomain::GetCurrentDomain()->GetClassAt(i); // Ajout du nom de la classe dans la liste d'aide a la saisie - if (i > 0) - sClassNames += "\n"; - sClassNames += kwcClass->GetName(); + if (kwcClass->IsKeyBasedStorable()) + { + if (sClassNames.GetLength() > 0) + sClassNames += "\n"; + sClassNames += kwcClass->GetName(); + } + else + { + if (sNonStorableClassNames.GetLength() > 0) + sNonStorableClassNames += "\n"; + sNonStorableClassNames += kwcClass->GetName(); + } // Mise a jour des nombre max de mappings if (targetDatabaseView->IsMultiTableTechnology()) @@ -191,6 +201,10 @@ void KWDatabaseTransferView::Open() } } + // Les dictionnaires non stockables sont ranges en derniers, apres une ligne blanche + if (sNonStorableClassNames.GetLength() > 0) + sClassNames += "\n\n" + sNonStorableClassNames; + // Parametrage du champ de saisie des dictionnaires en style ComboBox, // avec la liste des dictionnaires en cours SetStringValueAt("ClassName", sClassName); diff --git a/src/Learning/MODL_Coclustering/CCLearningProblemView.cpp b/src/Learning/MODL_Coclustering/CCLearningProblemView.cpp index 0088f87ab..6e935ac59 100644 --- a/src/Learning/MODL_Coclustering/CCLearningProblemView.cpp +++ b/src/Learning/MODL_Coclustering/CCLearningProblemView.cpp @@ -52,9 +52,10 @@ CCLearningProblemView::CCLearningProblemView() // On utilise le meme nom que dans l'onglet ClassManagement databaseView->GetFieldAt("ClassName")->SetLabel("Analysis dictionary"); - // On parametre la liste des dictionnaires en fonction des dictionnaire charges dans ClassManagement + // On parametre la liste des dictionnaires en fonction de la liste d'aide + // sur les noms de dictionnaires, geree dans ClassManagementView databaseView->GetFieldAt("ClassName")->SetStyle("HelpedComboBox"); - databaseView->GetFieldAt("ClassName")->SetParameters("ClassManagement.Classes:ClassName"); + databaseView->GetFieldAt("ClassName")->SetParameters("ClassManagement.ClassNames:Name"); // On indique que le champ de parametrage du dictionnaire declenche une action de rafraichissement // de l'interface immediatement apres une mise a jour, pour pouvoir rafraichir les mapping des databases diff --git a/src/Norm/NormGUI/src/normGUI/engine/GUIObject.java b/src/Norm/NormGUI/src/normGUI/engine/GUIObject.java index a1116e569..9cdc4dcdb 100644 --- a/src/Norm/NormGUI/src/normGUI/engine/GUIObject.java +++ b/src/Norm/NormGUI/src/normGUI/engine/GUIObject.java @@ -412,12 +412,10 @@ static public ImageIcon getImageIcon(String path) public String[] getParametersAsArray() { if (sParameters != null) { - // On ajoute un blanc en fin des parametres pour forcer la methode split a cree - // un dernier token - String[] params = (sParameters + " ").split("\n"); - // On supprime le blan du dernier token - String lastToken = params[params.length - 1]; - params[params.length - 1] = lastToken.substring(0, lastToken.length() - 1); + // Le parametre -1 du split permet de forcer la methode split a creer + // autant d'items dans le tableau qu'il y a de separateurs (plus un) + // Sinon, on ne peut avoir d'item vide au milieu ou en fin de liste par exemple + String[] params = sParameters.split("\n", -1); return params; } else return null; diff --git a/src/Norm/NormGUI/src/normGUI/widgets/stringWidgets/GUIStringElementHelpedComboBox.java b/src/Norm/NormGUI/src/normGUI/widgets/stringWidgets/GUIStringElementHelpedComboBox.java index 5e1cf43ce..ecd1273c1 100644 --- a/src/Norm/NormGUI/src/normGUI/widgets/stringWidgets/GUIStringElementHelpedComboBox.java +++ b/src/Norm/NormGUI/src/normGUI/widgets/stringWidgets/GUIStringElementHelpedComboBox.java @@ -251,14 +251,13 @@ private void refreshComboBox(JComboBox comboBox) } catch (Exception ex) { } - // On remplit un tableau avec les items sans doublons + // On remplit un tableau avec les items Vector items = new Vector(); String s; for (int i = 0; i < sourceList.getItemNumber(); i++) { sourceList.setCurrentItemIndex(i); s = sourceElement.getValueIn(sourceList).toString(); - if (!items.contains(s)) - items.add(s); + items.add(s); } // On memorise le contenu de l'editeur avant de supprimer les items