Salome HOME
785633a0c6930d009f2255051bd9bdda731f7d8f
[tools/eficas.git] / InterfaceQT4 / browser.py
1 # -*- coding: utf-8 -*-
2
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21
22 import string,re
23 import types,sys,os
24 import traceback
25 import typeNode
26 from PyQt4 import *
27 from PyQt4.QtGui  import *
28 from PyQt4.QtCore import *
29
30 class JDCTree( QTreeWidget ):
31     def __init__( self, jdc_item, QWParent):        
32         QListView.__init__( self, QWParent )
33         
34         self.item          = jdc_item
35         self.tree          = self        
36         self.editor        = QWParent
37         self.appliEficas   = self.editor.appliEficas
38         
39         self.setColumnCount(2)
40         mesLabels=QStringList()
41         mesLabels << self.trUtf8('Commande                   ') << self.trUtf8('Concept/Valeur           ')
42         self.setHeaderLabels(mesLabels)
43                 
44         self.setMinimumSize(QSize(600,505))
45         self.setColumnWidth(0,300)
46
47         self.connect(self, SIGNAL("itemClicked ( QTreeWidgetItem * ,int) "), self.handleOnItem)
48         self.racine=self.item.itemNode(self,self.item)
49         self.expandItem(self.racine)
50         self.node_selected=self.racine
51         self.racine.affichePanneau()
52
53
54     def contextMenuEvent(self,event) :
55         coord=event.globalPos()
56         item= self.currentItem()
57         self.handleContextMenu(item,coord)
58
59     def handleContextMenu(self,item,coord):
60         """
61         Private slot to show the context menu of the listview.
62         
63         @param itm the selected listview item (QListWidgetItem)
64         @param coord the position of the mouse pointer (QPoint)
65         Attention : existeMenu permet de savoir si un menu est associe a cet item
66         """
67         if item == None : return
68         if item.existeMenu == 0 : return
69         if item.menu == None:
70            item.createPopUpMenu()
71         if item.menu != None:
72            item.menu.exec_(coord)            
73             
74     def handleOnItem(self,item,int):
75         item.affichePanneau()
76         try :
77            fr = item.item.get_fr()
78            if self.editor:
79               self.editor.affiche_infos(fr)
80         except:
81             pass
82
83
84 # type de noeud
85 COMMENT     = "COMMENTAIRE"
86 PARAMETERS  = "PARAMETRE"
87  
88 class JDCNode(QTreeWidgetItem):
89     def __init__( self, treeParent, item):
90         self.item        = item
91         self.treeParent  = treeParent
92         self.tree        = self.treeParent.tree
93         self.editor      = self.treeParent.editor
94         self.appliEficas = treeParent.appliEficas
95                         
96         name  = self.appliEficas.trUtf8(  str( item.GetLabelText()[0] ) )
97         value = self.appliEficas.trUtf8(  str( item.GetText() ) )
98         mesColonnes=QStringList()
99         mesColonnes <<  name << value
100         QTreeWidgetItem.__init__(self,treeParent,mesColonnes)
101
102         RepIcon=QString(self.appliEficas.RepIcon)
103         monIcone = QIcon(RepIcon+"/" +self.item.GetIconName() + ".png")
104         self.setIcon(0,monIcone)
105         self.children = []
106         self.build_children()
107         self.menu=None
108         self.existeMenu=1
109
110         self.item.connect("valid",self.onValid,())
111         self.item.connect("supp" ,self.onAdd,())
112         self.item.connect("add"  ,self.onSupp,())
113
114
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()
119         listeExpanded=[]
120         for item in self.children :
121             if item.isExpanded():
122                if self.children.index(item) < posInsertion :
123                   listeExpanded.append(self.children.index(item))
124                else :
125                   listeExpanded.append( self.children.index(item) +1)
126             self.removeChild(item)
127         self.children = []
128         sublist = self.item._GetSubList()
129         ind=0
130         for item in sublist :
131             nouvelItem=item.itemNode(self,item)
132             self.children.append(nouvelItem)
133             if ind in listeExpanded : nouvelItem.setExpanded(1)
134             ind=ind+1
135
136     def affichePanneau(self) :
137         print self
138         if self.item.isactif():
139             panel=self.getPanel()
140         else:
141             from monInactifPanel import PanelInactif
142             panel = PanelInactif(self,self.editor)
143         panel.show()
144         self.select()
145
146
147     def createPopUpMenu(self):
148         #implemente dans les noeuds derives si necessaire
149         self.existeMenu = 0
150
151     def commentIt(self):
152         """
153         Cette methode a pour but de commentariser la commande pointee par self
154         """
155         # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
156         # (commentariser) un commentaire.
157         try :
158             pos=self.treeParent.children.index(self)
159             commande_comment = self.item.get_objet_commentarise()
160             # On signale a l editeur du panel (le JDCDisplay) une modification
161             self.editor.init_modif()
162             self.treeParent.build_children()
163             self.treeParent.children[pos].select()
164             self.treeParent.children[pos].affichePanneau()
165         except Exception,e:
166             traceback.print_exc()
167             QMessageBox.critical( self.editor, "TOO BAD",str(e))
168         
169     def unCommentIt(self):
170         """
171         Realise la decommentarisation de self
172         """
173         try :
174             pos=self.treeParent.children.index(self)
175             commande,nom = self.item.uncomment()
176             self.editor.init_modif()
177             self.treeParent.build_children()
178             self.treeParent.children[pos].select()
179             self.treeParent.children[pos].affichePanneau()
180         except Exception,e:
181             QMessageBox.critical( self.editor, "Erreur !",str(e))
182         
183     def addComment( self, after=True ):
184         """
185         Ajoute un commentaire a l'interieur du JDC :
186         """
187         self.editor.init_modif()
188         if after:
189             pos = 'after'
190         else:
191             pos = 'before'
192         return self.append_brother( COMMENT, pos )
193                 
194     def addParameters( self, after=True ):
195         """
196         Ajoute un parametre a l'interieur du JDC :
197         """
198         self.editor.init_modif()
199         if after:
200             pos = 'after'
201         else:
202             pos = 'before'
203         return self.append_brother( PARAMETERS, pos )
204     
205     
206     def select( self ):
207         """
208         Rend le noeud courant (self) selectionne et deselectionne
209         tous les autres
210         """        
211         for item in self.tree.selectedItems() :
212             item.setSelected(0)
213         #print "select -----------> " , self.item.GetLabelText()
214         self.setSelected( True )    
215         self.setExpanded( True )    
216         self.tree.setCurrentItem( self )    
217         self.tree.node_selected= self
218                                
219     #------------------------------------------------------------------
220     # Methodes de creation et destruction de noeuds
221     # Certaines de ces methodes peuvent etre appelees depuis l'externe
222     #------------------------------------------------------------------
223     def append_brother(self,name,pos='after'):
224         """
225         Permet d'ajouter un objet frere a l'objet associe au noeud self
226         par defaut on l'ajoute immediatement apres 
227         Methode externe
228         """
229         #print "*********** append_brother ", self.item.GetLabelText()
230         self.editor.init_modif()
231         index = self.treeParent.children.index(self)
232         if pos == 'before':
233             index = index
234         elif pos == 'after':
235             index = index +1
236         else:
237             print str(pos)," n'est pas un index valide pour append_brother"
238             return 0
239         return self.treeParent.append_child(name,pos=index)
240
241     def append_child(self,name,pos=None,verif='oui'):
242         """
243            Methode pour ajouter un objet fils a l'objet associe au noeud self.
244            On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
245            ou en position intermediaire.
246            Si pos vaut None, on le place a la position du catalogue.
247         """
248         #print "************** append_child ",self.item.GetLabelText()
249         self.editor.init_modif()
250         if pos == 'first':
251             index = 0
252         elif pos == 'last':
253             index = len(self.children)
254         elif type(pos) == types.IntType :
255             # position fixee
256             index = pos
257         elif type(pos) == types.InstanceType:
258             # pos est un item. Il faut inserer name apres pos
259             index = self.item.get_index(pos) +1
260         elif type(name) == types.InstanceType:
261             index = self.item.get_index_child(name.nom)
262         else:
263             index = self.item.get_index_child(name)
264         obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
265         if obj is None:obj=0
266         if obj == 0:return 0
267         self.build_children(index)
268         child=self.children[index]
269         child.affichePanneau() 
270         return child
271
272     def delete(self):
273         """ 
274             Methode externe pour la destruction de l'objet associe au noeud
275         """
276         self.editor.init_modif()
277         index = self.treeParent.children.index(self) - 1 
278         if index < 0 : index =0
279
280         ret=self.treeParent.item.suppitem(self.item)
281         if ret == 0:return
282
283         self.treeParent.build_children()
284         brothers=self.treeParent.children
285         if brothers:
286            toselect=brothers[index]
287         else:
288            toselect=self.treeParent
289         toselect.select()
290         toselect.affichePanneau()
291
292 #        
293 #    #------------------------------------------------------------------
294     def onValid(self):        
295         self.editor.init_modif()
296         self.update_node_valid()
297         self.update_node_label()
298         self.update_node_texte()
299
300     def onAdd(self,object):
301         #print "NODE  onAdd", self.item.GetLabelText()
302         self.editor.init_modif()
303         self.update_nodes()
304  
305     def onSupp(self,object):
306         #print "NODE onSupp", self.item.GetLabelText()
307         self.editor.init_modif()
308         self.update_nodes()
309  
310
311     def update_node_valid(self):
312         """Cette methode remet a jour la validite du noeud (icone)
313            Elle appelle isvalid
314         """
315         #print 'NODE update_node_valid', self.item.GetLabelText()
316         RepIcon=QString(self.appliEficas.RepIcon)
317         monIcone = QIcon(RepIcon+"/" +self.item.GetIconName() + ".png")
318         self.setIcon(0,monIcone)
319
320     def update_node_label(self):
321         """ Met a jour le label du noeud """
322         #print "NODE update_node_label", self.item.GetLabelText()
323         labeltext,fonte,couleur = self.item.GetLabelText()
324         self.setText(0, labeltext)        
325     
326     def update_node_texte(self):
327         """ Met a jour les noms des SD et valeurs des mots-cles """
328         #print "NODE update_node_texte", self.item.GetLabelText()
329         value = self.item.GetText()
330         self.setText(1, value)
331
332     def update_nodes(self):
333         #print 'NODE update_nodes', self.item.GetLabelText()
334         self.build_children()
335             
336     def update_texte(self):
337         """ Met a jour les noms des SD et valeurs des mots-cles """
338         #print "NODE update_texte", self.item.GetLabelText()
339         self.update_node_texte()
340         if self.isExpanded() :
341             for child in self.children:
342                 if child.isHidden() == false : child.update_texte()
343         
344  
345     def doPasteCommande(self,objet_a_copier):
346         """
347           Réalise la copie de l'objet passé en argument qui est nécessairement
348           une commande
349         """
350         print "objet_a_copier = ", objet_a_copier.item.GetLabelText()
351         child = self.append_brother(objet_a_copier)
352         return child
353
354     def doPasteMCF(self,objet_a_copier):
355         """
356            Réalise la copie de l'objet passé en argument (objet_a_copier)
357            Il s'agit forcément d'un mot clé facteur
358         """
359         child = self.append_child(objet_a_copier,pos='first')
360         return child
361
362 if __name__=='__main__':
363     from PyQt4 import *
364     from PyQt4.QtGui  import *
365     from PyQt4.QtCore import *
366     
367
368 #    sys.path[:0]=['..','../Aster','../Aster/Cata' ]
369
370 #    app = QApplication(sys.argv)
371         
372 #    fn      = 'azAster.comm'
373 #    jdcName =  os.path.basename(fn)
374 #    f=open(fn,'r')
375 #    text=f.read()
376 #    f.close()
377 #    print 'text',text
378     print "afaire"
379     
380 #
381 #    from autre_analyse_cata import analyse_catalogue
382 #    from Cata import cataSTA8
383 #    cata=cataSTA8
384 #    fic_cata="../../Aster/Cata/cataSTA8/cata.py"
385 #    cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
386 #    
387 #    
388 #    
389 #    j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
390 #                            cata_ord_dico=cata_ordonne )
391 #                            
392 #    j.compile()
393 #    if not j.cr.estvide():
394 #        print j.cr
395 #        sys.exit()
396 #    
397 #    j.exec_compile()
398 #    if not j.cr.estvide():
399 #        print j.cr
400 #        sys.exit()
401 #                            
402 #    from Editeur import comploader
403 #    comploader.charger_composants(QT)    
404 #    from Editeur import Objecttreeitem
405 #    jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
406 #                
407 #    if jdc_item:                        
408 #        tree = JDCTree( jdc_item, None )                
409 #    
410 #    app.setMainWidget(tree)    
411 #    app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
412 #    tree.show()
413 #            
414 #    res = app.exec_loop()
415 #    sys.exit(res)
416 #    
417 #