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