1 # -*- coding: utf-8 -*-
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 # ======================================================================
27 from PyQt4.QtGui import *
28 from PyQt4.QtCore import *
30 class JDCTree( QTreeWidget ):
31 def __init__( self, jdc_item, QWParent):
32 QListView.__init__( self, QWParent )
36 self.editor = QWParent
37 self.appliEficas = self.editor.appliEficas
39 self.setColumnCount(2)
40 mesLabels=QStringList()
41 mesLabels << self.trUtf8('Commande ') << self.trUtf8('Concept/Valeur ')
42 self.setHeaderLabels(mesLabels)
44 #self.setMinimumSize(QSize(600,505))
46 self.setColumnWidth(0,300)
48 QMessageBox.critical(self.editor,'probleme d environnement', "L environnement doit etre en QT4")
50 self.itemCourrant=None
52 self.connect(self, SIGNAL("itemClicked ( QTreeWidgetItem * ,int) "), self.handleOnItem)
53 self.racine=self.item.itemNode(self,self.item)
54 self.expandItem(self.racine)
55 self.node_selected=self.racine
56 self.racine.affichePanneau()
59 def contextMenuEvent(self,event) :
60 coord=event.globalPos()
61 item= self.currentItem()
62 self.handleContextMenu(item,coord)
64 def handleContextMenu(self,item,coord):
66 Private slot to show the context menu of the listview.
68 @param itm the selected listview item (QListWidgetItem)
69 @param coord the position of the mouse pointer (QPoint)
70 Attention : existeMenu permet de savoir si un menu est associe a cet item
72 if item == None : return
73 if item.existeMenu == 0 : return
75 item.createPopUpMenu()
77 if item.item.get_nom() == "DISTRIBUTION" and item.item.isvalid() :
78 item.Graphe.setEnabled(1)
79 item.menu.exec_(coord)
81 def handleOnItem(self,item,int):
82 self.itemCourrant=item
84 fr = item.item.get_fr()
86 self.editor.affiche_infos(QString.toUtf8(QString(fr)))
93 COMMENT = "COMMENTAIRE"
94 PARAMETERS = "PARAMETRE"
96 class JDCNode(QTreeWidgetItem):
97 def __init__( self, treeParent, item):
99 self.treeParent = treeParent
100 self.tree = self.treeParent.tree
101 self.editor = self.treeParent.editor
102 self.appliEficas = treeParent.appliEficas
104 name = self.appliEficas.trUtf8( str( item.GetLabelText()[0] ) )
105 value = self.appliEficas.trUtf8( str( item.GetText() ) )
106 mesColonnes=QStringList()
107 mesColonnes << name << value
108 QTreeWidgetItem.__init__(self,treeParent,mesColonnes)
110 RepIcon=QString(self.appliEficas.RepIcon)
111 monIcone = QIcon(RepIcon+"/" +self.item.GetIconName() + ".png")
112 self.setIcon(0,monIcone)
114 self.build_children()
118 self.item.connect("valid",self.onValid,())
119 self.item.connect("supp" ,self.onSupp,())
120 self.item.connect("add" ,self.onAdd,())
125 def build_children(self,posInsertion=10000):
126 """ Construit la liste des enfants de self """
127 """ Se charge de remettre les noeuds Expanded dans le meme etat """
128 #print "*********** build_children ", self.item.GetLabelText()
130 for item in self.children :
131 if item.isExpanded():
132 if self.children.index(item) < posInsertion :
133 listeExpanded.append(self.children.index(item))
135 listeExpanded.append( self.children.index(item) +1)
136 self.removeChild(item)
138 sublist = self.item._GetSubList()
140 for item in sublist :
141 nouvelItem=item.itemNode(self,item)
142 self.children.append(nouvelItem)
143 if ind in listeExpanded : nouvelItem.setExpanded(1)
146 def affichePanneau(self) :
147 if self.item.isactif():
148 panel=self.getPanel()
150 from monInactifPanel import PanelInactif
151 panel = PanelInactif(self,self.editor)
156 def createPopUpMenu(self):
157 #implemente dans les noeuds derives si necessaire
162 Cette methode a pour but de commentariser la commande pointee par self
164 # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
165 # (commentariser) un commentaire.
167 pos=self.treeParent.children.index(self)
168 commande_comment = self.item.get_objet_commentarise()
169 # On signale a l editeur du panel (le JDCDisplay) une modification
170 self.editor.init_modif()
171 self.treeParent.build_children()
172 self.treeParent.children[pos].select()
173 self.treeParent.children[pos].affichePanneau()
175 traceback.print_exc()
176 QMessageBox.critical( self.editor, "TOO BAD",str(e))
178 def unCommentIt(self):
180 Realise la decommentarisation de self
183 pos=self.treeParent.children.index(self)
184 commande,nom = self.item.uncomment()
185 self.editor.init_modif()
186 self.treeParent.build_children()
187 self.treeParent.children[pos].select()
188 self.treeParent.children[pos].affichePanneau()
190 QMessageBox.critical( self.editor, "Erreur !",str(e))
192 def addComment( self, after=True ):
194 Ajoute un commentaire a l'interieur du JDC :
196 self.editor.init_modif()
201 return self.append_brother( COMMENT, pos )
203 def addParameters( self, after=True ):
205 Ajoute un parametre a l'interieur du JDC :
207 self.editor.init_modif()
212 return self.append_brother( PARAMETERS, pos )
217 Rend le noeud courant (self) selectionne et deselectionne
220 for item in self.tree.selectedItems() :
222 #print "select -----------> " , self.item.GetLabelText()
223 self.setSelected( True )
224 self.setExpanded( True )
225 self.tree.setCurrentItem( self )
226 self.tree.node_selected= self
228 #------------------------------------------------------------------
229 # Methodes de creation et destruction de noeuds
230 # Certaines de ces methodes peuvent etre appelees depuis l'externe
231 #------------------------------------------------------------------
232 def append_brother(self,name,pos='after'):
234 Permet d'ajouter un objet frere a l'objet associe au noeud self
235 par defaut on l'ajoute immediatement apres
238 #print "*********** append_brother ", self.item.GetLabelText()
239 self.editor.init_modif()
240 index = self.treeParent.children.index(self)
246 print str(pos)," n'est pas un index valide pour append_brother"
248 return self.treeParent.append_child(name,pos=index)
250 def append_child(self,name,pos=None,verif='oui'):
252 Methode pour ajouter un objet fils a l'objet associe au noeud self.
253 On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
254 ou en position intermediaire.
255 Si pos vaut None, on le place a la position du catalogue.
257 #print "************** append_child ",self.item.GetLabelText()
258 self.editor.init_modif()
262 index = len(self.children)
263 elif type(pos) == types.IntType :
266 elif type(pos) == types.InstanceType:
267 # pos est un item. Il faut inserer name apres pos
268 index = self.item.get_index(pos) +1
269 elif type(name) == types.InstanceType:
270 index = self.item.get_index_child(name.nom)
272 index = self.item.get_index_child(name)
273 obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
276 child=self.children[index]
277 child.affichePanneau()
282 Methode externe pour la destruction de l'objet associe au noeud
284 self.editor.init_modif()
285 index = self.treeParent.children.index(self) - 1
286 if index < 0 : index =0
288 if self.item.nom == "VARIABLE" :
292 ret=self.treeParent.item.suppitem(self.item)
295 self.treeParent.build_children()
296 brothers=self.treeParent.children
298 toselect=brothers[index]
300 toselect=self.treeParent
302 jdc.recalcule_etat_correlation()
304 toselect.affichePanneau()
307 # #------------------------------------------------------------------
309 if self.item.nom == "VARIABLE" and self.item.isvalid():
310 self.item.jdc.recalcule_etat_correlation()
311 if hasattr(self.item,'forceRecalcul'):
312 self.forceRecalculChildren(self.item.forceRecalcul)
313 self.editor.init_modif()
314 self.update_node_valid()
315 self.update_node_label()
316 self.update_node_texte()
318 def onAdd(self,object):
319 self.editor.init_modif()
322 def onSupp(self,object):
324 self.editor.init_modif()
327 def update_node_valid(self):
328 """Cette methode remet a jour la validite du noeud (icone)
331 #print 'NODE update_node_valid', self.item.GetLabelText()
332 RepIcon=QString(self.appliEficas.RepIcon)
333 monIcone = QIcon(RepIcon+"/" +self.item.GetIconName() + ".png")
334 self.setIcon(0,monIcone)
336 def update_node_label(self):
337 """ Met a jour le label du noeud """
338 #print "NODE update_node_label", self.item.GetLabelText()
339 labeltext,fonte,couleur = self.item.GetLabelText()
340 self.setText(0, labeltext)
342 def update_node_label_in_blue(self):
343 if hasattr(self.appliEficas,'noeudColore'):
344 self.appliEficas.noeudColore.setTextColor( 0,Qt.black)
345 self.appliEficas.noeudColore.update_node_label()
346 self.setTextColor( 0,Qt.blue )
347 labeltext,fonte,couleur = self.item.GetLabelText()
348 self.setText(0, labeltext)
349 self.appliEficas.noeudColore=self
351 def update_node_texte(self):
352 """ Met a jour les noms des SD et valeurs des mots-cles """
353 value = self.item.GetText()
354 self.setText(1, value)
356 def update_nodes(self):
357 #print 'NODE update_nodes', self.item.GetLabelText()
358 self.build_children()
360 def update_valid(self) :
361 """Cette methode a pour but de mettre a jour la validite du noeud
362 et de propager la demande de mise a jour a son parent
364 #print "NODE update_valid", self.item.GetLabelText()
365 self.update_node_valid()
367 self.treeParent.update_valid()
371 def update_texte(self):
372 """ Met a jour les noms des SD et valeurs des mots-cles """
373 #print "NODE update_texte", self.item.GetLabelText()
374 self.update_node_texte()
375 if self.isExpanded() :
376 for child in self.children:
377 if child.isHidden() == false : child.update_texte()
380 def forceRecalculChildren(self,niveau):
381 if self.state=='recalcule' :
384 self.state='recalcule'
385 if hasattr(self.item,'object'):
386 self.item.object.state="modified"
387 for child in self.children:
388 if niveau > 0 : child.forceRecalculChildren(niveau - 1)
392 def doPaste(self,node_selected):
394 Déclenche la copie de l'objet item avec pour cible
395 l'objet passé en argument : node_selected
397 #print 'je passe dans doPaste'
398 objet_a_copier = self.item.get_copie_objet()
399 child=node_selected.doPasteCommande(objet_a_copier)
402 def doPasteCommande(self,objet_a_copier):
404 Réalise la copie de l'objet passé en argument qui est nécessairement
407 #print 'je passe dans doPasteCommande'
409 child = self.append_brother(objet_a_copier)
414 def doPasteMCF(self,objet_a_copier):
416 Réalise la copie de l'objet passé en argument (objet_a_copier)
417 Il s'agit forcément d'un mot clé facteur
419 #print 'je passe dans doPasteMCF'
420 child = self.append_child(objet_a_copier,pos='first',retour='oui')
424 if __name__=='__main__':
426 from PyQt4.QtGui import *
427 from PyQt4.QtCore import *
430 # sys.path[:0]=['..','../Aster','../Aster/Cata' ]
432 # app = QApplication(sys.argv)
434 # fn = 'azAster.comm'
435 # jdcName = os.path.basename(fn)
443 # from autre_analyse_cata import analyse_catalogue
444 # from Cata import cataSTA8
446 # fic_cata="../../Aster/Cata/cataSTA8/cata.py"
447 # cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
451 # j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
452 # cata_ord_dico=cata_ordonne )
455 # if not j.cr.estvide():
460 # if not j.cr.estvide():
464 # from Editeur import comploader
465 # comploader.charger_composants(QT)
466 # from Editeur import Objecttreeitem
467 # jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
470 # tree = JDCTree( jdc_item, None )
472 # app.setMainWidget(tree)
473 # app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
476 # res = app.exec_loop()