Salome HOME
sauve du 9 mai
[tools/eficas.git] / InterfaceQT4 / editor.py
index ff250857fedbae642fc7b13b1c076cc4f0f57f6c..346d877913147e5adaeef30f04e3a4702ca9b376 100755 (executable)
 import types,sys,os, re
 import  subprocess
 import traceback
-from PyQt4 import *
-from PyQt4.QtGui  import *
-from PyQt4.QtCore import *
+
+from determine import monEnvQT5
+if monEnvQT5:
+    from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter
+    from PyQt5.QtGui import QPalette
+    from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
+else :
+    from PyQt4.QtGui  import *
+    from PyQt4.QtCore import *
 import time
 import pdb
 from datetime import date
@@ -37,16 +43,16 @@ from Editeur        import comploader
 from Editeur        import Objecttreeitem
 from desBaseWidget  import Ui_baseWidget
 from monViewTexte   import ViewText 
-from monViewTexte   import ViewText2
 from monWidgetCreeParam import MonWidgetCreeParam 
 import browser
 import readercata
 
 DictExtensions= {"MAP" : ".map"}
 
+    
 
 
-class JDCEditor(Ui_baseWidget,QtGui.QWidget):
+class JDCEditor(Ui_baseWidget,QWidget):
 # ----------------------------------------- #
     """
        Editeur de jdc
@@ -55,12 +61,15 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
     #----------------------------------------------------------------------------------------------------------#
 
-        QtGui.QWidget.__init__(self,None)
+        QWidget.__init__(self,None)
+        self.i=0
         self.setupUi(self)
+        self.inhibeSplitter=0
         self.widgetOptionnel=None
         self.fenetreCentraleAffichee=None
         self.dejaDansPlieTout=False
         self.afficheCommandesPliees = True
+        self.listeDesListesOuvertes=set()
         self.appliEficas = appli
         self.appli       = appli  #---- attendu par IHM
         self.vm          = vm
@@ -68,6 +77,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         self.jdc         = jdc
         self.first      = True
         self.QWParent    = QWParent
+        self.couleur     = Qt.black
          
         if appli != None :
            self.salome =  self.appliEficas.salome
@@ -77,6 +87,11 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
         # ces attributs sont mis a jour par definitCode appelee par newEditor
         self.code = self.appliEficas.CONFIGURATION.code
+        # tres vite a cause du tag. doit etre pase dans CONFIGURATION
+
+        self.afficheListesPliees=False
+        if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
+
         self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
         self.affiche=self.appliEficas.CONFIGURATION.affiche
         #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
@@ -86,7 +101,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
            self.widgetTree=None
            self.appliEficas.resize(1440,self.appliEficas.height())
         else :
-           self.appliEficas.resize(2000,self.appliEficas.height())
+           self.appliEficas.resize(1800,self.appliEficas.height())
 
         self.version_code = session.d_env.cata
 
@@ -103,6 +118,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         self.format =  self.appliEficas.format_fichier
 
         self.dict_reels={}
+        self.splitterSizes =  [320,1320,320]
+        self.oldSizeWidgetOptionnel = 320
         self.liste_simp_reel=[]
         self.ihm="QT"
 
@@ -121,6 +138,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
         try:
           self.CONFIGURATION.convert_module
+          print self.CONFIGURATION.convert_module
           _module = __import__(self.CONFIGURATION.convert_module)
           info = _module.entryPoint()
           convert.plugins.addEntryPoint(info)
@@ -186,7 +204,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
                 txt_exception = self.jdc.cr.get_mess_exception()
             if txt_exception:
                 self.jdc = None
-                qApp.restoreOverrideCursor()
+                QApplication.restoreOverrideCursor()
                 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
                 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
             else:
@@ -197,34 +215,19 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
  
 
 
-        if jdc_item:
+        if jdc_item and self.appliEficas.ssIhm==False:
             self.tree = browser.JDCTree( jdc_item,  self )
         self.appliEficas.construitMenu()
-
-    #-------------------#   Pour execution avec output sans une fenetre EFICAS. (erreurs encore dans la fenetre bash)
-    def runPSEN_2(self):   
-    #-------------------#
-      if self.modified or self.fichier==None  :
-         QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
-         return
-        
-      #monPython="/home/A96028/salome75/prerequisites/install/Python-273-tcl8513-tk8513/bin/python"
-      #monWrapper="/local00/home/A96028/GitEficasTravail/eficas/PSEN_Eficas/PSSEWrapper.py"
-      path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
-      monWrapper = os.path.join(path1, 'PSSEWrapper.py')
-      cmd=['python',monWrapper]
-
-      w = ViewText2( self.QWParent, cmd )
-      w.setWindowTitle( "execution" )
-      w.exec_()
+        self.saveSplitterSizes()
+        #if monEnvQT5:
+        #   self.splitter./s
+        #else :
 
 
     #-------------------#  Pour execution avec output et error dans le bash
     def runPSEN(self):
     #-------------------#
-      if self.modified or self.fichier==None  :
-         QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
-         return
+      if self.modified or self.fichier==None  : self.saveFile()
         
       #lancement avec le .bat
       path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
@@ -406,8 +409,12 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         f=open(nomFichier,'w')
         f.write(txt)
         f.close()
-        self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
-        self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
+        if monEnvQT5 :
+           self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
+           self.monExe.readyReadStandardError.connect( self.readFromStdErr)
+        else :
+           self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOutQT4 )
+           self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErrQT4 )
         exe='sh ' + nomFichier
         self.monExe.start(exe)
         self.monExe.closeWriteChannel()
@@ -418,12 +425,19 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         except :
           pass
 
-
     def readFromStdErr(self):
+        a=self.monExe.readAllStandardError()
+        self.w.view.append(str(a.data(),len(a)))
+
+    def readFromStdErr(self) :
+        a=self.monExe.readAllStandardOutput()
+        self.w.view.append(str(a.data(),len(a)))
+
+    def readFromStdErrQT4(self):
         a=self.monExe.readAllStandardError()
         self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
 
-    def readFromStdOut(self) :
+    def readFromStdOutQT4(self) :
         a=self.monExe.readAllStandardOutput()
         self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
         
@@ -457,6 +471,12 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         
         self._viewText(strRapport, "JDC_RAPPORT")
 
+    #-----------------------#
+    def viewJdcRegles(self):
+    #-----------------------#
+        if self.tree :self.tree.AppelleBuildLBRegles()
+
+
     #----------------#
     def closeIt(self):
     #----------------#
@@ -472,10 +492,10 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #----------------------------------------------#
         if self.sb:
            mapalette=self.sb.palette()
-           from PyQt4.QtGui import QPalette
            mapalette.setColor( QPalette.WindowText, couleur )
            self.sb.setPalette( mapalette );
-           self.sb.showMessage(QString.fromUtf8(message))#,2000)
+           self.sb.showMessage(message,4000)
+           self.couleur=couleur
 
     #------------------------------#
     def affiche_alerte(self,titre,message):
@@ -487,6 +507,12 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     def affiche_commentaire(self,message):
     #-----------------------------------#
         self.labelCommentaire.setText(message)
+        QTimer.singleShot(6000, self.rendInvisible)
+
+    #----------------------#
+    def rendInvisible(self):
+    #----------------------#
+        self.labelCommentaire.setText("")
 
     #-------------------#
     def init_modif(self):
@@ -528,7 +554,6 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #---------------------#
     def handleDeplier(self):
     #---------------------#
-       print "je passe ici"
        if self.tree == None : return
        #self.tree.collapseAll()
        if self.deplier :
@@ -599,11 +624,13 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
          indexNoeudOuColler=0
          pos='before'
       else :
-         indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
+         #indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
+         indexNoeudOuColler=self.getTreeIndex(noeudOuColler)
 
       try :
        noeudACopier=self.QWParent.noeud_a_editer[0]
-       indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
+       #indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
+       indexNoeudACopier=self.getTreeIndex(noeudACopier)
       except :
        QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
        return
@@ -645,7 +672,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
          #if 1:
          try :
-            indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
+           # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
+            indexNoeudACopier=self.getTreeIndex(noeudACopier)
             noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
             noeudACopier.treeParent.build_children()
 
@@ -745,7 +773,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
      fichier = QFileDialog.getOpenFileName(self.appliEficas,
                    tr('Ouvrir Fichier'),
                    self.appliEficas.CONFIGURATION.savedir,
-                   self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
+                   tr('Wrapper Files (*.xml);;''All Files (*)'))
      return  fichier
 
     #--------------------------------------------------#
@@ -754,7 +782,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         """
         Public slot to write the text to a file.
 
-        @param fn filename to write to (string or QString)
+        @param fn filename to write to string
         @return flag indicating success
         """
 
@@ -777,9 +805,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
             f.close()
             return 1
         except IOError, why:
-            QMessageBox.critical(self, self.trUtf8('Save File'),
-                self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
-                    .arg(unicode(fn)).arg(str(why)))
+            QMessageBox.critical(self, tr('Sauvegarde du Fichier'),
+                tr('Le fichier')+str(fn) + tr('n a pas pu etre sauvegarde : ') + str(why))
             return 0
 
     #-----------------------------------------------------------#
@@ -920,9 +947,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #-----------------------------------------------------#
       if DictExtensions.has_key(self.appli.code) :
          chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
-         extensions= self.trUtf8(chaine1+ "All Files (*)")
+         extensions= tr(chaine1+ "All Files (*)")
       else :
-         extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
+         extensions= tr("JDC (*.comm);;" "All Files (*)")
 
       if self.appli.code == "MAP" :
          extensions = extensions + ";; Run (*.input);;"
@@ -931,16 +958,27 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
              tr("sauvegarde"), path,
              extensions,None,
              QFileDialog.DontConfirmOverwrite)
-      if fn.isNull(): return (0, None)
+      if fn == None : return (0, None)
+      if monEnvQT5 :  fn=fn[0]
+      if fn=='': return (0, None)
+
       ext = QFileInfo(fn).suffix()
-      if ext.isEmpty(): fn.append(extension)
+      if ext == '': fn+=extension
 
       if QFileInfo(fn).exists():
-           abort = QMessageBox.warning(self,
+           if monEnvQT5 :
+             msgBox = QMessageBox(self)
+             msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
+             msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", unicode(fn)))
+             msgBox.addButton(tr("&Ecraser"),0)
+             msgBox.addButton(tr("&Abandonner"),1)
+             abort=msgBox.exec_()
+           else :
+             abort = QMessageBox.warning(self,
                    tr("Sauvegarde du Fichier"),
                    tr("Le fichier <b>%s</b> existe deja.",str(fn)),
                    tr("&Ecraser"),
-                   self.trUtf8("&Abandonner"))
+                   tr("&Abandonner"))
            if abort == 1 :  return (0, "")
       return (1,fn)
 
@@ -981,15 +1019,19 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
                for b in c.children():
                   if isinstance(b,QPushButton):
                      avant=b.text()
-                     if avant.toLatin1()=="&Open":
-                        b.setText("Save")
-        mesFiltres=QStringList()
-        mesFiltres << "input Map (*.input)" << "All Files (*)"
+                     if (not monEnvQT5) and avant.toLatin1()=="&Open": b.setText("Save")
+                     if monEnvQT5 and avant=="&Open": b.setText("Save")
+        if monEnvQT5 :
+           mesFiltres= "input Map (*.input);;All Files (*)"
+        else :
+           mesFiltres=QStringList()
+           mesFiltres << "input Map (*.input)" << "All Files (*)"
         monDialog.setNameFilters(mesFiltres)
         if monNomFichier!="" : monDialog.selectFile(monNomFichier)
         BOk=monDialog.exec_()
         if BOk==0: return
-        fn=str(monDialog.selectedFiles()[0].toLatin1())
+        if monEnvQT5 : fn=str(monDialog.selectedFiles()[0])
+        else : fn=str(monDialog.selectedFiles()[0].toLatin1())
         if fn == "" or fn == None : return
         if not fn.endswith(".input"):
             fn += ".input"
@@ -1097,16 +1139,15 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         newName = None
         fn = self.fichier
         if self.fichier is None or saveas:
-          if path is None:
-             path=self.CONFIGURATION.savedir
+          if path is None: path=self.CONFIGURATION.savedir
           bOK, fn=self.determineNomFichier(path,extension)
           if bOK == 0 : return (0, None)
           if fn == None : return (0, None)
-          if fn.isNull(): return (0, None)
+          if fn== '' : return (0, None)
 
           ulfile = os.path.abspath(unicode(fn))
           self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
-          fn = unicode(QDir.convertSeparators(fn))
+          fn = unicode(QDir.toNativeSeparators(fn))
           newName = fn
 
 
@@ -1124,6 +1165,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
         if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
             self.generator.writeDefault(fn)
+        if self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
+            self.generator.writeDefault(fn)
 
         if self.salome :
                self.appliEficas.addJdcInSalome( self.fichier)
@@ -1177,14 +1220,15 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
             texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
             texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
 
-        QMessageBox.information( self, titre,QString.fromUtf8(texte))
+        QMessageBox.information( self, titre,texte)
         fn = QFileDialog.getOpenFileName(self.appliEficas,
                    titre,
                    self.appliEficas.CONFIGURATION.savedir)
 
-        if fn.isNull():
         # ce retour est impose par le get_file d'I_JDC
-           return None," "
+        if fn== '' : return None," "
+        if not fn : return (0, " ")
+        if monEnvQT5 :  fn=fn[0]
 
         ulfile = os.path.abspath(unicode(fn))
         self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
@@ -1312,7 +1356,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
                         caption='Fichier Med',
                         filter=extensions)
-      self.fichierMED=str(QSfichier.toLatin1())
+      if monEnvQT5 : QSfichier=QSfichier[0]
+      self.fichierMED=QSfichier
       from acquiertGroupes import getGroupes
       erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
       if erreur != "" : print "a traiter"
@@ -1341,7 +1386,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #---------------------------#
 
       QSfichier=self.openfile.selectedFiles()[0]
-      self.fichierMED=str(QSfichier.toLatin1())
+      self.fichierMED=str(QSfichier)
       from acquiertGroupes import getGroupes
       erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
       if erreur != "" : print "a traiter"
@@ -1354,6 +1399,80 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       self.nomMaillage="A_partir_de_SMESH"
       self.openfile.close()
 
+    #-------------------------------------
+    def saveSplitterSizes(self,event=None):
+    #------------------------------------
+      if self.inhibeSplitter : return
+      if not hasattr(self,'splitter') : return
+      if self.splitterSizes[2] != 0 : self.oldSizeWidgetOptionnel = self.splitterSizes[2]
+      # print  self.splitterSizes
+      #print self.splitter.sizes()
+      # PNPNPNPN parfoir self.splitter.sizes() a une longueur de 4...
+      nbAGarder=len(self.splitter.sizes())
+      if nbAGarder > 3 : nbAGarder=3
+      for i in range(nbAGarder):
+         self.splitterSizes[i] = self.splitter.sizes()[i]
+         self.splitter.widget(i).resizeEvent=self.saveSplitterSizes
+
+
+    #-----------------------------------------
+    def restoreSplitterSizes(self,nbWigdet=3):
+    #----------------------------------------
+      self.inhibeSplitter = 1
+      self.i+=1
+      if not(hasattr(self,'splitter')) : return
+      newSizes=self.splitterSizes[:nbWigdet]
+      self.splitter.setSizes(newSizes)
+      self.inhibeSplitter = 0
+   
+    #------------------------
+    def fermeOptionnel(self):
+    #------------------------
+      if self.widgetOptionnel == None : return
+
+      self.inhibeSplitter=1
+      self.splitterSizes[1] = self.splitterSizes[1] + self.splitterSizes[2]
+      if self.splitterSizes[2]!=0 : self.oldSizeWidgetOptionnel = self.splitterSizes[2]
+      self.splitterSizes[2]=0
+
+      self.widgetOptionnel.setParent(None)
+      self.widgetOptionnel.close()
+      self.widgetOptionnel.deleteLater()
+      self.widgetOptionnel=None
+      self.inhibeSplitter=0
+      self.restoreSplitterSizes(2)
+      
+    #------------------------
+    def ajoutOptionnel(self):
+    #------------------------
+      #print "ajoutOptionnel"
+      #print self.splitterSizes
+      self.splitterSizes[2] = self.oldSizeWidgetOptionnel
+      self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
+      self.inhibeSplitter=0
+      self.restoreSplitterSizes(3)
+
+
+    #-----------------------------
+    def getTreeIndex(self,noeud):
+    #----------------------------
+      indexNoeud=-1
+      if noeud in noeud.treeParent.children :
+          indexNoeud=noeud.treeParent.children.index(noeud)
+      else :
+          if hasattr(noeud,'vraiParent') :
+              noeudVrai = noeud
+              noeudVraiParent = noeud.vraiParent
+              while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
+                  noeudVrai = noeudVraiParent
+                  noeudVraiParent = noeudVraiParent.vraiParent
+                  pass
+              if noeudVraiParent == noeud.treeParent :
+                  indexNoeud=noeud.treeParent.children.index(noeudVrai)
+                  pass
+              pass
+          pass
+      return indexNoeud
 
 if __name__ == "__main__":
     self.code='ASTER'