]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/panels.py
Salome HOME
PN
[tools/eficas.git] / Editeur / panels.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 import string
22 import os
23 from Tkinter import *
24 import Pmw
25 import time
26 import traceback
27
28 import widgets
29 from widgets import ListeChoix
30 from widgets import ListeChoixParGroupes
31 import prefs
32 import options
33
34 SEPARATEUR = '-'*30
35
36
37 class Panel(Frame) :
38   """
39   Classe servant de classe mère à toutes celles représentant les
40   panneaux à afficher en fonction de la nature de l'objet en cours
41   Elle est toujours dérivée.
42   """
43   def __init__(self,parent,panneau,node) :
44       # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
45       # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
46       # modified et la methode init_modif
47       self.parent=parent
48       self.panneau = panneau
49       self.node=node
50       Frame.__init__(self,self.panneau)
51       self.place(x=0,y=0,relheight=1,relwidth=1)
52       self.creer_boutons()
53       self.init()
54       global panneauCommande
55       panneauCommande=self
56
57   #def __del__(self):
58   #    print "__del__",self
59
60   def update_panel(self):
61       """Methode appele pour demander une mise a jour du panneau"""
62
63   def destroy(self):
64       Frame.destroy(self)
65       self.panneau=None
66       self.parent=None
67       # Because on herite de Frame
68       self.master=None
69       # On supprime explicitement les references aux objets Tk
70       self.nb=None
71       self.fr_but=None
72       self.bouton_cata=None
73       self.bouton_doc=None
74       self.bouton_com=None
75       self.bouton_sup=None
76       #self.frame_eval=None
77       self.label=None
78       self.frame_boutons=None
79       self.frame_comment=None
80       self.frame_param=None
81       # On termine la suppression de facon brutale (objets Tk et non Tk)
82       for k in self.__dict__.keys():
83          # il est plus prudent de ne pas détruire le lien sur le Node
84          # si on voulait mettre l'attribut node à None, il faudrait
85          # que tous les appels à node.parent.select() apparaissent après
86          # toutes les autres actions liées au panel (node.item.isglobal(), ...)
87          if k != 'node' : setattr(self,k,None)
88
89   def creer_boutons(self):
90       """
91       Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
92       (à droite sous les onglets )
93       """
94       self.fr_but = Frame(self,height=30)
95       self.fr_but.pack(side='bottom',fill='x')
96       self.bouton_com = Button(self.fr_but,
97                                text = 'Commentariser',
98                                command = self.ajout_commentaire,
99                                width=14)
100       self.bouton_sup = Button(self.fr_but,
101                                text = "Supprimer",
102                                command=self.supprimer,
103                                width=14)
104       self.bouton_doc = Button(self.fr_but,
105                                text="Documentation",
106                                command=self.visu_doc,
107                                width=14)
108       self.bouton_cata = Button(self.fr_but,
109                                 text = "Catalogue",
110                                 command = self.show_catalogue,
111                                 width=14)
112       if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
113           self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='center')
114           self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='center')
115           self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='center')
116       else:
117           self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='center')
118           self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='center')
119
120   def show_catalogue(self):
121       try:
122           genea = self.node.item.get_genealogie()
123           self.parent.appli.browser_catalogue_objet(genea)
124       except Exception,e:
125           traceback.print_exc()
126       
127   def efface(self):
128       self.node.efface()
129
130 # ------------------------------------------------------------------------
131 #     Méthodes permettant d'ajouter des commentaires, des paramètres
132 #                     et des objets EVAL.
133 #       Ces méthodes sont utilisées par les panneaux des JDC,ETAPE,
134 #                 COMMENTAIRE et PARAMETRE
135 # ------------------------------------------------------------------------
136
137   def ajout_commentaire(self,ind='after'):
138       """
139       Ajoute un commentaire à l'intérieur du JDC :
140       - si ind='after'  : l'ajoute après l'objet courant
141       - si ind='before' : l'ajoute avant.
142       """
143       if self.parent.modified == 'n' : self.parent.init_modif()
144       return self.node.append_brother("COMMENTAIRE",ind)
145     
146   def ajout_commentaire_first(self):
147       """
148       Ajoute un commentaire en début de JDC
149       """
150       if self.parent.modified == 'n' : self.parent.init_modif()
151       return self.node.append_child("COMMENTAIRE",'first')
152
153   def ajout_parametre(self,ind='after'):
154       """
155       Ajoute un parametre à l'intérieur du JDC :
156       - si ind='after'  : l'ajoute après l'objet courant
157       - si ind='before' : l'ajoute avant.
158       """
159       if self.parent.modified == 'n' : self.parent.init_modif()
160       return self.node.append_brother("PARAMETRE",ind)
161     
162   def ajout_parametre_first(self):
163       """
164       Ajoute un parametre en début de JDC
165       """
166       if self.parent.modified == 'n' : self.parent.init_modif()
167       return self.node.append_child("PARAMETRE",'first')
168
169 #  def ajout_parametre_eval(self,ind='after'):
170 #      """
171 #      Ajoute un paramètre EVAL à l'intérieur du JDC :
172 #      - si ind='after'  : l'ajoute après l'objet courant
173 #      - si ind='before' : l'ajoute avant.
174 #      """
175 #      if self.parent.modified == 'n' : self.parent.init_modif()
176 #      return self.node.append_brother("PARAMETRE_EVAL",ind)
177     
178 #  def ajout_parametre_eval_first(self):
179 #      """
180 #      Ajoute un paramètre EVAL en début de JDC
181 #      """
182 #      if self.parent.modified == 'n' : self.parent.init_modif()
183 #      return self.node.append_child("PARAMETRE_EVAL",'first')
184     
185 # ------------------------------------------------------------------------
186    
187   def visu_doc(self):
188       """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
189         - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
190         - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
191       cle_doc = self.node.item.get_docu()
192       if cle_doc == None : return
193       cle_doc = string.replace(cle_doc,'.','')
194       cle_doc = string.replace(cle_doc,'-','')
195       commande = self.parent.appli.CONFIGURATION.exec_acrobat
196       nom_fichier = cle_doc+".pdf"
197       fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,
198                                        nom_fichier))
199       if os.name == 'nt':
200           os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
201       elif os.name == 'posix':
202           script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
203           pid = os.system(script)
204       
205   def supprimer(self):
206       """
207       Suppression du noeud courant
208       """
209       # On signale au parent du panel (le JDCDisplay) une modification 
210       self.parent.init_modif()
211       self.node.delete()
212       
213   def affiche(self):
214       """ Force l'affichage des fenêtres en cours """
215       self.tkraise()
216
217   def selectMC(self,name):
218       """ On retrouve le mot-clé sous le curseur pour affichage du fr """
219       cmd=self.node.item.get_definition()
220       texte_infos = ''
221       for e in cmd.entites.keys() :
222           if e == name :
223               texte_infos=getattr(cmd.entites[e],prefs.lang)
224               break
225       if texte_infos == '' : texte_infos="Pas d'infos disponibles"
226       self.parent.appli.affiche_infos(texte_infos)
227
228   def defMC(self,name):
229       """ On ajoute un mot-clé à la commande : subnode """
230       if name == SEPARATEUR:return
231       if self.parent.modified == 'n' : self.parent.init_modif()
232       if name != "COMMENTAIRE":
233           self.node.append_child(name)
234       else :
235           self.ajout_commentaire()    
236
237   def selectCmd(self,name):
238       """ On retrouve la commande sous le curseur pour affichage du fr """
239       if name != 'COMMENTAIRE' and name != SEPARATEUR:
240           texte_infos=getattr(self.parent.jdc.get_cmd(name),prefs.lang)
241           self.parent.appli.affiche_infos(texte_infos)
242           
243   def defCmd(self,name):
244       """
245       On ajoute une commande après la commande selectionnée : after
246       ou bien on ajoute un commentaire
247       """
248       if name == SEPARATEUR:return
249       if self.parent.modified == 'n' : self.parent.init_modif()
250       if name != "COMMENTAIRE":
251           #parent=self.node.parent
252           #new_obj = parent.item.append_child(name,self.node.item.getObject())
253           #parent.children[parent.children.index(self.node)+1].select()
254           new_node = self.node.append_brother(name,'after')
255       else :
256           new_node = self.ajout_commentaire()
257
258   def defCmdFirst(self,name):
259       """ On ajoute une commande ou un commentaire au début du fichier de commandes """
260       if name == SEPARATEUR:return
261       if self.parent.modified == 'n' : self.parent.init_modif()
262       if name != "COMMENTAIRE":
263           #new_obj = self.node.item.append_child(name,'first')
264           #self.node.children[0].select()
265           new_node = self.node.append_child(name,'first')
266       else :
267           new_node = self.ajout_commentaire_first()
268         
269 class OngletPanel(Panel) :
270   """ Cette classe est virtuelle et doit être dérivée
271       Elle contient les principales méthodes d'affichage des différents onglets"""
272
273   global panelbind
274
275   def raisecmd(self,page):
276       self.nb.page(page).focus_set()
277       if page == 'Concept':
278           try:
279               self._any.focus()
280           except:
281               pass
282       elif page == 'Commande':
283           try:
284               self.command_entry.component('entry').focus()
285           except:
286               pass
287
288   def creebind(self):
289        self.nb.bind_all("<F1>",lambda e,s=self,num=0:s.commande_up(num))
290        self.nb.bind_all("<F2>",lambda e,s=self,num=1:s.commande_up(num))
291        self.nb.bind_all("<F3>",lambda e,s=self,num=2:s.commande_up(num))
292        self.nb.bind_all("<F4>",lambda e,s=self,num=3:s.commande_up(num))
293        OngletPanel.panelbind=self.nb
294
295   def enlevebind(self):
296        if not hasattr(OngletPanel,"panelbind"):
297           return
298        if OngletPanel.panelbind == None:
299           return
300        OngletPanel.panelbind.unbind_all("<F1>")
301        OngletPanel.panelbind.unbind_all("<F2>")
302        OngletPanel.panelbind.unbind_all("<F3>")
303        OngletPanel.panelbind.unbind_all("<F4>")
304        OngletPanel.panelbind = None
305
306   def commande_up(self,num):
307       #print "commande_up de panels pour ", num
308       try :
309         OngletPanel.panelbind.selectpage(num)
310         pageNew=OngletPanel.panelbind.page(num)
311         pageNew.focus_set()
312       except :
313         pass
314
315   def affiche(self):
316       page=self.nb.getcurselection()
317       self.nb.page(page).focus_set()
318       if page == 'Concept':
319           try:
320 #             _any est un pointeur sur entry
321 #             component est une methode de pmw 
322 #             a priori, jamais ok
323               self._any.component('entry').focus_set()
324           except:
325               pass
326       self.tkraise()
327
328 # ------------------------------------------------------------------------
329 #     Méthodes permettant d'afficher des pages partagées par différents
330 #           types d'objets (règles,mots-clés,concept,...)
331 # ------------------------------------------------------------------------
332
333   def makeConceptPage(self,page):
334       """
335       Crée la page de saisie du nom du concept
336       """
337       self.label = Label(page,text='Nom du concept :')
338       self.label.place(relx=0.1,rely=0.4)
339       self._any = Entry(page,relief='sunken')
340       self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
341       self._any.bind("<Return>",lambda e,s=self:s.execConcept())
342       self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
343       self._any.insert(0,self.node.item.GetText())
344       self.but_ok=Button(page,text = "Valider",command=self.execConcept)
345       self.but_ok.place(relx=0.35,rely=0.8, relwidth=0.35)
346       type_sd = self.node.item.get_type_sd_prod()
347       if type_sd :
348           txt = "L'opérateur courant retourne un objet de type %s" %type_sd
349           self.label = Label(page, text = txt)
350           self.label.place(relx=0.5,rely=0.55,anchor='n')
351       self._any.focus()
352       # aide associée au panneau
353       bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
354       au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
355       page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
356       page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
357         
358
359   def makeMoclesPage(self,page):
360       """
361       Crée la page qui affiche la liste des mots-clés que l'on peut
362       encore ajouter
363       """
364       genea =self.node.item.get_genealogie()
365       jdc = self.node.item.get_jdc()
366       liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
367       liste_commandes = (("<Enter>",self.selectMC),
368                          ("<Leave>",self.deselectMC),
369                          ("<Double-Button-1>",self.defMC))
370       Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis",optionReturn="oui")
371       Liste.affiche_liste()
372       # aide associée au panneau
373       bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
374       la commande en cours d'édition"""
375       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
376       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
377       if len(liste_mc) > 0 :
378          Liste.surligne(liste_mc[0])
379
380   def makeCommentairePage(self,page):
381       label = Label(page,text = "Insérer un commentaire :")
382       label.grid(column = 0, row = 2)
383       but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
384       but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
385       but_avant.grid(column = 1,row =2)
386       but_apres.grid(column = 1,row =3)
387       
388   def makeCommandePage(self,page):
389       """
390          Cree l'onglet
391       """
392       frame1 = Frame(page,height = 20)
393       frame1.pack(side='top',fill='x')
394       label = Label(frame1,text ="La commande choisie sera ajoutée\n APRES la commande courante")
395       label.pack(side='top')
396       frame2 = Frame(page)
397       frame2.pack(side='top',fill='both',expand=1)
398       liste_commandes = (("<Enter>",self.selectCmd),
399                          ("<Leave>",self.deselectCmd),
400                          ("<Double-Button-1>",self.defCmd))
401       if options.affichage_commandes == "alphabetic":
402          liste_cmd = self.get_liste_cmd()
403          Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,
404                                    filtre='oui',titre = "Commandes",optionReturn="oui")
405       else:
406          liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
407          liste_groupes,dict_groupes=self.get_groups()
408          Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
409                                       liste_commandes = liste_commandes,
410                                       filtre='oui',titre = "Commandes",optionReturn="oui")
411       Liste.affiche_liste()
412       self.command_entry=Liste.entry
413       # aide associée au panneau
414       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
415       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
416       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
417       global panneauCommande
418       panneauCommande=self
419
420   def makeJDCPage(self,page):
421       """
422       Crée la page correspondant à un objet de type JDC
423       """
424       liste_commandes = (("<Enter>",self.selectCmd),
425                          ("<Leave>",self.deselectCmd),
426                          ("<Double-Button-1>",self.defCmdFirst))
427       if options.affichage_commandes == "alphabetic":
428          liste_cmd = self.get_liste_cmd()
429          Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,
430                             filtre='oui',titre = "Commandes",optionReturn="oui")
431       else:
432          liste_commandes=liste_commandes+(("<Return>",self.defCmdFirst),)
433          liste_groupes,dict_groupes=self.get_groups()
434          Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
435                                       liste_commandes = liste_commandes,
436                                       filtre='oui',titre = "Commandes",optionReturn="oui")
437       Liste.affiche_liste()
438        # aide associée au panneau
439       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
440       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
441       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
442
443   def makeReglesPage(self,page) :
444       """
445       Crée la page qui affiche la liste des règles avec celle qui ne sont
446       pas respectées en rouge
447       """
448       regles = []
449       regles = self.node.item.get_regles()
450       dictionnaire = self.node.item.get_mc_presents()
451       texte_regles = []
452       l_regles_en_defaut=[]
453       if len(regles) > 0:
454         i = 0
455         for regle in regles :
456           texte_regles.append(regle.gettext())
457           texte,test = regle.verif(dictionnaire)
458           if test == 0 : l_regles_en_defaut.append(i)
459           i = i+1
460       Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
461       Liste.affiche_liste()
462       # aide associée au panneau
463       bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
464       en cours d'édition.
465       - en noir : règles valides
466       - en rouge : règles violées"""
467       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
468       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
469
470   def makeParamCommentPage_for_etape(self,page):
471       """
472       Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
473       ou un paramètre, avant ou après le noeud courant dans l'arbre.
474       Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
475       les commentaires inter commandes et les paramètres
476       """
477       # les frame ...
478       self.frame_comment = Frame(page,bd=1,relief='raised')
479       self.frame_param   = Frame(page,bd=1,relief='raised')
480       #self.frame_eval    = Frame(page,bd=1,relief='raised')
481       self.frame_boutons = Frame(page,bd=1,relief='raised')
482       self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
483       self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
484       #self.frame_eval.place(relx=0,rely=0.56,relwidth=1,relheight=0.28)
485       self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
486       # remplissage de la frame commentaire
487       Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
488       but_comment_avant = Button(self.frame_comment,
489                                  text = "AVANT "+self.node.item.get_nom(),
490                                  command = lambda s=self :s.ajout_commentaire(ind = 'before'))
491       but_comment_apres = Button(self.frame_comment,
492                                  text = "APRES "+self.node.item.get_nom(),
493                                  command = self.ajout_commentaire)
494       but_comment_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
495       but_comment_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
496       # remplissage de la frame paramètre
497       Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
498       but_param_avant = Button(self.frame_param,
499                                  text = "AVANT "+self.node.item.get_nom(),
500                                  command = lambda s=self :s.ajout_parametre(ind = 'before'))
501       but_param_apres = Button(self.frame_param,
502                                  text = "APRES "+self.node.item.get_nom(),
503                                  command = self.ajout_parametre)
504       but_param_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
505       but_param_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
506       # remplissage de la frame eval
507       #Label(self.frame_eval,text="Insérer un paramètre EVAL :").place(relx=0.1,rely=0.5,anchor='w')
508           #Label(self.frame_eval,text='Non encore disponible').place(relx=0.6,rely=0.5,anchor='w')
509       #but_eval_avant = Button(self.frame_eval,
510       #                        text = "AVANT "+self.node.item.get_nom(),
511       #                        command = lambda s=self :s.ajout_parametre_eval(ind = 'before'))
512       #but_eval_apres = Button(self.frame_eval,
513       #                        text = "APRES "+self.node.item.get_nom(),
514       #                        command = self.ajout_parametre_eval)
515       #but_eval_avant.place(relx=0.6,rely=0.3,anchor='w',relwidth=0.3)
516       #but_eval_apres.place(relx=0.6,rely=0.7,anchor='w',relwidth=0.3)      
517       # remplissage de la frame boutons
518       Button(self.frame_boutons,
519              text="Commentariser toute la commande",
520              command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
521     
522   def deselectMC(self,name):
523       self.parent.appli.affiche_infos('')
524     
525   def get_groups(self):
526       jdc=self.node.item.object.get_jdc_root()
527       return jdc.get_groups()
528
529   def get_liste_cmd(self):
530       #print "get_liste_cmd",self.node.item.object
531       jdc=self.node.item.object.get_jdc_root()
532       listeCmd = jdc.get_liste_cmd()
533       return listeCmd
534
535   def deselectCmd(self,name):
536       self.parent.appli.affiche_infos('')
537     
538   def execConcept(self):
539       """
540       Nomme le concept SD retourné par l'étape
541       """
542       if not hasattr(self,'valeur_choisie'):
543           nom = self._any.get()
544       else:
545           nom = self.valeur_choisie.get()
546       nom = string.strip(nom)
547       if nom == '' : return # si pas de nom, on ressort sans rien faire ...
548       if self.parent.modified == 'n' : self.parent.init_modif()
549       test,mess = self.node.item.nomme_sd(nom)
550       #self.node.verif()
551       #self.node.racine.update()
552       self.parent.appli.affiche_infos(mess)
553   
554   def changed(self):
555       pass
556
557   def comment_commande(self):
558     """
559     Cette méthode a pour but de commentariser la commande pointée par self.node
560     """
561     # On traite par une exception le cas où l'utilisateur final cherche à désactiver
562     # (commentariser) un commentaire.
563     try :
564         pos=self.node.parent.children.index(self.node)
565         commande_comment = self.node.item.get_objet_commentarise()
566         # On signale au parent du panel (le JDCDisplay) une modification
567         self.parent.init_modif()
568         self.node.parent.children[pos].select()
569     except Exception,e:
570         traceback.print_exc()
571         widgets.showerror("TOO BAD",str(e))
572     return
573
574       
575 class Panel_Inactif(Panel):
576   """
577      Cette classe sert à définir un panneau dans lequel on dit que le noeud 
578      sélectionné n'est pas actif
579   """
580   def __init__(self,parent,panneau,node) :
581       self.parent=parent
582       self.panneau = panneau
583       self.node=node
584       Frame.__init__(self,self.panneau)
585       self.place(x=0,y=0,relheight=1,relwidth=1)
586       self.creer_texte()
587
588   def creer_texte(self):
589       texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
590       texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
591       longueur = int(self.panneau.winfo_width()*0.8)
592       self.label = Label(self,text=texte,wraplength=longueur,justify='center')
593       self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
594       self.bouton_sup = Button(self,
595                                text = "Supprimer",
596                                command=self.supprimer,
597                                width=14)
598       self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
599
600
601 if __name__ == "__main__" : pass