Salome HOME
dc260e10a71c1d28b94a401ab25e9263313961a2
[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         print QWParent.__class__
33         
34         print "je suis dans JDCTree et voilà ", jdc_item
35         self.item          = jdc_item
36         self.tree          = self        
37         self.editor        = QWParent
38         self.appliEficas   = self.editor.appliEficas
39         
40         self.setColumnCount(2)
41         mesLabels=QStringList()
42         mesLabels << self.trUtf8('Commande                   ') << self.trUtf8('Concept/Valeur           ')
43         self.setHeaderLabels(mesLabels)
44                 
45         self.setMinimumSize(QSize(600,500))
46         print self
47         self.setColumnWidth(0,300)
48
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()
54
55
56     def contextMenuEvent(self,event) :
57         coord=event.globalPos()
58         item= self.currentItem()
59         self.handleContextMenu(item,coord)
60
61     def handleContextMenu(self,item,coord):
62         """
63         Private slot to show the context menu of the listview.
64         
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
68         """
69         if item == None : return
70         if item.existeMenu == 0 : return
71         if item.menu == None:
72            item.createPopUpMenu()
73         if item.menu != None:
74            item.menu.exec_(coord)            
75             
76     def handleOnItem(self,item,int):
77         item.affichePanneau()
78         try :
79            fr = item.item.get_fr()
80            if self.editor:
81               self.editor.affiche_infos(fr)
82         except:
83             pass
84
85
86 # type de noeud
87 COMMENT     = "COMMENTAIRE"
88 PARAMETERS  = "PARAMETRE"
89  
90 class JDCNode(QTreeWidgetItem):
91     def __init__( self, treeParent, item):
92         self.item        = item
93         self.treeParent  = treeParent
94         self.tree        = self.treeParent.tree
95         self.editor      = self.treeParent.editor
96         self.appliEficas = treeParent.appliEficas
97                         
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)
103
104         monIcone = QIcon("/home/noyret/Install_Eficas/EficasV1/InterfaceQT4/icons/" +self.item.GetIconName() + ".gif")
105         self.setIcon(0,monIcone)
106         self.children = []
107         self.build_children()
108         self.menu=None
109         self.existeMenu=1
110
111         self.item.connect("valid",self.onValid,())
112         self.item.connect("supp" ,self.onAdd,())
113         self.item.connect("add"  ,self.onSupp,())
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         if self.item.isactif():
138             panel=self.getPanel()
139         else:
140             from monInactifPanel import PanelInactif
141             panel = PanelInactif(self,self.editor)
142         panel.show()
143         self.select()
144
145
146     def createPopUpMenu(self):
147         #implemente dans les noeuds derives si necessaire
148         self.existeMenu = 0
149
150     def commentIt(self):
151         """
152         Cette methode a pour but de commentariser la commande pointee par self
153         """
154         # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
155         # (commentariser) un commentaire.
156         try :
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()
164         except Exception,e:
165             traceback.print_exc()
166             QMessageBox.critical( self.editor, "TOO BAD",str(e))
167         
168     def unCommentIt(self):
169         """
170         Realise la decommentarisation de self
171         """
172         try :
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()
179         except Exception,e:
180             QMessageBox.critical( self.editor, "Erreur !",str(e))
181         
182     def addComment( self, after=True ):
183         """
184         Ajoute un commentaire a l'interieur du JDC :
185         """
186         self.editor.init_modif()
187         if after:
188             pos = 'after'
189         else:
190             pos = 'before'
191         return self.append_brother( COMMENT, pos )
192                 
193     def addParameters( self, after=True ):
194         """
195         Ajoute un parametre a l'interieur du JDC :
196         """
197         self.editor.init_modif()
198         if after:
199             pos = 'after'
200         else:
201             pos = 'before'
202         return self.append_brother( PARAMETERS, pos )
203     
204     
205     def select( self ):
206         """
207         Rend le noeud courant (self) selectionne et deselectionne
208         tous les autres
209         """        
210         for item in self.tree.selectedItems() :
211             item.setSelected(0)
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
217                                
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'):
223         """
224         Permet d'ajouter un objet frere a l'objet associe au noeud self
225         par defaut on l'ajoute immediatement apres 
226         Methode externe
227         """
228         #print "*********** append_brother ", self.item.GetLabelText()
229         self.editor.init_modif()
230         index = self.treeParent.children.index(self)
231         if pos == 'before':
232             index = index
233         elif pos == 'after':
234             index = index +1
235         else:
236             print str(pos)," n'est pas un index valide pour append_brother"
237             return 0
238         return self.treeParent.append_child(name,pos=index)
239
240     def append_child(self,name,pos=None,verif='oui'):
241         """
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.
246         """
247         #print "************** append_child ",self.item.GetLabelText()
248         self.editor.init_modif()
249         if pos == 'first':
250             index = 0
251         elif pos == 'last':
252             index = len(self.children)
253         elif type(pos) == types.IntType :
254             # position fixee
255             index = pos
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)
261         else:
262             index = self.item.get_index_child(name)
263         obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
264         if obj is None:obj=0
265         if obj == 0:return 0
266         self.build_children(index)
267         child=self.children[index]
268         child.affichePanneau() 
269         return child
270
271     def delete(self):
272         """ 
273             Methode externe pour la destruction de l'objet associe au noeud
274         """
275         self.editor.init_modif()
276         index = self.treeParent.children.index(self) - 1 
277         if index < 0 : index =0
278
279         ret=self.treeParent.item.suppitem(self.item)
280         if ret == 0:return
281
282         self.treeParent.build_children()
283         brothers=self.treeParent.children
284         if brothers:
285            toselect=brothers[index]
286         else:
287            toselect=self.treeParent
288         toselect.select()
289         toselect.affichePanneau()
290
291 #        
292 #    #------------------------------------------------------------------
293     def onValid(self):        
294         self.editor.init_modif()
295         self.update_node_valid()
296         self.update_node_label()
297         self.update_node_texte()
298
299     def onAdd(self,object):
300         #print "NODE  onAdd", self.item.GetLabelText()
301         self.editor.init_modif()
302         self.update_nodes()
303  
304     def onSupp(self,object):
305         #print "NODE onSupp", self.item.GetLabelText()
306         self.editor.init_modif()
307         self.update_nodes()
308  
309
310     def update_node_valid(self):
311         """Cette methode remet a jour la validite du noeud (icone)
312            Elle appelle isvalid
313         """
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)
317
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)        
323     
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)
329
330     def update_nodes(self):
331         #print 'NODE update_nodes', self.item.GetLabelText()
332         self.build_children()
333             
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()
341         
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
345 #        """
346 #        #print "NODE update_valid", self.item.GetLabelText()
347 #        self.update_node_valid()
348 #        try :
349 #          self.treeParent.update_valid()            
350 #        except:
351 #          pass
352  
353     def doPasteCommande(self,objet_a_copier):
354         """
355           Réalise la copie de l'objet passé en argument qui est nécessairement
356           une commande
357         """
358         print "objet_a_copier = ", objet_a_copier.item.GetLabelText()
359         child = self.append_brother(objet_a_copier)
360         return child
361
362     def doPasteMCF(self,objet_a_copier):
363         """
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
366         """
367         child = self.append_child(objet_a_copier,pos='first')
368         return child
369
370 if __name__=='__main__':
371     from PyQt4 import *
372     from PyQt4.QtGui  import *
373     from PyQt4.QtCore import *
374     
375
376 #    sys.path[:0]=['..','../Aster','../Aster/Cata' ]
377
378 #    app = QApplication(sys.argv)
379         
380 #    fn      = 'azAster.comm'
381 #    jdcName =  os.path.basename(fn)
382 #    f=open(fn,'r')
383 #    text=f.read()
384 #    f.close()
385 #    print 'text',text
386     print "afaire"
387     
388 #
389 #    from autre_analyse_cata import analyse_catalogue
390 #    from Cata import cataSTA8
391 #    cata=cataSTA8
392 #    fic_cata="../../Aster/Cata/cataSTA8/cata.py"
393 #    cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
394 #    
395 #    
396 #    
397 #    j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
398 #                            cata_ord_dico=cata_ordonne )
399 #                            
400 #    j.compile()
401 #    if not j.cr.estvide():
402 #        print j.cr
403 #        sys.exit()
404 #    
405 #    j.exec_compile()
406 #    if not j.cr.estvide():
407 #        print j.cr
408 #        sys.exit()
409 #                            
410 #    from Editeur import comploader
411 #    comploader.charger_composants(QT)    
412 #    from Editeur import Objecttreeitem
413 #    jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
414 #                
415 #    if jdc_item:                        
416 #        tree = JDCTree( jdc_item, None )                
417 #    
418 #    app.setMainWidget(tree)    
419 #    app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
420 #    tree.show()
421 #            
422 #    res = app.exec_loop()
423 #    sys.exit(res)
424 #    
425 #