]> SALOME platform Git repositories - tools/eficas.git/blobdiff - Editeur/widgets.py
Salome HOME
PN
[tools/eficas.git] / Editeur / widgets.py
index 9817573c1ff85544798105303d4b2c9d7b09d231..4f8ab2c5491bd4ff2518fe7a9fe54a64d208dab2 100644 (file)
@@ -28,6 +28,7 @@ from Tkinter import *
 import Pmw
 import os,sys,re,string
 import types,fnmatch
+import traceback
 from tkFileDialog import *
 from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
 
@@ -57,6 +58,7 @@ class Fenetre :
     def __init__(self,appli,titre="",texte=""):
         self.appli=appli
         self.fenetre = Toplevel()
+        self.fenetre.withdraw()
         self.fenetre.configure(width = 800,height=500)
         self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
         self.fenetre.title("Visualisation du "+titre)
@@ -81,13 +83,15 @@ class Fenetre :
         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_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
+        self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit,default='active')
         self.but_save = Button(self.frame_boutons,text = "sauver",command = self.save)
         self.but_quit.place(relx=0.4,rely=0.5,anchor='center')
         self.but_save.place(relx=0.6,rely=0.5,anchor='center')
         # affichage du texte
         self.affiche_texte(self.texte)
+       self.zone_texte.config(state=DISABLED)
         centerwindow(self.fenetre)
+        self.fenetre.deiconify()
 
     def page_up(self,event):
         event.widget.yview_scroll(-1, "page")
@@ -130,7 +134,7 @@ class Fenetre :
                                initialdir = self.appli.CONFIGURATION.initialdir,
                                title="Sauvegarde du "+self.titre)
         if file :
-            if not save_in_file(file,self.texte) :
+            if not save_in_file(file,self.texte,None) :
                 showerror("Sauvegarde impossible",
                        "Impossible de sauvegarder le texte dans le fichier spécifié\n"+
                           "Vérifiez les droits d'écriture")
@@ -540,7 +544,12 @@ class Formulaire:
             if len(item[0])>length_maxi : length_maxi = len(item[0])
         window = self.fenetre.interior()
         for item in self.items :
-            label,nature,nom_var,defaut = item
+           if len(item) == 4 :
+               label,nature,nom_var,defaut = item
+              chaine="Yes" 
+              chaine2="No"
+           else :
+               label,nature,nom_var,defaut,chaine,chaine2 = item
             # création de la frame
             fr_item = Frame(window,height=40,width=700)
             fr_item.pack(side='top',fill='x',expand=1)
@@ -559,8 +568,8 @@ class Formulaire:
                 setattr(self,'item_'+nom_var,var)
                 var.set(defaut)
                 # création du radiobouton
-                rb1 = Radiobutton(fr_item,text='OUI',variable=var,value='OUI')
-                rb2 = Radiobutton(fr_item,text='NON',variable=var,value='NON')
+                rb1 = Radiobutton(fr_item,text=chaine,variable=var,value='OUI')
+                rb2 = Radiobutton(fr_item,text=chaine2,variable=var,value='NON')
                 rb1.place(relx=0.65,rely=0.5,anchor='center')
                 rb2.place(relx=0.80,rely=0.5,anchor='center')
                 self.widgets.append((rb1,rb2))
@@ -668,7 +677,8 @@ class Formulaire:
 class ListeChoix :
     """ Cette classe est utilisée pour afficher une liste de choix passée en paramètre
         en passant les commandes à lancer suivant différents bindings """
-    def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',optionReturn=None):
+    def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',
+                 optionReturn=None, fonte_titre=fontes.standard_gras_souligne):
         self.parent = parent
         self.page = page
         self.liste = liste
@@ -681,6 +691,7 @@ class ListeChoix :
         self.titre = titre
         self.filtre = filtre
         self.optionReturn = optionReturn
+       self.fonte_titre=fonte_titre
         self.init()
 
     def init(self):        
@@ -695,10 +706,9 @@ class ListeChoix :
     def make_label_titre(self):
         """ Crée le label correspondant au titre """
         if self.titre == '' : return
-        fonte_titre = fontes.standard_gras_souligne
         self.label = Label(self.page,
                            text = self.titre,
-                           font = fonte_titre)
+                           font = self.fonte_titre)
         self.label.pack(side='top',pady=2)
         
     def make_entry_filtre(self):
@@ -732,8 +742,9 @@ class ListeChoix :
           elif type(objet) in (types.StringType,types.IntType):
               mot = objet
           elif type(objet) == types.FloatType :
-              #mot = repr_float(objet)
-              mot = str(objet)
+              mot = self.parent.get_valeur_texte(objet)
+              if mot == "" :
+                 mot = str(objet)
           elif type(objet) == types.TupleType :
               mot="("
               premier=1
@@ -742,7 +753,11 @@ class ListeChoix :
                   mot=mot+"," 
                  else:
                    premier=0
-                 mot=mot+str(val)
+                 valtexte = self.parent.get_valeur_texte(val)
+                 if valtexte != "" :
+                    mot=mot+valtexte
+                 else:
+                    mot=mot+str(val)
               mot=mot+")"
           else:
               mot=`objet`
@@ -757,7 +772,11 @@ class ListeChoix :
           self.MCbox.insert(END,'\n')
           if self.optionReturn != None :
               label.bind("<Return>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
+              label.bind("<KP_Enter>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
           label.bind("<Key-Right>",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l))
+          label.bind("<Key-Down>",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l))
+          label.bind("<Key-Left>" ,lambda e,s=self,x=objet,l=label  : s.selectPrevItem(x,l))
+          label.bind("<Key-Up>" ,lambda e,s=self,x=objet,l=label  : s.selectPrevItem(x,l))
           if self.active == 'oui':
               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))
@@ -771,6 +790,11 @@ class ListeChoix :
 
         self.MCbox.config(state=DISABLED)
         self.selection = None
+        self.dontselect=0
+        for event,callback in self.liste_commandes:
+            if event == "<Enter>":
+               self.selection=None,None,callback
+               break
 
     def clear_marque(self):
         try:
@@ -802,38 +826,49 @@ class ListeChoix :
         except AsException,e:
            raison=str(e)
            showerror(raison.split('\n')[0],raison)
-        
+
     def selectNextItem(self,mot,label):
-        try :
-           index=self.liste.index(mot)
-           indexsuivant=index+1
-           motsuivant=self.liste[indexsuivant]
-           labelsuivant=self.dico_labels[motsuivant]
-           self.clear_marque()
-           if self.selection != None :
-              self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
-              self.selection = (mot,label,self.selection[2])
-           self.highlightitem(labelsuivant)
-           self.arg_selected=motsuivant
-           labelsuivant.focus_set()
-        # PN il faut faire quelque chose pour être dans la fenetre
-        except:
-           pass
+        index=self.liste.index(mot)
+        indexsuivant=index+1
+       if indexsuivant > len(self.liste) -1:
+          indexsuivant=0
+        motsuivant=self.liste[indexsuivant]
+        labelsuivant=self.dico_labels[motsuivant]
+        index = self.MCbox.index(labelsuivant)
+        self.MCbox.see(index)
+        self.selectthis(motsuivant,labelsuivant,self.selection[2],)
+        self.dontselect=1
            
+    def selectPrevItem(self,mot,label):
+        index=self.liste.index(mot)
+        indexprec=index-1
+        motprec=self.liste[indexprec]
+        labelprec=self.dico_labels[motprec]
+        index = self.MCbox.index(labelprec)
+        self.MCbox.see(index)
+        self.selectthis(motprec,labelprec,self.selection[2],)
+        self.dontselect=1
         
-    def selectitem(self,mot,label,commande) :
-        """ Met l'item sélectionné (représenté par son label) en surbrillance
-            et lance la commande associée au double-clic"""
+    def selectthis(self,mot,label,commande) :
        self.clear_marque()
         if self.selection != None :
             self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
         self.highlightitem(label)
         self.selection = (mot,label,commande)
         self.arg_selected = mot
-        commande(mot)
+        if commande : commande(mot)
+
+    def selectitem(self,mot,label,commande) :
+        """ Met l'item sélectionné (représenté par son label) en surbrillance
+            et lance la commande associée au double-clic"""
+        if self.dontselect:
+           self.dontselect=0
+           return
+        self.selectthis(mot,label,commande)
 
     def highlightitem(self,label) :
         """ Met l'item représenté par son label en surbrillance """
+        label.focus_set()
         label.configure(bg='#00008b',fg='white')
         
     def markitem(self,label):
@@ -842,9 +877,9 @@ class ListeChoix :
         
     def deselectitem(self,label,mot='',commande=None) :
         """ Remet l'item (représenté par son label) en noir"""
-        label.configure(bg='gray95',fg='black')
+        if label:label.configure(bg='gray95',fg='black')
         self.arg_selected = ''
-        if commande != None : commande(mot)
+        if commande and mot : commande(mot)
 
     def cherche_selected_item(self):
         index=self.MCbox.index(self.selection[1])
@@ -852,7 +887,10 @@ class ListeChoix :
         return lign
 
     def remove_selected_item(self):
-        index=self.MCbox.index(self.selection[1])
+       try :
+           index=self.MCbox.index(self.selection[1])
+       except :
+           index=self.MCbox.index(self.dico_labels[self.arg_selected] )
         lign,col=map(int,string.split(index,'.'))
         del self.liste[lign-1]
         self.affiche_liste()
@@ -865,18 +903,17 @@ class ListeChoix :
         FILTRE = string.upper(filtre)
         for arg in self.liste :
             if fnmatch.fnmatch(arg,filtre) or fnmatch.fnmatch(arg,FILTRE) :
-                self.highlightitem(self.dico_labels[arg])
-                index = self.MCbox.index(self.dico_labels[arg])
+                label=self.dico_labels[arg]
+                index = self.MCbox.index(label)
                 self.MCbox.see(index)
-                self.arg_selected = arg
+                self.selectitem(arg,label,self.selection[2])
                 break
-        try :
-          self.dico_labels[self.arg_selected].focus_set()
-        except :
-          pass
 
-    def get_liste_old(self):
-        return self.liste
+        #try :
+          #self.dico_labels[self.arg_selected].focus_set()
+        #except :
+          #pass
+
 
     # PN attention à la gestion des paramétres
     # cela retourne H = 1 , et ni H, ni 1
@@ -1071,9 +1108,16 @@ class ListeChoixParGroupes(ListeChoix) :
         Cette classe est utilisée pour afficher une liste de commandes classées par
         groupes. L'utilisateur peut réaliser des actions de selection
         qui déclenchent des actions spécifiées par les bindings contenus dans liste_commandes
+        Exemple de binding:
+           liste_commandes = (("<Enter>",self.selectCmd),
+                              ("<Leave>",self.deselectCmd),
+                              ("<Double-Button-1>",self.defCmd))
+        Il s'agit d'une liste de doublets dont le premier element est un evenement et le 
+        deuxieme un callback a appeler sur l'evenement en question.
+
     """
     def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
-                      active ='oui',filtre='non',titre=''):
+                      active ='oui',filtre='non',titre='',optionReturn=None,fonte_titre=fontes.standard_gras_souligne):
         self.parent = parent
         self.page = page
         self.liste_groupes = liste_groupes
@@ -1086,6 +1130,8 @@ class ListeChoixParGroupes(ListeChoix) :
         self.active = active
         self.titre = titre
         self.filtre = filtre
+        self.optionReturn = optionReturn
+        self.fonte_titre=fonte_titre
         self.init()
 
     def affiche_liste(self):
@@ -1119,14 +1165,43 @@ class ListeChoixParGroupes(ListeChoix) :
                                    window=label,
                                    stretch = 1)
               self.MCbox.insert(END,'\n')
+
+              def null(*tp,**args): return
+
               if self.active == 'oui':
-                  label.bind(self.liste_commandes[0][0],
-                         lambda e,s=self,c=self.liste_commandes[0][1],x=cmd,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=cmd,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=cmd,l=label : s.chooseitem(x,l,c))
-                  label.bind("<Key-Down>", self.selectNextItem(event))
+                  # Traitement par defaut des evenements
+                  label.bind("<Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c))
+                  label.bind("<Leave>",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c))
+                  label.bind("<Double-Button-1>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+                  label.bind("<Return>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+                  label.bind("<KP_Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+                  label.bind("<Key-Right>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+                  label.bind("<Key-Down>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+                  label.bind("<Key-Left>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+                  label.bind("<Key-Up>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+
+                  # Si des callbacks sont definis on les utilise
+                  for event,callback in self.liste_commandes:
+                      if event == "<Enter>":
+                         label.bind("<Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c))
+                      elif event == "<Leave>":
+                         label.bind("<Leave>",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c))
+                      elif event == "<Double-Button-1>":
+                         label.bind("<Double-Button-1>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+                      elif event == "<Return>":
+                         label.bind("<Return>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+                      elif event == "<KP_Enter>":
+                         label.bind("<KP_Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+                      elif event == "<Key-Right>":
+                         label.bind("<Key-Right>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+                      elif event == "<Key-Down>":
+                         label.bind("<Key-Down>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+                      elif event == "<Key-Left>":
+                         label.bind("<Key-Left>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+                      elif event == "<Key-Up>":
+                         label.bind("<Key-Up>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+                      else:
+                         label.bind(event,lambda e,s=self,c=callback,x=cmd,l=label: c())
 
         for marque in self.liste_marques:
            try:
@@ -1136,6 +1211,53 @@ class ListeChoixParGroupes(ListeChoix) :
 
         self.MCbox.config(state=DISABLED)
         self.selection = None
+        self.dontselect=0
+        for event,callback in self.liste_commandes:
+            if event == "<Enter>":
+               self.selection=None,None,callback
+               break
+
+    def selectPrevItem(self,mot,label,callback,group,cmd):
+        g=self.liste_groupes.index(group)
+        liste_commandes=self.dict_groupes[group]
+        c=liste_commandes.index(cmd)
+        if c > 0:
+           co=liste_commandes[c-1]
+        else:
+           # debut de liste. On passe au groupe precedent
+           if g > 0:
+              gr=self.liste_groupes[g-1]
+              co=self.dict_groupes[gr][-1]
+           else:
+              # debut des groupes. On ne fait rien
+              return
+        # On a trouve l'item precedent
+        labelsuivant=self.dico_labels[co]
+        index = self.MCbox.index(labelsuivant)
+        self.MCbox.see(index)
+        self.selectthis(co,labelsuivant,self.selection[2],)
+        self.dontselect=1
+
+    def selectNextItem(self,mot,label,callback,group,cmd):
+        g=self.liste_groupes.index(group)
+        liste_commandes=self.dict_groupes[group]
+        c=liste_commandes.index(cmd)
+        try:
+           co=liste_commandes[c+1]
+        except:
+           # fin de liste. On passe au groupe suivant
+           try:
+              gr=self.liste_groupes[g+1]
+              co=self.dict_groupes[gr][0]
+           except:
+              # fin des groupes. On ne fait rien
+              return
+        # On a trouve l'item suivant
+        labelsuivant=self.dico_labels[co]
+        index = self.MCbox.index(labelsuivant)
+        self.MCbox.see(index)
+        self.selectthis(co,labelsuivant,self.selection[2],)
+        self.dontselect=1
 
     def entry_changed(self,event=None):
         """ 
@@ -1143,6 +1265,7 @@ class ListeChoixParGroupes(ListeChoix) :
             de l'entry et frappe <Return>
         """
         if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected])
+
         filtre = self.entry.get()+"*"
         FILTRE = string.upper(filtre)
         #
@@ -1151,20 +1274,21 @@ class ListeChoixParGroupes(ListeChoix) :
         #
         for grp in self.liste_groupes:
             if fnmatch.fnmatch(grp,filtre) or fnmatch.fnmatch(grp,FILTRE) :
-                index = self.MCbox.index(self.dico_labels[grp])
+                cmd=self.dict_groupes[grp][0]
+                label=self.dico_labels[cmd]
+                index = self.MCbox.index(label)
                 self.MCbox.see(index)
-                # On ne selectionne pas le groupe
-                #self.arg_selected = grp
+                self.selectitem(cmd,label,self.selection[2])
                 # On a trouve un groupe on arrete la recherche
                 return
 
         for grp in self.liste_groupes:
            for cmd in self.dict_groupes[grp] :
               if fnmatch.fnmatch(cmd,filtre) or fnmatch.fnmatch(cmd,FILTRE) :
-                 self.highlightitem(self.dico_labels[cmd])
-                 index = self.MCbox.index(self.dico_labels[cmd])
+                 label=self.dico_labels[cmd]
+                 index = self.MCbox.index(label)
                  self.MCbox.see(index)
-                 self.arg_selected = cmd
+                 self.selectitem(cmd,label,self.selection[2])
                  # On a trouve une commande  on arrete la recherche
                  return