Salome HOME
CCAR: modifications pour :
[tools/eficas.git] / Editeur / compooper.py
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21 from Tkinter import *
22 import Pmw
23 import traceback
24 import Objecttreeitem
25 import panels
26 import fontes
27
28 class OPERPanel(panels.OngletPanel):
29
30   def init(self):
31     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
32     nb.pack(fill = 'both', expand = 1)
33     self.nb=nb
34     nb.add('Mocles', tab_text='Nouveau mot-clé')
35     nb.add('Concept', tab_text='Nommer concept')
36     nb.add('Commande', tab_text='Nouvelle Commande')
37     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
38     panneau=Pmw.PanedWidget(nb.page("Mocles"),
39                             orient='horizontal')
40     panneau.add('left',min=0.4,max=0.6,size=0.5)
41     panneau.add('right',min=0.4,max=0.6,size=0.5)
42     panneau.pack(expand=1,fill='both')
43     self.makeCommandePage(nb.page("Commande"))
44     self.makeConceptPage_oper(nb.page("Concept"))
45     self.makeMoclesPage(panneau.pane('left'))
46     self.makeReglesPage(panneau.pane('right'))
47     #self.makeCommentairePage(nb.page("Commentaire"))
48     self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
49     nb.tab('Mocles').focus_set()
50     nb.setnaturalsize()
51     self.affiche()
52
53   def makeConceptPage_oper(self,page):
54       """ Crée la page de saisie du nom du concept """
55       if self.node.item.is_reentrant():
56           self.makeConceptPage_reentrant(page)
57       else:
58           self.makeConceptPage(page)
59
60   def makeConceptPage_reentrant(self,page):
61       """ Crée la page de saisie du nom de concept pour un opérateur reentrant
62       cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
63       type est compatible avec celui que retourne l'opérateur """
64       liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
65       self.listbox = Pmw.ScrolledListBox(page,
66                                          items=liste_noms_sd,
67                                          labelpos='n',
68                                          label_text="Structure(s) de données à enrichir par l'opérateur courant :",
69                                          listbox_height = 6,
70                                          selectioncommand=self.select_valeur_from_list,
71                                          dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
72       self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
73       Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
74       self.valeur_choisie = StringVar()
75       self.label_valeur = Label(page,textvariable=self.valeur_choisie)
76       self.label_valeur.place(relx=0.45,rely=0.6)
77       if len(liste_noms_sd) == 1 :
78           self.valeur_choisie.set(liste_noms_sd[0])
79
80   def select_valeur_from_list(self):
81       try:
82           choix = self.listbox.getcurselection()[0]
83           self.valeur_choisie.set(choix)
84       except:
85           traceback.print_exc()
86           
87
88   def choose_valeur_from_list(self,command):
89       try:
90           choix = self.listbox.getcurselection()[0]
91           self.valeur_choisie.set(choix)
92           apply(command,(),{})
93       except:
94           traceback.print_exc()
95
96 import treewidget
97 class Node(treewidget.Node):
98     def doPaste(self,node_selected):
99         """
100             Déclenche la copie de l'objet item avec pour cible
101             l'objet passé en argument : node_selected
102         """
103         objet_a_copier = self.item.get_copie_objet()
104         child=node_selected.doPaste_Commande(objet_a_copier)
105         return child
106
107     def doPaste_Commande(self,objet_a_copier):
108         """
109           Réalise la copie de l'objet passé en argument qui est nécessairement
110           une commande
111         """
112         parent=self.parent
113         #child = parent.item.append_child(objet_a_copier,self.item.getObject())
114         child = self.append_brother(objet_a_copier,retour='oui')
115         #if child is None:return 0
116         return child
117
118     def doPaste_MCF(self,objet_a_copier):
119         """
120            Réalise la copie de l'objet passé en argument (objet_a_copier)
121            Il s'agit forcément d'un mot clé facteur
122         """
123         child = self.append_child(objet_a_copier,pos='first',retour='oui')
124         return child
125
126
127 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
128   """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
129       Accas. Elle leur permet d'etre affichés comme des noeuds
130       d'un arbre graphique.
131       Cette classe a entre autres deux attributs importants :
132         - _object qui est un pointeur vers l'objet du noyau
133         - object qui pointe vers l'objet auquel sont délégués les
134           appels de méthode et les accès aux attributs
135       Dans le cas d'une ETAPE, _object et object pointent vers le 
136       meme objet.
137   """
138   panel = OPERPanel
139   itemNode=Node
140   
141   def IsExpandable(self):
142       return 1
143
144   def GetIconName(self):
145       """
146       Retourne le nom de l'icône à afficher dans l'arbre
147       Ce nom dépend de la validité de l'objet
148       """
149       if not self.object.isactif():
150          return "ast-white-square"
151       elif self.object.isvalid():
152          return "ast-green-square"
153       else:
154          return "ast-red-square"
155
156   def GetLabelText(self):
157       """ Retourne 3 valeurs :
158       - le texte à afficher dans le noeud représentant l'item
159       - la fonte dans laquelle afficher ce texte
160       - la couleur du texte
161       """
162       if self.object.isactif():
163         # None --> fonte et couleur par défaut
164         return self.labeltext,None,None
165       else:
166         return self.labeltext,fontes.standard_italique,None
167       
168   def get_objet(self,name) :
169       for v in self.object.mc_liste:
170           if v.nom == name : return v
171       return None
172       
173   def get_type_sd_prod(self):
174       """
175          Retourne le nom du type du concept résultat de l'étape
176       """
177       sd_prod=self.object.get_type_produit()
178       if sd_prod:
179          return sd_prod.__name__
180       else:
181          return ""
182
183   def additem(self,name,pos):
184       #print "compooper.additem",name,pos
185       mcent = self._object.addentite(name,pos)
186       return mcent
187
188   def suppitem(self,item) :
189       # item : item du MOCLE de l'ETAPE à supprimer
190       # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList 
191       itemobject=item.getObject()
192       if itemobject.isoblig() :
193           self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
194           return 0
195       if self.object.suppentite(itemobject):
196           message = "Mot-clé " + itemobject.nom + " supprimé"
197           self.appli.affiche_infos(message)
198           return 1
199       else :
200           self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
201           return 0
202
203   def GetText(self):
204       try:
205           return self.object.get_sdname()
206       except:
207           return ''
208
209   def keys(self):
210       keys=self.object.mc_dict.keys()
211       return keys
212
213   def GetSubList(self):
214       """
215          Reactualise la liste des items fils stockes dans self.sublist
216       """
217       if self.isactif():
218          liste=self.object.mc_liste
219       else:
220          liste=[]
221
222       sublist=[None]*len(liste)
223       # suppression des items lies aux objets disparus
224       for item in self.sublist:
225          old_obj=item.getObject()
226          if old_obj in liste:
227             pos=liste.index(old_obj)
228             sublist[pos]=item
229          else:
230             pass # objets supprimes ignores
231
232       # ajout des items lies aux nouveaux objets
233       pos=0
234       for obj in liste:
235          if sublist[pos] is None:
236             # nouvel objet : on cree un nouvel item
237             def setfunction(value, object=obj):
238                 object.setval(value)
239             item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
240             sublist[pos]=item
241          pos=pos+1
242
243       self.sublist=sublist
244       return self.sublist
245
246   def GetSubList_BAK(self):
247       if self.isactif():
248          liste=self.object.mc_liste
249       else:
250          liste=[]
251
252       sublist=[]
253       isublist=iter(self.sublist)
254       iliste=iter(liste)
255
256       while(1):
257          old_obj=obj=None
258          for item in isublist:
259             old_obj=item.getObject()
260             if old_obj in liste:break
261
262          for obj in iliste:
263             if obj is old_obj:break
264             # nouvel objet : on cree un nouvel item
265             def setfunction(value, object=obj):
266                 object.setval(value)
267             it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
268             sublist.append(it)
269
270          if old_obj is None and obj is None:break
271          if old_obj is obj:
272             sublist.append(item)
273
274       self.sublist=sublist
275       return self.sublist
276
277   def isvalid(self):
278       return self.object.isvalid()
279
280   def iscopiable(self):
281       """
282       Retourne 1 si l'objet est copiable, 0 sinon
283       """
284       return 1
285
286   def update(self,item):
287       if item.sd and item.sd.nom:
288          self.nomme_sd(item.sd.nom)
289
290   def nomme_sd(self,nom):
291       """ Lance la méthode de nommage de la SD """
292       test,mess= self.object.nomme_sd(nom)
293       if test:self.object.parent.reset_context()
294       return test,mess
295
296   def is_reentrant(self):
297       return self.object.is_reentrant()
298     
299   def get_noms_sd_oper_reentrant(self):
300       return self.object.get_noms_sd_oper_reentrant()
301
302   def get_objet_commentarise(self):
303       """
304           Cette méthode retourne un objet commentarisé
305           représentatif de self.object
306       """
307       import generator,string,Accas
308       # Format de fichier utilisé
309       format=self.appli.format_fichier.get()
310       g=generator.plugins[format]()
311       texte_commande = g.gener(self.object,format='beautifie')
312       # Il faut enlever la première ligne vide de texte_commande que 
313       # rajoute le generator
314       rebut,texte_commande = string.split(texte_commande,'\n',1)
315       # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
316       # enregistré dans le jdc
317       commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
318                                              parent=self.object.parent)
319       commande_comment.niveau = self.object.niveau
320       commande_comment.jdc = commande_comment.parent = self.object.jdc
321
322       pos=self.object.parent.etapes.index(self.object)
323       self.object.parent.suppentite(self.object)
324       self.object.parent.addentite(commande_comment,pos)
325
326       return commande_comment
327
328   def additem_BAK(self,name,pos):
329       mcent=self.addentite(name,pos)
330
331       self.expandable=1
332       if mcent == 0 :
333           # on ne peut ajouter l'élément de nom name
334           return 0
335       def setfunction(value, object=mcent):
336           object.setval(value)
337       item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
338       return item
339
340   def GetSubList_BAK(self):
341       sublist=[]
342       for obj in self.object.mc_liste:
343         def setfunction(value, object=obj):
344           object.setval(value)
345         item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
346         sublist.append(item)
347       return sublist
348
349   def verif_condition_bloc_BAK(self):
350       return self.object.verif_condition_bloc()
351
352   def replace_child(self,old_item,new_item):
353      """
354      Remplace old_item.getObject() par new_item.getObject() dans 
355      les fils de self.object
356      """
357      raise "OBSOLETE"
358      old_itemobject=old_item.getObject()
359      index = self.object.mc_liste.index(old_itemobject)
360      self.object.init_modif()
361      self.object.mc_liste.remove(old_itemobject)
362      self.object.mc_liste.insert(index,new_item.getObject())
363      self.object.fin_modif()
364      
365 import Accas
366 treeitem = EtapeTreeItem
367 objet = Accas.ETAPE    
368