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