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 if len(l_valeurs) > 0 :
131 liste_marque=l_valeurs[-1]
132 self.Liste_valeurs.surligne(liste_marque)
133 # boutons Accepter et Annuler
134 bouton_accepter = Button(self.frame_boutons,
136 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
137 bouton_annuler = Button(self.frame_boutons,
139 command = self.annule_modifs_valeur)
140 for but in (bouton_accepter,bouton_annuler):
141 but.pack(side='left',padx=5)
143 def affiche_parametre(self) :
144 if self.node.item.get_liste_param_possible() != [ ]:
146 for param in self.node.item.get_liste_param_possible():
147 txtparam=txtparam+repr(param)+"\n"
149 showerror("Aucun parametre ","Pas de parametre de ce type")
152 self.self.fenetreparam.destroy()
155 self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
157 def valid_valeur(self):
158 self.add_valeur_plusieurs_base()
160 def add_valeur_plusieurs_base(self,name=None):
164 valeur,validite,commentaire=self.get_valeur()
166 self.parent.appli.affiche_infos(commentaire)
169 encorevalide=self.node.item.valide_item(valeur)
171 listecourante=self.Liste_valeurs.get_liste()
172 encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
173 if not encorevalide : encorevalide = -1
174 self.add_valeur_sans_into(valeur,encorevalide)
176 def select_in_file(self):
177 """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
178 nom_fichier = askopenfilename(title="Choix fichier :")
184 f = open(nom_fichier, "rb")
185 selection_texte = f.read()
187 self.ajout_valeurs = FenetreDeSelection(self,
190 titre="Sélection de valeurs",
191 texte=selection_texte)
193 traceback.print_exc()
194 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
196 def get_bulle_aide(self):
198 Retourne l'aide associée au panneau courant
200 return """Taper dans la boîte de saisie de droite la valeur que
201 vous voulez affecter au mot-clé simple.
202 - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
203 dans la liste des valeurs que vous voulez affecter au mot-clé simple
204 - Un clic sur une valeur de la liste la sélectionne
205 - Un clic sur la flèche droite ou un double-clic retire la valeur
206 sélectionnée de la liste
207 - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
209 - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
210 depuis le dernier clic sur 'Valider'"""
214 Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
215 que saisit l'utilisateur
218 mc = self.node.item.get_definition()
219 d_aides = { 'TXM' : 'chaînes de caractères',
224 if not d_aides.has_key(type) : return 'Type de base inconnu'
226 commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
228 commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
230 aideval=self.node.item.aide()
231 commentaire=commentaire +"\n"+aideval
234 def make_entry(self,frame,command):
236 Crée l'entry de saisie de la valeur souhaitée : distingue le
237 cas d'un complexe attendu, d'une autre valeur quelconque
239 if self.node.item.wait_complex():
240 self.typ_cplx=StringVar()
241 self.typ_cplx.set('RI')
242 rb1 = Radiobutton(frame, text='RI',variable=self.typ_cplx,value='RI')
243 rb2 = Radiobutton(frame, text='MP',variable=self.typ_cplx,value='MP')
244 self.entry1 = Pmw.EntryField(frame,validate='real')
245 self.entry2 = Pmw.EntryField(frame,validate='real')
246 rb1.place(relx=0.05,rely = 0.4)
247 rb2.place(relx=0.05,rely = 0.6)
248 self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus)
249 self.entry2.component('entry').bind("<Return>",lambda e,c=command:c())
250 self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
251 self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
254 self.entry = Entry(frame,relief='sunken')
255 self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
256 self.entry.bind("<Return>",lambda e,c=command:c())
259 def get_valeur(self):
261 Retourne la valeur saisie par l'utilisateur dans self.entry
263 if hasattr(self,'entry'):
264 # Traitement d'une entree unique
265 valeurentree = self.entry.get()
266 valeur,validite=self.node.item.eval_valeur(valeurentree)
268 commentaire = "impossible d'évaluer : %s " %`valeurentree`
271 return valeur,validite,commentaire
273 # Traitement d'une entree de type complexe
275 valeur= (self.typ_cplx.get(),
276 string.atof(self.entry1.get()),
277 string.atof(self.entry2.get()))
280 #traceback.print_exc()
281 return None,0,"impossible d'évaluer la valeur d'entree"
283 def erase_valeur(self):
285 Efface la valeur donnée par l'utilisateur dans l'entry
287 if hasattr(self,'entry'):
288 self.entry.delete(0,END)
290 self.typ_cplx.set('RI')
291 self.entry1.delete(0,END)
292 self.entry2.delete(0,END)
295 def display_valeur(self,val=None):
297 Affiche la valeur passée en argument dans l'entry de saisie.
298 Par défaut affiche la valeur du mot-clé simple
301 valeur = self.node.item.object.getval()
304 if not valeur : return
306 if hasattr(self,'entry'):
307 # Traitement d'une entree unique
308 self.entry.delete(0,END)
309 self.entry.insert(0,str(valeur))
311 # Traitement d'une entree de type complexe
312 typ_cplx,x1,x2=valeur
313 self.entry1.delete(0,END)
314 self.entry2.delete(0,END)
315 self.typ_cplx.set(typ_cplx)
316 self.entry1.setentry(x1)
317 self.entry2.setentry(x2)