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