Salome HOME
PN pour afficher 1 seule fenetre de parametres
[tools/eficas.git] / Editeur / plusieursbasepanel.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21 # Modules Python
22 import string,types,os
23 from Tkinter import *
24 import Pmw
25 from copy import copy,deepcopy
26 import traceback
27
28 # Modules Eficas
29 import Objecttreeitem
30 import prefs
31 import panels
32 import images
33 from widgets import showinfo
34 from widgets import askopenfilename
35 from widgets import ListeChoix
36 from widgets import FenetreDeSelection
37 from widgets import FenetreDeParametre
38
39 from Noyau.N_CR import justify_text
40 from utils import substract_list
41 from plusieurspanel import PLUSIEURS_Panel
42
43
44
45 class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
46   """
47   Classe définissant le panel associé aux mots-clés qui demandent
48   à l'utilisateur de donner une liste de valeurs qui ne sont pas
49   à choisir dans une liste discrètes et qui sont de type de base :
50   entier, réel, string,...
51   """
52   def makeValeurPage(self,page):
53       """
54       Crée la page de saisie d'une liste de valeurs à priori quelconques,
55       cad qui ne sont  pas à choisir dans une liste prédéfinie
56       """
57       # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
58       # et la liste des valeurs déjà affectées à l'objet courant
59       bulle_aide=self.get_bulle_aide()
60       objet_mc = self.node.item.get_definition()
61       aide = self.get_aide()
62       aide = justify_text(texte=aide)
63       min,max = self.node.item.GetMinMax()
64       l_valeurs = self.node.item.GetListeValeurs()
65
66       # création des frames globales
67       self.frame1 = Frame(page,relief='groove',bd=2)
68       self.frame2 = Frame(page)
69       self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
70       self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
71       self.frame_right = Frame(self.frame1)
72       self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
73
74       # création des frames internes
75       self.frame_valeurs = Frame(self.frame1)
76       self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
77       self.frame_boutons_fleches = Frame(self.frame_right)
78       self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
79       self.frame_choix = Frame(self.frame_right)
80       self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.8)
81       self.frame_aide = Frame(self.frame_right)
82       self.frame_aide.place(relx=0.1,rely=0.8,relwidth=0.8,relheight=0.2)
83       self.frame_boutons = Frame(self.frame2)
84       self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.3,relheight=1.)
85       for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
86                  self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
87           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
88           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
89
90       # création des objets dans les frames
91       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
92                                  ("<Button-3>",self.deselectValeur),
93                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
94       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
95                                       titre="Valeur(s) actuelle(s)")
96
97       # Création de l'entry ou de la liste des SD
98       # PN : pour ajouter les validators
99       self.label = Label(self.frame_choix,text="Valeur :")
100       self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
101       self.label.place(relx=0.05,rely=0.3)
102
103       # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
104       bouton_valeurs_fichier = Button(self.frame_choix,
105                                       text="Importer",
106                                       command=self.select_in_file)
107       bouton_valeurs_fichier.place(relx=0.28,rely=0.4,relwidth=0.6)
108       bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
109       bouton_parametres.place(relx=0.28,rely=0.6,relwidth=0.6)
110       self.ajout_valeurs = None
111
112       # boutons Ajouter et Supprimer
113       bouton_add = Button(self.frame_boutons_fleches,
114                           image = images.get_image('arrow_left'),
115                           command = self.add_valeur_plusieurs_base)
116       bouton_sup = Button(self.frame_boutons_fleches,
117                           image = images.get_image('arrow_right'),
118                           command = self.sup_valeur_sans_into)
119       bouton_add.place(relx=0.3,rely=0.35)
120       bouton_sup.place(relx=0.3,rely=0.65)
121       # affichage de l'aide
122       self.frame_aide.update()
123       self.aide = Label(self.frame_aide,
124                         text = aide,
125                         justify='center',
126                         anchor='center',
127                         wraplength=int(self.frame_aide.winfo_width()*0.8))
128       self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
129       self.Liste_valeurs.affiche_liste()
130       # boutons Accepter et Annuler
131       bouton_accepter = Button(self.frame_boutons,
132                                text='Valider',
133                                command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
134       bouton_annuler = Button(self.frame_boutons,
135                               text = 'Annuler',
136                               command = self.annule_modifs_valeur)
137       for but in (bouton_accepter,bouton_annuler):
138           but.pack(side='left',padx=5)
139
140   def affiche_parametre(self) :
141       if self.node.item.get_liste_param_possible() != [ ]:
142          txtparam=""
143          for param in self.node.item.get_liste_param_possible():
144             txtparam=txtparam+repr(param)+"\n"
145          if txtparam=="":
146             showerror("Aucun parametre ","Pas de parametre de ce type")
147          else :
148             try :
149                 self.self.fenetreparam.destroy()
150             except:
151                 pass
152             self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
153
154
155   def add_valeur_plusieurs_base(self,name=None):
156       if name != None :
157          valeur = name
158       else:
159          valeur,validite,commentaire=self.get_valeur()
160          if not validite :
161             self.parent.appli.affiche_infos(commentaire)
162             return
163
164       encorevalide=self.node.item.valide_item(valeur)
165       if encorevalide :
166          listecourante=self.Liste_valeurs.get_liste()
167          encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
168          if not encorevalide : encorevalide = -1
169       self.add_valeur_sans_into(valeur,encorevalide)
170     
171   def select_in_file(self):
172       """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
173       nom_fichier = askopenfilename(title="Choix fichier :")
174
175       if not nom_fichier:
176           return
177
178       try:
179           f = open(nom_fichier, "rb")
180           selection_texte = f.read()
181           f.close()
182           self.ajout_valeurs = FenetreDeSelection(self, 
183                                                   self.node.item,
184                                                   self.parent.appli,
185                                                   titre="Sélection de valeurs",
186                                                   texte=selection_texte)
187       except:
188           traceback.print_exc()
189           showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
190           
191   def get_bulle_aide(self):
192       """
193       Retourne l'aide associée au panneau courant
194       """
195       return """Taper dans la boîte de saisie de droite la valeur que
196       vous voulez affecter au mot-clé simple.
197       - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
198       dans la liste des valeurs que vous voulez affecter au mot-clé simple
199       - Un clic sur une valeur de la liste la sélectionne
200       - Un clic sur la flèche droite ou un double-clic retire la valeur
201       sélectionnée de la liste
202       - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
203       au mot-clé simple
204       - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
205       depuis le dernier clic sur 'Valider'"""
206
207   def get_aide(self):
208       """
209       Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
210       que saisit l'utilisateur
211       """
212       commentaire=""
213       mc = self.node.item.get_definition()
214       d_aides = { 'TXM' : 'chaînes de caractères',
215                   'R'   : 'réels',
216                   'I'   : 'entiers',
217                   'C'   : 'complexes'}
218       type = mc.type[0]
219       if not d_aides.has_key(type) : return 'Type de base inconnu'
220       if mc.min == mc.max:
221           commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min`  + " est attendue"
222       else :
223           commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
224
225       aideval=self.node.item.aide()
226       commentaire=commentaire +"\n"+aideval
227       return commentaire
228
229   def make_entry(self,frame,command):
230       """
231       Crée l'entry de saisie de la valeur souhaitée : distingue le
232       cas d'un complexe attendu, d'une autre valeur quelconque
233       """
234       if self.node.item.wait_complex():
235           self.typ_cplx=StringVar()
236           self.typ_cplx.set('RI')
237           rb1 = Radiobutton(frame, text='RI',variable=self.typ_cplx,value='RI')
238           rb2 = Radiobutton(frame, text='MP',variable=self.typ_cplx,value='MP')
239           self.entry1 = Pmw.EntryField(frame,validate='real')
240           self.entry2 = Pmw.EntryField(frame,validate='real')
241           rb1.place(relx=0.05,rely = 0.4)
242           rb2.place(relx=0.05,rely = 0.6)
243           self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus)
244           self.entry2.component('entry').bind("<Return>",lambda e,c=command:c())
245           self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
246           self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
247           self.entry1.focus()
248       else:
249           self.entry = Entry(frame,relief='sunken')
250           self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
251           self.entry.bind("<Return>",lambda e,c=command:c())
252           self.entry.focus()
253
254   def get_valeur(self):
255       """
256       Retourne la valeur saisie par l'utilisateur dans self.entry
257       """
258       if hasattr(self,'entry'):
259          # Traitement d'une entree unique
260          valeurentree = self.entry.get()
261          valeur,validite=self.node.item.eval_valeur(valeurentree)
262          if not validite :
263             commentaire = "impossible d'évaluer : %s " %`valeurentree`
264          else:
265             commentaire = ""
266          return valeur,validite,commentaire
267       else:
268          # Traitement d'une entree de type complexe
269          try:
270             valeur= (self.typ_cplx.get(),
271                      string.atof(self.entry1.get()),
272                      string.atof(self.entry2.get()))
273             return valeur,1,""
274          except:
275             #traceback.print_exc()
276             return None,0,"impossible d'évaluer la valeur d'entree"
277
278   def erase_valeur(self):
279       """
280       Efface la valeur donnée par l'utilisateur dans l'entry
281       """
282       if hasattr(self,'entry'):
283          self.entry.delete(0,END)
284       else:
285          self.typ_cplx.set('RI')
286          self.entry1.delete(0,END)
287          self.entry2.delete(0,END)
288
289         
290   def display_valeur(self,val=None):
291       """
292       Affiche la valeur passée en argument dans l'entry de saisie.
293       Par défaut affiche la valeur du mot-clé simple
294       """
295       if not val :
296           valeur = self.node.item.object.getval()
297       else:
298           valeur = val
299       if not valeur : return
300
301       if hasattr(self,'entry'):
302          # Traitement d'une entree unique
303          self.entry.delete(0,END)
304          self.entry.insert(0,str(valeur))
305       else:
306          # Traitement d'une entree de type complexe
307          typ_cplx,x1,x2=valeur
308          self.entry1.delete(0,END)
309          self.entry2.delete(0,END)
310          self.typ_cplx.set(typ_cplx)
311          self.entry1.setentry(x1)
312          self.entry2.setentry(x2)
313
314