Salome HOME
CCAR: correction mineures
[tools/eficas.git] / Editeur / composimp.py
index 837fa925a84d902d715d93c3eb7ad6338ea005fa..b8aaba32ad871531964cc9838fbfa297d15ca137 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF composimp Editeur  DATE 05/09/2001   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 # Modules Python
 import string,types,os
 # ======================================================================
 # Modules Python
 import string,types,os
@@ -48,34 +60,72 @@ class newSIMPPanel(panels.OngletPanel):
       nb.setnaturalsize()
       
 # ----------------------------------------------------------------------------------------
       nb.setnaturalsize()
       
 # ----------------------------------------------------------------------------------------
-#   Méthodes utlisées pour l'affectation de la valeur donnée par l'utilisateur
+#   Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
 #    au mot-clé courant
 # ----------------------------------------------------------------------------------------
 
 #    au mot-clé courant
 # ----------------------------------------------------------------------------------------
 
-  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+  def reset_old_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
       """
           Enregistre  val comme valeur de self.node.item.object SANS 
       """
           Enregistre  val comme valeur de self.node.item.object SANS 
-          faire de test de validité
+          faire de test de validité ni ré-évaluer l'ancienne valeur
+          permet de rester avec des valeurs non entrees et de ne pas 
+          ré-évaluer des entiers par exemple
       """
       if self.parent.modified == 'n' : self.parent.init_modif()
       """
       if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != None:
-          valeur =name
-      else :
-          valeur= self.entry.get()
-          self.entry.delete(0,END)
-      self.node.item.set_valeur(valeur,evaluation='non')
+      self.node.item.set_valeur(name)
       self.parent.appli.affiche_infos(mess)
       if self.node.item.get_position()=='global':
       self.parent.appli.affiche_infos(mess)
       if self.node.item.get_position()=='global':
-          self.node.etape.verif_all()
+           self.node.etape.verif_all()
       elif self.node.item.get_position()=='global_jdc':
       elif self.node.item.get_position()=='global_jdc':
-          self.node.racine.verif_all()
+           self.node.racine.verif_all()
       else :
       else :
-          self.node.parent.verif()
+           self.node.parent.verif()
       self.node.update()
       self.node.update()
-      if self.node.item.isvalid():
-          self.node.parent.select()
+
+  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+          Enregistre  val comme valeur de self.node.item.object  
+         en evaluant l item et en le validant 
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != None:
+          valeur = name
+          validite = 1
+      else :
+          valeurentree= self.entry.get()
+          self.entry.delete(0,END)
+          if valeurentree == '': valeurentree=None
+          valeur,validite=self.node.item.eval_valeur(valeurentree)
+          if not validite :
+               valeur= self.entry.get()
+                commentaire = "impossible d'évaluer : %s " %`valeurentree`
+               self.parent.appli.affiche_infos(commentaire)
+               
+      if validite : 
+         if self.node.item.is_list() :
+            validite=self.node.item.valide_liste_complete(valeur)
+            commentaire=self.node.item.info_erreur_liste()
+         else :
+           validite=self.node.item.valide_item(valeur)
+            commentaire=self.node.item.info_erreur_item()
+      if validite :
+          self.node.item.set_valeur(valeur)
+          self.parent.appli.affiche_infos(mess)
+          if self.node.item.get_position()=='global':
+              self.node.etape.verif_all()
+          elif self.node.item.get_position()=='global_jdc':
+              self.node.racine.verif_all()
+          else :
+              self.node.parent.verif()
+          self.node.update()
+          if self.node.item.isvalid():
+              self.node.parent.select()
+      else :
+          self.parent.appli.affiche_infos(commentaire)
+
 # ----------------------------------------------------------------------------------------
 # ----------------------------------------------------------------------------------------
-#   Méthodes utlisées pour la manipulation des items dans les listes de choix
+#   Méthodes utilisées pour la manipulation des items dans les listes de choix
 # ----------------------------------------------------------------------------------------
   def selectValeur(self,name):
       self.selected_valeur = name
 # ----------------------------------------------------------------------------------------
   def selectValeur(self,name):
       self.selected_valeur = name
@@ -88,30 +138,35 @@ class newSIMPPanel(panels.OngletPanel):
       Supprime la valeur selectionnée de la liste des valeurs et la rajoute
       à la liste des choix possibles
       """
       Supprime la valeur selectionnée de la liste des valeurs et la rajoute
       à la liste des choix possibles
       """
-      liste_valeurs = self.Liste_valeurs.get_liste()
-      liste_valeurs.remove(self.selected_valeur)
-      liste_choix = self.node.item.get_definition().into
-      liste_choix = substract_list(liste_choix,liste_valeurs)
-      self.Liste_valeurs.put_liste(liste_valeurs)
-      self.Liste_choix.put_liste(liste_choix)
-      self.selected_valeur = None
+      if hasattr(self,'selected_valeur') :
+         if ( self.selected_valeur != None and self.selected_valeur != ''):
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            liste_valeurs.remove(self.selected_valeur)
+            self.Liste_valeurs.put_liste(liste_valeurs)
+            listeActuelle=self.Liste_valeurs.get_liste()
+            liste_choix=self.node.item.get_liste_possible(listeActuelle)
+            self.Liste_choix.put_liste(liste_choix)
+            self.selected_valeur = None
 
   def add_choix(self,name=None):
       """
       Ajoute le choix selectionné à la liste des valeurs et le retire
       de la liste des choix possibles
       """
 
   def add_choix(self,name=None):
       """
       Ajoute le choix selectionné à la liste des valeurs et le retire
       de la liste des choix possibles
       """
-      min,max = self.node.item.GetMinMax()
-      liste_valeurs = self.Liste_valeurs.get_liste()
-      if len(liste_valeurs) >= max :
-          self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
-          return
-      liste_valeurs.append(self.selected_choix)
-      liste_choix = self.Liste_choix.get_liste()
-      liste_choix.remove(self.selected_choix)
-      self.Liste_valeurs.put_liste(liste_valeurs)
-      self.Liste_choix.put_liste(liste_choix)
-      self.selected_choix = None
+      
+      if hasattr(self,'selected_choix') :
+         if (self.selected_choix != None and self.selected_choix != ''):
+            min,max = self.node.item.GetMinMax()
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            if len(liste_valeurs) >= max :
+                self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
+                return
+            liste_valeurs.append(self.selected_choix)
+            self.Liste_valeurs.put_liste(liste_valeurs)
+            listeActuelle=self.Liste_valeurs.get_liste()
+            liste_choix=self.node.item.get_liste_possible(listeActuelle)
+            self.Liste_choix.put_liste(liste_choix)
+            self.selected_choix = None
 
   def selectChoix(self,name):
       self.selected_choix = name
 
   def selectChoix(self,name):
       self.selected_choix = name
@@ -119,6 +174,12 @@ class newSIMPPanel(panels.OngletPanel):
   def deselectChoix(self,name):
       self.selectChoix = None
       
   def deselectChoix(self,name):
       self.selectChoix = None
       
+  def raisecmd(self,page):
+      try:
+         self.entry.focus()
+      except:
+         pass
+
 class SHELLPanel(newSIMPPanel):
   """
   Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
 class SHELLPanel(newSIMPPanel):
   """
   Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
@@ -172,7 +233,7 @@ class SHELLPanel(newSIMPPanel):
           valeur = val
       else:
           valeur = self.node.item.get_valeur()
           valeur = val
       else:
           valeur = self.node.item.get_valeur()
-      if valeur == None : return
+      if valeur == None  or valeur == '': return
       self.text.insert(END,valeur)
 
 class PLUSIEURS_Panel(newSIMPPanel):
       self.text.insert(END,valeur)
 
 class PLUSIEURS_Panel(newSIMPPanel):
@@ -185,7 +246,12 @@ class PLUSIEURS_Panel(newSIMPPanel):
       Méthode qui récupère la liste des valeurs donnée par l'utilisateur
       et l'affecte au mot-clé courant.
       """
       Méthode qui récupère la liste des valeurs donnée par l'utilisateur
       et l'affecte au mot-clé courant.
       """
-      l_valeurs = self.Liste_valeurs.get_liste()
+      l1_valeurs = self.Liste_valeurs.get_liste()
+      l_valeurs=[]
+      for  val in l1_valeurs :
+        if val != '' and val != None :
+           l_valeurs.append(val)
+    
       longueur = len(l_valeurs)
       if longueur < min or longueur > max :
           self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
       longueur = len(l_valeurs)
       if longueur < min or longueur > max :
           self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
@@ -196,10 +262,11 @@ class PLUSIEURS_Panel(newSIMPPanel):
          valeur = l_valeurs[0]
       else:
          valeur = None
          valeur = l_valeurs[0]
       else:
          valeur = None
+
       self.parent.appli.affiche_infos("Valeur acceptée")
       self.record_valeur(valeur)
       self.parent.appli.affiche_infos("Valeur acceptée")
       self.record_valeur(valeur)
-      if self.node.item.isvalid():
-          self.node.parent.select()
+      #if self.node.item.isvalid():
+      #    self.node.parent.select()
       # fermeture de la fenêtre de sélection
       if self.ajout_valeurs:
           self.ajout_valeurs.quit()
       # fermeture de la fenêtre de sélection
       if self.ajout_valeurs:
           self.ajout_valeurs.quit()
@@ -213,63 +280,67 @@ class PLUSIEURS_Panel(newSIMPPanel):
       if self.ajout_valeurs:
           self.ajout_valeurs.quit()
           
       if self.ajout_valeurs:
           self.ajout_valeurs.quit()
           
-  def traite_reel(self,valeur):
-      """
-      Cette fonction a pour but de rajouter le '.' en fin de chaîne pour un réel
-      ou de détecter si on fait référence à un concept produit par DEFI_VALEUR
-      ou un EVAL ...
-      """
-      valeur = string.strip(valeur)
-      liste_reels = self.node.item.get_sd_avant_du_bon_type()
-      if valeur in liste_reels:
-          return valeur
-      if len(valeur) >= 3 :
-          if valeur[0:4] == 'EVAL' :
-              # on a trouvé un EVAL --> on retourne directement la valeur
-              return valeur
-      if string.find(valeur,'.') == -1 :
-          # aucun '.' n'a été trouvé dans valeur --> on en rajoute un à la fin
-          return valeur+'.'
-      else:
-          return valeur
-        
-  def add_valeur_sans_into(self,name=None):
+  def add_valeur_sans_into(self,name=None,encorevalide=1):
       """
       Lit ce que l'utilisateur a saisi dans self.entry et cherche à
       l'évaluer :
       """
       Lit ce que l'utilisateur a saisi dans self.entry et cherche à
       l'évaluer :
-      - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
-      - sinon elle est refusée
+        - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
+        - sinon elle est refusée
+      encorevalide vaut 1 si le validateur trouve l item et la liste correctes
+                        0 si le validateur trouve la valeur de l item incorrecte
+                       -1 si le validateur trouve la liste incorrecte
       """
       """
-      min,max = self.node.item.GetMinMax()
+
+      commentaire="Valeur incorrecte : ajout à la liste refusé"
+      testvalide=1
+
+      # Lecture de la zone de saisie et evaluation si nécessaire
       if name != None :
       if name != None :
-          valeur = name
-      else:
-          valeur = self.get_valeur()
-      if self.node.item.wait_reel():
-          valeur = self.traite_reel(valeur)
-      if self.node.item.wait_geom():
-          val,test1 = valeur,1
+         valeur = name
       else:
       else:
-          val,test1 = self.node.item.object.eval_valeur(valeur)
-      if test1 :
-          test2 = self.node.item.object.verif_type(val)
-          if test2 :
-              liste_valeurs = self.Liste_valeurs.get_liste()
-              if len(liste_valeurs) >= max :
-                  self.parent.appli.affiche_infos("La liste a déjà atteint le nombre maximum d'éléments, ajout refusé")
-                  self.erase_valeur()
-                  return
-              liste_valeurs.append(val)
-              self.Liste_valeurs.put_liste(liste_valeurs)
-              self.erase_valeur()
-              self.parent.appli.affiche_infos("Nouvelle valeur acceptée")
-          else:
-              self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
-      else:
-          print "impossible d'évaluer %s" %val
-          self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
-      #if self.node.item.isvalid():
-      #    self.node.parent.select()
+         valeurentree = self.get_valeur()
+         if valeurentree == '': valeur=None
+         valeurentree,testvalide=self.node.item.eval_valeur(valeur)
+         if (not testvalide) :
+            commentaire = "impossible d'évaluer : %s " %`valeurentree`
+
+      # Pas de traitement des valeurs nulles ( a priori clic involontaire
+      if (valeur == None or valeur =="") :
+          commentaire = "Pas de saisie des valeurs nulles"
+          encorevalide = -2 
+          testtype=0
+      else :
+          testtype = self.node.item.object.verif_type(valeur)
+          if not testtype :
+            commentaire ="Type de la valeur incorrecte"
+            encorevalide=-2
+               
+      if (encorevalide ==0) :
+         commentaire=self.node.item.info_erreur_item()
+      if (encorevalide == -1) :
+         commentaire=self.node.item.info_erreur_liste()
+        # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
+         min,max = self.node.item.GetMinMax()
+         if len(self.Liste_valeurs.get_liste()) >= max : 
+            commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+
+      if testvalide and (encorevalide == 1):
+         min,max = self.node.item.GetMinMax()
+
+         if testtype :
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            if len(liste_valeurs) >= max :
+                commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+            else :
+               liste_valeurs.append(valeur)
+               self.Liste_valeurs.put_liste(liste_valeurs)
+               self.erase_valeur()
+               commentaire="Nouvelle valeur acceptée"
+         else :
+            commentaire ="Type de la valeur incorrecte"
+
+      #self.erase_valeur()
+      self.parent.appli.affiche_infos(commentaire)
 
   def sup_valeur_sans_into(self,name=None):
       """
 
   def sup_valeur_sans_into(self,name=None):
       """
@@ -282,7 +353,6 @@ class PLUSIEURS_Panel(newSIMPPanel):
           # la valeur sélectionnée n'est pas dans la liste
           return
       self.Liste_valeurs.put_liste(liste_valeurs)
           # la valeur sélectionnée n'est pas dans la liste
           return
       self.Liste_valeurs.put_liste(liste_valeurs)
-      #self.display_valeur('')
       self.display_valeur(self.selected_valeur)
       self.selected_valeur = None      
 
       self.display_valeur(self.selected_valeur)
       self.selected_valeur = None      
 
@@ -313,12 +383,17 @@ class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
       self.ajout_valeurs = None
       # On récupère la bulle d'aide du panneau, l'objet, min et max (cardinalité de la liste),
       # la liste des choix et la liste des valeurs
       self.ajout_valeurs = None
       # On récupère la bulle d'aide du panneau, l'objet, min et max (cardinalité de la liste),
       # la liste des choix et la liste des valeurs
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
       bulle_aide=self.get_bulle_aide()
       objet_mc = self.node.item.get_definition()
       min,max = self.node.item.GetMinMax()
       bulle_aide=self.get_bulle_aide()
       objet_mc = self.node.item.get_definition()
       min,max = self.node.item.GetMinMax()
-      l_choix=list(objet_mc.into)
-      l_choix.sort()
+      #l_choix=list(objet_mc.into)
       l_valeurs = self.node.item.GetListeValeurs()
       l_valeurs = self.node.item.GetListeValeurs()
+      l_choix= self.node.item.get_liste_possible(l_valeurs)
+      # reinitialisation de l_valeurs
+      l_valeurs = self.node.item.GetListeValeurs()
+
       # remplissage du panneau
       self.frame_valeurs = Frame(page)
       self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
       # remplissage du panneau
       self.frame_valeurs = Frame(page)
       self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
@@ -328,15 +403,19 @@ class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
       self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
       self.frame_boutons = Frame(page)
       self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.3,relheight=0.1)
       self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
       self.frame_boutons = Frame(page)
       self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.3,relheight=0.1)
+      self.frame_aide = Frame(page)
+      self.frame_aide.place(relx=0.1,rely=0.75,relwidth=0.9,relheight=0.1)
       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
                                  ("<Button-3>",self.deselectValeur),
                                  ("<Double-Button-1>",self.sup_valeur))
       liste_commandes_choix = (("<Button-1>",self.selectChoix),
                                ("<Button-3>",self.deselectChoix),
                                ("<Double-Button-1>",self.add_choix))
       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
                                  ("<Button-3>",self.deselectValeur),
                                  ("<Double-Button-1>",self.sup_valeur))
       liste_commandes_choix = (("<Button-1>",self.selectChoix),
                                ("<Button-3>",self.deselectChoix),
                                ("<Double-Button-1>",self.add_choix))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,
+                                      l_valeurs,liste_commandes = liste_commandes_valeurs,
                                       titre="Valeur(s) actuelle(s)")
                                       titre="Valeur(s) actuelle(s)")
-      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
+      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,
+                                    liste_commandes = liste_commandes_choix,
                                     titre= "Valeurs possibles")
       bouton_add = Button(self.frame_boutons_fleches,
                           #text="<--",
                                     titre= "Valeurs possibles")
       bouton_add = Button(self.frame_boutons_fleches,
                           #text="<--",
@@ -361,6 +440,38 @@ class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
       for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
       for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide,
+                        text = aide,
+                        justify='center',
+                        anchor='center',
+                       wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+      que saisit l'utilisateur
+      """
+      commentaire=""
+      mc = self.node.item.get_definition()
+      d_aides = { 'TXM' : 'chaînes de caractères',
+                  'R'   : 'réels',
+                  'I'   : 'entiers',
+                  'C'   : 'complexes'}
+      type = mc.type[0]
+      if not d_aides.has_key(type) : 
+        if mc.min == mc.max:
+           return str(mc.min)+" valeur(s) est(sont) attendue(s)"
+         else :
+           return "entrez entre "+str(mc.min)+" et "+str(mc.max)+" valeurs"
+      if mc.min == mc.max:
+           commentaire="Une liste de "+str(mc.min)+" "+d_aides[type]+" est attendue"
+      else :
+           commentaire="Entre "+str(mc.min)+" et "+str(mc.max)+" valeurs de type  "+d_aides[type]+" sont attendues"
+      aideval=self.node.item.aide()
+      commentaire=commentaire + "\n" + aideval
+      return commentaire
 
   def get_bulle_aide(self):
       """
 
   def get_bulle_aide(self):
       """
@@ -397,6 +508,7 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       aide = justify_text(texte=aide)
       min,max = self.node.item.GetMinMax()
       l_valeurs = self.node.item.GetListeValeurs()
       aide = justify_text(texte=aide)
       min,max = self.node.item.GetMinMax()
       l_valeurs = self.node.item.GetListeValeurs()
+
       # création des frames globales
       self.frame1 = Frame(page,relief='groove',bd=2)
       self.frame2 = Frame(page)
       # création des frames globales
       self.frame1 = Frame(page,relief='groove',bd=2)
       self.frame2 = Frame(page)
@@ -404,6 +516,7 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
       self.frame_right = Frame(self.frame1)
       self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
       self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
       self.frame_right = Frame(self.frame1)
       self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
       # création des frames internes
       self.frame_valeurs = Frame(self.frame1)
       self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
       # création des frames internes
       self.frame_valeurs = Frame(self.frame1)
       self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
@@ -419,26 +532,31 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
                  self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
                  self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
       # création des objets dans les frames
       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
                                  ("<Button-3>",self.deselectValeur),
                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
                                       titre="Valeur(s) actuelle(s)")
       # création des objets dans les frames
       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
                                  ("<Button-3>",self.deselectValeur),
                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
                                       titre="Valeur(s) actuelle(s)")
+
       # Création de l'entry ou de la liste des SD
       self.label = Label(self.frame_choix,text="Valeur :")
       # Création de l'entry ou de la liste des SD
       self.label = Label(self.frame_choix,text="Valeur :")
-      self.make_entry(frame = self.frame_choix,command = self.add_valeur_sans_into)
+      # PN : pour ajouter les validators
+      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
       self.label.place(relx=0.05,rely=0.5)
       self.label.place(relx=0.05,rely=0.5)
+
       # Création d'un bouton "Importer ..." sur le panel.
       bouton_valeurs_fichier = Button(self.frame_choix,
                                       text="Importer ...",
                                       command=self.select_in_file)
       bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
       self.ajout_valeurs = None
       # Création d'un bouton "Importer ..." sur le panel.
       bouton_valeurs_fichier = Button(self.frame_choix,
                                       text="Importer ...",
                                       command=self.select_in_file)
       bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
       self.ajout_valeurs = None
+
       # boutons Ajouter et Supprimer
       bouton_add = Button(self.frame_boutons_fleches,
                           image = images.get_image('arrow_left'),
       # boutons Ajouter et Supprimer
       bouton_add = Button(self.frame_boutons_fleches,
                           image = images.get_image('arrow_left'),
-                          command = self.add_valeur_sans_into)
+                          command = self.add_valeur_plusieurs_base)
       bouton_sup = Button(self.frame_boutons_fleches,
                           image = images.get_image('arrow_right'),
                           command = self.sup_valeur_sans_into)
       bouton_sup = Button(self.frame_boutons_fleches,
                           image = images.get_image('arrow_right'),
                           command = self.sup_valeur_sans_into)
@@ -463,6 +581,25 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       for but in (bouton_accepter,bouton_annuler):
           but.pack(side='left',padx=5)
 
       for but in (bouton_accepter,bouton_annuler):
           but.pack(side='left',padx=5)
 
+  def add_valeur_plusieurs_base(self,name=None):
+      if name != None :
+         valeur = name
+      else:
+         valeurentree = self.get_valeur()
+         if valeurentree == '': valeur=None
+         valeur,validite=self.node.item.eval_valeur(valeurentree)
+         if not validite :
+            commentaire = "impossible d'évaluer : %s " %`valeurentree`
+            self.parent.appli.affiche_infos(commentaire)
+            return
+
+      encorevalide=self.node.item.valide_item(valeur)
+      if encorevalide :
+         listecourante=self.Liste_valeurs.get_liste()
+         encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
+         if not encorevalide : encorevalide = -1
+      self.add_valeur_sans_into(valeur,encorevalide)
+    
   def select_in_file(self):
       """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
       nom_fichier = askopenfilename(title="Choix fichier :")
   def select_in_file(self):
       """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
       nom_fichier = askopenfilename(title="Choix fichier :")
@@ -502,6 +639,7 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
       que saisit l'utilisateur
       """
       Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
       que saisit l'utilisateur
       """
+      commentaire=""
       mc = self.node.item.get_definition()
       d_aides = { 'TXM' : 'chaînes de caractères',
                   'R'   : 'réels',
       mc = self.node.item.get_definition()
       d_aides = { 'TXM' : 'chaînes de caractères',
                   'R'   : 'réels',
@@ -510,9 +648,12 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       type = mc.type[0]
       if not d_aides.has_key(type) : return 'Type de base inconnu'
       if mc.min == mc.max:
       type = mc.type[0]
       if not d_aides.has_key(type) : return 'Type de base inconnu'
       if mc.min == mc.max:
-          return "Une liste de "+d_aides[type]+" chaînes de caractères est attendue"
+          commentaire="Une liste de "+d_aides[type]+" chaînes de caractères est attendue"
       else :
       else :
-          return "Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+          commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+aideval
+      return commentaire
 
   def make_entry(self,frame,command):
       """
 
   def make_entry(self,frame,command):
       """
@@ -587,7 +728,8 @@ class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
       liste_commandes_choix = (("<Button-1>",self.selectChoix),
                                ("<Button-3>",self.deselectChoix),
                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
       liste_commandes_choix = (("<Button-1>",self.selectChoix),
                                ("<Button-3>",self.deselectChoix),
-                               ("<Double-Button-1>",self.add_valeur_sans_into))
+      #                         ("<Double-Button-1>",self.add_valeur_sans_into))
+                               ("<Double-Button-1>",self.add_eval_valeur_sans_into))
       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
                                       titre="Valeur(s) actuelle(s)")
       self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
                                       titre="Valeur(s) actuelle(s)")
       self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
@@ -595,7 +737,8 @@ class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
       bouton_add = Button(self.frame_boutons_fleches,
                           #text="<--",
                           image = images.get_image('arrow_left'),
       bouton_add = Button(self.frame_boutons_fleches,
                           #text="<--",
                           image = images.get_image('arrow_left'),
-                          command = self.add_valeur_sans_into)
+      #                    command = self.add_valeur_sans_into)
+                          command = self.add_eval_valeur_sans_into)
       bouton_sup = Button(self.frame_boutons_fleches,
                           #text="-->",
                           image = images.get_image('arrow_right'),
       bouton_sup = Button(self.frame_boutons_fleches,
                           #text="-->",
                           image = images.get_image('arrow_right'),
@@ -615,6 +758,14 @@ class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
       for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
       for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+  
+  def add_eval_valeur_sans_into(self,valeurentree=None):
+      valeur,validite=self.node.item.eval_valeur(valeurentree)
+      if not validite :
+             commentaire = "impossible d'évaluer : %s " %`valeurentree`
+             self.parent.appli.affiche_infos(commentaire)
+             return
+      self.add_valeur_sans_into(valeur)
 
   def get_bulle_aide(self):
       """
 
   def get_bulle_aide(self):
       """
@@ -636,15 +787,20 @@ class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
       Retourne la phrase d'aide indiquant de quel type doivent être les
       valeurs que doit entrer l'utilisateur
       """
       Retourne la phrase d'aide indiquant de quel type doivent être les
       valeurs que doit entrer l'utilisateur
       """
+      commentaire=""
       mc = self.node.item.get_definition()
       type = mc.type[0].__name__  
       if len(mc.type)>1 :
           for typ in mc.type[1:] :
               type = type + ' ou '+typ.__name__
       if mc.min == mc.max:
       mc = self.node.item.get_definition()
       type = mc.type[0].__name__  
       if len(mc.type)>1 :
           for typ in mc.type[1:] :
               type = type + ' ou '+typ.__name__
       if mc.min == mc.max:
-        return "Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
+        commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
       else :
       else :
-        return "Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+        commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
     
   def sup_valeur(self,name=None):
       """
     
   def sup_valeur(self,name=None):
       """
@@ -702,13 +858,20 @@ class UNIQUE_Panel(newSIMPPanel):
       - si non, restaure l'ancienne valeur
       """
       if self.parent.modified == 'n' : self.parent.init_modif()
       - si non, restaure l'ancienne valeur
       """
       if self.parent.modified == 'n' : self.parent.init_modif()
-      valeur = self.get_valeur()
-      self.erase_valeur()
       anc_val = self.node.item.get_valeur()
       anc_val = self.node.item.get_valeur()
+      valeurentree = self.get_valeur()
+      self.erase_valeur()
+      valeur,validite=self.node.item.eval_valeur(valeurentree)
+      if not validite :
+             commentaire = "impossible d'évaluer : %s " %`valeurentree`
+             self.parent.appli.affiche_infos(commentaire)
+             return
+   
       test = self.node.item.set_valeur(valeur)
       test = self.node.item.set_valeur(valeur)
+       
       if not test :
           mess = "impossible d'évaluer : %s " %`valeur`
       if not test :
           mess = "impossible d'évaluer : %s " %`valeur`
-          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée : "+mess)
       elif self.node.item.isvalid() :
           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
          if self.node.item.get_position()=='global':
       elif self.node.item.isvalid() :
           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
          if self.node.item.get_position()=='global':
@@ -722,7 +885,7 @@ class UNIQUE_Panel(newSIMPPanel):
       else :
           cr = self.node.item.get_cr()
           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
       else :
           cr = self.node.item.get_cr()
           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.record_valeur(anc_val,mess=mess)
+          self.reset_old_valeur(anc_val,mess=mess)
 
 class UNIQUE_INTO_Panel(UNIQUE_Panel):
   """
 
 class UNIQUE_INTO_Panel(UNIQUE_Panel):
   """
@@ -741,10 +904,12 @@ class UNIQUE_INTO_Panel(UNIQUE_Panel):
       # remplissage du panel
       self.frame_valeur = Frame(page)
       self.frame_valeur.pack(fill='both',expand=1)
       # remplissage du panel
       self.frame_valeur = Frame(page)
       self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : 
+                              s.parent.appli.affiche_aide(e,a))
       self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
       self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      l_choix=list(objet_mc.into)
-      l_choix.sort()
+      #l_choix=list(objet_mc.into)
+      #l_choix.sort()
+      l_choix=self.node.item.get_liste_possible([])
       self.label = Label(self.frame_valeur,text='Choisir une valeur :')
       self.label.pack(side='top')
       self.frame = Frame(page)
       self.label = Label(self.frame_valeur,text='Choisir une valeur :')
       self.label.pack(side='top')
       self.frame = Frame(page)
@@ -752,7 +917,8 @@ class UNIQUE_INTO_Panel(UNIQUE_Panel):
       liste_commandes = (("<Button-1>",self.selectChoix),
                          ("<Button-3>",self.deselectChoix),
                          ("<Double-Button-1>",self.record_valeur))
       liste_commandes = (("<Button-1>",self.selectChoix),
                          ("<Button-3>",self.deselectChoix),
                          ("<Double-Button-1>",self.record_valeur))
-      self.Liste_choix = ListeChoix(self,self.frame,l_choix,liste_commandes = liste_commandes,
+      self.Liste_choix = ListeChoix(self,self.frame,l_choix,
+                                    liste_commandes = liste_commandes,
                                     titre="Valeurs possibles")
       self.Liste_choix.affiche_liste()
 
                                     titre="Valeurs possibles")
       self.Liste_choix.affiche_liste()
 
@@ -768,6 +934,37 @@ class UNIQUE_ASSD_Panel(UNIQUE_Panel):
   Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
   d'un type dérivé d'ASSD
   """
   Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
   d'un type dérivé d'ASSD
   """
+  def valid_valeur_automatique(self):
+      """
+         Réalise la validation d'un concept sans remonter dans le
+         node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
+         Identique à valid_valeur moins appel de self.node.parent.select()
+         On pourrait supposer que le seul concept présent est valide et donc ne pas
+         réaliser tous les tests de vérification.
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      valeur = self.get_valeur()
+      self.erase_valeur()
+      anc_val = self.node.item.get_valeur()
+      valeur,validite=self.node.item.eval_valeur_item(valeur)
+      test = self.node.item.set_valeur(valeur)
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          if self.node.item.get_position()=='global':
+              self.node.etape.verif_all()
+          elif self.node.item.get_position()=='global_jdc':
+              self.node.racine.verif_all()
+          else :
+              self.node.parent.verif()
+          self.node.update()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+
   def makeValeurPage(self,page):
       """
           Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une 
   def makeValeurPage(self,page):
       """
           Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une 
@@ -782,6 +979,12 @@ class UNIQUE_ASSD_Panel(UNIQUE_Panel):
       # Remplissage du panneau
       self.valeur_choisie = StringVar()
       self.valeur_choisie.set('')
       # Remplissage du panneau
       self.valeur_choisie = StringVar()
       self.valeur_choisie.set('')
+      min,max =  self.node.item.GetMinMax()
+      if (min == 1 and min == max and len(liste_noms_sd)==1):
+          if self.valeur_choisie.get() != liste_noms_sd[0]:
+            self.valeur_choisie.set(liste_noms_sd[0])
+             self.valid_valeur_automatique()
+        
       self.frame_valeur = Frame(page)
       self.frame_valeur.pack(fill='both',expand=1)
       self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
       self.frame_valeur = Frame(page)
       self.frame_valeur.pack(fill='both',expand=1)
       self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
@@ -815,7 +1018,11 @@ class UNIQUE_ASSD_Panel(UNIQUE_Panel):
       if len(mc.type)>1 :
           for typ in mc.type[1:] :
               type = type + ' ou '+typ.__name__
       if len(mc.type)>1 :
           for typ in mc.type[1:] :
               type = type + ' ou '+typ.__name__
-      return  "Un objet de type "+type+" est attendu"
+      commentaire="Un objet de type "+type+" est attendu"
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
     
   def select_valeur_from_list(self):
       """
     
   def select_valeur_from_list(self):
       """
@@ -846,7 +1053,7 @@ class UNIQUE_ASSD_Panel(UNIQUE_Panel):
       Affiche la valeur de l'objet pointé par self
       """
       valeur = self.node.item.get_valeur()
       Affiche la valeur de l'objet pointé par self
       """
       valeur = self.node.item.get_valeur()
-      if valeur == None : return # pas de valeur à afficher ...
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
       self.valeur_choisie.set(valeur.nom)
 
   def erase_valeur(self):
       self.valeur_choisie.set(valeur.nom)
 
   def erase_valeur(self):
@@ -941,7 +1148,7 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
       else :
           cr = self.node.item.get_cr()
           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
       else :
           cr = self.node.item.get_cr()
           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.record_valeur(anc_val,mess=mess)
+          self.reset_old_valeur(anc_val,mess=mess)
           return
       if self.node.item.get_position()=='global':
           self.node.etape.verif_all()
           return
       if self.node.item.get_position()=='global':
           self.node.etape.verif_all()
@@ -970,7 +1177,7 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
       else :
           cr = self.node.item.get_cr()
           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
       else :
           cr = self.node.item.get_cr()
           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.record_valeur(anc_val,mess=mess)
+          self.reset_old_valeur(anc_val,mess=mess)
           return
       if self.node.item.get_position()=='global':
           self.node.etape.verif_all()
           return
       if self.node.item.get_position()=='global':
           self.node.etape.verif_all()
@@ -996,12 +1203,15 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
           self.entry_co.focus()
       elif new_concept == 'NON':
           # On est passe de OUI à NON, on supprime la valeur
           self.entry_co.focus()
       elif new_concept == 'NON':
           # On est passe de OUI à NON, on supprime la valeur
-          self.node.item.delete_valeur_co()
-          self.record_valeur(name=None,mess="Suppression CO enregistrée")
-          self.label_co.place_forget()
-          self.entry_co.place_forget()
-          self.l_resu.place(relx=0.05,rely=0.7)
-          self.label_valeur.place(relx=0.45,rely=0.7)
+# PN correction de bug (on passe de non a non et cela supprime la valeur)
+# ajout du if de le ligne suivane
+          if self.node.item.is_CO():
+                self.node.item.delete_valeur_co()
+                self.record_valeur(name=None,mess="Suppression CO enregistrée")
+                self.label_co.place_forget()
+                self.entry_co.place_forget()
+                self.l_resu.place(relx=0.05,rely=0.7)
+                self.label_valeur.place(relx=0.45,rely=0.7)
           
   def display_valeur(self):
       """
           
   def display_valeur(self):
       """
@@ -1091,7 +1301,10 @@ class UNIQUE_BASE_Panel(UNIQUE_Panel):
                   'R'   : "Un réel est attendu",
                   'I'   : "Un entier est attendu"}
       type = mc.type[0]
                   'R'   : "Un réel est attendu",
                   'I'   : "Un entier est attendu"}
       type = mc.type[0]
-      return d_aides.get(type,"Type de base inconnu")
+      commentaire=d_aides.get(type,"Type de base inconnu")
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
 
   def get_bulle_aide(self):
       """
 
   def get_bulle_aide(self):
       """
@@ -1105,9 +1318,10 @@ class UNIQUE_BASE_Panel(UNIQUE_Panel):
       Affiche la valeur de l'objet pointé par self
       """
       valeur = self.node.item.get_valeur()
       Affiche la valeur de l'objet pointé par self
       """
       valeur = self.node.item.get_valeur()
-      if valeur == None : return # pas de valeur à afficher ...
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
       self.entry.delete(0,END)
       self.entry.insert(0,valeur)
       self.entry.delete(0,END)
       self.entry.insert(0,valeur)
+      self.entry.focus()
       
 class UNIQUE_COMP_Panel(UNIQUE_Panel):
   """
       
 class UNIQUE_COMP_Panel(UNIQUE_Panel):
   """
@@ -1149,6 +1363,21 @@ class UNIQUE_COMP_Panel(UNIQUE_Panel):
                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
                        justify='center')
       self.aide.place(relx=0.5,rely=0.7,anchor='n')
                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
                        justify='center')
       self.aide.place(relx=0.5,rely=0.7,anchor='n')
+      # affichage de la valeur du MCS
+      self.display_valeur()
+
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+      typ_cplx,x1,x2=valeur
+      self.entry1.delete(0,END)
+      self.entry2.delete(0,END)
+      self.typ_cplx.set(typ_cplx)
+      self.entry1.setentry(x1)
+      self.entry2.setentry(x2)
 
   def get_bulle_aide(self):
       """
 
   def get_bulle_aide(self):
       """
@@ -1164,7 +1393,10 @@ class UNIQUE_COMP_Panel(UNIQUE_Panel):
       Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
       le mot-clé simple courant
       """
       Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
       le mot-clé simple courant
       """
-      return 'Un complexe est attendu'
+      commentaire='Un complexe est attendu'
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
 
   def get_valeur(self):
       """
 
   def get_valeur(self):
       """
@@ -1196,22 +1428,19 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       Cette méthode attribue le panel à l'objet pointé par self en fonction de la
       nature de la valeur demandée pour cet objet
       """
       Cette méthode attribue le panel à l'objet pointé par self en fonction de la
       nature de la valeur demandée pour cet objet
       """
+      #print "affect_panel : ",self.nom,self.is_list(),self.has_into(), self.get_into(None)
       if self.wait_shell():
           # l'objet attend un shell
           self.panel = SHELLPanel
       if self.wait_shell():
           # l'objet attend un shell
           self.panel = SHELLPanel
-      elif self.wait_into():
+      elif self.has_into():
           # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
           # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
-          min,max = self.GetMinMax()
-          if max != 1 and ((min != 0 and min != max) or (min == 0)):
-             # l'objet attend une liste de valeurs
+          if self.is_list() :
              self.panel = PLUSIEURS_INTO_Panel
           else:
              self.panel = PLUSIEURS_INTO_Panel
           else:
-             # l'objet n'attend qu'une seule valeur
              self.panel = UNIQUE_INTO_Panel
       else:
           # l'objet prend une ou des valeurs à priori quelconques
              self.panel = UNIQUE_INTO_Panel
       else:
           # l'objet prend une ou des valeurs à priori quelconques
-          min,max = self.GetMinMax()
-          if max != 1 :
+          if self.is_list() :
               # on attend une liste de valeurs mais de quel type ?
               if self.wait_assd():
                   # on attend une liste de SD
               # on attend une liste de valeurs mais de quel type ?
               if self.wait_assd():
                   # on attend une liste de SD
@@ -1235,7 +1464,127 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
                   else:
                       # on attend un entier, un réel ou une string
                       self.panel = UNIQUE_BASE_Panel
                   else:
                       # on attend un entier, un réel ou une string
                       self.panel = UNIQUE_BASE_Panel
+      #print "affect_panel : ",self.panel
+
+  def is_list(self):
+      """
+          Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
+          ou s'il n'en attend pas (valeur de retour 0)
+
+          Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+          Dans le cas sans validateur, l'information est donnée par l'attribut max
+          de la definition du mot cle.
+          Dans le cas avec validateur, il faut combiner l'information précédente avec
+          celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
+          l'operateur ET pour effectuer cette combinaison (AndVal).
+      """
+      is_a_list=0
+      min,max = self.GetMinMax()
+      assert (min <= max)
+      if max > 1 :
+               is_a_list=1
+      # Dans le cas avec validateurs, pour que le mot cle soit considéré
+      # comme acceptant une liste, il faut que max soit supérieur a 1
+      # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
+      # on retournera 0 (n'attend pas de liste)
+      if self.definition.validators :
+         is_a_list= self.definition.validators.is_list() * is_a_list
+      return is_a_list 
+
+  def get_into(self,liste_courante=None):
+      """
+          Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
+          pas de liste de choix, la méthode retourne None.
+          L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déjà
+          effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
+          en en tenant compte.
+          Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
+          une relation de type ET (AndVal).
+      """
+      if not self.object.definition.validators :
+         return self.object.definition.into
+      else:
+         return self.object.definition.validators.get_into(liste_courante,self.definition.into)
+
+  def has_into(self):
+      """
+          Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
+          ou s'il n'en propose pas (valeur de retour 0)
+
+          Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+          Dans le cas sans validateur, l'information est donnée par l'attribut into
+          de la definition du mot cle.
+         Dans le cas avec validateurs, pour que le mot cle soit considéré
+          comme proposant un choix, il faut que into soit présent OU
+          que la méthode has_into du validateur retourne 1. Dans les autres cas
+          on retournera 0 (ne propose pas de choix)
+      """
+      has_an_into=0
+      if self.definition.into:
+        has_an_into=1
+      elif self.definition.validators :
+         has_an_into= self.definition.validators.has_into()
+      return has_an_into
+
+  def valide_item(self,item):
+      """
+       On fait un try except pour les erreurs de types (exple
+       on rentre 1 pour une chaine de caracteres
+      """
+      valide=1
+      if self.definition.validators :
+         try :
+            valide=self.definition.validators.verif_item(item)
+         except :
+           valide = 0
+      return valide
+     
+  def valide_liste_partielle(self,item,listecourante):
+      valeuravant=self.object.valeur
+      valeur=listecourante
+      valeur.append(item)
+      valeur = tuple(valeur)
+      retour=self.object.set_valeur(valeur)
+      validite=0
+      if self.object.isvalid():
+         validite=1
+      elif self.definition.validators :
+         validite=self.definition.validators.valide_liste_partielle(valeur)
+
+      if validite==0:
+         min,max=self.GetMinMax()
+         if len(valeur) < min :
+           validite=1
+      retour=self.object.set_valeur(valeuravant)
+      return validite 
+
+  def valide_liste_complete (self,valeur):
+      valeuravant=self.object.valeur
+      retour=self.object.set_valeur(valeur)
+      validite=0
+      if self.object.isvalid():
+         validite=1
+      retour=self.object.set_valeur(valeuravant)
+      return validite
+     
+  def info_erreur_item(self) :
+      commentaire=""
+      if self.definition.validators :
+         commentaire=self.definition.validators.info_erreur_item()
+      return commentaire
       
       
+  def aide(self) :
+      commentaire=""
+      if self.definition.validators :
+         commentaire=self.definition.validators.aide()
+      return commentaire
+
+  def info_erreur_liste(self) :
+      commentaire=""
+      if self.definition.validators :
+         commentaire=self.definition.validators.info_erreur_liste()
+      return commentaire
+
   def SetText(self, text):
     try:
       value = eval(text)
   def SetText(self, text):
     try:
       value = eval(text)
@@ -1257,7 +1606,8 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
     Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
     pointé par self 
     """
     Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
     pointé par self 
     """
-    return self.object.GetText()
+    text= self.object.GetText()
+    return text
 
   def wait_co(self):
       """
 
   def wait_co(self):
       """
@@ -1356,6 +1706,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       Retourne la liste des noms des SD présentes avant l'étape qui contient
       le MCS pointé par self et du type requis par ce MCS
       """
       Retourne la liste des noms des SD présentes avant l'étape qui contient
       le MCS pointé par self et du type requis par ce MCS
       """
+      a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
       return self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,
                                                                self.object.definition.type)
     
       return self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,
                                                                self.object.definition.type)
     
@@ -1367,14 +1718,64 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       pass
 
   def isvalid(self):
       pass
 
   def isvalid(self):
+    valide=self.object.isvalid()
     return self.object.isvalid()
 
   def eval_valeur(self,valeur):
       """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
       de l'objet pointé par self :
         - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
     return self.object.isvalid()
 
   def eval_valeur(self,valeur):
       """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
       de l'objet pointé par self :
         - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
-        - retourne 'valeur' (chaîne de caractères) sinon """
-      return self.object.eval_valeur(valeur)
+        - retourne 'valeur' (chaîne de caractères) sinon
+        - retourne None en cas d invalidite
+        - retourne invalide si 1 des objets du tuple l est
+      """
+      validite=1
+      if type(valeur) in (types.ListType,types.TupleType) :
+         valeurretour=[]
+         for item in valeur :
+             newvaleur,validiteitem=self.eval_valeur_item(item)
+             valeurretour.append(newvaleur)
+             if validiteitem == 0:
+               validite=0
+      else :
+         valeurretour,validite= self.eval_valeur_item(valeur)
+      if validite == 0 :
+        valeurretour = None
+      return valeurretour,validite
+
+  def eval_valeur_item(self,valeur):
+      if valeur==None or valeur == "" :
+        return None,0
+      validite=1
+      if self.wait_reel():
+             valeurinter = self.traite_reel(valeur)
+             valeurretour,validite= self.object.eval_valeur(valeurinter)
+      elif self.wait_geom():
+             valeurretour,validite = valeur,1
+      else :
+             valeurretour,validite= self.object.eval_valeur(valeur)
+      if validite == 0:
+        if type(valeur) == types.StringType and self.object.wait_TXM():
+            essai_valeur="'" + valeur + "'"
+            valeurretour,validite= self.object.eval_valeur(essai_valeur)
+      if hasattr(valeurretour,'__class__'):
+         if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
+            validite=1
+      if self.wait_co():
+         try:
+            valeurretour=Accas.CO(valeur)
+         except:
+            valeurretour=None
+            validite=0
+
+      # on est dans le cas où on a évalué et où on n'aurait pas du
+      if self.object.wait_TXM() :
+         if type(valeurretour) != types.StringType:
+             valeurretour=str(valeur)
+             validite=1
+
+      return valeurretour,validite
+      
 
   def is_CO(self,valeur=None):
       """
 
   def is_CO(self,valeur=None):
       """
@@ -1390,7 +1791,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
       if not valeur:valeur=self.object.valeur
       if valeur in self.object.etape.sdprods:return 1
       # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
       if not valeur:valeur=self.object.valeur
       if valeur in self.object.etape.sdprods:return 1
-      if type(valeur) is not types.ClassType:return 0
+      if type(valeur) is not types.InstanceType:return 0
       if valeur.__class__.__name__ == 'CO':return 1
       return 0
 
       if valeur.__class__.__name__ == 'CO':return 1
       return 0
 
@@ -1404,6 +1805,54 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       #self.object.etape.parent.del_sdprod(valeur)
       self.object.etape.parent.delete_concept(valeur)
 
       #self.object.etape.parent.del_sdprod(valeur)
       self.object.etape.parent.delete_concept(valeur)
 
+  def get_liste_possible(self,listeActuelle=[]):
+      if hasattr(self.definition.validators,'into'):
+        self.get_definition().into=self.definition.validators.into 
+      valeurspossibles = self.get_definition().into
+      # CCAR : Ne serait-il pas preferable d'appeler get_into ?
+      #valeurspossibles=self.get_into(listeActuelle)
+
+      listevalideitem=[]
+      for item in valeurspossibles:
+          encorevalide=self.valide_item(item)
+          if encorevalide :
+             listevalideitem.append(item)
+      # on ne verifie pas la liste des choix si max = 1 
+      # (sinon cela enleve tous les choix possibles)
+      min,max=self.GetMinMax()
+      if max != 1 : 
+         listevalideliste=[]
+         for item in listevalideitem:
+             listetravail=[]
+             for item2 in listeActuelle : listetravail.append(item2)
+             encorevalide=self.valide_liste_partielle(item,listetravail)
+             if encorevalide :
+                listevalideliste.append(item)
+      else :
+         listevalideliste=listevalideitem
+      return listevalideliste
+
+  def traite_reel(self,valeur):
+      """
+      Cette fonction a pour but de rajouter le '.' en fin de chaîne pour un réel
+      ou de détecter si on fait référence à un concept produit par DEFI_VALEUR
+      ou un EVAL ...
+      """
+      valeur = string.strip(valeur)
+      liste_reels = self.get_sd_avant_du_bon_type()
+      if valeur in liste_reels:
+          return valeur
+      if len(valeur) >= 3 :
+          if valeur[0:4] == 'EVAL' :
+              # on a trouvé un EVAL --> on retourne directement la valeur
+              return valeur
+      if string.find(valeur,'.') == -1 :
+          # aucun '.' n'a été trouvé dans valeur --> on en rajoute un à la fin
+          return valeur+'.'
+      else:
+          return valeur
+        
+
 import Accas
 treeitem = SIMPTreeItem
 objet = Accas.MCSIMP
 import Accas
 treeitem = SIMPTreeItem
 objet = Accas.MCSIMP