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)
124 def select_node(self,node):
126 Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
128 Elle permet l'affichage du panneau correspondant au noeud sélectionné
130 if node is not self.node_selected :
131 self.create_panel(node)
132 self.node_selected = node
133 ## on conserve la trace du noeud sélectionné et de celui d'avant
134 #if self.node_selected :
135 #self.ancien_node = self.node_selected
136 #self.node_selected = node
138 #self.ancien_node = self.node_selected = node
140 def create_panel(self,node):
142 Lance la génération du panneau contextuel de l'objet sélectionné
145 if self.panel_courant:
146 # On detruit le panneau
147 self.panel_courant.destroy()
149 self.panel_courant=None
150 # Mettre à 1 pour verifier les cycles entre objets
154 from Misc import Cyclops
155 z = Cyclops.CycleFinder()
163 self.panel_courant=None
164 return self.panel_courant
166 if node.item.isactif():
167 if hasattr(node.item,"panel"):
168 self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
170 raise Exception("Le noeud sélectionné n'a pas de panel associé")
172 self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
173 return self.panel_courant
175 def init_modif(self):
177 Met l'attribut modified à 'o' : utilisé par Eficas pour savoir
178 si un JDC doit être sauvegardé avant destruction ou non
182 def stop_modif(self):
184 Met l'attribut modified à 'n' : utilisé par Eficas pour savoir
185 si un JDC doit être sauvegardé avant destruction ou non
190 self.parent.mainloop()
192 def ReplaceObjectNode(self,node,new_object,nom_sd=None):
194 Cette méthode sert à remplacer l'objet pointé par node par
196 Si nom_sd : on remplace un OPER et on essaie de renommer la
197 nouvelle sd par nom_sd
199 child = node.append_brother(new_object,retour='oui')
201 self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
206 #child.item.nomme_sd(nom_sd)
212 Stocke dans Eficas.noeud_a_editer le noeud à couper
214 if not self.node_selected.item.iscopiable():
215 showinfo("Copie impossible",
216 "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
219 self.appli.noeud_a_editer = self.node_selected
223 Stocke dans Eficas.noeud_a_editer le noeud à copier
225 if not self.node_selected.item.iscopiable():
226 showinfo("Copie impossible",
227 "La copie d'un tel objet n'est pas permise")
230 self.appli.noeud_a_editer = self.node_selected
234 Lance la copie de l'objet placé dans self.appli.noeud_a_editer
235 Ne permet que la copie d'objets de type Commande ou MCF
238 child=self.appli.noeud_a_editer.doPaste(self.node_selected)
240 traceback.print_exc()
241 showinfo("Action de coller impossible",
242 "L'action de coller apres un tel objet n'est pas permise")
246 if self.appli.message != '':
247 showerror("Copie refusée",self.appli.message)
248 self.appli.message = ''
249 self.appli.affiche_infos("Copie refusée")
252 # il faut déclarer le JDCDisplay_courant modifié
254 # suppression éventuelle du noeud sélectionné
255 # si possible on renomme l objet comme le noeud couper
256 if self.edit == "couper":
257 #nom = self.appli.noeud_a_editer.item.object.sd.nom
258 item=self.appli.noeud_a_editer.item
259 self.appli.noeud_a_editer.delete()
260 child.item.update(item)
261 #test,mess = child.item.nomme_sd(nom)
263 # on rend la copie à nouveau possible en libérant le flag edit
267 """Cette methode est utilisee par le JDC associe pour
268 signaler des modifications globales du JDC