]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/panels.py
Salome HOME
merge de la branche BR_dev_mars_06 (tag V1_10b5) 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',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        try:
301            OngletPanel.panelbind.unbind_all("<F1>")
302            OngletPanel.panelbind.unbind_all("<F2>")
303            OngletPanel.panelbind.unbind_all("<F3>")
304            OngletPanel.panelbind.unbind_all("<F4>")
305        except:
306            pass
307        OngletPanel.panelbind = None
308
309   def commande_up(self,num):
310       #print "commande_up de panels pour ", num
311       try :
312         OngletPanel.panelbind.selectpage(num)
313         pageNew=OngletPanel.panelbind.page(num)
314         pageNew.focus_set()
315       except :
316         pass
317
318   def affiche(self):
319       page=self.nb.getcurselection()
320       self.nb.page(page).focus_set()
321       if page == 'Concept':
322           try:
323 #              _any est un pointeur sur entry
324 #              component est une methode de pmw 
325 #              a priori, jamais ok
326               self._any.component('entry').focus_set()
327           except:
328               pass
329       self.tkraise()
330
331 # ------------------------------------------------------------------------
332 #     Méthodes permettant d'afficher des pages partagées par différents
333 #           types d'objets (règles,mots-clés,concept,...)
334 # ------------------------------------------------------------------------
335
336   def makeConceptPage(self,page):
337       """
338       Crée la page de saisie du nom du concept
339       """
340       self.label = Label(page,text='Nom du concept :')
341       self.label.place(relx=0.1,rely=0.4)
342       self._any = Entry(page,relief='sunken')
343       self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
344       self._any.bind("<Return>",lambda e,s=self:s.execConcept())
345       self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
346       self._any.insert(0,self.node.item.GetText())
347       self.but_ok=Button(page,text = "Valider",command=self.execConcept)
348       self.but_ok.place(relx=0.35,rely=0.8, relwidth=0.35)
349       type_sd = self.node.item.get_type_sd_prod()
350       if type_sd :
351           txt = "L'opérateur courant retourne un objet de type %s" %type_sd
352           self.label = Label(page, text = txt)
353           self.label.place(relx=0.5,rely=0.55,anchor='n')
354       self._any.focus()
355       # aide associée au panneau
356       bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
357       au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
358       page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
359       page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
360         
361
362   def makeMoclesPage(self,page):
363       """
364       Crée la page qui affiche la liste des mots-clés que l'on peut
365       encore ajouter
366       """
367       genea =self.node.item.get_genealogie()
368       jdc = self.node.item.get_jdc()
369       liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
370       liste_commandes = (("<Enter>",self.selectMC),
371                          ("<Leave>",self.deselectMC),
372                          ("<Double-Button-1>",self.defMC))
373       Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis",optionReturn="oui")
374       Liste.affiche_liste()
375       # aide associée au panneau
376       bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
377       la commande en cours d'édition"""
378       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
379       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
380       if len(liste_mc) > 0 :
381          Liste.surligne(liste_mc[0])
382       self.Liste=Liste
383
384   def makeCommentairePage(self,page):
385       label = Label(page,text = "Insérer un commentaire :")
386       label.grid(column = 0, row = 2)
387       but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
388       but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
389       but_avant.grid(column = 1,row =2)
390       but_apres.grid(column = 1,row =3)
391       
392   def makeCommandePage(self,page):
393       """
394          Cree l'onglet
395       """
396       frame1 = Frame(page,height = 20)
397       frame1.pack(side='top',fill='x')
398       label = Label(frame1,text ="La commande choisie sera ajoutée\n APRES la commande courante")
399       label.pack(side='top')
400       frame2 = Frame(page)
401       frame2.pack(side='top',fill='both',expand=1)
402       liste_commandes = (("<Enter>",self.selectCmd),
403                          ("<Leave>",self.deselectCmd),
404                          ("<Double-Button-1>",self.defCmd))
405       if options.affichage_commandes == "alphabetic":
406          liste_cmd = self.get_liste_cmd()
407          Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,
408                                    filtre='oui',titre = "Commandes",optionReturn="oui")
409       else:
410          liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
411          liste_groupes,dict_groupes=self.get_groups()
412          Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
413                                       liste_commandes = liste_commandes,
414                                       filtre='oui',titre = "Commandes",optionReturn="oui")
415       Liste.affiche_liste()
416       self.command_entry=Liste.entry
417       # aide associée au panneau
418       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
419       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
420       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
421       self.liste_command=Liste
422       global panneauCommande
423       panneauCommande=self
424
425   def makeJDCPage(self,page):
426       """
427       Crée la page correspondant à un objet de type JDC
428       """
429       liste_commandes = (("<Enter>",self.selectCmd),
430                          ("<Leave>",self.deselectCmd),
431                          ("<Double-Button-1>",self.defCmdFirst))
432       if options.affichage_commandes == "alphabetic":
433          liste_cmd = self.get_liste_cmd()
434          Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,
435                             filtre='oui',titre = "Commandes",optionReturn="oui")
436       else:
437          liste_commandes=liste_commandes+(("<Return>",self.defCmdFirst),)
438          liste_groupes,dict_groupes=self.get_groups()
439          Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
440                                       liste_commandes = liste_commandes,
441                                       filtre='oui',titre = "Commandes",optionReturn="oui")
442       Liste.affiche_liste()
443        # aide associée au panneau
444       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
445       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
446       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
447
448   def makeReglesPage(self,page) :
449       """
450       Crée la page qui affiche la liste des règles avec celle qui ne sont
451       pas respectées en rouge
452       """
453       regles = []
454       regles = self.node.item.get_regles()
455       dictionnaire = self.node.item.get_mc_presents()
456       texte_regles = []
457       l_regles_en_defaut=[]
458       if len(regles) > 0:
459         i = 0
460         for regle in regles :
461           texte_regles.append(regle.gettext())
462           texte,test = regle.verif(dictionnaire)
463           if test == 0 : l_regles_en_defaut.append(i)
464           i = i+1
465       Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
466       Liste.affiche_liste()
467       # aide associée au panneau
468       bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
469       en cours d'édition.
470       - en noir : règles valides
471       - en rouge : règles violées"""
472       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
473       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
474
475   def makeParamCommentPage_for_etape(self,page):
476       """
477       Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
478       ou un paramètre, avant ou après le noeud courant dans l'arbre.
479       Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
480       les commentaires inter commandes et les paramètres
481       """
482       # les frame ...
483       self.frame_comment = Frame(page,bd=1,relief='raised')
484       self.frame_param   = Frame(page,bd=1,relief='raised')
485       self.frame_boutons = Frame(page,bd=1,relief='raised')
486       self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
487       self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
488       self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
489       # remplissage de la frame commentaire
490       Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
491       but_comment_avant = Button(self.frame_comment,
492                                  text = "AVANT "+self.node.item.get_nom(),
493                                  command = lambda s=self :s.ajout_commentaire(ind = 'before'))
494       but_comment_apres = Button(self.frame_comment,
495                                  text = "APRES "+self.node.item.get_nom(),
496                                  command = self.ajout_commentaire)
497       but_comment_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
498       but_comment_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
499       # remplissage de la frame paramètre
500       Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
501       but_param_avant = Button(self.frame_param,
502                                  text = "AVANT "+self.node.item.get_nom(),
503                                  command = lambda s=self :s.ajout_parametre(ind = 'before'))
504       but_param_apres = Button(self.frame_param,
505                                  text = "APRES "+self.node.item.get_nom(),
506                                  command = self.ajout_parametre)
507       but_param_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
508       but_param_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
509       # remplissage de la frame boutons
510       Button(self.frame_boutons,
511              text="Commentariser toute la commande",
512              command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
513     
514   def deselectMC(self,name):
515       self.parent.appli.affiche_infos('')
516     
517   def get_groups(self):
518       jdc=self.node.item.object.get_jdc_root()
519       return jdc.get_groups()
520
521   def get_liste_cmd(self):
522       #print "get_liste_cmd",self.node.item.object
523       jdc=self.node.item.object.get_jdc_root()
524       listeCmd = jdc.get_liste_cmd()
525       return listeCmd
526
527   def deselectCmd(self,name):
528       self.parent.appli.affiche_infos('')
529     
530   def execConcept(self):
531       """
532       Nomme le concept SD retourné par l'étape
533       """
534       if not hasattr(self,'valeur_choisie'):
535           nom = self._any.get()
536       else:
537           nom = self.valeur_choisie.get()
538       nom = string.strip(nom)
539       if nom == '' : return # si pas de nom, on ressort sans rien faire ...
540       if self.parent.modified == 'n' : self.parent.init_modif()
541       test,mess = self.node.item.nomme_sd(nom)
542       #self.node.verif()
543       #self.node.racine.update()
544       self.parent.appli.affiche_infos(mess)
545   
546   def changed(self):
547       pass
548
549   def comment_commande(self):
550     """
551     Cette méthode a pour but de commentariser la commande pointée par self.node
552     """
553     # On traite par une exception le cas où l'utilisateur final cherche à désactiver
554     # (commentariser) un commentaire.
555     try :
556         pos=self.node.parent.children.index(self.node)
557         commande_comment = self.node.item.get_objet_commentarise()
558         # On signale au parent du panel (le JDCDisplay) une modification
559         self.parent.init_modif()
560         self.node.parent.children[pos].select()
561     except Exception,e:
562         traceback.print_exc()
563         widgets.showerror("TOO BAD",str(e))
564     return
565
566       
567 class Panel_Inactif(Panel):
568   """
569      Cette classe sert à définir un panneau dans lequel on dit que le noeud 
570      sélectionné n'est pas actif
571   """
572   def __init__(self,parent,panneau,node) :
573       self.parent=parent
574       self.panneau = panneau
575       self.node=node
576       Frame.__init__(self,self.panneau)
577       self.place(x=0,y=0,relheight=1,relwidth=1)
578       self.creer_texte()
579
580   def creer_texte(self):
581       texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
582       texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
583       longueur = int(self.panneau.winfo_width()*0.8)
584       self.label = Label(self,text=texte,wraplength=longueur,justify='center')
585       self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
586       self.bouton_sup = Button(self,
587                                text = "Supprimer",
588                                command=self.supprimer,
589                                width=14)
590       self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
591
592
593 if __name__ == "__main__" : pass