Salome HOME
mise a niveau catalogue
[tools/eficas.git] / Editeur / jdcdisplay.py
1 #            CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
8 #
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
13 #
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
17 #
18 #
19 # ======================================================================
20 """
21    Ce module contient la classe JDCDISPLAY qui réalise l'affichage
22    du jeu de commandes sous la forme d'un arbre et de panneaux qui portent
23    les informations attachées au noeud de l'arbre sélectionné
24 """
25 # Modules Python
26 import Tkinter
27 import Pmw
28
29 # Modules Eficas
30 import panels
31 from treeitemincanvas import TREEITEMINCANVAS
32 from tkMessageBox import showinfo,showerror
33
34 class CONFIG:
35    isdeveloppeur='NON'
36
37 class JDCDISPLAY:
38    """
39        Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
40        attachées au noeud sélectionné dans un notebook
41        L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
42    """
43    def __init__(self,jdc,nom_jdc,appli=None,parent=None):
44       self.jdc=jdc
45       self.nom_jdc=nom_jdc
46       self.fichier=None
47       self.panel_courant=None
48
49       if not appli:
50          class Appli:
51             def __init__(self):
52                self.CONFIGURATION=CONFIG()
53             def affiche_infos(self,message):
54                print message
55                return
56
57             def efface_aide(self,event):
58                return
59
60             def affiche_aide(self,event,aide):
61                print aide
62                return
63
64          appli=Appli()
65       self.appli=appli
66
67       if not parent:
68          parent=Tkinter.Tk()
69          Pmw.initialise(parent)
70       self.parent=parent
71       self.node_selected = None
72       self.modified='n'
73
74       self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
75       self.pane.add('treebrowser',min=0.4,size=0.5)
76       self.pane.add('selected',min=0.4)
77       self.pane.pack(expand=1,fill='both')
78       self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
79                  self.appli,self.select_node)
80
81    def select_node(self,node):
82       """
83           Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
84           dans l'arbre.
85           Elle permet l'affichage du panneau correspondant au noeud sélectionné
86       """
87       if node is not self.node_selected :
88          self.create_panel(node)
89       # on conserve la trace du noeud sélectionné et de celui d'avant
90       if self.node_selected :
91           self.ancien_node = self.node_selected
92           self.node_selected = node
93       else:
94           self.ancien_node = self.node_selected = node
95
96    def create_panel(self,node):
97       """
98          Lance la génération du panneau contextuel de l'objet sélectionné 
99          dans l'arbre
100       """
101       if self.panel_courant:
102           # On detruit le panneau
103           self.panel_courant.destroy()
104           o=self.panel_courant
105           self.panel_courant=None
106           # Mettre à 1 pour verifier les cycles entre objets
107           # pour les panneaux
108           withCyclops=0
109           if withCyclops:
110              from Misc import Cyclops
111              z = Cyclops.CycleFinder()
112              z.register(o)
113              del o
114              z.find_cycles()
115              z.show_stats()
116              z.show_cycles()
117
118
119       if node.item.isactif():
120           if hasattr(node.item,"panel"):
121               self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
122           else:
123               raise Exception("Le noeud sélectionné n'a pas de panel associé")
124       else:
125           self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
126       return self.panel_courant
127
128    def init_modif(self):
129       """
130           Met l'attribut modified à 'o' : utilisé par Eficas pour savoir 
131           si un JDC doit être sauvegardé avant destruction ou non
132       """
133       self.modified = 'o'
134
135    def stop_modif(self):
136       """
137           Met l'attribut modified à 'n' : utilisé par Eficas pour savoir 
138           si un JDC doit être sauvegardé avant destruction ou non
139       """
140       self.modified = 'n'
141
142    def mainloop(self):
143       self.parent.mainloop()
144
145    def ReplaceObjectNode(self,node,new_object,nom_sd=None):
146       """
147       Cette méthode sert à remplacer l'objet pointé par node par
148       new_object.
149       Si nom_sd : on remplace un OPER et on essaie de renommer la
150       nouvelle sd par nom_sd
151       """
152       child = node.append_brother(new_object,retour='oui')
153       if child == 0:
154           self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
155       else:
156           self.init_modif()
157           node.delete()
158           if nom_sd:
159               child.item.nomme_sd(nom_sd)
160           child.update()
161
162    def doCut(self):
163       """
164       Stocke dans Eficas.noeud_a_editer le noeud à couper
165       """
166       if not self.node_selected.item.iscopiable():
167           showinfo("Copie impossible",
168                    "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
169           return
170       self.edit="couper"
171       self.appli.noeud_a_editer = self.node_selected
172
173    def doCopy(self):
174       """
175       Stocke dans Eficas.noeud_a_editer le noeud à copier
176       """
177       if not self.node_selected.item.iscopiable():
178           showinfo("Copie impossible",
179                    "La copie d'un tel objet n'est pas permise")
180           return
181       self.edit="copier"
182       self.appli.noeud_a_editer = self.node_selected
183
184    def doPaste(self):
185       """
186       Lance la copie de l'objet placé dans self.appli.noeud_a_editer
187       Ne permet que la copie d'objets de type Commande ou MCF
188       """
189       objet_a_copier = self.appli.noeud_a_editer.item.get_copie_objet()
190       if objet_a_copier.__class__.__name__ in ('ETAPE','PROC_ETAPE','MACRO_ETAPE','FORM_ETAPE'):
191           self.doPaste_Commande(objet_a_copier)
192       elif objet_a_copier.__class__.__name__ == "MCFACT":
193           self.doPaste_MCF(objet_a_copier)
194       else:
195           showinfo("Copie impossible",
196                    "Vous ne pouvez copier que des commandes ou des mots-clés facteurs !")
197           return
198
199    def doPaste_Commande(self,objet_a_copier):
200       """
201           Réalise la copie de l'objet passé en argument qui est nécessairement 
202           une commande
203       """
204       # il faut vérifier que le noeud sélectionné (noeud courant) est bien
205       # une commande ou un JDC sinon la copie est impossible ...
206       if self.node_selected.item.isCommande() :
207           child = self.node_selected.append_brother(objet_a_copier,retour='oui')
208       elif self.node_selected.item.isJdc() :
209           child = self.node_selected.append_child(objet_a_copier,pos='first',
210                                                      retour='oui')
211       else:
212           showinfo("Copie impossible",
213                    "Vous ne pouvez coller la commande copiée à ce niveau de l'arborescence !")
214           self.appli.affiche_infos("Copie refusée")
215           return
216       # il faut déclarer le JDCDisplay_courant modifié
217       self.init_modif()
218       # suppression éventuelle du noeud sélectionné
219       if self.edit == "couper":
220           self.appli.noeud_a_editer.delete()
221       if child == 0:
222           # la copie est impossible
223           if self.appli.message != '':
224               showerror("Copie refusée",self.appli.message)
225               self.appli.message = ''
226           self.appli.affiche_infos("Copie refusée")
227       # on rend la copie à nouveau possible en libérant le flag edit
228       self.edit="copier"
229
230    def doPaste_MCF(self,objet_a_copier):
231       """
232       Réalise la copie de l'objet passé en argument qui est nécessairement un MCF
233       """
234       if self.node_selected.item.isCommande() :
235           # le noeud courant est une ETAPE
236           child = self.node_selected.append_child(objet_a_copier,retour='oui')
237       elif self.node_selected.item.isMCList() :
238           # le noeud courant est une MCList
239           child = self.node_selected.parent.append_child(objet_a_copier,pos='first',retour='oui')
240       elif self.node_selected.item.isMCFact():
241           # le noeud courant est un MCFACT
242           if self.node_selected.parent.item.isMCList():
243              # le noeud selectionne est un MCFACT dans une MCList
244              child = self.node_selected.parent.append_child(objet_a_copier,
245                                                             pos=self.node_selected.item,
246                                                             retour='oui')
247           else:
248              # le noeud MCFACT selectionne n'est pas dans une MCList
249              child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
250       else:
251           showinfo("Copie impossible",
252                    "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
253           self.appli.affiche_infos("Copie refusée")
254           return
255       # il faut déclarer le JDCDisplay_courant modifié
256       self.init_modif()
257       # suppression éventuelle du noeud sélectionné
258       if self.edit == "couper":
259           self.appli.noeud_a_editer.delete()
260       if child == 0:
261           if self.appli.message != '':
262               showerror("Copie refusée",self.appli.message)
263               self.appli.message = ''
264           self.appli.affiche_infos("Copie refusée")
265       # on rend la copie à nouveau possible en libérant le flag edit
266       self.edit="copier"
267