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 # ======================================================================
26 from PyQt4.QtGui import *
27 from PyQt4.QtCore import *
29 class JDCTree( QTreeWidget ):
30 def __init__( self, jdc_item, QWParent):
31 QListView.__init__( self, QWParent )
32 print QWParent.__class__
34 print "je suis dans JDCTree et voilà ", jdc_item
37 self.editor = QWParent
38 self.appliEficas = self.editor.appliEficas
40 self.setColumnCount(2)
41 mesLabels=QStringList()
42 mesLabels << self.trUtf8('Commande ') << self.trUtf8('Concept/Valeur ')
43 self.setHeaderLabels(mesLabels)
45 self.setMinimumSize(QSize(600,500))
47 self.setColumnWidth(0,300)
49 self.connect(self, SIGNAL("itemClicked ( QTreeWidgetItem * ,int) "), self.handleOnItem)
50 self.racine=self.item.itemNode(self,self.item)
51 self.expandItem(self.racine)
52 self.node_selected=self.racine
53 self.racine.affichePanneau()
56 def contextMenuEvent(self,event) :
57 coord=event.globalPos()
58 item= self.currentItem()
59 self.handleContextMenu(item,coord)
61 def handleContextMenu(self,item,coord):
63 Private slot to show the context menu of the listview.
65 @param itm the selected listview item (QListWidgetItem)
66 @param coord the position of the mouse pointer (QPoint)
67 Attention : existeMenu permet de savoir si un menu est associe a cet item
69 if item == None : return
70 if item.existeMenu == 0 : return
72 item.createPopUpMenu()
74 item.menu.exec_(coord)
76 def handleOnItem(self,item,int):
79 fr = item.item.get_fr()
81 self.editor.affiche_infos(fr)
87 COMMENT = "COMMENTAIRE"
88 PARAMETERS = "PARAMETRE"
90 class JDCNode(QTreeWidgetItem):
91 def __init__( self, treeParent, item):
93 self.treeParent = treeParent
94 self.tree = self.treeParent.tree
95 self.editor = self.treeParent.editor
96 self.appliEficas = treeParent.appliEficas
98 name = self.appliEficas.trUtf8( str( item.GetLabelText()[0] ) )
99 value = self.appliEficas.trUtf8( str( item.GetText() ) )
100 mesColonnes=QStringList()
101 mesColonnes << name << value
102 QTreeWidgetItem.__init__(self,treeParent,mesColonnes)
104 monIcone = QIcon("/home/noyret/Install_Eficas/EficasV1/InterfaceQT4/icons/" +self.item.GetIconName() + ".gif")
105 self.setIcon(0,monIcone)
107 self.build_children()
111 self.item.connect("valid",self.onValid,())
112 self.item.connect("supp" ,self.onAdd,())
113 self.item.connect("add" ,self.onSupp,())
115 def build_children(self,posInsertion=10000):
116 """ Construit la liste des enfants de self """
117 """ Se charge de remettre les noeuds Expanded dans le meme etat """
118 #print "*********** build_children ", self.item.GetLabelText()
120 for item in self.children :
121 if item.isExpanded():
122 if self.children.index(item) < posInsertion :
123 listeExpanded.append(self.children.index(item))
125 listeExpanded.append( self.children.index(item) +1)
126 self.removeChild(item)
128 sublist = self.item._GetSubList()
130 for item in sublist :
131 nouvelItem=item.itemNode(self,item)
132 self.children.append(nouvelItem)
133 if ind in listeExpanded : nouvelItem.setExpanded(1)
136 def affichePanneau(self) :
137 if self.item.isactif():
138 panel=self.getPanel()
140 from monInactifPanel import PanelInactif
141 panel = PanelInactif(self,self.editor)
146 def createPopUpMenu(self):
147 #implemente dans les noeuds derives si necessaire
152 Cette methode a pour but de commentariser la commande pointee par self
154 # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
155 # (commentariser) un commentaire.
157 pos=self.treeParent.children.index(self)
158 commande_comment = self.item.get_objet_commentarise()
159 # On signale a l editeur du panel (le JDCDisplay) une modification
160 self.editor.init_modif()
161 self.treeParent.build_children()
162 self.treeParent.children[pos].select()
163 self.treeParent.children[pos].affichePanneau()
165 traceback.print_exc()
166 QMessageBox.critical( self.editor, "TOO BAD",str(e))
168 def unCommentIt(self):
170 Realise la decommentarisation de self
173 pos=self.treeParent.children.index(self)
174 commande,nom = self.item.uncomment()
175 self.editor.init_modif()
176 self.treeParent.build_children()
177 self.treeParent.children[pos].select()
178 self.treeParent.children[pos].affichePanneau()
180 QMessageBox.critical( self.editor, "Erreur !",str(e))
182 def addComment( self, after=True ):
184 Ajoute un commentaire a l'interieur du JDC :
186 self.editor.init_modif()
191 return self.append_brother( COMMENT, pos )
193 def addParameters( self, after=True ):
195 Ajoute un parametre a l'interieur du JDC :
197 self.editor.init_modif()
202 return self.append_brother( PARAMETERS, pos )
207 Rend le noeud courant (self) selectionne et deselectionne
210 for item in self.tree.selectedItems() :
212 #print "select -----------> " , self.item.GetLabelText()
213 self.setSelected( True )
214 self.setExpanded( True )
215 self.tree.setCurrentItem( self )
216 self.tree.node_selected= self
218 #------------------------------------------------------------------
219 # Methodes de creation et destruction de noeuds
220 # Certaines de ces methodes peuvent etre appelees depuis l'externe
221 #------------------------------------------------------------------
222 def append_brother(self,name,pos='after'):
224 Permet d'ajouter un objet frere a l'objet associe au noeud self
225 par defaut on l'ajoute immediatement apres
228 #print "*********** append_brother ", self.item.GetLabelText()
229 self.editor.init_modif()
230 index = self.treeParent.children.index(self)
236 print str(pos)," n'est pas un index valide pour append_brother"
238 return self.treeParent.append_child(name,pos=index)
240 def append_child(self,name,pos=None,verif='oui'):
242 Methode pour ajouter un objet fils a l'objet associe au noeud self.
243 On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
244 ou en position intermediaire.
245 Si pos vaut None, on le place a la position du catalogue.
247 #print "************** append_child ",self.item.GetLabelText()
248 self.editor.init_modif()
252 index = len(self.children)
253 elif type(pos) == types.IntType :
256 elif type(pos) == types.InstanceType:
257 # pos est un item. Il faut inserer name apres pos
258 index = self.item.get_index(pos) +1
259 elif type(name) == types.InstanceType:
260 index = self.item.get_index_child(name.nom)
262 index = self.item.get_index_child(name)
263 obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
266 self.build_children(index)
267 child=self.children[index]
268 child.affichePanneau()
273 Methode externe pour la destruction de l'objet associe au noeud
275 self.editor.init_modif()
276 index = self.treeParent.children.index(self) - 1
277 if index < 0 : index =0
279 ret=self.treeParent.item.suppitem(self.item)
282 self.treeParent.build_children()
283 brothers=self.treeParent.children
285 toselect=brothers[index]
287 toselect=self.treeParent
289 toselect.affichePanneau()
292 # #------------------------------------------------------------------
294 self.editor.init_modif()
295 self.update_node_valid()
296 self.update_node_label()
297 self.update_node_texte()
299 def onAdd(self,object):
300 #print "NODE onAdd", self.item.GetLabelText()
301 self.editor.init_modif()
304 def onSupp(self,object):
305 #print "NODE onSupp", self.item.GetLabelText()
306 self.editor.init_modif()
310 def update_node_valid(self):
311 """Cette methode remet a jour la validite du noeud (icone)
314 #print 'NODE update_node_valid', self.item.GetLabelText()
315 monIcone = QIcon("/home/noyret/Install_Eficas/EficasV1/InterfaceQT4/icons/" +self.item.GetIconName() + ".gif")
316 self.setIcon(0,monIcone)
318 def update_node_label(self):
319 """ Met a jour le label du noeud """
320 #print "NODE update_node_label", self.item.GetLabelText()
321 labeltext,fonte,couleur = self.item.GetLabelText()
322 self.setText(0, labeltext)
324 def update_node_texte(self):
325 """ Met a jour les noms des SD et valeurs des mots-cles """
326 #print "NODE update_node_texte", self.item.GetLabelText()
327 value = self.item.GetText()
328 self.setText(1, value)
330 def update_nodes(self):
331 #print 'NODE update_nodes', self.item.GetLabelText()
332 self.build_children()
334 def update_texte(self):
335 """ Met a jour les noms des SD et valeurs des mots-cles """
336 #print "NODE update_texte", self.item.GetLabelText()
337 self.update_node_texte()
338 if self.isExpanded() :
339 for child in self.children:
340 if child.isHidden() == false : child.update_texte()
342 # def update_valid(self) :
343 # """Cette methode a pour but de mettre a jour la validite du noeud
344 # et de propager la demande de mise a jour a son Parent
346 # #print "NODE update_valid", self.item.GetLabelText()
347 # self.update_node_valid()
349 # self.treeParent.update_valid()
353 def doPasteCommande(self,objet_a_copier):
355 Réalise la copie de l'objet passé en argument qui est nécessairement
358 print "objet_a_copier = ", objet_a_copier.item.GetLabelText()
359 child = self.append_brother(objet_a_copier)
362 def doPasteMCF(self,objet_a_copier):
364 Réalise la copie de l'objet passé en argument (objet_a_copier)
365 Il s'agit forcément d'un mot clé facteur
367 child = self.append_child(objet_a_copier,pos='first')
370 if __name__=='__main__':
372 from PyQt4.QtGui import *
373 from PyQt4.QtCore import *
376 # sys.path[:0]=['..','../Aster','../Aster/Cata' ]
378 # app = QApplication(sys.argv)
380 # fn = 'azAster.comm'
381 # jdcName = os.path.basename(fn)
389 # from autre_analyse_cata import analyse_catalogue
390 # from Cata import cataSTA8
392 # fic_cata="../../Aster/Cata/cataSTA8/cata.py"
393 # cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
397 # j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
398 # cata_ord_dico=cata_ordonne )
401 # if not j.cr.estvide():
406 # if not j.cr.estvide():
410 # from Editeur import comploader
411 # comploader.charger_composants(QT)
412 # from Editeur import Objecttreeitem
413 # jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
416 # tree = JDCTree( jdc_item, None )
418 # app.setMainWidget(tree)
419 # app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
422 # res = app.exec_loop()