]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
*** empty log message ***
authorPascale Noyret <pascale.noyret@edf.fr>
Mon, 2 Jun 2008 14:13:02 +0000 (14:13 +0000)
committerPascale Noyret <pascale.noyret@edf.fr>
Mon, 2 Jun 2008 14:13:02 +0000 (14:13 +0000)
34 files changed:
InterfaceQT4/__init__.py [new file with mode: 0644]
InterfaceQT4/browser.py [new file with mode: 0644]
InterfaceQT4/compobase.py [new file with mode: 0644]
InterfaceQT4/compobloc.py [new file with mode: 0644]
InterfaceQT4/compocomm.py [new file with mode: 0644]
InterfaceQT4/compocommandecomm.py [new file with mode: 0644]
InterfaceQT4/compoerror.py [new file with mode: 0644]
InterfaceQT4/compofact.py [new file with mode: 0644]
InterfaceQT4/compoformule.py [new file with mode: 0644]
InterfaceQT4/compojdc.py [new file with mode: 0644]
InterfaceQT4/compomacro.py [new file with mode: 0644]
InterfaceQT4/compomclist.py [new file with mode: 0644]
InterfaceQT4/componiveau.py [new file with mode: 0644]
InterfaceQT4/componuplet.py [new file with mode: 0644]
InterfaceQT4/compooper.py [new file with mode: 0644]
InterfaceQT4/compoparam.py [new file with mode: 0644]
InterfaceQT4/compoparameval.py [new file with mode: 0644]
InterfaceQT4/compoproc.py [new file with mode: 0644]
InterfaceQT4/composimp.py [new file with mode: 0644]
InterfaceQT4/editor.py [new file with mode: 0644]
InterfaceQT4/eficas.py [new file with mode: 0644]
InterfaceQT4/eficas_go.py [new file with mode: 0644]
InterfaceQT4/gereTraduction.py [new file with mode: 0644]
InterfaceQT4/monChoixCata.py [new file with mode: 0644]
InterfaceQT4/monCommandePanel.py [new file with mode: 0644]
InterfaceQT4/monCommentairePanel.py [new file with mode: 0644]
InterfaceQT4/monFonctionPanel.py [new file with mode: 0644]
InterfaceQT4/monFormulePanel.py [new file with mode: 0644]
InterfaceQT4/monIncludePanel.py [new file with mode: 0644]
InterfaceQT4/monListeParamPanel.py [new file with mode: 0644]
InterfaceQT4/monMCFactPanel.py [new file with mode: 0644]
InterfaceQT4/monMCListAjoutPanel.py [new file with mode: 0644]
InterfaceQT4/monMacroPanel.py [new file with mode: 0644]
InterfaceQT4/monOptionsEditeur.py [new file with mode: 0644]

diff --git a/InterfaceQT4/__init__.py b/InterfaceQT4/__init__.py
new file mode 100644 (file)
index 0000000..21d22fb
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+"""
+    Ce package contient les fonctionnalités  nécessaires
+    pour l'éditeur graphique QT
+"""
diff --git a/InterfaceQT4/browser.py b/InterfaceQT4/browser.py
new file mode 100644 (file)
index 0000000..e149adc
--- /dev/null
@@ -0,0 +1,510 @@
+# -*- coding: utf-8 -*-
+import os,sys,string,re,types,traceback
+
+from qt import *
+import utilIcons
+
+
+class JDCTree( QListView ):
+    def __init__( self, jdc_item, parent = None ):        
+        QListView.__init__( self, parent )
+        
+        self.item     = jdc_item
+        self.tree     = self        
+        self.editor   = parent
+        self.racine   = self
+        self.node_selected = None
+        self.children      = self.build_children()        
+        
+        self.setCaption(self.trUtf8('Browser'))
+        self.setRootIsDecorated(1)
+        self.setSorting(-1)
+        self.addColumn(self.trUtf8('Commande'))
+        self.addColumn(self.trUtf8('Concept/Valeur'))
+                
+        self.setMinimumSize(QSize(400,500))
+        self.connect(self,SIGNAL('contextMenuRequested(QListViewItem *, const QPoint &, int)'),
+                     self.handleContextMenu)
+
+        #self.connect(self, SIGNAL("onItem ( QListViewItem * ) "), self.handleOnItem)
+        self.connect(self, SIGNAL("clicked ( QListViewItem * ) "), self.handleOnItem)
+        self.connect(self, SIGNAL('mouseButtonPressed(int, QListViewItem*, const QPoint&, int)'),
+                     self.handleNommeItem)
+        
+        
+    def handleContextMenu(self,itm,coord,col):
+        """
+        Private slot to show the context menu of the listview.
+        
+        @param itm the selected listview item (QListViewItem)
+        @param coord the position of the mouse pointer (QPoint)
+        @param col the column of the mouse pointer (int)
+        """
+        try:
+            if itm.menu:
+                itm.menu.popup(coord)            
+        except:
+            pass
+            
+    def handleNommeItem(self,bouton,itm,coord,col):
+        """
+        PN --> a finir eventuellement pour nommer
+        le concept dans l arbre
+        """
+        try :
+            if itm :
+               panel=itm.getPanel()
+               if panel.node.item.object.get_type_produit() != None :
+                  pass
+        except:
+            pass
+
+    def handleOnItem(self,  item ):
+        try :
+           fr = item.item.get_fr()
+           if self.editor:
+              self.editor.affiche_infos(fr)
+        except:
+            pass
+        
+    def build_children(self):
+        """ Construit la liste des enfants de self """
+        children = []
+        child = self.item.itemNode(self,self.item)
+        children.append(child)
+        child.state='expanded'
+        return children
+        
+    def supprime(self):
+        """ supprime tous les elements de l'arbre """
+        raise RuntimeError, 'Not implemented'
+        self.tree = None
+        self.racine = None
+        self.node_selected = None
+        self.item = None
+        self.scrolledcanvas = None
+        for child in self.children:
+            child.supprime()
+        self.children=[]
+                
+    def showEvent(self, event):
+        """ QT : pour afficher le 1er niveau d'arborescence de l''arbre"""        
+        self.children[0].select()
+        
+    def update(self):
+        """ Update tous les elements de l'arbre """
+        for child in self.children:
+            child.update()
+            
+# type de noeud
+COMMENT     = "COMMENTAIRE"
+PARAMETERS  = "PARAMETRE"
+
+        
+class JDCNode(QListViewItem):
+    def __init__( self, parent, item, after=None, bold=0):
+        """
+        Constructor
+        
+        @param parent parent Browser or BrowserNode
+        @param text text to be displayed by this node (string or QString)
+        @param after sibling this node is positioned after
+        @param bold flag indicating a highlighted font
+        """        
+        self.item   = item
+        self.parent = parent
+        self.tree   = self.parent.tree
+        self.editor = self.parent.tree.editor
+        self.bold   = bold
+                        
+        name  = self.tree.trUtf8(  str( item.GetLabelText()[0] ) )
+        value = self.tree.trUtf8(  str( item.GetText() ) )
+        
+        if after is None:        
+            QListViewItem.__init__(self,parent)            
+            self.setText(0, name )
+            self.setText(1, value )            
+        else:
+            QListViewItem.__init__(self,parent, after)
+            self.setText(0, name )
+            self.setText(1, value)
+            
+        p = utilIcons.getPixmap(item.GetIconName() + ".gif")
+        self.setPixmap(0,p)
+        self.setExpandable(item.IsExpandable())
+                
+        self.connect()    
+        self.init()        
+        self.createPopUpMenu()
+        
+        
+    def paintCell(self, p, cg, column, width, alignment):
+        """
+        Overwritten class to set a different text color, if bold is true.
+        
+        @param p the painter (QPainter)
+        @param cg the color group (QColorGroup)
+        @param column the column (int)
+        @param width width of the cell (int)
+        @param alignment alignment of the cell (int)
+        """
+        _cg = QColorGroup(cg)
+        c = _cg.text()
+        
+        if self.bold and column == 0:
+            _cg.setColor(QColorGroup.Text, Qt.red)
+            
+        QListViewItem.paintCell(self, p, _cg, column, width, alignment)
+        
+        _cg.setColor(QColorGroup.Text, c)
+        
+        
+    def setOpen(self, o):
+        """
+        Public slot to set/reset the open state.
+        
+        @param o flag indicating the open state
+        """        
+        if o:        
+            if not self.children :                
+                self.build_children()
+            self.selected = 1
+            self.tree.node_selected = self            
+        else:
+            
+            for child in self.children:
+                self.takeItem(child)
+                del child
+            self.children = []
+        QListViewItem.setOpen(self,o)
+       self.tree.setSelected(self,o)
+    
+     
+    #----------------------------------------------------------
+    #   interface a implementer par les noeuds derives (debut)
+    #----------------------------------------------------------
+    def getPanel(self):
+        print self.__class__
+        return None
+        
+    def createPopUpMenu(self):
+        pass 
+        
+    #----------------------------------------------------
+    #   interface a implementer par les noeuds derives (fin)
+    #----------------------------------------------------
+    
+    def init(self): #CS_pbruno toclean
+        self.state='collapsed'
+        self.displayed = 0
+        self.selected = 0
+        self.x = self.y  =None
+        self.lasty = 0
+        self.children = []
+        self.id = []
+        if self.parent is self.tree:
+           self.racine=self
+        else:
+           self.racine = self.parent.racine
+                      
+    def connect(self):
+        self.item.connect("add",self.onAdd,())
+        self.item.connect("supp",self.onSupp,())
+        self.item.connect("valid",self.onValid,())
+
+           
+    def commentIt(self):
+        """
+        Cette methode a pour but de commentariser la commande pointee par self
+        """
+        # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
+        # (commentariser) un commentaire.
+        try :
+            pos=self.parent.children.index(self)
+            commande_comment = self.item.get_objet_commentarise()
+            # On signale au parent du panel (le JDCDisplay) une modification
+            self.editor.init_modif()
+            self.parent.children[pos].select()
+        except Exception,e:
+            traceback.print_exc()
+            QMessageBox.critical( self.parent, "TOO BAD",str(e))
+        return
+        
+    def unCommentIt(self):
+        """
+        Realise la decommentarisation de self
+        """
+        try :
+            pos=self.parent.children.index(self)
+            commande,nom = self.item.uncomment()
+            self.editor.init_modif()
+            self.parent.children[pos].select()
+        except Exception,e:
+            QMessageBox.critical( self.editor, "Erreur !",str(e))
+            return        
+        
+    def addComment( self, after=True ):
+        """
+        Ajoute un commentaire a l'interieur du JDC :
+        """
+        self.editor.init_modif()        
+        if after:
+            pos = 'after'
+        else:
+            pos = 'before'
+        return self.append_brother( COMMENT, pos )
+                
+    def addParameters( self, after=True ):
+        """
+        Ajoute un parametre a l'interieur du JDC :
+        """
+        self.editor.init_modif()
+        if after:
+            pos = 'after'
+        else:
+            pos = 'before'
+        return self.append_brother( PARAMETERS, pos )
+    
+    
+    
+    def select( self ):
+        """
+        Rend le noeud courant (self) selectionne et deselectionne
+        tous les autres
+        """        
+        self.setOpen( True )    
+                               
+    #------------------------------------------------------------------
+    # Methodes de creation et destruction de noeuds
+    # Certaines de ces methodes peuvent etre appelees depuis l'externe
+    #------------------------------------------------------------------
+    def append_brother(self,name,pos='after',retour='non'):
+        """
+        Permet d'ajouter un objet frere a l'objet associe au noeud self
+        par defaut on l'ajoute immediatement apres 
+        Methode externe
+        """
+        # on veut ajouter le frere de nom name directement avant ou apres self
+##       print "*********** append_brother ", self.item.GetLabelText()
+        index = self.parent.children.index(self)
+        if pos == 'before':
+            index = index
+        elif pos == 'after':
+            index = index +1
+        else:
+            print str(pos)," n'est pas un index valide pour append_brother"
+            return 0
+        return self.parent.append_child(name,pos=index)
+
+    def append_child(self,name,pos=None,verif='oui',retour='non'):
+        """
+           Methode pour ajouter un objet fils a l'objet associe au noeud self.
+           On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
+           ou en position intermediaire.
+           Si pos vaut None, on le place a la position du catalogue.
+        """
+##        print "************** append_child ",self.item.GetLabelText()
+        if pos == 'first':
+            index = 0
+        elif pos == 'last':
+            index = len(self.children)
+        elif type(pos) == types.IntType :
+            # position fixee
+            index = pos
+        elif type(pos) == types.InstanceType:
+            # pos est un item. Il faut inserer name apres pos
+            index = self.item.get_index(pos) +1
+        elif type(name) == types.InstanceType:
+            index = self.item.get_index_child(name.nom)
+        else:
+            index = self.item.get_index_child(name)
+        obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
+        #print obj
+        if obj is None:obj=0
+        if obj == 0:return 0
+        #print "append_child",index,self.children
+        child=self.children[index]
+        child.select()
+        return child
+
+    def delete(self):
+        """ 
+            Methode externe pour la destruction de l'objet associe au noeud
+            La mise a jour des noeuds est faite par onSupp sur notification
+        """
+        self.editor.init_modif()
+        index = self.parent.children.index(self) - 1 
+        if index < 0 : index =0
+
+        parent=self.parent
+        ret=parent.item.suppitem(self.item)
+        if ret == 0:return
+
+        brothers=parent.children
+        if brothers:
+           toselect=brothers[index]
+        else:
+           toselect=parent
+        toselect.select()
+        
+    #------------------------------------------------------------------
+    def onValid(self):        
+        self.update_node_valid()
+        self.update_node_label()
+        self.update_node_texte()
+        
+
+    def onAdd(self,objet):        
+        #print "NODE onAdd : un objet a ete ajoute aux fils de l'item ",self.item.GetLabelText()
+        old_nodes=self.children
+        self.update_nodes()
+        #self.select()
+
+    def onSupp(self,objet):
+        #print "NODE onSupp : un objet a ete supprime des fils de l'item ",self.item.object,objet
+        old_nodes=self.children
+        self.update_nodes()
+        #self.select()
+        
+    def update_node_valid(self):
+        """Cette methode remet a jour la validite du noeud (icone)
+           Elle appelle isvalid
+        """
+        #print 'NODE update_node_valid', self.item.GetLabelText()
+        p = utilIcons.getPixmap(self.item.GetIconName() + ".gif")
+        self.setPixmap(0,p)
+
+    def update_node_label(self): #CS_pbruno todo
+        """ Met a jour le label du noeud """
+        #print "NODE update_node_label", self.item.GetLabelText()
+        labeltext,fonte,couleur = self.item.GetLabelText()
+        self.setText(0, labeltext)        
+    
+    def update_node_texte(self):
+        """ Met a jour les noms des SD et valeurs des mots-cles """
+        #print "NODE update_node_texte", self.item.GetLabelText()
+        value = self.item.GetText()
+        self.setText(1, value)
+
+    def update_nodes(self):
+        #print "NODE update_nodes ", self.item.GetLabelText()
+        self.setOpen( False )
+        self.setOpen( True )
+        #self.select()
+            
+    def update_texte(self):
+        """ Met a jour les noms des SD et valeurs des mots-cles """
+        #print "NODE update_texte", self.item.GetLabelText()
+        self.update_node_texte()
+        if self.state == 'expanded' :
+            for child in self.children:
+                if child.displayed != 0 : child.update_texte()
+        
+    def update_valid(self) :
+        """Cette methode a pour but de mettre a jour la validite du noeud
+           et de propager la demande de mise a jour a son parent
+        """
+        #print "NODE update_valid", self.item.GetLabelText()
+        #PN a reverifier SVP parent
+        self.update_node_valid()
+        try :
+          self.parent.update_valid()            
+        except:
+          pass
+
+    def supprime(self):
+        #print "NODE supprime",self.item.GetLabelText()
+        self.efface_node()
+        self.racine = None        
+        if not self.children : return
+        for child in self.children:
+            child.supprime()
+        self.children=None    
+
+    def build_children(self):
+        """ Construit la liste des enfants de self """        
+        #print "NODE : Construit la liste des enfants de", self.item.GetLabelText()
+        self.children = []
+        sublist = self.item._GetSubList()
+        if sublist :            
+            last = None
+            for item in sublist :                
+                child = item.itemNode(self, item, last)
+                last = child
+                self.children.append(child)
+            
+            
+    def doPasteCommande(self,objet_a_copier):
+        """
+          Réalise la copie de l'objet passé en argument qui est nécessairement
+          une commande
+        """
+        parent=self.parent
+        #child = parent.item.append_child(objet_a_copier,self.item.getObject())
+        child = self.append_brother(objet_a_copier,retour='oui')
+        #if child is None:return 0
+        return child
+
+    def doPasteMCF(self,objet_a_copier):
+        """
+           Réalise la copie de l'objet passé en argument (objet_a_copier)
+           Il s'agit forcément d'un mot clé facteur
+        """
+        child = self.append_child(objet_a_copier,pos='first',retour='oui')
+        return child
+
+
+        
+    
+if __name__=='__main__':
+    from qt import *
+    
+
+    sys.path[:0]=['..','../Aster','../Aster/Cata' ]
+
+    app = QApplication(sys.argv)
+        
+    fn      = 'azAster.comm'
+    jdcName =  os.path.basename(fn)
+    f=open(fn,'r')
+    text=f.read()
+    f.close()
+    print 'text',text
+
+    from autre_analyse_cata import analyse_catalogue
+    from Cata import cataSTA8
+    cata=cataSTA8
+    fic_cata="../../Aster/Cata/cataSTA8/cata.py"
+    cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
+    
+    
+    
+    j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
+                            cata_ord_dico=cata_ordonne )
+                            
+    j.compile()
+    if not j.cr.estvide():
+        print j.cr
+        sys.exit()
+    
+    j.exec_compile()
+    if not j.cr.estvide():
+        print j.cr
+        sys.exit()
+                            
+    from Editeur import comploader
+    comploader.charger_composants(QT)    
+    from Editeur import Objecttreeitem
+    jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
+                
+    if jdc_item:                        
+        tree = JDCTree( jdc_item, None )                
+    
+    app.setMainWidget(tree)    
+    app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+    tree.show()
+            
+    res = app.exec_loop()
+    sys.exit(res)
+    
+    
diff --git a/InterfaceQT4/compobase.py b/InterfaceQT4/compobase.py
new file mode 100644 (file)
index 0000000..a287b7d
--- /dev/null
@@ -0,0 +1,3 @@
+from Editeur import Objecttreeitem
+treeitem = Objecttreeitem.ObjectTreeItem
+objet = None
diff --git a/InterfaceQT4/compobloc.py b/InterfaceQT4/compobloc.py
new file mode 100644 (file)
index 0000000..7c8b844
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur     import Objecttreeitem
+
+import compofact
+import browser
+
+
+class Node(browser.JDCNode):
+    def getPanel(self):
+        """        
+        """    
+        from monMCFactPanel import MonMCFactPanel
+        return MonMCFactPanel(self,parent=self.editor)
+
+
+class BLOCTreeItem(compofact.FACTTreeItem):
+  itemNode=Node
+
+  def get_objet(self,name) :
+      for v in self.object.mc_liste:
+          if v.nom == name : return v
+      return None
+    
+  def iscopiable(self):
+    return 0
+
+
+import Accas
+treeitem = BLOCTreeItem
+objet = Accas.MCBLOC   
diff --git a/InterfaceQT4/compocomm.py b/InterfaceQT4/compocomm.py
new file mode 100644 (file)
index 0000000..0656c95
--- /dev/null
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+import string
+from qt import *
+
+from Editeur     import Objecttreeitem
+import browser
+import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
+    def getPanel( self ):
+        """
+        """
+        from monCommentairePanel import MonCommentairePanel
+        return MonCommentairePanel(self,parent=self.editor)
+
+    def createPopUpMenu(self):
+        typeNode.PopUpMenuNodePartiel.createPopUpMenu(self)
+        if hasattr(self.item,'uncomment'):
+           self.menu.insertItem( qApp.translate('Browser','Decommenter'), self.unCommentIt )
+
+    def update_node_label(self) :
+        """
+        """
+        debComm=self.item.GetText()
+        self.setText(1,debComm)
+
+    
+class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+    itemNode=Node    
+
+    def init(self):
+      self.setfunction = self.set_valeur
+
+    def GetIconName(self):
+      """
+      Retourne le nom de l'icône associée au noeud qui porte self,
+      dépendant de la validité de l'objet
+      NB : un commentaire est toujours valide ...
+      """
+      return "ast-white-percent"
+
+    def GetLabelText(self):
+        """ Retourne 3 valeurs :
+        - le texte à afficher dans le noeud représentant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+        """
+        return 'commentaire'   #CS_pbruno,Fonte_Commentaire,None
+
+    def get_valeur(self):
+      """
+      Retourne la valeur de l'objet Commentaire cad son texte
+      """
+      return self.object.get_valeur() or ''
+    
+    def GetText(self):
+        texte = self.object.valeur
+        texte = string.split(texte,'\n')[0]
+        if len(texte) < 25 :
+            return texte
+        else :
+            return texte[0:24]
+
+    def set_valeur(self,valeur):
+      """
+      Afecte valeur à l'objet COMMENTAIRE
+      """
+      self.object.set_valeur(valeur)
+      
+    def GetSubList(self):
+      """
+      Retourne la liste des fils de self
+      """
+      return []
+
+
+    def get_objet_commentarise(self):
+       """
+           La méthode get_objet_commentarise() de la classe compocomm.COMMTreeItem
+           surcharge la méthode get_objet_commentarise de la classe Objecttreeitem.ObjectTreeItem
+           elle a pour but d'empecher l'utilisateur final de commentariser un commentaire.
+       """
+       raise Exception( 'Impossible de commentariser un commentaire' )
+  
+import Extensions
+treeitem =COMMTreeItem
+objet = Extensions.commentaire.COMMENTAIRE    
diff --git a/InterfaceQT4/compocommandecomm.py b/InterfaceQT4/compocommandecomm.py
new file mode 100644 (file)
index 0000000..153f2b7
--- /dev/null
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+import traceback
+import string
+
+from Editeur import Objecttreeitem
+import compocomm
+
+class COMMANDE_COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+    itemNode=compocomm.Node
+
+    def init(self):
+      self.setfunction = self.set_valeur
+
+    def GetIconName(self):
+      """
+      Retourne le nom de l'icône associée au noeud qui porte self,
+      dépendant de la validité de l'objet
+      NB : une commande commentarisée est toujours valide ...
+      """
+      if self.isvalid():
+          return "ast-green-percent"
+      else:
+          return "ast-red-percent"
+
+    def GetLabelText(self):
+        """ Retourne 3 valeurs :
+        - le texte à afficher dans le noeud représentant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+        """
+        return 'commentaire'
+
+    def get_valeur(self):
+      """
+      Retourne la valeur de la commande commentarisée cad son texte
+      """
+      return self.object.get_valeur() or ''
+    
+    def GetText(self):
+        texte = self.object.valeur
+        texte = string.split(texte,'\n')[0]
+        if len(texte) < 25 :
+            return texte
+        else :
+            return texte[0:24]
+
+    def set_valeur(self,valeur):
+      """
+      Afefcte valeur à l'objet commande commentarisée
+      """
+      self.object.set_valeur(valeur)
+      
+    def GetSubList(self):
+      """
+      Retourne la liste des fils de self
+      """
+      return []
+
+    def uncomment(self):
+      """
+      Demande à l'objet commande commentarisée de se décommentariser.
+      Si l'opération s'effectue correctement, retourne l'objet commande
+      et éventuellement le nom de la sd produite, sinon lève une exception
+      """
+      try:
+        commande,nom = self.object.uncomment()
+        #self.parent.children[pos].select()
+      except Exception,e:
+        traceback.print_exc()
+        raise e
+      return commande,nom
+  
+import Accas
+treeitem =COMMANDE_COMMTreeItem
+objet = Accas.COMMANDE_COMM    
diff --git a/InterfaceQT4/compoerror.py b/InterfaceQT4/compoerror.py
new file mode 100644 (file)
index 0000000..2f1821d
--- /dev/null
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+from Tkinter import Label,Button
+
+#Modules Eficas
+from Noyau.N_OBJECT import ErrorObj
+from Editeur import Objecttreeitem
+from desError import DError
+
+class ERRORTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+
+    panel = DError
+    def GetIconName(self):
+        return "ast-red-ball"
+
+
+treeitem =ERRORTreeItem
+objet = ErrorObj
+
diff --git a/InterfaceQT4/compofact.py b/InterfaceQT4/compofact.py
new file mode 100644 (file)
index 0000000..7739e04
--- /dev/null
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+from qt import *
+from Editeur     import Objecttreeitem
+import browser
+
+
+class Node(browser.JDCNode):
+    def getPanel(self):
+        """
+        """
+        from monMCFactPanel import MonMCFactPanel
+        return MonMCFactPanel(self,parent=self.editor)
+        
+    def doPaste(self,node_selected):
+        objetACopier = self.item.get_copie_objet()
+        child=node_selected.doPasteMCF(objetACopier)
+        return child
+
+    def doPasteMCF(self,objetACopier):
+        child = self.parent.append_child(objetACopier,
+                                              pos=self.item,
+                                              retour='oui')
+        return child
+
+
+class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
+  itemNode=Node
+  
+  def IsExpandable(self):
+    return 1
+
+  def GetText(self):
+      return  ''
+
+  def GetLabelText(self):
+      """ Retourne 3 valeurs :
+        - le texte à afficher dans le noeud représentant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+      """
+      # None --> fonte et couleur par défaut
+      return self.object.getlabeltext(),None,None
+
+  def isvalid(self):
+    return self.object.isvalid()
+
+  def iscopiable(self):
+    return 1
+
+  def GetIconName(self):
+    if self.object.isvalid():
+      return "ast-green-los"
+    elif self.object.isoblig():
+      return "ast-red-los"
+    else:
+      return "ast-yel-los"
+
+  def keys(self):
+    keys=self.object.mc_dict.keys()
+    return keys
+
+  def GetSubList(self):
+      """
+         Reactualise la liste des items fils stockes dans self.sublist
+      """
+      liste=self.object.mc_liste
+      sublist=[None]*len(liste)
+      # suppression des items lies aux objets disparus
+      for item in self.sublist:
+         old_obj=item.getObject()
+         if old_obj in liste:
+            pos=liste.index(old_obj)
+            sublist[pos]=item
+         else:
+            pass # objets supprimes ignores
+      # ajout des items lies aux nouveaux objets
+      pos=0
+      for obj in liste:
+         if sublist[pos] is None:
+            # nouvel objet : on cree un nouvel item
+            def setfunction(value, object=obj):
+                object.setval(value)
+            item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+            sublist[pos]=item
+         pos=pos+1
+
+      self.sublist=sublist
+      return self.sublist
+
+  def additem(self,name,pos):
+    objet = self.object.addentite(name,pos)
+    return objet
+
+  def suppitem(self,item) :
+      """ 
+         Cette methode a pour fonction de supprimer l'item passee en argument
+         des fils de l'item FACT qui est son pere
+           - item = item du MOCLE a supprimer du MOCLE pere
+           - item.getObject() = MCSIMP ou MCBLOC 
+      """
+      itemobject=item.getObject()
+      if itemobject.isoblig() :
+         self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+         return 0
+
+      if self.object.suppentite(itemobject):
+         message = "Mot-clé " + itemobject.nom + " supprimé"
+         self.appli.affiche_infos(message)
+         return 1
+      else:
+         self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+         return 0
+
+import Accas
+objet = Accas.MCFACT
+treeitem = FACTTreeItem
diff --git a/InterfaceQT4/compoformule.py b/InterfaceQT4/compoformule.py
new file mode 100644 (file)
index 0000000..6f3bd9d
--- /dev/null
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+
+"""
+Ce module contient les classes permettant de définir les objets graphiques
+représentant un objet de type FORMULE, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+import string
+from qt import *
+import compooper
+import browser
+import typeNode
+
+
+class FormuleNode(browser.JDCNode,typeNode.PopUpMenuNode):
+        
+    def getPanel(self):
+      
+      from monFormulePanel import MonFormulePanel
+      return MonFormulePanel(self,parent=self.editor)
+        
+            
+class FORMULETreeItem(compooper.EtapeTreeItem):
+    """
+    Classe servant a définir l'item porté par le noeud de l'arbre d'EFICAS
+    qui représente la FORMULE
+    """
+    itemNode=FormuleNode
+
+    def init(self):
+      self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+#                   API de FORMULE pour l'arbre 
+# ---------------------------------------------------------------------------
+    def GetSubList(self):
+      """
+      Retourne la liste des fils de self
+      On considére que FORMULE n'a pas de fils
+      --> modification par rapport a MACRO classique
+      """
+      # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
+      # de façon traditionnelle
+      return []
+
+    def GetIconName(self):
+      """
+      Retourne le nom de l'icone à afficher dans l'arbre
+      Ce nom dépend de la validité de l'objet
+      """
+      if self.object.isactif():
+        self.object.state="modified"
+        if self.object.isvalid():
+          return "ast-green-square"
+        else:
+          return "ast-red-square"
+      else:
+        return "ast-white-text"
+
+    def GetLabelText(self):
+      """ Retourne 3 valeurs :
+      - le texte a afficher dans le noeud représentant l'item
+      - la fonte dans laquelle afficher ce texte
+      - la couleur du texte
+      """
+      if self.object.isactif():
+        # None --> fonte et couleur par défaut
+        return self.labeltext,None,None
+      else:
+        return self.labeltext,None,None
+        #return self.labeltext,fontes.standard_italique,None
+    
+# ---------------------------------------------------------------------------
+#       Méthodes permettant la modification et la lecture des attributs
+#       du paramètre = API graphique de la FORMULE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+    def get_nom(self):
+      """
+      Retourne le nom de la FORMULE
+      """
+      return self.object.get_nom()
+
+    def get_type(self):
+      """
+      Retourne le type de la valeur retournée par la FORMULE
+      """
+      return self.object.type_retourne
+
+    def get_args(self):
+      """
+      Retourne les arguments de la FORMULE
+      """
+      args=""
+      for mot in self.object.mc_liste:
+          if mot.nom == 'NOM_PARA':
+             args=mot.valeur
+             break
+      if args :
+          if args[0] == "(" and args[-1] ==")":
+             args=args[1:-1]
+          # transforme en tuple si ce n est pas déja le casa
+          try :
+             args=string.split(args,',')
+          except :
+             pass
+      return args
+
+    def get_corps(self):
+      """
+      Retourne le corps de la FORMULE
+      """
+      corps=""
+      for mot in self.object.mc_liste:
+          if mot.nom == 'VALE':
+             corps=mot.valeur
+             break
+      return corps
+
+
+    def get_liste_types_autorises(self):
+      """
+         Retourne la liste des types autorises pour les valeurs de sortie 
+         d'une FORMULE
+      """
+      return self.object.l_types_autorises
+
+    def save_formule(self,new_nom,new_typ,new_arg,new_exp):
+      """
+      Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE 
+      licite :
+          - si oui, stocke ces paramètres comme nouveaux paramètres de la 
+            FORMULE courante et retourne 1
+          - si non, laisse les paramètres anciens de la FORMULE inchangés et 
+            retourne 0
+      """
+      test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
+                                                       new_exp))
+      if test :
+          # la formule est bien correcte : on sauve les nouveaux paramètres
+          test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
+      return test,erreur
+
+# ---------------------------------------------------------------------------
+#          Accès aux méthodes de vérification de l'objet FORM_ETAPE
+# ---------------------------------------------------------------------------
+
+    def verif_nom(self,nom):
+        """
+        Lance la vérification du nom passé en argument
+        """
+        return self.object.verif_nom(nom)
+
+    def verif_arguments(self,arguments):
+        """
+        Lance la vérification des arguments passés en argument
+        """
+        return self.object.verif_arguments('('+arguments+')')
+
+    def verif_formule(self,formule):
+        """
+        Lance la vérification de FORMULE passée en argument
+        """
+        return self.object.verif_formule(formule=formule)
+
+
+    def verif_formule_python(self,formule):
+        """
+        Lance la vérification de FORMULE passée en argument
+        """
+        return self.object.verif_formule_python(formule=formule)
+
+import Accas
+treeitem =FORMULETreeItem
+objet = Accas.FORM_ETAPE
diff --git a/InterfaceQT4/compojdc.py b/InterfaceQT4/compojdc.py
new file mode 100644 (file)
index 0000000..1cd4908
--- /dev/null
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur import Objecttreeitem
+import browser
+
+
+class Node(browser.JDCNode):
+    def getPanel(self):
+        """
+        """
+        from monRacinePanel import MonRacinePanel
+        return MonRacinePanel(self,parent=self.editor)
+
+    def doPasteCommande(self,objet_a_copier):
+        """
+          Réalise la copie de l'objet passé en argument qui est nécessairement
+          une commande
+        """
+        child = self.append_child(objet_a_copier,pos='first',retour='oui')
+        return child
+
+
+class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
+  itemNode=Node
+  
+  def IsExpandable(self):
+    return 1
+
+  def GetText(self):
+      return  "    "
+
+  def GetLabelText(self):
+      # None --> fonte et couleur par défaut
+      return self.object.nom,None,None
+
+  def get_jdc(self):
+    """
+    Retourne l'objet pointé par self
+    """
+    return self.object
+  
+  def GetIconName(self):
+    if self.object.isvalid():
+      return "ast-green-square"
+    else:
+      return "ast-red-square"
+
+  def keys(self):
+      if self.object.etapes_niveaux != []:
+          return range(len(self.object.etapes_niveaux))
+      else:
+          return range(len(self.object.etapes))
+
+  def additem(self,name,pos):
+      cmd = self._object.addentite(name,pos)
+      return cmd
+
+  def suppitem(self,item) :
+    # item             = item de l'ETAPE à supprimer du JDC
+    # item.getObject() = ETAPE ou COMMENTAIRE
+    # self.object      = JDC
+
+    itemobject=item.getObject()
+    if self.object.suppentite(itemobject):
+       if itemobject.nature == "COMMENTAIRE" :
+          message = "Commentaire supprimé"
+       else :
+          message = "Commande " + itemobject.nom + " supprimée"
+       self.appli.affiche_infos(message)
+       return 1
+    else:
+       self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+       return 0
+
+  def GetSubList(self):
+    """
+       Retourne la liste des items fils de l'item jdc.
+       Cette liste est conservee et mise a jour a chaque appel
+    """
+    if self.object.etapes_niveaux != []:
+        liste = self.object.etapes_niveaux
+    else:
+        liste = self.object.etapes
+    sublist=[None]*len(liste)
+    # suppression des items lies aux objets disparus
+    for item in self.sublist:
+       old_obj=item.getObject()
+       if old_obj in liste:
+          pos=liste.index(old_obj)
+          sublist[pos]=item
+       else:
+          pass # objets supprimes ignores
+    # ajout des items lies aux nouveaux objets
+    pos=0
+    for obj in liste:
+       if sublist[pos] is None:
+          # nouvel objet : on cree un nouvel item
+          item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj)
+          sublist[pos]=item
+       pos=pos+1
+
+    self.sublist=sublist
+    return self.sublist
+
+  def get_l_noms_etapes(self):
+      """ Retourne la liste des noms des étapes de self.object"""
+      return self.object.get_l_noms_etapes()
+
+  def get_liste_cmd(self):
+      listeCmd = self.object.niveau.definition.get_liste_cmd()
+      return listeCmd
+
+import Accas
+treeitem =JDCTreeItem
+objet = Accas.JDC    
diff --git a/InterfaceQT4/compomacro.py b/InterfaceQT4/compomacro.py
new file mode 100644 (file)
index 0000000..74e2f59
--- /dev/null
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+
+# Modules Python
+import os,sys,string
+import types
+import traceback
+from qt import *
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import compooper
+import browser
+import typeNode
+
+
+class MACRONode(browser.JDCNode,typeNode.PopUpMenuNode):         
+    def getPanel(self):
+      from   monMacroPanel import MonMacroPanel
+      return MonMacroPanel (self,parent=self.editor )
+    
+    def createPopUpMenu(self):
+      typeNode.PopUpMenuNode.createPopUpMenu(self)
+        
+    
+class MACROTreeItem(compooper.EtapeTreeItem):
+#  """ Cette classe hérite d'une grande partie des comportements
+#      de la classe compooper.EtapeTreeItem
+#  """
+    itemNode=MACRONode
+
+# ------------------------------------
+#  Classes necessaires à INCLUDE
+# ------------------------------------
+
+class INCLUDETreeItemBase(MACROTreeItem):
+
+    def __init__(self,appli, labeltext, object, setfunction):    
+       MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
+
+    def iscopiable(self):
+       return 0
+
+
+class INCLUDENode(browser.JDCNode,typeNode.PopUpMenuNode):    
+    def getPanel(self):
+      from   monIncludePanel import MonIncludePanel
+      return MonIncludePanel (self,parent=self.editor )
+
+    def createPopUpMenu(self):
+      typeNode.PopUpMenuNode.createPopUpMenu(self)
+      self.menu.insertItem( qApp.translate('Browser','Edit'), self.makeEdit )
+      
+    def makeEdit(self):    #,appli,node
+        if self.item.object.text_converted == 0:
+                # Le texte du fichier inclus n'a pas pu etre converti par le module convert
+                msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+                msg=msg+self.item.object.text_error
+                return
+    
+        if not hasattr(self.item.object,"jdc_aux") or self.item.object.jdc_aux is None:
+               #L'include n'est pas initialise
+               self.item.object.build_include(None,"")
+    
+        # On cree un nouvel onglet dans le bureau
+        self.editor.vm.displayJDC( self.item.object.jdc_aux , self.item.object.jdc_aux.nom )
+     
+
+class INCLUDETreeItem(INCLUDETreeItemBase):
+    itemNode=INCLUDENode
+    
+
+# ------------------------------------
+#  Classes necessaires à POURSUITE
+# ------------------------------------
+    
+class POURSUITENode(browser.JDCNode, typeNode.PopUpMenuNode):    
+    def getPanel(self):
+      from   monPoursuitePanel import MonPoursuitePanel
+      return MonPoursuitePanel (self,parent=self.editor )
+
+    def createPopUpMenu(self):
+      typeNode.PopUpMenuNode.createPopUpMenu(self)
+      self.menu.insertItem( qApp.translate('Browser','Edit'), self.makeEdit )
+
+    def makeEdit(self):    #,appli,node
+        if self.item.object.text_converted == 0:
+                msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+                msg=msg+self.item.object.text_error
+                return
+    
+        if not hasattr(self.item.object,"jdc_aux") or self.item.object.jdc_aux is None:
+            text="""DEBUT()
+                    FIN()"""
+            self.object.build_poursuite(None,text)
+    
+        # On cree un nouvel onglet dans le bureau
+        self.editor.vm.displayJDC( self.item.object.jdc_aux , self.item.object.jdc_aux.nom)
+    
+class POURSUITETreeItem(INCLUDETreeItemBase):
+  itemNode=POURSUITENode
+
+
+# ----------------------------------------
+#  Classes necessaires à INCLUDE MATERIAU
+# ----------------------------------------
+    
+
+class MATERIAUNode(MACRONode):
+
+    def getPanel(self):
+      from   monMacroPanel import MonMacroPanel
+      return MonMacroPanel (self,parent=self.editor )
+
+    def createPopUpMenu(self):
+      typeNode.PopUpMenuNode.createPopUpMenu(self)
+      self.menu.insertItem( qApp.translate('Browser','View'), self.makeView )
+
+    def makeView(self) :
+      if hasattr(self.item.object,'fichier_ini') and self.item.object.fichier_ini==None:
+         QMessageBox.information( self, "Include vide","L'include doit etre correctement initialisé pour etre visualisé")
+         return
+      f = open(self.item.object.fichier_ini, "rb")
+      texte = f.read()
+      f.close()
+      from desVisu import DVisu
+      monVisu=DVisu(parent=self.editor,fl=Qt.WType_Dialog)
+      monVisu.TB.setText(texte)
+      monVisu.show()
+
+class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
+    itemNode=MATERIAUNode
+
+# ------------------------------------
+# TreeItem
+# ------------------------------------
+    
+
+def treeitem(appli, labeltext, object, setfunction=None):
+   """ Factory qui retourne l'item adapte au type de macro : 
+       INCLUDE, POURSUITE, MACRO
+   """
+   if object.nom == "INCLUDE_MATERIAU":
+      return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
+   elif object.nom == "INCLUDE":
+      return INCLUDETreeItem(appli, labeltext, object, setfunction)
+   elif object.nom == "POURSUITE":
+      return POURSUITETreeItem(appli, labeltext, object, setfunction)
+   else:
+      return MACROTreeItem(appli, labeltext, object, setfunction)
+
+import Accas
+objet=Accas.MACRO_ETAPE
+    
+
diff --git a/InterfaceQT4/compomclist.py b/InterfaceQT4/compomclist.py
new file mode 100644 (file)
index 0000000..65bdad0
--- /dev/null
@@ -0,0 +1,205 @@
+# -*- coding: utf-8 -*-
+
+import types
+import traceback
+
+from qt import *
+
+import compofact
+import browser
+from Editeur     import Objecttreeitem
+from Noyau.N_OBJECT import ErrorObj
+#import compoerror
+
+
+class Node(browser.JDCNode):
+    def getPanel(self):
+        """        
+        """    
+        if self.item.isMCList() :
+           if self.item.ajout_possible():
+              from monMCListAjoutPanel import MonMCListAjoutPanel
+              return MonMCListAjoutPanel(self,parent=self.editor)
+           else :
+              print "MCList"
+        elif self.item.isMCFact() :
+           from monMCFactPanel import MonMCFactPanel
+           return MonMCFactPanel(self,parent=self.editor)
+        else :
+           print "MCList"
+
+    def doPaste(self,node_selected):
+        objet_a_copier = self.item.get_copie_objet()
+        child=node_selected.doPasteMCF(objet_a_copier)
+        #print "doPaste",child
+        return child
+
+    def doPasteMCF(self,objet_a_copier):
+        child=None
+        # le noeud courant est une MCList
+        if self.item.isMCList() :
+          child = self.append_child(objet_a_copier,pos='first',retour='oui')
+
+        # le noeud courant est un MCFACT
+        elif self.item.isMCFact() :
+          # le noeud selectionne est un MCFACT dans une MCList
+          if self.parent.item.isMCList():
+             child = self.parent.append_child(objet_a_copier,
+                                              pos=self.item,
+                                              retour='oui')
+
+          # le noeud MCFACT selectionne n'est pas dans une MCList
+          else:
+             child = self.parent.append_child(objet_a_copier,retour='oui')
+
+        else:
+          QMessageBox.information( self, "Copie impossible",
+                   "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")          
+          self.editor.affiche_infos("Copie refusée")
+
+        return child
+
+class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
+    """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
+        du noyau Accas instances de la classe MCLIST.
+        Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
+        noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
+        Cette classe délègue les appels de méthode et les accès
+        aux attributs à l'objet du noyau soit manuellement soit 
+        automatiquement (voir classe Delegate et attribut object).
+    """
+    itemNode=Node
+
+    def init(self):
+        # Si l'objet Accas (MCList) a moins d'un mot cle facteur
+        # on utilise directement ce mot cle facteur comme delegue
+        self.updateDelegate()
+
+    def updateDelegate(self):
+        if len(self._object) > 1:
+           self.setdelegate(self._object)
+        else:
+           self.setdelegate(self._object.data[0])
+
+    def panel(self,jdcdisplay,pane,node):
+        """ Retourne une instance de l'objet panneau associe a l'item (self)
+            Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
+            FACTPanel.
+            Si la liste est plus longue on utilise le panneau MCLISTPanel.
+        """
+        if len(self._object) > 1:
+           return MCLISTPanel(jdcdisplay,pane,node)
+        elif isinstance(self._object.data[0],ErrorObj):
+           return compoerror.ERRORPanel(jdcdisplay,pane,node)
+        else:
+           return compofact.FACTPanel(jdcdisplay,pane,node)
+
+    def IsExpandable(self):
+        if len(self._object) > 1:
+           return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
+        else:
+           return compofact.FACTTreeItem.IsExpandable(self)
+
+    def GetSubList(self):
+        self.updateDelegate()
+        if len(self._object) <= 1:
+           self._object.data[0].alt_parent=self._object
+           return compofact.FACTTreeItem.GetSubList(self)
+
+        liste=self._object.data
+        sublist=[None]*len(liste)
+        # suppression des items lies aux objets disparus
+        for item in self.sublist:
+           old_obj=item.getObject()
+           if old_obj in liste:
+              pos=liste.index(old_obj)
+              sublist[pos]=item
+           else:
+              pass # objets supprimes ignores
+        # ajout des items lies aux nouveaux objets
+        pos=0
+        for obj in liste:
+           if sublist[pos] is None:
+              # nouvel objet : on cree un nouvel item
+              def setfunction(value, object=obj):
+                  object=value
+              item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+              sublist[pos]=item
+              #Attention : on ajoute une information supplementaire pour l'actualisation de 
+              # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
+              # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
+              # informations de validite. alt_parent permet de remedier a ce defaut.
+              obj.alt_parent=self._object
+           pos=pos+1
+
+        self.sublist=sublist
+        return self.sublist
+
+    def GetIconName(self):
+        if self._object.isvalid():
+            return "ast-green-los"
+        elif self._object.isoblig():
+            return "ast-red-los"
+        else:
+            return "ast-yel-los"
+
+    def get_docu(self):
+        """ Retourne la clef de doc de l'objet pointé par self """
+        return self.object.get_docu()    
+
+    def iscopiable(self):
+        if len(self._object) > 1:
+           return Objecttreeitem.SequenceTreeItem.iscopiable(self)
+        else:
+           return compofact.FACTTreeItem.iscopiable(self)
+
+    def isMCFact(self):
+        """
+        Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
+        """
+        return len(self._object) <= 1
+
+    def isMCList(self):
+        """
+        Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
+        """
+        return len(self._object) > 1
+        
+    def get_copie_objet(self):
+        return self._object.data[0].copy()
+
+    def additem(self,obj,pos):
+        #print "compomclist.additem",obj,pos
+        if len(self._object) <= 1:
+           return compofact.FACTTreeItem.additem(self,obj,pos)
+
+        o= self.object.addentite(obj,pos)
+        return o
+
+    def suppitem(self,item):
+        """
+        Retire un objet MCFACT de la MCList (self.object) 
+        """
+        #print "compomclist.suppitem",item
+        obj=item.getObject()
+        if len(self._object) <= 1:
+           return compofact.FACTTreeItem.suppitem(self,item)
+
+        if self.object.suppentite(obj):
+           if len(self._object) == 1: self.updateDelegate()     
+           message = "Mot-clef " + obj.nom + " supprimé"
+           self.appli.affiche_infos(message)
+           return 1
+        else:
+           self.appli.affiche_infos('Impossible de supprimer ce mot-clef')
+           return 0
+
+            
+import Accas
+objet = Accas.MCList    
+
+def treeitem(appli,labeltext,object,setfunction):
+  """ Factory qui produit un objet treeitem adapte a un objet 
+      Accas.MCList (attribut objet de ce module)
+  """
+  return MCListTreeItem(appli,labeltext,object,setfunction)
diff --git a/InterfaceQT4/componiveau.py b/InterfaceQT4/componiveau.py
new file mode 100644 (file)
index 0000000..866d585
--- /dev/null
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur     import Objecttreeitem
+from Extensions  import commentaire 
+import browser
+
+class Node(browser.JDCNode):
+      pass
+
+class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
+  itemNode=Node
+
+  def isactif(self):
+      return self.object.isactif()
+    
+  def IsExpandable(self):
+      return 1
+    
+  def GetLabelText(self):
+      """ Retourne 3 valeurs :
+        - le texte à afficher dans le noeud représentant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+      """
+      if self.isactif():
+          fonte = Fonte_Niveau
+      else :
+          fonte = Fonte_Niveau_inactif
+      return self.labeltext,fonte,'#00008b'
+    
+  def GetIconName(self):
+      if self.isactif():
+          if self.object.isvalid():
+              return "ast-green-text"
+          else:
+              return "ast-red-text"
+      else:
+          return "ast-white-text"
+  
+  def keys(self):
+      if self.object.etapes_niveaux != []:
+          return range(len(self.object.etapes_niveaux))
+      else:
+          return range(len(self.object.etapes))
+
+  def GetSubList(self):
+    sublist=[]
+    for key in self.keys():
+      if self.object.etapes_niveaux != []:
+          liste = self.object.etapes_niveaux
+      else:
+          liste = self.object.etapes
+      try:
+        value = liste[key]
+      except KeyError:
+        continue
+      def setfunction(value, key=key, object=liste):
+        object[key] = value
+      item =self.make_objecttreeitem(self.appli,value.ident() + " : ", value, setfunction)
+      sublist.append(item)
+    return sublist
+
+  def additem(self,name,pos):
+      if isinstance(name,Objecttreeitem.TreeItem) :
+          cmd=self.object.addentite(name.getObject(),pos)
+      else :
+          cmd = self.object.addentite(name,pos)
+      item = self.make_objecttreeitem(self.appli,cmd.nom + " : ", cmd)
+      return item
+
+  def suppitem(self,item) :
+    # item = item de l'ETAPE à supprimer du JDC
+    # item.getObject() = ETAPE ou COMMENTAIRE
+    # self.object = JDC
+    itemobject=item.getObject()
+    if self.object.suppentite(itemobject):
+       if isinstance(item.object,commentaire.COMMENTAIRE):
+          message = "Commentaire supprimé"
+       else :
+          message = "Commande " + itemobject.nom + " supprimée"
+       self.appli.affiche_infos(message)
+       return 1
+    else:
+       self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+       return 0
+
+  def GetText(self):
+      return ''
+
+    
+import Accas
+treeitem = NIVEAUTreeItem
+objet = Accas.ETAPE_NIVEAU    
diff --git a/InterfaceQT4/componuplet.py b/InterfaceQT4/componuplet.py
new file mode 100644 (file)
index 0000000..649ce0e
--- /dev/null
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+import types
+from repr import Repr
+from copy import copy,deepcopy
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+
+myrepr = Repr()
+myrepr.maxstring = 100
+myrepr.maxother = 100
+
+# Si Expandable vaut 1 les éléments du nuplet apparaissent dans l'arbre
+# Si Expandable vaut 0 les éléments n'apparaissent pas
+Expandable=1
+
+
+import browser
+from qt import *
+
+class Node(browser.JDCNode): pass
+##    def getPanel(self):
+##        """        
+##        """    
+##        return NUPLETPanel( self, self.editor )
+    
+
+class NUPLETTreeItem(Objecttreeitem.ObjectTreeItem):
+##  panel=NUPLETPanel
+  itemNode=Node
+
+  def IsExpandable(self):
+    return Expandable
+
+  def GetText(self):
+      return  ''
+
+  def isvalid(self):
+    return self.object.isvalid()
+
+  def GetIconName(self):
+    if self.object.isvalid():
+      return "ast-green-los"
+    elif self.object.isoblig():
+      return "ast-red-los"
+    else:
+      return "ast-yel-los"
+
+  def GetSubList(self):
+    if not Expandable:return []
+    sublist=[]
+    for obj in self.object.mc_liste:
+      item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, None)    
+      sublist.append(item)
+    return sublist
+
+  def additem(self,name,pos):
+    raise "NUPLET"
+
+  def suppitem(self,item) :
+    raise "NUPLET"
+
+import Accas
+treeitem=NUPLETTreeItem
+objet=Accas.MCNUPLET
diff --git a/InterfaceQT4/compooper.py b/InterfaceQT4/compooper.py
new file mode 100644 (file)
index 0000000..dd89378
--- /dev/null
@@ -0,0 +1,260 @@
+# -*- coding: utf-8 -*-
+
+import traceback
+import string
+
+from qt import *
+
+from Editeur     import Objecttreeitem
+import browser
+import typeNode
+
+class Node(browser.JDCNode, typeNode.PopUpMenuNode):
+    def getPanel( self ):
+        """
+        """
+        from monCommandePanel import MonCommandePanel
+        return MonCommandePanel(self,parent=self.editor)
+
+    def createPopUpMenu(self):
+        typeNode.PopUpMenuNode.createPopUpMenu(self)
+        if ("AFFE_CARA_ELEM" in self.item.get_genealogie()) and self.editor.salome: 
+           self.menu.insertItem( 'View3D', self.view3D )
+
+    def doPaste(self,node_selected):
+        """
+            Déclenche la copie de l'objet item avec pour cible
+            l'objet passé en argument : node_selected
+        """
+        objet_a_copier = self.item.get_copie_objet()
+        child=node_selected.doPasteCommande(objet_a_copier)
+        return child
+
+    def doPasteCommande(self,objet_a_copier):
+        """
+          Réalise la copie de l'objet passé en argument qui est nécessairement
+          une commande
+        """
+        parent=self.parent
+        #child = parent.item.append_child(objet_a_copier,self.item.getObject())
+        child = self.append_brother(objet_a_copier,retour='oui')
+        #if child is None:return 0
+        return child
+
+    def doPasteMCF(self,objet_a_copier):
+        """
+           Réalise la copie de l'objet passé en argument (objet_a_copier)
+           Il s'agit forcément d'un mot clé facteur
+        """
+        child = self.append_child(objet_a_copier,pos='first',retour='oui')
+        return child
+
+    def view3D(self) :
+        import TroisDPal
+        troisD=TroisDPal.TroisDPilote(self.item,self.editor.parent.appliEficas)
+        troisD.envoievisu()
+
+
+class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
+  """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
+      Accas. Elle leur permet d'etre affichés comme des noeuds
+      d'un arbre graphique.
+      Cette classe a entre autres deux attributs importants :
+        - _object qui est un pointeur vers l'objet du noyau
+        - object qui pointe vers l'objet auquel sont délégués les
+          appels de méthode et les acces aux attributs
+      Dans le cas d'une ETAPE, _object et object pointent vers le 
+      meme objet.
+  """
+  itemNode=Node
+  
+  def IsExpandable(self):
+      return 1
+
+  def GetIconName(self):
+      """
+      Retourne le nom de l'icone a afficher dans l'arbre
+      Ce nom dépend de la validité de l'objet
+      """
+      if not self.object.isactif():
+         return "ast-white-square"
+      elif self.object.isvalid():
+         return "ast-green-square"
+      else:
+         valid=self.valid_child()
+         valid=valid * self.valid_regles("non")
+         if self.reste_val != {}:
+            valid=0
+         if valid==0  :
+            return "ast-red-square"
+         else :
+            try :
+            # on traite ici le cas d include materiau
+            #  print self.object.definition.nom 
+              if  self.object.fichier_ini != self.object.nom_mater :
+                  return "ast-red-square"
+            except :
+              pass
+            return "ast-yellow-square"
+
+  def GetLabelText(self):
+      """ Retourne 3 valeurs :
+      - le texte a afficher dans le noeud représentant l'item
+      - la fonte dans laquelle afficher ce texte
+      - la couleur du texte
+      """
+      if self.object.isactif():
+        # None --> fonte et couleur par défaut
+        return self.labeltext,None,None
+      else:
+        return self.labeltext, None, None #CS_pbruno todo
+      
+  def get_objet(self,name) :
+      for v in self.object.mc_liste:
+          if v.nom == name : return v
+      return None
+      
+  def get_type_sd_prod(self):
+      """
+         Retourne le nom du type du concept résultat de l'étape
+      """
+      sd_prod=self.object.get_type_produit()
+      if sd_prod:
+         return sd_prod.__name__
+      else:
+         return ""
+
+  def additem(self,name,pos):      
+      mcent = self._object.addentite(name,pos)
+      return mcent
+      
+
+  def suppitem(self,item) :
+      # item : item du MOCLE de l'ETAPE a supprimer
+      # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList 
+      itemobject=item.getObject()
+      if itemobject.isoblig() :
+          self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+          return 0
+      if self.object.suppentite(itemobject):
+          message = "Mot-clé " + itemobject.nom + " supprimé"
+          self.appli.affiche_infos(message)
+          return 1
+      else :
+          self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+          return 0
+
+  def GetText(self):
+      try:
+          return self.object.get_sdname()
+      except:
+          return ''
+
+  def keys(self):
+      keys=self.object.mc_dict.keys()
+      return keys
+
+  def GetSubList(self):
+      """
+         Reactualise la liste des items fils stockes dans self.sublist
+      """
+      if self.isactif():
+         liste=self.object.mc_liste
+      else:
+         liste=[]
+
+      sublist=[None]*len(liste)
+      # suppression des items lies aux objets disparus
+      for item in self.sublist:
+         old_obj=item.getObject()
+         if old_obj in liste:
+            pos=liste.index(old_obj)
+            sublist[pos]=item
+         else:
+            pass # objets supprimes ignores
+
+      # ajout des items lies aux nouveaux objets
+      pos=0
+      for obj in liste:
+         if sublist[pos] is None:
+            # nouvel objet : on cree un nouvel item
+            def setfunction(value, object=obj):
+                object.setval(value)
+            item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+            sublist[pos]=item
+         pos=pos+1
+
+      self.sublist=sublist
+      return self.sublist
+
+  def isvalid(self):
+      return self.object.isvalid()
+
+  def iscopiable(self):
+      """
+      Retourne 1 si l'objet est copiable, 0 sinon
+      """
+      return 1
+
+  def update(self,item):
+      if item.sd and item.sd.nom:
+         self.nomme_sd(item.sd.nom)
+
+  def nomme_sd(self,nom):
+      """ Lance la méthode de nommage de la SD """
+      oldnom=""
+      if self.object.sd != None :
+         oldnom=self.object.sd.nom
+      test,mess= self.object.nomme_sd(nom)
+      if test:self.object.parent.reset_context()
+      if (test and self.appli.dict_reels.has_key(oldnom) ):
+              self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
+      return test,mess
+
+  def is_reentrant(self):
+      return self.object.is_reentrant()
+    
+  def get_noms_sd_oper_reentrant(self):
+      return self.object.get_noms_sd_oper_reentrant()
+
+  def get_objet_commentarise(self):
+      """
+          Cette méthode retourne un objet commentarisé
+          représentatif de self.object
+      """
+      # Format de fichier utilisé
+      format=self.appli.format_fichier
+      return self.object.get_objet_commentarise(format)
+
+  def get_objet_commentarise_BAK(self):
+      """
+          Cette méthode retourne un objet commentarisé
+          représentatif de self.object
+      """
+      import generator,string,Accas
+      # Format de fichier utilisé
+      format=self.appli.format_fichier
+      g=generator.plugins[format]()
+      texte_commande = g.gener(self.object,format='beautifie')
+      # Il faut enlever la premiere ligne vide de texte_commande que 
+      # rajoute le generator
+      rebut,texte_commande = string.split(texte_commande,'\n',1)
+      # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
+      # enregistré dans le jdc
+      commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
+                                             parent=self.object.parent)
+      commande_comment.niveau = self.object.niveau
+      commande_comment.jdc = commande_comment.parent = self.object.jdc
+
+      pos=self.object.parent.etapes.index(self.object)
+      parent=self.object.parent
+      self.object.parent.suppentite(self.object)
+      parent.addentite(commande_comment,pos)
+
+      return commande_comment
+
+
+import Accas
+treeitem = EtapeTreeItem
+objet = Accas.ETAPE    
+
diff --git a/InterfaceQT4/compoparam.py b/InterfaceQT4/compoparam.py
new file mode 100644 (file)
index 0000000..4c3fb26
--- /dev/null
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+"""
+   Ce module contient les classes permettant de définir les objets graphiques
+   représentant un objet de type PARAMETRE, cad le panneau et l'item de l'arbre
+   d'EFICAS
+"""
+
+# import modules Python
+import string
+from qt import *
+
+# import modules EFICAS
+from Editeur     import Objecttreeitem
+import browser
+import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel): 
+    def getPanel(self):
+        """        
+        """    
+        from monParamPanel  import MonParamPanel
+        return MonParamPanel(self, parent=self.editor )
+
+    def createPopUpMenu(self):
+        typeNode.PopUpMenuNodePartiel.createPopUpMenu(self)
+
+
+
+class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
+    """
+    Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+    qui représente le PARAMETRE
+    """
+    itemNode=Node
+
+    def init(self):      
+      self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+#                   API du PARAMETRE pour l'arbre 
+# ---------------------------------------------------------------------------
+
+    def GetIconName(self):
+      """
+      Retourne le nom de l'icone associée au noeud qui porte self,
+      dépendant de la validité de l'objet
+      NB : un PARAMETRE est toujours valide ...
+      """
+      if self.isactif():
+          if self.isvalid():
+              return "ast-green-square"
+          else:
+              return "ast-red-square"
+      else:
+          return "ast-white-square"
+
+    def GetLabelText(self):
+        """ Retourne 3 valeurs :
+        - le texte à afficher dans le noeud représentant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+        """
+        return 'PARAMETRE',None,None 
+
+    def GetText(self):
+      """
+      Retourne le texte à afficher aprês le nom de la commande (ici apres 'paramêtre')
+      Ce texte est tronqué à 25 caractêres
+      """
+      texte=self.object.nom+"="+str(self.object.valeur)
+      texte = string.split(texte,'\n')[0]
+      if len(texte) < 25 :
+          return texte
+      else :
+          return texte[0:24]+'...'
+
+    def GetSubList(self):
+      """
+      Retourne la liste des fils de self
+      """
+      return []
+    
+# ---------------------------------------------------------------------------
+#       Méthodes permettant la modification et la lecture des attributs
+#       du paramêtre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+    def get_valeur(self):
+      """
+      Retourne la valeur de l'objet PARAMETRE cad son texte
+      """
+      if self.object.valeur is None: return ''
+      else: return self.object.valeur 
+
+    def get_nom(self):
+      """
+      Retourne le nom du paramêtre
+      """
+      return self.object.nom
+
+    def set_valeur(self,new_valeur):
+      """
+      Affecte valeur à l'objet PARAMETRE
+      """
+      self.object.set_valeur(new_valeur)
+
+    def set_nom(self,new_nom):
+      """
+      Renomme le paramêtre
+      """
+      self.object.set_nom(new_nom)
+      #self.object.set_attribut('nom',new_nom)
+
+    def get_fr(self):
+      """
+      Retourne le fr associé au paramêtre, cad la bulle d'aide pour EFICAS
+      """
+      return "Définition d'un paramêtre"
+    
+import Extensions.parametre
+treeitem =PARAMTreeItem
+objet = Extensions.parametre.PARAMETRE
diff --git a/InterfaceQT4/compoparameval.py b/InterfaceQT4/compoparameval.py
new file mode 100644 (file)
index 0000000..ff0d1b9
--- /dev/null
@@ -0,0 +1,153 @@
+# -*- coding: utf-8 -*-
+
+"""
+Ce module contient les classes permettant de définir les objets graphiques
+représentant un objet de type PARAMETRE_EVAL, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+# import modules Python
+import string
+
+# import modules EFICAS
+
+import Objecttreeitem
+
+
+import browser
+from qt import *
+
+class Node(browser.JDCNode): pass
+##    def getPanel(self):
+##        """        
+##        """    
+##        return PARAM_EVALPanel( self, self.editor )
+
+
+class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
+    """
+    Classe servant a définir l'item porté par le noeud de l'arbre d'EFICAS
+    qui représente le PARAMETRE
+    """
+    itemNode=Node
+##    panel = PARAM_EVALPanel
+
+    def init(self):
+      self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+#                   API du PARAMETRE pour l'arbre 
+# ---------------------------------------------------------------------------
+
+    def GetIconName(self):
+      """
+      Retourne le nom de l'icone associée au noeud qui porte self,
+      dépendant de la validité de l'objet
+      NB : un PARAMETRE est toujours valide ...
+      """
+      if self.isactif():
+          if self.isvalid():
+              return "ast-green-square"
+          else:
+              return "ast-red-square"
+      else:
+          return "ast-white-square"
+
+    def GetLabelText(self):
+        """ Retourne 3 valeurs :
+        - le texte a afficher dans le noeud représentant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+        """
+        return 'EVAL',Fonte_PARAMETRE,None
+
+    def GetText(self):
+      """
+      Retourne le texte a afficher apres le nom de la commande (ici apres 'parametre')
+      Ce texte est tronqué a 25 caracteres
+      """
+      texte = repr(self.object)
+      texte = string.split(texte,'\n')[0]
+      if len(texte) < 25 :
+          return texte
+      else :
+          return texte[0:24]+'...'
+
+    def GetSubList(self):
+      """
+      Retourne la liste des fils de self
+      """
+      return []
+    
+# ---------------------------------------------------------------------------
+#       Méthodes permettant la modification et la lecture des attributs
+#       du parametre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+    def isvalid(self):
+      """
+      Indique si l'objet pointé par self est valide
+      """
+      return self.object.isvalid()
+    
+    def get_valeur(self):
+      """
+      Retourne une chaine représentant la valeur de l'objet PARAMETRE
+      cad de l'objet class_eval.EVAL
+      """
+      return self.object.get_valeur() or ''
+
+    def get_nom(self):
+      """
+      Retourne le nom du parametre
+      """
+      return self.object.get_nom()
+
+    def set_valeur(self,new_valeur):
+      """
+      Affecte new_valeur a l'objet PARAMETRE_EVAL
+      """
+      # on construit le texte de la nouvelle valeur
+      new_valeur = 'EVAL("""'+new_valeur+'""")'
+      # on affecte la nouvelle valeur a self.object
+      self.object.set_valeur(new_valeur)
+
+    def set_nom(self,new_nom):
+      """
+      Renomme le parametre
+      """
+      self.object.set_nom(new_nom)
+
+    def get_fr(self):
+      """
+      Retourne le fr associé au parametre, cad la bulle d'aide pour EFICAS
+      """
+      return "Définition d'un parametre de type EVAL"
+
+    def verif_nom(self,nom):
+      """
+      Lance la vérification de validité du nom passé en argument
+      """
+      return self.object.verif_nom(nom = nom)
+
+    def verif_eval(self,valeur):
+      """
+      Lance la vérification de validité de l'expression EVAL passée en argument
+      """
+      return self.object.verif_eval(exp_eval = valeur)
+
+    def save_parametre_eval(self,new_nom,new_val):
+      """
+      Vérifie si (new_nom,new_val) définit bien un EVAL licite :
+          - si oui, stocke ces parametres comme nouveaux parametres de l'EVAL courant et retourne 1
+          - si non, laisse les parametres anciens de EVAL inchangés et retourne 0
+      """
+      test,erreur = self.object.verif_parametre_eval(param=(new_nom,new_val))
+      if test :
+          # la formule est bien correcte : on sauve les nouveaux parametres
+          self.object.update(param=(new_nom,new_val))
+      return test,erreur
+      
+import Extensions.parametre_eval
+treeitem =PARAM_EVALTreeItem
+objet = Extensions.parametre_eval.PARAMETRE_EVAL
diff --git a/InterfaceQT4/compoproc.py b/InterfaceQT4/compoproc.py
new file mode 100644 (file)
index 0000000..ffbfdf0
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+from Editeur     import Objecttreeitem
+import compooper
+import browser
+import typeNode
+
+from qt import *
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNode):
+    def getPanel(self):
+        from monMacroPanel import MonMacroPanel
+        return MonMacroPanel(self,parent=self.editor)
+
+    def createPopUpMenu(self):
+        typeNode.PopUpMenuNode.createPopUpMenu(self)
+
+
+class ProcEtapeTreeItem(compooper.EtapeTreeItem):
+    itemNode=Node
+  
+import Accas
+treeitem = ProcEtapeTreeItem
+objet = Accas.PROC_ETAPE    
+
diff --git a/InterfaceQT4/composimp.py b/InterfaceQT4/composimp.py
new file mode 100644 (file)
index 0000000..22bc5b7
--- /dev/null
@@ -0,0 +1,605 @@
+# -*- coding: utf-8 -*-
+# Modules Python
+import string,types,os
+
+from copy import copy,deepcopy
+import traceback
+from qt import *
+
+# Modules Eficas
+import Objecttreeitem
+import browser
+from Noyau.N_CR   import justify_text
+    
+import prefs
+
+class Node(browser.JDCNode):    
+    def getPanel(self):
+        """        
+        """
+        klass = None 
+        
+        # Attention l ordre des if est important        
+        if self.item.wait_shell():
+            # l'objet attend un shell
+            # a priori jamais
+            print "Pb : Panneau Shell attendu"
+            print "Pb : Prevenir la maintenance"
+            klass = None #CS_pbruno todo
+            return None
+
+        # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
+        if self.item.has_into():
+            if self.item.is_list() :
+                from monPlusieursIntoPanel import MonPlusieursIntoPanel
+                klass = MonPlusieursIntoPanel
+            else:
+                from monUniqueIntoPanel import MonUniqueIntoPanel
+                klass = MonUniqueIntoPanel
+
+        # l'objet prend une ou des valeurs a priori quelconques
+        else:
+            # on attend une liste de valeurs 
+            if self.item.is_list() :
+                # on attend une liste de SD
+                if self.item.wait_assd():
+                    from monPlusieursASSDPanel import MonPlusieursASSDPanel 
+                    klass = MonPlusieursASSDPanel
+                else:
+                    # on attend une liste de valeurs de types debase (entiers, réels,...)
+                    from monPlusieursBasePanel import MonPlusieursBasePanel 
+                    klass = MonPlusieursBasePanel
+            # on n'attend qu'une seule valeur 
+            else:
+                # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
+                if self.item.wait_co():
+                    if len(self.item.get_sd_avant_du_bon_type()) != 0 :
+                       from monUniqueSDCOIntoPanel import MonUniqueSDCOIntoPanel
+                       klass = MonUniqueSDCOIntoPanel
+                    else :
+                       from monUniqueSDCOPanel import MonUniqueSDCOPanel
+                       klass = MonUniqueSDCOPanel
+
+                # on attend une SD
+                elif self.item.wait_assd():
+                    if 'R' in self.item.GetType():
+                        from monUniqueASSDPanel import MonUniqueASSDReelPanel
+                        klass = MonUniqueASSDReelPanel
+                    else :
+                        from monUniqueASSDPanel import MonUniqueASSDPanel
+                        klass = MonUniqueASSDPanel
+
+                # on attend une valeur d'un type de base (entier,reel,...)
+                else:
+                        # on attend un complexe
+                     if self.item.wait_complex():
+                        from monUniqueCompPanel import MonUniqueCompPanel
+                        klass = MonUniqueCompPanel
+                     else:
+                        # on attend un entier, un réel ou une string
+                        from monUniqueBasePanel import MonUniqueBasePanel
+                        klass = MonUniqueBasePanel
+                        
+        # cas particulier des fonctions
+        genea = self.item.get_genealogie()
+        if "VALE" in genea or "VALE_C" in genea:
+            if "DEFI_FONCTION" in genea :
+                from monFonctionPanel import MonFonctionPanel
+                klass = MonFonctionPanel
+
+        if not klass:
+            return None
+        return klass( self, self.editor )
+        
+        
+    
+class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+  itemNode=Node
+
+  def init(self) :
+      self.expandable = 0
+  
+
+  #-----------------------------------------------
+  #
+  # Methodes liees aux informations sur le Panel
+  # ou au mot-clef simple
+  #
+  #-----------------------------------------------
+  # is_list
+  # get_into                a priori inutile --> commentee
+  # has_into
+  # wait_into                a priori inutile --> commentee
+  # GetMinMax
+  # GetMultiplicite
+  # GetIntervalle
+  # GetListeValeurs
+  # get_liste_possible
+
+  def is_list(self):
+      """
+          Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
+          ou s'il n'en attend pas (valeur de retour 0)
+
+          Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+          Dans le cas sans validateur, l'information est donnée par l'attribut max
+          de la definition du mot cle.
+          Dans le cas avec validateur, il faut combiner l'information précédente avec
+          celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
+          l'operateur ET pour effectuer cette combinaison (AndVal).
+      """
+      is_a_list=0
+      min,max = self.GetMinMax()
+      assert (min <= max)
+      if max > 1 :
+                is_a_list=1
+      # Dans le cas avec validateurs, pour que le mot cle soit considéré
+      # comme acceptant une liste, il faut que max soit supérieur a 1
+      # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
+      # on retournera 0 (n'attend pas de liste)
+      if self.definition.validators :
+         is_a_list= self.definition.validators.is_list() * is_a_list
+      return is_a_list 
+
+  #def get_into(self,liste_courante=None):
+  #    """
+  #        Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
+  #        pas de liste de choix, la méthode retourne None.
+  #        L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déja
+  #        effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
+  #        en en tenant compte.
+  #        Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
+  #        une relation de type ET (AndVal).
+  #    """
+  #    if not self.object.definition.validators :
+  #       return self.object.definition.into
+  #    else:
+  #       return self.object.definition.validators.get_into(liste_courante,self.definition.into)
+
+  def has_into(self):
+      """
+          Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
+          ou s'il n'en propose pas (valeur de retour 0)
+
+          Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+          Dans le cas sans validateur, l'information est donnée par l'attribut into
+          de la definition du mot cle.
+          Dans le cas avec validateurs, pour que le mot cle soit considéré
+          comme proposant un choix, il faut que into soit présent OU
+          que la méthode has_into du validateur retourne 1. Dans les autres cas
+          on retournera 0 (ne propose pas de choix)
+      """
+      has_an_into=0
+      if self.definition.into:
+               has_an_into=1
+      elif self.definition.validators :
+         has_an_into= self.definition.validators.has_into()
+      return has_an_into
+
+
+  def GetMinMax(self):
+      """ Retourne les valeurs min et max de la définition de object """
+      return self.object.get_min_max()
+
+  def GetMultiplicite(self):
+      """ A préciser.
+          Retourne la multiplicité des valeurs affectées a l'objet
+          représenté par l'item. Pour le moment retourne invariablement 1.
+      """
+      return 1
+
+  def GetIntervalle(self):
+      """ 
+           Retourne le domaine de valeur attendu par l'objet représenté 
+           par l'item.
+      """
+      return self.object.getintervalle()
+
+  def GetListeValeurs(self) :
+      """ Retourne la liste des valeurs de object """
+      valeurs=self.object.get_liste_valeurs()
+      try :
+        if "R" in self.object.definition.type:
+           clef=self.object.GetNomConcept()
+           if self.appli.dict_reels.has_key(clef):
+              if type(valeurs) == types.TupleType:
+                 valeurs_reelles=[]
+                 for val in valeurs :
+                    if self.appli.dict_reels[clef].has_key(val) : 
+                       valeurs_reelles.append(self.appli.dict_reels[clef][val])
+                    else :
+                       valeurs_reelles.append(val)
+              else :
+                 if self.appli.dict_reels[clef].has_key(valeurs):
+                    valeurs_reelles=self.appli.dict_reels[clef][valeurs]
+              valeurs=valeurs_reelles
+      except :
+        pass
+      return valeurs
+    
+  def get_liste_possible(self,listeActuelle=[]):
+      if hasattr(self.definition.validators,'into'):
+         valeurspossibles = self.definition.validators.into 
+      else:
+         valeurspossibles = self.get_definition().into
+
+      #On ne garde que les items valides
+      listevalideitem=[]
+      if type(valeurspossibles) in (types.ListType,types.TupleType) :
+         pass
+      else :
+         valeurspossibles=(valeurspossibles,)
+      for item in valeurspossibles:
+          encorevalide=self.valide_item(item)
+          if encorevalide :
+             listevalideitem.append(item)
+
+      #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
+      listevalideliste=[]
+      for item in listevalideitem:
+          encorevalide=self.valide_liste_partielle(item,listeActuelle)
+          if encorevalide :
+              listevalideliste.append(item)
+      return listevalideliste
+
+  def get_liste_param_possible(self):
+      liste_param=[]
+      for param in self.object.jdc.params:
+          encorevalide=self.valide_item(param.valeur)
+          if encorevalide:
+             type_param=param.valeur.__class__.__name__
+             for typ in self.definition.type:
+                 if typ=='R':
+                     liste_param.append(param)
+                 if typ=='I' and type_param=='int':
+                     liste_param.append(param)
+                 if typ=='TXM' and type_param=='str':
+                     liste_param.append(repr(param))
+                 if ('grma' in repr(typ)) and type_param=='str':
+                     liste_param.append(param.nom)
+      return liste_param
+
+  #--------------------------------------------------
+  #
+  # Methodes liees a la validite des valeurs saisies
+  #
+  #---------------------------------------------------
+  # valide_item
+  # valide_liste_partielle
+  # valide_liste_complete
+  # info_erreur_item
+  # info_erreur_liste
+  # IsInIntervalle
+  # isvalid
+
+  def valide_item(self,item):
+      """
+        La validation est réalisée directement par l'objet
+      """
+      return self.object.valide_item(item)
+     
+  def valide_liste_partielle(self,item,listecourante):
+      #On protege la liste en entree en la copiant
+      valeur=listecourante[:]
+      valeur.append(item)
+      return self.object.valid_valeur_partielle(valeur)
+
+  def valide_liste_complete (self,valeur):
+      return self.object.valid_valeur(valeur)
+
+  def valide_val (self,valeur):
+      return self.object.valid_val(valeur)
+
+  def info_erreur_item(self) :
+      commentaire=""
+      if self.definition.validators :
+         commentaire=self.definition.validators.info_erreur_item()
+      return commentaire
+      
+  def aide(self) :
+      commentaire=""
+      if self.definition.validators :
+         commentaire=self.definition.validators.aide()
+      return commentaire
+
+  def info_erreur_liste(self) :
+      commentaire=""
+      if self.definition.validators :
+         commentaire=self.definition.validators.info_erreur_liste()
+      return commentaire
+
+  def IsInIntervalle(self,valeur):
+      """ 
+          Retourne 1 si la valeur est dans l'intervalle permis par
+          l'objet représenté par l'item.
+      """
+      return self.valide_item(valeur)
+
+  def isvalid(self):
+    valide=self.object.isvalid()
+    return valide
+
+  #--------------------------------------------------
+  #
+  # Autres ...
+  #
+  #---------------------------------------------------
+  # GetIconName
+  # GetText
+  # set_valeur_co
+  # get_sd_avant_du_bon_type
+  # delete_valeur_co
+
+
+  def GetIconName(self):
+    if self.isvalid():
+      return "ast-green-ball"
+    elif self.object.isoblig():
+      return "ast-red-ball"
+    else:
+      return "ast-yel-ball"
+
+  def GetText(self):
+    """
+    Classe SIMPTreeItem
+    Retourne le texte a afficher dans l'arbre représentant la valeur de l'objet
+    pointé par self 
+    """
+    text= self.object.GetText()
+    if text == None : text=""
+    return text
+    
+
+  def set_valeur_co(self,nom_co):
+      """
+      Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
+      """
+      ret = self.object.set_valeur_co(nom_co)
+      #print "set_valeur_co",ret
+      return ret
+      
+  def get_sd_avant_du_bon_type(self):
+      """
+      Retourne la liste des noms des SD présentes avant l'étape qui contient
+      le MCS pointé par self et du type requis par ce MCS
+      """
+      a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
+      return a
+
+  def get_sd_avant_du_bon_type_pour_type_de_base(self):
+      a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
+      return a
+
+
+
+
+  def delete_valeur_co(self,valeur=None):
+      """
+           Supprime la valeur du mot cle (de type CO)
+           il faut propager la destruction aux autres etapes
+      """
+      if not valeur : valeur=self.object.valeur
+      # XXX faut il vraiment appeler del_sdprod ???
+      #self.object.etape.parent.del_sdprod(valeur)
+      self.object.etape.parent.delete_concept(valeur)
+
+  #-----------------------------------------------
+  #
+  # Methodes liees au type de l objet attendu
+  #
+  #-----------------------------------------------
+  # wait_co 
+  # wait_geom
+  # wait_complex
+  # wait_reel
+  # wait_shell
+  # wait_assd
+  # GetType
+
+  def wait_co(self):
+      """
+      Méthode booléenne qui retourne 1 si l'objet pointé par self
+      attend un objet de type ASSD qui n'existe pas encore (type CO()),
+      0 sinon
+      """
+      return self.object.wait_co()
+
+  def wait_geom(self):
+      """
+      Méthode booléenne qui retourne 1 si l'objet pointé par self
+      attend un objet GEOM, 0 sinon
+      """
+      return self.object.wait_geom()
+    
+  def wait_complex(self):
+      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+      attend un complexe, 0 sinon """
+      if 'C' in self.object.definition.type:
+          return 1
+      else:
+          return 0
+
+  def wait_reel(self):
+      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+      attend un réel, 0 sinon """
+      if 'R' in self.object.definition.type:
+          return 1
+      else:
+          return 0
+        
+  def wait_shell(self):
+      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+      attend un shell, 0 sinon """
+      if 'shell' in self.object.definition.type:
+          return 1
+      else:
+          return 0
+
+  def wait_assd(self):
+      """Méthode booléenne qui retourne 1 si l'objet pointé par self
+      attend un objet de type ASSD ou dérivé, 0 sinon """
+      return self.object.wait_assd()
+    
+  def wait_assd_or_type_base(self) :
+      boo=0
+      if len(self.object.definition.type) > 1 :
+         if self.wait_reel() :
+            boo = 1
+         if 'I' in self.object.definition.type :
+            boo = 1
+      return boo
+
+   
+  def GetType(self):
+      """ 
+          Retourne le type de valeur attendu par l'objet représenté par l'item.
+      """
+      return self.object.get_type()
+
+  #-----------------------------------------------------
+  #
+  # Methodes liees  a l evaluation de la valeur saisie
+  #
+  #-----------------------------------------------------
+  # eval_valeur
+  # eval_valeur_item
+  # is_CO
+  # traite_reel
+
+  def eval_valeur(self,valeur):
+      """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
+             - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+             - retourne 'valeur' (chaine de caractéres) sinon
+      """
+      newvaleur=self.eval_val(valeur)
+      return newvaleur,1
+
+  def eval_valeur_BAK(self,valeur):
+      """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
+      de l'objet pointé par self :
+        - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+        - retourne 'valeur' (chaine de caractéres) sinon
+        - retourne None en cas d invalidite
+        - retourne invalide si 1 des objets du tuple l est
+      """
+      validite=1
+      if type(valeur) in (types.ListType,types.TupleType) :
+         valeurretour=[]
+         for item in valeur :
+             newvaleur,validiteitem=self.eval_valeur_item(item)
+             valeurretour.append(newvaleur)
+             if validiteitem == 0:
+                validite=0
+      else :
+         valeurretour,validite= self.eval_valeur_item(valeur)
+      if validite == 0 :
+         valeurretour = None
+      return valeurretour,validite
+
+  def eval_valeur_item(self,valeur):
+      """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple 
+          - va retourner la valeur de retour et la validite
+            selon le type de l objet attendu
+          - traite les reels et les parametres 
+      """ 
+      #print "eval_valeur_item",valeur
+      if valeur==None or valeur == "" :
+         return None,0
+      validite=1
+      if self.wait_reel():
+             valeurinter = self.traite_reel(valeur)
+             if valeurinter != None :
+                valeurretour,validite= self.object.eval_valeur(valeurinter)
+             else:
+                valeurretour,validite= self.object.eval_valeur(valeur)
+      elif self.wait_geom():
+             valeurretour,validite = valeur,1
+      else :
+             valeurretour,validite= self.object.eval_valeur(valeur)
+      #print "eval_valeur_item",valeurretour,validite
+
+      if validite == 0:
+         if type(valeur) == types.StringType and self.object.wait_TXM():
+            essai_valeur="'" + valeur + "'"
+            valeurretour,validite= self.object.eval_valeur(essai_valeur)
+
+      if hasattr(valeurretour,'__class__'):
+         #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
+         if valeurretour.__class__.__name__ in ('PARAMETRE',):
+            validite=1
+
+      #if self.wait_co():
+         # CCAR : il ne faut pas essayer de creer un concept
+         # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
+         #try:
+            #valeurretour=Accas.CO(valeur)
+         #except:
+            #valeurretour=None
+            #validite=0
+      # on est dans le cas ou on a évalué et ou on n'aurait pas du
+      if self.object.wait_TXM() :
+          if type(valeurretour) != types.StringType:
+             valeurretour=str(valeur)
+             validite=1
+      return valeurretour,validite
+      
+  def is_CO(self,valeur=None):
+      """
+         Indique si valeur est un concept produit de la macro
+         Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
+         Si valeur vaut None on teste la valeur du mot cle
+      """
+      # Pour savoir si un concept est un nouveau concept de macro
+      # on regarde s'il est présent dans l'attribut sdprods de l'étape
+      # ou si son nom de classe est CO.
+      # Il faut faire les 2 tests car une macro non valide peut etre
+      # dans un etat pas tres catholique avec des CO pas encore types
+      # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
+      if not valeur:valeur=self.object.valeur
+      if valeur in self.object.etape.sdprods:return 1
+      if type(valeur) is not types.InstanceType:return 0
+      if valeur.__class__.__name__ == 'CO':return 1
+      return 0
+
+  def is_param(self,valeur) :
+      for param in self.jdc.params:
+          if (repr(param) == valeur):
+             return 1
+      return 0
+
+  def traite_reel(self,valeur):
+      """
+      Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
+      ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
+      ou un EVAL ...
+      """
+      valeur = string.strip(valeur)
+      liste_reels = self.get_sd_avant_du_bon_type()
+      if valeur in liste_reels:
+          return valeur
+      if len(valeur) >= 3 :
+          if valeur[0:4] == 'EVAL' :
+              # on a trouvé un EVAL --> on retourne directement la valeur
+              return valeur
+      if string.find(valeur,'.') == -1 :
+          # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
+          if (self.is_param(valeur)):
+              return valeur
+          else:
+              if string.find(valeur,'e') != -1:
+                 # Notation scientifique ?
+                 try :
+                    r=eval(valeur)
+                    return valeur
+                 except :
+                    return None
+              else :
+                 return valeur+'.'
+      else:
+          return valeur
+        
+
+import Accas
+treeitem = SIMPTreeItem
+objet = Accas.MCSIMP
+
diff --git a/InterfaceQT4/editor.py b/InterfaceQT4/editor.py
new file mode 100644 (file)
index 0000000..0a9d920
--- /dev/null
@@ -0,0 +1,730 @@
+#i -*- coding: iso-8859-1 -*-
+
+# Modules Python
+import types,sys,os
+import traceback
+from qt import *
+
+# Modules Eficas
+
+import convert,generator
+from Editeur     import session
+from Editeur     import comploader
+from Editeur     import Objecttreeitem
+import panelsQT
+import browser
+import readercata
+
+import prefs
+import qtCommun
+
+VERSION_EFICAS  = "EFICAS v1.14"
+
+
+# -------------------------- #
+#                            #
+class JDCEditor(QSplitter):
+#                            #
+# -------------------------- #
+    """
+       Editeur de jdc
+    """        
+
+    def __init__(self,fn = None, jdc = None ,parent=None, editor = None, units = None, include=0):          
+    #-------------------------------------------------------------------------------------------#
+
+        QSplitter.__init__(self, parent,'')
+        
+        VERSION_CODE    = session.d_env.cata
+        self.salome=0
+       self.parent         = parent
+        if parent != None :
+           self.salome         = self.parent.salome
+        self.appliEficas = self.parent.appliEficas
+        self.top  = None
+        self.code = prefs.code
+        self.version_code = VERSION_CODE
+        self.titre=VERSION_EFICAS + ' pour '+ self.code
+        self.dict_reels={}
+        self.liste_simp_reel=[]        
+        self.format_fichier='python' # par defaut
+       self.jdc_openturn_xml=""
+       self.jdc_openturn_std=""
+        self.ihm="QT"
+        
+        from Editeur import configuration
+        self.CONFIGURATION = self.appliEficas.CONFIGURATION
+        self.CONFIGStyle = self.appliEficas.CONFIGStyle
+        self.test=0
+        self.sb = None
+        if hasattr(qApp.mainWidget(),"statusBar"):
+            self.sb = qApp.mainWidget().statusBar()
+      
+        self.vm             = parent    #viewManager
+        self.fileName       = fn
+        self.fileInfo       = None
+        self.lastModified   = 0
+        self.jdc            = jdc
+        
+        self.fichier=None
+        self.panel_courant=None    
+        self.node_selected = None
+        self.modified   = False
+        self.isReadOnly = False
+        
+        if not hasattr( readercata, 'reader' ) :
+            readercata.reader = readercata.READERCATA( self, self )
+        self.readercata = readercata.reader
+        
+        #------- construction du jdc --------------
+
+        jdc_item = None
+                        
+        nouveau=0
+        if self.fileName is not None:        #  fichier jdc fourni
+            self.fileInfo = QFileInfo(self.fileName)
+            self.fileInfo.setCaching(0)
+            if editor is None:
+                self.jdc = self.readFile(self.fileName)
+                if units is not None:
+                   self.jdc.recorded_units=units
+                   self.jdc.old_recorded_units=units
+            else:
+                self.top            = editor.top
+                self.code           = editor.code
+                self.version_code   = editor.version_code
+                self.titre          = editor.titre
+                self.dict_reels     = editor.dict_reels
+                self.liste_simp_reel= editor.liste_simp_reel
+                self.format_fichier = editor.format_fichier
+                self.CONFIGURATION  = editor.CONFIGURATION
+                self.CONFIGStyle    = editor.CONFIGStyle
+                self.jdc            = editor.jdc
+                
+                self.lastModified = self.fileInfo.lastModified()                
+        elif editor is not None: 
+            self.jdc = editor.jdc            
+        else: 
+            if not self.jdc:                   #  nouveau jdc
+                if not include :
+                   self.jdc = self._newJDC(units=units)
+                else :
+                   self.jdc = self._newJDCInclude(units=units)
+                nouveau=1
+        
+        if self.jdc:            
+            self.jdc.appli = self
+            txt_exception  = None
+            if not jdc:
+                self.jdc.analyse()            
+                txt_exception = self.jdc.cr.get_mess_exception()            
+            if txt_exception:
+                self.jdc = None
+                qApp.restoreOverrideCursor()
+                self.affiche_infos("Erreur fatale au chargement de %s" %fn)                
+                QMessageBox.critical( self, "Erreur fatale au chargement d'un fichier", txt_exception)                
+            else:
+                comploader.charger_composants("QT")
+                jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
+
+                if (not self.jdc.isvalid()) and (not nouveau) :
+                    self.viewJdcRapport()
+
+        #------- config widget --------------
+                
+        if jdc_item:                        
+            self.tree = browser.JDCTree( jdc_item, self )
+            self.connect(self.tree,SIGNAL('selectionChanged(QListViewItem *)'),self.updatePanel)
+      
+        sh = self.sizeHint()
+        if sh.height() < 300:
+            sh.setHeight(300)
+        self.resize(sh)
+            
+        # Make sure tabbing through a QWorkspace works.
+        self.setFocusPolicy(QWidget.StrongFocus)
+        self._updateReadOnly(1)
+        
+        # Set the editors size if it is too big for the parent.
+        if parent is not None:
+            req = self.size()
+            bnd = req.boundedTo(parent.size())
+        
+            if bnd.width() < req.width() or bnd.height() < req.height():
+                self.resize(bnd)
+        
+        self.panel = QWidget(self)        
+        #self.connect(self, SIGNAL('modificationChanged(bool)'), self.handleModificationChanged)
+                
+        
+    #-------------------------------------------------------------------#
+    def _updateReadOnly(self, bForce=1):
+    #-------------------------------------------------------------------#
+        """
+        Private method to update the readOnly information for this editor. 
+        
+        If bForce is True, then updates everything regardless if
+        the attributes have actually changed, such as during
+        initialization time.  A signal is emitted after the
+        caption change.
+
+        @param bForce 1 to force change, 0 to only update and emit
+                signal if there was an attribute change.
+        """
+
+        if self.fileName is None:
+            return
+        readOnly = not QFileInfo(self.fileName).isWritable() and 1 or 0
+        if not bForce and (readOnly == self.isReadOnly):
+            return
+        cap = self.fileName
+        if readOnly:
+            cap = "%s (ro)" % unicode(cap)
+        self.isReadOnly = readOnly
+        self.setCaption(cap)
+        self.emit(PYSIGNAL('captionChanged'), (cap, self))
+        
+    #--------------------------------#
+    def _newJDC( self ,units = None):        
+    #--------------------------------#
+        """
+        Initialise un nouveau JDC vierge
+        """
+        CONTEXT.unset_current_step()        
+        jdc=self.readercata.cata[0].JdC( procedure="",
+                                         appli=self,
+                                         cata=self.readercata.cata,
+                                         cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                         rep_mat=self.CONFIGURATION.rep_mat
+                                        )                         
+        if units is not None:
+           jdc.recorded_units=units
+           jdc.old_recorded_units=units
+        jdc.analyse()        
+        return jdc
+        
+    #--------------------------------#
+    def _newJDCInclude( self ,units = None):        
+    #--------------------------------#
+        """
+        Initialise un nouveau JDC vierge
+        """
+        import Extensions.jdc_include
+        JdC_aux=Extensions.jdc_include.JdC_include
+        CONTEXT.unset_current_step()        
+
+        jaux=self.readercata.cata[0].JdC( procedure="",
+                               appli=self,
+                               cata=self.readercata.cata,
+                               cata_ord_dico=self.readercata.cata_ordonne_dico,
+                               rep_mat=self.CONFIGURATION.rep_mat,
+                              )
+        jaux.analyse()
+
+        J=JdC_aux( procedure="",
+                   appli=self,
+                   cata=self.readercata.cata,
+                   cata_ord_dico=self.readercata.cata_ordonne_dico,
+                   jdc_pere=jaux,
+                   rep_mat=self.CONFIGURATION.rep_mat,
+                   )
+        J.analyse()
+        if units is not None:
+           J.recorded_units=units
+           J.old_recorded_units=units
+        return J
+
+            
+    #-----------------------#
+    def get_source(self,file):
+    #-----------------------#
+        import convert
+        format=self.format_fichier
+
+        # Il faut convertir le contenu du fichier en fonction du format
+        if convert.plugins.has_key(format):
+            # Le convertisseur existe on l'utilise
+            p=convert.plugins[format]()
+            p.readfile(file)
+            text=p.convert('execnoparseur')
+            if not p.cr.estvide():
+                self.affiche_infos("Erreur a la conversion")
+            return text
+        else:
+            # Il n'existe pas c'est une erreur
+            self.affiche_infos("Type de fichier non reconnu")
+            QMessageBox.critical( self, "Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")            
+            return None
+        
+    #---------------------------------------------#
+    def get_file(self,unite=None,fic_origine = ''):
+    #---------------------------------------------#
+        ulfile  = None
+        jdcText = ""
+      
+        titre  = ""
+        
+        if unite :
+            titre = "Choix unite %d " %unite
+            texte = "Le fichier %s contient une commande INCLUDE \n" % fic_origine
+            texte = texte+'Donnez le nom du fichier correspondant\n à l unité logique %d' % unite
+            labeltexte = 'Fichier pour unite %d :' % unite
+        else:
+            titre = "Choix d'un fichier de poursuite"
+            texte = "Le fichier %s contient une commande %s\n" %(fic_origine,'POURSUITE')
+            texte = texte+'Donnez le nom du fichier dont vous \n voulez faire une poursuite'
+                                        
+        QMessageBox.information( self, titre,texte)
+        fn = QFileDialog.getOpenFileName( None, "", self, None, titre )
+        
+        if fn.isNull():
+            return
+            
+        ulfile = os.path.abspath(unicode(fn))
+        # On utilise le convertisseur défini par format_fichier
+        source=self.get_source(ulfile)
+        if source:
+            # On a réussi à convertir le fichier self.ulfile                
+            jdcText = source
+        else:
+            # Une erreur a été rencontrée
+            jdcText = ''
+        return ulfile, jdcText
+        
+        
+    #-----------------------#
+    def readFile(self, fn):
+    #-----------------------#
+        """
+        Public slot to read the text from a file.
+        
+        @param fn filename to read from (string or QString)
+        """        
+        fn = unicode(fn)        
+            
+        qApp.setOverrideCursor(Qt.waitCursor)
+                        
+        # ------------------------------------------------------------------------------------
+        #                         charge le JDC
+        # ------------------------------------------------------------------------------------      
+        
+        jdcName=os.path.basename(fn)
+        # Il faut convertir le contenu du fichier en fonction du format
+        if convert.plugins.has_key( self.format_fichier ):
+             # Le convertisseur existe on l'utilise
+             appli = self # CS_pbruno compatiblity parseur_python: self.appli.liste_simp_reel, self.appli.dict_reels
+             p=convert.plugins[self.format_fichier]()
+             p.readfile(fn)         
+             text=p.convert('exec',appli)
+             if not p.cr.estvide():                 
+                self.affiche_infos("Erreur à la conversion")
+        
+        CONTEXT.unset_current_step()
+        ##   os.chdir(self.initialdir)
+        jdc=self.readercata.cata[0].JdC(procedure=text,
+                                    appli=self,
+                                    cata=self.readercata.cata,
+                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                    nom=jdcName,
+                                    rep_mat=self.CONFIGURATION.rep_mat
+                                   )
+        # ----------------------------------------------------
+        #      charge le JDC fin
+        # ----------------------------------------------------
+        self.modified = False
+                        
+        qApp.restoreOverrideCursor()        
+        if self.fileInfo!= None : 
+           self.lastModified = self.fileInfo.lastModified()
+        else :
+           self.lastModified = 1
+        return jdc
+        
+    #----------------------------------------------#
+    def _viewText(self, txt, caption = "FILE_VIEWER"):    
+    #----------------------------------------------#
+        w = qtCommun.ViewText( self.parent )
+        w.setCaption( caption )
+        w.setText(txt)
+        w.show()
+        
+    #-----------------------#
+    def viewJdcSource(self):        
+    #-----------------------#
+        format = self.format_fichier
+        f=open(self.fileName,'r')
+        texteSource=f.read()
+        f.close()
+        self._viewText(texteSource, "JDC_SOURCE")
+                
+    #-----------------------#
+    def viewJdcPy(self):        
+    #-----------------------#
+        format = self.format_fichier
+        strSource = str( self.get_text_JDC(format) )       
+        self._viewText(strSource, "JDC_RESULTAT")
+                
+    #-----------------------#
+    def viewJdcRapport(self):
+    #-----------------------#
+        strRapport = str( self.jdc.report() )
+        self._viewText(strRapport, "JDC_RAPPORT")        
+        
+    #-----------------------#
+    def handleRenamed(self, fn):
+    #-----------------------#
+        """
+        Public slot to handle the editorRenamed signal.
+        
+        @param fn filename to be set for the editor (QString or string).
+        """
+        self.fileName = unicode(fn)
+        self.setCaption(self.fileName)
+        
+        if self.fileInfo is None:
+            self.fileInfo = QFileInfo(self.fileName)
+            self.fileInfo.setCaching(0)
+        
+        self.lastModified = self.fileInfo.lastModified()
+        self.vm.setEditorName(self, self.fileName)
+        self._updateReadOnly(1)        
+
+    #-----------------------#
+    def handleNewView(self):
+    #-----------------------#
+        """
+        Private slot to create a new view to an open document.
+        """
+        self.vm.newEditorView(self.fileName, self)#, self.isPythonFile)
+
+    #------------------------------------#
+    def handleModificationChanged(self, m):
+    #------------------------------------#
+        """
+        Private slot to handle the modificationChanged signal. 
+        
+        It emits the signal modificationStatusChanged with parameters
+        m and self.
+        
+        @param m modification status
+        """
+        if not m and self.fileInfo is not None:
+            self.lastModified = self.fileInfo.lastModified()
+        self.emit(PYSIGNAL('modificationStatusChanged'), (m, self))
+        
+    #------------------------#
+    def hasSyntaxErrors(self):        
+    #------------------------#
+        return False #CS_pbruno todo
+        
+    #----------------#
+    def closeIt(self):
+    #----------------#
+        """
+        Public method called by the viewmanager to finally get rid of us.
+        """
+
+        if self.jdc:
+            self.jdc.supprime()
+        self.close()
+    
+
+    #------------------------------#
+    def affiche_infos(self,message):
+    #------------------------------#
+        if self.sb:
+            self.sb.message(message)#,2000)
+
+    #------------------------------#
+    def updatePanel(self, jdcNode):
+    #------------------------------#
+        """
+        Appele a chaque changement de noeud
+        """
+        self.node_selected = jdcNode
+        if self.panel:
+            self.panel.close()
+            del self.panel
+            self.panel = None
+            
+        if jdcNode.item.isactif():
+            self.panel = jdcNode.getPanel()
+            #print self.panel.__class__
+        else:
+            self.panel = panelsQT.PanelInactif(self.node_selected,self)
+            
+        if not self.panel:
+            self.panel = panelsQT.NoPanel(self)
+        
+        self.panel.show()
+        
+    
+    #-------------------#
+    def init_modif(self):
+    #-------------------#
+      """
+          Met l'attribut modified a 'o' : utilise par Eficas pour savoir 
+          si un JDC doit etre sauvegarde avant destruction ou non
+      """
+      self.modified = True
+      self.emit(PYSIGNAL('modificationStatusChanged'), (True, self))
+    
+    #-------------------#
+    def stop_modif(self):
+    #-------------------#
+      """
+          Met l'attribut modified à 'n' : utilisé par Eficas pour savoir 
+          si un JDC doit etre sauvegardé avant destruction ou non
+      """      
+      self.modified = False
+      self.emit(PYSIGNAL('modificationStatusChanged'), (False, self))
+    
+    
+    #-------------------#
+    def cut(self):
+    #-------------------#
+      """
+      Stocke dans Eficas.noeud_a_editer le noeud à couper
+      """
+      if not self.node_selected.item.iscopiable():
+          QMessageBox.information( self, "Copie impossible",
+                "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")          
+          return
+      self.parent.edit="couper"
+      self.parent.noeud_a_editer = self.node_selected      
+    
+    #-------------------#
+    def copy(self):
+    #-------------------#
+      """
+      Stocke dans Eficas.noeud_a_editer le noeud a copier
+      """
+      if not self.node_selected.item.iscopiable():
+          QMessageBox.information( self, "Copie impossible",
+                   "La copie d'un tel objet n'est pas permise")          
+          return
+      self.parent.edit="copier"
+      self.parent.noeud_a_editer = self.node_selected
+    
+    #-------------------#
+    def paste(self):
+    #-------------------#
+      """
+      Lance la copie de l'objet place dans self.parent.noeud_a_editer
+      Ne permet que la copie d'objets de type Commande ou MCF
+      """
+      try:
+         child=self.parent.noeud_a_editer.doPaste(self.node_selected)
+      except:
+         traceback.print_exc()
+         QMessageBox.information( self, "Copie impossible",         
+                                        "L'action de coller apres un tel objet n'est pas permise")
+         return
+    
+      if child == 0:
+          if self.message != '':             
+             QMessageBox.critical( self, "Copie refusee", self.message)
+             self.message = ''
+          self.affiche_infos("Copie refusée")
+          return
+    
+      # il faut declarer le JDCDisplay_courant modifie
+      self.init_modif()
+      # suppression eventuelle du noeud selectionne
+      # si possible on renomme l objet comme le noeud couper
+
+      if self.parent.edit == "couper":
+         #nom = self.parent.noeud_a_editer.item.object.sd.nom
+         item=self.parent.noeud_a_editer.item
+         self.parent.noeud_a_editer.delete()
+         child.item.update(item)
+         #test,mess = child.item.nomme_sd(nom)
+         child.select()
+
+      # on rend la copie a nouveau possible en liberant le flag edit
+      self.parent.edit="copier"
+          
+    #---------------------#
+    def getFileName(self):
+    #---------------------#
+      return self.fileName
+      
+    #---------------------------#
+    def writeFile(self, fn, txt = None):
+    #------------------------------#
+        """
+        Public slot to write the text to a file.
+        
+        @param fn filename to write to (string or QString)
+        @return flag indicating success
+        """
+
+        fn = unicode(fn)
+
+        if txt == None :
+            txt = self.get_text_JDC(self.format_fichier)
+            eol = '\n'        
+            if len(txt) >= len(eol):
+               if txt[-len(eol):] != eol:
+                  txt += eol
+            else:
+                txt += eol        
+
+        try:
+            f = open(fn, 'wb')
+            f.write(txt)
+            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)))
+            return 0
+
+    #------------------------------------ 
+    def writeFilesOpenturns(self,fn) :
+    #------------------------------------ 
+       base=fn[:fn.rfind(".")]
+       fileXML=base + '.xml'
+       fileSTD=base + '_std.py'
+        self.writeFile(fileXML,self.jdc_openturn_xml)
+        self.writeFile(fileSTD,self.jdc_openturn_std)
+
+
+    #-----------------------------#
+    def get_text_JDC(self,format):
+    #-----------------------------#
+      if generator.plugins.has_key(format):
+         # Le generateur existe on l'utilise
+         g=generator.plugins[format]()
+         jdc_formate=g.gener(self.jdc,format='beautifie')
+        if format == "openturns" :
+           self.jdc_openturn_xml=g.getOpenturnsXML()
+           self.jdc_openturn_std=g.getOpenturnsSTD()
+         if not g.cr.estvide():            
+            self.affiche_infos("Erreur à la generation")
+            QMessageBox.critical( self, "Erreur a la generation","EFICAS ne sait pas convertir ce JDC")
+            return
+         else:
+            return jdc_formate
+      else:         
+         # Il n'existe pas c'est une erreur
+         self.affiche_infos("Format %s non reconnu" % format)
+         QMessageBox.critical( self, "Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC en format %s "% format)
+         return
+      
+      
+    #-------------------------------------------#
+    def saveFile(self, saveas = 0, path = None):
+    #-------------------------------------------#
+        """
+        Public slot to save the text to a file.
+        
+        @param saveas flag indicating a 'save as' action
+        @param path directory to save the file in (string or QString)
+        @return tuple of two values (boolean, string) giving a success indicator and
+            the name of the saved file
+        """        
+        self.modified = True #CS_pbruno test
+                
+        if not saveas and not self.modified:#self.isModified():
+            return (0, None)      # do nothing if text wasn't changed
+            
+        newName = None
+        if saveas or self.fileName is None:
+            if path is None and self.fileName is not None:
+                path = os.path.dirname(unicode(self.fileName))
+            selectedFilter = QString('')
+            fn = QFileDialog.getSaveFileName(path,
+                self.trUtf8("JDC (*.comm);;"
+                    "All Files (*)"), self, None,
+                self.trUtf8("Save File"), selectedFilter, 0)
+                
+            if not fn.isNull():
+                ext = QFileInfo(fn).extension()
+                if ext.isEmpty():
+                    ex = selectedFilter.section('(*',1,1).section(')',0,0)
+                    if not ex.isEmpty():
+                        fn.append(ex)
+                if QFileInfo(fn).exists():
+                    abort = QMessageBox.warning(self,
+                        self.trUtf8("Save File"),
+                        self.trUtf8("The file <b>%1</b> already exists.")
+                            .arg(fn),
+                        self.trUtf8("&Overwrite"),
+                        self.trUtf8("&Abort"), None, 1)
+                    if abort:
+                        return (0, None)
+                fn = unicode(QDir.convertSeparators(fn))
+                newName = fn
+            else:
+                return (0, None)
+        else:
+            fn = self.fileName
+        
+        if self.writeFile(fn):
+            self.fileName = fn
+            self.modified  = False                        
+            self.setCaption(self.fileName)                
+            if self.fileInfo is None or saveas:
+                self.fileInfo = QFileInfo(self.fileName)
+                self.fileInfo.setCaching(0)
+                self.emit(PYSIGNAL('editorRenamed'), (self.fileName,))
+            self.lastModified = self.fileInfo.lastModified()
+            if newName is not None:
+                self.vm.addToRecentList(newName)
+            self.emit(PYSIGNAL('editorSaved'), (self.fileName,))
+            self.stop_modif()            
+           if self.code == "OPENTURNS" :
+              self.writeFilesOpenturns(fn)
+            if self.salome : 
+               self.parent.appli.addJdcInSalome( self.fileName)
+               if self.code == 'ASTER':
+                  self.parent.appli.createOrUpdateMesh(self)
+               #PN ; TODO
+
+
+            return (1, self.fileName)
+        else:
+            return (0, None)
+
+    #---------------------------------#
+    def saveFileAs(self, path = None):
+    #---------------------------------#
+        """
+        Public slot to save a file with a new name.
+        
+        @param path directory to save the file in (string or QString)
+        @return tuple of two values (boolean, string) giving a success indicator and
+            the name of the saved file
+        """
+        return self.saveFile(1, path)
+
+   
+if __name__=='__main__':    
+    if hasattr(prefs,'encoding'):
+       # Hack pour changer le codage par defaut des strings
+       import sys
+       reload(sys)
+       sys.setdefaultencoding(prefs.encoding)
+       del sys.setdefaultencoding
+       # Fin hack
+
+    #CS_pbruno note: fait implicitement des trucs ces imports (grr)
+    import styles
+    import import_code
+    import session
+
+    # Analyse des arguments de la ligne de commande
+    options=session.parse(sys.argv)
+    code=options.code
+        
+    app = QApplication(sys.argv)    
+    mw = JDCEditor('azAster.comm')
+    app.setMainWidget(mw)
+    app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+    mw.show()
+            
+    res = app.exec_loop()
+    sys.exit(res)
+    
diff --git a/InterfaceQT4/eficas.py b/InterfaceQT4/eficas.py
new file mode 100644 (file)
index 0000000..9b48746
--- /dev/null
@@ -0,0 +1,68 @@
+# -*- coding: iso-8859-15 -*-
+
+class UserInterface(Eficas):    
+    """
+    Class implementing the main user interface.
+    
+    @signal appendStderr(string) emitted to write data to stderr logger
+    @signal appendStdout(string) emitted to write data to stdout logger
+    @signal preferencesChanged() emitted after the preferences were changed
+    """
+    def __init__(self):
+        """
+        Constructor
+        
+        @param loc locale to be used by the UI (string)
+        @param splash reference to the splashscreen (UI.SplashScreen.SplashScreen)
+        """
+        Eficas.__init__(self)
+
+        # Generate the debug server object
+        dbs = DebugServer()
+        
+        # Create main layout type 4 (floating windows)
+        
+        # Create the view manager depending on the configuration setting
+        self.viewmanager = MyTabview(self, self, dbs) #MyTabview, MyWorkspace, Listspace
+        self.setCentralWidget(self.viewmanager)
+        
+                     
+        self.connect(self,PYSIGNAL('preferencesChanged'),
+                     self.viewmanager.handlePreferencesChanged)
+        
+        self.connect(self.viewmanager,PYSIGNAL('lastEditorClosed'),
+                     self.handleLastEditorClosed)
+        self.connect(self.viewmanager,PYSIGNAL('editorOpened'),
+                     self.handleEditorOpened)
+                     
+        
+        
+        # Initialise the instance variables.
+        self.currentProg = None
+        self.isProg = 0
+        self.utEditorOpen = 0
+        self.utProjectOpen = 0
+        
+        self.inDragDrop = 0
+        self.setAcceptDrops(1)
+
+
+        
+    def handleLastEditorClosed(self):
+        """
+        Public slot to handle the lastEditorClosed signal.
+        """
+        pass
+        
+    def handleEditorOpened(self, fn):
+        """
+        Public slot to handle the editorOpened signal.
+        
+        @param fn filename of the opened editor (string)
+        """
+        pass
+        
+    def fileOpen(self, prog=None):
+        self.viewmanager.handleOpen(prog)
+
+
diff --git a/InterfaceQT4/eficas_go.py b/InterfaceQT4/eficas_go.py
new file mode 100644 (file)
index 0000000..daaf8bf
--- /dev/null
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+"""
+    Ce module permet de lancer l'application EFICAS en affichant
+    un ecran Splash pour faire patienter l'utilisateur
+"""
+# Modules Python
+import sys
+from qt import *
+
+# Modules Eficas
+import prefs
+if hasattr(prefs,'encoding'):
+   # Hack pour changer le codage par defaut des strings
+   import sys
+   reload(sys)
+   sys.setdefaultencoding(prefs.encoding)
+   del sys.setdefaultencoding
+   # Fin hack
+
+from Editeur import import_code
+from Editeur import session
+
+def lance_eficas(code=None,fichier=None):
+    """
+        Lance l'appli EFICAS
+    """
+    # Analyse des arguments de la ligne de commande
+    if code !=None : prefs.code=code
+    import qtEficas
+    options=session.parse(sys.argv)
+    code=options.code
+
+    app = QApplication(sys.argv)
+    mw = qtEficas.Appli(code=code)
+    app.setMainWidget(mw)
+    app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+    mw.show()
+    mw.ouvreFichiers()
+    res = app.exec_loop()
+    sys.exit(res)
+
+
diff --git a/InterfaceQT4/gereTraduction.py b/InterfaceQT4/gereTraduction.py
new file mode 100644 (file)
index 0000000..f4712ff
--- /dev/null
@@ -0,0 +1,45 @@
+from qt import *
+import os
+
+
+def traduction(directPath,editor,version):
+    if version == "V7V8" : from Traducteur import traduitV7V8 
+    fn = QFileDialog.getOpenFileName( QString(directPath) , "", None, None, None )
+
+    FichieraTraduire=str(fn)
+    if (FichieraTraduire == "" or FichieraTraduire == () ) : return
+    i=FichieraTraduire.rfind(".")
+    Feuille=FichieraTraduire[0:i]
+    FichierTraduit=Feuille+"v8.comm"
+
+    i=Feuille.rfind("/")
+    directLog=Feuille[0:i]
+    log=directLog+"/convert.log"
+    os.system("rm -rf "+log)
+    os.system("rm -rf "+FichierTraduit)
+
+    qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
+    if version == "V7V8" : traduitV7V8.traduc(FichieraTraduire,FichierTraduit,log)
+    qApp.setOverrideCursor(QCursor(Qt.ArrowCursor))
+
+    Entete="Fichier Traduit : "+FichierTraduit +"\n\n"
+    if  os.stat(log)[6] != 0L :
+        f=open(log)
+        texte= f.read()
+        f.close()
+    else :
+       texte = Entete  
+       commande="diff "+FichieraTraduire+" "+FichierTraduit+" >/dev/null"
+       try :
+         if os.system(commande) == 0 :
+            texte = texte + "Pas de difference entre le fichier V7 et le fichier traduit"
+       except :
+         pass
+
+    from desVisu import DVisu
+    titre = "conversion de "+ FichieraTraduire
+    monVisu=DVisu(parent=editor,fl=Qt.WType_Dialog)
+    monVisu.setCaption(titre)
+    monVisu.TB.setText(texte)
+    monVisu.show()
+
diff --git a/InterfaceQT4/monChoixCata.py b/InterfaceQT4/monChoixCata.py
new file mode 100644 (file)
index 0000000..f21aaa1
--- /dev/null
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desChoixCata import DChoixCata
+from qt import *
+
+
+# Import des panels
+
+class MonChoixCata(DChoixCata):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,listeCata,readercata, parent = None,name = None,fl = 0):
+      DChoixCata.__init__(self,parent,name,fl)
+      self.listeCata=listeCata
+      self.readercata=readercata
+      for cata in self.listeCata :
+               self.CBChoixCata.insertItem(cata,0)
+      lab  = QString(repr(len(listeCata)))
+      lab += QString(" versions du catalogue sont disponibles")
+      self.TLNb.setText(lab)
+      self.readercata.version_cata=self.CBChoixCata.currentText()
+
+  def BSupPressed(self):
+      QTPanel.BSupPressed(self)
+
+  def CataChoisi(self):
+      self.readercata.version_cata=self.CBChoixCata.currentText()
+
+  def BOkPressed(self):
+      QDialog.accept(self)
+
+  def BCancelPressed(self):
+      QDialog.reject(self)
diff --git a/InterfaceQT4/monCommandePanel.py b/InterfaceQT4/monCommandePanel.py
new file mode 100644 (file)
index 0000000..16962da
--- /dev/null
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desCommande import DComm
+from qtCommun    import QTPanel
+from qtCommun    import QTPanelTBW1
+from qtCommun    import QTPanelTBW2
+from qtCommun    import QTPanelTBW3
+from qt          import *
+
+
+# Import des panels
+
+class MonCommandePanel(DComm,QTPanelTBW1,QTPanelTBW2,QTPanelTBW3):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node, parent = None,name = None,fl = 0):
+        DComm.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        QTPanelTBW1.__init__(self,node,parent)
+        QTPanelTBW2.__init__(self,node,parent)
+        QTPanelTBW3.__init__(self,node,parent)
+
+  def BSupPressed(self):
+      QTPanel.BSupPressed(self)
+
+  def BOkPressed(self):
+      QTPanel.BOkPressed(self)
+
+  def ViewDoc(self):
+      QTPanel.ViewDoc(self)
+
+  def BNextPressed(self):
+      QTPanelTBW2.BNextPressed(self)
+
+  def BuildTabCommand(self):
+      QTPanelTBW2.BuildLBNouvCommande(self)
+
+  def LEFiltreTextChanged(self):
+      QTPanelTBW2.LEFiltreTextChanged(self)
+
+  def LEfiltreReturnPressed(self):
+      QTPanelTBW2.LEfiltreReturnPressed(self)
+
+  def LBNouvCommandeClicked(self):
+      QTPanelTBW2.LBNouvCommandeClicked(self)
+
+  def LENomConceptReturnPressed(self):
+      QTPanelTBW3.LENomConceptReturnPressed(self)
diff --git a/InterfaceQT4/monCommentairePanel.py b/InterfaceQT4/monCommentairePanel.py
new file mode 100644 (file)
index 0000000..4a983a4
--- /dev/null
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+
+# Modules Eficas
+
+from qt import *
+
+from desCommentaire import DComment
+from qtCommun      import QTPanel
+from qtCommun      import QTPanelTBW2
+
+import prefs
+
+# Import des panels
+
+class MonCommentairePanel(DComment,QTPanelTBW2,QTPanel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node, parent = None,name = None,fl = 0):
+        DComment.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        QTPanelTBW2.__init__(self,node,parent)
+        self.RemplitPanel()
+
+  def RemplitPanel(self):
+        texte=self.node.item.get_valeur()
+        self.textCommentaire.setText(texte)
+
+  def TexteCommentaireEntre(self):
+        texte=self.textCommentaire.text().latin1()
+        self.editor.init_modif()
+        self.node.item.set_valeur(texte)
+        self.node.onValid()
+
+  def BuildTabCommand(self):
+      QTPanelTBW2.BuildLBNouvCommande(self)
+
+  def LEFiltreTextChanged(self):
+      QTPanelTBW2.LEFiltreTextChanged(self)
+
+  def LEfiltreReturnPressed(self):
+      QTPanelTBW2.LEfiltreReturnPressed(self)
+
+  def LBNouvCommandeClicked(self):
+      QTPanelTBW2.LBNouvCommandeClicked(self)
+
+  def BNextPressed(self) :
+      QTPanelTBW2.BNextPressed(self)
+
+  def BOkPressed(self):
+      QTPanel.BOkPressed(self)
+
+  def ViewDoc(self):
+      QTPanel.ViewDoc(self)
+
diff --git a/InterfaceQT4/monFonctionPanel.py b/InterfaceQT4/monFonctionPanel.py
new file mode 100644 (file)
index 0000000..8a0a3f3
--- /dev/null
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from qt import * 
+
+# Modules Eficas
+from qtSaisie      import SaisieValeur
+from monPlusieursBasePanel import MonPlusieursBasePanel
+
+# Import des panels
+
+class MonFonctionPanel(MonPlusieursBasePanel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node, parent = None,name = None,fl = 0):
+        self.node=node
+        self.SetNbValeurs()
+        MonPlusieursBasePanel.__init__(self,node,parent,name,fl)
+
+  def SetNbValeurs(self):
+        genea=self.node.item.get_genealogie()
+        if "VALE" in genea:
+            self.nbValeurs=2
+        if "VALE_C" in genea:
+            self.nbValeurs=3
+
+
+  def DecoupeListeValeurs(self,liste):
+        #decoupe la liste des valeurs en n ( les x puis les y)
+        l_valeurs=[]
+        if (len(liste)% self.nbValeurs != 0):
+            message="La cardinalité n'est pas correcte, la dernière valeur est ignorée"
+            #self.Commentaire.setText(QString(commentaire)) 
+            self.editor.affiche_infos(commentaire)
+        for i in range(len(liste)/ self.nbValeurs) :
+            if (self.nbValeurs==2):
+              t=(liste[i*self.nbValeurs], liste[i*self.nbValeurs+1])
+            else:
+              t=(liste[i*self.nbValeurs], liste[i*self.nbValeurs+1], liste[i*self.nbValeurs+2])
+            l_valeurs.append(t)
+        return l_valeurs
+
+  def BuildLBValeurs(self):
+        self.LBValeurs.clear()
+        listeValeurs=self.node.item.GetListeValeurs()
+        for valeur in self.DecoupeListeValeurs(listeValeurs):
+            self.LBValeurs.insertItem(str(valeur))
+
+  def  Ajout1Valeur(self,liste=[]):
+        # Pour être appele a partir du Panel Importer (donc plusieurs fois par AjouterNValeur)
+        if liste == [] :
+           liste,validite=SaisieValeur.TraiteLEValeur(self)
+        else :
+           validite=1
+        if validite == 0 : return
+        if liste ==[]    : return
+
+        if len(liste) != self.nbValeurs :
+            commentaire  = QString(str(liste)) 
+            commentaire += QString(" n est pas un tuple de ") 
+            commentaire += QString(str(self.nbValeurs)) 
+            commentaire += QString(" valeurs")
+            #self.Commentaire.setText(commentaire)
+            self.editor.affiche_infos(commentaire)
+            return
+
+        index=self.LBValeurs.currentItem() +1
+        indexListe=index*self.nbValeurs
+        if index == 0 : 
+           index = -1
+           indexListe=len(self.listeValeursCourantes)
+        listeVal=[]
+        for valeur in self.listeValeursCourantes :
+                listeVal.append(valeur)
+        validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,index,listeVal)
+        self.Commentaire.setText(comm2)
+        if not validite :
+                self.editor.affiche_infos(comm)
+        else:
+           self.LEValeur.setText(QString(""))
+           l1=self.listeValeursCourantes[:indexListe]
+           l3=self.listeValeursCourantes[indexListe:]
+           for valeur in self.DecoupeListeValeurs(listeRetour):
+               self.LBValeurs.insertItem(QString(str(valeur)),index)
+               index=index+1
+           self.listeValeursCourantes=l1+listeRetour+l3
+
+
+  def AjoutNValeur(self,liste) :
+        if len(liste)%self.nbValeurs != 0 :
+           texte="Nombre de valeur incorrecte"
+           #self.Commentaire.setText(texte)
+           self.editor.affiche_infos(texte)
+           return
+        listeDecoupee=self.DecoupeListeValeurs(liste)
+        for vals in listeDecoupee :
+            self.Ajout1Valeur(vals)
+           
+
+  def Sup1Valeur(self):
+        index=self.LBValeurs.currentItem()
+        self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+        listeVal=[]
+        i=0
+        for valeur in self.listeValeursCourantes :
+                if self.nbValeurs == 2 :
+                   if (i != index*2 and i != index*2+1 ) : listeVal.append(valeur)
+                elif self.nbValeurs == 3 :
+                   if (i != index*3 and i != index*3+1 and i != index*3 +2) : listeVal.append(valeur)
+                else :
+                   print "aiiiiiiiiiiiiiiiiiieeee"
+                i = i+1
+        self.listeValeursCourantes=listeVal
+        listeValeurs=self.listeValeursCourantes
+        self.LBValeurs.clear()
+        for valeur in self.DecoupeListeValeurs(listeValeurs):
+            self.LBValeurs.insertItem(str(valeur))
+
diff --git a/InterfaceQT4/monFormulePanel.py b/InterfaceQT4/monFormulePanel.py
new file mode 100644 (file)
index 0000000..e691082
--- /dev/null
@@ -0,0 +1,147 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desFormule import DFormule
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW2
+from qt import *
+
+
+# Import des panels
+
+class MonFormulePanel(DFormule,QTPanelTBW2):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node, parent = None,name = None,fl = 0):
+        DFormule.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        QTPanelTBW2.__init__(self,node,parent)
+        self.LENomFormule.setText(node.item.get_nom())
+        self.LECorpsFormule.setText(node.item.get_corps())
+        texte_args=""
+        if node.item.get_args() != None :
+            for i in node.item.get_args() :
+                if texte_args != "" :
+                   texte_args = texte_args +","
+                texte_args=texte_args + i
+        self.LENomsArgs.setText(texte_args)
+
+        
+        self.parent=parent
+
+  def BSupPressed(self):
+      QTPanel.BSupPressed(self)
+
+  def BOkPressed(self):
+      QTPanel.BOkPressed(self)
+
+  def ViewDoc(self):
+      QTPanel.ViewDoc(self)
+
+  def BNextPressed(self):
+      QTPanelTBW2.BNextPressed(self)
+
+  def BuildTabCommand(self):
+      QTPanelTBW2.BuildLBNouvCommande(self)
+
+  def LEFiltreTextChanged(self):
+      QTPanelTBW2.LEFiltreTextChanged(self)
+
+  def LEfiltreReturnPressed(self):
+      QTPanelTBW2.LEfiltreReturnPressed(self)
+
+  def LBNouvCommandeClicked(self):
+      QTPanelTBW2.LBNouvCommandeClicked(self)
+
+  def NomFormuleSaisi(self):
+      nomFormule = self.LENomFormule.text().latin1()
+      if nomFormule == '' : return
+      test,erreur = self.node.item.verif_nom(nomFormule)
+      if test :
+         commentaire=nomFormule+" est un nom valide pour une FORMULE"
+      else :
+         commentaire=nomFormule+" n'est pas un nom valide pour une FORMULE"
+      self.editor.affiche_infos(commentaire) 
+
+  def argsSaisis(self):
+      arguments = self.LENomsArgs.text().latin1()
+      if arguments == '' : return
+
+      test,erreur = self.node.item.verif_arguments(arguments)
+      if test:
+         commentaire="Argument(s) valide(s) pour une FORMULE"
+      else:
+         commentaire="Argument(s) invalide(s) pour une FORMULE"
+      self.editor.affiche_infos(commentaire) 
+
+  def FormuleSaisie(self):
+      nomFormule = self.LENomFormule.text().latin1()
+      arguments  = self.LENomsArgs.text().latin1()
+      expression = self.LECorpsFormule.text().latin1()
+      if expression == '' : return
+      test,erreur = self.node.item.verif_formule_python((nomFormule,"REEL",arguments,expression))
+
+      if test:
+         commentaire="Corps de FORMULE valide"
+      else:
+         commentaire="Corps de FORMULE invalide"
+      self.editor.affiche_infos(commentaire) 
+
+
+  def BOkPressedFormule(self):
+      if self.parent.modified == 'n' : self.parent.init_modif()
+
+      nomFormule = self.LENomFormule.text().latin1()
+      test,erreur = self.node.item.verif_nom(nomFormule)
+      if not test :
+         self.editor.affiche_infos(erreur)
+         return
+
+      arguments  = self.LENomsArgs.text().latin1()
+      test,erreur = self.node.item.verif_arguments(arguments)
+      if not test :
+         self.editor.affiche_infos(erreur)
+         return
+
+      expression = self.LECorpsFormule.text().latin1()
+      test,erreur = self.node.item.verif_formule_python((nomFormule,"REEL",arguments,expression))
+      if not test :
+         self.editor.affiche_infos(erreur)
+         return
+
+      test=self.node.item.object.update_formule_python(formule=(nomFormule,"REEL",arguments,expression))
+      test,erreur = self.node.item.save_formule(nomFormule,"REEL",arguments,expression)
+      if test :
+         #self.node.update_texte()
+         #self.node.update_label()
+         #self.node.update_node()
+         self.node.onValid()
+         self.node.update_valid()
+         commentaire = "Formule modifiée"
+      else:
+         commentaire ="Formule incorrecte : " + erreur 
+      self.editor.init_modif()
+      self.editor.affiche_infos(commentaire)
diff --git a/InterfaceQT4/monIncludePanel.py b/InterfaceQT4/monIncludePanel.py
new file mode 100644 (file)
index 0000000..b2e925b
--- /dev/null
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+import os,traceback,sys
+from qt import *
+from desMacro import DMacro
+
+from monMacroPanel import MonMacroPanel
+import convert
+
+
+# Import des panels
+
+class MonIncludePanel(MonMacroPanel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node, parent = None,name = None,fl = 0):
+        MonMacroPanel.__init__(self,node,parent,name,fl)
+        #Version TK ??
+        #if not hasattr(self.node.item.object,'fichier_ini'):
+        if not hasattr(self.node.item.object,'fichier_unite'):
+           self.ajoutPageBad()
+        else:
+           self.ajoutPageOk()
+
+  def ajoutPageOk(self):
+        self.TabPage = QWidget(self.TWChoix,"TabPage")
+        self.LENomFichier = QLineEdit(self.TabPage,"LENomFichier")
+        self.LENomFichier.setGeometry(QRect(18,127,450,30))
+        self.textLabel1_3 = QLabel(self.TabPage,"textLabel1_3")
+        self.textLabel1_3.setGeometry(QRect(70,50,350,41))
+        self.BBrowse = QPushButton(self.TabPage,"BBrowse")
+        self.BBrowse.setGeometry(QRect(288,306,161,41))
+        self.TWChoix.insertTab(self.TabPage,QString(""))
+        self.textLabel1_3.setText(self._DMacro__tr("<font size=\"+1\">La commande INCLUDE requiert un nom de Fichier :</font>"))
+        self.BBrowse.setText(self._DMacro__tr("Edit"))
+        self.TWChoix.changeTab(self.TabPage,self._DMacro__tr("Fichier Include"))
+        self.TWChoix.setCurrentPage(2)
+        if hasattr(self.node.item.object,'fichier_ini'):
+           self.LENomFichier.setText(self.node.item.object.fichier_ini)
+        else :
+           self.LENomFichier.setText("")
+        self.LENomFichier.setText(self.node.item.object.fichier_ini)
+
+
+        self.BChangeFile = QPushButton(self.TabPage,"BChangeFile")
+        self.BChangeFile.setGeometry(QRect(290,350,161,41))
+        self.BChangeFile.setSizePolicy(QSizePolicy(0,0,0,0,self.BChangeFile.sizePolicy().hasHeightForWidth()))
+        self.BChangeFile.setText(self._DMacro__tr("Autre Fichier"))
+
+        self.connect(self.BBrowse,SIGNAL("clicked()"),self.BBrowsePressed)
+        self.connect(self.BChangeFile,SIGNAL("clicked()"),self.BChangeFilePressed)
+        self.connect(self.LENomFichier,SIGNAL("returnPressed()"),self.LENomFichReturnPressed)
+
+
+  def ajoutPageBad(self) :
+        self.TabPage = QWidget(self.TWChoix,"TabPage")
+       self.textLabel1_5 = QLabel(self.TabPage,"textLabel1_5")
+       TabPageLayout = QGridLayout(self.TabPage,1,1,11,6,"TabPageLayout")
+       TabPageLayout.addWidget(self.textLabel1_5,0,0)
+        self.TWChoix.insertTab(self.TabPage,QString(""))
+       self.resize(QSize(521,499).expandedTo(self.minimumSizeHint()))
+       self.clearWState(Qt.WState_Polished)
+        self.textLabel1_5.setText(self._DMacro__trUtf8("\x3c\x66\x6f\x6e\x74\x20\x73\x69\x7a\x65\x3d\x22\x2b\x31\x22\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x49\x4e\x43\x4c\x55\x44\x45\x20\x6e\x27\x61\x20\x70\x61\x73\x20\x64\x65\x20\x66\x69\x63\x68\x69\x65\x72\x20\x61\x73\x73\x6f\x63\x69\xc3\xa9\x2e\x0a\x49\x6c\x20\x66\x61\x75\x74\x20\x64\x27\x61\x62\x6f\x72\x64\x20\x63\x68\x6f\x69\x73\x69\x72\x20\x75\x6e\x20\x6e\x75\x6d\xc3\xa9\x72\x6f\x20\x64\x27\x75\x6e\x69\x74\xc3\xa9\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+        self.TWChoix.changeTab(self.TabPage,self._DMacro__tr("Fichier Include"))
+        self.TWChoix.setCurrentPage(2)
+
+
+  def BBrowsePressed(self):
+      self.node.makeEdit()
+
+  def BOkIncPressed (self):
+      self.LENomFichReturnPressed()
+
+  def LENomFichReturnPressed(self):
+        nomFichier=str(self.LENomFichier.text())
+        if not os.path.isfile(nomFichier) :
+           commentaire = "Fichier introuvable"
+           self.Commentaire.setText(QString(commentaire))
+           self.editor.affiche_infos(commentaire)
+           return
+
+        text=self.convert_file(nomFichier)
+
+        # Si probleme a la lecture-conversion on arrete le traitement
+        if not text:
+           return
+
+        try :
+           self.node.item.object.change_fichier_init(nomFichier,text)
+           commentaire = "Fichier modifie  : " + self.node.item.get_nom()
+           self.Commentaire.setText(QString(commentaire))
+           self.editor.affiche_infos(commentaire)
+        except: 
+           l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
+           QMessageBox.critical( self, "Erreur fatale au chargement du fichier Include", l[0])
+           commentaire = "Fichier invalide" 
+           self.Commentaire.setText(QString(commentaire))
+           self.editor.affiche_infos(commentaire)
+           return
+
+
+  def convert_file(self,file):
+       """
+         Methode pour convertir le fichier file dans le format courant
+       """
+       format=self.editor.format_fichier
+       text=None
+       if convert.plugins.has_key(format):
+          # Le convertisseur existe on l'utilise
+          p=convert.plugins[format]()
+          p.readfile(file)
+          text=p.convert('execnoparseur')
+       else :
+            commentaire = "Impossible de lire le fichier : Format inconnu"
+            self.Commentaire.setText(QString(commentaire))
+            self.editor.affiche_infos(commentaire)
+       return text
+
+
+  def BChangeFilePressed(self):
+      userDir=os.path.expanduser("~/Eficas_install/")
+      fn = QFileDialog.getOpenFileName(userDir,
+                        self.trUtf8('All Files (*);;''JDC Files (*.comm);;'), self.editor)
+
+      if fn.isNull():
+         return
+
+      fn = os.path.abspath((unicode(fn)))
+      self.LENomFichier.setText(fn)
+      self.LENomFichReturnPressed()
diff --git a/InterfaceQT4/monListeParamPanel.py b/InterfaceQT4/monListeParamPanel.py
new file mode 100644 (file)
index 0000000..68c4bad
--- /dev/null
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desListeParam import DLisParam
+from qt import *
+
+# Import des panels
+
+class MonListeParamPanel(DLisParam):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,liste,parent,name = None,fl = 0):
+        self.panel=parent
+        DLisParam.__init__(self,parent,name,Qt.WType_Dialog)
+        self.liste=liste
+        self.initVal()
+
+  def initVal(self):
+        self.LBParam.clear()
+        for param in self.liste :
+            self.LBParam.insertItem(QString(repr(param)))
+
+  def LBParamItemPressed(self):
+        i=self.LBParam.index(self.LBParam.selectedItem())
+        self.panel.Ajout1Valeur(self.liste[i])
diff --git a/InterfaceQT4/monMCFactPanel.py b/InterfaceQT4/monMCFactPanel.py
new file mode 100644 (file)
index 0000000..fc80693
--- /dev/null
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desMCFact import DMCFact
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qt import *
+
+
+# Import des panels
+
+class MonMCFactPanel(DMCFact,QTPanelTBW1):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node, parent = None,name = None,fl = 0):
+        DMCFact.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        QTPanelTBW1.__init__(self,node,parent)
+
+  def BSupPressed(self):
+      QTPanel.BSupPressed(self)
+
+  def BOkPressed(self):
+      QTPanel.BOkPressed(self)
+
+  def ViewDoc(self):
+      QTPanel.ViewDoc(self)
+
diff --git a/InterfaceQT4/monMCListAjoutPanel.py b/InterfaceQT4/monMCListAjoutPanel.py
new file mode 100644 (file)
index 0000000..8cb0eb3
--- /dev/null
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desMCListAjout import DMCListAjout
+from qtCommun import QTPanel
+from qt import *
+
+
+# Import des panels
+
+class MonMCListAjoutPanel(DMCListAjout,QTPanel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node,parent = None,name = None,fl = 0):
+        DMCListAjout.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        monMCFact=self.node.item.get_nom()
+        self.MCFacteur.setText(QString(monMCFact))
+        self.MCFacteur.setAlignment(Qt.AlignHCenter)
+
+  def BSupPressed(self):
+      QTPanel.BSupPressed(self)
+
+  def BAjoutClicked(self):
+        self.node.parent.append_child(self.node.item.get_nom())
+
+  def ViewDoc(self):
+      QTPanel.ViewDoc(self)
+
diff --git a/InterfaceQT4/monMacroPanel.py b/InterfaceQT4/monMacroPanel.py
new file mode 100644 (file)
index 0000000..bb2d803
--- /dev/null
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+# Modules Python
+# Modules Eficas
+
+from desMacro import DMacro
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qtCommun import QTPanelTBW2
+from qtCommun import QTPanelTBW3
+from qt import *
+
+
+# Import des panels
+
+class MonMacroPanel(DMacro,QTPanelTBW1,QTPanelTBW2,QTPanelTBW3):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def __init__(self,node, parent = None,name = None,fl = 0):
+        DMacro.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        QTPanelTBW2.__init__(self,node,parent)
+        QTPanelTBW1.__init__(self,node,parent)
+        if self.node.item.object.get_type_produit() != None :
+           QTPanelTBW3.__init__(self,node,parent)
+        else :
+           self.TWChoix.removePage(self.TWChoix.page(2))
+           
+  def ViewDoc(self):
+      QTPanel.ViewDoc(self)
+
+  def BSupPressed(self):
+      QTPanel.BSupPressed(self)
+
+  def BOkPressed(self):
+      QTPanel.BOkPressed(self)
+
+  def BNextPressed(self):
+      QTPanelTBW2.BNextPressed(self)
+
+  def BuildTabCommand(self):
+      QTPanelTBW2.BuildLBNouvCommande(self)
+
+  def LEFiltreTextChanged(self):
+      QTPanelTBW2.LEFiltreTextChanged(self)
+
+  def LEfiltreReturnPressed(self):
+      QTPanelTBW2.LEfiltreReturnPressed(self)
+
+  def LBNouvCommandeClicked(self):
+      QTPanelTBW2.LBNouvCommandeClicked(self)
+
+  def LENomConceptReturnPressed(self):
+      QTPanelTBW3.LENomConceptReturnPressed(self)
+
diff --git a/InterfaceQT4/monOptionsEditeur.py b/InterfaceQT4/monOptionsEditeur.py
new file mode 100644 (file)
index 0000000..7432ae3
--- /dev/null
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+
+from OptionsEditeur import desOptions
+from qt import *
+import os, re
+
+class Options(desOptions):
+   def __init__(self,parent = None,name = None,modal = 0,fl = 0,configuration=None):
+       desOptions.__init__(self,parent,name,modal,fl)
+       self.configuration=configuration
+       self.viewMan=parent
+       self.dVersion={}
+       self.dRepMat={}
+       self.dRepCat={}
+       self.initAll()
+  
+
+   def initAll(self):
+       self.CBVersions.clear()
+       for item in self.configuration.catalogues :
+           try :
+              (code,version,cata,format,defaut)=item
+           except :
+              (code,version,cata,format)=item
+           self.dVersion[version]=(item)
+           self.dRepCat[version]=str(cata)
+           self.CBVersions.insertItem(QString(version),0)
+
+           codeSansPoint=re.sub("\.","",version)
+           chaine="rep_mat_"+codeSansPoint
+           if hasattr(self.configuration,chaine):
+              rep_mat=getattr(self.configuration,chaine)
+              self.dRepMat[version]=str(rep_mat)
+           else :
+              self.dRepMat[version]=""
+       self.LERepMat.setText(self.dRepMat[version])
+       self.LERepCata.setText(self.dRepCat[version])
+       if hasattr(self.configuration,"path_doc"):
+          self.LERepDoc.setText(self.configuration.path_doc)
+
+        
+   def VersionChoisie(self):
+       version=str(self.CBVersions.currentText())
+       if self.dRepMat.has_key(version):
+          self.LERepMat.setText(self.dRepMat[version])
+       if self.dRepCat.has_key(version):
+          self.LERepCata.setText(self.dRepCat[version])
+
+   def BokClicked(self):
+       version=str(self.CBVersions.currentText())
+       if self.LERepCata.text() == "" :
+          QMessageBox.critical( self, "Champ non rempli","Le champs Catalogue  doit etre rempli" )
+          return
+
+       self.dRepMat[version]=self.LERepMat.text()
+       if str(self.dRepMat[version] != "") != "" :
+          codeSansPoint=re.sub("\.","",version)
+          chaine="rep_mat_"+codeSansPoint
+          setattr(self.configuration,chaine,self.dRepMat[version])
+
+       self.dRepCat[version]=str(self.LERepCata.text())
+       if version in self.dVersion.keys():
+          item=list(self.dVersion[version])
+          item[2]=self.dRepCat[version]
+          self.dVersion[version]=tuple(item)
+       else :
+          self.dVersion[version]=('ASTER',version,self.dRepCat[version],'python')
+          
+       lItem=[]
+       for version in self.dVersion.keys() :
+          lItem.append(self.dVersion[version])
+       self.configuration.catalogues=lItem
+       self.configuration.save_params()
+
+   def AjoutVersion(self):
+       version=self.LEVersionAjout.text()
+       if str(version) == "" : return
+       self.CBVersions.insertItem(version,0)
+       self.LERepMat.setText("")
+       self.LERepCata.setText("")
+       self.LEVersionAjout.setText("")
+
+   def SupVersion(self):
+       version=str(self.LEVersionSup.text())
+       if version == "" : return
+       i =0
+       while i < self.CBVersions.count() :
+           if  self.CBVersions.text(i) == version :
+               self.CBVersions.removeItem(i)
+               break
+           i=i+1
+       try :
+          del self.dVersion[version]
+          del self.dRepMat[version]
+          del self.dRepCat[version]
+       except :
+          self.LEVersionSup.setText("")
+          return
+       codeSansPoint=re.sub("\.","",version)
+       chaine="rep_mat_"+codeSansPoint
+       if hasattr(self.configuration,chaine):
+          delattr(self.configuration,chaine)
+       self.LEVersionSup.setText("")
+
+       lItem=[]
+       for version in self.dVersion.keys() :
+           lItem.append(self.dVersion[version])
+       self.LERepMat.setText("")
+       self.LERepCata.setText("")
+       self.configuration.catalogues=lItem
+       self.configuration.save_params()
+       self.CBVersions.setCurrentItem(0)
+       self.VersionChoisie()
+
+
+   def BdefautChecked(self):
+       res = QMessageBox.warning(
+                 None,
+                 self.trUtf8("Restauration des parametres par defaut "),
+                 self.trUtf8("Votre fichier editeur sera ecrase."),
+                 self.trUtf8("&Ok"),
+                 self.trUtf8("&Abandonner"))
+       self.Bdefaut.setState(QButton.Off)
+       if res == 1 : return 
+
+       appli=self.configuration.appli
+       rep_ini=self.configuration.rep_ini
+       fic_ini_util=self.configuration.fic_ini_utilisateur
+       old_fic_ini_util=fic_ini_util+"_old"
+       commande="mv "+fic_ini_util+" "+old_fic_ini_util
+       os.system(commande)
+       from Editeur import configuration
+       configNew=configuration.CONFIG(appli,rep_ini)
+       self.configuration=configNew
+       appli.CONFIGURATION=configNew
+       self.configuration.save_params()
+       self.dVersion={}
+       self.dRepMat={}
+       self.dRepCat={}
+       self.initAll()
+
+   def ChangePathDoc(self):
+       self.configuration.path_doc=str(self.LERepDoc.currentText())
+       self.configuration.save_params()
+