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é
33 from treeitemincanvas import TREEITEMINCANVAS
34 from widgets import showinfo,showerror
41 Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
42 attachées au noeud sélectionné dans un notebook
43 L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
45 def __init__(self,jdc,nom_jdc,appli=None,parent=None):
49 self.panel_courant=None
54 self.CONFIGURATION=CONFIG()
55 def affiche_infos(self,message):
59 def efface_aide(self,event):
62 def affiche_aide(self,event,aide):
71 Pmw.initialise(parent)
73 self.node_selected = None
76 self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
77 self.pane.add('treebrowser',min=0.4,size=0.5)
78 self.pane.add('selected',min=0.4)
79 self.pane.pack(expand=1,fill='both')
80 self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
81 self.appli,self.select_node,self.make_rmenu)
83 def make_rmenu(self,node,event):
84 if hasattr(node.item,'rmenu_specs'):
85 rmenu = Tkinter.Menu(self.pane.pane('treebrowser'), tearoff=0)
87 self.cree_menu(rmenu,node.item.rmenu_specs,node)
88 rmenu.tk_popup(event.x_root,event.y_root)
90 def cree_menu(self,menu,itemlist,node):
92 Ajoute les items du tuple itemlist
98 number_item=number_item + 1
103 if type(method) == types.TupleType:
104 # On a un tuple => on cree une cascade
105 menu_cascade=Tkinter.Menu(menu)
106 menu.add_cascade(label=label,menu=menu_cascade)
107 self.cree_menu(menu_cascade,method,node)
108 elif method[0] == '&':
109 # On a une chaine avec & en tete => on cree un radiobouton
111 command=getattr(node.item,method[1:])
112 menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
113 if radio == None:radio=number_item
117 command=getattr(node.item,method)
118 menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
120 # Si au moins un radiobouton existe on invoke le premier
121 if radio:menu.invoke(radio)
123 def select_node(self,node):
125 Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
127 Elle permet l'affichage du panneau correspondant au noeud sélectionné
129 if node is not self.node_selected :
130 self.create_panel(node)
131 # on conserve la trace du noeud sélectionné et de celui d'avant
132 if self.node_selected :
133 self.ancien_node = self.node_selected
134 self.node_selected = node
136 self.ancien_node = self.node_selected = node
138 def create_panel(self,node):
140 Lance la génération du panneau contextuel de l'objet sélectionné
143 if self.panel_courant:
144 # On detruit le panneau
145 self.panel_courant.destroy()
147 self.panel_courant=None
148 # Mettre à 1 pour verifier les cycles entre objets
152 from Misc import Cyclops
153 z = Cyclops.CycleFinder()
161 if node.item.isactif():
162 if hasattr(node.item,"panel"):
163 self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
166 raise Exception("Le noeud sélectionné n'a pas de panel associé")
168 self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
169 return self.panel_courant
171 def init_modif(self):
173 Met l'attribut modified à 'o' : utilisé par Eficas pour savoir
174 si un JDC doit être sauvegardé avant destruction ou non
178 def stop_modif(self):
180 Met l'attribut modified à 'n' : utilisé par Eficas pour savoir
181 si un JDC doit être sauvegardé avant destruction ou non
186 self.parent.mainloop()
188 def ReplaceObjectNode(self,node,new_object,nom_sd=None):
190 Cette méthode sert à remplacer l'objet pointé par node par
192 Si nom_sd : on remplace un OPER et on essaie de renommer la
193 nouvelle sd par nom_sd
195 child = node.append_brother(new_object,retour='oui')
197 self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
202 child.item.nomme_sd(nom_sd)
207 Stocke dans Eficas.noeud_a_editer le noeud à couper
209 if not self.node_selected.item.iscopiable():
210 showinfo("Copie impossible",
211 "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
214 self.appli.noeud_a_editer = self.node_selected
218 Stocke dans Eficas.noeud_a_editer le noeud à copier
220 if not self.node_selected.item.iscopiable():
221 showinfo("Copie impossible",
222 "La copie d'un tel objet n'est pas permise")
225 self.appli.noeud_a_editer = self.node_selected
229 Lance la copie de l'objet placé dans self.appli.noeud_a_editer
230 Ne permet que la copie d'objets de type Commande ou MCF
233 child=self.appli.noeud_a_editer.doPaste(self.node_selected)
235 showinfo("Action de coller impossible",
236 "L'action de coller apres un tel objet n'est pas permise")
240 if self.appli.message != '':
241 showerror("Copie refusée",self.appli.message)
242 self.appli.message = ''
243 self.appli.affiche_infos("Copie refusée")
245 # il faut déclarer le JDCDisplay_courant modifié
247 # suppression éventuelle du noeud sélectionné
248 # si possible on renomme l objet comme le noeud couper
249 if self.edit == "couper":
251 nom = self.appli.noeud_a_editer.item.object.sd.nom
252 self.appli.noeud_a_editer.delete()
253 test,mess = child.item.nomme_sd(nom)
255 child.racine.update()
257 self.appli.noeud_a_editer.delete()
258 # on rend la copie à nouveau possible en libérant le flag edit
262 """Cette methode est utilisee par le JDC associe pour
263 signaler des modifications globales du JDC