Salome HOME
PN : changement version Aster
[tools/eficas.git] / Editeur / uniquesdcopanel.py
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21 # Modules Python
22 import string,types,os
23 from Tkinter import *
24 import Pmw
25 from copy import copy,deepcopy
26 import traceback
27
28 # Modules Eficas
29 import Objecttreeitem
30 import prefs
31 import panels
32 import images
33 from widgets import ListeChoix
34 from widgets import FenetreDeSelection
35
36 from Noyau.N_CR import justify_text
37 from utils import substract_list
38
39 # Import des panels
40 from uniqueassdpanel import UNIQUE_ASSD_Panel
41
42
43 class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
44   """
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)
48   """
49   def makeValeurPage(self,page):
50       """
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é
52       d'ASSD
53       """
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()
57       aide=self.get_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,
67                                          items=liste_noms_sd,
68                                          labelpos='n',
69                                          label_text="Structures de données du type\n requis par l'objet courant :",
70                                          listbox_height = 6,
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,
88                         text = aide,
89                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
90                         justify='center')
91       self.aide.place(relx=0.5,rely=0.85,anchor='n')
92       # affichage de la valeur courante
93       self.display_valeur()
94       
95   def get_bulle_aide(self):
96       """
97       Retourne la bulle d'aide du panneau
98       """
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"""
102
103   def valid_valeur(self):
104       """
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
108       """
109       if self.parent.modified == 'n' : self.parent.init_modif()
110       valeur = self.get_valeur()
111       self.erase_valeur()
112       anc_val = self.node.item.get_valeur()
113       test_CO=self.node.item.is_CO(anc_val)
114       test = self.node.item.set_valeur(valeur)
115       if not test :
116           mess = "impossible d'évaluer : %s " %`valeur`
117           self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
118           return
119       elif self.node.item.isvalid() :
120           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
121           if test_CO:
122              # il faut egalement propager la destruction de l'ancien concept
123              self.node.item.delete_valeur_co(valeur=anc_val)
124              # et on force le recalcul des concepts de sortie de l'etape
125              self.node.item.object.etape.get_type_produit(force=1)
126              # et le recalcul du contexte
127              self.node.item.object.etape.parent.reset_context()
128           self.node.parent.select()
129       else :
130           cr = self.node.item.get_cr()
131           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
132           self.reset_old_valeur(anc_val,mess=mess)
133           return
134       if self.node.item.get_position()=='global':
135           self.node.etape.verif_all()
136       elif self.node.item.get_position()=='global_jdc':
137           self.node.racine.verif_all()
138       else :
139           self.node.parent.verif()
140       self.node.update()
141
142   def valid_nom_concept_co(self,event=None):
143       """
144       Lit le nom donné par l'utilisateur au concept de type CO qui doit être
145       la valeur du MCS courant et stocke cette valeur
146       """
147       if self.parent.modified == 'n' : self.parent.init_modif()
148       anc_val = self.node.item.get_valeur()
149       nom_concept = self.entry_co.get()
150       test,mess=self.node.item.set_valeur_co(nom_concept)
151       if not test:
152           # On n'a pas pu créer le concept
153           self.parent.appli.affiche_infos(mess)
154           return
155       elif self.node.item.isvalid() :
156           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
157           self.node.parent.select()
158       else :
159           cr = self.node.item.get_cr()
160           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
161           self.reset_old_valeur(anc_val,mess=mess)
162           return
163       if self.node.item.get_position()=='global':
164           self.node.etape.verif_all()
165       elif self.node.item.get_position()=='global_jdc':
166           self.node.racine.verif_all()
167       else :
168           self.node.parent.verif()
169       if self.node.item.isvalid():
170           self.node.parent.select()
171       self.node.update()
172
173   def ask_new_concept(self):
174       """
175       Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
176       permettre à l'utilisateur de donner le nom du nouveau concept
177       """
178       new_concept = self.b_co.getcurselection()
179       if new_concept == 'OUI':
180           self.label_co.place(relx=0.05,rely=0.7)
181           self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
182           self.l_resu.place_forget()
183           self.label_valeur.place_forget()
184           self.entry_co.focus()
185       elif new_concept == 'NON':
186           # On est passe de OUI à NON, on supprime la valeur
187 # PN correction de bug (on passe de non a non et cela supprime la valeur)
188 # ajout du if de le ligne suivane
189           if self.node.item.is_CO():
190                 self.node.item.delete_valeur_co()
191                 self.record_valeur(name=None,mess="Suppression CO enregistrée")
192                 self.label_co.place_forget()
193                 self.entry_co.place_forget()
194                 self.l_resu.place(relx=0.05,rely=0.7)
195                 self.label_valeur.place(relx=0.45,rely=0.7)
196           
197   def display_valeur(self):
198       """
199       Affiche la valeur de l'objet pointé par self
200       """
201       valeur = self.node.item.get_valeur()
202       if valeur == None or valeur == '': 
203          self.valeur_choisie.set('')
204          return # pas de valeur à afficher ...
205       # il faut configurer le bouton si la valeur est un objet CO
206       # sinon afficher le nom du concept dans self.valeur_choisie
207       if self.node.item.is_CO():
208           self.b_co.invoke('OUI')
209           self.entry_co.insert(0,valeur.nom)
210       else:
211           self.valeur_choisie.set(valeur.nom)
212
213   def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
214       """
215       Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
216       """
217       if self.parent.modified == 'n' : self.parent.init_modif()
218       if name != None:
219           valeur =name
220       else :
221           self.entry_co.delete(0,END)
222           valeur= self.entry_co.get()
223       self.node.item.set_valeur_co(valeur)
224       self.parent.appli.affiche_infos(mess)
225       # On met a jour le display dans le panneau
226       self.display_valeur()
227       if self.node.item.get_position()=='global':
228           self.node.etape.verif_all()
229       elif self.node.item.get_position()=='global_jdc':
230           self.node.racine.verif_all()
231       else :
232           self.node.parent.verif()
233       if self.node.item.isvalid():
234           self.node.parent.select()
235       self.node.update()
236
237