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.
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.
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.
20 # ======================================================================
28 class OPERPanel(panels.OngletPanel):
31 nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
32 nb.pack(fill = 'both', expand = 1)
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"),
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()
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 # commande obligatoirement reentrante
57 self.makeConceptPage_reentrant(page)
59 # commande non reentrante ou facultativement reentrante
60 self.makeConceptPage(page)
62 def makeConceptPage_reentrant(self,page):
63 """ Crée la page de saisie du nom de concept pour un opérateur reentrant
64 cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
65 type est compatible avec celui que retourne l'opérateur """
66 liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
67 self.listbox = Pmw.ScrolledListBox(page,
70 label_text="Structure(s) de données à enrichir par l'opérateur courant :",
72 selectioncommand=self.select_valeur_from_list,
73 dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
74 self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
75 Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
76 self.valeur_choisie = StringVar()
77 self.label_valeur = Label(page,textvariable=self.valeur_choisie)
78 self.label_valeur.place(relx=0.45,rely=0.6)
79 if len(liste_noms_sd) == 1 :
80 self.valeur_choisie.set(liste_noms_sd[0])
82 def select_valeur_from_list(self):
84 choix = self.listbox.getcurselection()[0]
85 self.valeur_choisie.set(choix)
90 def choose_valeur_from_list(self,command):
92 choix = self.listbox.getcurselection()[0]
93 self.valeur_choisie.set(choix)
99 class Node(treewidget.Node):
100 def doPaste(self,node_selected):
102 Déclenche la copie de l'objet item avec pour cible
103 l'objet passé en argument : node_selected
105 objet_a_copier = self.item.get_copie_objet()
106 child=node_selected.doPaste_Commande(objet_a_copier)
109 def doPaste_Commande(self,objet_a_copier):
111 Réalise la copie de l'objet passé en argument qui est nécessairement
115 #child = parent.item.append_child(objet_a_copier,self.item.getObject())
116 child = self.append_brother(objet_a_copier,retour='oui')
117 #if child is None:return 0
120 def doPaste_MCF(self,objet_a_copier):
122 Réalise la copie de l'objet passé en argument (objet_a_copier)
123 Il s'agit forcément d'un mot clé facteur
125 child = self.append_child(objet_a_copier,pos='first',retour='oui')
129 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
130 """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
131 Accas. Elle leur permet d'etre affichés comme des noeuds
132 d'un arbre graphique.
133 Cette classe a entre autres deux attributs importants :
134 - _object qui est un pointeur vers l'objet du noyau
135 - object qui pointe vers l'objet auquel sont délégués les
136 appels de méthode et les accès aux attributs
137 Dans le cas d'une ETAPE, _object et object pointent vers le
143 def IsExpandable(self):
146 def GetIconName(self):
148 Retourne le nom de l'icône à afficher dans l'arbre
149 Ce nom dépend de la validité de l'objet
151 if not self.object.isactif():
152 return "ast-white-square"
153 elif self.object.isvalid():
154 return "ast-green-square"
156 return "ast-red-square"
158 def GetLabelText(self):
159 """ Retourne 3 valeurs :
160 - le texte à afficher dans le noeud représentant l'item
161 - la fonte dans laquelle afficher ce texte
162 - la couleur du texte
164 if self.object.isactif():
165 # None --> fonte et couleur par défaut
166 return self.labeltext,None,None
168 return self.labeltext,fontes.standard_italique,None
170 def get_objet(self,name) :
171 for v in self.object.mc_liste:
172 if v.nom == name : return v
175 def get_type_sd_prod(self):
177 Retourne le nom du type du concept résultat de l'étape
179 sd_prod=self.object.get_type_produit()
181 return sd_prod.__name__
185 def additem(self,name,pos):
186 #print "compooper.additem",name,pos
187 mcent = self._object.addentite(name,pos)
190 def suppitem(self,item) :
191 # item : item du MOCLE de l'ETAPE à supprimer
192 # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
193 itemobject=item.getObject()
194 if itemobject.isoblig() :
195 self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
197 if self.object.suppentite(itemobject):
198 message = "Mot-clé " + itemobject.nom + " supprimé"
199 self.appli.affiche_infos(message)
202 self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
207 return self.object.get_sdname()
212 keys=self.object.mc_dict.keys()
215 def GetSubList(self):
217 Reactualise la liste des items fils stockes dans self.sublist
220 liste=self.object.mc_liste
224 sublist=[None]*len(liste)
225 # suppression des items lies aux objets disparus
226 for item in self.sublist:
227 old_obj=item.getObject()
229 pos=liste.index(old_obj)
232 pass # objets supprimes ignores
234 # ajout des items lies aux nouveaux objets
237 if sublist[pos] is None:
238 # nouvel objet : on cree un nouvel item
239 def setfunction(value, object=obj):
241 item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
248 def GetSubList_BAK(self):
251 liste=self.object.mc_liste
256 isublist=iter(self.sublist)
261 for item in isublist:
262 old_obj=item.getObject()
263 if old_obj in liste:break
266 if obj is old_obj:break
267 # nouvel objet : on cree un nouvel item
268 def setfunction(value, object=obj):
270 it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
273 if old_obj is None and obj is None:break
281 return self.object.isvalid()
283 def iscopiable(self):
285 Retourne 1 si l'objet est copiable, 0 sinon
289 def update(self,item):
290 if item.sd and item.sd.nom:
291 self.nomme_sd(item.sd.nom)
293 def nomme_sd(self,nom):
294 """ Lance la méthode de nommage de la SD """
296 if self.object.sd != None :
297 oldnom=self.object.sd.nom
298 test,mess= self.object.nomme_sd(nom)
299 if test:self.object.parent.reset_context()
300 if (test and self.appli.dict_reels.has_key(oldnom) ):
301 self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
304 def is_reentrant(self):
305 return self.object.is_reentrant()
307 def get_noms_sd_oper_reentrant(self):
308 return self.object.get_noms_sd_oper_reentrant()
310 def get_objet_commentarise(self):
312 Cette méthode retourne un objet commentarisé
313 représentatif de self.object
315 import generator,string,Accas
316 # Format de fichier utilisé
317 format=self.appli.format_fichier.get()
318 g=generator.plugins[format]()
319 texte_commande = g.gener(self.object,format='beautifie')
320 # Il faut enlever la première ligne vide de texte_commande que
321 # rajoute le generator
322 rebut,texte_commande = string.split(texte_commande,'\n',1)
323 # on construit l'objet COMMANDE_COMM repésentatif de self mais non
324 # enregistré dans le jdc
325 commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
326 parent=self.object.parent)
327 commande_comment.niveau = self.object.niveau
328 commande_comment.jdc = commande_comment.parent = self.object.jdc
330 pos=self.object.parent.etapes.index(self.object)
331 self.object.parent.suppentite(self.object)
332 self.object.parent.addentite(commande_comment,pos)
334 return commande_comment
336 def additem_BAK(self,name,pos):
338 mcent=self.addentite(name,pos)
342 # on ne peut ajouter l'élément de nom name
344 def setfunction(value, object=mcent):
346 item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
349 def GetSubList_BAK(self):
352 for obj in self.object.mc_liste:
353 def setfunction(value, object=obj):
355 item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
359 def verif_condition_bloc_BAK(self):
361 return self.object.verif_condition_bloc()
363 def replace_child_BAK(self,old_item,new_item):
365 Remplace old_item.getObject() par new_item.getObject() dans
366 les fils de self.object
369 old_itemobject=old_item.getObject()
370 index = self.object.mc_liste.index(old_itemobject)
371 self.object.init_modif()
372 self.object.mc_liste.remove(old_itemobject)
373 self.object.mc_liste.insert(index,new_item.getObject())
374 self.object.fin_modif()
377 treeitem = EtapeTreeItem