1 # -*- coding: utf-8 -*-
2 import os,sys,string,re,types,traceback
8 class JDCTree( QListView ):
9 def __init__( self, jdc_item, parent = None ):
10 QListView.__init__( self, parent )
16 self.node_selected = None
17 self.children = self.build_children()
19 self.setCaption(self.trUtf8('Browser'))
20 self.setRootIsDecorated(1)
22 self.addColumn(self.trUtf8('Commande'))
23 self.addColumn(self.trUtf8('Concept/Valeur'))
25 self.setMinimumSize(QSize(400,500))
26 self.connect(self,SIGNAL('contextMenuRequested(QListViewItem *, const QPoint &, int)'),
27 self.handleContextMenu)
29 #self.connect(self, SIGNAL("onItem ( QListViewItem * ) "), self.handleOnItem)
30 self.connect(self, SIGNAL("clicked ( QListViewItem * ) "), self.handleOnItem)
31 self.connect(self, SIGNAL('mouseButtonPressed(int, QListViewItem*, const QPoint&, int)'),
35 def handleContextMenu(self,itm,coord,col):
37 Private slot to show the context menu of the listview.
39 @param itm the selected listview item (QListViewItem)
40 @param coord the position of the mouse pointer (QPoint)
41 @param col the column of the mouse pointer (int)
49 def handleNommeItem(self,bouton,itm,coord,col):
51 PN --> a finir eventuellement pour nommer
52 le concept dans l arbre
57 if panel.node.item.object.get_type_produit() != None :
62 def handleOnItem(self, item ):
64 fr = item.item.get_fr()
66 self.editor.affiche_infos(fr)
70 def build_children(self):
71 """ Construit la liste des enfants de self """
73 child = self.item.itemNode(self,self.item)
74 children.append(child)
75 child.state='expanded'
79 """ supprime tous les elements de l'arbre """
80 raise RuntimeError, 'Not implemented'
83 self.node_selected = None
85 self.scrolledcanvas = None
86 for child in self.children:
90 def showEvent(self, event):
91 """ QT : pour afficher le 1er niveau d'arborescence de l''arbre"""
92 self.children[0].select()
95 """ Update tous les elements de l'arbre """
96 for child in self.children:
100 COMMENT = "COMMENTAIRE"
101 PARAMETERS = "PARAMETRE"
104 class JDCNode(QListViewItem):
105 def __init__( self, parent, item, after=None, bold=0):
109 @param parent parent Browser or BrowserNode
110 @param text text to be displayed by this node (string or QString)
111 @param after sibling this node is positioned after
112 @param bold flag indicating a highlighted font
116 self.tree = self.parent.tree
117 self.editor = self.parent.tree.editor
120 name = self.tree.trUtf8( str( item.GetLabelText()[0] ) )
121 value = self.tree.trUtf8( str( item.GetText() ) )
124 QListViewItem.__init__(self,parent)
125 self.setText(0, name )
126 self.setText(1, value )
128 QListViewItem.__init__(self,parent, after)
129 self.setText(0, name )
130 self.setText(1, value)
132 p = utilIcons.getPixmap(item.GetIconName() + ".gif")
134 self.setExpandable(item.IsExpandable())
138 self.createPopUpMenu()
141 def paintCell(self, p, cg, column, width, alignment):
143 Overwritten class to set a different text color, if bold is true.
145 @param p the painter (QPainter)
146 @param cg the color group (QColorGroup)
147 @param column the column (int)
148 @param width width of the cell (int)
149 @param alignment alignment of the cell (int)
151 _cg = QColorGroup(cg)
154 if self.bold and column == 0:
155 _cg.setColor(QColorGroup.Text, Qt.red)
157 QListViewItem.paintCell(self, p, _cg, column, width, alignment)
159 _cg.setColor(QColorGroup.Text, c)
162 def setOpen(self, o):
164 Public slot to set/reset the open state.
166 @param o flag indicating the open state
169 if not self.children :
170 self.build_children()
172 self.tree.node_selected = self
175 for child in self.children:
179 QListViewItem.setOpen(self,o)
180 self.tree.setSelected(self,o)
183 #----------------------------------------------------------
184 # interface a implementer par les noeuds derives (debut)
185 #----------------------------------------------------------
190 def createPopUpMenu(self):
193 #----------------------------------------------------
194 # interface a implementer par les noeuds derives (fin)
195 #----------------------------------------------------
197 def init(self): #CS_pbruno toclean
198 self.state='collapsed'
201 self.x = self.y =None
205 if self.parent is self.tree:
208 self.racine = self.parent.racine
211 self.item.connect("add",self.onAdd,())
212 self.item.connect("supp",self.onSupp,())
213 self.item.connect("valid",self.onValid,())
218 Cette methode a pour but de commentariser la commande pointee par self
220 # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
221 # (commentariser) un commentaire.
223 pos=self.parent.children.index(self)
224 commande_comment = self.item.get_objet_commentarise()
225 # On signale au parent du panel (le JDCDisplay) une modification
226 self.editor.init_modif()
227 self.parent.children[pos].select()
229 traceback.print_exc()
230 QMessageBox.critical( self.parent, "TOO BAD",str(e))
233 def unCommentIt(self):
235 Realise la decommentarisation de self
238 pos=self.parent.children.index(self)
239 commande,nom = self.item.uncomment()
240 self.editor.init_modif()
241 self.parent.children[pos].select()
243 QMessageBox.critical( self.editor, "Erreur !",str(e))
246 def addComment( self, after=True ):
248 Ajoute un commentaire a l'interieur du JDC :
250 self.editor.init_modif()
255 return self.append_brother( COMMENT, pos )
257 def addParameters( self, after=True ):
259 Ajoute un parametre a l'interieur du JDC :
261 self.editor.init_modif()
266 return self.append_brother( PARAMETERS, pos )
272 Rend le noeud courant (self) selectionne et deselectionne
277 #------------------------------------------------------------------
278 # Methodes de creation et destruction de noeuds
279 # Certaines de ces methodes peuvent etre appelees depuis l'externe
280 #------------------------------------------------------------------
281 def append_brother(self,name,pos='after',retour='non'):
283 Permet d'ajouter un objet frere a l'objet associe au noeud self
284 par defaut on l'ajoute immediatement apres
287 # on veut ajouter le frere de nom name directement avant ou apres self
288 ## print "*********** append_brother ", self.item.GetLabelText()
289 index = self.parent.children.index(self)
295 print str(pos)," n'est pas un index valide pour append_brother"
297 return self.parent.append_child(name,pos=index)
299 def append_child(self,name,pos=None,verif='oui',retour='non'):
301 Methode pour ajouter un objet fils a l'objet associe au noeud self.
302 On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
303 ou en position intermediaire.
304 Si pos vaut None, on le place a la position du catalogue.
306 ## print "************** append_child ",self.item.GetLabelText()
310 index = len(self.children)
311 elif type(pos) == types.IntType :
314 elif type(pos) == types.InstanceType:
315 # pos est un item. Il faut inserer name apres pos
316 index = self.item.get_index(pos) +1
317 elif type(name) == types.InstanceType:
318 index = self.item.get_index_child(name.nom)
320 index = self.item.get_index_child(name)
321 obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
325 #print "append_child",index,self.children
326 child=self.children[index]
332 Methode externe pour la destruction de l'objet associe au noeud
333 La mise a jour des noeuds est faite par onSupp sur notification
335 self.editor.init_modif()
336 index = self.parent.children.index(self) - 1
337 if index < 0 : index =0
340 ret=parent.item.suppitem(self.item)
343 brothers=parent.children
345 toselect=brothers[index]
350 #------------------------------------------------------------------
352 self.update_node_valid()
353 self.update_node_label()
354 self.update_node_texte()
357 def onAdd(self,objet):
358 #print "NODE onAdd : un objet a ete ajoute aux fils de l'item ",self.item.GetLabelText()
359 old_nodes=self.children
363 def onSupp(self,objet):
364 #print "NODE onSupp : un objet a ete supprime des fils de l'item ",self.item.object,objet
365 old_nodes=self.children
369 def update_node_valid(self):
370 """Cette methode remet a jour la validite du noeud (icone)
373 #print 'NODE update_node_valid', self.item.GetLabelText()
374 p = utilIcons.getPixmap(self.item.GetIconName() + ".gif")
377 def update_node_label(self): #CS_pbruno todo
378 """ Met a jour le label du noeud """
379 #print "NODE update_node_label", self.item.GetLabelText()
380 labeltext,fonte,couleur = self.item.GetLabelText()
381 self.setText(0, labeltext)
383 def update_node_texte(self):
384 """ Met a jour les noms des SD et valeurs des mots-cles """
385 #print "NODE update_node_texte", self.item.GetLabelText()
386 value = self.item.GetText()
387 self.setText(1, value)
389 def update_nodes(self):
390 #print "NODE update_nodes ", self.item.GetLabelText()
391 self.setOpen( False )
395 def update_texte(self):
396 """ Met a jour les noms des SD et valeurs des mots-cles """
397 #print "NODE update_texte", self.item.GetLabelText()
398 self.update_node_texte()
399 if self.state == 'expanded' :
400 for child in self.children:
401 if child.displayed != 0 : child.update_texte()
403 def update_valid(self) :
404 """Cette methode a pour but de mettre a jour la validite du noeud
405 et de propager la demande de mise a jour a son parent
407 #print "NODE update_valid", self.item.GetLabelText()
408 #PN a reverifier SVP parent
409 self.update_node_valid()
411 self.parent.update_valid()
416 #print "NODE supprime",self.item.GetLabelText()
419 if not self.children : return
420 for child in self.children:
424 def build_children(self):
425 """ Construit la liste des enfants de self """
426 #print "NODE : Construit la liste des enfants de", self.item.GetLabelText()
428 sublist = self.item._GetSubList()
431 for item in sublist :
432 child = item.itemNode(self, item, last)
434 self.children.append(child)
437 def doPasteCommande(self,objet_a_copier):
439 Réalise la copie de l'objet passé en argument qui est nécessairement
443 #child = parent.item.append_child(objet_a_copier,self.item.getObject())
444 child = self.append_brother(objet_a_copier,retour='oui')
445 #if child is None:return 0
448 def doPasteMCF(self,objet_a_copier):
450 Réalise la copie de l'objet passé en argument (objet_a_copier)
451 Il s'agit forcément d'un mot clé facteur
453 child = self.append_child(objet_a_copier,pos='first',retour='oui')
459 if __name__=='__main__':
463 sys.path[:0]=['..','../Aster','../Aster/Cata' ]
465 app = QApplication(sys.argv)
468 jdcName = os.path.basename(fn)
474 from autre_analyse_cata import analyse_catalogue
475 from Cata import cataSTA8
477 fic_cata="../../Aster/Cata/cataSTA8/cata.py"
478 cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
482 j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
483 cata_ord_dico=cata_ordonne )
486 if not j.cr.estvide():
491 if not j.cr.estvide():
495 from Editeur import comploader
496 comploader.charger_composants(QT)
497 from Editeur import Objecttreeitem
498 jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
501 tree = JDCTree( jdc_item, None )
503 app.setMainWidget(tree)
504 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
507 res = app.exec_loop()