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