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