Salome HOME
PN
[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       if liste_noms_sd != [] :
74          self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
75          self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('NON','OUI'),menubutton_width=10)
76       else :
77          self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('OUI','OUI'),menubutton_width=10)
78       # affichage du bouton 'Nouveau concept'
79       self.b_co.configure(command = lambda e,s=self : s.ask_new_concept())
80       if liste_noms_sd != [] :
81          self.b_co.place(relx=0.05,rely=0.6,anchor='w')
82       else :
83          self.b_co.place(relx=0.05,rely=0.3,anchor='w')
84       self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
85       self.entry_co = Entry(self.frame_valeur)
86       self.entry_co.bind('<Return>',self.valid_nom_concept_co)
87       self.entry_co.bind('<KP_Enter>',self.valid_nom_concept_co)
88       # affichage du label de la structure de donnée choisie
89       self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
90       self.valeur_choisie = StringVar()
91       self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
92       self.frame_valeur.update()
93       self.aide = Label(self.frame_valeur,
94                         text = aide,
95                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
96                         justify='center')
97       self.aide.place(relx=0.5,rely=0.85,anchor='n')
98       # affichage de la valeur courante
99       self.display_valeur()
100       if liste_noms_sd == [] :
101           self.b_co.invoke('OUI')
102       
103   def get_bulle_aide(self):
104       """
105       Retourne la bulle d'aide du panneau
106       """
107       return """Double-cliquez sur la structure de donnée désirée
108       pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
109       entrer le nom d'un concept non encore existant"""
110
111   def valid_valeur(self):
112       """
113       Teste si la valeur fournie par l'utilisateur est une valeur permise :
114       - si oui, l'enregistre
115       - si non, restaure l'ancienne valeur
116       """
117       if self.parent.modified == 'n' : self.parent.init_modif()
118       valeur = self.get_valeur()
119       #print "valid_valeur",valeur
120
121       self.erase_valeur()
122       anc_val = self.node.item.get_valeur()
123       test_CO=self.node.item.is_CO(anc_val)
124       #PN essai pour bug dans MACRO_PROJ_BASE 
125       valeur,validite=self.node.item.eval_valeur(valeur)
126       test = self.node.item.set_valeur(valeur)
127       if not test :
128           mess = "impossible d'évaluer : %s " %`valeur`
129           self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
130           return
131       #PN essai pour bug dans MACRO_PROJ_BASE 
132       #elif self.node.item.isvalid() :
133       elif validite: 
134           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
135           if test_CO:
136              # il faut egalement propager la destruction de l'ancien concept
137              self.node.item.delete_valeur_co(valeur=anc_val)
138              # et on force le recalcul des concepts de sortie de l'etape
139              self.node.item.object.etape.get_type_produit(force=1)
140              # et le recalcul du contexte
141              self.node.item.object.etape.parent.reset_context()
142           self.node.parent.select()
143       else :
144           cr = self.node.item.get_cr()
145           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
146           self.reset_old_valeur(anc_val,mess=mess)
147           return
148       #if self.node.item.get_position()=='global':
149           #self.node.etape.verif_all()
150       #elif self.node.item.get_position()=='global_jdc':
151           #self.node.racine.verif_all()
152       #else :
153           #self.node.parent.verif()
154       #self.node.update()
155
156   def valid_nom_concept_co(self,event=None):
157       """
158       Lit le nom donné par l'utilisateur au concept de type CO qui doit être
159       la valeur du MCS courant et stocke cette valeur
160       """
161       #print "valid_nom_concept_co"
162       if self.parent.modified == 'n' : self.parent.init_modif()
163       anc_val = self.node.item.get_valeur()
164       if anc_val != None:
165           # il faut egalement propager la destruction de l'ancien concept
166           self.node.item.delete_valeur_co(valeur=anc_val)
167           # et on force le recalcul des concepts de sortie de l'etape
168           self.node.item.object.etape.get_type_produit(force=1)
169           # et le recalcul du contexte
170           self.node.item.object.etape.parent.reset_context()
171       nom_concept = self.entry_co.get()
172       #print "valid_nom_concept_co",nom_concept
173       test,mess=self.node.item.set_valeur_co(nom_concept)
174       if not test:
175           # On n'a pas pu créer le concept
176           self.parent.appli.affiche_infos(mess)
177           return
178       elif self.node.item.isvalid() :
179           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
180           self.node.parent.select()
181       else :
182           cr = self.node.item.get_cr()
183           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
184           self.reset_old_valeur(anc_val,mess=mess)
185           return
186       #if self.node.item.get_position()=='global':
187           #self.node.etape.verif_all()
188       #elif self.node.item.get_position()=='global_jdc':
189           #self.node.racine.verif_all()
190       #else :
191           #self.node.parent.verif()
192       #if self.node.item.isvalid():
193           #self.node.parent.select()
194       #self.node.update()
195
196   def ask_new_concept(self):
197       """
198       Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
199       permettre à l'utilisateur de donner le nom du nouveau concept
200       """
201       new_concept = self.b_co.getcurselection()
202       if new_concept == 'OUI':
203           self.label_co.place(relx=0.05,rely=0.7)
204           self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
205           self.l_resu.place_forget()
206           self.label_valeur.place_forget()
207           self.entry_co.focus()
208       elif new_concept == 'NON':
209           # On est passe de OUI à NON, on supprime la valeur
210 # PN correction de bug (on passe de non a non et cela supprime la valeur)
211 # ajout du if de le ligne suivane
212           if self.node.item.is_CO():
213                 self.node.item.delete_valeur_co()
214                 self.record_valeur(name=None,mess="Suppression CO enregistrée")
215                 self.label_co.place_forget()
216                 self.entry_co.place_forget()
217                 self.l_resu.place(relx=0.05,rely=0.7)
218                 self.label_valeur.place(relx=0.45,rely=0.7)
219           
220   def display_valeur(self):
221       """
222       Affiche la valeur de l'objet pointé par self
223       """
224       valeur = self.node.item.get_valeur()
225       #print "display_valeur",valeur
226       if valeur == None or valeur == '': 
227          self.valeur_choisie.set('')
228          return # pas de valeur à afficher ...
229       # il faut configurer le bouton si la valeur est un objet CO
230       # sinon afficher le nom du concept dans self.valeur_choisie
231       if self.node.item.is_CO():
232           #print "display_valeur.is_CO"
233           self.b_co.invoke('OUI')
234           self.entry_co.insert(0,valeur.nom)
235       else:
236           self.valeur_choisie.set(valeur.nom)
237
238   def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
239       """
240       Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
241       """
242       if self.parent.modified == 'n' : self.parent.init_modif()
243       if name != None:
244           valeur =name
245       else :
246           self.entry_co.delete(0,END)
247           valeur= self.entry_co.get()
248       self.node.item.set_valeur_co(valeur)
249       self.parent.appli.affiche_infos(mess)
250       # On met a jour le display dans le panneau
251       self.display_valeur()
252       #if self.node.item.get_position()=='global':
253           #self.node.etape.verif_all()
254       #elif self.node.item.get_position()=='global_jdc':
255           #self.node.racine.verif_all()
256       #else :
257           #self.node.parent.verif()
258       if self.node.item.isvalid():
259           self.node.parent.select()
260       #self.node.update()
261
262