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.
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.
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.
19 # ======================================================================
21 import string,types,os
24 from copy import copy,deepcopy
32 from widgets import showinfo
33 from widgets import askopenfilename
34 from widgets import ListeChoix
35 from widgets import FenetreDeSelection
37 from Noyau.N_CR import justify_text
38 from utils import substract_list
39 from plusieurspanel import PLUSIEURS_Panel
43 class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
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,...
50 def makeValeurPage(self,page):
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
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()
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.)
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)
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)")
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)
101 # Création d'un bouton "Importer ..." sur le panel.
102 bouton_valeurs_fichier = Button(self.frame_choix,
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
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,
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,
129 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
130 bouton_annuler = Button(self.frame_boutons,
132 command = self.annule_modifs_valeur)
133 for but in (bouton_accepter,bouton_annuler):
134 but.pack(side='left',padx=5)
136 def add_valeur_plusieurs_base(self,name=None):
140 valeur,validite,commentaire=self.get_valeur()
142 self.parent.appli.affiche_infos(commentaire)
145 encorevalide=self.node.item.valide_item(valeur)
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)
152 def select_in_file(self):
153 """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
154 nom_fichier = askopenfilename(title="Choix fichier :")
160 f = open(nom_fichier, "rb")
161 selection_texte = f.read()
163 self.ajout_valeurs = FenetreDeSelection(self,
166 titre="Sélection de valeurs",
167 texte=selection_texte)
169 traceback.print_exc()
170 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
172 def get_bulle_aide(self):
174 Retourne l'aide associée au panneau courant
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
185 - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
186 depuis le dernier clic sur 'Valider'"""
190 Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
191 que saisit l'utilisateur
194 mc = self.node.item.get_definition()
195 d_aides = { 'TXM' : 'chaînes de caractères',
200 if not d_aides.has_key(type) : return 'Type de base inconnu'
202 commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
204 commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
206 aideval=self.node.item.aide()
207 commentaire=commentaire +"\n"+aideval
210 def make_entry(self,frame,command):
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
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)
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())
235 def get_valeur(self):
237 Retourne la valeur saisie par l'utilisateur dans self.entry
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)
244 commentaire = "impossible d'évaluer : %s " %`valeurentree`
247 return valeur,validite,commentaire
249 # Traitement d'une entree de type complexe
251 valeur= (self.typ_cplx.get(),
252 string.atof(self.entry1.get()),
253 string.atof(self.entry2.get()))
256 #traceback.print_exc()
257 return None,0,"impossible d'évaluer la valeur d'entree"
259 def erase_valeur(self):
261 Efface la valeur donnée par l'utilisateur dans l'entry
263 if hasattr(self,'entry'):
264 self.entry.delete(0,END)
266 self.typ_cplx.set('RI')
267 self.entry1.delete(0,END)
268 self.entry2.delete(0,END)
271 def display_valeur(self,val=None):
273 Affiche la valeur passée en argument dans l'entry de saisie.
274 Par défaut affiche la valeur du mot-clé simple
277 valeur = self.node.item.object.getval()
280 if not valeur : return
282 if hasattr(self,'entry'):
283 # Traitement d'une entree unique
284 self.entry.delete(0,END)
285 self.entry.insert(0,str(valeur))
287 # Traitement d'une entree de type complexe
288 typ_cplx,x1,x2=valeur
289 self.entry1.delete(0,END)
290 self.entry2.delete(0,END)
291 self.typ_cplx.set(typ_cplx)
292 self.entry1.setentry(x1)
293 self.entry2.setentry(x2)