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.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()
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)
62 # commande non reentrante ou facultativement reentrante
63 self.makeConceptPage(page)
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,
73 label_text="Structure(s) de données à enrichir par l'opérateur courant :",
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])
85 def select_valeur_from_list(self):
87 choix = self.listbox.getcurselection()[0]
88 self.valeur_choisie.set(choix)
93 def choose_valeur_from_list(self,command):
95 choix = self.listbox.getcurselection()[0]
96 self.valeur_choisie.set(choix)
102 class Node(treewidget.Node):
103 def doPaste(self,node_selected):
105 Déclenche la copie de l'objet item avec pour cible
106 l'objet passé en argument : node_selected
108 objet_a_copier = self.item.get_copie_objet()
109 child=node_selected.doPaste_Commande(objet_a_copier)
112 def doPaste_Commande(self,objet_a_copier):
114 Réalise la copie de l'objet passé en argument qui est nécessairement
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
123 def doPaste_MCF(self,objet_a_copier):
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
128 child = self.append_child(objet_a_copier,pos='first',retour='oui')
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
146 def IsExpandable(self):
149 def GetIconName(self):
151 Retourne le nom de l'icône à afficher dans l'arbre
152 Ce nom dépend de la validité de l'objet
154 if not self.object.isactif():
155 return "ast-white-square"
156 elif self.object.isvalid():
157 return "ast-green-square"
159 return "ast-red-square"
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
167 if self.object.isactif():
168 # None --> fonte et couleur par défaut
169 return self.labeltext,None,None
171 return self.labeltext,fontes.standard_italique,None
173 def get_objet(self,name) :
174 for v in self.object.mc_liste:
175 if v.nom == name : return v
178 def get_type_sd_prod(self):
180 Retourne le nom du type du concept résultat de l'étape
182 sd_prod=self.object.get_type_produit()
184 return sd_prod.__name__
188 def additem(self,name,pos):
189 #print "compooper.additem",name,pos
190 mcent = self._object.addentite(name,pos)
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 ')
200 if self.object.suppentite(itemobject):
201 message = "Mot-clé " + itemobject.nom + " supprimé"
202 self.appli.affiche_infos(message)
205 self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
210 return self.object.get_sdname()
215 keys=self.object.mc_dict.keys()
218 def GetSubList(self):
220 Reactualise la liste des items fils stockes dans self.sublist
223 liste=self.object.mc_liste
227 sublist=[None]*len(liste)
228 # suppression des items lies aux objets disparus
229 for item in self.sublist:
230 old_obj=item.getObject()
232 pos=liste.index(old_obj)
235 pass # objets supprimes ignores
237 # ajout des items lies aux nouveaux objets
240 if sublist[pos] is None:
241 # nouvel objet : on cree un nouvel item
242 def setfunction(value, object=obj):
244 item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
252 return self.object.isvalid()
254 def iscopiable(self):
256 Retourne 1 si l'objet est copiable, 0 sinon
260 def update(self,item):
261 if item.sd and item.sd.nom:
262 self.nomme_sd(item.sd.nom)
264 def nomme_sd(self,nom):
265 """ Lance la méthode de nommage de la SD """
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]
275 def is_reentrant(self):
276 return self.object.is_reentrant()
278 def get_noms_sd_oper_reentrant(self):
279 return self.object.get_noms_sd_oper_reentrant()
281 def get_objet_commentarise(self):
283 Cette méthode retourne un objet commentarisé
284 représentatif de self.object
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
301 pos=self.object.parent.etapes.index(self.object)
302 parent=self.object.parent
303 self.object.parent.suppentite(self.object)
304 parent.addentite(commande_comment,pos)
306 return commande_comment
309 treeitem = EtapeTreeItem