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