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.
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.
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.
20 # ======================================================================
22 Ce module contient la classe JDCDISPLAY qui réalise l'affichage
23 du jeu de commandes sous la forme d'un arbre et de panneaux qui portent
24 les informations attachées au noeud de l'arbre sélectionné
34 from treeitemincanvas import TREEITEMINCANVAS
35 from widgets import showinfo,showerror
42 Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
43 attachées au noeud sélectionné dans un notebook
44 L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
46 def __init__(self,jdc,nom_jdc,appli=None,parent=None):
50 self.panel_courant=None
55 self.CONFIGURATION=CONFIG()
56 def affiche_infos(self,message):
60 def efface_aide(self,event):
63 def affiche_aide(self,event,aide):
72 Pmw.initialise(parent)
74 self.node_selected = None
77 self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
78 self.pane.add('treebrowser',min=0.4,size=0.5)
79 self.pane.add('selected',min=0.4)
80 self.pane.pack(expand=1,fill='both')
81 self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
82 self.appli,self.select_node,self.make_rmenu)
84 def make_rmenu(self,node,event):
85 if hasattr(node.item,'rmenu_specs'):
86 rmenu = Tkinter.Menu(self.pane.pane('treebrowser'), tearoff=0)
88 self.cree_menu(rmenu,node.item.rmenu_specs,node)
89 rmenu.tk_popup(event.x_root,event.y_root)
91 def cree_menu(self,menu,itemlist,node):
93 Ajoute les items du tuple itemlist
99 number_item=number_item + 1
104 if type(method) == types.TupleType:
105 # On a un tuple => on cree une cascade
106 menu_cascade=Tkinter.Menu(menu)
107 menu.add_cascade(label=label,menu=menu_cascade)
108 self.cree_menu(menu_cascade,method,node)
109 elif method[0] == '&':
110 # On a une chaine avec & en tete => on cree un radiobouton
112 command=getattr(node.item,method[1:])
113 menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
114 if radio == None:radio=number_item
118 command=getattr(node.item,method)
119 menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
121 # Si au moins un radiobouton existe on invoke le premier
122 if radio:menu.invoke(radio)
130 def select_node(self,node):
132 Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
134 Elle permet l'affichage du panneau correspondant au noeud sélectionné
136 if node is not self.node_selected :
137 #ATTENTION: il faut affecter l'attribut node_selected avant d'appeler
138 # create_panel pour eviter une recursion infinie entre create_panel,
139 # Emit, onValid, select_node
140 self.node_selected = node
141 self.create_panel(node)
142 elif self.panel_courant:
143 self.panel_courant.update_panel()
145 def create_panel(self,node):
147 Lance la génération du panneau contextuel de l'objet sélectionné
150 if self.panel_courant:
151 # On detruit le panneau
152 self.panel_courant.destroy()
154 self.panel_courant=None
155 # Mettre à 1 pour verifier les cycles entre objets
159 from Misc import Cyclops
160 z = Cyclops.CycleFinder()
168 self.panel_courant=None
169 return self.panel_courant
171 if node.item.isactif():
172 if hasattr(node.item,"panel"):
173 self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
175 raise Exception("Le noeud sélectionné n'a pas de panel associé")
177 self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
178 return self.panel_courant
180 def init_modif(self):
182 Met l'attribut modified à 'o' : utilisé par Eficas pour savoir
183 si un JDC doit être sauvegardé avant destruction ou non
187 def stop_modif(self):
189 Met l'attribut modified à 'n' : utilisé par Eficas pour savoir
190 si un JDC doit être sauvegardé avant destruction ou non
195 self.parent.mainloop()
197 def ReplaceObjectNode(self,node,new_object,nom_sd=None):
199 Cette méthode sert à remplacer l'objet pointé par node par
201 Si nom_sd : on remplace un OPER et on essaie de renommer la
202 nouvelle sd par nom_sd
204 child = node.append_brother(new_object,retour='oui')
206 self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
211 #child.item.nomme_sd(nom_sd)
217 Stocke dans Eficas.noeud_a_editer le noeud à couper
219 if not self.node_selected.item.iscopiable():
220 showinfo("Copie impossible",
221 "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
223 self.appli.edit="couper"
224 self.appli.noeud_a_editer = self.node_selected
228 Stocke dans Eficas.noeud_a_editer le noeud à copier
230 if not self.node_selected.item.iscopiable():
231 showinfo("Copie impossible",
232 "La copie d'un tel objet n'est pas permise")
234 self.appli.edit="copier"
235 self.appli.noeud_a_editer = self.node_selected
239 Lance la copie de l'objet placé dans self.appli.noeud_a_editer
240 Ne permet que la copie d'objets de type Commande ou MCF
243 child=self.appli.noeud_a_editer.doPaste(self.node_selected)
245 #traceback.print_exc()
246 showinfo("Action de coller impossible",
247 "L'action de coller apres un tel objet n'est pas permise")
251 if self.appli.message != '':
252 showerror("Copie refusée",self.appli.message)
253 self.appli.message = ''
254 self.appli.affiche_infos("Copie refusée")
257 # il faut déclarer le JDCDisplay_courant modifié
259 # suppression éventuelle du noeud sélectionné
260 # si possible on renomme l objet comme le noeud couper
261 if self.appli.edit == "couper":
262 #nom = self.appli.noeud_a_editer.item.object.sd.nom
263 item=self.appli.noeud_a_editer.item
264 self.appli.noeud_a_editer.delete()
265 child.item.update(item)
266 #test,mess = child.item.nomme_sd(nom)
268 # on rend la copie à nouveau possible en libérant le flag edit
269 self.appli.edit="copier"
272 """Cette methode est utilisee par le JDC associe pour
273 signaler des modifications globales du JDC
278 #print "supprime",self
279 self.select_node(None)
285 # print "__del__",self