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.
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.
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.
20 # ======================================================================
22 import string,types,os
25 from copy import copy,deepcopy
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
39 from Noyau.N_CR import justify_text
40 from utils import substract_list
41 from plusieurspanel import PLUSIEURS_Panel
45 class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
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,...
52 def makeValeurPage(self,page):
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
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()
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.)
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)
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)")
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)
103 # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
104 bouton_valeurs_fichier = Button(self.frame_choix,
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
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,
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,
133 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
134 bouton_annuler = Button(self.frame_boutons,
136 command = self.annule_modifs_valeur)
137 for but in (bouton_accepter,bouton_annuler):
138 but.pack(side='left',padx=5)
140 def affiche_parametre(self) :
141 if self.node.item.get_liste_param_possible() != [ ]:
143 for param in self.node.item.get_liste_param_possible():
144 txtparam=txtparam+repr(param)+"\n"
146 showerror("Aucun parametre ","Pas de parametre de ce type")
149 self.self.fenetreparam.destroy()
152 self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
155 def add_valeur_plusieurs_base(self,name=None):
159 valeur,validite,commentaire=self.get_valeur()
161 self.parent.appli.affiche_infos(commentaire)
164 encorevalide=self.node.item.valide_item(valeur)
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)
171 def select_in_file(self):
172 """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
173 nom_fichier = askopenfilename(title="Choix fichier :")
179 f = open(nom_fichier, "rb")
180 selection_texte = f.read()
182 self.ajout_valeurs = FenetreDeSelection(self,
185 titre="Sélection de valeurs",
186 texte=selection_texte)
188 traceback.print_exc()
189 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
191 def get_bulle_aide(self):
193 Retourne l'aide associée au panneau courant
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
204 - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
205 depuis le dernier clic sur 'Valider'"""
209 Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
210 que saisit l'utilisateur
213 mc = self.node.item.get_definition()
214 d_aides = { 'TXM' : 'chaînes de caractères',
219 if not d_aides.has_key(type) : return 'Type de base inconnu'
221 commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
223 commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
225 aideval=self.node.item.aide()
226 commentaire=commentaire +"\n"+aideval
229 def make_entry(self,frame,command):
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
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)
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())
254 def get_valeur(self):
256 Retourne la valeur saisie par l'utilisateur dans self.entry
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)
263 commentaire = "impossible d'évaluer : %s " %`valeurentree`
266 return valeur,validite,commentaire
268 # Traitement d'une entree de type complexe
270 valeur= (self.typ_cplx.get(),
271 string.atof(self.entry1.get()),
272 string.atof(self.entry2.get()))
275 #traceback.print_exc()
276 return None,0,"impossible d'évaluer la valeur d'entree"
278 def erase_valeur(self):
280 Efface la valeur donnée par l'utilisateur dans l'entry
282 if hasattr(self,'entry'):
283 self.entry.delete(0,END)
285 self.typ_cplx.set('RI')
286 self.entry1.delete(0,END)
287 self.entry2.delete(0,END)
290 def display_valeur(self,val=None):
292 Affiche la valeur passée en argument dans l'entry de saisie.
293 Par défaut affiche la valeur du mot-clé simple
296 valeur = self.node.item.object.getval()
299 if not valeur : return
301 if hasattr(self,'entry'):
302 # Traitement d'une entree unique
303 self.entry.delete(0,END)
304 self.entry.insert(0,str(valeur))
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)