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