Skip to content

Commit

Permalink
Adapt dictionary help lists to push non-storable dictionaries in the end
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
marcboulle committed Dec 16, 2024
1 parent d7c707d commit 201cee1
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 20 deletions.
2 changes: 1 addition & 1 deletion CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"cacheVariables": {
"MPI": "ON",
"TESTING": "ON",
"BUILD_JARS": "OFF",
"BUILD_JARS": "ON",
"BUILD_LEX_YACC": "OFF",
"GENERATE_VIEWS": "OFF",
"C11": "ON"
Expand Down
5 changes: 3 additions & 2 deletions src/Learning/KWLearningProblem/KWLearningProblemView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
70 changes: 68 additions & 2 deletions src/Learning/KWUserInterface/KWClassManagementActionView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/Learning/KWUserInterface/KWClassManagementActionView.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
2 changes: 2 additions & 0 deletions src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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++)
{
Expand Down
2 changes: 2 additions & 0 deletions src/Learning/KWUserInterface/KWDataTableSorterView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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++)
{
Expand Down
22 changes: 18 additions & 4 deletions src/Learning/KWUserInterface/KWDatabaseTransferView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ void KWDatabaseTransferView::Open()
{
KWClass* kwcClass;
ALString sClassNames;
ALString sNonStorableClassNames;
const int nMaxTotalShownLineNumber = 12;
int nMaxInputNativeRelationAttributeNumber;
int nMaxOutputNativeRelationAttributeNumber;
Expand All @@ -167,17 +168,26 @@ 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++)
{
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())
Expand All @@ -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);
Expand Down
5 changes: 3 additions & 2 deletions src/Learning/MODL_Coclustering/CCLearningProblemView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 4 additions & 6 deletions src/Norm/NormGUI/src/normGUI/engine/GUIObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> items = new Vector<String>();
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
Expand Down

0 comments on commit 201cee1

Please sign in to comment.