]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceQT/browser.py
Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / InterfaceQT / browser.py
1 # -*- coding: utf-8 -*-
2 import os,sys,string,re,types,traceback
3
4 from qt import *
5 import utilIcons
6
7
8 class JDCTree( QListView ):
9     def __init__( self, jdc_item, parent = None ):        
10         QListView.__init__( self, parent )
11         
12         self.item     = jdc_item
13         self.tree     = self        
14         self.editor   = parent
15         self.racine   = self
16         self.node_selected = None
17         self.children      = self.build_children()        
18         
19         self.setCaption(self.trUtf8('Browser'))
20         self.setRootIsDecorated(1)
21         self.setSorting(-1)
22         self.addColumn(self.trUtf8('Commande'))
23         self.addColumn(self.trUtf8('Concept/Valeur'))
24                 
25         self.setMinimumSize(QSize(400,500))
26         self.connect(self,SIGNAL('contextMenuRequested(QListViewItem *, const QPoint &, int)'),
27                      self.handleContextMenu)
28
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)'),
32                      self.handleNommeItem)
33         
34         
35     def handleContextMenu(self,itm,coord,col):
36         """
37         Private slot to show the context menu of the listview.
38         
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)
42         """
43         try:
44             if itm.menu:
45                 itm.menu.popup(coord)            
46         except:
47             pass
48             
49     def handleNommeItem(self,bouton,itm,coord,col):
50         """
51         PN --> a finir eventuellement pour nommer
52         le concept dans l arbre
53         """
54         try :
55             if itm :
56                panel=itm.getPanel()
57                if panel.node.item.object.get_type_produit() != None :
58                   pass
59         except:
60             pass
61
62     def handleOnItem(self,  item ):
63         try :
64            fr = item.item.get_fr()
65            if self.editor:
66               self.editor.affiche_infos(fr)
67         except:
68             pass
69         
70     def build_children(self):
71         """ Construit la liste des enfants de self """
72         children = []
73         child = self.item.itemNode(self,self.item)
74         children.append(child)
75         child.state='expanded'
76         return children
77         
78     def supprime(self):
79         """ supprime tous les elements de l'arbre """
80         raise RuntimeError, 'Not implemented'
81         self.tree = None
82         self.racine = None
83         self.node_selected = None
84         self.item = None
85         self.scrolledcanvas = None
86         for child in self.children:
87             child.supprime()
88         self.children=[]
89                 
90     def showEvent(self, event):
91         """ QT : pour afficher le 1er niveau d'arborescence de l''arbre"""        
92         self.children[0].select()
93         
94     def update(self):
95         """ Update tous les elements de l'arbre """
96         for child in self.children:
97             child.update()
98             
99 # type de noeud
100 COMMENT     = "COMMENTAIRE"
101 PARAMETERS  = "PARAMETRE"
102
103         
104 class JDCNode(QListViewItem):
105     def __init__( self, parent, item, after=None, bold=0):
106         """
107         Constructor
108         
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
113         """        
114         self.item   = item
115         self.parent = parent
116         self.tree   = self.parent.tree
117         self.editor = self.parent.tree.editor
118         self.bold   = bold
119                         
120         name  = self.tree.trUtf8(  str( item.GetLabelText()[0] ) )
121         value = self.tree.trUtf8(  str( item.GetText() ) )
122         
123         if after is None:        
124             QListViewItem.__init__(self,parent)            
125             self.setText(0, name )
126             self.setText(1, value )            
127         else:
128             QListViewItem.__init__(self,parent, after)
129             self.setText(0, name )
130             self.setText(1, value)
131             
132         p = utilIcons.getPixmap(item.GetIconName() + ".gif")
133         self.setPixmap(0,p)
134         self.setExpandable(item.IsExpandable())
135                 
136         self.connect()    
137         self.init()        
138         self.createPopUpMenu()
139         
140         
141     def paintCell(self, p, cg, column, width, alignment):
142         """
143         Overwritten class to set a different text color, if bold is true.
144         
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)
150         """
151         _cg = QColorGroup(cg)
152         c = _cg.text()
153         
154         if self.bold and column == 0:
155             _cg.setColor(QColorGroup.Text, Qt.red)
156             
157         QListViewItem.paintCell(self, p, _cg, column, width, alignment)
158         
159         _cg.setColor(QColorGroup.Text, c)
160         
161         
162     def setOpen(self, o):
163         """
164         Public slot to set/reset the open state.
165         
166         @param o flag indicating the open state
167         """        
168         if o:        
169             if not self.children :                
170                 self.build_children()
171             self.selected = 1
172             self.tree.node_selected = self            
173         else:
174             
175             for child in self.children:
176                 self.takeItem(child)
177                 del child
178             self.children = []
179         QListViewItem.setOpen(self,o)
180         self.tree.setSelected(self,o)
181     
182      
183     #----------------------------------------------------------
184     #   interface a implementer par les noeuds derives (debut)
185     #----------------------------------------------------------
186     def getPanel(self):
187         print self.__class__
188         return None
189         
190     def createPopUpMenu(self):
191         pass 
192         
193     #----------------------------------------------------
194     #   interface a implementer par les noeuds derives (fin)
195     #----------------------------------------------------
196     
197     def init(self): #CS_pbruno toclean
198         self.state='collapsed'
199         self.displayed = 0
200         self.selected = 0
201         self.x = self.y  =None
202         self.lasty = 0
203         self.children = []
204         self.id = []
205         if self.parent is self.tree:
206            self.racine=self
207         else:
208            self.racine = self.parent.racine
209                       
210     def connect(self):
211         self.item.connect("add",self.onAdd,())
212         self.item.connect("supp",self.onSupp,())
213         self.item.connect("valid",self.onValid,())
214
215            
216     def commentIt(self):
217         """
218         Cette methode a pour but de commentariser la commande pointee par self
219         """
220         # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
221         # (commentariser) un commentaire.
222         try :
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()
228         except Exception,e:
229             traceback.print_exc()
230             QMessageBox.critical( self.parent, "TOO BAD",str(e))
231         return
232         
233     def unCommentIt(self):
234         """
235         Realise la decommentarisation de self
236         """
237         try :
238             pos=self.parent.children.index(self)
239             commande,nom = self.item.uncomment()
240             self.editor.init_modif()
241             self.parent.children[pos].select()
242         except Exception,e:
243             QMessageBox.critical( self.editor, "Erreur !",str(e))
244             return        
245         
246     def addComment( self, after=True ):
247         """
248         Ajoute un commentaire a l'interieur du JDC :
249         """
250         self.editor.init_modif()        
251         if after:
252             pos = 'after'
253         else:
254             pos = 'before'
255         return self.append_brother( COMMENT, pos )
256                 
257     def addParameters( self, after=True ):
258         """
259         Ajoute un parametre a l'interieur du JDC :
260         """
261         self.editor.init_modif()
262         if after:
263             pos = 'after'
264         else:
265             pos = 'before'
266         return self.append_brother( PARAMETERS, pos )
267     
268     
269     
270     def select( self ):
271         """
272         Rend le noeud courant (self) selectionne et deselectionne
273         tous les autres
274         """        
275         self.setOpen( True )    
276                                
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'):
282         """
283         Permet d'ajouter un objet frere a l'objet associe au noeud self
284         par defaut on l'ajoute immediatement apres 
285         Methode externe
286         """
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)
290         if pos == 'before':
291             index = index
292         elif pos == 'after':
293             index = index +1
294         else:
295             print str(pos)," n'est pas un index valide pour append_brother"
296             return 0
297         return self.parent.append_child(name,pos=index)
298
299     def append_child(self,name,pos=None,verif='oui',retour='non'):
300         """
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.
305         """
306 ##        print "************** append_child ",self.item.GetLabelText()
307         if pos == 'first':
308             index = 0
309         elif pos == 'last':
310             index = len(self.children)
311         elif type(pos) == types.IntType :
312             # position fixee
313             index = pos
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)
319         else:
320             index = self.item.get_index_child(name)
321         obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
322         #print obj
323         if obj is None:obj=0
324         if obj == 0:return 0
325         #print "append_child",index,self.children
326         child=self.children[index]
327         child.select()
328         return child
329
330     def delete(self):
331         """ 
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
334         """
335         self.editor.init_modif()
336         index = self.parent.children.index(self) - 1 
337         if index < 0 : index =0
338
339         parent=self.parent
340         ret=parent.item.suppitem(self.item)
341         if ret == 0:return
342
343         brothers=parent.children
344         if brothers:
345            toselect=brothers[index]
346         else:
347            toselect=parent
348         toselect.select()
349         
350     #------------------------------------------------------------------
351     def onValid(self):        
352         self.update_node_valid()
353         self.update_node_label()
354         self.update_node_texte()
355         
356
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
360         self.update_nodes()
361         #self.select()
362
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
366         self.update_nodes()
367         #self.select()
368         
369     def update_node_valid(self):
370         """Cette methode remet a jour la validite du noeud (icone)
371            Elle appelle isvalid
372         """
373         #print 'NODE update_node_valid', self.item.GetLabelText()
374         p = utilIcons.getPixmap(self.item.GetIconName() + ".gif")
375         self.setPixmap(0,p)
376
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)        
382     
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)
388
389     def update_nodes(self):
390         #print "NODE update_nodes ", self.item.GetLabelText()
391         self.setOpen( False )
392         self.setOpen( True )
393         #self.select()
394             
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()
402         
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
406         """
407         #print "NODE update_valid", self.item.GetLabelText()
408         #PN a reverifier SVP parent
409         self.update_node_valid()
410         try :
411           self.parent.update_valid()            
412         except:
413           pass
414
415     def supprime(self):
416         #print "NODE supprime",self.item.GetLabelText()
417         self.efface_node()
418         self.racine = None        
419         if not self.children : return
420         for child in self.children:
421             child.supprime()
422         self.children=None    
423
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()
427         self.children = []
428         sublist = self.item._GetSubList()
429         if sublist :            
430             last = None
431             for item in sublist :                
432                 child = item.itemNode(self, item, last)
433                 last = child
434                 self.children.append(child)
435             
436             
437     def doPasteCommande(self,objet_a_copier):
438         """
439           Réalise la copie de l'objet passé en argument qui est nécessairement
440           une commande
441         """
442         parent=self.parent
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
446         return child
447
448     def doPasteMCF(self,objet_a_copier):
449         """
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
452         """
453         child = self.append_child(objet_a_copier,pos='first',retour='oui')
454         return child
455
456
457         
458     
459 if __name__=='__main__':
460     from qt import *
461     
462
463     sys.path[:0]=['..','../Aster','../Aster/Cata' ]
464
465     app = QApplication(sys.argv)
466         
467     fn      = 'azAster.comm'
468     jdcName =  os.path.basename(fn)
469     f=open(fn,'r')
470     text=f.read()
471     f.close()
472     print 'text',text
473
474     from autre_analyse_cata import analyse_catalogue
475     from Cata import cataSTA8
476     cata=cataSTA8
477     fic_cata="../../Aster/Cata/cataSTA8/cata.py"
478     cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
479     
480     
481     
482     j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
483                             cata_ord_dico=cata_ordonne )
484                             
485     j.compile()
486     if not j.cr.estvide():
487         print j.cr
488         sys.exit()
489     
490     j.exec_compile()
491     if not j.cr.estvide():
492         print j.cr
493         sys.exit()
494                             
495     from Editeur import comploader
496     comploader.charger_composants(QT)    
497     from Editeur import Objecttreeitem
498     jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
499                 
500     if jdc_item:                        
501         tree = JDCTree( jdc_item, None )                
502     
503     app.setMainWidget(tree)    
504     app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
505     tree.show()
506             
507     res = app.exec_loop()
508     sys.exit(res)
509     
510