Salome HOME
PN bug notation scientifique
[tools/eficas.git] / Editeur / widgets.py
index 1d648f27f6cdc1731ea54d5b82eafa150227b626..30cabe747566be78ea628ca33bea2c57554fe2fc 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -22,6 +23,7 @@
 #          EFICAS
 # ----------------------------------------------------------
 
+import Tkinter
 from Tkinter import *
 import Pmw
 import os,sys,re,string
@@ -35,6 +37,19 @@ from utils import save_in_file
 from centerwindow import centerwindow
 
 from Noyau.N_utils import repr_float
+from Accas import AsException
+
+# Surcharge de la fonction askyesno qui retourne un resultat errone en Python 2.3 avec Tk 8.4
+# et Tkinter.wantobject==1
+import tkMessageBox
+def askyesno(title=None, message=None, **options):
+    "Ask a question; return true if the answer is yes"
+    s = tkMessageBox._show(title, message, tkMessageBox.QUESTION, tkMessageBox.YESNO, **options)
+    if s == tkMessageBox.YES:return 1
+    if s == tkMessageBox.NO:return 0
+    if s:return 1
+    return 0
+
     
 class Fenetre :
     """ Cette classe permet de créer une fenêtre Toplevel dans laquelle
@@ -114,7 +129,7 @@ class Fenetre :
                                #initialdir = self.appli.CONFIGURATION.rep_user,
                                initialdir = self.appli.CONFIGURATION.initialdir,
                                title="Sauvegarde du "+self.titre)
-        if file != '':
+        if file :
             if not save_in_file(file,self.texte) :
                 showerror("Sauvegarde impossible",
                        "Impossible de sauvegarder le texte dans le fichier spécifié\n"+
@@ -122,6 +137,12 @@ class Fenetre :
             else:
                 showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file)
 
+    def destroy(self):
+        try :
+          self.fenetre.destroy()
+       except :
+          pass
+
 class FenetreYesNo(Fenetre):
     def __init__(self,appli,titre="",texte="",yes="Yes",no="No"):
         self.appli=appli
@@ -170,8 +191,14 @@ class FenetreDeSelection(Fenetre):
     """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée.
         Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.
     """
-    def __init__(self,panel,item,appli,titre="",texte=""):
+    def __init__(self,panel,item,appli,titre="",texte="",cardinal=1):
         Fenetre.__init__(self,appli,titre=titre,texte=texte)
+       self.frame_boutons.place_forget()
+        self.frame_texte.place_forget()
+        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.8)
+        self.frame_boutons.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
+
+        self.cardinal=cardinal
         self.fenetre.configure(width = 320,height=400)
         centerwindow(self.fenetre)
         self.panel = panel
@@ -179,7 +206,7 @@ class FenetreDeSelection(Fenetre):
         self.fenetre.title(titre)
         self.but_save.configure(text="Ajouter",command=self.traite_selection)
         # séparateur par défaut
-        self.separateur = ";"
+        self.separateur = ';'
         # création de la zone de saisie du séparateur
         l_separateurs_autorises = self.get_separateurs_autorises()
         self.choix_sep = Pmw.ComboBox(self.frame_boutons,
@@ -194,8 +221,12 @@ class FenetreDeSelection(Fenetre):
         # Replacement
         self.but_quit.place_forget()
         self.but_save.place_forget()
-        self.but_save.place(relx=0.6,rely=0.5,anchor='center')
-        self.but_quit.place(relx=0.8,rely=0.5,anchor='center')
+       self.but_all  = Button(self.frame_boutons,text = "Tout Sélectionner", command=self.tout)
+        self.but_save.place(relx=0.6,rely=0.6,anchor='center')
+        self.but_quit.place(relx=0.8,rely=0.6,anchor='center')
+        self.but_all.place(relx=0.7,rely=0.2,anchor='center')
+       self.choose_separateur('espace')
+     
 
     def get_separateurs_autorises(self):
         """
@@ -212,12 +243,23 @@ class FenetreDeSelection(Fenetre):
         else:
             self.separateur = nom_sep
         
-    def traite_selection(self):
+    def tout(self):
+        liste=[]
+       texte=self.texte.splitlines()
+       for l in texte :
+           for mot in string.split(l,self.separateur):
+              if mot != '' and mot != ' ' and mot != self.separateur :
+                 liste.append(mot)
+       self.traite_selection(liste)
+
+    def traite_selection(self,liste=None):
         """ Cette méthode effectue tous les traitements nécessaires pour vérifier
             et affecter la liste de valeurs à l'objet réprésenté par self.item
         """
         # Récupère la liste des chaines de caractères de la zone sélectionnée
-        message,liste = self.recupere_liste()
+       message=""
+       if liste == None:
+           message,liste = self.recupere_liste()
         if self.test_probleme(message,"Sélectionnez des données") == 0:
             return
         # Vérifie que le nombre de données est dans les limites attendues
@@ -233,6 +275,24 @@ class FenetreDeSelection(Fenetre):
         if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0:
             return
         # Ajoute les valeurs dans la liste de valeurs du mot-clé
+        if self.cardinal != 1 :
+           nb=self.cardinal
+           l_valeurs=[]
+           # a ameliorer
+           if (len(liste_valeurs)%nb != 0):
+                message="La cardinalité n'est pas correcte"
+                self.test_probleme(message,"On attend des tuples")
+                return
+           for i in range(len(liste_valeurs)/nb) :
+               if (nb==2):
+                   t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1])
+               elif (nb ==3):
+                   t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1], liste_valeurs[i*nb+2])
+               else :
+                  print "probleme : prevenir la maintenance Eficas"
+                  return
+               l_valeurs.append(t)
+           liste_valeurs=l_valeurs
         self.ajouter_valeurs(liste_valeurs)
         self.appli.affiche_infos("Liste de valeurs acceptée")
 
@@ -317,7 +377,7 @@ class FenetreDeSelection(Fenetre):
             éléments dans le type voulu en cas de succès, sinon retourne None.
         """
         liste_valeurs = []
-        message = ""
+       message = ""
         for chaine in liste:
             if f_conversion:
                 try:
@@ -348,6 +408,64 @@ class FenetreDeSelection(Fenetre):
         liste.extend(liste_valeurs)
         self.panel.Liste_valeurs.put_liste(liste)
 
+class FenetreDeParametre(Fenetre) :
+    def __init__(self,parent,item,appli,texte):
+        self.parent=parent
+        self.appli=appli
+        self.fenetre = Toplevel()
+        self.fenetre.configure(width = 250,height=100)
+        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+        self.fenetre.title("Parametres")
+        self.titre = "Parametres"
+        self.texte = string.replace(texte,'\r\n','\n')
+        fonte=fontes.standardcourier10
+
+        # définition des frames
+        self.frame_texte = Frame(self.fenetre)
+        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.7)
+        # 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_v.pack(side='right',fill ='y')
+        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+        # affichage du texte
+        self.affiche_texte(self.texte)
+        self.zone_texte.config(state="disabled")
+
+       # définition des boutons
+       self.frame_boutons = Frame(self.fenetre)
+       self.frame_boutons.place(relheight=0.3,relx=0,rely=0.65,relwidth=1.)
+       self.label1 = Label(self.frame_boutons,text="surligner la")
+       self.label2 = Label(self.frame_boutons,text="ligne entière")
+       self.label1.place(relx=0.1,rely=0)
+       self.label2.place(relx=0.1,rely=0.5)
+       self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
+       self.but_save = Button(self.frame_boutons,text = "Choisir",command = self.Choisir)
+       self.but_save.place(relx=0.6,rely=0,relheight=1)
+       self.but_quit.place(relx=0.8,rely=0,relheight=1)
+
+
+    def Choisir(self):
+        try:
+            selection=self.zone_texte.selection_get()
+        except:
+            showerror("Pas de donnée sélectionnée",
+                       "Selectionner un parametre")
+        l_param = ""
+        for param in selection.splitlines():
+           nomparam=param[0:param.find("=")-1]
+            if nomparam != '' : 
+               l_param=l_param+nomparam+','
+       self.parent.entry.delete(0,Tkinter.END)
+       self.parent.entry.insert(0,l_param[0:-1])
+       self.parent.valid_valeur()
+       self.quit()
+
 class Formulaire:
     """
     Cette classe permet de créer une boîte Dialog dans laquelle
@@ -550,7 +668,7 @@ 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=''):
+    def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',optionReturn=None):
         self.parent = parent
         self.page = page
         self.liste = liste
@@ -562,6 +680,7 @@ class ListeChoix :
         self.active = active
         self.titre = titre
         self.filtre = filtre
+        self.optionReturn = optionReturn
         self.init()
 
     def init(self):        
@@ -598,6 +717,7 @@ class ListeChoix :
         self.MCbox.pack(fill='y',expand=1,padx=2,pady=2)
         self.MCbox.configure(yscrollcommand=self.MCscroll.set)
 
+
     def affiche_liste(self):
         """ Affiche la liste dans la fenêtre"""
         liste_labels=[]
@@ -612,8 +732,23 @@ 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
+              for val in objet:
+                if (not premier):
+                  mot=mot+"," 
+                 else:
+                   premier=0
+                 valtexte = self.parent.get_valeur_texte(val)
+                 if valtexte != "" :
+                    mot=mot+valtexte
+                 else:
+                    mot=mot+str(val)
+              mot=mot+")"
           else:
               mot=`objet`
           label = Label(self.MCbox,
@@ -625,6 +760,9 @@ class ListeChoix :
                                    window=label,
                                    stretch = 1)
           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("<Key-Right>",lambda e,s=self,x=objet,l=label : s.selectNextItem(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))
@@ -639,13 +777,59 @@ class ListeChoix :
         self.MCbox.config(state=DISABLED)
         self.selection = None
 
+    def clear_marque(self):
+        try:
+          self.dico_labels[self.arg_selected].configure(bg='gray95',fg='black')
+          self.arg_selected = ''
+       except :
+         pass
+
+    def surligne(self,marque):
+        try :
+          self.highlightitem(self.dico_labels[marque])
+           self.arg_selected = marque
+       except:
+          pass
+
+    def chooseitemsurligne(self,mot,label,commande):
+        """ Active la méthode de choix passée en argument"""
+        try:
+           mot=self.arg_selected
+           commande(mot)
+        except AsException,e:
+           raison=str(e)
+           showerror(raison.split('\n')[0],raison)
+
     def chooseitem(self,mot,label,commande):
         """ Active la méthode de choix passée en argument"""
-        commande(mot)
+        try:
+           commande(mot)
+        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
+           
         
     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"""
+       self.clear_marque()
         if self.selection != None :
             self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
         self.highlightitem(label)
@@ -667,6 +851,17 @@ class ListeChoix :
         self.arg_selected = ''
         if commande != None : commande(mot)
 
+    def cherche_selected_item(self):
+        index=self.MCbox.index(self.selection[1])
+        lign,col=map(int,string.split(index,'.'))
+        return lign
+
+    def remove_selected_item(self):
+        index=self.MCbox.index(self.selection[1])
+        lign,col=map(int,string.split(index,'.'))
+        del self.liste[lign-1]
+        self.affiche_liste()
+
     def entry_changed(self,event=None):
         """ Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu
         de l'entry et frappe <Return>"""
@@ -680,6 +875,10 @@ class ListeChoix :
                 self.MCbox.see(index)
                 self.arg_selected = arg
                 break
+        try :
+          self.dico_labels[self.arg_selected].focus_set()
+        except :
+          pass
 
     def get_liste_old(self):
         return self.liste
@@ -691,17 +890,17 @@ class ListeChoix :
     def get_liste(self):
         l=[]
         for val in self.liste:
-            try:
-                v = eval(val)
-               l.append(v)
-            except:
+#            try:
+#                v = eval(val)
+#              l.append(v)
+#            except:
                 l.append(val)
         return l
     
     def put_liste(self,liste):
         self.liste = liste
         self.affiche_liste()
-        
+
 class Affichage :
   """ Cette classe permet d'afficher au lancement d'EFICAS le message
       d'attente et la barre de progression"""
@@ -932,6 +1131,7 @@ class ListeChoixParGroupes(ListeChoix) :
                          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))
 
         for marque in self.liste_marques:
            try: