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
38 from Noyau.N_CR import justify_text
39 from utils import substract_list
40 from plusieurspanel import PLUSIEURS_Panel
44 class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
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,...
51 def makeValeurPage(self,page):
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
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()
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.)
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)
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)")
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)
102 # Création d'un bouton "Importer ..." sur le panel.
103 bouton_valeurs_fichier = Button(self.frame_choix,
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
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,
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,
130 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
131 bouton_annuler = Button(self.frame_boutons,
133 command = self.annule_modifs_valeur)
134 for but in (bouton_accepter,bouton_annuler):
135 but.pack(side='left',padx=5)
137 def add_valeur_plusieurs_base(self,name=None):
141 valeur,validite,commentaire=self.get_valeur()
143 self.parent.appli.affiche_infos(commentaire)
146 encorevalide=self.node.item.valide_item(valeur)
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)
153 def select_in_file(self):
154 """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
155 nom_fichier = askopenfilename(title="Choix fichier :")
161 f = open(nom_fichier, "rb")
162 selection_texte = f.read()
164 self.ajout_valeurs = FenetreDeSelection(self,
167 titre="Sélection de valeurs",
168 texte=selection_texte)
170 traceback.print_exc()
171 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
173 def get_bulle_aide(self):
175 Retourne l'aide associée au panneau courant
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
186 - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
187 depuis le dernier clic sur 'Valider'"""
191 Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
192 que saisit l'utilisateur
195 mc = self.node.item.get_definition()
196 d_aides = { 'TXM' : 'chaînes de caractères',
201 if not d_aides.has_key(type) : return 'Type de base inconnu'
203 commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
205 commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
207 aideval=self.node.item.aide()
208 commentaire=commentaire +"\n"+aideval
211 def make_entry(self,frame,command):
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
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)
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())
236 def get_valeur(self):
238 Retourne la valeur saisie par l'utilisateur dans self.entry
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)
245 commentaire = "impossible d'évaluer : %s " %`valeurentree`
248 return valeur,validite,commentaire
250 # Traitement d'une entree de type complexe
252 valeur= (self.typ_cplx.get(),
253 string.atof(self.entry1.get()),
254 string.atof(self.entry2.get()))
257 #traceback.print_exc()
258 return None,0,"impossible d'évaluer la valeur d'entree"
260 def erase_valeur(self):
262 Efface la valeur donnée par l'utilisateur dans l'entry
264 if hasattr(self,'entry'):
265 self.entry.delete(0,END)
267 self.typ_cplx.set('RI')
268 self.entry1.delete(0,END)
269 self.entry2.delete(0,END)
272 def display_valeur(self,val=None):
274 Affiche la valeur passée en argument dans l'entry de saisie.
275 Par défaut affiche la valeur du mot-clé simple
278 valeur = self.node.item.object.getval()
281 if not valeur : return
283 if hasattr(self,'entry'):
284 # Traitement d'une entree unique
285 self.entry.delete(0,END)
286 self.entry.insert(0,str(valeur))
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)