]> SALOME platform Git repositories - tools/eficas.git/blobdiff - Editeur/widgets.py
Salome HOME
PN
[tools/eficas.git] / Editeur / widgets.py
index d03678fa8d5416d368f99965ff6aecef9b95f250..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
 
@@ -82,12 +83,13 @@ 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()
 
@@ -132,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")
@@ -542,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)
@@ -561,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))
@@ -670,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
@@ -683,6 +691,7 @@ class ListeChoix :
         self.titre = titre
         self.filtre = filtre
         self.optionReturn = optionReturn
+       self.fonte_titre=fonte_titre
         self.init()
 
     def init(self):        
@@ -697,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):
@@ -764,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))
@@ -778,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:
@@ -809,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):
@@ -849,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])
@@ -859,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()
@@ -872,11 +903,10 @@ 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.dico_labels[self.arg_selected].focus_set()
+                self.selectitem(arg,label,self.selection[2])
                 break
 
         #try :
@@ -884,9 +914,6 @@ class ListeChoix :
         #except :
           #pass
 
-    def get_liste_BAK(self):
-        raise "OBSOLETE"
-        return self.liste
 
     # PN attention à la gestion des paramétres
     # cela retourne H = 1 , et ni H, ni 1
@@ -1090,7 +1117,7 @@ class ListeChoixParGroupes(ListeChoix) :
 
     """
     def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
-                      active ='oui',filtre='non',titre='',optionReturn=None):
+                      active ='oui',filtre='non',titre='',optionReturn=None,fonte_titre=fontes.standard_gras_souligne):
         self.parent = parent
         self.page = page
         self.liste_groupes = liste_groupes
@@ -1104,6 +1131,7 @@ class ListeChoixParGroupes(ListeChoix) :
         self.titre = titre
         self.filtre = filtre
         self.optionReturn = optionReturn
+        self.fonte_titre=fonte_titre
         self.init()
 
     def affiche_liste(self):
@@ -1146,6 +1174,7 @@ class ListeChoixParGroupes(ListeChoix) :
                   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))
@@ -1161,6 +1190,8 @@ class ListeChoixParGroupes(ListeChoix) :
                          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>":
@@ -1180,6 +1211,11 @@ 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)
@@ -1195,19 +1231,12 @@ class ListeChoixParGroupes(ListeChoix) :
            else:
               # debut des groupes. On ne fait rien
               return
-
         # On a trouve l'item precedent
-        self.clear_marque()
         labelsuivant=self.dico_labels[co]
-        if self.selection != None :
-           self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
-           self.selection = (co,labelsuivant,self.selection[2])
         index = self.MCbox.index(labelsuivant)
         self.MCbox.see(index)
-        self.arg_selected=co
-        self.highlightitem(labelsuivant)
-        labelsuivant.focus_set()
-        callback(co)
+        self.selectthis(co,labelsuivant,self.selection[2],)
+        self.dontselect=1
 
     def selectNextItem(self,mot,label,callback,group,cmd):
         g=self.liste_groupes.index(group)
@@ -1224,17 +1253,11 @@ class ListeChoixParGroupes(ListeChoix) :
               # fin des groupes. On ne fait rien
               return
         # On a trouve l'item suivant
-        self.clear_marque()
         labelsuivant=self.dico_labels[co]
-        if self.selection != None :
-           self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
-           self.selection = (co,labelsuivant,self.selection[2])
         index = self.MCbox.index(labelsuivant)
         self.MCbox.see(index)
-        self.arg_selected=co
-        self.highlightitem(labelsuivant)
-        labelsuivant.focus_set()
-        callback(co)
+        self.selectthis(co,labelsuivant,self.selection[2],)
+        self.dontselect=1
 
     def entry_changed(self,event=None):
         """ 
@@ -1251,23 +1274,21 @@ class ListeChoixParGroupes(ListeChoix) :
         #
         for grp in self.liste_groupes:
             if fnmatch.fnmatch(grp,filtre) or fnmatch.fnmatch(grp,FILTRE) :
-                self.highlightitem(self.dico_labels[grp])
-                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.dico_labels[grp].focus_set()
+                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.dico_labels[self.arg_selected].focus_set()
+                 self.selectitem(cmd,label,self.selection[2])
                  # On a trouve une commande  on arrete la recherche
                  return