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")
148 self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
151 def add_valeur_plusieurs_base(self,name=None):
155 valeur,validite,commentaire=self.get_valeur()
157 self.parent.appli.affiche_infos(commentaire)
160 encorevalide=self.node.item.valide_item(valeur)
162 listecourante=self.Liste_valeurs.get_liste()
163 encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
164 if not encorevalide : encorevalide = -1
165 self.add_valeur_sans_into(valeur,encorevalide)
167 def select_in_file(self):
168 """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
169 nom_fichier = askopenfilename(title="Choix fichier :")
175 f = open(nom_fichier, "rb")
176 selection_texte = f.read()
178 self.ajout_valeurs = FenetreDeSelection(self,
181 titre="Sélection de valeurs",
182 texte=selection_texte)
184 traceback.print_exc()
185 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
187 def get_bulle_aide(self):
189 Retourne l'aide associée au panneau courant
191 return """Taper dans la boîte de saisie de droite la valeur que
192 vous voulez affecter au mot-clé simple.
193 - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
194 dans la liste des valeurs que vous voulez affecter au mot-clé simple
195 - Un clic sur une valeur de la liste la sélectionne
196 - Un clic sur la flèche droite ou un double-clic retire la valeur
197 sélectionnée de la liste
198 - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
200 - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
201 depuis le dernier clic sur 'Valider'"""
205 Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
206 que saisit l'utilisateur
209 mc = self.node.item.get_definition()
210 d_aides = { 'TXM' : 'chaînes de caractères',
215 if not d_aides.has_key(type) : return 'Type de base inconnu'
217 commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
219 commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
221 aideval=self.node.item.aide()
222 commentaire=commentaire +"\n"+aideval
225 def make_entry(self,frame,command):
227 Crée l'entry de saisie de la valeur souhaitée : distingue le
228 cas d'un complexe attendu, d'une autre valeur quelconque
230 if self.node.item.wait_complex():
231 self.typ_cplx=StringVar()
232 self.typ_cplx.set('RI')
233 rb1 = Radiobutton(frame, text='RI',variable=self.typ_cplx,value='RI')
234 rb2 = Radiobutton(frame, text='MP',variable=self.typ_cplx,value='MP')
235 self.entry1 = Pmw.EntryField(frame,validate='real')
236 self.entry2 = Pmw.EntryField(frame,validate='real')
237 rb1.place(relx=0.05,rely = 0.4)
238 rb2.place(relx=0.05,rely = 0.6)
239 self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus)
240 self.entry2.component('entry').bind("<Return>",lambda e,c=command:c())
241 self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
242 self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
245 self.entry = Entry(frame,relief='sunken')
246 self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
247 self.entry.bind("<Return>",lambda e,c=command:c())
250 def get_valeur(self):
252 Retourne la valeur saisie par l'utilisateur dans self.entry
254 if hasattr(self,'entry'):
255 # Traitement d'une entree unique
256 valeurentree = self.entry.get()
257 valeur,validite=self.node.item.eval_valeur(valeurentree)
259 commentaire = "impossible d'évaluer : %s " %`valeurentree`
262 return valeur,validite,commentaire
264 # Traitement d'une entree de type complexe
266 valeur= (self.typ_cplx.get(),
267 string.atof(self.entry1.get()),
268 string.atof(self.entry2.get()))
271 #traceback.print_exc()
272 return None,0,"impossible d'évaluer la valeur d'entree"
274 def erase_valeur(self):
276 Efface la valeur donnée par l'utilisateur dans l'entry
278 if hasattr(self,'entry'):
279 self.entry.delete(0,END)
281 self.typ_cplx.set('RI')
282 self.entry1.delete(0,END)
283 self.entry2.delete(0,END)
286 def display_valeur(self,val=None):
288 Affiche la valeur passée en argument dans l'entry de saisie.
289 Par défaut affiche la valeur du mot-clé simple
292 valeur = self.node.item.object.getval()
295 if not valeur : return
297 if hasattr(self,'entry'):
298 # Traitement d'une entree unique
299 self.entry.delete(0,END)
300 self.entry.insert(0,str(valeur))
302 # Traitement d'une entree de type complexe
303 typ_cplx,x1,x2=valeur
304 self.entry1.delete(0,END)
305 self.entry2.delete(0,END)
306 self.typ_cplx.set(typ_cplx)
307 self.entry1.setentry(x1)
308 self.entry2.setentry(x2)