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