]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
CCAR: Modified Files:
authoreficas <>
Wed, 6 Nov 2002 17:25:57 +0000 (17:25 +0000)
committereficas <>
Wed, 6 Nov 2002 17:25:57 +0000 (17:25 +0000)
CCAR:  appli.py bureau.py compojdc.py compomacro.py composimp.py
CCAR:  eficas.py jdcdisplay.py panels.py statusbar.py
CCAR:  treeitemincanvas.py treewidget.py widgets.py
CCAR: Added Files:
CCAR:  patches.py
CCAR: ----------------------------------------------------------------------
CCAR : developpement pour traiter correctement l'insertion
et la destruction des macros avec etapes et concepts inclus.
Ces INCLUDEs sont evalués dans un JDC auxiliaire avant
d'etre insérées définitivement dans la macro apres verification.

Editeur/appli.py
Editeur/bureau.py
Editeur/compomacro.py
Editeur/composimp.py
Editeur/eficas.py
Editeur/jdcdisplay.py
Editeur/panels.py
Editeur/patches.py [new file with mode: 0644]
Editeur/treeitemincanvas.py
Editeur/treewidget.py
Editeur/widgets.py

index 8dd925b7d1a59d36d30784113264598afdf6e095..83b3243949573b0cf8b6d1bdc66896ba030fa4e7 100644 (file)
@@ -28,6 +28,7 @@ import sys
 import types
 import Pmw
 import Tkinter
+from tkMessageBox import showinfo,askyesno,showerror
 
 # Modules Eficas
 import splash
@@ -35,6 +36,7 @@ import prefs
 import fontes
 import tooltip
 import properties
+from widgets import Fenetre
 
 VERSION="EFICAS v1.3"
 
@@ -78,7 +80,7 @@ class APPLI:
       """
           Cree les constituants de l'application :
            - menubar
-           - tollbar
+           - toolbar
            - bureau
            - statusbar
       """
@@ -217,3 +219,12 @@ class APPLI:
           menu=menudict.get(mname)
           if not menu:continue
           self.cree_menu(menu,itemlist,appli_composant)
+
+  def update_jdc_courant(self):
+      self.bureau.update_jdc_courant()
+
+  def affiche_alerte(self,titre,message):
+      f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
+      f.wait()
+
+
index 56bfa7dd3ff1974d2e697251b502230b4c5c6c0b..ecce22bc55e0e2dee50d934c42a5fd226d7656cd 100644 (file)
@@ -139,7 +139,9 @@ class BUREAU:
       CONTEXT.unset_current_step()
       J=self.cata[0].JdC(cata=self.cata,
                          cata_ord_dico=self.cata_ordonne_dico,
-                         appli=self.appli)
+                         appli=self.appli,
+                         rep_mat=self.appli.CONFIGURATION.rep_mat,
+                         )
       self.JDCName=J.nom
       self.fileName=None
       self.ShowJDC(J,self.JDCName)
@@ -209,6 +211,7 @@ class BUREAU:
           if not hasattr(self,'JDC') : return
           titre="rapport de validation du jeu de commandes courant"
           cr = self.JDC.report()
+          self.update_jdc_courant()
       elif mode == 'CATA':
           from Noyau.N_CR import CR
           cr = CR()
@@ -277,7 +280,9 @@ class BUREAU:
       CONTEXT.unset_current_step()
       J=self.cata[0].JdC(procedure=text,appli=self.appli,
                          cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
-                         nom = self.JDCName)
+                         nom = self.JDCName,
+                         rep_mat=self.appli.CONFIGURATION.rep_mat,
+                         )
       J.analyse()
       txt_exception = J.cr.get_mess_exception()
       if txt_exception :
@@ -582,3 +587,8 @@ class BUREAU:
 
    def aideEFICAS(self):
       AIDE.go(master=self.parent)
+
+   def update_jdc_courant(self):
+      self.JDCDisplay_courant.update()
+
+
index edbf840c603b4fab38f13852a50075040a886eee..6d8e0f45bc6a24693df91c0deb0acbb7f9947b88 100644 (file)
@@ -23,7 +23,7 @@ import types
 import Tkinter
 import Pmw
 from tkFileDialog import *
-from tkMessageBox import showinfo,showerror
+from tkMessageBox import showinfo,showerror,askyesno
 import traceback
 
 # Modules Eficas
@@ -32,11 +32,11 @@ import panels
 import fontes
 import compooper
 import convert
-from widgets import Fenetre
+from widgets import Fenetre,FenetreYesNo
 
 #
 __version__="$Name:  $"
-__Id__="$Id: compomacro.py,v 1.4 2002/05/15 15:31:58 eficas Exp $"
+__Id__="$Id: compomacro.py,v 1.5 2002/09/09 10:39:06 eficas Exp $"
 #
 
 class MACROPanel(panels.OngletPanel):
@@ -95,9 +95,9 @@ class MACROPanel(panels.OngletPanel):
     Tkinter.Button(page,text='Valider',command = self.change_fichier_init).place(relx=0.3,rely=0.8)
     Tkinter.Button(page,text='Browse',command = self.browse_fichier_init).place(relx=0.5,rely=0.8)
     Tkinter.Button(page,text='Annuler',command = self.annule_fichier_init).place(relx=0.7,rely=0.8)
-    if hasattr(self.node.item.object,'fichier_init'):\r
-      if self.node.item.object.fichier_init :\r
-        self.entry.insert(0,self.node.item.object.fichier_init)
+    if hasattr(self.node.item.object,'fichier_ini'):
+      if self.node.item.object.fichier_ini :
+        self.entry.insert(0,self.node.item.object.fichier_ini)
     self.entry.focus()
 
   def convert_file(self,file):
@@ -127,9 +127,17 @@ class MACROPanel(panels.OngletPanel):
     """ 
         Effectue le changement de fichier d'initialisation s'il est valide 
     """
-    if not hasattr(self.node.item.object,'fichier_init'):
-       self.node.item.object.fichier_init=None
-    old_fic = self.node.item.object.fichier_init
+    if not hasattr(self.node.item.object,'fichier_ini'):
+       self.node.item.object.fichier_ini=None
+       self.node.item.object.fichier_text=None
+       self.node.item.object.fichier_err="Le fichier n'est pas defini"
+       self.node.item.object.contexte_fichier_init={}
+
+    old_fic = self.node.item.object.fichier_ini
+    old_text = self.node.item.object.fichier_text
+    old_err = self.node.item.object.fichier_err
+    old_context=self.node.item.object.contexte_fichier_init
+
     new_fic = self.entry.get()
     if not os.path.isfile(new_fic) :
       showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
@@ -138,50 +146,80 @@ class MACROPanel(panels.OngletPanel):
       return
     # On convertit le fichier
     text=self.convert_file(new_fic)
-    if not text:return
+    # Si probleme a la lecture-conversion on arrete le traitement
+    if not text:
+       return
+
     try:
-      self.node.item.object.make_contexte(new_fic,text)
-      self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
+      self.node.item.object.make_contexte_include(new_fic,text)
     except:
-      #traceback.print_exc()
+      # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
+      self.parent.appli.affiche_infos("Fichier invalide")
       l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
-      showinfo("Fichier invalide",
-               "Erreur dans l'interprétation du nouveau fichier ...\n"+
-               "L'ancien va être restauré\n"+string.join(l))
+      f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
+                             texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l))
+      f.wait()
+      reponse=f.result
+      if reponse:
+         # On retablit l'ancien fichier
+         self.entry.delete(0,Tkinter.END)
+         self.node.item.object.fichier_ini=old_fic
+         self.node.item.object.fichier_text=old_text
+         self.node.item.object.fichier_err=old_err
+         self.node.item.object.contexte_fichier_init=old_context
+         self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
+         if old_fic:
+             self.entry.insert(0,self.node.item.object.fichier_ini)
+      else:
+         # On conserve la memoire du nouveau fichier
+         # mais on n'utilise pas les etapes et concepts crees par ce fichier
+         # on met l'etape en erreur : fichier_err=string.join(l)
+         self.node.item.object.init_modif()
+         self.node.item.object.fichier_ini=new_fic
+         self.node.item.object.fichier_text=text
+         self.node.item.object.fichier_err=string.join(l)
+         self.node.item.object.etapes=[]
+         self.node.item.object.g_context={}
+         # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
+         self.node.item.object.parent.reset_context()
 
-      self.entry.delete(0,Tkinter.END)
-      self.parent.appli.affiche_infos("Fichier invalide")
+         self.node.item.object.old_contexte_fichier_init=old_context
+         self.node.item.object.contexte_fichier_init={}
+         self.node.item.object.reevalue_sd_jdc()
 
-      if old_fic:
-         # On convertit le fichier
-         #text=self.convert_file(old_fic)
-         #if not text:return
-         #self.node.item.object.make_contexte(old_fic,text)
-         self.node.item.object.fichier_init=old_fic
-         self.entry.insert(0,self.node.item.object.fichier_init)
-         self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
+         self.node.item.object.fin_modif()
+         self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
+         self.node.update()
       return
-    # si on passe ici, c'est que le new_fic a bien été correctement 
-    #  interprété ...
-    self.node.item.object.fichier_init = new_fic
-    # il faut lancer la réévaluation de tout le jdc ... 
+
+    # L'evaluation de text dans un JDC auxiliaire s'est bien passé
+    # on peut poursuivre le traitement
+    self.node.item.object.init_modif() 
+    self.node.item.object.fichier_ini = new_fic
+    self.node.item.object.fichier_text=text
+    self.node.item.object.fichier_err=None
+    # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
+    self.node.item.object.parent.reset_context()
+
+    # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
+    self.node.item.object.old_contexte_fichier_init=old_context
     self.node.item.object.reevalue_sd_jdc()
-    self.node.racine.update()
+
+    self.node.item.object.fin_modif()
+    self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
+    self.node.update()
 
   def annule_fichier_init(self,event=None):
-    """ retaure dans self.entry le nom de fichier_init"""
+    """ Restaure dans self.entry le nom de fichier_init"""
     self.entry.delete(0,Tkinter.END)
-    self.entry.insert(0,self.node.item.object.fichier_init)
+    self.entry.insert(0,self.node.item.object.fichier_ini)
 
   def browse_fichier_init(self,event=None):
     """ 
          Propose à l'utilisateur une Bsf et retourne le fichier 
          sélectionné dans self.entry 
     """
-    file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom(),
-                         #  filetypes = ( ("Aster", ".comm"),("Python", ".py")),
-                         #  defaultextension=".comm"
-                          )
+    file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
     if file != '' :
       self.entry.delete(0,Tkinter.END)
       self.entry.insert(0,file)
@@ -198,18 +236,13 @@ class MACROTreeItem(compooper.EtapeTreeItem):
       Retourne le nom de l'icône à afficher dans l'arbre
       Ce nom dépend de la validité de l'objet
       """
-      if self.object.isactif():
-        if self.object.state != 'unchanged':
-           # Si des modifications ont eu lieu on force le calcul des concepts de sortie
-           # et celui du contexte glissant
-           self.object.get_type_produit(force=1)
-           self.object.parent.reset_context()
+      if not self.object.isactif():
+        return "ast-white-square"
+      else:
         if self.object.isvalid():
           return "ast-green-square"
         else:
           return "ast-red-square"
-      else:
-        return "ast-white-square"
 
   def GetLabelText(self):
       """ Retourne 3 valeurs :
@@ -295,8 +328,19 @@ class MACROTreeItem(compooper.EtapeTreeItem):
   def get_noms_sd_oper_reentrant(self):
       return self.object.get_noms_sd_oper_reentrant()
 
-import Accas
+class INCLUDE_MATERIAUTreeItem(MACROTreeItem):
+  pass
+
 treeitem=MACROTreeItem
+def treeitem(appli, labeltext, object, setfunction=None):
+   if object.nom == "INCLUDE_MATERIAU":
+      return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
+   elif object.nom == "INCLUDE":
+      return MACROTreeItem(appli, labeltext, object, setfunction)
+   else:
+      return MACROTreeItem(appli, labeltext, object, setfunction)
+
+import Accas
 objet=Accas.MACRO_ETAPE
     
 class MacroDisplay:
index 5bb8eba3c2b45f697b51655cfc1ea1e67cd1417e..a692a9da4f65a651f041d3d0df7ef80c7d65ee9b 100644 (file)
@@ -60,7 +60,7 @@ class newSIMPPanel(panels.OngletPanel):
       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
 # ----------------------------------------------------------------------------------------
 
@@ -73,8 +73,14 @@ class newSIMPPanel(panels.OngletPanel):
       if name != None:
           valeur =name
       else :
+          #XXX Pourquoi proceder ainsi ? Il n'est pas possible de mettre
+          # None comme valeur du mot cle. 
+          # Probablement que ce debranchement permet de mettre record_valeur
+          # en call back, il faut donc aller chercher la valeur dans l'entry
           valeur= self.entry.get()
           self.entry.delete(0,END)
+          #XXX Pour permettre la mise a None du mot cle, on remet None si valeur == ''
+          if valeur == '':valeur=None
       self.node.item.set_valeur(valeur,evaluation='non')
       self.parent.appli.affiche_infos(mess)
       if self.node.item.get_position()=='global':
@@ -86,8 +92,9 @@ class newSIMPPanel(panels.OngletPanel):
       self.node.update()
       if self.node.item.isvalid():
           self.node.parent.select()
+
 # ----------------------------------------------------------------------------------------
-#   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
index 14419aae87c3948cb8c8ea3e9024fbe4969e000b..f9e97f9b5fe14896d28cea74ab4b47e1c949282d 100644 (file)
@@ -31,6 +31,7 @@ from tkMessageBox import askyesno,showerror
 import traceback
 
 # Modules Eficas
+import patches
 import appli
 from widgets import Fenetre
 
@@ -68,7 +69,7 @@ class EFICAS(appli.APPLI):
         self._ulfile.setentry('')
         self.dialog.deactivate(result)
         self.ulfile = None
-        self.text=''
+        self.text=None
 
   def get_file(self,unite=None,fic_origine = ''):
       """ 
@@ -129,3 +130,10 @@ class EFICAS(appli.APPLI):
          showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
          return None
 
+  def affiche_texte(self,entete,texte):
+      """Cette methode ouvre une fenetre modale dans laquelle on affiche un texte
+      """
+      self.affiche_infos(entete)
+      f=Fenetre(self, titre=entete, texte = texte)
+      f.wait()
+
index 05f591ecefc63e1dde68e4907c0c3a5b7c7bf013..820d7bacee44bccf29354c09b40adc6b415f718c 100644 (file)
@@ -265,3 +265,9 @@ class JDCDISPLAY:
       # on rend la copie à nouveau possible en libérant le flag edit
       self.edit="copier"
 
+   def update(self):
+      """Cette methode est utilisee par le JDC associe pour 
+         signaler des modifications globales du JDC
+      """
+      self.tree.update()
+
index 328015d944d379d3f1462a53f95d37640ba9fb50..3c5c5e457f460a2ef1e4190ac17162de75b64c6a 100644 (file)
@@ -37,6 +37,9 @@ class Panel(Frame) :
   Elle est toujours dérivée.
   """
   def __init__(self,parent,panneau,node) :
+      # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
+      # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
+      # modified et la methode init_modif
       self.parent=parent
       self.panneau = panneau
       self.node=node
diff --git a/Editeur/patches.py b/Editeur/patches.py
new file mode 100644 (file)
index 0000000..b85f654
--- /dev/null
@@ -0,0 +1,67 @@
+"""
+   Ce module contient des modifications mineures du comportement
+   du noyau ou de validation
+"""
+import string
+
+if 1:
+   # Modification de la fonction justify_text de Noyau.N_CR
+   separateurs=(' ',',','/')
+   def split(ligne,cesure):
+       ligne= string.rstrip(ligne)
+       if len(ligne) <= cesure : 
+          return ligne
+       else:
+          coupure=cesure
+          while ligne[coupure] not in separateurs and coupure > 0:
+             coupure = coupure - 1
+          if coupure == 0:
+             # Il faut augmenter la cesure
+             coupure =cesure
+             while ligne[coupure] not in separateurs and coupure < len(ligne)-1 :
+                coupure = coupure + 1
+          if coupure == len(ligne)-1:
+             return ligne
+          else:
+             return ligne[:coupure+1]+ '\n' + split(ligne[coupure+1:],cesure)
+
+   def justify_text(texte='',cesure=50):
+       texte = string.strip(texte)
+       liste_lignes = string.split(texte,'\n')
+       l=[split(l,cesure) for l in liste_lignes]
+       texte_justifie=string.join(l,'\n')
+       return texte_justifie
+   try:
+      import Noyau.N_CR
+      Noyau.N_CR.justify_text=justify_text
+   except:
+      pass
+
+def encadre_message(texte,motif):
+  """
+     Retourne la chaine de caractères texte entourée d'un cadre formés
+     d'éléments 'motif'
+  """
+  texte = justify_text(texte,cesure=80)
+  lignes = string.split(texte,'\n')
+  longueur = 0
+  for ligne in lignes :
+    if len(ligne)> longueur : longueur = len(ligne)
+  longueur = longueur + 4
+  txt = motif*longueur+'\n'
+  for ligne in lignes :
+    txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n'
+  txt = txt + motif*longueur+'\n'
+  return txt
+
+if __name__ == "__main__":
+   print encadre_message(motif='!',
+texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE')     
+- Il faut au moins un mot-clé parmi : ('FIN',)               
+- Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',) 
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyy
+""")
+
+
+
index 2a1c45acc8697129fcbf3a1d05bb9a6f32353e35..a9d5c86e821c8e30713c396c6fa7925119c32048 100644 (file)
@@ -55,3 +55,6 @@ class TREEITEMINCANVAS:
    def mainloop(self):
       self.parent.mainloop()
 
+   def update(self):
+      """Cette methode est utilisee pour signaler une mise a jour des objets associes"""
+      self.tree.update()
index 58a954dc4ea8ad99ffa9eb2edd1c9a3bd6efdf6b..ebf3cd5122e27f43f3edd88cb1f81f611bb47201 100644 (file)
@@ -26,7 +26,7 @@ import images
 
 #
 __version__="$Name:  $"
-__Id__="$Id: treewidget.py,v 1.7 2002/09/10 15:59:37 eficas Exp $"
+__Id__="$Id: treewidget.py,v 1.8 2002/10/16 13:27:35 eficas Exp $"
 #
 
 Fonte_Standard = fontes.standard
@@ -71,8 +71,6 @@ class Tree :
         for child in self.children:
             child.draw(x,lasty)
             lasty = child.lasty + 15
-            child.trace_ligne()
-        #self.update()
         self.children[0].select()
         self.resizescrollregion()
 
@@ -289,6 +287,7 @@ class Node :
             child.draw(x,y)
             nb = child.get_nb_children()
             y = y + 20*(nb+1)
+        self.trace_ligne()
 
     def drawtext(self):
         """ Affiche les deux zones de texte après l'icône de couleur de l'objet """
@@ -363,26 +362,17 @@ class Node :
         nb = self.get_nb_children()
         self.state = 'collapsed'
         self.collapse_children()
-        self.efface()
-        try:
-            self.move(-20*nb)
-        except:
-            pass
-        self.draw(self.x,self.y)
+        self.redraw(-nb)
         self.select()
-        self.update()
-
+   
     def expand(self,event = None):
         """ Expanse self et le retrace """
         if not self.item.isactif() : return
         if not self.children : self.build_children()
         self.state = 'expanded'
         nb = self.get_nb_children()
-        self.move(20*nb)
-        self.efface()
-        self.draw(self.x,self.y)
+        self.redraw(nb)
         self.select()
-        self.update()
 
     def redraw(self,nb):
         """ Redessine self :  nb est le décalage à introduire
@@ -392,7 +382,10 @@ class Node :
         # on efface self et on le redessine
         self.efface()
         self.draw(self.x,self.y)
-        self.update()
+        # Il n'est pas nécessaire d'appeler update
+        # il suffit d'updater les coordonnees et de retracer les lignes
+        self.racine.update_coords()
+        self.racine.trace_ligne()
         
     def update_coords(self):
         """ Permet d'updater les coordonnes de self et de tous ses enfants"""
@@ -495,19 +488,6 @@ class Node :
                 print child
                 print child.item.object
 
-    def make_visible_OBSOLETE(self,nb):
-        """ Cette méthode a pour but de rendre le noeud self (avec tous ses descendants
-        affichés) visible dans le canvas """
-        x = self.canvas.canvasx(self.canvas.cget('width'))
-        y = self.canvas.canvasy(self.canvas.cget('height'))
-        #print 'x,y =',x,y
-        x0,y0,x1,y1 = self.canvas.bbox(ALL)
-        #print 'x0,y1=',x0,y1
-        y_deb = self.y
-        nb = self.get_nb_children()
-        y_fin = y_deb + 20*nb
-        #print 'y_deb,y_fin=',y_deb,y_fin
-        
     #------------------------------------------------------------------
     # Méthodes de création et destruction de noeuds
     # Certaines de ces méthodes peuvent être appelées depuis l'externe
@@ -577,7 +557,6 @@ class Node :
         """
         if not self.children : self.build_children()
         if pos == None :
-            #pos = len(self.children)
             if type(fils) == types.InstanceType:
                 pos = self.item.get_index_child(fils.nom)
             else:
@@ -586,10 +565,12 @@ class Node :
         if child == 0 :
             # on n'a pas pu créer le noeud fils
             return 0
-        child.displayed = 1
         self.state = 'expanded'
+        child.displayed = 1
+        if child.item.isactif():
+           child.state = 'expanded'
+        if not child.children : child.build_children()
         if verif == 'oui':
-            if not child.children : child.build_children()
             test = child.item.isMCList()
             if test :
                 child.children[-1].verif_condition()
@@ -629,8 +610,6 @@ class Node :
         nbnew = self.get_nb_children()
         self.redraw(nbnew-nbold)
         child.select()
-        child.expand()
-        #child.make_visible()
         if retour == 'oui': return child
 
     def delete_node_child(self,child):
index 2eefd4b2f9520f6220b91e78bfe4f73b1c9d9d23..723e6fcf2a35799f244b1dd0754b74c670326b97 100644 (file)
@@ -85,6 +85,7 @@ class Fenetre :
 
     def wait(self):
         self.fenetre.grab_set()
+        self.zone_texte.focus_set()
         self.fenetre.wait_window(self.fenetre)
 
     def quit(self):
@@ -121,6 +122,50 @@ class Fenetre :
             else:
                 showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file)
 
+class FenetreYesNo(Fenetre):
+    def __init__(self,appli,titre="",texte=""):
+        self.appli=appli
+        self.fenetre = Toplevel()
+        self.fenetre.configure(width = 800,height=500)
+        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+        self.fenetre.title(titre)
+        self.texte = string.replace(texte,'\r\n','\n')
+        self.titre = titre
+        fonte=fontes.standardcourier10
+        # définition des frames
+        self.frame_texte = Frame(self.fenetre)
+        self.frame_boutons = Frame(self.fenetre)
+        self.frame_boutons.place(relx=0,rely=0,    relwidth=1.,relheight=0.1)
+        self.frame_texte.place(  relx=0,rely=0.1,  relwidth=1, relheight=0.9)
+        # définition de la zone texte et du scrollbar
+        self.zone_texte = Text(self.frame_texte,font=fonte)
+        self.zone_texte.bind("<Key-Prior>", self.page_up)
+        self.zone_texte.bind("<Key-Next>", self.page_down)
+        self.zone_texte.bind("<Key-Up>", self.unit_up)
+        self.zone_texte.bind("<Key-Down>", self.unit_down)
+        self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+        #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
+        self.scroll_v.pack(side='right',fill ='y')
+        #self.scroll_h.pack(side='bottom',fill ='x')
+        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+        # définition des boutons
+        self.but_yes = Button(self.frame_boutons,text = "Yes",command=self.yes)
+        self.but_no = Button(self.frame_boutons,text = "No",command = self.no)
+        self.but_yes.place(relx=0.4,rely=0.5,anchor='center')
+        self.but_no.place(relx=0.6,rely=0.5,anchor='center')
+        # affichage du texte
+        self.affiche_texte(self.texte)
+        centerwindow(self.fenetre)
+
+    def yes(self):
+        self.result=1
+        self.quit()
+
+    def no(self):
+        self.result=0
+        self.quit()
+
 class FenetreDeSelection(Fenetre):
     """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée.\r
         Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.\r
@@ -555,7 +600,7 @@ class ListeChoix :
 
     def affiche_liste(self):
         """ Affiche la liste dans la fenêtre"""
-        i=0
+        liste_labels=[]
         self.MCbox.config(state=NORMAL)
         self.MCbox.delete(1.0,END)
         for objet in self.liste :
@@ -575,6 +620,7 @@ class ListeChoix :
                         text = mot,
                         fg = 'black',bg = 'gray95',justify = 'left')
           self.dico_labels[mot]=label
+          liste_labels.append(label)
           self.MCbox.window_create(END,
                                    window=label,
                                    stretch = 1)
@@ -583,12 +629,13 @@ class ListeChoix :
               label.bind(self.liste_commandes[0][0],lambda e,s=self,c=self.liste_commandes[0][1],x=objet,l=label : s.selectitem(x,l,c))
               label.bind(self.liste_commandes[1][0],lambda e,s=self,c=self.liste_commandes[1][1],x=objet,l=label : s.deselectitem(l,x,c))
               label.bind(self.liste_commandes[2][0],lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitem(x,l,c))
-          try :
-              self.liste_marques.index(i)
-              self.markitem(label)
-          except:
+
+        for marque in self.liste_marques:
+           try:
+              self.markitem(liste_labels[marque])
+           except:
               pass
-          i=i+1
+
         self.MCbox.config(state=DISABLED)
         self.selection = None