Salome HOME
PN : pour afficher correctement les arguments de la formule nouvelle.
[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         child = self.append_brother(objet_a_copier,retour='oui')
113         return child
114
115     def doPaste_MCF(self,objet_a_copier):
116         """
117            Réalise la copie de l'objet passé en argument (objet_a_copier)
118            Il s'agit forcément d'un mot clé facteur
119         """
120         child = self.append_child(objet_a_copier,pos='first',retour='oui')
121         return child
122
123
124 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
125   """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
126       Accas. Elle leur permet d'etre affichés comme des noeuds
127       d'un arbre graphique.
128       Cette classe a entre autres deux attributs importants :
129         - _object qui est un pointeur vers l'objet du noyau
130         - object qui pointe vers l'objet auquel sont délégués les
131           appels de méthode et les accès aux attributs
132       Dans le cas d'une ETAPE, _object et object pointent vers le 
133       meme objet.
134   """
135   panel = OPERPanel
136   itemNode=Node
137   
138   def IsExpandable(self):
139       return 1
140
141   def GetIconName(self):
142       """
143       Retourne le nom de l'icône à afficher dans l'arbre
144       Ce nom dépend de la validité de l'objet
145       """
146       if not self.object.isactif():
147          return "ast-white-square"
148       elif self.object.isvalid():
149          return "ast-green-square"
150       else:
151          return "ast-red-square"
152
153   def GetLabelText(self):
154       """ Retourne 3 valeurs :
155       - le texte à afficher dans le noeud représentant l'item
156       - la fonte dans laquelle afficher ce texte
157       - la couleur du texte
158       """
159       if self.object.isactif():
160         # None --> fonte et couleur par défaut
161         return self.labeltext,None,None
162       else:
163         return self.labeltext,fontes.standard_italique,None
164       
165   def get_objet(self,name) :
166       for v in self.object.mc_liste:
167           if v.nom == name : return v
168       return None
169       
170   def get_type_sd_prod(self):
171       """
172          Retourne le nom du type du concept résultat de l'étape
173       """
174       sd_prod=self.object.get_type_produit()
175       if sd_prod:
176          return sd_prod.__name__
177       else:
178          return ""
179
180   def additem(self,name,pos):
181       if isinstance(name,Objecttreeitem.ObjectTreeItem) :
182           mcent = self.object.addentite(name.getObject(),pos)
183       else :
184           mcent = self.object.addentite(name,pos)
185       self.expandable=1
186       if mcent == 0 :
187           # on ne peut ajouter l'élément de nom name
188           return 0
189       def setfunction(value, object=mcent):
190           object.setval(value)
191       item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
192       return item
193
194   def suppitem(self,item) :
195       # item : item du MOCLE de l'ETAPE à supprimer
196       # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList 
197       itemobject=item.getObject()
198       if itemobject.isoblig() :
199           self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
200           return 0
201       if self.object.suppentite(itemobject):
202           message = "Mot-clé " + itemobject.nom + " supprimé"
203           self.appli.affiche_infos(message)
204           return 1
205       else :
206           self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
207           return 0
208
209   def GetText(self):
210       try:
211           return self.object.get_sdname()
212       except:
213           return ''
214
215   def keys(self):
216       keys=self.object.mc_dict.keys()
217       return keys
218
219   def GetSubList(self):
220       sublist=[]
221       for obj in self.object.mc_liste:
222         def setfunction(value, object=obj):
223           object.setval(value)
224         item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
225         sublist.append(item)
226       return sublist
227
228   def isvalid(self):
229       return self.object.isvalid()
230
231   def iscopiable(self):
232       """
233       Retourne 1 si l'objet est copiable, 0 sinon
234       """
235       return 1
236
237   def verif_condition_bloc(self):
238       return self.object.verif_condition_bloc()
239
240   def nomme_sd(self,nom):
241       """ Lance la méthode de nommage de la SD """
242       test,mess= self.object.nomme_sd(nom)
243       if test:self.object.parent.reset_context()
244       return test,mess
245
246   def is_reentrant(self):
247       return self.object.is_reentrant()
248     
249   def get_noms_sd_oper_reentrant(self):
250       return self.object.get_noms_sd_oper_reentrant()
251
252   def get_objet_commentarise(self):
253       """
254           Cette méthode retourne un objet commentarisé
255           représentatif de self.object
256       """
257       import generator,string,Accas
258       # Format de fichier utilisé
259       format=self.appli.format_fichier.get()
260       g=generator.plugins[format]()
261       texte_commande = g.gener(self.object,format='beautifie')
262       # Il faut enlever la première ligne vide de texte_commande que 
263       # rajoute le generator
264       rebut,texte_commande = string.split(texte_commande,'\n',1)
265       # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
266       # enregistré dans le jdc
267       commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
268                                              parent=self.object.parent)
269       commande_comment.niveau = self.object.niveau
270       commande_comment.jdc = commande_comment.parent = self.object.jdc
271       return commande_comment
272
273   def replace_child(self,old_item,new_item):
274      """
275      Remplace old_item.getObject() par new_item.getObject() dans 
276      les fils de self.object
277      """
278      old_itemobject=old_item.getObject()
279      index = self.object.mc_liste.index(old_itemobject)
280      self.object.init_modif()
281      self.object.mc_liste.remove(old_itemobject)
282      self.object.mc_liste.insert(index,new_item.getObject())
283      self.object.fin_modif()
284      
285 import Accas
286 treeitem = EtapeTreeItem
287 objet = Accas.ETAPE    
288