Salome HOME
sauve du 10/06
[tools/eficas.git] / InterfaceQT4 / qtEficas.py
1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 import os, sys
22 from  determine import monEnvQT5
23 if monEnvQT5 :
24   from PyQt5.QtWidgets import QApplication, QMainWindow, QBoxLayout, QMenu, QAction
25   from PyQt5.QtGui import QIcon
26   from PyQt5.QtCore import Qt
27 else:
28   from PyQt4.QtGui  import *
29   from PyQt4.QtCore import *
30
31 from Extensions.i18n import tr
32 from Extensions.eficas_exception import EficasException
33
34 from myMain import Ui_Eficas
35 from viewManager import MyTabview
36 from getVersion import getEficasVersion
37 from Editeur import session
38
39
40 class Appli(Ui_Eficas,QMainWindow):
41     """
42     Class implementing the main user interface.
43     """
44     def __init__(self,code=None,salome=0,parent=None,ssCode=None,multi=False,langue='fr',ssIhm=False):
45         """
46         Constructor
47         """
48         QMainWindow.__init__(self,parent)
49         Ui_Eficas.__init__(self)
50
51         version=getEficasVersion()
52         self.VERSION_EFICAS="Eficas QT4 Salome "+version
53         if monEnvQT5 : self.VERSION_EFICAS="Eficas QT5 Salome "
54         self.salome=salome
55         self.ihm="QT"
56         self.ssIhm=ssIhm
57         self.top = self    #(pour CONFIGURATION)
58         self.QWParent=None #(Pour lancement sans IHM)
59         self.code=code
60         self.indice=0
61         self.first=1
62         self.dict_reels={}
63         if monEnvQT5 : self.recent =  []
64         else : self.recent =  QStringList()
65         self.ficRecents={}
66         self.listeAEnlever=[]
67         self.ListeCode=['Aster','Carmel3D','Cuve2dg','Openturns_Study','Openturns_Wrapper','MAP','ZCracks', 'CarmelCND','MT','PSEN','PSEN_N1']
68         self.repIcon=os.path.join( os.path.dirname(os.path.abspath(__file__)),'..','Editeur','icons')
69
70         if self.salome:
71           import Accas
72           import eficasSalome
73           Accas.SalomeEntry = eficasSalome.SalomeEntry
74
75         self.multi=multi
76         self.demande=multi # specifique PSEN
77         if self.multi == False :
78              self.definitCode(code,ssCode)
79              if code==None: return
80
81         if not self.salome and hasattr (self, 'CONFIGURATION') and hasattr(self.CONFIGURATION,'lang') : langue=self.CONFIGURATION.lang
82         if langue=='fr': self.langue=langue
83         else           : self.langue="ang"
84
85         #from Extensions import localisation
86         #app=QApplication
87         #localisation.localise(app,langue)
88         #print tr('FORTRAN_FILE')
89         #localisation.localise(app,langue,'titi_fr.qm')
90         #print tr('titi1')
91         #localisation.localise(app,langue,'toto.qm')
92         #print tr('titi1')
93         #print pomu
94
95         self.setupUi(self)
96         if self.code in ['MAP',] : self.resize(1440,self.height())
97         else : self.resize(1800,self.height())
98
99         icon = QIcon(self.repIcon+"/parametres.png")
100         self.actionParametres.setIcon(icon)
101
102
103         self.myQtab.removeTab(0)
104         self.blEntete= QBoxLayout(0,self.frameEntete)
105         self.blEntete.insertWidget(0,self.toolBar)
106         self.blEntete.insertWidget(0,self.menubar)
107
108
109         eficas_root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
110
111         self.viewmanager = MyTabview(self)
112         self.recentMenu=QMenu(tr('&Recents'))
113         #self.menuFichier.insertMenu(self.actionOuvrir,self.recentMenu)
114         # actionARemplacer ne sert que pour l insert Menu
115         self.menuFichier.insertMenu(self.actionARemplacer ,self.recentMenu)
116         self.menuFichier.removeAction(self.actionARemplacer)
117         if monEnvQT5 : self.connecterSignaux()
118         else         : self.connecterSignauxQT4()
119         self.toolBar.addSeparator()
120         if self.code != None : self.construitMenu()
121
122         self.setWindowTitle(self.VERSION_EFICAS)
123         try :
124           self.ouvreFichiers()
125         except EficasException, exc:
126           exit()
127
128
129     def definitCode(self,code,ssCode) :
130         self.code=code
131         self.ssCode=ssCode
132         if self.code==None :
133            self.cleanPath()
134            from monChoixCode import MonChoixCode
135            widgetChoix = MonChoixCode(self)
136            ret=widgetChoix.exec_()
137         import sys
138         if self.code == None:return # pour le cancel de la fenetre choix code
139         name='prefs_'+self.code
140         prefsCode=__import__(name)
141
142         self.repIni=prefsCode.repIni
143         if ssCode != None :
144            self.format_fichier= ssCode  #par defaut
145            prefsCode.NAME_SCHEME=ssCode
146         else :
147            self.format_fichier="python" #par defaut
148
149         nameConf='configuration_'+self.code
150         configuration=__import__(nameConf)
151         self.CONFIGURATION = configuration.make_config(self,prefsCode.repIni)
152         self.CONFIGStyle = None
153         if hasattr(configuration,'make_config_style'):
154            self.CONFIGStyle = configuration.make_config_style(self,prefsCode.repIni)
155         if hasattr(prefsCode,'encoding'):
156            import sys
157            reload(sys)
158            sys.setdefaultencoding(prefsCode.encoding)
159
160     def construitMenu(self):
161         self.initPatrons()
162         self.initRecents()
163         self.initAides()
164         for intituleMenu in ("menuTraduction","menuOptions","menuMesh","menuExecution","menuN1"):
165               if hasattr(self,intituleMenu):
166                  menu=getattr(self,intituleMenu)
167                  menu.setAttribute(Qt.WA_DeleteOnClose)
168                  menu.close()
169                  delattr(self,intituleMenu)
170         for intituleAction in ("actionExecution","actionSaveRun",):
171             if hasattr(self,intituleAction):
172               action=getattr(self,intituleAction)
173               self.toolBar.removeAction(action)
174         if self.code.upper() in Appli.__dict__.keys():
175           listeTexte=apply(Appli.__dict__[self.code.upper()],(self,))
176
177     def initAides(self):
178         #print "je passe la"
179         repAide=os.path.dirname(os.path.abspath(__file__))
180         fileName='index.html'
181         self.docPath=repAide+"/../Aide"
182         if hasattr(self,'CONFIGURATION') and hasattr(self.CONFIGURATION,'docPath') : self.docPath=self.CONFIGURATION.docPath
183         if hasattr(self,'CONFIGURATION') and hasattr(self.CONFIGURATION,'fileName'):fileName=self.CONFIGURATION.fileName
184         self.fileDoc=os.path.join(self.docPath,fileName)
185         self.actionCode.setText(tr("Aide specifique ")+str(self.code))
186         if not os.path.isfile(self.fileDoc) :
187                self.fileDoc=""
188                self.docPath=""
189                self.actionCode.setEnabled(False)
190                return
191
192         self.actionCode.setEnabled(True)
193         self.menuAide.addAction(self.actionCode)
194
195     def newN1(self):
196         ssCode=None
197         code="PSEN_N1"
198         self.cleanPath()
199         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',code))
200         sys.path.insert(0,dirCode)
201         self.code=code
202         self.definitCode(code,ssCode)
203         self.multi=True
204         self.demande=False
205         self.fileNew()
206
207     def newPSEN(self):
208         ssCode=None
209         code="PSEN"
210         self.cleanPath()
211         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',code))
212         sys.path.insert(0,dirCode)
213         self.code=code
214         self.definitCode(code,ssCode)
215         self.multi=True
216         self.demande=False
217         self.fileNew()
218
219     def ajoutN1(self):
220         self.menuN1 = self.menubar.addMenu(tr("Etude N-1"))
221         self.actionN1 = QAction(self)
222         self.actionN1.setText(tr("Etude N1"))
223         self.menuN1.addAction(self.actionN1)
224         if monEnvQT5 : self.actionN1.triggered.connect(self.newN1)
225         else         : self.connect(self.actionN1,SIGNAL("triggered()"),self.newN1)
226
227     def ajoutExecution(self):
228         self.menuExecution = self.menubar.addMenu(tr("Execution"))
229         self.actionExecution = QAction(self)
230         if sys.platform[0:5]=="linux":
231           icon6 = QIcon(self.repIcon+"/roue.png")
232           self.actionExecution.setIcon(icon6)
233         else :
234           self.actionExecution.setText(tr("Run"))
235         self.actionExecution.setObjectName("actionExecution")
236         self.menuExecution.addAction(self.actionExecution)
237         if not(self.actionExecution in self.toolBar.actions()):
238            self.toolBar.addAction(self.actionExecution)
239         self.actionExecution.setText(tr("Execution"))
240         if monEnvQT5 : self.actionExecution.triggered.connect(self.run)
241         else         : self.connect(self.actionExecution,SIGNAL("triggered()"),self.run)
242
243     def ajoutSauveExecution(self):
244         self.actionSaveRun = QAction(self)
245         icon7 = QIcon(self.repIcon+"/export_MAP.png")
246         self.actionSaveRun.setIcon(icon7)
247         self.actionSaveRun.setObjectName("actionSaveRun")
248         self.menuExecution.addAction(self.actionSaveRun)
249         if not(self.actionSaveRun in self.toolBar.actions()):
250            self.toolBar.addAction(self.actionSaveRun)
251         self.actionSaveRun.setText(tr("Save Run"))
252         if monEnvQT5 : self.actionSaveRun.triggered.connect(self.saveRun)
253         else         : self.connect(self.actionSaveRun,SIGNAL("triggered()"),self.saveRun)
254
255     def griserActionsStructures(self):
256         self.actionCouper.setEnabled(False)
257         self.actionColler.setEnabled(False)
258         self.actionCopier.setEnabled(False)
259         self.actionSupprimer.setEnabled(False)
260
261     def enleverActionsStructures(self):
262         self.toolBar.removeAction(self.actionCopier)
263         self.toolBar.removeAction(self.actionColler)
264         self.toolBar.removeAction(self.actionCouper)
265         self.menuEdition.removeAction(self.actionCouper)
266         self.menuEdition.removeAction(self.actionCopier)
267         self.menuEdition.removeAction(self.actionColler)
268
269
270     def enleverParametres(self):
271         self.toolBar.removeAction(self.actionParametres)
272         self.menuJdC.removeAction(self.actionParametres)
273
274
275     def enleverNewInclude(self):
276         self.actionNouvel_Include.setVisible(False)
277
278     def enleverRechercherDsCatalogue(self):
279         self.actionRechercherDsCatalogue.setVisible(False)
280
281     def ZCRACKS(self):
282         self.enleverNewInclude()
283         self.toolBar.addSeparator()
284         self.ajoutExecution()
285
286         self.menuOptions = self.menubar.addMenu("menuOptions")
287         self.menuOptions.addAction(self.actionParametres_Eficas)
288         self.menuOptions.setTitle(tr("Options"))
289
290     def ADAO(self):
291         self.enleverActionsStructures()
292         self.enleverNewInclude()
293         self.enleverRechercherDsCatalogue()
294
295     def ASTER(self) :
296         self.menuTraduction = self.menubar.addMenu("menuTraduction")
297         self.menuTraduction.addAction(self.actionTraduitV11V12)
298         self.menuTraduction.addAction(self.actionTraduitV10V11)
299         self.menuTraduction.addAction(self.actionTraduitV9V10)
300         self.menuTraduction.setTitle(tr("Traduction"))
301
302         self.menuFichier.addAction(self.actionSauveLigne)
303
304         self.menuOptions = self.menubar.addMenu("menuOptions")
305         self.menuOptions.addAction(self.actionParametres_Eficas)
306         self.menuOptions.addAction(self.actionLecteur_Pdf)
307         self.menuOptions.setTitle(tr("Options"))
308
309     def CARMEL3D(self):
310         #if self.salome == 0 : return
311         self.enleverNewInclude()
312         self.menuMesh = self.menubar.addMenu(tr("Gestion Maillage"))
313         self.menuMesh.setObjectName("Mesh")
314         self.menuMesh.addAction(self.actionChercheGrpMaille)
315         #self.griserActionsStructures()
316
317     def CARMELCND(self):
318         self.enleverNewInclude()
319         self.enleverRechercherDsCatalogue()
320         self.ajoutExecution()
321         self.ajoutSauveExecution()
322         self.griserActionsStructures()
323         
324     def MAP(self):
325         self.enleverNewInclude()
326         self.toolBar.addSeparator()
327         self.ajoutExecution()
328         self.ajoutSauveExecution()
329         self.menuOptions = self.menubar.addMenu("menuOptions")
330         self.menuOptions.addAction(self.actionParametres_Eficas)
331         self.menuOptions.setTitle(tr("Options"))
332
333     def PSEN(self):
334         if self.first:
335          self.first=0
336          if monEnvQT5:
337            self.action_Nouveau.triggered.disconnect(self.fileNew)
338            self.action_Nouveau.triggered.connect(self.newPSEN)
339            self
340          else :
341            self.disconnect(self.action_Nouveau,SIGNAL("triggered()"),self.fileNew)
342            self.connect(self.action_Nouveau,SIGNAL("triggered()"),self.newPSEN)
343         self.enleverActionsStructures()
344         self.enleverParametres()
345         self.enleverRechercherDsCatalogue()
346         self.enleverNewInclude()
347         self.ajoutExecution()
348         self.ajoutN1()
349         self.ajoutHelpPSEN()
350         self.ajoutIcones()
351
352     def TELEMAC(self):
353         self.enleverActionsStructures()
354         self.enleverNewInclude()
355
356     def ajoutHelpPSEN(self):
357         self.actionParametres_Eficas.setText('Help PSEN')
358 #
359         #Oself.disconnect(self.actionParametres_Eficas)
360         if monEnvQT5 :  self.actionParametres_Eficas.triggered.connect(self.aidePSEN)
361         else  : self.connect(self.actionParametres_Eficas,SIGNAL("triggered()"),self.aidePSEN)
362         
363
364
365     def ChercheGrpMesh(self):
366         Msg,listeGroup=self.ChercheGrpMeshInSalome()
367         if Msg == None :
368            self.viewmanager.handleAjoutGroup(listeGroup)
369         else :
370            print "il faut gerer les erreurs"
371
372     def ChercheGrpMaille(self):
373         # Normalement la variable self.salome permet de savoir si on est ou non dans Salome
374         try:
375             Msg,listeGroup=self.ChercheGrpMailleInSalome() # recherche dans Salomé
376             #Msg = None; listeGroup = None # recherche manuelle, i.e., sans Salomé si ligne précédente commentée
377         except:
378             raise ValueError('Salome non ouvert')
379         if Msg == None :
380            self.viewmanager.handleAjoutGroup(listeGroup)
381         else :
382            print "il faut gerer les erreurs"
383
384
385     def ChercheGrp(self):
386         #Msg,listeGroup=self.ChercheGrpMailleInSalome()
387         #if Msg == None :
388         #   self.viewmanager.handleAjoutGroup(listeGroup)
389         #else :
390         print "il faut gerer "
391
392
393     def ajoutIcones(self) :
394         # Pour pallier les soucis de repertoire d icone
395         print self.repIcon
396         icon = QIcon(self.repIcon+"/new_file.png")
397         self.action_Nouveau.setIcon(icon)
398         icon1 = QIcon(self.repIcon+"/ouvrir.png")
399         self.actionOuvrir.setIcon(icon1)
400         icon2 = QIcon(self.repIcon+"/save.png")
401         self.actionEnregistrer.setIcon(icon2)
402         icon6 = QIcon(self.repIcon+"/delete.png")
403         self.actionSupprimer.setIcon(icon6)
404         icon7 = QIcon(self.repIcon+"/roue.png")
405         self.actionExecution.setIcon(icon7)
406
407
408
409    
410     def connecterSignauxQT4(self) :
411         self.connect(self.recentMenu,SIGNAL('aboutToShow()'),self.handleShowRecentMenu)
412
413         self.connect(self.action_Nouveau,SIGNAL("triggered()"),self.fileNew)
414         self.connect(self.actionNouvel_Include,SIGNAL("triggered()"),self.NewInclude)
415         self.connect(self.actionOuvrir,SIGNAL("triggered()"),self.fileOpen)
416         self.connect(self.actionEnregistrer,SIGNAL("triggered()"),self.fileSave)
417         self.connect(self.actionEnregistrer_sous,SIGNAL("triggered()"),self.fileSaveAs)
418         self.connect(self.actionFermer,SIGNAL("triggered()"),self.fileClose)
419         self.connect(self.actionFermer_tout,SIGNAL("triggered()"),self.fileCloseAll)
420         self.connect(self.actionQuitter,SIGNAL("triggered()"),self.fileExit)
421
422         self.connect(self.actionEficas,SIGNAL("triggered()"),self.aidePPal)
423         self.connect(self.actionVersion,SIGNAL("triggered()"),self.version)
424         self.connect(self.actionParametres,SIGNAL("triggered()"),self.gestionParam)
425
426         self.connect(self.actionCouper,SIGNAL("triggered()"),self.editCut)
427         self.connect(self.actionCopier,SIGNAL("triggered()"),self.editCopy)
428         self.connect(self.actionColler,SIGNAL("triggered()"),self.editPaste)
429         self.connect(self.actionSupprimer,SIGNAL("triggered()"),self.supprimer)
430         self.connect(self.actionRechercher,SIGNAL("triggered()"),self.rechercher)
431         self.connect(self.actionDeplier_replier,SIGNAL("triggered()"),self.Deplier)
432
433         self.connect(self.actionRapport_de_Validation,SIGNAL("triggered()"),self.jdcRapport)
434         self.connect(self.actionRegles_du_JdC,SIGNAL("triggered()"),self.jdcRegles)
435         self.connect(self.actionFichier_Source,SIGNAL("triggered()"),self.jdcFichierSource)
436         self.connect(self.actionFichier_Resultat,SIGNAL("triggered()"),self.visuJdcPy)
437
438
439
440         # Pour Aster
441         self.actionTraduitV9V10 = QAction(self)
442         self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
443         self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
444         self.actionTraduitV10V11 = QAction(self)
445         self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
446         self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
447         self.actionTraduitV11V12 = QAction(self)
448         self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
449         self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
450         self.actionSauveLigne = QAction(self)
451         self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
452
453         #self.connect(self.actionParametres_Eficas,SIGNAL("triggered()"),self.optionEditeur)
454         self.connect(self.actionLecteur_Pdf,SIGNAL("triggered()"),self.optionPdf)
455         self.connect(self.actionTraduitV9V10,SIGNAL("triggered()"),self.traductionV9V10)
456         self.connect(self.actionTraduitV10V11,SIGNAL("triggered()"),self.traductionV10V11)
457         self.connect(self.actionTraduitV11V12,SIGNAL("triggered()"),self.traductionV11V12)
458         self.connect(self.actionSauveLigne,SIGNAL("triggered()"),self.sauveLigne)
459
460
461         # Pour Carmel
462         self.actionChercheGrpMaille = QAction(self)
463         self.actionChercheGrpMaille.setText(tr("Acquiert groupe mailles"))
464         self.connect(self.actionChercheGrpMaille,SIGNAL("triggered()"),self.ChercheGrpMaille)
465
466         # Pour CarmelCND
467         self.actionChercheGrp = QAction(self)
468         self.actionChercheGrp.setText(tr("Acquisition Groupe Maille"))
469         self.connect(self.actionChercheGrp,SIGNAL("triggered()"),self.ChercheGrp)
470
471         # Pour Aide
472         self.actionCode = QAction(self)
473         self.actionCode.setText(tr("Specificites Maille"))
474         self.connect(self.actionCode,SIGNAL("triggered()"),self.aideCode)
475
476     def connecterSignaux(self) :
477
478         print QApplication.focusChanged
479         #QApplication.focusChanged.connect(self.focusChanged)
480         self.recentMenu.aboutToShow.connect(self.handleShowRecentMenu)
481         self.action_Nouveau.triggered.connect(self.fileNew)
482         self.actionNouvel_Include.triggered.connect(self.NewInclude)
483         self.actionOuvrir.triggered.connect(self.fileOpen)
484         self.actionEnregistrer.triggered.connect(self.fileSave)
485         self.actionEnregistrer_sous.triggered.connect(self.fileSaveAs)
486         self.actionFermer.triggered.connect(self.fileClose)
487         self.actionFermer_tout.triggered.connect(self.fileCloseAll)
488         self.actionQuitter.triggered.connect(self.fileExit)
489
490         self.actionEficas.triggered.connect(self.aidePPal)
491         self.actionVersion.triggered.connect(self.version)
492         self.actionParametres.triggered.connect(self.gestionParam)
493
494         self.actionCouper.triggered.connect(self.editCut)
495         self.actionCopier.triggered.connect(self.editCopy)
496         self.actionColler.triggered.connect(self.editPaste)
497         self.actionSupprimer.triggered.connect(self.supprimer)
498         self.actionRechercher.triggered.connect(self.rechercher)
499         self.actionDeplier_replier.triggered.connect(self.Deplier)
500
501         self.actionRapport_de_Validation.triggered.connect(self.jdcRapport)
502         self.actionRegles_du_JdC.triggered.connect(self.jdcRegles)
503         self.actionFichier_Source.triggered.connect(self.jdcFichierSource)
504         self.actionFichier_Resultat.triggered.connect(self.visuJdcPy)
505
506
507         # Pour Aster
508         self.actionTraduitV9V10 = QAction(self)
509         self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
510         self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
511         self.actionTraduitV10V11 = QAction(self)
512         self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
513         self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
514         self.actionTraduitV11V12 = QAction(self)
515         self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
516         self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
517         self.actionSauveLigne = QAction(self)
518         self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
519
520         #self.actionParametres_Eficas.triggered.connect(self.optionEditeur)
521         self.actionTraduitV9V10.triggered.connect(self.traductionV9V10)
522         self.actionTraduitV10V11.triggered.connect(self.traductionV10V11)
523         self.actionTraduitV11V12.triggered.connect(self.traductionV11V12)
524         self.actionSauveLigne.triggered.connect(self.sauveLigne)
525
526         # Pour Carmel
527         self.actionChercheGrpMaille = QAction(self)
528         self.actionChercheGrpMaille.setText(tr("Acquiert Groupe Maille"))
529
530         # Pour CarmelCND
531         self.actionChercheGrp = QAction(self)
532         self.actionChercheGrp.setText(tr("Accquisition Groupe Maille"))
533         self.actionChercheGrp.triggered.connect(self.ChercheGrp)
534
535         # Pour Aide
536         self.actionCode = QAction(self)
537         self.actionCode.setText(tr("Specificites Maille"))
538         self.actionCode.triggered.connect(self.aideCode)
539
540
541     def Deplier(self):
542         self.viewmanager.handleDeplier()
543
544     def ouvreFichiers(self) :
545     # Ouverture des fichiers de commandes donnes sur la ligne de commande
546         cwd=os.getcwd()
547         self.dir=cwd
548         for study in session.d_env.studies:
549             os.chdir(cwd)
550             d=session.get_unit(study,self)
551             self.viewmanager.handleOpen(fichier=study["comm"],units=d)
552
553
554     def  get_source(self,file):
555     # appele par Editeur/session.py
556         import convert
557         p=convert.plugins['python']()
558         p.readfile(file)
559         texte=p.convert('execnoparseur')
560         return texte
561
562     def initPatrons(self) :
563     # Mise a jour du menu des fichiers recemment ouverts
564         from Editeur import listePatrons
565         if not(self.code in listePatrons.sous_menus.keys()) :
566            if hasattr(self,"menuPatrons"):
567               self.menuPatrons.setAttribute(Qt.WA_DeleteOnClose)
568               self.menuPatrons.close()
569               delattr(self,"menuPatrons")
570            return
571         if (not hasattr(self,"menuPatrons")):
572            self.menuPatrons = QMenu(self.menubar)
573            self.menuPatrons.setObjectName("menuPatrons")
574            self.menubar.addAction(self.menuPatrons.menuAction())
575            self.menuPatrons.setTitle(tr("Patrons"))
576         else :
577            self.menuPatrons.clear()
578         self.listePatrons = listePatrons.listePatrons(self.code)
579         idx = 0
580         for nomSsMenu in self.listePatrons.liste.keys():
581             ssmenu=self.menuPatrons.addMenu(nomSsMenu)
582             for fichier in self.listePatrons.liste[nomSsMenu]:
583                id = ssmenu.addAction(fichier)
584                self.ficPatrons[id]=fichier
585                if monEnvQT5 :  self.id.triggered.connect(self.handleOpenPatrons)
586                else : self.connect(id, SIGNAL('triggered()'),self.handleOpenPatrons)
587             #   self.Patrons.setItemParameter(id,idx)
588                idx=idx+1
589
590     def initRecents(self):
591        try :
592            if sys.platform[0:5]=="linux" :
593               rep=os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
594            else :
595               rep=os.path.join('C:/','.config/Eficas',self.code)
596            monFichier=rep+"/listefichiers_"+self.code
597            index=0
598            f=open(monFichier)
599            while ( index < 9) :
600               ligne=f.readline()
601               if ligne != "" :
602                  l=(ligne.split("\n"))[0]
603                  self.recent.append(l)
604               index=index+1
605        except :
606            pass
607
608        try    : f.close()
609        except : pass
610
611     def addToRecentList(self, fn):
612       if not monEnvQT5 : self.addToRecentListQT4(fn); return
613       while fn in self.recent: self.recent.remove(fn)
614       self.recent.insert(0,fn)
615       if len(self.recent) > 9:
616          self.recent = self.recent[:9]
617
618
619     def addToRecentListQT4(self, fn):
620         """
621         Public slot to add a filename to the list of recently opened files.
622
623         @param fn name of the file to be added
624         """
625         self.recent.removeAll(fn)
626         self.recent.prepend(fn)
627         if len(self.recent) > 9:
628             self.recent = self.recent[:9]
629         index=0
630         self.sauveRecents()
631
632     def sauveRecents(self) :
633        try :
634          rep=self.CONFIGURATION.rep_user
635          monFichier=rep+"/listefichiers_"+self.code
636        except :
637          return
638        try :
639             f=open(monFichier,'w')
640             if len(self.recent) == 0 : return
641             index=0
642             while ( index <  len(self.recent)):
643               ligne=str(self.recent[index])+"\n"
644               f.write(ligne)
645               index=index+1
646        except :
647             pass
648        try :
649             f.close()
650        except :
651             pass
652
653
654
655     def traductionV11V12(self):
656         from gereTraduction import traduction
657         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V11V12")
658
659     def traductionV10V11(self):
660         from gereTraduction import traduction
661         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V10V11")
662
663     def traductionV9V10(self):
664         from gereTraduction import traduction
665         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V9V10")
666
667     def version(self) :
668         from monVisu import DVisu
669         titre = tr("version ")
670         monVisuDialg=DVisu(parent=self,fl=0)
671         monVisuDialg.setWindowTitle(titre)
672         monVisuDialg.TB.setText(self.VERSION_EFICAS +tr(" pour ") + self.code)
673         monVisuDialg.adjustSize()
674         monVisuDialg.show()
675
676     def aidePPal(self) :
677         repAide=os.path.dirname(os.path.abspath(__file__))
678         maD=os.path.join( repAide,'..','Doc','html')
679         try :
680           indexAide=os.path.join(maD,'index.html')
681           if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
682           else                          : cmd="start "+indexAide
683           os.system(cmd)
684         except:
685           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
686
687     def aidePSEN(self) :
688         repAide=os.path.dirname(os.path.abspath(__file__))
689         maD=os.path.join( repAide,'..','Doc','html')
690         try :
691           indexAide=os.path.join(maD,'index.html')
692           if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
693           else                          : cmd="start "+indexAide
694           os.system(cmd)
695         except:
696           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
697
698     def aideCode(self) :
699         if self.code==None : return
700         try :
701         #if 1 :
702           if sys.platform[0:5]=="linux" : cmd="xdg-open "+self.fileDoc
703           else                          : cmd="start "+self.fileDoc
704           os.system(cmd)
705         except:
706         #else:
707           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
708
709
710     def optionEditeur(self) :
711         try :
712            name='monOptions_'+self.code
713         except :
714            QMessageBox.critical( self,tr( "Parametrage"),tr( "Veuillez d abord choisir un code"))
715            return
716         try :
717         #if 1:
718            optionCode=__import__(name)
719         except :
720         #else :
721            QMessageBox.critical( self, tr("Parametrage"), tr("Pas de possibilite de personnalisation de la configuration "))
722            return
723         monOption=optionCode.Options(parent=self,modal = 0 ,configuration=self.CONFIGURATION)
724         monOption.show()
725
726     def optionPdf(self) :
727         from monOptionsPdf import OptionPdf
728         monOption=OptionPdf(parent=self,modal = 0 ,configuration=self.CONFIGURATION)
729         monOption.show()
730
731     def handleShowRecentMenu(self):
732         """
733         Private method to set up recent files menu.
734         """
735         self.recentMenu.clear()
736
737         for rp in self.recent:
738             id = self.recentMenu.addAction(rp)
739             self.ficRecents[id]=rp
740             if monEnvQT5 : id.triggered.connect(self.handleOpenRecent)
741             else         : self.connect(id, SIGNAL('triggered()'),self.handleOpenRecent)
742         self.recentMenu.addSeparator()
743         self.recentMenu.addAction(tr('&Effacer'), self.handleClearRecent)
744
745     def handleOpenPatrons(self):
746         idx=self.sender()
747         fichier=self.repIni+"/../Editeur/Patrons/"+self.code+"/"+self.ficPatrons[idx]
748         self.viewmanager.handleOpen(fichier=fichier, patron = 1)
749
750     def handleOpenRecent(self):
751         idx=self.sender()
752         fichier=self.ficRecents[idx]
753         self.viewmanager.handleOpen(fichier=fichier, patron =0 )
754
755     def handleClearRecent(self):
756         self.recent = QStringList()
757         self.sauveRecents()
758
759     def fileNew(self):
760         try:
761             self.viewmanager.newEditor()
762         except EficasException, exc:
763             msg = unicode(exc)
764             if msg != "":
765                 QMessageBox.warning(self, tr(u"Erreur"), msg)
766
767     def fileOpen(self):
768         try:
769             self.viewmanager.handleOpen()
770         except EficasException, exc:
771             msg = unicode(exc)
772             if msg != "":
773                 QMessageBox.warning(self, tr(u"Erreur"), msg)
774
775     def sauveLigne(self):
776         return self.viewmanager.sauveLigneCurrentEditor()
777
778     def fileSave(self):
779         return self.viewmanager.saveCurrentEditor()
780
781     def fileSaveAs(self):
782         return self.viewmanager.saveAsCurrentEditor()
783
784     def fileClose(self):
785         self.viewmanager.handleClose(texte='&Fermer')
786
787     def fileCloseAll(self):
788         self.viewmanager.handleCloseAll(texte='&Fermer')
789
790     def fileExit(self):
791         # On peut sortir sur Abort
792         res=self.viewmanager.handleCloseAll()
793         if (res != 2) :
794             self.close()
795         return res
796
797     def editCopy(self):
798         self.viewmanager.handleEditCopy()
799
800     def editCut(self):
801         self.viewmanager.handleEditCut()
802
803     def editPaste(self):
804         self.viewmanager.handleEditPaste()
805
806     def rechercher(self):
807         self.viewmanager.handleRechercher()
808
809     def run(self):
810         self.viewmanager.run()
811
812     def saveRun(self):
813         self.viewmanager.saveRun()
814
815
816     def supprimer(self):
817         self.viewmanager.handleSupprimer()
818
819     def jdcFichierSource(self):
820         self.viewmanager.handleViewJdcFichierSource()
821
822     def jdcRapport(self):
823         self.viewmanager.handleViewJdcRapport()
824
825     def jdcRegles(self):
826         self.viewmanager.handleViewJdcRegles()
827
828     def gestionParam(self):
829         self.viewmanager.handlegestionParam()
830
831     def visuJdcPy(self):
832         self.viewmanager.handleViewJdcPy()
833
834
835     def NewInclude(self):
836         self.viewmanager.newIncludeEditor()
837
838     def cleanPath(self):
839         for pathCode in self.ListeCode:
840             try:
841               aEnlever=os.path.abspath(os.path.join(os.path.dirname(__file__),'..',pathCode))
842               sys.path.remove(aEnlever)
843             except :
844               pass
845         for pathCode in self.listeAEnlever:
846             try:
847               sys.path.remove(aEnlever)
848             except :
849               pass
850
851
852     def closeEvent(self,event):
853       res=self.fileExit()
854       if res==2 : event.ignore()
855
856     def focusChanged(self,oldW, newW) :
857       print "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj"
858       print newW
859
860 if __name__=='__main__':
861
862     # Modules Eficas
863     rep=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__),'..','ASTER')))
864     sys.path.append(rep)
865     from Aster import prefsCode
866     if hasattr(prefsCode,'encoding'):
867        # Hack pour changer le codage par defaut des strings
868        import sys
869        reload(sys)
870        sys.setdefaultencoding(prefsCode.encoding)
871        del sys.setdefaultencoding
872        # Fin hack
873
874     from Editeur import import_code
875     from Editeur import session
876
877     # Analyse des arguments de la ligne de commande
878     options=session.parse(sys.argv)
879     code=options.code
880
881
882     app = QApplication(sys.argv)
883     #app.setMainWidget(mw) (qt3)
884     Eficas=Appli()
885     Eficas.show()
886
887     #mw.ouvreFichiers()
888     #mw.show()
889
890     res=app.exec_()
891     sys.exit(res)