Salome HOME
Version initiale de EFICAS 1.2
[tools/eficas.git] / Editeur / jdcdisplay.py
1 """
2    Ce module contient la classe JDCDISPLAY qui réalise l'affichage
3    du jeu de commandes sous la forme d'un arbre et de panneaux qui portent
4    les informations attachées au noeud de l'arbre sélectionné
5 """
6 # Modules Python
7 import Tkinter
8 import Pmw
9
10 # Modules Eficas
11 import panels
12 from treeitemincanvas import TREEITEMINCANVAS
13 from tkMessageBox import showinfo,showerror
14
15 class CONFIG:
16    isdeveloppeur='NON'
17
18 class JDCDISPLAY:
19    """
20        Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
21        attachées au noeud sélectionné dans un notebook
22        L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
23    """
24    def __init__(self,jdc,nom_jdc,appli=None,parent=None):
25       self.jdc=jdc
26       self.nom_jdc=nom_jdc
27       self.fichier=None
28
29       if not appli:
30          class Appli:
31             def __init__(self):
32                self.CONFIGURATION=CONFIG()
33             def affiche_infos(self,message):
34                print message
35                return
36
37             def efface_aide(self,event):
38                return
39
40             def affiche_aide(self,event,aide):
41                print aide
42                return
43
44          appli=Appli()
45       self.appli=appli
46
47       if not parent:
48          parent=Tkinter.Tk()
49          Pmw.initialise(parent)
50       self.parent=parent
51       self.node_selected = None
52       self.modified='n'
53
54       self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
55       self.pane.add('treebrowser',min=0.5)
56       self.pane.add('selected',min=0.5)
57       self.pane.pack(expand=1,fill='both')
58       self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
59                  self.appli,self.select_node)
60
61    def select_node(self,node):
62       """
63           Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
64           dans l'arbre.
65           Elle permet l'affichage du panneau correspondant au noeud sélectionné
66       """
67       if node is not self.node_selected :
68          self.create_panel(node)
69       # on conserve la trace du noeud sélectionné et de celui d'avant
70       if self.node_selected :
71           self.ancien_node = self.node_selected
72           self.node_selected = node
73       else:
74           self.ancien_node = self.node_selected = node
75
76    def create_panel(self,node):
77       """
78          Lance la génération du panneau contextuel de l'objet sélectionné 
79          dans l'arbre
80       """
81       if node.item.isactif():
82           if hasattr(node.item,"panel"):
83               return node.item.panel(self,self.pane.pane('selected'),node)
84           else:
85               raise Exception("Le noeud sélectionné n'a pas de panel associé")
86       else:
87           return panels.Panel_Inactif(self,self.pane.pane('selected'),node)
88
89    def init_modif(self):
90       """
91           Met l'attribut modified à 'o' : utilisé par Eficas pour savoir 
92           si un JDC doit être sauvegardé avant destruction ou non
93       """
94       self.modified = 'o'
95
96    def stop_modif(self):
97       """
98           Met l'attribut modified à 'n' : utilisé par Eficas pour savoir 
99           si un JDC doit être sauvegardé avant destruction ou non
100       """
101       self.modified = 'n'
102
103    def mainloop(self):
104       self.parent.mainloop()
105
106    def ReplaceObjectNode(self,node,new_object,nom_sd=None):
107       """
108       Cette méthode sert à remplacer l'objet pointé par node par
109       new_object.
110       Si nom_sd : on remplace un OPER et on essaie de renommer la
111       nouvelle sd par nom_sd
112       """
113       child = node.append_brother(new_object,retour='oui')
114       if child == 0:
115           self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
116       else:
117           self.init_modif()
118           node.delete()
119           if nom_sd:
120               child.item.nomme_sd(nom_sd)
121           child.update()
122
123    def doCut(self):
124       """
125       Stocke dans Eficas.noeud_a_editer le noeud à couper
126       """
127       if not self.node_selected.item.iscopiable():
128           showinfo("Copie impossible",
129                    "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
130           return
131       self.edit="couper"
132       self.appli.noeud_a_editer = self.node_selected
133
134    def doCopy(self):
135       """
136       Stocke dans Eficas.noeud_a_editer le noeud à copier
137       """
138       if not self.node_selected.item.iscopiable():
139           showinfo("Copie impossible",
140                    "La copie d'un tel objet n'est pas permise")
141           return
142       self.edit="copier"
143       self.appli.noeud_a_editer = self.node_selected
144
145    def doPaste(self):
146       """
147       Lance la copie de l'objet placé dans self.appli.noeud_a_editer
148       Ne permet que la copie d'objets de type Commande ou MCF
149       """
150       objet_a_copier = self.appli.noeud_a_editer.item.get_copie_objet()
151       if objet_a_copier.__class__.__name__ in ('ETAPE','PROC_ETAPE','MACRO_ETAPE'):
152           self.doPaste_Commande(objet_a_copier)
153       elif objet_a_copier.__class__.__name__ == "MCFACT":
154           self.doPaste_MCF(objet_a_copier)
155       else:
156           showinfo("Copie impossible",
157                    "Vous ne pouvez copier que des commandes ou des mots-clés facteurs !")
158           return
159
160    def doPaste_Commande(self,objet_a_copier):
161       """
162       Réalise la copie de l'objet passé en argument qui est nécessairement une commande
163       """
164       # il faut vérifier que le noeud sélectionné (noeud courant) est bien
165       # une commande ou un JDC sinon la copie est impossible ...
166       if self.node_selected.item.isCommande() :
167           child = self.node_selected.append_brother(objet_a_copier,retour='oui')
168       elif self.node_selected.item.isJdc() :
169           child = self.node_selected.append_child(objet_a_copier,retour='oui')
170       else:
171           showinfo("Copie impossible",
172                    "Vous ne pouvez coller la commande copiée à ce niveau de l'arborescence !")
173           self.appli.affiche_infos("Copie refusée")
174           return
175       # il faut déclarer le JDCDisplay_courant modifié
176       self.init_modif()
177       # suppression éventuelle du noeud sélectionné
178       if self.edit == "couper":
179           self.appli.noeud_a_editer.delete()
180       if child == 0:
181           # la copie est impossible
182           if self.appli.message != '':
183               showerror("Copie refusée",self.appli.message)
184               self.appli.message = ''
185           self.appli.affiche_infos("Copie refusée")
186       # on rend la copie à nouveau possible en libérant le flag edit
187       self.edit="copier"
188
189    def doPaste_MCF(self,objet_a_copier):
190       """
191       Réalise la copie de l'objet passé en argument qui est nécessairement un MCF
192       """
193       if self.node_selected.item.isCommande() :
194           # le noeud courant est une ETAPE
195           child = self.node_selected.append_child(objet_a_copier,retour='oui')
196       elif self.node_selected.item.isMCList() :
197           # le noeud courant est une MCList
198           child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
199       elif self.node_selected.item.isMCFact():
200           # le noeud courant est un MCFACT
201           child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
202       else:
203           showinfo("Copie impossible",
204                    "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
205           self.appli.affiche_infos("Copie refusée")
206           return
207       # il faut déclarer le JDCDisplay_courant modifié
208       self.init_modif()
209       # suppression éventuelle du noeud sélectionné
210       if self.edit == "couper":
211           self.appli.noeud_a_editer.delete()
212       if child == 0:
213           if self.appli.message != '':
214               showerror("Copie refusée",self.appli.message)
215               self.appli.message = ''
216           self.appli.affiche_infos("Copie refusée")
217       # on rend la copie à nouveau possible en libérant le flag edit
218       self.edit="copier"
219