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 ListeChoix
34 from widgets import FenetreDeSelection
36 from Noyau.N_CR import justify_text
37 from utils import substract_list
40 from uniqueassdpanel import UNIQUE_ASSD_Panel
43 class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
45 Classe servant à définir le panneau correspondant à un mot-clé simple
46 qui attend une valeur unique de type dérivé d'ASSD ou non encore
47 existante (type CO(...) utilisé dans les macros uniquement)
49 def makeValeurPage(self,page):
51 Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
54 # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
55 # et de la liste des SD du bon type (constituant la liste des choix)
56 bulle_aide=self.get_bulle_aide()
58 aide= justify_text(texte=aide)
59 liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
60 # Remplissage du panneau
61 self.frame_valeur = Frame(page)
62 self.frame_valeur.pack(fill='both',expand=1)
63 self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
64 self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
65 # affichage de la liste des SD existantes et du bon type
66 self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
69 label_text="Structures de données du type\n requis par l'objet courant :",
71 selectioncommand=self.select_valeur_from_list,
72 dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
73 self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
74 # affichage du bouton 'Nouveau concept'
75 self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ",
76 items = ('NON','OUI'),menubutton_width=10)
77 self.b_co.configure(command = lambda e,s=self : s.ask_new_concept())
78 self.b_co.place(relx=0.05,rely=0.6,anchor='w')
79 self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
80 self.entry_co = Entry(self.frame_valeur)
81 self.entry_co.bind('<Return>',self.valid_nom_concept_co)
82 # affichage du label de la structure de donnée choisie
83 self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
84 self.valeur_choisie = StringVar()
85 self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
86 self.frame_valeur.update()
87 self.aide = Label(self.frame_valeur,
89 wraplength=int(self.frame_valeur.winfo_width()*0.8),
91 self.aide.place(relx=0.5,rely=0.85,anchor='n')
92 # affichage de la valeur courante
95 def get_bulle_aide(self):
97 Retourne la bulle d'aide du panneau
99 return """Double-cliquez sur la structure de donnée désirée
100 pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
101 entrer le nom d'un concept non encore existant"""
103 def valid_valeur(self):
105 Teste si la valeur fournie par l'utilisateur est une valeur permise :
106 - si oui, l'enregistre
107 - si non, restaure l'ancienne valeur
109 if self.parent.modified == 'n' : self.parent.init_modif()
110 valeur = self.get_valeur()
113 anc_val = self.node.item.get_valeur()
114 test_CO=self.node.item.is_CO(anc_val)
115 #PN essai pour bug dans MACRO_PROJ_BASE
116 valeur,validite=self.node.item.eval_valeur(valeur)
117 test = self.node.item.set_valeur(valeur)
119 mess = "impossible d'évaluer : %s " %`valeur`
120 self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
122 #PN essai pour bug dans MACRO_PROJ_BASE
123 #elif self.node.item.isvalid() :
125 self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
127 # il faut egalement propager la destruction de l'ancien concept
128 self.node.item.delete_valeur_co(valeur=anc_val)
129 # et on force le recalcul des concepts de sortie de l'etape
130 self.node.item.object.etape.get_type_produit(force=1)
131 # et le recalcul du contexte
132 self.node.item.object.etape.parent.reset_context()
133 self.node.parent.select()
135 cr = self.node.item.get_cr()
136 mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
137 self.reset_old_valeur(anc_val,mess=mess)
139 if self.node.item.get_position()=='global':
140 self.node.etape.verif_all()
141 elif self.node.item.get_position()=='global_jdc':
142 self.node.racine.verif_all()
144 self.node.parent.verif()
147 def valid_nom_concept_co(self,event=None):
149 Lit le nom donné par l'utilisateur au concept de type CO qui doit être
150 la valeur du MCS courant et stocke cette valeur
152 if self.parent.modified == 'n' : self.parent.init_modif()
153 anc_val = self.node.item.get_valeur()
154 nom_concept = self.entry_co.get()
155 test,mess=self.node.item.set_valeur_co(nom_concept)
157 # On n'a pas pu créer le concept
158 self.parent.appli.affiche_infos(mess)
160 elif self.node.item.isvalid() :
161 self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
162 self.node.parent.select()
164 cr = self.node.item.get_cr()
165 mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
166 self.reset_old_valeur(anc_val,mess=mess)
168 if self.node.item.get_position()=='global':
169 self.node.etape.verif_all()
170 elif self.node.item.get_position()=='global_jdc':
171 self.node.racine.verif_all()
173 self.node.parent.verif()
174 if self.node.item.isvalid():
175 self.node.parent.select()
178 def ask_new_concept(self):
180 Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
181 permettre à l'utilisateur de donner le nom du nouveau concept
183 new_concept = self.b_co.getcurselection()
184 if new_concept == 'OUI':
185 self.label_co.place(relx=0.05,rely=0.7)
186 self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
187 self.l_resu.place_forget()
188 self.label_valeur.place_forget()
189 self.entry_co.focus()
190 elif new_concept == 'NON':
191 # On est passe de OUI à NON, on supprime la valeur
192 # PN correction de bug (on passe de non a non et cela supprime la valeur)
193 # ajout du if de le ligne suivane
194 if self.node.item.is_CO():
195 self.node.item.delete_valeur_co()
196 self.record_valeur(name=None,mess="Suppression CO enregistrée")
197 self.label_co.place_forget()
198 self.entry_co.place_forget()
199 self.l_resu.place(relx=0.05,rely=0.7)
200 self.label_valeur.place(relx=0.45,rely=0.7)
202 def display_valeur(self):
204 Affiche la valeur de l'objet pointé par self
206 valeur = self.node.item.get_valeur()
207 if valeur == None or valeur == '':
208 self.valeur_choisie.set('')
209 return # pas de valeur à afficher ...
210 # il faut configurer le bouton si la valeur est un objet CO
211 # sinon afficher le nom du concept dans self.valeur_choisie
212 if self.node.item.is_CO():
213 self.b_co.invoke('OUI')
214 self.entry_co.insert(0,valeur.nom)
216 self.valeur_choisie.set(valeur.nom)
218 def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
220 Enregistre val comme valeur de self.node.item.object SANS faire de test de validité
222 if self.parent.modified == 'n' : self.parent.init_modif()
226 self.entry_co.delete(0,END)
227 valeur= self.entry_co.get()
228 self.node.item.set_valeur_co(valeur)
229 self.parent.appli.affiche_infos(mess)
230 # On met a jour le display dans le panneau
231 self.display_valeur()
232 if self.node.item.get_position()=='global':
233 self.node.etape.verif_all()
234 elif self.node.item.get_position()=='global_jdc':
235 self.node.racine.verif_all()
237 self.node.parent.verif()
238 if self.node.item.isvalid():
239 self.node.parent.select()